diff --git a/AKModel/admin.py b/AKModel/admin.py
index a039742d61987702cc5fa8e6736c5d1951305d20..0e7cef569f152c31b71d0f9232e8b1af25fc828c 100644
--- a/AKModel/admin.py
+++ b/AKModel/admin.py
@@ -2,6 +2,7 @@ from django.apps import apps
 from django.contrib import admin
 from django.contrib.admin import SimpleListFilter
 from django.db.models import Count, F
+from django import forms
 from django.shortcuts import render
 from django.urls import path, reverse_lazy
 from django.utils import timezone
@@ -9,6 +10,7 @@ from django.utils.html import format_html
 from django.utils.translation import gettext_lazy as _
 from simple_history.admin import SimpleHistoryAdmin
 
+from AKModel.availability.forms import AvailabilitiesFormMixin
 from AKModel.availability.models import Availability
 from AKModel.models import Event, AKOwner, AKCategory, AKTrack, AKTag, AKRequirement, AK, AKSlot, Room, AKOrgaMessage
 from AKModel.views import EventStatusView, AKCSVExportView, AKWikiExportView, AKMessageDeleteView
@@ -158,6 +160,27 @@ class AKAdmin(SimpleHistoryAdmin):
         return super(AKAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)
 
 
+class RoomForm(AvailabilitiesFormMixin, forms.ModelForm):
+    class Meta:
+        model = Room
+        fields = ['name',
+                  'location',
+                  'capacity',
+                  'properties',
+                  'event',
+                  ]
+
+        widgets = {
+            'properties': forms.CheckboxSelectMultiple,
+        }
+
+    def __init__(self, *args, **kwargs):
+        # Init availability mixin
+        kwargs['initial'] = dict()
+        super().__init__(*args, **kwargs)
+        self.initial = {**self.initial, **kwargs['initial']}
+
+
 @admin.register(Room)
 class RoomAdmin(admin.ModelAdmin):
     model = Room
@@ -165,6 +188,12 @@ class RoomAdmin(admin.ModelAdmin):
     list_filter = ['location', 'properties', 'event']
     list_editable = []
     ordering = ['location', 'name']
+    change_form_template = "admin/AKModel/room_change_form.html"
+
+    def get_form(self, request, obj=None, change=False, **kwargs):
+        if obj is not None:
+            return RoomForm
+        return super().get_form(request, obj, change, **kwargs)
 
     def formfield_for_foreignkey(self, db_field, request, **kwargs):
         if db_field.name == 'event':
@@ -188,11 +217,13 @@ class AKSlotAdmin(admin.ModelAdmin):
         urls = super().get_urls()
         custom_urls = []
         if apps.is_installed("AKScheduling"):
-            from AKScheduling.views import UnscheduledSlotsAdminView
+            from AKScheduling.views import SchedulingAdminView, UnscheduledSlotsAdminView
 
             custom_urls.extend([
+                path('<slug:event_slug>/schedule/', self.admin_site.admin_view(SchedulingAdminView.as_view()),
+                     name="schedule"),
                 path('<slug:event_slug>/unscheduled/', self.admin_site.admin_view(UnscheduledSlotsAdminView.as_view()),
-                     name="slots_unscheduled")
+                     name="slots_unscheduled"),
             ])
         return custom_urls + urls
 
diff --git a/AKModel/templates/admin/AKModel/room_change_form.html b/AKModel/templates/admin/AKModel/room_change_form.html
new file mode 100644
index 0000000000000000000000000000000000000000..4f305c4e7043840b8e6b930eaec0e08af1d4ed0e
--- /dev/null
+++ b/AKModel/templates/admin/AKModel/room_change_form.html
@@ -0,0 +1,16 @@
+{% extends "admin/change_form.html" %}
+{% load i18n admin_urls %}
+{% load static %}
+{% load bootstrap4 %}
+
+{% block extrahead %}
+    {{ block.super }}
+    {% bootstrap_javascript jquery='slim' %}
+    <link href='{% static 'AKSubmission/vendor/fullcalendar3/fullcalendar.min.css' %}' rel='stylesheet'/>
+    <link href='{% static 'AKSubmission/css/availabilities.css' %}' rel='stylesheet'/>
+
+    <script src="{% static "AKSubmission/vendor/moment/moment-with-locales.js" %}"></script>
+    <script src="{% static "AKSubmission/vendor/moment-timezone/moment-timezone-with-data-10-year-range.js" %}"></script>
+    <script src='{% static 'AKSubmission/vendor/fullcalendar3/fullcalendar.min.js' %}'></script>
+    <script src="{% static "common/js/availabilities.js" %}"></script>
+{% endblock %}
diff --git a/AKModel/urls.py b/AKModel/urls.py
index a469c54f96e8f3cd29a2008f1deffc537050a8cc..9b1f7591ee877043baca3cb63aac843dcb64ac4d 100644
--- a/AKModel/urls.py
+++ b/AKModel/urls.py
@@ -1,3 +1,4 @@
+from django.apps import apps
 from django.urls import include, path
 from rest_framework.routers import DefaultRouter
 
@@ -11,14 +12,33 @@ api_router.register('ak', views.AKViewSet, basename='AK')
 api_router.register('room', views.RoomViewSet, basename='Room')
 api_router.register('akslot', views.AKSlotViewSet, basename='AKSlot')
 
+
+extra_paths = []
+if apps.is_installed("AKScheduling"):
+    from AKScheduling.api import ResourcesViewSet, RoomAvailabilitiesView, EventsView, EventsViewSet
+
+    api_router.register('scheduling-resources', ResourcesViewSet, basename='scheduling-resources')
+    api_router.register('scheduling-event', EventsViewSet, basename='scheduling-event')
+
+    extra_paths = [
+        path('api/scheduling-events/', EventsView.as_view(), name='scheduling-events'),
+        path('api/scheduling-room-availabilities/', RoomAvailabilitiesView.as_view(), name='scheduling-room-availabilities'),
+    ]
+
+
+event_specific_paths = [
+            path('api/', include(api_router.urls), name='api'),
+        ]
+event_specific_paths.extend(extra_paths)
+
+
 app_name = 'model'
 
+
 urlpatterns = [
     path(
         '<slug:event_slug>/',
-        include([
-            path('api/', include(api_router.urls), name='api'),
-        ])
+        include(event_specific_paths)
     ),
     path('user/', views.UserView.as_view(), name="user"),
 ]
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales-all.js b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales-all.js
new file mode 100644
index 0000000000000000000000000000000000000000..4f0c52b9b4166b927b004de226d6d37d5ebe87df
--- /dev/null
+++ b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales-all.js
@@ -0,0 +1,1402 @@
+[].push.apply(FullCalendar.globalLocales, function () {
+  'use strict';
+
+  var l0 = {
+    code: "af",
+    week: {
+      dow: 1, // Maandag is die eerste dag van die week.
+      doy: 4  // Die week wat die 4de Januarie bevat is die eerste week van die jaar.
+    },
+    buttonText: {
+      prev: "Vorige",
+      next: "Volgende",
+      today: "Vandag",
+      year: "Jaar",
+      month: "Maand",
+      week: "Week",
+      day: "Dag",
+      list: "Agenda"
+    },
+    allDayText: "Heeldag",
+    moreLinkText: "Addisionele",
+    noEventsText: "Daar is geen gebeurtenisse nie"
+  };
+
+  var l1 = {
+    code: "ar-dz",
+    week: {
+      dow: 0, // Sunday is the first day of the week.
+      doy: 4  // The week that contains Jan 1st is the first week of the year.
+    },
+    direction: 'rtl',
+    buttonText: {
+      prev: "السابق",
+      next: "التالي",
+      today: "اليوم",
+      month: "شهر",
+      week: "أسبوع",
+      day: "يوم",
+      list: "أجندة"
+    },
+    weekText: "أسبوع",
+    allDayText: "اليوم كله",
+    moreLinkText: "أخرى",
+    noEventsText: "أي أحداث لعرض"
+  };
+
+  var l2 = {
+    code: "ar-kw",
+    week: {
+      dow: 0, // Sunday is the first day of the week.
+      doy: 12  // The week that contains Jan 1st is the first week of the year.
+    },
+    direction: 'rtl',
+    buttonText: {
+      prev: "السابق",
+      next: "التالي",
+      today: "اليوم",
+      month: "شهر",
+      week: "أسبوع",
+      day: "يوم",
+      list: "أجندة"
+    },
+    weekText: "أسبوع",
+    allDayText: "اليوم كله",
+    moreLinkText: "أخرى",
+    noEventsText: "أي أحداث لعرض"
+  };
+
+  var l3 = {
+    code: "ar-ly",
+    week: {
+      dow: 6, // Saturday is the first day of the week.
+      doy: 12  // The week that contains Jan 1st is the first week of the year.
+    },
+    direction: 'rtl',
+    buttonText: {
+      prev: "السابق",
+      next: "التالي",
+      today: "اليوم",
+      month: "شهر",
+      week: "أسبوع",
+      day: "يوم",
+      list: "أجندة"
+    },
+    weekText: "أسبوع",
+    allDayText: "اليوم كله",
+    moreLinkText: "أخرى",
+    noEventsText: "أي أحداث لعرض"
+  };
+
+  var l4 = {
+    code: "ar-ma",
+    week: {
+      dow: 6, // Saturday is the first day of the week.
+      doy: 12  // The week that contains Jan 1st is the first week of the year.
+    },
+    direction: 'rtl',
+    buttonText: {
+      prev: "السابق",
+      next: "التالي",
+      today: "اليوم",
+      month: "شهر",
+      week: "أسبوع",
+      day: "يوم",
+      list: "أجندة"
+    },
+    weekText: "أسبوع",
+    allDayText: "اليوم كله",
+    moreLinkText: "أخرى",
+    noEventsText: "أي أحداث لعرض"
+  };
+
+  var l5 = {
+    code: "ar-sa",
+    week: {
+      dow: 0, // Sunday is the first day of the week.
+      doy: 6  // The week that contains Jan 1st is the first week of the year.
+    },
+    direction: 'rtl',
+    buttonText: {
+      prev: "السابق",
+      next: "التالي",
+      today: "اليوم",
+      month: "شهر",
+      week: "أسبوع",
+      day: "يوم",
+      list: "أجندة"
+    },
+    weekText: "أسبوع",
+    allDayText: "اليوم كله",
+    moreLinkText: "أخرى",
+    noEventsText: "أي أحداث لعرض"
+  };
+
+  var l6 = {
+    code: "ar-tn",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4 // The week that contains Jan 4th is the first week of the year.
+    },
+    direction: 'rtl',
+    buttonText: {
+      prev: "السابق",
+      next: "التالي",
+      today: "اليوم",
+      month: "شهر",
+      week: "أسبوع",
+      day: "يوم",
+      list: "أجندة"
+    },
+    weekText: "أسبوع",
+    allDayText: "اليوم كله",
+    moreLinkText: "أخرى",
+    noEventsText: "أي أحداث لعرض"
+  };
+
+  var l7 = {
+    code: "ar",
+    week: {
+      dow: 6, // Saturday is the first day of the week.
+      doy: 12  // The week that contains Jan 1st is the first week of the year.
+    },
+    direction: 'rtl',
+    buttonText: {
+      prev: "السابق",
+      next: "التالي",
+      today: "اليوم",
+      month: "شهر",
+      week: "أسبوع",
+      day: "يوم",
+      list: "أجندة"
+    },
+    weekText: "أسبوع",
+    allDayText: "اليوم كله",
+    moreLinkText: "أخرى",
+    noEventsText: "أي أحداث لعرض"
+  };
+
+  var l8 = {
+    code: "az",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Əvvəl",
+      next: "Sonra",
+      today: "Bu Gün",
+      month: "Ay",
+      week: "Həftə",
+      day: "Gün",
+      list: "Gündəm"
+    },
+    weekText: "Həftə",
+    allDayText: "Bütün Gün",
+    moreLinkText: function(n) {
+      return "+ daha çox " + n;
+    },
+    noEventsText: "Göstərmək üçün hadisə yoxdur"
+  };
+
+  var l9 = {
+    code: "bg",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 7  // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: "назад",
+      next: "напред",
+      today: "днес",
+      month: "Месец",
+      week: "Седмица",
+      day: "Ден",
+      list: "График"
+    },
+    allDayText: "Цял ден",
+    moreLinkText: function(n) {
+      return "+още " + n;
+    },
+    noEventsText: "Няма събития за показване"
+  };
+
+  var l10 = {
+    code: "bs",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 7  // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: "Prošli",
+      next: "Sljedeći",
+      today: "Danas",
+      month: "Mjesec",
+      week: "Sedmica",
+      day: "Dan",
+      list: "Raspored"
+    },
+    weekText: "Sed",
+    allDayText: "Cijeli dan",
+    moreLinkText: function(n) {
+      return "+ još " + n;
+    },
+    noEventsText: "Nema događaja za prikazivanje"
+  };
+
+  var l11 = {
+    code: "ca",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Anterior",
+      next: "Següent",
+      today: "Avui",
+      month: "Mes",
+      week: "Setmana",
+      day: "Dia",
+      list: "Agenda"
+    },
+    weekText: "Set",
+    allDayText: "Tot el dia",
+    moreLinkText: "més",
+    noEventsText: "No hi ha esdeveniments per mostrar"
+  };
+
+  var l12 = {
+    code: "cs",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Dříve",
+      next: "Později",
+      today: "Nyní",
+      month: "Měsíc",
+      week: "Týden",
+      day: "Den",
+      list: "Agenda"
+    },
+    weekText: "Týd",
+    allDayText: "Celý den",
+    moreLinkText: function(n) {
+      return "+další: " + n;
+    },
+    noEventsText: "Žádné akce k zobrazení"
+  };
+
+  var l13 = {
+    code: "da",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Forrige",
+      next: "Næste",
+      today: "I dag",
+      month: "MÃ¥ned",
+      week: "Uge",
+      day: "Dag",
+      list: "Agenda"
+    },
+    weekText: "Uge",
+    allDayText: "Hele dagen",
+    moreLinkText: "flere",
+    noEventsText: "Ingen arrangementer at vise"
+  };
+
+  var l14 = {
+    code: "de",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Zurück",
+      next: "Vor",
+      today: "Heute",
+      year: "Jahr",
+      month: "Monat",
+      week: "Woche",
+      day: "Tag",
+      list: "Terminübersicht"
+    },
+    weekText: "KW",
+    allDayText: "Ganztägig",
+    moreLinkText: function(n) {
+      return "+ weitere " + n;
+    },
+    noEventsText: "Keine Ereignisse anzuzeigen"
+  };
+
+  var l15 = {
+    code: "el",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4st is the first week of the year.
+    },
+    buttonText: {
+      prev: "Προηγούμενος",
+      next: "Επόμενος",
+      today: "Σήμερα",
+      month: "Μήνας",
+      week: "Εβδομάδα",
+      day: "Ημέρα",
+      list: "Ατζέντα"
+    },
+    weekText: "Εβδ",
+    allDayText: "Ολοήμερο",
+    moreLinkText: "περισσότερα",
+    noEventsText: "Δεν υπάρχουν γεγονότα προς εμφάνιση"
+  };
+
+  var l16 = {
+    code: "en-au",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    }
+  };
+
+  var l17 = {
+    code: "en-gb",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    }
+  };
+
+  var l18 = {
+    code: "en-nz",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    }
+  };
+
+  var l19 = {
+    code: "es",
+    week: {
+      dow: 0, // Sunday is the first day of the week.
+      doy: 6  // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: "Ant",
+      next: "Sig",
+      today: "Hoy",
+      month: "Mes",
+      week: "Semana",
+      day: "Día",
+      list: "Agenda"
+    },
+    weekText: "Sm",
+    allDayText: "Todo el día",
+    moreLinkText: "más",
+    noEventsText: "No hay eventos para mostrar"
+  };
+
+  var l20 = {
+    code: "es",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Ant",
+      next: "Sig",
+      today: "Hoy",
+      month: "Mes",
+      week: "Semana",
+      day: "Día",
+      list: "Agenda"
+    },
+    weekText: "Sm",
+    allDayText: "Todo el día",
+    moreLinkText: "más",
+    noEventsText: "No hay eventos para mostrar"
+  };
+
+  var l21 = {
+    code: "et",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Eelnev",
+      next: "Järgnev",
+      today: "Täna",
+      month: "Kuu",
+      week: "Nädal",
+      day: "Päev",
+      list: "Päevakord"
+    },
+    weekText: "näd",
+    allDayText: "Kogu päev",
+    moreLinkText: function(n) {
+      return "+ veel " + n;
+    },
+    noEventsText: "Kuvamiseks puuduvad sündmused"
+  };
+
+  var l22 = {
+    code: "eu",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 7  // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: "Aur",
+      next: "Hur",
+      today: "Gaur",
+      month: "Hilabetea",
+      week: "Astea",
+      day: "Eguna",
+      list: "Agenda"
+    },
+    weekText: "As",
+    allDayText: "Egun osoa",
+    moreLinkText: "gehiago",
+    noEventsText: "Ez dago ekitaldirik erakusteko"
+  };
+
+  var l23 = {
+    code: "fa",
+    week: {
+      dow: 6, // Saturday is the first day of the week.
+      doy: 12 // The week that contains Jan 1st is the first week of the year.
+    },
+    direction: 'rtl',
+    buttonText: {
+      prev: "قبلی",
+      next: "بعدی",
+      today: "امروز",
+      month: "ماه",
+      week: "هفته",
+      day: "روز",
+      list: "برنامه"
+    },
+    weekText: "هف",
+    allDayText: "تمام روز",
+    moreLinkText: function(n) {
+      return "بیش از " + n;
+    },
+    noEventsText: "هیچ رویدادی به نمایش"
+  };
+
+  var l24 = {
+    code: "fi",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Edellinen",
+      next: "Seuraava",
+      today: "Tänään",
+      month: "Kuukausi",
+      week: "Viikko",
+      day: "Päivä",
+      list: "Tapahtumat"
+    },
+    weekText: "Vk",
+    allDayText: "Koko päivä",
+    moreLinkText: "lisää",
+    noEventsText: "Ei näytettäviä tapahtumia"
+  };
+
+  var l25 = {
+    code: "fr",
+    buttonText: {
+      prev: "Précédent",
+      next: "Suivant",
+      today: "Aujourd'hui",
+      year: "Année",
+      month: "Mois",
+      week: "Semaine",
+      day: "Jour",
+      list: "Mon planning"
+    },
+    weekText: "Sem.",
+    allDayText: "Toute la journée",
+    moreLinkText: "en plus",
+    noEventsText: "Aucun événement à afficher"
+  };
+
+  var l26 = {
+    code: "fr-ch",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Précédent",
+      next: "Suivant",
+      today: "Courant",
+      year: "Année",
+      month: "Mois",
+      week: "Semaine",
+      day: "Jour",
+      list: "Mon planning"
+    },
+    weekText: "Sm",
+    allDayText: "Toute la journée",
+    moreLinkText: "en plus",
+    noEventsText: "Aucun événement à afficher"
+  };
+
+  var l27 = {
+    code: "fr",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Précédent",
+      next: "Suivant",
+      today: "Aujourd'hui",
+      year: "Année",
+      month: "Mois",
+      week: "Semaine",
+      day: "Jour",
+      list: "Planning"
+    },
+    weekText: "Sem.",
+    allDayText: "Toute la journée",
+    moreLinkText: "en plus",
+    noEventsText: "Aucun événement à afficher"
+  };
+
+  var l28 = {
+    code: "gl",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Ant",
+      next: "Seg",
+      today: "Hoxe",
+      month: "Mes",
+      week: "Semana",
+      day: "Día",
+      list: "Axenda"
+    },
+    weekText: "Sm",
+    allDayText: "Todo o día",
+    moreLinkText: "máis",
+    noEventsText: "Non hai eventos para amosar"
+  };
+
+  var l29 = {
+    code: "he",
+    direction: 'rtl',
+    buttonText: {
+      prev: "הקודם",
+      next: "הבא",
+      today: "היום",
+      month: "חודש",
+      week: "שבוע",
+      day: "יום",
+      list: "סדר יום"
+    },
+    allDayText: "כל היום",
+    moreLinkText: "אחר",
+    noEventsText: "אין אירועים להצגה",
+    weekText: "שבוע"
+  };
+
+  var l30 = {
+    code: "hi",
+    week: {
+      dow: 0, // Sunday is the first day of the week.
+      doy: 6  // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: "पिछला",
+      next: "अगला",
+      today: "आज",
+      month: "महीना",
+      week: "सप्ताह",
+      day: "दिन",
+      list: "कार्यसूची"
+    },
+    weekText: "हफ्ता",
+    allDayText: "सभी दिन",
+    moreLinkText: function(n) {
+      return "+अधिक " + n;
+    },
+    noEventsText: "कोई घटनाओं को प्रदर्शित करने के लिए"
+  };
+
+  var l31 = {
+    code: "hr",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 7  // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: "Prijašnji",
+      next: "Sljedeći",
+      today: "Danas",
+      month: "Mjesec",
+      week: "Tjedan",
+      day: "Dan",
+      list: "Raspored"
+    },
+    weekText: "Tje",
+    allDayText: "Cijeli dan",
+    moreLinkText: function(n) {
+      return "+ još " + n;
+    },
+    noEventsText: "Nema događaja za prikaz"
+  };
+
+  var l32 = {
+    code: "hu",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "vissza",
+      next: "előre",
+      today: "ma",
+      month: "Hónap",
+      week: "Hét",
+      day: "Nap",
+      list: "Napló"
+    },
+    weekText: "Hét",
+    allDayText: "Egész nap",
+    moreLinkText: "további",
+    noEventsText: "Nincs megjeleníthető esemény"
+  };
+
+  var l33 = {
+    code: "id",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 7  // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: "mundur",
+      next: "maju",
+      today: "hari ini",
+      month: "Bulan",
+      week: "Minggu",
+      day: "Hari",
+      list: "Agenda"
+    },
+    weekText: "Mg",
+    allDayText: "Sehari penuh",
+    moreLinkText: "lebih",
+    noEventsText: "Tidak ada acara untuk ditampilkan"
+  };
+
+  var l34 = {
+    code: "is",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Fyrri",
+      next: "Næsti",
+      today: "Í dag",
+      month: "Mánuður",
+      week: "Vika",
+      day: "Dagur",
+      list: "Dagskrá"
+    },
+    weekText: "Vika",
+    allDayText: "Allan daginn",
+    moreLinkText: "meira",
+    noEventsText: "Engir viðburðir til að sýna"
+  };
+
+  var l35 = {
+    code: "it",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Prec",
+      next: "Succ",
+      today: "Oggi",
+      month: "Mese",
+      week: "Settimana",
+      day: "Giorno",
+      list: "Agenda"
+    },
+    weekText: "Sm",
+    allDayText: "Tutto il giorno",
+    moreLinkText: function(n) {
+      return "+altri " + n;
+    },
+    noEventsText: "Non ci sono eventi da visualizzare"
+  };
+
+  var l36 = {
+    code: "ja",
+    buttonText: {
+      prev: "前",
+      next: "次",
+      today: "今日",
+      month: "月",
+      week: "週",
+      day: "æ—¥",
+      list: "予定リスト"
+    },
+    weekText: "週",
+    allDayText: "終日",
+    moreLinkText: function(n) {
+      return "他 " + n + " 件";
+    },
+    noEventsText: "表示する予定はありません"
+  };
+
+  var l37 = {
+    code: "ka",
+    week: {
+      dow: 1,
+      doy: 7
+    },
+    buttonText: {
+      prev: "წინა",
+      next: "შემდეგი",
+      today: "დღეს",
+      month: "თვე",
+      week: "კვირა",
+      day: "დღე",
+      list: "დღის წესრიგი"
+    },
+    weekText: "კვ",
+    allDayText: "მთელი დღე",
+    moreLinkText: function(n) {
+      return "+ კიდევ " + n;
+    },
+    noEventsText: "ღონისძიებები არ არის"
+  };
+
+  var l38 = {
+    code: "kk",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 7  // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: "Алдыңғы",
+      next: "Келесі",
+      today: "Бүгін",
+      month: "Ай",
+      week: "Апта",
+      day: "Күн",
+      list: "Күн тәртібі"
+    },
+    weekText: "Не",
+    allDayText: "Күні бойы",
+    moreLinkText: function(n) {
+      return "+ тағы " + n;
+    },
+    noEventsText: "Көрсету үшін оқиғалар жоқ"
+  };
+
+  var l39 = {
+    code: "ko",
+    buttonText: {
+      prev: "이전달",
+      next: "다음달",
+      today: "오늘",
+      month: "ì›”",
+      week: "주",
+      day: "일",
+      list: "일정목록"
+    },
+    weekText: "주",
+    allDayText: "종일",
+    moreLinkText: "개",
+    noEventsText: "일정이 없습니다"
+  };
+
+  var l40 = {
+    code: "lb",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Zréck",
+      next: "Weider",
+      today: "Haut",
+      month: "Mount",
+      week: "Woch",
+      day: "Dag",
+      list: "Terminiwwersiicht"
+    },
+    weekText: "W",
+    allDayText: "Ganzen Dag",
+    moreLinkText: "méi",
+    noEventsText: "Nee Evenementer ze affichéieren"
+  };
+
+  var l41 = {
+    code: "lt",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Atgal",
+      next: "Pirmyn",
+      today: "Å iandien",
+      month: "MÄ—nuo",
+      week: "SavaitÄ—",
+      day: "Diena",
+      list: "DarbotvarkÄ—"
+    },
+    weekText: "SAV",
+    allDayText: "VisÄ… dienÄ…",
+    moreLinkText: "daugiau",
+    noEventsText: "Nėra įvykių rodyti"
+  };
+
+  var l42 = {
+    code: "lv",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Iepr.",
+      next: "Nāk.",
+      today: "Å odien",
+      month: "MÄ“nesis",
+      week: "Nedēļa",
+      day: "Diena",
+      list: "Dienas kārtība"
+    },
+    weekText: "Ned.",
+    allDayText: "Visu dienu",
+    moreLinkText: function(n) {
+      return "+vēl " + n;
+    },
+    noEventsText: "Nav notikumu"
+  };
+
+  var l43 = {
+    code: "mk",
+    buttonText: {
+      prev: "претходно",
+      next: "следно",
+      today: "Денес",
+      month: "Месец",
+      week: "Недела",
+      day: "Ден",
+      list: "График"
+    },
+    weekText: "Сед",
+    allDayText: "Цел ден",
+    moreLinkText: function(n) {
+      return "+повеќе " + n;
+    },
+    noEventsText: "Нема настани за прикажување"
+  };
+
+  var l44 = {
+    code: "ms",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 7  // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: "Sebelum",
+      next: "Selepas",
+      today: "hari ini",
+      month: "Bulan",
+      week: "Minggu",
+      day: "Hari",
+      list: "Agenda"
+    },
+    weekText: "Mg",
+    allDayText: "Sepanjang hari",
+    moreLinkText: function(n) {
+      return "masih ada " + n + " acara";
+    },
+    noEventsText: "Tiada peristiwa untuk dipaparkan"
+  };
+
+  var l45 = {
+    code: "nb",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Forrige",
+      next: "Neste",
+      today: "I dag",
+      month: "MÃ¥ned",
+      week: "Uke",
+      day: "Dag",
+      list: "Agenda"
+    },
+    weekText: "Uke",
+    allDayText: "Hele dagen",
+    moreLinkText: "til",
+    noEventsText: "Ingen hendelser å vise"
+  };
+
+  var l46 = {
+    code: "nl",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Voorgaand",
+      next: "Volgende",
+      today: "Vandaag",
+      year: "Jaar",
+      month: "Maand",
+      week: "Week",
+      day: "Dag",
+      list: "Agenda"
+    },
+    allDayText: "Hele dag",
+    moreLinkText: "extra",
+    noEventsText: "Geen evenementen om te laten zien"
+  };
+
+  var l47 = {
+    code: "nn",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Førre",
+      next: "Neste",
+      today: "I dag",
+      month: "MÃ¥nad",
+      week: "Veke",
+      day: "Dag",
+      list: "Agenda"
+    },
+    weekText: "Veke",
+    allDayText: "Heile dagen",
+    moreLinkText: "til",
+    noEventsText: "Ingen hendelser å vise"
+  };
+
+  var l48 = {
+    code: "pl",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Poprzedni",
+      next: "Następny",
+      today: "DziÅ›",
+      month: "MiesiÄ…c",
+      week: "Tydzień",
+      day: "Dzień",
+      list: "Plan dnia"
+    },
+    weekText: "Tydz",
+    allDayText: "Cały dzień",
+    moreLinkText: "więcej",
+    noEventsText: "Brak wydarzeń do wyświetlenia"
+  };
+
+  var l49 = {
+    code: "pt-br",
+    buttonText: {
+      prev: "Anterior",
+      next: "Próximo",
+      today: "Hoje",
+      month: "Mês",
+      week: "Semana",
+      day: "Dia",
+      list: "Lista"
+    },
+    weekText: "Sm",
+    allDayText: "dia inteiro",
+    moreLinkText: function(n) {
+      return "mais +" + n;
+    },
+    noEventsText: "Não há eventos para mostrar"
+  };
+
+  var l50 = {
+    code: "pt",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Anterior",
+      next: "Seguinte",
+      today: "Hoje",
+      month: "Mês",
+      week: "Semana",
+      day: "Dia",
+      list: "Agenda"
+    },
+    weekText: "Sem",
+    allDayText: "Todo o dia",
+    moreLinkText: "mais",
+    noEventsText: "Não há eventos para mostrar"
+  };
+
+  var l51 = {
+    code: "ro",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 7  // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: "precedentă",
+      next: "următoare",
+      today: "Azi",
+      month: "Lună",
+      week: "Săptămână",
+      day: "Zi",
+      list: "Agendă"
+    },
+    weekText: "Săpt",
+    allDayText: "Toată ziua",
+    moreLinkText: function(n) {
+      return "+alte " + n;
+    },
+    noEventsText: "Nu există evenimente de afișat"
+  };
+
+  var l52 = {
+    code: "ru",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Пред",
+      next: "След",
+      today: "Сегодня",
+      month: "Месяц",
+      week: "Неделя",
+      day: "День",
+      list: "Повестка дня"
+    },
+    weekText: "Нед",
+    allDayText: "Весь день",
+    moreLinkText: function(n) {
+      return "+ ещё " + n;
+    },
+    noEventsText: "Нет событий для отображения"
+  };
+
+  var l53 = {
+    code: "sk",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Predchádzajúci",
+      next: "Nasledujúci",
+      today: "Dnes",
+      month: "Mesiac",
+      week: "Týždeň",
+      day: "Deň",
+      list: "Rozvrh"
+    },
+    weekText: "Ty",
+    allDayText: "Celý deň",
+    moreLinkText: function(n) {
+      return "+ďalšie: " + n;
+    },
+    noEventsText: "Žiadne akcie na zobrazenie"
+  };
+
+  var l54 = {
+    code: "sl",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 7  // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: "Prejšnji",
+      next: "Naslednji",
+      today: "Trenutni",
+      month: "Mesec",
+      week: "Teden",
+      day: "Dan",
+      list: "Dnevni red"
+    },
+    weekText: "Teden",
+    allDayText: "Ves dan",
+    moreLinkText: "več",
+    noEventsText: "Ni dogodkov za prikaz"
+  };
+
+  var l55 = {
+    code: "sq",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "mbrapa",
+      next: "Përpara",
+      today: "sot",
+      month: "Muaj",
+      week: "Javë",
+      day: "Ditë",
+      list: "Listë"
+    },
+    weekText: "Ja",
+    allDayText: "Gjithë ditën",
+    moreLinkText: function(n) {
+      return "+më tepër " + n;
+    },
+    noEventsText: "Nuk ka evente për të shfaqur"
+  };
+
+  var l56 = {
+    code: "sr-cyrl",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 7  // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: "Претходна",
+      next: "следећи",
+      today: "Данас",
+      month: "Месец",
+      week: "Недеља",
+      day: "Дан",
+      list: "Планер"
+    },
+    weekText: "Сед",
+    allDayText: "Цео дан",
+    moreLinkText: function(n) {
+      return "+ још " + n;
+    },
+    noEventsText: "Нема догађаја за приказ"
+  };
+
+  var l57 = {
+    code: "sr",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 7  // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: "Prethodna",
+      next: "Sledeći",
+      today: "Danas",
+      month: "Mеsеc",
+      week: "Nеdеlja",
+      day: "Dan",
+      list: "Planеr"
+    },
+    weekText: "Sed",
+    allDayText: "Cеo dan",
+    moreLinkText: function(n) {
+      return "+ još " + n;
+    },
+    noEventsText: "Nеma događaja za prikaz"
+  };
+
+  var l58 = {
+    code: "sv",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Förra",
+      next: "Nästa",
+      today: "Idag",
+      month: "MÃ¥nad",
+      week: "Vecka",
+      day: "Dag",
+      list: "Program"
+    },
+    weekText: "v.",
+    allDayText: "Heldag",
+    moreLinkText: "till",
+    noEventsText: "Inga händelser att visa"
+  };
+
+  var l59 = {
+    code: "th",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "ก่อนหน้า",
+      next: "ถัดไป",
+      prevYear: 'ปีก่อนหน้า',
+      nextYear: 'ปีถัดไป',
+      year: 'ปี',
+      today: "วันนี้",
+      month: "เดือน",
+      week: "สัปดาห์",
+      day: "วัน",
+      list: "กำหนดการ"
+    },
+    weekText: "สัปดาห์",
+    allDayText: "ตลอดวัน",
+    moreLinkText: "เพิ่มเติม",
+    noEventsText: "ไม่มีกิจกรรมที่จะแสดง"
+  };
+
+  var l60 = {
+    code: "tr",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 7  // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: "geri",
+      next: "ileri",
+      today: "bugün",
+      month: "Ay",
+      week: "Hafta",
+      day: "Gün",
+      list: "Ajanda"
+    },
+    weekText: "Hf",
+    allDayText: "Tüm gün",
+    moreLinkText: "daha fazla",
+    noEventsText: "Gösterilecek etkinlik yok"
+  };
+
+  var l61 = {
+    code: "ug",
+    buttonText: {
+      month: "ئاي",
+      week: "ھەپتە",
+      day: "ÙƒÛˆÙ†",
+      list: "كۈنتەرتىپ"
+    },
+    allDayText: "پۈتۈن كۈن"
+  };
+
+  var l62 = {
+    code: "uk",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 7  // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: "Попередній",
+      next: "далі",
+      today: "Сьогодні",
+      month: "Місяць",
+      week: "Тиждень",
+      day: "День",
+      list: "Порядок денний"
+    },
+    weekText: "Тиж",
+    allDayText: "Увесь день",
+    moreLinkText: function(n) {
+      return "+ще " + n + "...";
+    },
+    noEventsText: "Немає подій для відображення"
+  };
+
+  var l63 = {
+    code: "uz",
+    buttonText: {
+      month: "Oy",
+      week: "Xafta",
+      day: "Kun",
+      list: "Kun tartibi"
+    },
+    allDayText: "Kun bo'yi",
+    moreLinkText: function(n) {
+      return "+ yana " + n;
+    },
+    noEventsText: "Ko'rsatish uchun voqealar yo'q"
+  };
+
+  var l64 = {
+    code: "vi",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "TrÆ°á»›c",
+      next: "Tiếp",
+      today: "Hôm nay",
+      month: "Tháng",
+      week: "Tuần",
+      day: "Ngày",
+      list: "Lịch biểu"
+    },
+    weekText: "Tu",
+    allDayText: "Cả ngày",
+    moreLinkText: function(n) {
+      return "+ thêm " + n;
+    },
+    noEventsText: "Không có sự kiện để hiển thị"
+  };
+
+  var l65 = {
+    code: "zh-cn",
+    week: {
+      // GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "上月",
+      next: "下月",
+      today: "今天",
+      month: "月",
+      week: "周",
+      day: "æ—¥",
+      list: "日程"
+    },
+    weekText: "周",
+    allDayText: "全天",
+    moreLinkText: function(n) {
+      return "另外 " + n + " 个";
+    },
+    noEventsText: "没有事件显示"
+  };
+
+  var l66 = {
+    code: "zh-tw",
+    buttonText: {
+      prev: "上月",
+      next: "下月",
+      today: "今天",
+      month: "月",
+      week: "週",
+      day: "天",
+      list: "活動列表"
+    },
+    weekText: "周",
+    allDayText: "整天",
+    moreLinkText: '顯示更多',
+    noEventsText: "没有任何活動"
+  };
+
+  var localesAll = [
+    l0, l1, l2, l3, l4, l5, l6, l7, l8, l9, l10, l11, l12, l13, l14, l15, l16, l17, l18, l19, l20, l21, l22, l23, l24, l25, l26, l27, l28, l29, l30, l31, l32, l33, l34, l35, l36, l37, l38, l39, l40, l41, l42, l43, l44, l45, l46, l47, l48, l49, l50, l51, l52, l53, l54, l55, l56, l57, l58, l59, l60, l61, l62, l63, l64, l65, l66, 
+  ];
+
+  return localesAll;
+
+}());
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales-all.min.js b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales-all.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..c15382ed3ffe54e11a16ce35d0b51311e31610d9
--- /dev/null
+++ b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales-all.min.js
@@ -0,0 +1 @@
+[].push.apply(FullCalendar.globalLocales,function(){"use strict";return[{code:"af",week:{dow:1,doy:4},buttonText:{prev:"Vorige",next:"Volgende",today:"Vandag",year:"Jaar",month:"Maand",week:"Week",day:"Dag",list:"Agenda"},allDayText:"Heeldag",moreLinkText:"Addisionele",noEventsText:"Daar is geen gebeurtenisse nie"},{code:"ar-dz",week:{dow:0,doy:4},direction:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekText:"أسبوع",allDayText:"اليوم كله",moreLinkText:"أخرى",noEventsText:"أي أحداث لعرض"},{code:"ar-kw",week:{dow:0,doy:12},direction:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekText:"أسبوع",allDayText:"اليوم كله",moreLinkText:"أخرى",noEventsText:"أي أحداث لعرض"},{code:"ar-ly",week:{dow:6,doy:12},direction:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekText:"أسبوع",allDayText:"اليوم كله",moreLinkText:"أخرى",noEventsText:"أي أحداث لعرض"},{code:"ar-ma",week:{dow:6,doy:12},direction:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekText:"أسبوع",allDayText:"اليوم كله",moreLinkText:"أخرى",noEventsText:"أي أحداث لعرض"},{code:"ar-sa",week:{dow:0,doy:6},direction:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekText:"أسبوع",allDayText:"اليوم كله",moreLinkText:"أخرى",noEventsText:"أي أحداث لعرض"},{code:"ar-tn",week:{dow:1,doy:4},direction:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekText:"أسبوع",allDayText:"اليوم كله",moreLinkText:"أخرى",noEventsText:"أي أحداث لعرض"},{code:"ar",week:{dow:6,doy:12},direction:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekText:"أسبوع",allDayText:"اليوم كله",moreLinkText:"أخرى",noEventsText:"أي أحداث لعرض"},{code:"az",week:{dow:1,doy:4},buttonText:{prev:"Əvvəl",next:"Sonra",today:"Bu Gün",month:"Ay",week:"Həftə",day:"Gün",list:"Gündəm"},weekText:"Həftə",allDayText:"Bütün Gün",moreLinkText:function(e){return"+ daha çox "+e},noEventsText:"Göstərmək üçün hadisə yoxdur"},{code:"bg",week:{dow:1,doy:7},buttonText:{prev:"назад",next:"напред",today:"днес",month:"Месец",week:"Седмица",day:"Ден",list:"График"},allDayText:"Цял ден",moreLinkText:function(e){return"+още "+e},noEventsText:"Няма събития за показване"},{code:"bs",week:{dow:1,doy:7},buttonText:{prev:"Prošli",next:"Sljedeći",today:"Danas",month:"Mjesec",week:"Sedmica",day:"Dan",list:"Raspored"},weekText:"Sed",allDayText:"Cijeli dan",moreLinkText:function(e){return"+ još "+e},noEventsText:"Nema događaja za prikazivanje"},{code:"ca",week:{dow:1,doy:4},buttonText:{prev:"Anterior",next:"Següent",today:"Avui",month:"Mes",week:"Setmana",day:"Dia",list:"Agenda"},weekText:"Set",allDayText:"Tot el dia",moreLinkText:"més",noEventsText:"No hi ha esdeveniments per mostrar"},{code:"cs",week:{dow:1,doy:4},buttonText:{prev:"Dříve",next:"Později",today:"Nyní",month:"Měsíc",week:"Týden",day:"Den",list:"Agenda"},weekText:"Týd",allDayText:"Celý den",moreLinkText:function(e){return"+další: "+e},noEventsText:"Žádné akce k zobrazení"},{code:"da",week:{dow:1,doy:4},buttonText:{prev:"Forrige",next:"Næste",today:"I dag",month:"Måned",week:"Uge",day:"Dag",list:"Agenda"},weekText:"Uge",allDayText:"Hele dagen",moreLinkText:"flere",noEventsText:"Ingen arrangementer at vise"},{code:"de",week:{dow:1,doy:4},buttonText:{prev:"Zurück",next:"Vor",today:"Heute",year:"Jahr",month:"Monat",week:"Woche",day:"Tag",list:"Terminübersicht"},weekText:"KW",allDayText:"Ganztägig",moreLinkText:function(e){return"+ weitere "+e},noEventsText:"Keine Ereignisse anzuzeigen"},{code:"el",week:{dow:1,doy:4},buttonText:{prev:"Προηγούμενος",next:"Επόμενος",today:"Σήμερα",month:"Μήνας",week:"Εβδομάδα",day:"Ημέρα",list:"Ατζέντα"},weekText:"Εβδ",allDayText:"Ολοήμερο",moreLinkText:"περισσότερα",noEventsText:"Δεν υπάρχουν γεγονότα προς εμφάνιση"},{code:"en-au",week:{dow:1,doy:4}},{code:"en-gb",week:{dow:1,doy:4}},{code:"en-nz",week:{dow:1,doy:4}},{code:"es",week:{dow:0,doy:6},buttonText:{prev:"Ant",next:"Sig",today:"Hoy",month:"Mes",week:"Semana",day:"Día",list:"Agenda"},weekText:"Sm",allDayText:"Todo el día",moreLinkText:"más",noEventsText:"No hay eventos para mostrar"},{code:"es",week:{dow:1,doy:4},buttonText:{prev:"Ant",next:"Sig",today:"Hoy",month:"Mes",week:"Semana",day:"Día",list:"Agenda"},weekText:"Sm",allDayText:"Todo el día",moreLinkText:"más",noEventsText:"No hay eventos para mostrar"},{code:"et",week:{dow:1,doy:4},buttonText:{prev:"Eelnev",next:"Järgnev",today:"Täna",month:"Kuu",week:"Nädal",day:"Päev",list:"Päevakord"},weekText:"näd",allDayText:"Kogu päev",moreLinkText:function(e){return"+ veel "+e},noEventsText:"Kuvamiseks puuduvad sündmused"},{code:"eu",week:{dow:1,doy:7},buttonText:{prev:"Aur",next:"Hur",today:"Gaur",month:"Hilabetea",week:"Astea",day:"Eguna",list:"Agenda"},weekText:"As",allDayText:"Egun osoa",moreLinkText:"gehiago",noEventsText:"Ez dago ekitaldirik erakusteko"},{code:"fa",week:{dow:6,doy:12},direction:"rtl",buttonText:{prev:"قبلی",next:"بعدی",today:"امروز",month:"ماه",week:"هفته",day:"روز",list:"برنامه"},weekText:"هف",allDayText:"تمام روز",moreLinkText:function(e){return"بیش از "+e},noEventsText:"هیچ رویدادی به نمایش"},{code:"fi",week:{dow:1,doy:4},buttonText:{prev:"Edellinen",next:"Seuraava",today:"Tänään",month:"Kuukausi",week:"Viikko",day:"Päivä",list:"Tapahtumat"},weekText:"Vk",allDayText:"Koko päivä",moreLinkText:"lisää",noEventsText:"Ei näytettäviä tapahtumia"},{code:"fr",buttonText:{prev:"Précédent",next:"Suivant",today:"Aujourd'hui",year:"Année",month:"Mois",week:"Semaine",day:"Jour",list:"Mon planning"},weekText:"Sem.",allDayText:"Toute la journée",moreLinkText:"en plus",noEventsText:"Aucun événement à afficher"},{code:"fr-ch",week:{dow:1,doy:4},buttonText:{prev:"Précédent",next:"Suivant",today:"Courant",year:"Année",month:"Mois",week:"Semaine",day:"Jour",list:"Mon planning"},weekText:"Sm",allDayText:"Toute la journée",moreLinkText:"en plus",noEventsText:"Aucun événement à afficher"},{code:"fr",week:{dow:1,doy:4},buttonText:{prev:"Précédent",next:"Suivant",today:"Aujourd'hui",year:"Année",month:"Mois",week:"Semaine",day:"Jour",list:"Planning"},weekText:"Sem.",allDayText:"Toute la journée",moreLinkText:"en plus",noEventsText:"Aucun événement à afficher"},{code:"gl",week:{dow:1,doy:4},buttonText:{prev:"Ant",next:"Seg",today:"Hoxe",month:"Mes",week:"Semana",day:"Día",list:"Axenda"},weekText:"Sm",allDayText:"Todo o día",moreLinkText:"máis",noEventsText:"Non hai eventos para amosar"},{code:"he",direction:"rtl",buttonText:{prev:"הקודם",next:"הבא",today:"היום",month:"חודש",week:"שבוע",day:"יום",list:"סדר יום"},allDayText:"כל היום",moreLinkText:"אחר",noEventsText:"אין אירועים להצגה",weekText:"שבוע"},{code:"hi",week:{dow:0,doy:6},buttonText:{prev:"पिछला",next:"अगला",today:"आज",month:"महीना",week:"सप्ताह",day:"दिन",list:"कार्यसूची"},weekText:"हफ्ता",allDayText:"सभी दिन",moreLinkText:function(e){return"+अधिक "+e},noEventsText:"कोई घटनाओं को प्रदर्शित करने के लिए"},{code:"hr",week:{dow:1,doy:7},buttonText:{prev:"Prijašnji",next:"Sljedeći",today:"Danas",month:"Mjesec",week:"Tjedan",day:"Dan",list:"Raspored"},weekText:"Tje",allDayText:"Cijeli dan",moreLinkText:function(e){return"+ još "+e},noEventsText:"Nema događaja za prikaz"},{code:"hu",week:{dow:1,doy:4},buttonText:{prev:"vissza",next:"előre",today:"ma",month:"Hónap",week:"Hét",day:"Nap",list:"Napló"},weekText:"Hét",allDayText:"Egész nap",moreLinkText:"további",noEventsText:"Nincs megjeleníthető esemény"},{code:"id",week:{dow:1,doy:7},buttonText:{prev:"mundur",next:"maju",today:"hari ini",month:"Bulan",week:"Minggu",day:"Hari",list:"Agenda"},weekText:"Mg",allDayText:"Sehari penuh",moreLinkText:"lebih",noEventsText:"Tidak ada acara untuk ditampilkan"},{code:"is",week:{dow:1,doy:4},buttonText:{prev:"Fyrri",next:"Næsti",today:"Í dag",month:"Mánuður",week:"Vika",day:"Dagur",list:"Dagskrá"},weekText:"Vika",allDayText:"Allan daginn",moreLinkText:"meira",noEventsText:"Engir viðburðir til að sýna"},{code:"it",week:{dow:1,doy:4},buttonText:{prev:"Prec",next:"Succ",today:"Oggi",month:"Mese",week:"Settimana",day:"Giorno",list:"Agenda"},weekText:"Sm",allDayText:"Tutto il giorno",moreLinkText:function(e){return"+altri "+e},noEventsText:"Non ci sono eventi da visualizzare"},{code:"ja",buttonText:{prev:"前",next:"次",today:"今日",month:"月",week:"週",day:"日",list:"予定リスト"},weekText:"週",allDayText:"終日",moreLinkText:function(e){return"他 "+e+" 件"},noEventsText:"表示する予定はありません"},{code:"ka",week:{dow:1,doy:7},buttonText:{prev:"წინა",next:"შემდეგი",today:"დღეს",month:"თვე",week:"კვირა",day:"დღე",list:"დღის წესრიგი"},weekText:"კვ",allDayText:"მთელი დღე",moreLinkText:function(e){return"+ კიდევ "+e},noEventsText:"ღონისძიებები არ არის"},{code:"kk",week:{dow:1,doy:7},buttonText:{prev:"Алдыңғы",next:"Келесі",today:"Бүгін",month:"Ай",week:"Апта",day:"Күн",list:"Күн тәртібі"},weekText:"Не",allDayText:"Күні бойы",moreLinkText:function(e){return"+ тағы "+e},noEventsText:"Көрсету үшін оқиғалар жоқ"},{code:"ko",buttonText:{prev:"이전달",next:"다음달",today:"오늘",month:"월",week:"주",day:"일",list:"일정목록"},weekText:"주",allDayText:"종일",moreLinkText:"개",noEventsText:"일정이 없습니다"},{code:"lb",week:{dow:1,doy:4},buttonText:{prev:"Zréck",next:"Weider",today:"Haut",month:"Mount",week:"Woch",day:"Dag",list:"Terminiwwersiicht"},weekText:"W",allDayText:"Ganzen Dag",moreLinkText:"méi",noEventsText:"Nee Evenementer ze affichéieren"},{code:"lt",week:{dow:1,doy:4},buttonText:{prev:"Atgal",next:"Pirmyn",today:"Šiandien",month:"Mėnuo",week:"Savaitė",day:"Diena",list:"Darbotvarkė"},weekText:"SAV",allDayText:"Visą dieną",moreLinkText:"daugiau",noEventsText:"Nėra įvykių rodyti"},{code:"lv",week:{dow:1,doy:4},buttonText:{prev:"Iepr.",next:"Nāk.",today:"Šodien",month:"Mēnesis",week:"Nedēļa",day:"Diena",list:"Dienas kārtība"},weekText:"Ned.",allDayText:"Visu dienu",moreLinkText:function(e){return"+vēl "+e},noEventsText:"Nav notikumu"},{code:"mk",buttonText:{prev:"претходно",next:"следно",today:"Денес",month:"Месец",week:"Недела",day:"Ден",list:"График"},weekText:"Сед",allDayText:"Цел ден",moreLinkText:function(e){return"+повеќе "+e},noEventsText:"Нема настани за прикажување"},{code:"ms",week:{dow:1,doy:7},buttonText:{prev:"Sebelum",next:"Selepas",today:"hari ini",month:"Bulan",week:"Minggu",day:"Hari",list:"Agenda"},weekText:"Mg",allDayText:"Sepanjang hari",moreLinkText:function(e){return"masih ada "+e+" acara"},noEventsText:"Tiada peristiwa untuk dipaparkan"},{code:"nb",week:{dow:1,doy:4},buttonText:{prev:"Forrige",next:"Neste",today:"I dag",month:"Måned",week:"Uke",day:"Dag",list:"Agenda"},weekText:"Uke",allDayText:"Hele dagen",moreLinkText:"til",noEventsText:"Ingen hendelser å vise"},{code:"nl",week:{dow:1,doy:4},buttonText:{prev:"Voorgaand",next:"Volgende",today:"Vandaag",year:"Jaar",month:"Maand",week:"Week",day:"Dag",list:"Agenda"},allDayText:"Hele dag",moreLinkText:"extra",noEventsText:"Geen evenementen om te laten zien"},{code:"nn",week:{dow:1,doy:4},buttonText:{prev:"Førre",next:"Neste",today:"I dag",month:"Månad",week:"Veke",day:"Dag",list:"Agenda"},weekText:"Veke",allDayText:"Heile dagen",moreLinkText:"til",noEventsText:"Ingen hendelser å vise"},{code:"pl",week:{dow:1,doy:4},buttonText:{prev:"Poprzedni",next:"Następny",today:"Dziś",month:"Miesiąc",week:"Tydzień",day:"Dzień",list:"Plan dnia"},weekText:"Tydz",allDayText:"Cały dzień",moreLinkText:"więcej",noEventsText:"Brak wydarzeń do wyświetlenia"},{code:"pt-br",buttonText:{prev:"Anterior",next:"Próximo",today:"Hoje",month:"Mês",week:"Semana",day:"Dia",list:"Lista"},weekText:"Sm",allDayText:"dia inteiro",moreLinkText:function(e){return"mais +"+e},noEventsText:"Não há eventos para mostrar"},{code:"pt",week:{dow:1,doy:4},buttonText:{prev:"Anterior",next:"Seguinte",today:"Hoje",month:"Mês",week:"Semana",day:"Dia",list:"Agenda"},weekText:"Sem",allDayText:"Todo o dia",moreLinkText:"mais",noEventsText:"Não há eventos para mostrar"},{code:"ro",week:{dow:1,doy:7},buttonText:{prev:"precedentă",next:"următoare",today:"Azi",month:"Lună",week:"Săptămână",day:"Zi",list:"Agendă"},weekText:"Săpt",allDayText:"Toată ziua",moreLinkText:function(e){return"+alte "+e},noEventsText:"Nu există evenimente de afișat"},{code:"ru",week:{dow:1,doy:4},buttonText:{prev:"Пред",next:"След",today:"Сегодня",month:"Месяц",week:"Неделя",day:"День",list:"Повестка дня"},weekText:"Нед",allDayText:"Весь день",moreLinkText:function(e){return"+ ещё "+e},noEventsText:"Нет событий для отображения"},{code:"sk",week:{dow:1,doy:4},buttonText:{prev:"Predchádzajúci",next:"Nasledujúci",today:"Dnes",month:"Mesiac",week:"Týždeň",day:"Deň",list:"Rozvrh"},weekText:"Ty",allDayText:"Celý deň",moreLinkText:function(e){return"+ďalšie: "+e},noEventsText:"Žiadne akcie na zobrazenie"},{code:"sl",week:{dow:1,doy:7},buttonText:{prev:"Prejšnji",next:"Naslednji",today:"Trenutni",month:"Mesec",week:"Teden",day:"Dan",list:"Dnevni red"},weekText:"Teden",allDayText:"Ves dan",moreLinkText:"več",noEventsText:"Ni dogodkov za prikaz"},{code:"sq",week:{dow:1,doy:4},buttonText:{prev:"mbrapa",next:"Përpara",today:"sot",month:"Muaj",week:"Javë",day:"Ditë",list:"Listë"},weekText:"Ja",allDayText:"Gjithë ditën",moreLinkText:function(e){return"+më tepër "+e},noEventsText:"Nuk ka evente për të shfaqur"},{code:"sr-cyrl",week:{dow:1,doy:7},buttonText:{prev:"Претходна",next:"следећи",today:"Данас",month:"Месец",week:"Недеља",day:"Дан",list:"Планер"},weekText:"Сед",allDayText:"Цео дан",moreLinkText:function(e){return"+ још "+e},noEventsText:"Нема догађаја за приказ"},{code:"sr",week:{dow:1,doy:7},buttonText:{prev:"Prethodna",next:"Sledeći",today:"Danas",month:"Mеsеc",week:"Nеdеlja",day:"Dan",list:"Planеr"},weekText:"Sed",allDayText:"Cеo dan",moreLinkText:function(e){return"+ još "+e},noEventsText:"Nеma događaja za prikaz"},{code:"sv",week:{dow:1,doy:4},buttonText:{prev:"Förra",next:"Nästa",today:"Idag",month:"Månad",week:"Vecka",day:"Dag",list:"Program"},weekText:"v.",allDayText:"Heldag",moreLinkText:"till",noEventsText:"Inga händelser att visa"},{code:"th",week:{dow:1,doy:4},buttonText:{prev:"ก่อนหน้า",next:"ถัดไป",prevYear:"ปีก่อนหน้า",nextYear:"ปีถัดไป",year:"ปี",today:"วันนี้",month:"เดือน",week:"สัปดาห์",day:"วัน",list:"กำหนดการ"},weekText:"สัปดาห์",allDayText:"ตลอดวัน",moreLinkText:"เพิ่มเติม",noEventsText:"ไม่มีกิจกรรมที่จะแสดง"},{code:"tr",week:{dow:1,doy:7},buttonText:{prev:"geri",next:"ileri",today:"bugün",month:"Ay",week:"Hafta",day:"Gün",list:"Ajanda"},weekText:"Hf",allDayText:"Tüm gün",moreLinkText:"daha fazla",noEventsText:"Gösterilecek etkinlik yok"},{code:"ug",buttonText:{month:"ئاي",week:"ھەپتە",day:"كۈن",list:"كۈنتەرتىپ"},allDayText:"پۈتۈن كۈن"},{code:"uk",week:{dow:1,doy:7},buttonText:{prev:"Попередній",next:"далі",today:"Сьогодні",month:"Місяць",week:"Тиждень",day:"День",list:"Порядок денний"},weekText:"Тиж",allDayText:"Увесь день",moreLinkText:function(e){return"+ще "+e+"..."},noEventsText:"Немає подій для відображення"},{code:"uz",buttonText:{month:"Oy",week:"Xafta",day:"Kun",list:"Kun tartibi"},allDayText:"Kun bo'yi",moreLinkText:function(e){return"+ yana "+e},noEventsText:"Ko'rsatish uchun voqealar yo'q"},{code:"vi",week:{dow:1,doy:4},buttonText:{prev:"Trước",next:"Tiếp",today:"Hôm nay",month:"Tháng",week:"Tuần",day:"Ngày",list:"Lịch biểu"},weekText:"Tu",allDayText:"Cả ngày",moreLinkText:function(e){return"+ thêm "+e},noEventsText:"Không có sự kiện để hiển thị"},{code:"zh-cn",week:{dow:1,doy:4},buttonText:{prev:"上月",next:"下月",today:"今天",month:"月",week:"周",day:"日",list:"日程"},weekText:"周",allDayText:"全天",moreLinkText:function(e){return"另外 "+e+" 个"},noEventsText:"没有事件显示"},{code:"zh-tw",buttonText:{prev:"上月",next:"下月",today:"今天",month:"月",week:"週",day:"天",list:"活動列表"},weekText:"周",allDayText:"整天",moreLinkText:"顯示更多",noEventsText:"没有任何活動"}]}());
\ No newline at end of file
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/af.js b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/af.js
new file mode 100644
index 0000000000000000000000000000000000000000..a9535f5c4edec5af8ced9d8306da9b312c3ee94a
--- /dev/null
+++ b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/af.js
@@ -0,0 +1,27 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var af = {
+    code: "af",
+    week: {
+      dow: 1, // Maandag is die eerste dag van die week.
+      doy: 4  // Die week wat die 4de Januarie bevat is die eerste week van die jaar.
+    },
+    buttonText: {
+      prev: "Vorige",
+      next: "Volgende",
+      today: "Vandag",
+      year: "Jaar",
+      month: "Maand",
+      week: "Week",
+      day: "Dag",
+      list: "Agenda"
+    },
+    allDayText: "Heeldag",
+    moreLinkText: "Addisionele",
+    noEventsText: "Daar is geen gebeurtenisse nie"
+  };
+
+  return af;
+
+}());
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/ar-dz.js b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/ar-dz.js
new file mode 100644
index 0000000000000000000000000000000000000000..d351bcff0a4822dc4aa60937ea61a48f916785ad
--- /dev/null
+++ b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/ar-dz.js
@@ -0,0 +1,28 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var arDz = {
+    code: "ar-dz",
+    week: {
+      dow: 0, // Sunday is the first day of the week.
+      doy: 4  // The week that contains Jan 1st is the first week of the year.
+    },
+    direction: 'rtl',
+    buttonText: {
+      prev: "السابق",
+      next: "التالي",
+      today: "اليوم",
+      month: "شهر",
+      week: "أسبوع",
+      day: "يوم",
+      list: "أجندة"
+    },
+    weekText: "أسبوع",
+    allDayText: "اليوم كله",
+    moreLinkText: "أخرى",
+    noEventsText: "أي أحداث لعرض"
+  };
+
+  return arDz;
+
+}());
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/ar-kw.js b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/ar-kw.js
new file mode 100644
index 0000000000000000000000000000000000000000..080be1de192e75540d7e57702ac90a5ede373cb8
--- /dev/null
+++ b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/ar-kw.js
@@ -0,0 +1,28 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var arKw = {
+    code: "ar-kw",
+    week: {
+      dow: 0, // Sunday is the first day of the week.
+      doy: 12  // The week that contains Jan 1st is the first week of the year.
+    },
+    direction: 'rtl',
+    buttonText: {
+      prev: "السابق",
+      next: "التالي",
+      today: "اليوم",
+      month: "شهر",
+      week: "أسبوع",
+      day: "يوم",
+      list: "أجندة"
+    },
+    weekText: "أسبوع",
+    allDayText: "اليوم كله",
+    moreLinkText: "أخرى",
+    noEventsText: "أي أحداث لعرض"
+  };
+
+  return arKw;
+
+}());
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/ar-ly.js b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/ar-ly.js
new file mode 100644
index 0000000000000000000000000000000000000000..9dfac0a55d6eda2bffe6f21c42d8aa0c066cd88f
--- /dev/null
+++ b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/ar-ly.js
@@ -0,0 +1,28 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var arLy = {
+    code: "ar-ly",
+    week: {
+      dow: 6, // Saturday is the first day of the week.
+      doy: 12  // The week that contains Jan 1st is the first week of the year.
+    },
+    direction: 'rtl',
+    buttonText: {
+      prev: "السابق",
+      next: "التالي",
+      today: "اليوم",
+      month: "شهر",
+      week: "أسبوع",
+      day: "يوم",
+      list: "أجندة"
+    },
+    weekText: "أسبوع",
+    allDayText: "اليوم كله",
+    moreLinkText: "أخرى",
+    noEventsText: "أي أحداث لعرض"
+  };
+
+  return arLy;
+
+}());
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/ar-ma.js b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/ar-ma.js
new file mode 100644
index 0000000000000000000000000000000000000000..a44ce7d9ec764dd9987166e665ae0f6d2d95c593
--- /dev/null
+++ b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/ar-ma.js
@@ -0,0 +1,28 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var arMa = {
+    code: "ar-ma",
+    week: {
+      dow: 6, // Saturday is the first day of the week.
+      doy: 12  // The week that contains Jan 1st is the first week of the year.
+    },
+    direction: 'rtl',
+    buttonText: {
+      prev: "السابق",
+      next: "التالي",
+      today: "اليوم",
+      month: "شهر",
+      week: "أسبوع",
+      day: "يوم",
+      list: "أجندة"
+    },
+    weekText: "أسبوع",
+    allDayText: "اليوم كله",
+    moreLinkText: "أخرى",
+    noEventsText: "أي أحداث لعرض"
+  };
+
+  return arMa;
+
+}());
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/ar-sa.js b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/ar-sa.js
new file mode 100644
index 0000000000000000000000000000000000000000..554e3dff6cdef2b0fe9e832f569ccc84e5ab35f8
--- /dev/null
+++ b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/ar-sa.js
@@ -0,0 +1,28 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var arSa = {
+    code: "ar-sa",
+    week: {
+      dow: 0, // Sunday is the first day of the week.
+      doy: 6  // The week that contains Jan 1st is the first week of the year.
+    },
+    direction: 'rtl',
+    buttonText: {
+      prev: "السابق",
+      next: "التالي",
+      today: "اليوم",
+      month: "شهر",
+      week: "أسبوع",
+      day: "يوم",
+      list: "أجندة"
+    },
+    weekText: "أسبوع",
+    allDayText: "اليوم كله",
+    moreLinkText: "أخرى",
+    noEventsText: "أي أحداث لعرض"
+  };
+
+  return arSa;
+
+}());
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/ar-tn.js b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/ar-tn.js
new file mode 100644
index 0000000000000000000000000000000000000000..d4d4750905dc19c52ab5610ae4c8a2c20c0e7908
--- /dev/null
+++ b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/ar-tn.js
@@ -0,0 +1,28 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var arTn = {
+    code: "ar-tn",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4 // The week that contains Jan 4th is the first week of the year.
+    },
+    direction: 'rtl',
+    buttonText: {
+      prev: "السابق",
+      next: "التالي",
+      today: "اليوم",
+      month: "شهر",
+      week: "أسبوع",
+      day: "يوم",
+      list: "أجندة"
+    },
+    weekText: "أسبوع",
+    allDayText: "اليوم كله",
+    moreLinkText: "أخرى",
+    noEventsText: "أي أحداث لعرض"
+  };
+
+  return arTn;
+
+}());
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/ar.js b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/ar.js
new file mode 100644
index 0000000000000000000000000000000000000000..462c353fe65c9e5c41ab69ff7072d9fe64ef096a
--- /dev/null
+++ b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/ar.js
@@ -0,0 +1,28 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var ar = {
+    code: "ar",
+    week: {
+      dow: 6, // Saturday is the first day of the week.
+      doy: 12  // The week that contains Jan 1st is the first week of the year.
+    },
+    direction: 'rtl',
+    buttonText: {
+      prev: "السابق",
+      next: "التالي",
+      today: "اليوم",
+      month: "شهر",
+      week: "أسبوع",
+      day: "يوم",
+      list: "أجندة"
+    },
+    weekText: "أسبوع",
+    allDayText: "اليوم كله",
+    moreLinkText: "أخرى",
+    noEventsText: "أي أحداث لعرض"
+  };
+
+  return ar;
+
+}());
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/az.js b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/az.js
new file mode 100644
index 0000000000000000000000000000000000000000..634b46bf7cfab2e95487699d6677c29e04d24f32
--- /dev/null
+++ b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/az.js
@@ -0,0 +1,29 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var az = {
+    code: "az",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Əvvəl",
+      next: "Sonra",
+      today: "Bu Gün",
+      month: "Ay",
+      week: "Həftə",
+      day: "Gün",
+      list: "Gündəm"
+    },
+    weekText: "Həftə",
+    allDayText: "Bütün Gün",
+    moreLinkText: function(n) {
+      return "+ daha çox " + n;
+    },
+    noEventsText: "Göstərmək üçün hadisə yoxdur"
+  };
+
+  return az;
+
+}());
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/bg.js b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/bg.js
new file mode 100644
index 0000000000000000000000000000000000000000..a50a26a5680c5567739b95e57478ddab896e48f4
--- /dev/null
+++ b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/bg.js
@@ -0,0 +1,28 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var bg = {
+    code: "bg",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 7  // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: "назад",
+      next: "напред",
+      today: "днес",
+      month: "Месец",
+      week: "Седмица",
+      day: "Ден",
+      list: "График"
+    },
+    allDayText: "Цял ден",
+    moreLinkText: function(n) {
+      return "+още " + n;
+    },
+    noEventsText: "Няма събития за показване"
+  };
+
+  return bg;
+
+}());
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/bs.js b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/bs.js
new file mode 100644
index 0000000000000000000000000000000000000000..80c9f48432389b5f94183e96025e406f74f9a403
--- /dev/null
+++ b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/bs.js
@@ -0,0 +1,29 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var bs = {
+    code: "bs",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 7  // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: "Prošli",
+      next: "Sljedeći",
+      today: "Danas",
+      month: "Mjesec",
+      week: "Sedmica",
+      day: "Dan",
+      list: "Raspored"
+    },
+    weekText: "Sed",
+    allDayText: "Cijeli dan",
+    moreLinkText: function(n) {
+      return "+ još " + n;
+    },
+    noEventsText: "Nema događaja za prikazivanje"
+  };
+
+  return bs;
+
+}());
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/ca.js b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/ca.js
new file mode 100644
index 0000000000000000000000000000000000000000..1e1d9b8e976918879e5f5e6f41a074c284241b1a
--- /dev/null
+++ b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/ca.js
@@ -0,0 +1,27 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var ca = {
+    code: "ca",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Anterior",
+      next: "Següent",
+      today: "Avui",
+      month: "Mes",
+      week: "Setmana",
+      day: "Dia",
+      list: "Agenda"
+    },
+    weekText: "Set",
+    allDayText: "Tot el dia",
+    moreLinkText: "més",
+    noEventsText: "No hi ha esdeveniments per mostrar"
+  };
+
+  return ca;
+
+}());
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/cs.js b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/cs.js
new file mode 100644
index 0000000000000000000000000000000000000000..197b68c53b5dd60c9ef0d0812eb6a2e60441e395
--- /dev/null
+++ b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/cs.js
@@ -0,0 +1,29 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var cs = {
+    code: "cs",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Dříve",
+      next: "Později",
+      today: "Nyní",
+      month: "Měsíc",
+      week: "Týden",
+      day: "Den",
+      list: "Agenda"
+    },
+    weekText: "Týd",
+    allDayText: "Celý den",
+    moreLinkText: function(n) {
+      return "+další: " + n;
+    },
+    noEventsText: "Žádné akce k zobrazení"
+  };
+
+  return cs;
+
+}());
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/da.js b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/da.js
new file mode 100644
index 0000000000000000000000000000000000000000..9db9d4a22e82d4a69338769a68ec7582bda214c8
--- /dev/null
+++ b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/da.js
@@ -0,0 +1,27 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var da = {
+    code: "da",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Forrige",
+      next: "Næste",
+      today: "I dag",
+      month: "MÃ¥ned",
+      week: "Uge",
+      day: "Dag",
+      list: "Agenda"
+    },
+    weekText: "Uge",
+    allDayText: "Hele dagen",
+    moreLinkText: "flere",
+    noEventsText: "Ingen arrangementer at vise"
+  };
+
+  return da;
+
+}());
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/de.js b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/de.js
new file mode 100644
index 0000000000000000000000000000000000000000..94374b94e49361387bfba5a992acdc13dba1166b
--- /dev/null
+++ b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/de.js
@@ -0,0 +1,30 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var de = {
+    code: "de",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Zurück",
+      next: "Vor",
+      today: "Heute",
+      year: "Jahr",
+      month: "Monat",
+      week: "Woche",
+      day: "Tag",
+      list: "Terminübersicht"
+    },
+    weekText: "KW",
+    allDayText: "Ganztägig",
+    moreLinkText: function(n) {
+      return "+ weitere " + n;
+    },
+    noEventsText: "Keine Ereignisse anzuzeigen"
+  };
+
+  return de;
+
+}());
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/el.js b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/el.js
new file mode 100644
index 0000000000000000000000000000000000000000..59c1a4c27582b937863724bf368f717f13450a25
--- /dev/null
+++ b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/el.js
@@ -0,0 +1,27 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var el = {
+    code: "el",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4st is the first week of the year.
+    },
+    buttonText: {
+      prev: "Προηγούμενος",
+      next: "Επόμενος",
+      today: "Σήμερα",
+      month: "Μήνας",
+      week: "Εβδομάδα",
+      day: "Ημέρα",
+      list: "Ατζέντα"
+    },
+    weekText: "Εβδ",
+    allDayText: "Ολοήμερο",
+    moreLinkText: "περισσότερα",
+    noEventsText: "Δεν υπάρχουν γεγονότα προς εμφάνιση"
+  };
+
+  return el;
+
+}());
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/en-au.js b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/en-au.js
new file mode 100644
index 0000000000000000000000000000000000000000..9a214978f61dc94cd6cf64b94651928851b0184a
--- /dev/null
+++ b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/en-au.js
@@ -0,0 +1,14 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var enAu = {
+    code: "en-au",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    }
+  };
+
+  return enAu;
+
+}());
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/en-gb.js b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/en-gb.js
new file mode 100644
index 0000000000000000000000000000000000000000..e53ab94e12cd6e092cc3282f30b740d17182009b
--- /dev/null
+++ b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/en-gb.js
@@ -0,0 +1,14 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var enGb = {
+    code: "en-gb",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    }
+  };
+
+  return enGb;
+
+}());
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/en-nz.js b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/en-nz.js
new file mode 100644
index 0000000000000000000000000000000000000000..27ffd6713879856dd066334fa5a5dc1739901652
--- /dev/null
+++ b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/en-nz.js
@@ -0,0 +1,14 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var enNz = {
+    code: "en-nz",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    }
+  };
+
+  return enNz;
+
+}());
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/es-us.js b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/es-us.js
new file mode 100644
index 0000000000000000000000000000000000000000..e91571df7bef251619e7156a7b601221e92788eb
--- /dev/null
+++ b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/es-us.js
@@ -0,0 +1,27 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var esUs = {
+    code: "es",
+    week: {
+      dow: 0, // Sunday is the first day of the week.
+      doy: 6  // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: "Ant",
+      next: "Sig",
+      today: "Hoy",
+      month: "Mes",
+      week: "Semana",
+      day: "Día",
+      list: "Agenda"
+    },
+    weekText: "Sm",
+    allDayText: "Todo el día",
+    moreLinkText: "más",
+    noEventsText: "No hay eventos para mostrar"
+  };
+
+  return esUs;
+
+}());
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/es.js b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/es.js
new file mode 100644
index 0000000000000000000000000000000000000000..a7a61bb9221da33ed02667be792ea4134a5be5e6
--- /dev/null
+++ b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/es.js
@@ -0,0 +1,27 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var es = {
+    code: "es",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Ant",
+      next: "Sig",
+      today: "Hoy",
+      month: "Mes",
+      week: "Semana",
+      day: "Día",
+      list: "Agenda"
+    },
+    weekText: "Sm",
+    allDayText: "Todo el día",
+    moreLinkText: "más",
+    noEventsText: "No hay eventos para mostrar"
+  };
+
+  return es;
+
+}());
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/et.js b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/et.js
new file mode 100644
index 0000000000000000000000000000000000000000..364e378da48f1605ffb54c49b4ce766095e911a5
--- /dev/null
+++ b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/et.js
@@ -0,0 +1,29 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var et = {
+    code: "et",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Eelnev",
+      next: "Järgnev",
+      today: "Täna",
+      month: "Kuu",
+      week: "Nädal",
+      day: "Päev",
+      list: "Päevakord"
+    },
+    weekText: "näd",
+    allDayText: "Kogu päev",
+    moreLinkText: function(n) {
+      return "+ veel " + n;
+    },
+    noEventsText: "Kuvamiseks puuduvad sündmused"
+  };
+
+  return et;
+
+}());
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/eu.js b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/eu.js
new file mode 100644
index 0000000000000000000000000000000000000000..3554dc2041575343a6c19b355c6bacc4e76d70be
--- /dev/null
+++ b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/eu.js
@@ -0,0 +1,27 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var eu = {
+    code: "eu",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 7  // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: "Aur",
+      next: "Hur",
+      today: "Gaur",
+      month: "Hilabetea",
+      week: "Astea",
+      day: "Eguna",
+      list: "Agenda"
+    },
+    weekText: "As",
+    allDayText: "Egun osoa",
+    moreLinkText: "gehiago",
+    noEventsText: "Ez dago ekitaldirik erakusteko"
+  };
+
+  return eu;
+
+}());
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/fa.js b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/fa.js
new file mode 100644
index 0000000000000000000000000000000000000000..b0767b95c1584a6124f12e978aecdbebd75f23fd
--- /dev/null
+++ b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/fa.js
@@ -0,0 +1,30 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var fa = {
+    code: "fa",
+    week: {
+      dow: 6, // Saturday is the first day of the week.
+      doy: 12 // The week that contains Jan 1st is the first week of the year.
+    },
+    direction: 'rtl',
+    buttonText: {
+      prev: "قبلی",
+      next: "بعدی",
+      today: "امروز",
+      month: "ماه",
+      week: "هفته",
+      day: "روز",
+      list: "برنامه"
+    },
+    weekText: "هف",
+    allDayText: "تمام روز",
+    moreLinkText: function(n) {
+      return "بیش از " + n;
+    },
+    noEventsText: "هیچ رویدادی به نمایش"
+  };
+
+  return fa;
+
+}());
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/fi.js b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/fi.js
new file mode 100644
index 0000000000000000000000000000000000000000..3e8b5756e177696ea8186a2bcbeaf84c8994d198
--- /dev/null
+++ b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/fi.js
@@ -0,0 +1,27 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var fi = {
+    code: "fi",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Edellinen",
+      next: "Seuraava",
+      today: "Tänään",
+      month: "Kuukausi",
+      week: "Viikko",
+      day: "Päivä",
+      list: "Tapahtumat"
+    },
+    weekText: "Vk",
+    allDayText: "Koko päivä",
+    moreLinkText: "lisää",
+    noEventsText: "Ei näytettäviä tapahtumia"
+  };
+
+  return fi;
+
+}());
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/fr-ca.js b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/fr-ca.js
new file mode 100644
index 0000000000000000000000000000000000000000..3f647e035d6a016e4b138443f369ca5abd33b7df
--- /dev/null
+++ b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/fr-ca.js
@@ -0,0 +1,24 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var frCa = {
+    code: "fr",
+    buttonText: {
+      prev: "Précédent",
+      next: "Suivant",
+      today: "Aujourd'hui",
+      year: "Année",
+      month: "Mois",
+      week: "Semaine",
+      day: "Jour",
+      list: "Mon planning"
+    },
+    weekText: "Sem.",
+    allDayText: "Toute la journée",
+    moreLinkText: "en plus",
+    noEventsText: "Aucun événement à afficher"
+  };
+
+  return frCa;
+
+}());
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/fr-ch.js b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/fr-ch.js
new file mode 100644
index 0000000000000000000000000000000000000000..d0787713c8efd922e5f163cd60490f04014cf752
--- /dev/null
+++ b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/fr-ch.js
@@ -0,0 +1,28 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var frCh = {
+    code: "fr-ch",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Précédent",
+      next: "Suivant",
+      today: "Courant",
+      year: "Année",
+      month: "Mois",
+      week: "Semaine",
+      day: "Jour",
+      list: "Mon planning"
+    },
+    weekText: "Sm",
+    allDayText: "Toute la journée",
+    moreLinkText: "en plus",
+    noEventsText: "Aucun événement à afficher"
+  };
+
+  return frCh;
+
+}());
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/fr.js b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/fr.js
new file mode 100644
index 0000000000000000000000000000000000000000..6948d410682e1705aaf2a8e8b876c7ad9dadb8ed
--- /dev/null
+++ b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/fr.js
@@ -0,0 +1,28 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var fr = {
+    code: "fr",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Précédent",
+      next: "Suivant",
+      today: "Aujourd'hui",
+      year: "Année",
+      month: "Mois",
+      week: "Semaine",
+      day: "Jour",
+      list: "Planning"
+    },
+    weekText: "Sem.",
+    allDayText: "Toute la journée",
+    moreLinkText: "en plus",
+    noEventsText: "Aucun événement à afficher"
+  };
+
+  return fr;
+
+}());
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/gl.js b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/gl.js
new file mode 100644
index 0000000000000000000000000000000000000000..bb090b9064b9e89f2230c52f26dd2e6dc4a9d915
--- /dev/null
+++ b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/gl.js
@@ -0,0 +1,27 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var gl = {
+    code: "gl",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Ant",
+      next: "Seg",
+      today: "Hoxe",
+      month: "Mes",
+      week: "Semana",
+      day: "Día",
+      list: "Axenda"
+    },
+    weekText: "Sm",
+    allDayText: "Todo o día",
+    moreLinkText: "máis",
+    noEventsText: "Non hai eventos para amosar"
+  };
+
+  return gl;
+
+}());
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/he.js b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/he.js
new file mode 100644
index 0000000000000000000000000000000000000000..e1848d8b3b3d38a3c87bb8c89770f7cff9485594
--- /dev/null
+++ b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/he.js
@@ -0,0 +1,24 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var he = {
+    code: "he",
+    direction: 'rtl',
+    buttonText: {
+      prev: "הקודם",
+      next: "הבא",
+      today: "היום",
+      month: "חודש",
+      week: "שבוע",
+      day: "יום",
+      list: "סדר יום"
+    },
+    allDayText: "כל היום",
+    moreLinkText: "אחר",
+    noEventsText: "אין אירועים להצגה",
+    weekText: "שבוע"
+  };
+
+  return he;
+
+}());
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/hi.js b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/hi.js
new file mode 100644
index 0000000000000000000000000000000000000000..2e52eee0fc54a7054308c0e014a31111c73af29e
--- /dev/null
+++ b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/hi.js
@@ -0,0 +1,29 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var hi = {
+    code: "hi",
+    week: {
+      dow: 0, // Sunday is the first day of the week.
+      doy: 6  // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: "पिछला",
+      next: "अगला",
+      today: "आज",
+      month: "महीना",
+      week: "सप्ताह",
+      day: "दिन",
+      list: "कार्यसूची"
+    },
+    weekText: "हफ्ता",
+    allDayText: "सभी दिन",
+    moreLinkText: function(n) {
+      return "+अधिक " + n;
+    },
+    noEventsText: "कोई घटनाओं को प्रदर्शित करने के लिए"
+  };
+
+  return hi;
+
+}());
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/hr.js b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/hr.js
new file mode 100644
index 0000000000000000000000000000000000000000..23d555063344b8f1ee0d24d9efdda02a0b0e161b
--- /dev/null
+++ b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/hr.js
@@ -0,0 +1,29 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var hr = {
+    code: "hr",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 7  // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: "Prijašnji",
+      next: "Sljedeći",
+      today: "Danas",
+      month: "Mjesec",
+      week: "Tjedan",
+      day: "Dan",
+      list: "Raspored"
+    },
+    weekText: "Tje",
+    allDayText: "Cijeli dan",
+    moreLinkText: function(n) {
+      return "+ još " + n;
+    },
+    noEventsText: "Nema događaja za prikaz"
+  };
+
+  return hr;
+
+}());
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/hu.js b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/hu.js
new file mode 100644
index 0000000000000000000000000000000000000000..ff4dd555583ecfe34ae87419881f8f5eac8dec05
--- /dev/null
+++ b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/hu.js
@@ -0,0 +1,27 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var hu = {
+    code: "hu",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "vissza",
+      next: "előre",
+      today: "ma",
+      month: "Hónap",
+      week: "Hét",
+      day: "Nap",
+      list: "Napló"
+    },
+    weekText: "Hét",
+    allDayText: "Egész nap",
+    moreLinkText: "további",
+    noEventsText: "Nincs megjeleníthető esemény"
+  };
+
+  return hu;
+
+}());
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/id.js b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/id.js
new file mode 100644
index 0000000000000000000000000000000000000000..4e43a3e4205da5902f405ec62b27b5337121fb5e
--- /dev/null
+++ b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/id.js
@@ -0,0 +1,27 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var id = {
+    code: "id",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 7  // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: "mundur",
+      next: "maju",
+      today: "hari ini",
+      month: "Bulan",
+      week: "Minggu",
+      day: "Hari",
+      list: "Agenda"
+    },
+    weekText: "Mg",
+    allDayText: "Sehari penuh",
+    moreLinkText: "lebih",
+    noEventsText: "Tidak ada acara untuk ditampilkan"
+  };
+
+  return id;
+
+}());
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/is.js b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/is.js
new file mode 100644
index 0000000000000000000000000000000000000000..df99e26d63d845db423dbceb915359abd88e59a1
--- /dev/null
+++ b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/is.js
@@ -0,0 +1,27 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var is = {
+    code: "is",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Fyrri",
+      next: "Næsti",
+      today: "Í dag",
+      month: "Mánuður",
+      week: "Vika",
+      day: "Dagur",
+      list: "Dagskrá"
+    },
+    weekText: "Vika",
+    allDayText: "Allan daginn",
+    moreLinkText: "meira",
+    noEventsText: "Engir viðburðir til að sýna"
+  };
+
+  return is;
+
+}());
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/it.js b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/it.js
new file mode 100644
index 0000000000000000000000000000000000000000..772f4593070efcefd1a5670a6ecab6b46dc21523
--- /dev/null
+++ b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/it.js
@@ -0,0 +1,29 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var it = {
+    code: "it",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Prec",
+      next: "Succ",
+      today: "Oggi",
+      month: "Mese",
+      week: "Settimana",
+      day: "Giorno",
+      list: "Agenda"
+    },
+    weekText: "Sm",
+    allDayText: "Tutto il giorno",
+    moreLinkText: function(n) {
+      return "+altri " + n;
+    },
+    noEventsText: "Non ci sono eventi da visualizzare"
+  };
+
+  return it;
+
+}());
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/ja.js b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/ja.js
new file mode 100644
index 0000000000000000000000000000000000000000..79fad276c93c0fe9c11c0ea529211893d0c7e500
--- /dev/null
+++ b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/ja.js
@@ -0,0 +1,25 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var ja = {
+    code: "ja",
+    buttonText: {
+      prev: "前",
+      next: "次",
+      today: "今日",
+      month: "月",
+      week: "週",
+      day: "æ—¥",
+      list: "予定リスト"
+    },
+    weekText: "週",
+    allDayText: "終日",
+    moreLinkText: function(n) {
+      return "他 " + n + " 件";
+    },
+    noEventsText: "表示する予定はありません"
+  };
+
+  return ja;
+
+}());
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/ka.js b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/ka.js
new file mode 100644
index 0000000000000000000000000000000000000000..20de1808c3a34c6b479389182e6eb475b291e927
--- /dev/null
+++ b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/ka.js
@@ -0,0 +1,29 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var ka = {
+    code: "ka",
+    week: {
+      dow: 1,
+      doy: 7
+    },
+    buttonText: {
+      prev: "წინა",
+      next: "შემდეგი",
+      today: "დღეს",
+      month: "თვე",
+      week: "კვირა",
+      day: "დღე",
+      list: "დღის წესრიგი"
+    },
+    weekText: "კვ",
+    allDayText: "მთელი დღე",
+    moreLinkText: function(n) {
+      return "+ კიდევ " + n;
+    },
+    noEventsText: "ღონისძიებები არ არის"
+  };
+
+  return ka;
+
+}());
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/kk.js b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/kk.js
new file mode 100644
index 0000000000000000000000000000000000000000..1bbc2ef4fd72b0f4b085083a9969978486acc692
--- /dev/null
+++ b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/kk.js
@@ -0,0 +1,29 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var kk = {
+    code: "kk",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 7  // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: "Алдыңғы",
+      next: "Келесі",
+      today: "Бүгін",
+      month: "Ай",
+      week: "Апта",
+      day: "Күн",
+      list: "Күн тәртібі"
+    },
+    weekText: "Не",
+    allDayText: "Күні бойы",
+    moreLinkText: function(n) {
+      return "+ тағы " + n;
+    },
+    noEventsText: "Көрсету үшін оқиғалар жоқ"
+  };
+
+  return kk;
+
+}());
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/ko.js b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/ko.js
new file mode 100644
index 0000000000000000000000000000000000000000..65f7ea190a51c22e02158c196696b3adb465a706
--- /dev/null
+++ b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/ko.js
@@ -0,0 +1,23 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var ko = {
+    code: "ko",
+    buttonText: {
+      prev: "이전달",
+      next: "다음달",
+      today: "오늘",
+      month: "ì›”",
+      week: "주",
+      day: "일",
+      list: "일정목록"
+    },
+    weekText: "주",
+    allDayText: "종일",
+    moreLinkText: "개",
+    noEventsText: "일정이 없습니다"
+  };
+
+  return ko;
+
+}());
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/lb.js b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/lb.js
new file mode 100644
index 0000000000000000000000000000000000000000..2faf1ded2ca593f7d73165a4b966c395e8eab5e3
--- /dev/null
+++ b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/lb.js
@@ -0,0 +1,27 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var lb = {
+    code: "lb",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Zréck",
+      next: "Weider",
+      today: "Haut",
+      month: "Mount",
+      week: "Woch",
+      day: "Dag",
+      list: "Terminiwwersiicht"
+    },
+    weekText: "W",
+    allDayText: "Ganzen Dag",
+    moreLinkText: "méi",
+    noEventsText: "Nee Evenementer ze affichéieren"
+  };
+
+  return lb;
+
+}());
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/lt.js b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/lt.js
new file mode 100644
index 0000000000000000000000000000000000000000..50c4611068b3329a229a68fbc7fa5d0830332175
--- /dev/null
+++ b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/lt.js
@@ -0,0 +1,27 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var lt = {
+    code: "lt",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Atgal",
+      next: "Pirmyn",
+      today: "Å iandien",
+      month: "MÄ—nuo",
+      week: "SavaitÄ—",
+      day: "Diena",
+      list: "DarbotvarkÄ—"
+    },
+    weekText: "SAV",
+    allDayText: "VisÄ… dienÄ…",
+    moreLinkText: "daugiau",
+    noEventsText: "Nėra įvykių rodyti"
+  };
+
+  return lt;
+
+}());
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/lv.js b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/lv.js
new file mode 100644
index 0000000000000000000000000000000000000000..9598b26c35eda8bf0241d1fe92620774e7dc66c3
--- /dev/null
+++ b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/lv.js
@@ -0,0 +1,29 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var lv = {
+    code: "lv",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Iepr.",
+      next: "Nāk.",
+      today: "Å odien",
+      month: "MÄ“nesis",
+      week: "Nedēļa",
+      day: "Diena",
+      list: "Dienas kārtība"
+    },
+    weekText: "Ned.",
+    allDayText: "Visu dienu",
+    moreLinkText: function(n) {
+      return "+vēl " + n;
+    },
+    noEventsText: "Nav notikumu"
+  };
+
+  return lv;
+
+}());
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/mk.js b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/mk.js
new file mode 100644
index 0000000000000000000000000000000000000000..d90347330489f06b7461a7cc8731576037229cfa
--- /dev/null
+++ b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/mk.js
@@ -0,0 +1,25 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var mk = {
+    code: "mk",
+    buttonText: {
+      prev: "претходно",
+      next: "следно",
+      today: "Денес",
+      month: "Месец",
+      week: "Недела",
+      day: "Ден",
+      list: "График"
+    },
+    weekText: "Сед",
+    allDayText: "Цел ден",
+    moreLinkText: function(n) {
+      return "+повеќе " + n;
+    },
+    noEventsText: "Нема настани за прикажување"
+  };
+
+  return mk;
+
+}());
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/ms.js b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/ms.js
new file mode 100644
index 0000000000000000000000000000000000000000..3d4fdb3dd0271a40f7832bc17158c4bc2c361c5e
--- /dev/null
+++ b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/ms.js
@@ -0,0 +1,29 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var ms = {
+    code: "ms",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 7  // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: "Sebelum",
+      next: "Selepas",
+      today: "hari ini",
+      month: "Bulan",
+      week: "Minggu",
+      day: "Hari",
+      list: "Agenda"
+    },
+    weekText: "Mg",
+    allDayText: "Sepanjang hari",
+    moreLinkText: function(n) {
+      return "masih ada " + n + " acara";
+    },
+    noEventsText: "Tiada peristiwa untuk dipaparkan"
+  };
+
+  return ms;
+
+}());
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/nb.js b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/nb.js
new file mode 100644
index 0000000000000000000000000000000000000000..9512e079bc1b1494c917183e20730bac96de841f
--- /dev/null
+++ b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/nb.js
@@ -0,0 +1,27 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var nb = {
+    code: "nb",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Forrige",
+      next: "Neste",
+      today: "I dag",
+      month: "MÃ¥ned",
+      week: "Uke",
+      day: "Dag",
+      list: "Agenda"
+    },
+    weekText: "Uke",
+    allDayText: "Hele dagen",
+    moreLinkText: "til",
+    noEventsText: "Ingen hendelser å vise"
+  };
+
+  return nb;
+
+}());
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/nl.js b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/nl.js
new file mode 100644
index 0000000000000000000000000000000000000000..a485abf00f2d78f3d43cd48f0e4c12935ef40a8f
--- /dev/null
+++ b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/nl.js
@@ -0,0 +1,27 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var nl = {
+    code: "nl",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Voorgaand",
+      next: "Volgende",
+      today: "Vandaag",
+      year: "Jaar",
+      month: "Maand",
+      week: "Week",
+      day: "Dag",
+      list: "Agenda"
+    },
+    allDayText: "Hele dag",
+    moreLinkText: "extra",
+    noEventsText: "Geen evenementen om te laten zien"
+  };
+
+  return nl;
+
+}());
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/nn.js b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/nn.js
new file mode 100644
index 0000000000000000000000000000000000000000..692127ed40374979fa1439aa35829ab65545dc19
--- /dev/null
+++ b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/nn.js
@@ -0,0 +1,27 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var nn = {
+    code: "nn",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Førre",
+      next: "Neste",
+      today: "I dag",
+      month: "MÃ¥nad",
+      week: "Veke",
+      day: "Dag",
+      list: "Agenda"
+    },
+    weekText: "Veke",
+    allDayText: "Heile dagen",
+    moreLinkText: "til",
+    noEventsText: "Ingen hendelser å vise"
+  };
+
+  return nn;
+
+}());
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/pl.js b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/pl.js
new file mode 100644
index 0000000000000000000000000000000000000000..ed21adf667330ed684fd1e48d9e64ad20caffa8a
--- /dev/null
+++ b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/pl.js
@@ -0,0 +1,27 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var pl = {
+    code: "pl",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Poprzedni",
+      next: "Następny",
+      today: "DziÅ›",
+      month: "MiesiÄ…c",
+      week: "Tydzień",
+      day: "Dzień",
+      list: "Plan dnia"
+    },
+    weekText: "Tydz",
+    allDayText: "Cały dzień",
+    moreLinkText: "więcej",
+    noEventsText: "Brak wydarzeń do wyświetlenia"
+  };
+
+  return pl;
+
+}());
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/pt-br.js b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/pt-br.js
new file mode 100644
index 0000000000000000000000000000000000000000..92744d94320971dd86bab2cf97373bfdbdb359d7
--- /dev/null
+++ b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/pt-br.js
@@ -0,0 +1,25 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var ptBr = {
+    code: "pt-br",
+    buttonText: {
+      prev: "Anterior",
+      next: "Próximo",
+      today: "Hoje",
+      month: "Mês",
+      week: "Semana",
+      day: "Dia",
+      list: "Lista"
+    },
+    weekText: "Sm",
+    allDayText: "dia inteiro",
+    moreLinkText: function(n) {
+      return "mais +" + n;
+    },
+    noEventsText: "Não há eventos para mostrar"
+  };
+
+  return ptBr;
+
+}());
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/pt.js b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/pt.js
new file mode 100644
index 0000000000000000000000000000000000000000..b72a79b92d65faf0740f56884777e7e424951d66
--- /dev/null
+++ b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/pt.js
@@ -0,0 +1,27 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var pt = {
+    code: "pt",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Anterior",
+      next: "Seguinte",
+      today: "Hoje",
+      month: "Mês",
+      week: "Semana",
+      day: "Dia",
+      list: "Agenda"
+    },
+    weekText: "Sem",
+    allDayText: "Todo o dia",
+    moreLinkText: "mais",
+    noEventsText: "Não há eventos para mostrar"
+  };
+
+  return pt;
+
+}());
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/ro.js b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/ro.js
new file mode 100644
index 0000000000000000000000000000000000000000..0f833f3b04517b8fa967516aad5cad79ea3baa67
--- /dev/null
+++ b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/ro.js
@@ -0,0 +1,29 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var ro = {
+    code: "ro",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 7  // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: "precedentă",
+      next: "următoare",
+      today: "Azi",
+      month: "Lună",
+      week: "Săptămână",
+      day: "Zi",
+      list: "Agendă"
+    },
+    weekText: "Săpt",
+    allDayText: "Toată ziua",
+    moreLinkText: function(n) {
+      return "+alte " + n;
+    },
+    noEventsText: "Nu există evenimente de afișat"
+  };
+
+  return ro;
+
+}());
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/ru.js b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/ru.js
new file mode 100644
index 0000000000000000000000000000000000000000..0cf61d6826985c2eb79337148cb8a2007108fc97
--- /dev/null
+++ b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/ru.js
@@ -0,0 +1,29 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var ru = {
+    code: "ru",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Пред",
+      next: "След",
+      today: "Сегодня",
+      month: "Месяц",
+      week: "Неделя",
+      day: "День",
+      list: "Повестка дня"
+    },
+    weekText: "Нед",
+    allDayText: "Весь день",
+    moreLinkText: function(n) {
+      return "+ ещё " + n;
+    },
+    noEventsText: "Нет событий для отображения"
+  };
+
+  return ru;
+
+}());
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/sk.js b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/sk.js
new file mode 100644
index 0000000000000000000000000000000000000000..a46f85d9ce585c78ab8ac187bed18d3468eca027
--- /dev/null
+++ b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/sk.js
@@ -0,0 +1,29 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var sk = {
+    code: "sk",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Predchádzajúci",
+      next: "Nasledujúci",
+      today: "Dnes",
+      month: "Mesiac",
+      week: "Týždeň",
+      day: "Deň",
+      list: "Rozvrh"
+    },
+    weekText: "Ty",
+    allDayText: "Celý deň",
+    moreLinkText: function(n) {
+      return "+ďalšie: " + n;
+    },
+    noEventsText: "Žiadne akcie na zobrazenie"
+  };
+
+  return sk;
+
+}());
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/sl.js b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/sl.js
new file mode 100644
index 0000000000000000000000000000000000000000..56cc360bb025e093f3d0740831cb13f6a17ab5aa
--- /dev/null
+++ b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/sl.js
@@ -0,0 +1,27 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var sl = {
+    code: "sl",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 7  // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: "Prejšnji",
+      next: "Naslednji",
+      today: "Trenutni",
+      month: "Mesec",
+      week: "Teden",
+      day: "Dan",
+      list: "Dnevni red"
+    },
+    weekText: "Teden",
+    allDayText: "Ves dan",
+    moreLinkText: "več",
+    noEventsText: "Ni dogodkov za prikaz"
+  };
+
+  return sl;
+
+}());
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/sq.js b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/sq.js
new file mode 100644
index 0000000000000000000000000000000000000000..8e2ac0b790146157718215d67251ca1b3c6f6896
--- /dev/null
+++ b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/sq.js
@@ -0,0 +1,29 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var sq = {
+    code: "sq",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "mbrapa",
+      next: "Përpara",
+      today: "sot",
+      month: "Muaj",
+      week: "Javë",
+      day: "Ditë",
+      list: "Listë"
+    },
+    weekText: "Ja",
+    allDayText: "Gjithë ditën",
+    moreLinkText: function(n) {
+      return "+më tepër " + n;
+    },
+    noEventsText: "Nuk ka evente për të shfaqur"
+  };
+
+  return sq;
+
+}());
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/sr-cyrl.js b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/sr-cyrl.js
new file mode 100644
index 0000000000000000000000000000000000000000..c650d70d13e369f28dcffe8c6e069045b949d858
--- /dev/null
+++ b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/sr-cyrl.js
@@ -0,0 +1,29 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var srCyrl = {
+    code: "sr-cyrl",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 7  // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: "Претходна",
+      next: "следећи",
+      today: "Данас",
+      month: "Месец",
+      week: "Недеља",
+      day: "Дан",
+      list: "Планер"
+    },
+    weekText: "Сед",
+    allDayText: "Цео дан",
+    moreLinkText: function(n) {
+      return "+ још " + n;
+    },
+    noEventsText: "Нема догађаја за приказ"
+  };
+
+  return srCyrl;
+
+}());
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/sr.js b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/sr.js
new file mode 100644
index 0000000000000000000000000000000000000000..74a949d5c1103c3bec92923164cae00aa2e2f747
--- /dev/null
+++ b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/sr.js
@@ -0,0 +1,29 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var sr = {
+    code: "sr",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 7  // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: "Prethodna",
+      next: "Sledeći",
+      today: "Danas",
+      month: "Mеsеc",
+      week: "Nеdеlja",
+      day: "Dan",
+      list: "Planеr"
+    },
+    weekText: "Sed",
+    allDayText: "Cеo dan",
+    moreLinkText: function(n) {
+      return "+ još " + n;
+    },
+    noEventsText: "Nеma događaja za prikaz"
+  };
+
+  return sr;
+
+}());
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/sv.js b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/sv.js
new file mode 100644
index 0000000000000000000000000000000000000000..b3a809db5dcced6e3a51f34dc3d652b2b293030f
--- /dev/null
+++ b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/sv.js
@@ -0,0 +1,27 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var sv = {
+    code: "sv",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "Förra",
+      next: "Nästa",
+      today: "Idag",
+      month: "MÃ¥nad",
+      week: "Vecka",
+      day: "Dag",
+      list: "Program"
+    },
+    weekText: "v.",
+    allDayText: "Heldag",
+    moreLinkText: "till",
+    noEventsText: "Inga händelser att visa"
+  };
+
+  return sv;
+
+}());
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/th.js b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/th.js
new file mode 100644
index 0000000000000000000000000000000000000000..927b392cf1a102dc1067580fe3ad2a0d02e5430e
--- /dev/null
+++ b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/th.js
@@ -0,0 +1,30 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var th = {
+    code: "th",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "ก่อนหน้า",
+      next: "ถัดไป",
+      prevYear: 'ปีก่อนหน้า',
+      nextYear: 'ปีถัดไป',
+      year: 'ปี',
+      today: "วันนี้",
+      month: "เดือน",
+      week: "สัปดาห์",
+      day: "วัน",
+      list: "กำหนดการ"
+    },
+    weekText: "สัปดาห์",
+    allDayText: "ตลอดวัน",
+    moreLinkText: "เพิ่มเติม",
+    noEventsText: "ไม่มีกิจกรรมที่จะแสดง"
+  };
+
+  return th;
+
+}());
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/tr.js b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/tr.js
new file mode 100644
index 0000000000000000000000000000000000000000..dd19a44af2d2061012aab7940eb4531047387451
--- /dev/null
+++ b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/tr.js
@@ -0,0 +1,27 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var tr = {
+    code: "tr",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 7  // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: "geri",
+      next: "ileri",
+      today: "bugün",
+      month: "Ay",
+      week: "Hafta",
+      day: "Gün",
+      list: "Ajanda"
+    },
+    weekText: "Hf",
+    allDayText: "Tüm gün",
+    moreLinkText: "daha fazla",
+    noEventsText: "Gösterilecek etkinlik yok"
+  };
+
+  return tr;
+
+}());
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/ug.js b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/ug.js
new file mode 100644
index 0000000000000000000000000000000000000000..9130a6c54a1d7674714f895bfcb01c5fdb7f0661
--- /dev/null
+++ b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/ug.js
@@ -0,0 +1,17 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var ug = {
+    code: "ug",
+    buttonText: {
+      month: "ئاي",
+      week: "ھەپتە",
+      day: "ÙƒÛˆÙ†",
+      list: "كۈنتەرتىپ"
+    },
+    allDayText: "پۈتۈن كۈن"
+  };
+
+  return ug;
+
+}());
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/uk.js b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/uk.js
new file mode 100644
index 0000000000000000000000000000000000000000..acde23939482767762c84856df621903e93c6004
--- /dev/null
+++ b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/uk.js
@@ -0,0 +1,29 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var uk = {
+    code: "uk",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 7  // The week that contains Jan 1st is the first week of the year.
+    },
+    buttonText: {
+      prev: "Попередній",
+      next: "далі",
+      today: "Сьогодні",
+      month: "Місяць",
+      week: "Тиждень",
+      day: "День",
+      list: "Порядок денний"
+    },
+    weekText: "Тиж",
+    allDayText: "Увесь день",
+    moreLinkText: function(n) {
+      return "+ще " + n + "...";
+    },
+    noEventsText: "Немає подій для відображення"
+  };
+
+  return uk;
+
+}());
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/uz.js b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/uz.js
new file mode 100644
index 0000000000000000000000000000000000000000..f1ea640c2b960bc3ed686a6f9344adff31c014c8
--- /dev/null
+++ b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/uz.js
@@ -0,0 +1,21 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var uz = {
+    code: "uz",
+    buttonText: {
+      month: "Oy",
+      week: "Xafta",
+      day: "Kun",
+      list: "Kun tartibi"
+    },
+    allDayText: "Kun bo'yi",
+    moreLinkText: function(n) {
+      return "+ yana " + n;
+    },
+    noEventsText: "Ko'rsatish uchun voqealar yo'q"
+  };
+
+  return uz;
+
+}());
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/vi.js b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/vi.js
new file mode 100644
index 0000000000000000000000000000000000000000..5ea3a4a2fa897b7f435b9b3aa44454567c4a2da0
--- /dev/null
+++ b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/vi.js
@@ -0,0 +1,29 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var vi = {
+    code: "vi",
+    week: {
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "TrÆ°á»›c",
+      next: "Tiếp",
+      today: "Hôm nay",
+      month: "Tháng",
+      week: "Tuần",
+      day: "Ngày",
+      list: "Lịch biểu"
+    },
+    weekText: "Tu",
+    allDayText: "Cả ngày",
+    moreLinkText: function(n) {
+      return "+ thêm " + n;
+    },
+    noEventsText: "Không có sự kiện để hiển thị"
+  };
+
+  return vi;
+
+}());
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/zh-cn.js b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/zh-cn.js
new file mode 100644
index 0000000000000000000000000000000000000000..45e6863110077cf4dbba3345b04f42fe31ec2736
--- /dev/null
+++ b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/zh-cn.js
@@ -0,0 +1,30 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var zhCn = {
+    code: "zh-cn",
+    week: {
+      // GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效
+      dow: 1, // Monday is the first day of the week.
+      doy: 4  // The week that contains Jan 4th is the first week of the year.
+    },
+    buttonText: {
+      prev: "上月",
+      next: "下月",
+      today: "今天",
+      month: "月",
+      week: "周",
+      day: "æ—¥",
+      list: "日程"
+    },
+    weekText: "周",
+    allDayText: "全天",
+    moreLinkText: function(n) {
+      return "另外 " + n + " 个";
+    },
+    noEventsText: "没有事件显示"
+  };
+
+  return zhCn;
+
+}());
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/zh-tw.js b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/zh-tw.js
new file mode 100644
index 0000000000000000000000000000000000000000..0e9ccca65a4c4aa105c760939ecef0cf3404e60d
--- /dev/null
+++ b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/locales/zh-tw.js
@@ -0,0 +1,23 @@
+FullCalendar.globalLocales.push(function () {
+  'use strict';
+
+  var zhTw = {
+    code: "zh-tw",
+    buttonText: {
+      prev: "上月",
+      next: "下月",
+      today: "今天",
+      month: "月",
+      week: "週",
+      day: "天",
+      list: "活動列表"
+    },
+    weekText: "周",
+    allDayText: "整天",
+    moreLinkText: '顯示更多',
+    noEventsText: "没有任何活動"
+  };
+
+  return zhTw;
+
+}());
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/main.css b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/main.css
new file mode 100644
index 0000000000000000000000000000000000000000..c533941d0058dd3c49a5f8dd868292206d563072
--- /dev/null
+++ b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/main.css
@@ -0,0 +1,1740 @@
+
+/* classes attached to <body> */
+
+.fc-not-allowed,
+.fc-not-allowed .fc-event { /* override events' custom cursors */
+  cursor: not-allowed;
+}
+
+.fc-unselectable {
+  -webkit-user-select: none;
+     -moz-user-select: none;
+      -ms-user-select: none;
+          user-select: none;
+  -webkit-touch-callout: none;
+  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+}
+.fc {
+  /* layout of immediate children */
+  display: flex;
+  flex-direction: column;
+
+  font-size: 1em
+}
+.fc,
+  .fc *,
+  .fc *:before,
+  .fc *:after {
+    box-sizing: border-box;
+  }
+.fc table {
+    border-collapse: collapse;
+    border-spacing: 0;
+    font-size: 1em; /* normalize cross-browser */
+  }
+.fc th {
+    text-align: center;
+  }
+.fc th,
+  .fc td {
+    vertical-align: top;
+    padding: 0;
+  }
+.fc a[data-navlink] {
+    cursor: pointer;
+  }
+.fc a[data-navlink]:hover {
+    text-decoration: underline;
+  }
+.fc-direction-ltr {
+  direction: ltr;
+  text-align: left;
+}
+.fc-direction-rtl {
+  direction: rtl;
+  text-align: right;
+}
+.fc-theme-standard td,
+  .fc-theme-standard th {
+    border: 1px solid #ddd;
+    border: 1px solid var(--fc-border-color, #ddd);
+  }
+/* for FF, which doesn't expand a 100% div within a table cell. use absolute positioning */
+/* inner-wrappers are responsible for being absolute */
+/* TODO: best place for this? */
+.fc-liquid-hack td,
+  .fc-liquid-hack th {
+    position: relative;
+  }
+
+@font-face {
+  font-family: 'fcicons';
+  src: url("data:application/x-font-ttf;charset=utf-8;base64,AAEAAAALAIAAAwAwT1MvMg8SBfAAAAC8AAAAYGNtYXAXVtKNAAABHAAAAFRnYXNwAAAAEAAAAXAAAAAIZ2x5ZgYydxIAAAF4AAAFNGhlYWQUJ7cIAAAGrAAAADZoaGVhB20DzAAABuQAAAAkaG10eCIABhQAAAcIAAAALGxvY2ED4AU6AAAHNAAAABhtYXhwAA8AjAAAB0wAAAAgbmFtZXsr690AAAdsAAABhnBvc3QAAwAAAAAI9AAAACAAAwPAAZAABQAAApkCzAAAAI8CmQLMAAAB6wAzAQkAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADpBgPA/8AAQAPAAEAAAAABAAAAAAAAAAAAAAAgAAAAAAADAAAAAwAAABwAAQADAAAAHAADAAEAAAAcAAQAOAAAAAoACAACAAIAAQAg6Qb//f//AAAAAAAg6QD//f//AAH/4xcEAAMAAQAAAAAAAAAAAAAAAQAB//8ADwABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAABAWIAjQKeAskAEwAAJSc3NjQnJiIHAQYUFwEWMjc2NCcCnuLiDQ0MJAz/AA0NAQAMJAwNDcni4gwjDQwM/wANIwz/AA0NDCMNAAAAAQFiAI0CngLJABMAACUBNjQnASYiBwYUHwEHBhQXFjI3AZ4BAA0N/wAMJAwNDeLiDQ0MJAyNAQAMIw0BAAwMDSMM4uINIwwNDQAAAAIA4gC3Ax4CngATACcAACUnNzY0JyYiDwEGFB8BFjI3NjQnISc3NjQnJiIPAQYUHwEWMjc2NCcB87e3DQ0MIw3VDQ3VDSMMDQ0BK7e3DQ0MJAzVDQ3VDCQMDQ3zuLcMJAwNDdUNIwzWDAwNIwy4twwkDA0N1Q0jDNYMDA0jDAAAAgDiALcDHgKeABMAJwAAJTc2NC8BJiIHBhQfAQcGFBcWMjchNzY0LwEmIgcGFB8BBwYUFxYyNwJJ1Q0N1Q0jDA0Nt7cNDQwjDf7V1Q0N1QwkDA0Nt7cNDQwkDLfWDCMN1Q0NDCQMt7gMIw0MDNYMIw3VDQ0MJAy3uAwjDQwMAAADAFUAAAOrA1UAMwBoAHcAABMiBgcOAQcOAQcOARURFBYXHgEXHgEXHgEzITI2Nz4BNz4BNz4BNRE0JicuAScuAScuASMFITIWFx4BFx4BFx4BFREUBgcOAQcOAQcOASMhIiYnLgEnLgEnLgE1ETQ2Nz4BNz4BNz4BMxMhMjY1NCYjISIGFRQWM9UNGAwLFQkJDgUFBQUFBQ4JCRULDBgNAlYNGAwLFQkJDgUFBQUFBQ4JCRULDBgN/aoCVgQIBAQHAwMFAQIBAQIBBQMDBwQECAT9qgQIBAQHAwMFAQIBAQIBBQMDBwQECASAAVYRGRkR/qoRGRkRA1UFBAUOCQkVDAsZDf2rDRkLDBUJCA4FBQUFBQUOCQgVDAsZDQJVDRkLDBUJCQ4FBAVVAgECBQMCBwQECAX9qwQJAwQHAwMFAQICAgIBBQMDBwQDCQQCVQUIBAQHAgMFAgEC/oAZEhEZGRESGQAAAAADAFUAAAOrA1UAMwBoAIkAABMiBgcOAQcOAQcOARURFBYXHgEXHgEXHgEzITI2Nz4BNz4BNz4BNRE0JicuAScuAScuASMFITIWFx4BFx4BFx4BFREUBgcOAQcOAQcOASMhIiYnLgEnLgEnLgE1ETQ2Nz4BNz4BNz4BMxMzFRQWMzI2PQEzMjY1NCYrATU0JiMiBh0BIyIGFRQWM9UNGAwLFQkJDgUFBQUFBQ4JCRULDBgNAlYNGAwLFQkJDgUFBQUFBQ4JCRULDBgN/aoCVgQIBAQHAwMFAQIBAQIBBQMDBwQECAT9qgQIBAQHAwMFAQIBAQIBBQMDBwQECASAgBkSEhmAERkZEYAZEhIZgBEZGREDVQUEBQ4JCRUMCxkN/asNGQsMFQkIDgUFBQUFBQ4JCBUMCxkNAlUNGQsMFQkJDgUEBVUCAQIFAwIHBAQIBf2rBAkDBAcDAwUBAgICAgEFAwMHBAMJBAJVBQgEBAcCAwUCAQL+gIASGRkSgBkSERmAEhkZEoAZERIZAAABAOIAjQMeAskAIAAAExcHBhQXFjI/ARcWMjc2NC8BNzY0JyYiDwEnJiIHBhQX4uLiDQ0MJAzi4gwkDA0N4uINDQwkDOLiDCQMDQ0CjeLiDSMMDQ3h4Q0NDCMN4uIMIw0MDOLiDAwNIwwAAAABAAAAAQAAa5n0y18PPPUACwQAAAAAANivOVsAAAAA2K85WwAAAAADqwNVAAAACAACAAAAAAAAAAEAAAPA/8AAAAQAAAAAAAOrAAEAAAAAAAAAAAAAAAAAAAALBAAAAAAAAAAAAAAAAgAAAAQAAWIEAAFiBAAA4gQAAOIEAABVBAAAVQQAAOIAAAAAAAoAFAAeAEQAagCqAOoBngJkApoAAQAAAAsAigADAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAA4ArgABAAAAAAABAAcAAAABAAAAAAACAAcAYAABAAAAAAADAAcANgABAAAAAAAEAAcAdQABAAAAAAAFAAsAFQABAAAAAAAGAAcASwABAAAAAAAKABoAigADAAEECQABAA4ABwADAAEECQACAA4AZwADAAEECQADAA4APQADAAEECQAEAA4AfAADAAEECQAFABYAIAADAAEECQAGAA4AUgADAAEECQAKADQApGZjaWNvbnMAZgBjAGkAYwBvAG4Ac1ZlcnNpb24gMS4wAFYAZQByAHMAaQBvAG4AIAAxAC4AMGZjaWNvbnMAZgBjAGkAYwBvAG4Ac2ZjaWNvbnMAZgBjAGkAYwBvAG4Ac1JlZ3VsYXIAUgBlAGcAdQBsAGEAcmZjaWNvbnMAZgBjAGkAYwBvAG4Ac0ZvbnQgZ2VuZXJhdGVkIGJ5IEljb01vb24uAEYAbwBuAHQAIABnAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAEkAYwBvAE0AbwBvAG4ALgAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=") format('truetype');
+  font-weight: normal;
+  font-style: normal;
+}
+
+.fc-icon {
+  /* added for fc */
+  display: inline-block;
+  width: 1em;
+  height: 1em;
+  text-align: center;
+  -webkit-user-select: none;
+     -moz-user-select: none;
+      -ms-user-select: none;
+          user-select: none;
+
+  /* use !important to prevent issues with browser extensions that change fonts */
+  font-family: 'fcicons' !important;
+  speak: none;
+  font-style: normal;
+  font-weight: normal;
+  font-variant: normal;
+  text-transform: none;
+  line-height: 1;
+
+  /* Better Font Rendering =========== */
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+.fc-icon-chevron-left:before {
+  content: "\e900";
+}
+
+.fc-icon-chevron-right:before {
+  content: "\e901";
+}
+
+.fc-icon-chevrons-left:before {
+  content: "\e902";
+}
+
+.fc-icon-chevrons-right:before {
+  content: "\e903";
+}
+
+.fc-icon-minus-square:before {
+  content: "\e904";
+}
+
+.fc-icon-plus-square:before {
+  content: "\e905";
+}
+
+.fc-icon-x:before {
+  content: "\e906";
+}
+/*
+Lots taken from Flatly (MIT): https://bootswatch.com/4/flatly/bootstrap.css
+
+These styles only apply when the standard-theme is activated.
+When it's NOT activated, the fc-button classes won't even be in the DOM.
+*/
+.fc {
+
+  /* reset */
+
+}
+.fc .fc-button {
+    border-radius: 0;
+    overflow: visible;
+    text-transform: none;
+    margin: 0;
+    font-family: inherit;
+    font-size: inherit;
+    line-height: inherit;
+  }
+.fc .fc-button:focus {
+    outline: 1px dotted;
+    outline: 5px auto -webkit-focus-ring-color;
+  }
+.fc .fc-button {
+    -webkit-appearance: button;
+  }
+.fc .fc-button:not(:disabled) {
+    cursor: pointer;
+  }
+.fc .fc-button::-moz-focus-inner {
+    padding: 0;
+    border-style: none;
+  }
+.fc {
+
+  /* theme */
+
+}
+.fc .fc-button {
+    display: inline-block;
+    font-weight: 400;
+    text-align: center;
+    vertical-align: middle;
+    -webkit-user-select: none;
+       -moz-user-select: none;
+        -ms-user-select: none;
+            user-select: none;
+    background-color: transparent;
+    border: 1px solid transparent;
+    padding: 0.4em 0.65em;
+    font-size: 1em;
+    line-height: 1.5;
+    border-radius: 0.25em;
+  }
+.fc .fc-button:hover {
+    text-decoration: none;
+  }
+.fc .fc-button:focus {
+    outline: 0;
+    box-shadow: 0 0 0 0.2rem rgba(44, 62, 80, 0.25);
+  }
+.fc .fc-button:disabled {
+    opacity: 0.65;
+  }
+.fc {
+
+  /* "primary" coloring */
+
+}
+.fc .fc-button-primary {
+    color: #fff;
+    color: var(--fc-button-text-color, #fff);
+    background-color: #2C3E50;
+    background-color: var(--fc-button-bg-color, #2C3E50);
+    border-color: #2C3E50;
+    border-color: var(--fc-button-border-color, #2C3E50);
+  }
+.fc .fc-button-primary:hover {
+    color: #fff;
+    color: var(--fc-button-text-color, #fff);
+    background-color: #1e2b37;
+    background-color: var(--fc-button-hover-bg-color, #1e2b37);
+    border-color: #1a252f;
+    border-color: var(--fc-button-hover-border-color, #1a252f);
+  }
+.fc .fc-button-primary:disabled { /* not DRY */
+    color: #fff;
+    color: var(--fc-button-text-color, #fff);
+    background-color: #2C3E50;
+    background-color: var(--fc-button-bg-color, #2C3E50);
+    border-color: #2C3E50;
+    border-color: var(--fc-button-border-color, #2C3E50); /* overrides :hover */
+  }
+.fc .fc-button-primary:focus {
+    box-shadow: 0 0 0 0.2rem rgba(76, 91, 106, 0.5);
+  }
+.fc .fc-button-primary:not(:disabled):active,
+  .fc .fc-button-primary:not(:disabled).fc-button-active {
+    color: #fff;
+    color: var(--fc-button-text-color, #fff);
+    background-color: #1a252f;
+    background-color: var(--fc-button-active-bg-color, #1a252f);
+    border-color: #151e27;
+    border-color: var(--fc-button-active-border-color, #151e27);
+  }
+.fc .fc-button-primary:not(:disabled):active:focus,
+  .fc .fc-button-primary:not(:disabled).fc-button-active:focus {
+    box-shadow: 0 0 0 0.2rem rgba(76, 91, 106, 0.5);
+  }
+.fc {
+
+  /* icons within buttons */
+
+}
+.fc .fc-button .fc-icon {
+    vertical-align: middle;
+    font-size: 1.5em; /* bump up the size (but don't make it bigger than line-height of button, which is 1.5em also) */
+  }
+.fc .fc-button-group {
+    position: relative;
+    display: inline-flex;
+    vertical-align: middle;
+  }
+.fc .fc-button-group > .fc-button {
+    position: relative;
+    flex: 1 1 auto;
+  }
+.fc .fc-button-group > .fc-button:hover {
+    z-index: 1;
+  }
+.fc .fc-button-group > .fc-button:focus,
+  .fc .fc-button-group > .fc-button:active,
+  .fc .fc-button-group > .fc-button.fc-button-active {
+    z-index: 1;
+  }
+.fc-direction-ltr .fc-button-group > .fc-button:not(:first-child) {
+    margin-left: -1px;
+    border-top-left-radius: 0;
+    border-bottom-left-radius: 0;
+  }
+.fc-direction-ltr .fc-button-group > .fc-button:not(:last-child) {
+    border-top-right-radius: 0;
+    border-bottom-right-radius: 0;
+  }
+.fc-direction-rtl .fc-button-group > .fc-button:not(:first-child) {
+    margin-right: -1px;
+    border-top-right-radius: 0;
+    border-bottom-right-radius: 0;
+  }
+.fc-direction-rtl .fc-button-group > .fc-button:not(:last-child) {
+    border-top-left-radius: 0;
+    border-bottom-left-radius: 0;
+  }
+.fc .fc-toolbar {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+  }
+.fc .fc-toolbar.fc-header-toolbar {
+    margin-bottom: 1.5em;
+  }
+.fc .fc-toolbar.fc-footer-toolbar {
+    margin-top: 1.5em;
+  }
+.fc .fc-toolbar-title {
+    font-size: 1.75em;
+    margin: 0;
+  }
+.fc-direction-ltr .fc-toolbar > * > :not(:first-child) {
+    margin-left: .75em; /* space between */
+  }
+.fc-direction-rtl .fc-toolbar > * > :not(:first-child) {
+    margin-right: .75em; /* space between */
+  }
+.fc-direction-rtl .fc-toolbar-ltr { /* when the toolbar-chunk positioning system is explicitly left-to-right */
+    flex-direction: row-reverse;
+  }
+.fc .fc-scroller {
+    -webkit-overflow-scrolling: touch;
+    position: relative; /* for abs-positioned elements within */
+  }
+.fc .fc-scroller-liquid {
+    height: 100%;
+  }
+.fc .fc-scroller-liquid-absolute {
+    position: absolute;
+    top: 0;
+    right: 0;
+    left: 0;
+    bottom: 0;
+  }
+.fc .fc-scroller-harness {
+    position: relative;
+    overflow: hidden;
+    direction: ltr;
+      /* hack for chrome computing the scroller's right/left wrong for rtl. undone below... */
+      /* TODO: demonstrate in codepen */
+  }
+.fc .fc-scroller-harness-liquid {
+    height: 100%;
+  }
+.fc-direction-rtl .fc-scroller-harness > .fc-scroller { /* undo above hack */
+    direction: rtl;
+  }
+.fc-theme-standard .fc-scrollgrid {
+    border: 1px solid #ddd;
+    border: 1px solid var(--fc-border-color, #ddd); /* bootstrap does this. match */
+  }
+.fc .fc-scrollgrid,
+    .fc .fc-scrollgrid table { /* all tables (self included) */
+      width: 100%; /* because tables don't normally do this */
+      table-layout: fixed;
+    }
+.fc .fc-scrollgrid table { /* inner tables */
+      border-top-style: hidden;
+      border-left-style: hidden;
+      border-right-style: hidden;
+    }
+.fc .fc-scrollgrid > tbody table,
+    .fc .fc-scrollgrid > tfoot table {
+      border-bottom-style: hidden; /* head keeps its bottom border tho */
+    }
+.fc .fc-scrollgrid {
+
+    border-collapse: separate;
+    border-right-width: 0;
+    border-bottom-width: 0
+  }
+.fc .fc-scrollgrid > * > tr > * {
+      border-top-width: 0;
+      border-left-width: 0;
+    }
+.fc .fc-scrollgrid > thead > tr > *,
+    .fc .fc-scrollgrid > tfoot > tr > * {
+      border-bottom-width: 0;
+    }
+.fc .fc-scrollgrid-liquid {
+    height: 100%;
+  }
+.fc .fc-scrollgrid-section { /* a <tr> */
+    height: 0
+
+  }
+.fc .fc-scrollgrid-section > td {
+      height: 0; /* needs a height so inner div within grow */
+    }
+.fc .fc-scrollgrid-section table {
+      height: 1px;
+        /* for most browsers, if a height isn't set on the table, can't do liquid-height within cells */
+        /* serves as a min-height. harmless */
+    }
+.fc .fc-scrollgrid-section-liquid {
+    height: auto
+
+  }
+.fc .fc-scrollgrid-section-liquid > td {
+      height: 100%; /* FF needs this instead of auto */
+    }
+.fc {
+
+  /* stickiness */
+
+}
+.fc .fc-scrollgrid-section-sticky > * {
+    background: #fff;
+    background: var(--fc-page-bg-color, #fff);
+    position: -webkit-sticky;
+    position: sticky;
+    z-index: 2; /* TODO: var */
+    /* TODO: box-shadow when sticking */
+  }
+.fc .fc-scrollgrid > thead > .fc-scrollgrid-section-sticky > * {
+    top: 0; /* because border-sharing causes a gap at the top */
+      /* TODO: give safari -1. has bug */
+  }
+.fc .fc-scrollgrid > tfoot > .fc-scrollgrid-section-sticky > * {
+    bottom: 0; /* known bug: bottom-stickiness doesn't work in safari */
+  }
+.fc .fc-scrollgrid-sticky-shim { /* for horizontal scrollbar */
+    height: 1px; /* needs height to create scrollbars */
+    margin-bottom: -1px;
+  }
+.fc .fc-sticky {
+    position: -webkit-sticky;
+    position: sticky;
+  }
+.fc .fc-view-harness {
+    flex-grow: 1; /* because this harness is WITHIN the .fc's flexbox */
+    position: relative;
+  }
+.fc {
+
+  /* when the harness controls the height, make the view liquid */
+
+}
+.fc .fc-view-harness-active > .fc-view {
+    position: absolute;
+    top: 0;
+    right: 0;
+    bottom: 0;
+    left: 0;
+  }
+.fc .fc-col-header-cell-cushion {
+    display: inline-block; /* x-browser for when sticky (when multi-tier header) */
+    padding: 2px 4px;
+  }
+.fc .fc-bg-event,
+  .fc .fc-non-business,
+  .fc .fc-highlight {
+    /* will always have a harness with position:relative/absolute, so absolutely expand */
+    position: absolute;
+    top: 0;
+    left: 0;
+    right: 0;
+    bottom: 0;
+  }
+.fc .fc-non-business {
+    background: rgba(215, 215, 215, 0.3);
+    background: var(--fc-non-business-color, rgba(215, 215, 215, 0.3));
+  }
+.fc .fc-bg-event {
+    background: rgb(143, 223, 130);
+    background: var(--fc-bg-event-color, rgb(143, 223, 130));
+    opacity: 0.3;
+    opacity: var(--fc-bg-event-opacity, 0.3)
+  }
+.fc .fc-bg-event .fc-event-title {
+      margin: .5em;
+      font-size: .85em;
+      font-size: var(--fc-small-font-size, .85em);
+      font-style: italic;
+    }
+.fc .fc-highlight {
+    background: rgba(188, 232, 241, 0.3);
+    background: var(--fc-highlight-color, rgba(188, 232, 241, 0.3));
+  }
+.fc .fc-cell-shaded,
+  .fc .fc-day-disabled {
+    background: rgba(208, 208, 208, 0.3);
+    background: var(--fc-neutral-bg-color, rgba(208, 208, 208, 0.3));
+  }
+/* link resets */
+/* ---------------------------------------------------------------------------------------------------- */
+a.fc-event,
+a.fc-event:hover {
+  text-decoration: none;
+}
+/* cursor */
+.fc-event[href],
+.fc-event.fc-event-draggable {
+  cursor: pointer;
+}
+/* event text content */
+/* ---------------------------------------------------------------------------------------------------- */
+.fc-event .fc-event-main {
+    position: relative;
+    z-index: 2;
+  }
+/* dragging */
+/* ---------------------------------------------------------------------------------------------------- */
+.fc-event-dragging:not(.fc-event-selected) { /* MOUSE */
+    opacity: 0.75;
+  }
+.fc-event-dragging.fc-event-selected { /* TOUCH */
+    box-shadow: 0 2px 7px rgba(0, 0, 0, 0.3);
+  }
+/* resizing */
+/* ---------------------------------------------------------------------------------------------------- */
+/* (subclasses should hone positioning for touch and non-touch) */
+.fc-event .fc-event-resizer {
+    display: none;
+    position: absolute;
+    z-index: 4;
+  }
+.fc-event:hover, /* MOUSE */
+.fc-event-selected { /* TOUCH */
+
+}
+.fc-event:hover .fc-event-resizer, .fc-event-selected .fc-event-resizer {
+    display: block;
+  }
+.fc-event-selected .fc-event-resizer {
+    border-radius: 4px;
+    border-radius: calc(var(--fc-event-resizer-dot-total-width, 8px) / 2);
+    border-width: 1px;
+    border-width: var(--fc-event-resizer-dot-border-width, 1px);
+    width: 8px;
+    width: var(--fc-event-resizer-dot-total-width, 8px);
+    height: 8px;
+    height: var(--fc-event-resizer-dot-total-width, 8px);
+    border-style: solid;
+    border-color: inherit;
+    background: #fff;
+    background: var(--fc-page-bg-color, #fff)
+
+    /* expand hit area */
+
+  }
+.fc-event-selected .fc-event-resizer:before {
+      content: '';
+      position: absolute;
+      top: -20px;
+      left: -20px;
+      right: -20px;
+      bottom: -20px;
+    }
+/* selecting (always TOUCH) */
+/* ---------------------------------------------------------------------------------------------------- */
+.fc-event-selected {
+  box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2)
+
+  /* expand hit area (subclasses should expand) */
+
+}
+.fc-event-selected:before {
+    content: "";
+    position: absolute;
+    z-index: 3;
+    top: 0;
+    left: 0;
+    right: 0;
+    bottom: 0;
+  }
+.fc-event-selected {
+
+  /* dimmer effect */
+
+}
+.fc-event-selected:after {
+    content: "";
+    background: rgba(0, 0, 0, 0.25);
+    background: var(--fc-event-selected-overlay-color, rgba(0, 0, 0, 0.25));
+    position: absolute;
+    z-index: 1;
+
+    /* assume there's a border on all sides. overcome it. */
+    /* sometimes there's NOT a border, in which case the dimmer will go over */
+    /* an adjacent border, which looks fine. */
+    top: -1px;
+    left: -1px;
+    right: -1px;
+    bottom: -1px;
+  }
+/*
+A HORIZONTAL event
+*/
+.fc-h-event { /* allowed to be top-level */
+  display: block;
+  border: 1px solid #3788d8;
+  border: 1px solid var(--fc-event-bg-color, #3788d8);
+  background-color: #3788d8;
+  background-color: var(--fc-event-border-color, #3788d8)
+
+}
+.fc-h-event .fc-event-main {
+    color: #fff;
+    color: var(--fc-event-text-color, #fff);
+  }
+.fc-h-event .fc-event-main-frame {
+    display: flex; /* for make fc-event-title-container expand */
+  }
+.fc-h-event .fc-event-time {
+    max-width: 100%; /* clip overflow on this element */
+    overflow: hidden;
+  }
+.fc-h-event .fc-event-title-container { /* serves as a container for the sticky cushion */
+    flex-grow: 1;
+    flex-shrink: 1;
+    min-width: 0; /* important for allowing to shrink all the way */
+  }
+.fc-h-event .fc-event-title {
+    display: inline-block; /* need this to be sticky cross-browser */
+    vertical-align: top; /* for not messing up line-height */
+    left: 0;  /* for sticky */
+    right: 0; /* for sticky */
+    max-width: 100%; /* clip overflow on this element */
+    overflow: hidden;
+  }
+.fc-h-event.fc-event-selected:before {
+    /* expand hit area */
+    top: -10px;
+    bottom: -10px;
+  }
+/* adjust border and border-radius (if there is any) for non-start/end */
+.fc-direction-ltr .fc-daygrid-block-event:not(.fc-event-start),
+.fc-direction-rtl .fc-daygrid-block-event:not(.fc-event-end) {
+  border-top-left-radius: 0;
+  border-bottom-left-radius: 0;
+  border-left-width: 0;
+}
+.fc-direction-ltr .fc-daygrid-block-event:not(.fc-event-end),
+.fc-direction-rtl .fc-daygrid-block-event:not(.fc-event-start) {
+  border-top-right-radius: 0;
+  border-bottom-right-radius: 0;
+  border-right-width: 0;
+}
+/* resizers */
+.fc-h-event:not(.fc-event-selected) .fc-event-resizer {
+  top: 0;
+  bottom: 0;
+  width: 8px;
+  width: var(--fc-event-resizer-thickness, 8px);
+}
+.fc-direction-ltr .fc-h-event:not(.fc-event-selected) .fc-event-resizer-start,
+.fc-direction-rtl .fc-h-event:not(.fc-event-selected) .fc-event-resizer-end {
+  cursor: w-resize;
+  left: -4px;
+  left: calc(var(--fc-event-resizer-thickness, 8px) / -2);
+}
+.fc-direction-ltr .fc-h-event:not(.fc-event-selected) .fc-event-resizer-end,
+.fc-direction-rtl .fc-h-event:not(.fc-event-selected) .fc-event-resizer-start {
+  cursor: e-resize;
+  right: -4px;
+  right: calc(var(--fc-event-resizer-thickness, 8px) / -2);
+}
+/* resizers for TOUCH */
+.fc-h-event.fc-event-selected .fc-event-resizer {
+  top: 50%;
+  margin-top: -4px;
+  margin-top: calc(var(--fc-event-resizer-dot-total-width, 8px) / -2);
+}
+.fc-direction-ltr .fc-h-event.fc-event-selected .fc-event-resizer-start,
+.fc-direction-rtl .fc-h-event.fc-event-selected .fc-event-resizer-end {
+  left: -4px;
+  left: calc(var(--fc-event-resizer-dot-total-width, 8px) / -2);
+}
+.fc-direction-ltr .fc-h-event.fc-event-selected .fc-event-resizer-end,
+.fc-direction-rtl .fc-h-event.fc-event-selected .fc-event-resizer-start {
+  right: -4px;
+  right: calc(var(--fc-event-resizer-dot-total-width, 8px) / -2);
+}
+
+
+:root {
+  --fc-daygrid-event-dot-width: 8px;
+}
+.fc .fc-popover {
+    position: fixed;
+    top: 0; /* for when not positioned yet */
+    box-shadow: 0 2px 6px rgba(0,0,0,.15);
+  }
+.fc .fc-popover-header {
+    display: flex;
+    flex-direction: row;
+    justify-content: space-between;
+    align-items: center;
+    padding: 3px 4px;
+  }
+.fc .fc-popover-title {
+    margin: 0 2px;
+  }
+.fc .fc-popover-close {
+    cursor: pointer;
+    opacity: 0.65;
+    font-size: 1.1em;
+  }
+.fc-theme-standard .fc-popover {
+    border: 1px solid #ddd;
+    border: 1px solid var(--fc-border-color, #ddd);
+    background: #fff;
+    background: var(--fc-page-bg-color, #fff);
+  }
+.fc-theme-standard .fc-popover-header {
+    background: rgba(208, 208, 208, 0.3);
+    background: var(--fc-neutral-bg-color, rgba(208, 208, 208, 0.3));
+  }
+/* help things clear margins of inner content */
+.fc-daygrid-day-frame,
+.fc-daygrid-day-events,
+.fc-daygrid-event-harness { /* for event top/bottom margins */
+}
+.fc-daygrid-day-frame:before, .fc-daygrid-day-events:before, .fc-daygrid-event-harness:before {
+  content: "";
+  clear: both;
+  display: table; }
+.fc-daygrid-day-frame:after, .fc-daygrid-day-events:after, .fc-daygrid-event-harness:after {
+  content: "";
+  clear: both;
+  display: table; }
+.fc .fc-daygrid-body { /* a <div> that wraps the table */
+    position: relative;
+    z-index: 1; /* container inner z-index's because <tr>s can't do it */
+  }
+.fc .fc-daygrid-day.fc-day-today {
+      background-color: rgba(255, 220, 40, 0.15);
+      background-color: var(--fc-today-bg-color, rgba(255, 220, 40, 0.15));
+    }
+.fc .fc-daygrid-day-frame {
+    position: relative;
+    min-height: 100%; /* seems to work better than `height` because sets height after rows/cells naturally do it */
+  }
+.fc {
+
+  /* cell top */
+
+}
+.fc .fc-daygrid-day-top {
+    position: relative;
+    z-index: 4;
+    display: flex;
+    flex-direction: row-reverse;
+  }
+.fc .fc-day-other .fc-daygrid-day-top {
+    opacity: 0.3;
+  }
+.fc {
+
+  /* day number (within cell top) */
+
+}
+.fc .fc-daygrid-day-number {
+    padding: 4px;
+  }
+.fc {
+
+  /* event container */
+
+}
+.fc .fc-daygrid-day-events {
+    margin-top: 1px; /* needs to be margin, not padding, so that available cell height can be computed */
+  }
+.fc {
+
+  /* positioning for balanced vs natural */
+
+}
+.fc .fc-daygrid-body-balanced .fc-daygrid-day-events {
+      position: absolute;
+      left: 0;
+      right: 0;
+    }
+.fc .fc-daygrid-body-unbalanced .fc-daygrid-day-events {
+      position: relative; /* for containing abs positioned event harnesses */
+      min-height: 2em; /* in addition to being a min-height during natural height, equalizes the heights a little bit */
+    }
+.fc .fc-daygrid-body-natural { /* can coexist with -unbalanced */
+  }
+.fc .fc-daygrid-body-natural .fc-daygrid-day-events {
+      margin-bottom: 1em;
+    }
+.fc {
+
+  /* event harness */
+
+}
+.fc .fc-daygrid-event-harness {
+    position: relative;
+  }
+.fc .fc-daygrid-event-harness-abs {
+    position: absolute;
+    top: 0; /* fallback coords for when cannot yet be computed */
+    left: 0; /* */
+    right: 0; /* */
+  }
+.fc .fc-daygrid-bg-harness {
+    position: absolute;
+    top: 0;
+    bottom: 0;
+  }
+.fc {
+
+  /* bg content */
+
+}
+.fc .fc-daygrid-day-bg .fc-non-business { z-index: 1 }
+.fc .fc-daygrid-day-bg .fc-bg-event { z-index: 2 }
+.fc .fc-daygrid-day-bg .fc-highlight { z-index: 3 }
+.fc {
+
+  /* events */
+
+}
+.fc .fc-daygrid-event {
+    z-index: 6;
+    margin-top: 1px;
+  }
+.fc .fc-daygrid-event.fc-event-mirror {
+    z-index: 7;
+  }
+.fc {
+
+  /* cell bottom (within day-events) */
+
+}
+.fc .fc-daygrid-day-bottom {
+    position: relative;
+    z-index: 4;
+    font-size: .85em;
+    margin: 2px 3px 0;
+  }
+.fc .fc-daygrid-more-link {
+    cursor: pointer;
+  }
+.fc {
+
+  /* week number (within frame) */
+
+}
+.fc .fc-daygrid-week-number {
+    position: absolute;
+    z-index: 5;
+    top: 0;
+    padding: 2px;
+    min-width: 1.5em;
+    text-align: center;
+    background-color: rgba(208, 208, 208, 0.3);
+    background-color: var(--fc-neutral-bg-color, rgba(208, 208, 208, 0.3));
+    color: #808080;
+    color: var(--fc-neutral-text-color, #808080);
+  }
+.fc {
+
+  /* popover */
+
+}
+.fc .fc-more-popover {
+    z-index: 8;
+  }
+.fc .fc-more-popover .fc-popover-body {
+    min-width: 220px;
+    padding: 10px;
+  }
+.fc-direction-ltr .fc-daygrid-event.fc-event-start,
+.fc-direction-rtl .fc-daygrid-event.fc-event-end {
+  margin-left: 2px;
+}
+.fc-direction-ltr .fc-daygrid-event.fc-event-end,
+.fc-direction-rtl .fc-daygrid-event.fc-event-start {
+  margin-right: 2px;
+}
+.fc-direction-ltr .fc-daygrid-week-number {
+    left: 0;
+    border-radius: 0 0 3px 0;
+  }
+.fc-direction-rtl .fc-daygrid-week-number {
+    right: 0;
+    border-radius: 0 0 0 3px;
+  }
+.fc-liquid-hack .fc-daygrid-day-frame {
+    position: static; /* will cause inner absolute stuff to expand to <td> */
+  }
+.fc-daygrid-event { /* make root-level, because will be dragged-and-dropped outside of a component root */
+  position: relative; /* for z-indexes assigned later */
+  white-space: nowrap;
+  border-radius: 3px; /* dot event needs this to when selected */
+  font-size: .85em;
+  font-size: var(--fc-small-font-size, .85em);
+}
+/* --- the rectangle ("block") style of event --- */
+.fc-daygrid-block-event .fc-event-time {
+    font-weight: bold;
+  }
+.fc-daygrid-block-event .fc-event-time,
+  .fc-daygrid-block-event .fc-event-title {
+    padding: 1px;
+  }
+/* --- the dot style of event --- */
+.fc-daygrid-dot-event {
+  display: block;
+  padding: 2px 0;
+  overflow: hidden
+
+}
+.fc-daygrid-dot-event .fc-event-title {
+    font-weight: bold;
+  }
+.fc-daygrid-dot-event .fc-event-time,
+  .fc-daygrid-dot-event .fc-event-title {
+    display: inline-block; /* better than inline, for sitting next to dot */
+  }
+.fc-daygrid-dot-event:hover,
+  .fc-daygrid-dot-event.fc-event-mirror {
+    background: rgba(0, 0, 0, 0.1);
+  }
+.fc-daygrid-event-dot { /* the actual dot */
+  display: inline-block;
+  margin: 0 4px;
+  box-sizing: content-box;
+  width: 0;
+  height: 0;
+  border: 4px solid #3788d8;
+  border: calc(var(--fc-daygrid-event-dot-width, 8px) / 2) solid var(--fc-event-border-color, #3788d8);
+  border-radius: 4px;
+  border-radius: calc(var(--fc-daygrid-event-dot-width, 8px) / 2);
+}
+/* --- spacing between time and title --- */
+.fc-direction-ltr .fc-daygrid-event .fc-event-time {
+    margin-right: 3px;
+  }
+.fc-direction-rtl .fc-daygrid-event .fc-event-time {
+    margin-left: 3px;
+  }
+
+
+/*
+A VERTICAL event
+*/
+
+.fc-v-event { /* allowed to be top-level */
+  display: block;
+  border: 1px solid #3788d8;
+  border: 1px solid var(--fc-event-border-color, #3788d8);
+  background-color: #3788d8;
+  background-color: var(--fc-event-bg-color, #3788d8)
+
+}
+
+.fc-v-event .fc-event-main {
+    color: #fff;
+    color: var(--fc-event-text-color, #fff);
+    height: 100%;
+  }
+
+.fc-v-event .fc-event-main-frame {
+    height: 100%;
+    display: flex;
+    flex-direction: column;
+  }
+
+.fc-v-event .fc-event-time {
+    flex-grow: 0;
+    flex-shrink: 0;
+    max-height: 100%;
+    overflow: hidden;
+  }
+
+.fc-v-event .fc-event-title-container { /* a container for the sticky cushion */
+    flex-grow: 1;
+    flex-shrink: 1;
+    min-height: 0; /* important for allowing to shrink all the way */
+  }
+
+.fc-v-event .fc-event-title { /* will have fc-sticky on it */
+    top: 0;
+    bottom: 0;
+    max-height: 100%; /* clip overflow */
+    overflow: hidden;
+  }
+
+.fc-v-event:not(.fc-event-start) {
+    border-top-width: 0;
+    border-top-left-radius: 0;
+    border-top-right-radius: 0;
+  }
+
+.fc-v-event:not(.fc-event-end) {
+    border-bottom-width: 0;
+    border-bottom-left-radius: 0;
+    border-bottom-right-radius: 0;
+  }
+
+.fc-v-event.fc-event-selected:before {
+    /* expand hit area */
+    left: -10px;
+    right: -10px;
+  }
+
+.fc-v-event {
+
+  /* resizer (mouse AND touch) */
+
+}
+
+.fc-v-event .fc-event-resizer-start {
+    cursor: n-resize;
+  }
+
+.fc-v-event .fc-event-resizer-end {
+    cursor: s-resize;
+  }
+
+.fc-v-event {
+
+  /* resizer for MOUSE */
+
+}
+
+.fc-v-event:not(.fc-event-selected) .fc-event-resizer {
+      height: 8px;
+      height: var(--fc-event-resizer-thickness, 8px);
+      left: 0;
+      right: 0;
+    }
+
+.fc-v-event:not(.fc-event-selected) .fc-event-resizer-start {
+      top: -4px;
+      top: calc(var(--fc-event-resizer-thickness, 8px) / -2);
+    }
+
+.fc-v-event:not(.fc-event-selected) .fc-event-resizer-end {
+      bottom: -4px;
+      bottom: calc(var(--fc-event-resizer-thickness, 8px) / -2);
+    }
+
+.fc-v-event {
+
+  /* resizer for TOUCH (when event is "selected") */
+
+}
+
+.fc-v-event.fc-event-selected .fc-event-resizer {
+      left: 50%;
+      margin-left: -4px;
+      margin-left: calc(var(--fc-event-resizer-dot-total-width, 8px) / -2);
+    }
+
+.fc-v-event.fc-event-selected .fc-event-resizer-start {
+      top: -4px;
+      top: calc(var(--fc-event-resizer-dot-total-width, 8px) / -2);
+    }
+
+.fc-v-event.fc-event-selected .fc-event-resizer-end {
+      bottom: -4px;
+      bottom: calc(var(--fc-event-resizer-dot-total-width, 8px) / -2);
+    }
+.fc .fc-timegrid .fc-daygrid-body { /* the all-day daygrid within the timegrid view */
+    z-index: 2; /* put above the timegrid-body so that more-popover is above everything. TODO: better solution */
+  }
+.fc .fc-timegrid-divider {
+    padding: 0 0 2px; /* browsers get confused when you set height. use padding instead */
+  }
+.fc .fc-timegrid-body {
+    position: relative;
+    z-index: 1; /* scope the z-indexes of slots and cols */
+    min-height: 100%; /* fill height always, even when slat table doesn't grow */
+  }
+.fc .fc-timegrid-axis-chunk { /* for advanced ScrollGrid */
+    position: relative /* offset parent for now-indicator-container */
+
+  }
+.fc .fc-timegrid-axis-chunk > table {
+      position: relative;
+      z-index: 1; /* above the now-indicator-container */
+    }
+.fc .fc-timegrid-slots {
+    position: relative;
+    z-index: 2;
+  }
+.fc .fc-timegrid-slot { /* a <td> */
+    height: 1.5em;
+    border-bottom: 0; /* each cell owns its top border */
+  }
+.fc .fc-timegrid-slot-minor {
+    border-top-style: dotted;
+  }
+.fc .fc-timegrid-slot-label-cushion {
+    display: inline-block;
+    white-space: nowrap;
+  }
+.fc .fc-timegrid-slot-label {
+    vertical-align: middle; /* vertical align the slots */
+  }
+.fc {
+
+
+  /* slots AND axis cells (top-left corner of view including the "all-day" text) */
+
+}
+.fc .fc-timegrid-axis-cushion,
+  .fc .fc-timegrid-slot-label-cushion {
+    padding: 0 4px;
+  }
+.fc {
+
+
+  /* axis cells (top-left corner of view including the "all-day" text) */
+  /* vertical align is more complicated, uses flexbox */
+
+}
+.fc .fc-timegrid-axis-frame-liquid {
+    height: 100%; /* will need liquid-hack in FF */
+  }
+.fc .fc-timegrid-axis-frame {
+    overflow: hidden;
+    display: flex;
+    align-items: center; /* vertical align */
+    justify-content: flex-end; /* horizontal align. matches text-align below */
+  }
+.fc .fc-timegrid-axis-cushion {
+    max-width: 60px; /* limits the width of the "all-day" text */
+    flex-shrink: 0; /* allows text to expand how it normally would, regardless of constrained width */
+  }
+.fc-direction-ltr .fc-timegrid-slot-label-frame {
+    text-align: right;
+  }
+.fc-direction-rtl .fc-timegrid-slot-label-frame {
+    text-align: left;
+  }
+.fc-liquid-hack .fc-timegrid-axis-frame-liquid {
+  height: auto;
+  position: absolute;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  }
+.fc .fc-timegrid-col.fc-day-today {
+      background-color: rgba(255, 220, 40, 0.15);
+      background-color: var(--fc-today-bg-color, rgba(255, 220, 40, 0.15));
+    }
+.fc .fc-timegrid-col-frame {
+    min-height: 100%; /* liquid-hack is below */
+    position: relative;
+  }
+.fc-liquid-hack .fc-timegrid-col-frame {
+  height: auto;
+  position: absolute;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  }
+.fc-media-screen .fc-timegrid-cols {
+    position: absolute; /* no z-index. children will decide and go above slots */
+    top: 0;
+    left: 0;
+    right: 0;
+    bottom: 0
+  }
+.fc-media-screen .fc-timegrid-cols > table {
+      height: 100%;
+    }
+.fc-media-screen .fc-timegrid-col-bg,
+  .fc-media-screen .fc-timegrid-col-events,
+  .fc-media-screen .fc-timegrid-now-indicator-container {
+    position: absolute;
+    top: 0;
+    left: 0;
+    right: 0;
+  }
+.fc-media-screen .fc-timegrid-event-harness {
+    position: absolute; /* top/left/right/bottom will all be set by JS */
+  }
+.fc {
+
+  /* bg */
+
+}
+.fc .fc-timegrid-col-bg {
+    z-index: 1; /* TODO: kill */
+  }
+.fc .fc-timegrid-col-bg .fc-non-business { z-index: 1 }
+.fc .fc-timegrid-col-bg .fc-bg-event { z-index: 2 }
+.fc .fc-timegrid-col-bg .fc-highlight { z-index: 3 }
+.fc .fc-timegrid-bg-harness {
+    position: absolute; /* top/bottom will be set by JS */
+    left: 0;
+    right: 0;
+  }
+.fc {
+
+  /* fg events */
+  /* (the mirror segs are put into a separate container with same classname, */
+  /* and they must be after the normal seg container to appear at a higher z-index) */
+
+}
+.fc .fc-timegrid-col-events {
+    z-index: 3;
+    /* child event segs have z-indexes that are scoped within this div */
+  }
+.fc {
+
+  /* now indicator */
+
+}
+.fc .fc-timegrid-now-indicator-container {
+    bottom: 0;
+    overflow: hidden; /* don't let overflow of lines/arrows cause unnecessary scrolling */
+    /* z-index is set on the individual elements */
+  }
+.fc-direction-ltr .fc-timegrid-col-events {
+    margin: 0 2.5% 0 2px;
+  }
+.fc-direction-rtl .fc-timegrid-col-events {
+    margin: 0 2px 0 2.5%;
+  }
+.fc-timegrid-event-harness-inset .fc-timegrid-event,
+.fc-timegrid-event.fc-event-mirror {
+  box-shadow: 0px 0px 0px 1px #fff;
+  box-shadow: 0px 0px 0px 1px var(--fc-page-bg-color, #fff);
+}
+.fc-timegrid-event { /* events need to be root */
+
+  font-size: .85em;
+
+  font-size: var(--fc-small-font-size, .85em);
+  border-radius: 3px
+
+}
+.fc-timegrid-event .fc-event-main {
+    padding: 1px 1px 0;
+  }
+.fc-timegrid-event .fc-event-time {
+    white-space: nowrap;
+    font-size: .85em;
+    font-size: var(--fc-small-font-size, .85em);
+    margin-bottom: 1px;
+  }
+.fc-timegrid-event-condensed .fc-event-main-frame {
+    flex-direction: row;
+    overflow: hidden;
+  }
+.fc-timegrid-event-condensed .fc-event-time:after {
+    content: '\00a0-\00a0'; /* dash surrounded by non-breaking spaces */
+  }
+.fc-timegrid-event-condensed .fc-event-title {
+    font-size: .85em;
+    font-size: var(--fc-small-font-size, .85em)
+  }
+.fc-media-screen .fc-timegrid-event {
+    position: absolute; /* absolute WITHIN the harness */
+    top: 0;
+    bottom: 1px; /* stay away from bottom slot line */
+    left: 0;
+    right: 0;
+  }
+.fc {
+
+  /* line */
+
+}
+.fc .fc-timegrid-now-indicator-line {
+    position: absolute;
+    z-index: 4;
+    left: 0;
+    right: 0;
+    border-style: solid;
+    border-color: red;
+    border-color: var(--fc-now-indicator-color, red);
+    border-width: 1px 0 0;
+  }
+.fc {
+
+  /* arrow */
+
+}
+.fc .fc-timegrid-now-indicator-arrow {
+    position: absolute;
+    z-index: 4;
+    margin-top: -5px; /* vertically center on top coordinate */
+    border-style: solid;
+    border-color: red;
+    border-color: var(--fc-now-indicator-color, red);
+  }
+.fc-direction-ltr .fc-timegrid-now-indicator-arrow {
+    left: 0;
+
+    /* triangle pointing right. TODO: mixin */
+    border-width: 5px 0 5px 6px;
+    border-top-color: transparent;
+    border-bottom-color: transparent;
+  }
+.fc-direction-rtl .fc-timegrid-now-indicator-arrow {
+    right: 0;
+
+    /* triangle pointing left. TODO: mixin */
+    border-width: 5px 6px 5px 0;
+    border-top-color: transparent;
+    border-bottom-color: transparent;
+  }
+
+
+:root {
+  --fc-list-event-dot-width: 10px;
+  --fc-list-event-hover-bg-color: #f5f5f5;
+}
+.fc-theme-standard .fc-list {
+    border: 1px solid #ddd;
+    border: 1px solid var(--fc-border-color, #ddd);
+  }
+.fc {
+
+  /* message when no events */
+
+}
+.fc .fc-list-empty {
+    background-color: rgba(208, 208, 208, 0.3);
+    background-color: var(--fc-neutral-bg-color, rgba(208, 208, 208, 0.3));
+    height: 100%;
+    display: flex;
+    justify-content: center;
+    align-items: center; /* vertically aligns fc-list-empty-inner */
+  }
+.fc .fc-list-empty-cushion {
+    margin: 5em 0;
+  }
+.fc {
+
+  /* table within the scroller */
+  /* ---------------------------------------------------------------------------------------------------- */
+
+}
+.fc .fc-list-table {
+    width: 100%;
+    border-style: hidden; /* kill outer border on theme */
+  }
+.fc .fc-list-table tr > * {
+    border-left: 0;
+    border-right: 0;
+  }
+.fc .fc-list-sticky .fc-list-day > * { /* the cells */
+      position: -webkit-sticky;
+      position: sticky;
+      top: 0;
+      background: #fff;
+      background: var(--fc-page-bg-color, #fff); /* for when headers are styled to be transparent and sticky */
+    }
+.fc .fc-list-table th {
+    padding: 0; /* uses an inner-wrapper instead... */
+  }
+.fc .fc-list-table td,
+  .fc .fc-list-day-cushion {
+    padding: 8px 14px;
+  }
+.fc {
+
+
+  /* date heading rows */
+  /* ---------------------------------------------------------------------------------------------------- */
+
+}
+.fc .fc-list-day-cushion:after {
+  content: "";
+  clear: both;
+  display: table; /* clear floating */
+    }
+.fc-theme-standard .fc-list-day-cushion {
+    background-color: rgba(208, 208, 208, 0.3);
+    background-color: var(--fc-neutral-bg-color, rgba(208, 208, 208, 0.3));
+  }
+.fc-direction-ltr .fc-list-day-text,
+.fc-direction-rtl .fc-list-day-side-text {
+  float: left;
+}
+.fc-direction-ltr .fc-list-day-side-text,
+.fc-direction-rtl .fc-list-day-text {
+  float: right;
+}
+/* make the dot closer to the event title */
+.fc-direction-ltr .fc-list-table .fc-list-event-graphic { padding-right: 0 }
+.fc-direction-rtl .fc-list-table .fc-list-event-graphic { padding-left: 0 }
+.fc .fc-list-event.fc-event-forced-url {
+    cursor: pointer; /* whole row will seem clickable */
+  }
+.fc .fc-list-event:hover td {
+    background-color: #f5f5f5;
+    background-color: var(--fc-list-event-hover-bg-color, #f5f5f5);
+  }
+.fc {
+
+  /* shrink certain cols */
+
+}
+.fc .fc-list-event-graphic,
+  .fc .fc-list-event-time {
+    white-space: nowrap;
+    width: 1px;
+  }
+.fc .fc-list-event-dot {
+    display: inline-block;
+    box-sizing: content-box;
+    width: 0;
+    height: 0;
+    border: 5px solid #3788d8;
+    border: calc(var(--fc-list-event-dot-width, 10px) / 2) solid var(--fc-event-border-color, #3788d8);
+    border-radius: 5px;
+    border-radius: calc(var(--fc-list-event-dot-width, 10px) / 2);
+  }
+.fc {
+
+  /* reset <a> styling */
+
+}
+.fc .fc-list-event-title a {
+    color: inherit;
+    text-decoration: none;
+  }
+.fc {
+
+  /* underline link when hovering over any part of row */
+
+}
+.fc .fc-list-event.fc-event-forced-url:hover a {
+    text-decoration: underline;
+  }
+
+
+
+  .fc-theme-bootstrap a:not([href]) {
+    color: inherit; /* natural color for navlinks */
+  }
+
+
+
+  .fc .fc-event,
+  .fc .fc-scrollgrid table tr {
+    -moz-column-break-inside: avoid;
+         break-inside: avoid;
+  }
+
+.fc-media-print {
+  display: block; /* undo flexbox. FF doesn't know how to flow */
+  max-width: 100% /* width will be hardcoded too */
+}
+
+.fc-media-print .fc-timegrid-slots,
+  .fc-media-print .fc-timegrid-axis-chunk,
+  .fc-media-print .fc-timeline-slots,
+  .fc-media-print .fc-non-business,
+  .fc-media-print .fc-bg-event {
+    display: none;
+  }
+
+.fc-media-print .fc-toolbar button,
+  .fc-media-print .fc-h-event,
+  .fc-media-print .fc-v-event {
+    color: #000 !important;
+    background: #fff !important;
+  }
+
+.fc-media-print .fc-event,
+  .fc-media-print .fc-event-main { /* often controls the text-color */
+    color: #000 !important;
+  }
+
+.fc-media-print .fc-timegrid-event {
+    margin: 0.5em 0;
+  }
+
+
+
+  .fc .fc-timeline-body {
+    min-height: 100%;
+    position: relative;
+    z-index: 1; /* scope slots, bg, etc */
+  }
+/*
+vertical slots in both the header AND the body
+*/
+.fc .fc-timeline-slots {
+    position: absolute;
+    z-index: 1;
+    top: 0;
+    bottom: 0
+  }
+.fc .fc-timeline-slots > table {
+      height: 100%;
+    }
+.fc {
+
+  /* border for both header AND body cells */
+
+}
+.fc .fc-timeline-slot-minor {
+    border-style: dotted;
+  }
+.fc {
+
+  /* header cells (aka "label") */
+
+}
+.fc .fc-timeline-slot-frame {
+    display: flex;
+    align-items: center; /* vertical align */
+    justify-content: center; /* horizontal align */
+  }
+.fc .fc-timeline-header-row-chrono { /* a row of times */
+  }
+.fc .fc-timeline-header-row-chrono .fc-timeline-slot-frame {
+      justify-content: flex-start; /* horizontal align left or right */
+    }
+.fc .fc-timeline-slot-cushion {
+    padding: 4px 5px; /* TODO: unify with fc-col-header? */
+    white-space: nowrap;
+  }
+.fc {
+
+  /* NOTE: how does the top row of cells get horizontally centered? */
+  /* for the non-chrono-row, the fc-sticky system looks for text-align center, */
+  /* and it's a fluke that the default browser stylesheet already does this for <th> */
+  /* TODO: have StickyScrolling look at natural left coord to detect centeredness. */
+
+}
+/* only owns one side, so can do dotted */
+.fc-direction-ltr .fc-timeline-slot { border-right: 0 !important }
+.fc-direction-rtl .fc-timeline-slot { border-left: 0 !important }
+.fc .fc-timeline-now-indicator-arrow,
+  .fc .fc-timeline-now-indicator-line {
+    position: absolute;
+    z-index: 4;
+    top: 0;
+    border-style: solid;
+    border-color: red;
+    border-color: var(--fc-now-indicator-color, red);
+  }
+.fc .fc-timeline-now-indicator-arrow {
+    margin: 0 -6px; /* 5, then one more to counteract scroller's negative margins */
+
+    /* triangle pointing down. TODO: mixin */
+    border-width: 6px 5px 0 5px;
+    border-left-color: transparent;
+    border-right-color: transparent;
+  }
+.fc .fc-timeline-now-indicator-line {
+    margin: 0 -1px; /* counteract scroller's negative margins */
+    bottom: 0;
+    border-width: 0 0 0 1px;
+  }
+.fc {
+
+  /* container */
+
+}
+.fc .fc-timeline-events {
+    position: relative;
+    z-index: 3;
+    width: 0; /* for event positioning. will end up on correct side based on dir */
+  }
+.fc {
+
+  /* harness */
+
+}
+.fc .fc-timeline-event-harness {
+    position: absolute;
+    top: 0; /* for when when top can't be computed yet */
+    /* JS will set tht left/right */
+  }
+/* z-index, scoped within fc-timeline-events */
+.fc-timeline-event { z-index: 1 }
+.fc-timeline-event.fc-event-mirror { z-index: 2 }
+.fc-timeline-event {
+  position: relative; /* contains things. TODO: make part of fc-h-event and fc-v-event */
+  display: flex; /* for v-aligning start/end arrows and making fc-event-main stretch all the way */
+  align-items: center;
+  border-radius: 0;
+  padding: 2px 1px;
+  margin-bottom: 1px;
+  font-size: .85em;
+  font-size: var(--fc-small-font-size, .85em)
+
+  /* time and title spacing */
+  /* ---------------------------------------------------------------------------------------------------- */
+
+}
+.fc-timeline-event .fc-event-main {
+    flex-grow: 1;
+    flex-shrink: 1;
+    min-width: 0; /* important for allowing to shrink all the way */
+  }
+.fc-timeline-event .fc-event-time {
+    font-weight: bold;
+  }
+.fc-timeline-event .fc-event-time,
+  .fc-timeline-event .fc-event-title {
+    white-space: nowrap;
+    padding: 0 2px;
+  }
+/* move 1px away from slot line */
+.fc-direction-ltr .fc-timeline-event.fc-event-end { margin-right: 1px }
+.fc-direction-rtl .fc-timeline-event.fc-event-end { margin-left: 1px }
+/* make event beefier when overlap not allowed */
+.fc-timeline-overlap-disabled .fc-timeline-event {
+  padding-top: 5px;
+  padding-bottom: 5px;
+  margin-bottom: 0;
+}
+/* arrows indicating the event continues into past/future */
+/* ---------------------------------------------------------------------------------------------------- */
+/* part of the flexbox flow */
+.fc-timeline-event:not(.fc-event-start):before,
+.fc-timeline-event:not(.fc-event-end):after {
+  content: "";
+  flex-grow: 0;
+  flex-shrink: 0;
+  opacity: .5;
+
+  /* triangle. TODO: mixin */
+  width: 0;
+  height: 0;
+  margin: 0 1px;
+  border: 5px solid #000; /* TODO: var */
+  border-top-color: transparent;
+  border-bottom-color: transparent;
+}
+/* pointing left */
+.fc-direction-ltr .fc-timeline-event:not(.fc-event-start):before,
+.fc-direction-rtl .fc-timeline-event:not(.fc-event-end):after {
+  border-left: 0;
+}
+/* pointing right */
+.fc-direction-ltr .fc-timeline-event:not(.fc-event-end):after,
+.fc-direction-rtl .fc-timeline-event:not(.fc-event-start):before {
+  border-right: 0;
+}
+.fc .fc-timeline-bg { /* a container for bg content */
+    position: absolute;
+    z-index: 2;
+    top: 0;
+    bottom: 0;
+    width: 0;
+    left: 0; /* will take precedence when LTR */
+    right: 0; /* will take precedence when RTL */ /* TODO: kill */
+  }
+.fc .fc-timeline-bg .fc-non-business { z-index: 1 }
+.fc .fc-timeline-bg .fc-bg-event { z-index: 2 }
+.fc .fc-timeline-bg .fc-highlight { z-index: 3 }
+.fc .fc-timeline-bg-harness {
+    position: absolute;
+    top: 0;
+    bottom: 0;
+  }
+
+
+
+
+  .fc .fc-resource-timeline-divider {
+    width: 3px; /* important to have width to shrink this cell. no cross-browser problems */
+    cursor: col-resize;
+  }
+.fc {
+
+
+  /* will match horizontal groups in the datagrid AND group lanes in the timeline area */
+
+}
+.fc .fc-resource-timeline .fc-resource-group:not([rowspan]) {
+      background: rgba(208, 208, 208, 0.3);
+      background: var(--fc-neutral-bg-color, rgba(208, 208, 208, 0.3));
+    }
+.fc .fc-timeline-lane-frame {
+    position: relative; /* contains the fc-timeline-bg container, which liquidly expands */
+    /* the height is explicitly set by row-height-sync */
+  }
+.fc .fc-timeline-overlap-enabled .fc-timeline-lane-frame .fc-timeline-events { /* has height set on it */
+    box-sizing: content-box; /* padding no longer part of height */
+    padding-bottom: 10px; /* give extra spacing underneath for selecting */
+  }
+/* the "frame" */
+.fc-datagrid-cell-frame-liquid {
+  height: 100%; /* needs liquid hack */
+}
+.fc-liquid-hack .fc-datagrid-cell-frame-liquid {
+  height: auto;
+  position: absolute;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  }
+.fc {
+
+  /* the "frame" in a HEADER */
+  /* needs to position the column resizer */
+  /* needs to vertically center content */
+
+}
+.fc .fc-datagrid-header .fc-datagrid-cell-frame {
+      position: relative; /* for resizer */
+      display: flex;
+      justify-content: flex-start; /* horizontal align (natural left/right) */
+      align-items: center; /* vertical align */
+    }
+.fc {
+
+  /* the column resizer (only in HEADER) */
+
+}
+.fc .fc-datagrid-cell-resizer {
+    position: absolute;
+    z-index: 1;
+    top: 0;
+    bottom: 0;
+    width: 5px;
+    cursor: col-resize;
+  }
+.fc {
+
+  /* the cushion */
+
+}
+.fc .fc-datagrid-cell-cushion {
+    padding: 8px;
+    white-space: nowrap;
+    overflow: hidden; /* problem for col resizer :( */
+  }
+.fc {
+
+  /* expander icons */
+
+}
+.fc .fc-datagrid-expander {
+    cursor: pointer;
+    opacity: 0.65
+
+  }
+.fc .fc-datagrid-expander .fc-icon { /* the expander and spacers before the expander */
+      display: inline-block;
+      width: 1em; /* ensure constant width, esp for empty icons */
+    }
+.fc .fc-datagrid-expander-placeholder {
+    cursor: auto;
+  }
+.fc .fc-resource-timeline-flat .fc-datagrid-expander-placeholder {
+      display: none;
+    }
+.fc-direction-ltr .fc-datagrid-cell-resizer { right: -3px }
+.fc-direction-rtl .fc-datagrid-cell-resizer { left: -3px }
+.fc-direction-ltr .fc-datagrid-expander { margin-right: 3px }
+.fc-direction-rtl .fc-datagrid-expander { margin-left: 3px }
+
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/main.js b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/main.js
new file mode 100644
index 0000000000000000000000000000000000000000..582589bcf4b7fcc7d023b1835e8a3ba7203056b7
--- /dev/null
+++ b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/main.js
@@ -0,0 +1,19561 @@
+/*!
+FullCalendar Scheduler v5.1.0
+Docs & License: https://fullcalendar.io/scheduler
+(c) 2020 Adam Shaw
+*/
+var FullCalendar = (function (exports) {
+    'use strict';
+
+    /*! *****************************************************************************
+    Copyright (c) Microsoft Corporation.
+
+    Permission to use, copy, modify, and/or distribute this software for any
+    purpose with or without fee is hereby granted.
+
+    THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
+    REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+    AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
+    INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+    LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+    OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+    PERFORMANCE OF THIS SOFTWARE.
+    ***************************************************************************** */
+    /* global Reflect, Promise */
+
+    var extendStatics = function(d, b) {
+        extendStatics = Object.setPrototypeOf ||
+            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+        return extendStatics(d, b);
+    };
+
+    function __extends(d, b) {
+        extendStatics(d, b);
+        function __() { this.constructor = d; }
+        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+    }
+
+    var __assign = function() {
+        __assign = Object.assign || function __assign(t) {
+            for (var s, i = 1, n = arguments.length; i < n; i++) {
+                s = arguments[i];
+                for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
+            }
+            return t;
+        };
+        return __assign.apply(this, arguments);
+    };
+
+    function __spreadArrays() {
+        for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;
+        for (var r = Array(s), k = 0, i = 0; i < il; i++)
+            for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
+                r[k] = a[j];
+        return r;
+    }
+
+    var n,u,i,t,r,o,f,e={},c=[],s=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord/i;function a(n,l){for(var u in l)n[u]=l[u];return n}function v(n){var l=n.parentNode;l&&l.removeChild(n);}function h(n,l,u){var i,t=arguments,r={};for(i in l)"key"!==i&&"ref"!==i&&(r[i]=l[i]);if(arguments.length>3)for(u=[u],i=3;i<arguments.length;i++)u.push(t[i]);if(null!=u&&(r.children=u),"function"==typeof n&&null!=n.defaultProps)for(i in n.defaultProps)void 0===r[i]&&(r[i]=n.defaultProps[i]);return p(n,r,l&&l.key,l&&l.ref,null)}function p(l,u,i,t,r){var o={type:l,props:u,key:i,ref:t,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,constructor:void 0,__v:r};return null==r&&(o.__v=o),n.vnode&&n.vnode(o),o}function y(){return {}}function d(n){return n.children}function m(n,l){this.props=n,this.context=l;}function w(n,l){if(null==l)return n.__?w(n.__,n.__.__k.indexOf(n)+1):null;for(var u;l<n.__k.length;l++)if(null!=(u=n.__k[l])&&null!=u.__e)return u.__e;return "function"==typeof n.type?w(n):null}function k(n){var l,u;if(null!=(n=n.__)&&null!=n.__c){for(n.__e=n.__c.base=null,l=0;l<n.__k.length;l++)if(null!=(u=n.__k[l])&&null!=u.__e){n.__e=n.__c.base=u.__e;break}return k(n)}}function g(l){(!l.__d&&(l.__d=!0)&&u.push(l)&&!i++||r!==n.debounceRendering)&&((r=n.debounceRendering)||t)(_);}function _(){for(var n;i=u.length;)n=u.sort(function(n,l){return n.__v.__b-l.__v.__b}),u=[],n.some(function(n){var l,u,i,t,r,o,f;n.__d&&(o=(r=(l=n).__v).__e,(f=l.__P)&&(u=[],(i=a({},r)).__v=i,t=A(f,r,i,l.__n,void 0!==f.ownerSVGElement,null,u,null==o?w(r):o),T(u,r),t!=o&&k(r)));});}function b(n,l,u,i,t,r,o,f,s){var a,h,p,y,d,m,k,g=u&&u.__k||c,_=g.length;if(f==e&&(f=null!=r?r[0]:_?w(u,0):null),a=0,l.__k=x(l.__k,function(u){if(null!=u){if(u.__=l,u.__b=l.__b+1,null===(p=g[a])||p&&u.key==p.key&&u.type===p.type)g[a]=void 0;else for(h=0;h<_;h++){if((p=g[h])&&u.key==p.key&&u.type===p.type){g[h]=void 0;break}p=null;}if(y=A(n,u,p=p||e,i,t,r,o,f,s),(h=u.ref)&&p.ref!=h&&(k||(k=[]),p.ref&&k.push(p.ref,null,u),k.push(h,u.__c||y,u)),null!=y){var c;if(null==m&&(m=y),void 0!==u.__d)c=u.__d,u.__d=void 0;else if(r==p||y!=f||null==y.parentNode){n:if(null==f||f.parentNode!==n)n.appendChild(y),c=null;else {for(d=f,h=0;(d=d.nextSibling)&&h<_;h+=2)if(d==y)break n;n.insertBefore(y,f),c=f;}"option"==l.type&&(n.value="");}f=void 0!==c?c:y.nextSibling,"function"==typeof l.type&&(l.__d=f);}else f&&p.__e==f&&f.parentNode!=n&&(f=w(p));}return a++,u}),l.__e=m,null!=r&&"function"!=typeof l.type)for(a=r.length;a--;)null!=r[a]&&v(r[a]);for(a=_;a--;)null!=g[a]&&D(g[a],g[a]);if(k)for(a=0;a<k.length;a++)j(k[a],k[++a],k[++a]);}function x(n,l,u){if(null==u&&(u=[]),null==n||"boolean"==typeof n)l&&u.push(l(null));else if(Array.isArray(n))for(var i=0;i<n.length;i++)x(n[i],l,u);else u.push(l?l("string"==typeof n||"number"==typeof n?p(null,n,null,null,n):null!=n.__e||null!=n.__c?p(n.type,n.props,n.key,null,n.__v):n):n);return u}function P(n,l,u,i,t){var r;for(r in u)"children"===r||"key"===r||r in l||N(n,r,null,u[r],i);for(r in l)t&&"function"!=typeof l[r]||"children"===r||"key"===r||"value"===r||"checked"===r||u[r]===l[r]||N(n,r,l[r],u[r],i);}function C(n,l,u){"-"===l[0]?n.setProperty(l,u):n[l]="number"==typeof u&&!1===s.test(l)?u+"px":null==u?"":u;}function N(n,l,u,i,t){var r,o,f,e,c;if(t?"className"===l&&(l="class"):"class"===l&&(l="className"),"style"===l)if(r=n.style,"string"==typeof u)r.cssText=u;else {if("string"==typeof i&&(r.cssText="",i=null),i)for(e in i)u&&e in u||C(r,e,"");if(u)for(c in u)i&&u[c]===i[c]||C(r,c,u[c]);}else "o"===l[0]&&"n"===l[1]?(o=l!==(l=l.replace(/Capture$/,"")),f=l.toLowerCase(),l=(f in n?f:l).slice(2),u?(i||n.addEventListener(l,z,o),(n.l||(n.l={}))[l]=u):n.removeEventListener(l,z,o)):"list"!==l&&"tagName"!==l&&"form"!==l&&"type"!==l&&"size"!==l&&!t&&l in n?n[l]=null==u?"":u:"function"!=typeof u&&"dangerouslySetInnerHTML"!==l&&(l!==(l=l.replace(/^xlink:?/,""))?null==u||!1===u?n.removeAttributeNS("http://www.w3.org/1999/xlink",l.toLowerCase()):n.setAttributeNS("http://www.w3.org/1999/xlink",l.toLowerCase(),u):null==u||!1===u&&!/^ar/.test(l)?n.removeAttribute(l):n.setAttribute(l,u));}function z(l){this.l[l.type](n.event?n.event(l):l);}function A(l,u,i,t,r,o,f,e,c){var s,v,h,p,y,w,k,g,_,x,P=u.type;if(void 0!==u.constructor)return null;(s=n.__b)&&s(u);try{n:if("function"==typeof P){if(g=u.props,_=(s=P.contextType)&&t[s.__c],x=s?_?_.props.value:s.__:t,i.__c?k=(v=u.__c=i.__c).__=v.__E:("prototype"in P&&P.prototype.render?u.__c=v=new P(g,x):(u.__c=v=new m(g,x),v.constructor=P,v.render=E),_&&_.sub(v),v.props=g,v.state||(v.state={}),v.context=x,v.__n=t,h=v.__d=!0,v.__h=[]),null==v.__s&&(v.__s=v.state),null!=P.getDerivedStateFromProps&&(v.__s==v.state&&(v.__s=a({},v.__s)),a(v.__s,P.getDerivedStateFromProps(g,v.__s))),p=v.props,y=v.state,h)null==P.getDerivedStateFromProps&&null!=v.componentWillMount&&v.componentWillMount(),null!=v.componentDidMount&&v.__h.push(v.componentDidMount);else {if(null==P.getDerivedStateFromProps&&g!==p&&null!=v.componentWillReceiveProps&&v.componentWillReceiveProps(g,x),!v.__e&&null!=v.shouldComponentUpdate&&!1===v.shouldComponentUpdate(g,v.__s,x)||u.__v===i.__v&&!v.__){for(v.props=g,v.state=v.__s,u.__v!==i.__v&&(v.__d=!1),v.__v=u,u.__e=i.__e,u.__k=i.__k,v.__h.length&&f.push(v),s=0;s<u.__k.length;s++)u.__k[s]&&(u.__k[s].__=u);break n}null!=v.componentWillUpdate&&v.componentWillUpdate(g,v.__s,x),null!=v.componentDidUpdate&&v.__h.push(function(){v.componentDidUpdate(p,y,w);});}v.context=x,v.props=g,v.state=v.__s,(s=n.__r)&&s(u),v.__d=!1,v.__v=u,v.__P=l,s=v.render(v.props,v.state,v.context),u.__k=null!=s&&s.type==d&&null==s.key?s.props.children:Array.isArray(s)?s:[s],null!=v.getChildContext&&(t=a(a({},t),v.getChildContext())),h||null==v.getSnapshotBeforeUpdate||(w=v.getSnapshotBeforeUpdate(p,y)),b(l,u,i,t,r,o,f,e,c),v.base=u.__e,v.__h.length&&f.push(v),k&&(v.__E=v.__=null),v.__e=!1;}else null==o&&u.__v===i.__v?(u.__k=i.__k,u.__e=i.__e):u.__e=$(i.__e,u,i,t,r,o,f,c);(s=n.diffed)&&s(u);}catch(l){u.__v=null,n.__e(l,u,i);}return u.__e}function T(l,u){n.__c&&n.__c(u,l),l.some(function(u){try{l=u.__h,u.__h=[],l.some(function(n){n.call(u);});}catch(l){n.__e(l,u.__v);}});}function $(n,l,u,i,t,r,o,f){var s,a,v,h,p,y=u.props,d=l.props;if(t="svg"===l.type||t,null!=r)for(s=0;s<r.length;s++)if(null!=(a=r[s])&&((null===l.type?3===a.nodeType:a.localName===l.type)||n==a)){n=a,r[s]=null;break}if(null==n){if(null===l.type)return document.createTextNode(d);n=t?document.createElementNS("http://www.w3.org/2000/svg",l.type):document.createElement(l.type,d.is&&{is:d.is}),r=null,f=!1;}if(null===l.type)y!==d&&n.data!=d&&(n.data=d);else {if(null!=r&&(r=c.slice.call(n.childNodes)),v=(y=u.props||e).dangerouslySetInnerHTML,h=d.dangerouslySetInnerHTML,!f){if(y===e)for(y={},p=0;p<n.attributes.length;p++)y[n.attributes[p].name]=n.attributes[p].value;(h||v)&&(h&&v&&h.__html==v.__html||(n.innerHTML=h&&h.__html||""));}P(n,d,y,t,f),h?l.__k=[]:(l.__k=l.props.children,b(n,l,u,i,"foreignObject"!==l.type&&t,r,o,e,f)),f||("value"in d&&void 0!==(s=d.value)&&s!==n.value&&N(n,"value",s,y.value,!1),"checked"in d&&void 0!==(s=d.checked)&&s!==n.checked&&N(n,"checked",s,y.checked,!1));}return n}function j(l,u,i){try{"function"==typeof l?l(u):l.current=u;}catch(l){n.__e(l,i);}}function D(l,u,i){var t,r,o;if(n.unmount&&n.unmount(l),(t=l.ref)&&(t.current&&t.current!==l.__e||j(t,null,u)),i||"function"==typeof l.type||(i=null!=(r=l.__e)),l.__e=l.__d=void 0,null!=(t=l.__c)){if(t.componentWillUnmount)try{t.componentWillUnmount();}catch(l){n.__e(l,u);}t.base=t.__P=null;}if(t=l.__k)for(o=0;o<t.length;o++)t[o]&&D(t[o],u,i);null!=r&&v(r);}function E(n,l,u){return this.constructor(n,u)}function H(l,u,i){var t,r,f;n.__&&n.__(l,u),r=(t=i===o)?null:i&&i.__k||u.__k,l=h(d,null,[l]),f=[],A(u,(t?u:i||u).__k=l,r||e,e,void 0!==u.ownerSVGElement,i&&!t?[i]:r?null:c.slice.call(u.childNodes),f,i||e,t),T(f,l);}function M(n){var l={},u={__c:"__cC"+f++,__:n,Consumer:function(n,l){return n.children(l)},Provider:function(n){var i,t=this;return this.getChildContext||(i=[],this.getChildContext=function(){return l[u.__c]=t,l},this.shouldComponentUpdate=function(n){t.props.value!==n.value&&i.some(function(l){l.context=n.value,g(l);});},this.sub=function(n){i.push(n);var l=n.componentWillUnmount;n.componentWillUnmount=function(){i.splice(i.indexOf(n),1),l&&l.call(n);};}),n.children}};return u.Consumer.contextType=u,u.Provider.__=u,u}n={__e:function(n,l){for(var u,i;l=l.__;)if((u=l.__c)&&!u.__)try{if(u.constructor&&null!=u.constructor.getDerivedStateFromError&&(i=!0,u.setState(u.constructor.getDerivedStateFromError(n))),null!=u.componentDidCatch&&(i=!0,u.componentDidCatch(n)),i)return g(u.__E=u)}catch(l){n=l;}throw n}},m.prototype.setState=function(n,l){var u;u=this.__s!==this.state?this.__s:this.__s=a({},this.state),"function"==typeof n&&(n=n(u,this.props)),n&&a(u,n),null!=n&&this.__v&&(l&&this.__h.push(l),g(this));},m.prototype.forceUpdate=function(n){this.__v&&(this.__e=!0,n&&this.__h.push(n),g(this));},m.prototype.render=d,u=[],i=0,t="function"==typeof Promise?Promise.prototype.then.bind(Promise.resolve()):setTimeout,o=e,f=0;
+
+    window.FullCalendarVDom = {
+        Component: m,
+        createElement: h,
+        render: H,
+        createRef: y,
+        Fragment: d,
+        createContext: createContext,
+        flushToDom: flushToDom
+    };
+    // HACKS...
+    // TODO: lock version
+    // TODO: link gh issues
+    function flushToDom() {
+        var oldDebounceRendering = n.debounceRendering; // orig
+        var callbackQ = [];
+        function execCallbackSync(callback) {
+            callbackQ.push(callback);
+        }
+        n.debounceRendering = execCallbackSync;
+        H(h(FakeComponent, {}), document.createElement('div'));
+        while (callbackQ.length) {
+            callbackQ.shift()();
+        }
+        n.debounceRendering = oldDebounceRendering;
+    }
+    var FakeComponent = /** @class */ (function (_super) {
+        __extends(FakeComponent, _super);
+        function FakeComponent() {
+            return _super !== null && _super.apply(this, arguments) || this;
+        }
+        FakeComponent.prototype.render = function () { return h('div', {}); };
+        FakeComponent.prototype.componentDidMount = function () { this.setState({}); };
+        return FakeComponent;
+    }(m));
+    function createContext(defaultValue) {
+        var ContextType = M(defaultValue);
+        var origProvider = ContextType.Provider;
+        ContextType.Provider = function () {
+            var _this = this;
+            var isNew = !this.getChildContext;
+            var children = origProvider.apply(this, arguments);
+            if (isNew) {
+                var subs_1 = [];
+                this.shouldComponentUpdate = function (_props) {
+                    if (_this.props.value !== _props.value) {
+                        subs_1.some(function (c) {
+                            c.context = _props.value;
+                            c.forceUpdate();
+                        });
+                    }
+                };
+                this.sub = function (c) {
+                    subs_1.push(c);
+                    var old = c.componentWillUnmount;
+                    c.componentWillUnmount = function () {
+                        subs_1.splice(subs_1.indexOf(c), 1);
+                        old && old.call(c);
+                    };
+                };
+            }
+            return children;
+        };
+        return ContextType;
+    }
+
+    // no public types yet. when there are, export from:
+    // import {} from './api-type-deps'
+    var EventSourceApi = /** @class */ (function () {
+        function EventSourceApi(context, internalEventSource // rename?
+        ) {
+            this.context = context;
+            this.internalEventSource = internalEventSource;
+        }
+        EventSourceApi.prototype.remove = function () {
+            this.context.dispatch({
+                type: 'REMOVE_EVENT_SOURCE',
+                sourceId: this.internalEventSource.sourceId
+            });
+        };
+        EventSourceApi.prototype.refetch = function () {
+            this.context.dispatch({
+                type: 'FETCH_EVENT_SOURCES',
+                sourceIds: [this.internalEventSource.sourceId]
+            });
+        };
+        Object.defineProperty(EventSourceApi.prototype, "id", {
+            get: function () {
+                return this.internalEventSource.publicId;
+            },
+            enumerable: false,
+            configurable: true
+        });
+        Object.defineProperty(EventSourceApi.prototype, "url", {
+            // only relevant to json-feed event sources
+            get: function () {
+                return this.internalEventSource.meta.url;
+            },
+            enumerable: false,
+            configurable: true
+        });
+        return EventSourceApi;
+    }());
+
+    // TODO: new util arrayify?
+    function removeExact(array, exactVal) {
+        var removeCnt = 0;
+        var i = 0;
+        while (i < array.length) {
+            if (array[i] === exactVal) {
+                array.splice(i, 1);
+                removeCnt++;
+            }
+            else {
+                i++;
+            }
+        }
+        return removeCnt;
+    }
+    function isArraysEqual(a0, a1, equalityFunc) {
+        if (a0 === a1) {
+            return true;
+        }
+        var len = a0.length;
+        var i;
+        if (len !== a1.length) { // not array? or not same length?
+            return false;
+        }
+        for (i = 0; i < len; i++) {
+            if (!(equalityFunc ? equalityFunc(a0[i], a1[i]) : a0[i] === a1[i])) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    function htmlToElement(html) {
+        html = html.trim();
+        var container = document.createElement('div');
+        container.innerHTML = html;
+        return container.firstChild;
+    }
+    function removeElement(el) {
+        if (el.parentNode) {
+            el.parentNode.removeChild(el);
+        }
+    }
+    function injectHtml(el, html) {
+        el.innerHTML = html;
+    }
+    function injectDomNodes(el, domNodes) {
+        var oldNodes = Array.prototype.slice.call(el.childNodes); // TODO: use array util
+        var newNodes = Array.prototype.slice.call(domNodes); // TODO: use array util
+        if (!isArraysEqual(oldNodes, newNodes)) {
+            for (var _i = 0, newNodes_1 = newNodes; _i < newNodes_1.length; _i++) {
+                var newNode = newNodes_1[_i];
+                el.appendChild(newNode);
+            }
+            oldNodes.forEach(removeElement);
+        }
+    }
+    // Querying
+    // ----------------------------------------------------------------------------------------------------------------
+    // from https://developer.mozilla.org/en-US/docs/Web/API/Element/closest
+    var matchesMethod = Element.prototype.matches ||
+        Element.prototype.matchesSelector ||
+        Element.prototype.msMatchesSelector;
+    var closestMethod = Element.prototype.closest || function (selector) {
+        // polyfill
+        var el = this;
+        if (!document.documentElement.contains(el)) {
+            return null;
+        }
+        do {
+            if (elementMatches(el, selector)) {
+                return el;
+            }
+            el = el.parentElement || el.parentNode;
+        } while (el !== null && el.nodeType === 1);
+        return null;
+    };
+    function elementClosest(el, selector) {
+        return closestMethod.call(el, selector);
+    }
+    function elementMatches(el, selector) {
+        return matchesMethod.call(el, selector);
+    }
+    // accepts multiple subject els
+    // returns a real array. good for methods like forEach
+    // TODO: accept the document
+    function findElements(container, selector) {
+        var containers = container instanceof HTMLElement ? [container] : container;
+        var allMatches = [];
+        for (var i = 0; i < containers.length; i++) {
+            var matches = containers[i].querySelectorAll(selector);
+            for (var j = 0; j < matches.length; j++) {
+                allMatches.push(matches[j]);
+            }
+        }
+        return allMatches;
+    }
+    // accepts multiple subject els
+    // only queries direct child elements // TODO: rename to findDirectChildren!
+    function findDirectChildren(parent, selector) {
+        var parents = parent instanceof HTMLElement ? [parent] : parent;
+        var allMatches = [];
+        for (var i = 0; i < parents.length; i++) {
+            var childNodes = parents[i].children; // only ever elements
+            for (var j = 0; j < childNodes.length; j++) {
+                var childNode = childNodes[j];
+                if (!selector || elementMatches(childNode, selector)) {
+                    allMatches.push(childNode);
+                }
+            }
+        }
+        return allMatches;
+    }
+    // Style
+    // ----------------------------------------------------------------------------------------------------------------
+    var PIXEL_PROP_RE = /(top|left|right|bottom|width|height)$/i;
+    function applyStyle(el, props) {
+        for (var propName in props) {
+            applyStyleProp(el, propName, props[propName]);
+        }
+    }
+    function applyStyleProp(el, name, val) {
+        if (val == null) {
+            el.style[name] = '';
+        }
+        else if (typeof val === 'number' && PIXEL_PROP_RE.test(name)) {
+            el.style[name] = val + 'px';
+        }
+        else {
+            el.style[name] = val;
+        }
+    }
+
+    // Stops a mouse/touch event from doing it's native browser action
+    function preventDefault(ev) {
+        ev.preventDefault();
+    }
+    // Event Delegation
+    // ----------------------------------------------------------------------------------------------------------------
+    function buildDelegationHandler(selector, handler) {
+        return function (ev) {
+            var matchedChild = elementClosest(ev.target, selector);
+            if (matchedChild) {
+                handler.call(matchedChild, ev, matchedChild);
+            }
+        };
+    }
+    function listenBySelector(container, eventType, selector, handler) {
+        var attachedHandler = buildDelegationHandler(selector, handler);
+        container.addEventListener(eventType, attachedHandler);
+        return function () {
+            container.removeEventListener(eventType, attachedHandler);
+        };
+    }
+    function listenToHoverBySelector(container, selector, onMouseEnter, onMouseLeave) {
+        var currentMatchedChild;
+        return listenBySelector(container, 'mouseover', selector, function (ev, matchedChild) {
+            if (matchedChild !== currentMatchedChild) {
+                currentMatchedChild = matchedChild;
+                onMouseEnter(ev, matchedChild);
+                var realOnMouseLeave_1 = function (ev) {
+                    currentMatchedChild = null;
+                    onMouseLeave(ev, matchedChild);
+                    matchedChild.removeEventListener('mouseleave', realOnMouseLeave_1);
+                };
+                // listen to the next mouseleave, and then unattach
+                matchedChild.addEventListener('mouseleave', realOnMouseLeave_1);
+            }
+        });
+    }
+    // Animation
+    // ----------------------------------------------------------------------------------------------------------------
+    var transitionEventNames = [
+        'webkitTransitionEnd',
+        'otransitionend',
+        'oTransitionEnd',
+        'msTransitionEnd',
+        'transitionend'
+    ];
+    // triggered only when the next single subsequent transition finishes
+    function whenTransitionDone(el, callback) {
+        var realCallback = function (ev) {
+            callback(ev);
+            transitionEventNames.forEach(function (eventName) {
+                el.removeEventListener(eventName, realCallback);
+            });
+        };
+        transitionEventNames.forEach(function (eventName) {
+            el.addEventListener(eventName, realCallback); // cross-browser way to determine when the transition finishes
+        });
+    }
+
+    var guidNumber = 0;
+    function guid() {
+        return String(guidNumber++);
+    }
+    /* FullCalendar-specific DOM Utilities
+    ----------------------------------------------------------------------------------------------------------------------*/
+    // Make the mouse cursor express that an event is not allowed in the current area
+    function disableCursor() {
+        document.body.classList.add('fc-not-allowed');
+    }
+    // Returns the mouse cursor to its original look
+    function enableCursor() {
+        document.body.classList.remove('fc-not-allowed');
+    }
+    /* Selection
+    ----------------------------------------------------------------------------------------------------------------------*/
+    function preventSelection(el) {
+        el.classList.add('fc-unselectable');
+        el.addEventListener('selectstart', preventDefault);
+    }
+    function allowSelection(el) {
+        el.classList.remove('fc-unselectable');
+        el.removeEventListener('selectstart', preventDefault);
+    }
+    /* Context Menu
+    ----------------------------------------------------------------------------------------------------------------------*/
+    function preventContextMenu(el) {
+        el.addEventListener('contextmenu', preventDefault);
+    }
+    function allowContextMenu(el) {
+        el.removeEventListener('contextmenu', preventDefault);
+    }
+    function parseFieldSpecs(input) {
+        var specs = [];
+        var tokens = [];
+        var i;
+        var token;
+        if (typeof input === 'string') {
+            tokens = input.split(/\s*,\s*/);
+        }
+        else if (typeof input === 'function') {
+            tokens = [input];
+        }
+        else if (Array.isArray(input)) {
+            tokens = input;
+        }
+        for (i = 0; i < tokens.length; i++) {
+            token = tokens[i];
+            if (typeof token === 'string') {
+                specs.push(token.charAt(0) === '-' ?
+                    { field: token.substring(1), order: -1 } :
+                    { field: token, order: 1 });
+            }
+            else if (typeof token === 'function') {
+                specs.push({ func: token });
+            }
+        }
+        return specs;
+    }
+    function compareByFieldSpecs(obj0, obj1, fieldSpecs) {
+        var i;
+        var cmp;
+        for (i = 0; i < fieldSpecs.length; i++) {
+            cmp = compareByFieldSpec(obj0, obj1, fieldSpecs[i]);
+            if (cmp) {
+                return cmp;
+            }
+        }
+        return 0;
+    }
+    function compareByFieldSpec(obj0, obj1, fieldSpec) {
+        if (fieldSpec.func) {
+            return fieldSpec.func(obj0, obj1);
+        }
+        return flexibleCompare(obj0[fieldSpec.field], obj1[fieldSpec.field])
+            * (fieldSpec.order || 1);
+    }
+    function flexibleCompare(a, b) {
+        if (!a && !b) {
+            return 0;
+        }
+        if (b == null) {
+            return -1;
+        }
+        if (a == null) {
+            return 1;
+        }
+        if (typeof a === 'string' || typeof b === 'string') {
+            return String(a).localeCompare(String(b));
+        }
+        return a - b;
+    }
+    /* String Utilities
+    ----------------------------------------------------------------------------------------------------------------------*/
+    function padStart(val, len) {
+        var s = String(val);
+        return '000'.substr(0, len - s.length) + s;
+    }
+    /* Number Utilities
+    ----------------------------------------------------------------------------------------------------------------------*/
+    function compareNumbers(a, b) {
+        return a - b;
+    }
+    function isInt(n) {
+        return n % 1 === 0;
+    }
+    /* FC-specific DOM dimension stuff
+    ----------------------------------------------------------------------------------------------------------------------*/
+    function computeSmallestCellWidth(cellEl) {
+        var allWidthEl = cellEl.querySelector('.fc-scrollgrid-shrink-frame');
+        var contentWidthEl = cellEl.querySelector('.fc-scrollgrid-shrink-cushion');
+        if (!allWidthEl) {
+            throw new Error('needs fc-scrollgrid-shrink-frame className'); // TODO: use const
+        }
+        if (!contentWidthEl) {
+            throw new Error('needs fc-scrollgrid-shrink-cushion className');
+        }
+        return cellEl.getBoundingClientRect().width - allWidthEl.getBoundingClientRect().width + // the cell padding+border
+            contentWidthEl.getBoundingClientRect().width;
+    }
+
+    var DAY_IDS = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'];
+    // Adding
+    function addWeeks(m, n) {
+        var a = dateToUtcArray(m);
+        a[2] += n * 7;
+        return arrayToUtcDate(a);
+    }
+    function addDays(m, n) {
+        var a = dateToUtcArray(m);
+        a[2] += n;
+        return arrayToUtcDate(a);
+    }
+    function addMs(m, n) {
+        var a = dateToUtcArray(m);
+        a[6] += n;
+        return arrayToUtcDate(a);
+    }
+    // Diffing (all return floats)
+    // TODO: why not use ranges?
+    function diffWeeks(m0, m1) {
+        return diffDays(m0, m1) / 7;
+    }
+    function diffDays(m0, m1) {
+        return (m1.valueOf() - m0.valueOf()) / (1000 * 60 * 60 * 24);
+    }
+    function diffHours(m0, m1) {
+        return (m1.valueOf() - m0.valueOf()) / (1000 * 60 * 60);
+    }
+    function diffMinutes(m0, m1) {
+        return (m1.valueOf() - m0.valueOf()) / (1000 * 60);
+    }
+    function diffSeconds(m0, m1) {
+        return (m1.valueOf() - m0.valueOf()) / 1000;
+    }
+    function diffDayAndTime(m0, m1) {
+        var m0day = startOfDay(m0);
+        var m1day = startOfDay(m1);
+        return {
+            years: 0,
+            months: 0,
+            days: Math.round(diffDays(m0day, m1day)),
+            milliseconds: (m1.valueOf() - m1day.valueOf()) - (m0.valueOf() - m0day.valueOf())
+        };
+    }
+    // Diffing Whole Units
+    function diffWholeWeeks(m0, m1) {
+        var d = diffWholeDays(m0, m1);
+        if (d !== null && d % 7 === 0) {
+            return d / 7;
+        }
+        return null;
+    }
+    function diffWholeDays(m0, m1) {
+        if (timeAsMs(m0) === timeAsMs(m1)) {
+            return Math.round(diffDays(m0, m1));
+        }
+        return null;
+    }
+    // Start-Of
+    function startOfDay(m) {
+        return arrayToUtcDate([
+            m.getUTCFullYear(),
+            m.getUTCMonth(),
+            m.getUTCDate()
+        ]);
+    }
+    function startOfHour(m) {
+        return arrayToUtcDate([
+            m.getUTCFullYear(),
+            m.getUTCMonth(),
+            m.getUTCDate(),
+            m.getUTCHours()
+        ]);
+    }
+    function startOfMinute(m) {
+        return arrayToUtcDate([
+            m.getUTCFullYear(),
+            m.getUTCMonth(),
+            m.getUTCDate(),
+            m.getUTCHours(),
+            m.getUTCMinutes()
+        ]);
+    }
+    function startOfSecond(m) {
+        return arrayToUtcDate([
+            m.getUTCFullYear(),
+            m.getUTCMonth(),
+            m.getUTCDate(),
+            m.getUTCHours(),
+            m.getUTCMinutes(),
+            m.getUTCSeconds()
+        ]);
+    }
+    // Week Computation
+    function weekOfYear(marker, dow, doy) {
+        var y = marker.getUTCFullYear();
+        var w = weekOfGivenYear(marker, y, dow, doy);
+        if (w < 1) {
+            return weekOfGivenYear(marker, y - 1, dow, doy);
+        }
+        var nextW = weekOfGivenYear(marker, y + 1, dow, doy);
+        if (nextW >= 1) {
+            return Math.min(w, nextW);
+        }
+        return w;
+    }
+    function weekOfGivenYear(marker, year, dow, doy) {
+        var firstWeekStart = arrayToUtcDate([year, 0, 1 + firstWeekOffset(year, dow, doy)]);
+        var dayStart = startOfDay(marker);
+        var days = Math.round(diffDays(firstWeekStart, dayStart));
+        return Math.floor(days / 7) + 1; // zero-indexed
+    }
+    // start-of-first-week - start-of-year
+    function firstWeekOffset(year, dow, doy) {
+        // first-week day -- which january is always in the first week (4 for iso, 1 for other)
+        var fwd = 7 + dow - doy;
+        // first-week day local weekday -- which local weekday is fwd
+        var fwdlw = (7 + arrayToUtcDate([year, 0, fwd]).getUTCDay() - dow) % 7;
+        return -fwdlw + fwd - 1;
+    }
+    // Array Conversion
+    function dateToLocalArray(date) {
+        return [
+            date.getFullYear(),
+            date.getMonth(),
+            date.getDate(),
+            date.getHours(),
+            date.getMinutes(),
+            date.getSeconds(),
+            date.getMilliseconds()
+        ];
+    }
+    function arrayToLocalDate(a) {
+        return new Date(a[0], a[1] || 0, a[2] == null ? 1 : a[2], // day of month
+        a[3] || 0, a[4] || 0, a[5] || 0);
+    }
+    function dateToUtcArray(date) {
+        return [
+            date.getUTCFullYear(),
+            date.getUTCMonth(),
+            date.getUTCDate(),
+            date.getUTCHours(),
+            date.getUTCMinutes(),
+            date.getUTCSeconds(),
+            date.getUTCMilliseconds()
+        ];
+    }
+    function arrayToUtcDate(a) {
+        // according to web standards (and Safari), a month index is required.
+        // massage if only given a year.
+        if (a.length === 1) {
+            a = a.concat([0]);
+        }
+        return new Date(Date.UTC.apply(Date, a));
+    }
+    // Other Utils
+    function isValidDate(m) {
+        return !isNaN(m.valueOf());
+    }
+    function timeAsMs(m) {
+        return m.getUTCHours() * 1000 * 60 * 60 +
+            m.getUTCMinutes() * 1000 * 60 +
+            m.getUTCSeconds() * 1000 +
+            m.getUTCMilliseconds();
+    }
+
+    function createEventInstance(defId, range, forcedStartTzo, forcedEndTzo) {
+        return {
+            instanceId: guid(),
+            defId: defId,
+            range: range,
+            forcedStartTzo: forcedStartTzo == null ? null : forcedStartTzo,
+            forcedEndTzo: forcedEndTzo == null ? null : forcedEndTzo
+        };
+    }
+
+    var hasOwnProperty = Object.prototype.hasOwnProperty;
+    // Merges an array of objects into a single object.
+    // The second argument allows for an array of property names who's object values will be merged together.
+    function mergeProps(propObjs, complexPropsMap) {
+        var dest = {};
+        if (complexPropsMap) {
+            for (var name_1 in complexPropsMap) {
+                var complexObjs = [];
+                // collect the trailing object values, stopping when a non-object is discovered
+                for (var i = propObjs.length - 1; i >= 0; i--) {
+                    var val = propObjs[i][name_1];
+                    if (typeof val === 'object' && val) { // non-null object
+                        complexObjs.unshift(val);
+                    }
+                    else if (val !== undefined) {
+                        dest[name_1] = val; // if there were no objects, this value will be used
+                        break;
+                    }
+                }
+                // if the trailing values were objects, use the merged value
+                if (complexObjs.length) {
+                    dest[name_1] = mergeProps(complexObjs);
+                }
+            }
+        }
+        // copy values into the destination, going from last to first
+        for (var i = propObjs.length - 1; i >= 0; i--) {
+            var props = propObjs[i];
+            for (var name_2 in props) {
+                if (!(name_2 in dest)) { // if already assigned by previous props or complex props, don't reassign
+                    dest[name_2] = props[name_2];
+                }
+            }
+        }
+        return dest;
+    }
+    function filterHash(hash, func) {
+        var filtered = {};
+        for (var key in hash) {
+            if (func(hash[key], key)) {
+                filtered[key] = hash[key];
+            }
+        }
+        return filtered;
+    }
+    function mapHash(hash, func) {
+        var newHash = {};
+        for (var key in hash) {
+            newHash[key] = func(hash[key], key);
+        }
+        return newHash;
+    }
+    function arrayToHash(a) {
+        var hash = {};
+        for (var _i = 0, a_1 = a; _i < a_1.length; _i++) {
+            var item = a_1[_i];
+            hash[item] = true;
+        }
+        return hash;
+    }
+    function buildHashFromArray(a, func) {
+        var hash = {};
+        for (var i = 0; i < a.length; i++) {
+            var tuple = func(a[i], i);
+            hash[tuple[0]] = tuple[1];
+        }
+        return hash;
+    }
+    function hashValuesToArray(obj) {
+        var a = [];
+        for (var key in obj) {
+            a.push(obj[key]);
+        }
+        return a;
+    }
+    function isPropsEqual(obj0, obj1) {
+        if (obj0 === obj1) {
+            return true;
+        }
+        for (var key in obj0) {
+            if (hasOwnProperty.call(obj0, key)) {
+                if (!(key in obj1)) {
+                    return false;
+                }
+            }
+        }
+        for (var key in obj1) {
+            if (hasOwnProperty.call(obj1, key)) {
+                if (obj0[key] !== obj1[key]) {
+                    return false;
+                }
+            }
+        }
+        return true;
+    }
+    function getUnequalProps(obj0, obj1) {
+        var keys = [];
+        for (var key in obj0) {
+            if (hasOwnProperty.call(obj0, key)) {
+                if (!(key in obj1)) {
+                    keys.push(key);
+                }
+            }
+        }
+        for (var key in obj1) {
+            if (hasOwnProperty.call(obj1, key)) {
+                if (obj0[key] !== obj1[key]) {
+                    keys.push(key);
+                }
+            }
+        }
+        return keys;
+    }
+    function compareObjs(oldProps, newProps, equalityFuncs) {
+        if (equalityFuncs === void 0) { equalityFuncs = {}; }
+        if (oldProps === newProps) {
+            return true;
+        }
+        for (var key in newProps) {
+            if (key in oldProps && isObjValsEqual(oldProps[key], newProps[key], equalityFuncs[key])) ;
+            else {
+                return false;
+            }
+        }
+        // check for props that were omitted in the new
+        for (var key in oldProps) {
+            if (!(key in newProps)) {
+                return false;
+            }
+        }
+        return true;
+    }
+    /*
+    assumed "true" equality for handler names like "onReceiveSomething"
+    */
+    function isObjValsEqual(val0, val1, comparator) {
+        if (val0 === val1 || comparator === true) {
+            return true;
+        }
+        if (comparator) {
+            return comparator(val0, val1);
+        }
+        return false;
+    }
+    function collectFromHash(hash, startIndex, endIndex, step) {
+        if (startIndex === void 0) { startIndex = 0; }
+        if (step === void 0) { step = 1; }
+        var res = [];
+        if (endIndex == null) {
+            endIndex = Object.keys(hash).length;
+        }
+        for (var i = startIndex; i < endIndex; i += step) {
+            var val = hash[i];
+            if (val !== undefined) { // will disregard undefined for sparse arrays
+                res.push(val);
+            }
+        }
+        return res;
+    }
+
+    function parseRecurring(refined, defaultAllDay, dateEnv, recurringTypes) {
+        for (var i = 0; i < recurringTypes.length; i++) {
+            var parsed = recurringTypes[i].parse(refined, dateEnv);
+            if (parsed) {
+                var allDay = refined.allDay;
+                if (allDay == null) {
+                    allDay = defaultAllDay;
+                    if (allDay == null) {
+                        allDay = parsed.allDayGuess;
+                        if (allDay == null) {
+                            allDay = false;
+                        }
+                    }
+                }
+                return {
+                    allDay: allDay,
+                    duration: parsed.duration,
+                    typeData: parsed.typeData,
+                    typeId: i
+                };
+            }
+        }
+        return null;
+    }
+    function expandRecurring(eventStore, framingRange, context) {
+        var dateEnv = context.dateEnv, pluginHooks = context.pluginHooks, options = context.options;
+        var defs = eventStore.defs, instances = eventStore.instances;
+        // remove existing recurring instances
+        // TODO: bad. always expand events as a second step
+        instances = filterHash(instances, function (instance) {
+            return !defs[instance.defId].recurringDef;
+        });
+        for (var defId in defs) {
+            var def = defs[defId];
+            if (def.recurringDef) {
+                var duration = def.recurringDef.duration;
+                if (!duration) {
+                    duration = def.allDay ?
+                        options.defaultAllDayEventDuration :
+                        options.defaultTimedEventDuration;
+                }
+                var starts = expandRecurringRanges(def, duration, framingRange, dateEnv, pluginHooks.recurringTypes);
+                for (var _i = 0, starts_1 = starts; _i < starts_1.length; _i++) {
+                    var start = starts_1[_i];
+                    var instance = createEventInstance(defId, {
+                        start: start,
+                        end: dateEnv.add(start, duration)
+                    });
+                    instances[instance.instanceId] = instance;
+                }
+            }
+        }
+        return { defs: defs, instances: instances };
+    }
+    /*
+    Event MUST have a recurringDef
+    */
+    function expandRecurringRanges(eventDef, duration, framingRange, dateEnv, recurringTypes) {
+        var typeDef = recurringTypes[eventDef.recurringDef.typeId];
+        var markers = typeDef.expand(eventDef.recurringDef.typeData, {
+            start: dateEnv.subtract(framingRange.start, duration),
+            end: framingRange.end
+        }, dateEnv);
+        // the recurrence plugins don't guarantee that all-day events are start-of-day, so we have to
+        if (eventDef.allDay) {
+            markers = markers.map(startOfDay);
+        }
+        return markers;
+    }
+
+    var INTERNAL_UNITS = ['years', 'months', 'days', 'milliseconds'];
+    var PARSE_RE = /^(-?)(?:(\d+)\.)?(\d+):(\d\d)(?::(\d\d)(?:\.(\d\d\d))?)?/;
+    // Parsing and Creation
+    function createDuration(input, unit) {
+        var _a;
+        if (typeof input === 'string') {
+            return parseString(input);
+        }
+        else if (typeof input === 'object' && input) { // non-null object
+            return parseObject(input);
+        }
+        else if (typeof input === 'number') {
+            return parseObject((_a = {}, _a[unit || 'milliseconds'] = input, _a));
+        }
+        else {
+            return null;
+        }
+    }
+    function parseString(s) {
+        var m = PARSE_RE.exec(s);
+        if (m) {
+            var sign = m[1] ? -1 : 1;
+            return {
+                years: 0,
+                months: 0,
+                days: sign * (m[2] ? parseInt(m[2], 10) : 0),
+                milliseconds: sign * ((m[3] ? parseInt(m[3], 10) : 0) * 60 * 60 * 1000 + // hours
+                    (m[4] ? parseInt(m[4], 10) : 0) * 60 * 1000 + // minutes
+                    (m[5] ? parseInt(m[5], 10) : 0) * 1000 + // seconds
+                    (m[6] ? parseInt(m[6], 10) : 0) // ms
+                )
+            };
+        }
+        return null;
+    }
+    function parseObject(obj) {
+        var duration = {
+            years: obj.years || obj.year || 0,
+            months: obj.months || obj.month || 0,
+            days: obj.days || obj.day || 0,
+            milliseconds: (obj.hours || obj.hour || 0) * 60 * 60 * 1000 + // hours
+                (obj.minutes || obj.minute || 0) * 60 * 1000 + // minutes
+                (obj.seconds || obj.second || 0) * 1000 + // seconds
+                (obj.milliseconds || obj.millisecond || obj.ms || 0) // ms
+        };
+        var weeks = obj.weeks || obj.week;
+        if (weeks) {
+            duration.days += weeks * 7;
+            duration.specifiedWeeks = true;
+        }
+        return duration;
+    }
+    // Equality
+    function durationsEqual(d0, d1) {
+        return d0.years === d1.years &&
+            d0.months === d1.months &&
+            d0.days === d1.days &&
+            d0.milliseconds === d1.milliseconds;
+    }
+    function isSingleDay(dur) {
+        return dur.years === 0 && dur.months === 0 && dur.days === 1 && dur.milliseconds === 0;
+    }
+    // Simple Math
+    function addDurations(d0, d1) {
+        return {
+            years: d0.years + d1.years,
+            months: d0.months + d1.months,
+            days: d0.days + d1.days,
+            milliseconds: d0.milliseconds + d1.milliseconds
+        };
+    }
+    function subtractDurations(d1, d0) {
+        return {
+            years: d1.years - d0.years,
+            months: d1.months - d0.months,
+            days: d1.days - d0.days,
+            milliseconds: d1.milliseconds - d0.milliseconds
+        };
+    }
+    function multiplyDuration(d, n) {
+        return {
+            years: d.years * n,
+            months: d.months * n,
+            days: d.days * n,
+            milliseconds: d.milliseconds * n
+        };
+    }
+    // Conversions
+    // "Rough" because they are based on average-case Gregorian months/years
+    function asRoughYears(dur) {
+        return asRoughDays(dur) / 365;
+    }
+    function asRoughMonths(dur) {
+        return asRoughDays(dur) / 30;
+    }
+    function asRoughDays(dur) {
+        return asRoughMs(dur) / 864e5;
+    }
+    function asRoughMinutes(dur) {
+        return asRoughMs(dur) / (1000 * 60);
+    }
+    function asRoughSeconds(dur) {
+        return asRoughMs(dur) / 1000;
+    }
+    function asRoughMs(dur) {
+        return dur.years * (365 * 864e5) +
+            dur.months * (30 * 864e5) +
+            dur.days * 864e5 +
+            dur.milliseconds;
+    }
+    // Advanced Math
+    function wholeDivideDurations(numerator, denominator) {
+        var res = null;
+        for (var i = 0; i < INTERNAL_UNITS.length; i++) {
+            var unit = INTERNAL_UNITS[i];
+            if (denominator[unit]) {
+                var localRes = numerator[unit] / denominator[unit];
+                if (!isInt(localRes) || (res !== null && res !== localRes)) {
+                    return null;
+                }
+                res = localRes;
+            }
+            else if (numerator[unit]) {
+                // needs to divide by something but can't!
+                return null;
+            }
+        }
+        return res;
+    }
+    function greatestDurationDenominator(dur) {
+        var ms = dur.milliseconds;
+        if (ms) {
+            if (ms % 1000 !== 0) {
+                return { unit: 'millisecond', value: ms };
+            }
+            if (ms % (1000 * 60) !== 0) {
+                return { unit: 'second', value: ms / 1000 };
+            }
+            if (ms % (1000 * 60 * 60) !== 0) {
+                return { unit: 'minute', value: ms / (1000 * 60) };
+            }
+            if (ms) {
+                return { unit: 'hour', value: ms / (1000 * 60 * 60) };
+            }
+        }
+        if (dur.days) {
+            if (dur.specifiedWeeks && dur.days % 7 === 0) {
+                return { unit: 'week', value: dur.days / 7 };
+            }
+            return { unit: 'day', value: dur.days };
+        }
+        if (dur.months) {
+            return { unit: 'month', value: dur.months };
+        }
+        if (dur.years) {
+            return { unit: 'year', value: dur.years };
+        }
+        return { unit: 'millisecond', value: 0 };
+    }
+
+    // timeZoneOffset is in minutes
+    function buildIsoString(marker, timeZoneOffset, stripZeroTime) {
+        if (stripZeroTime === void 0) { stripZeroTime = false; }
+        var s = marker.toISOString();
+        s = s.replace('.000', '');
+        if (stripZeroTime) {
+            s = s.replace('T00:00:00Z', '');
+        }
+        if (s.length > 10) { // time part wasn't stripped, can add timezone info
+            if (timeZoneOffset == null) {
+                s = s.replace('Z', '');
+            }
+            else if (timeZoneOffset !== 0) {
+                s = s.replace('Z', formatTimeZoneOffset(timeZoneOffset, true));
+            }
+            // otherwise, its UTC-0 and we want to keep the Z
+        }
+        return s;
+    }
+    // formats the date, but with no time part
+    // TODO: somehow merge with buildIsoString and stripZeroTime
+    // TODO: rename. omit "string"
+    function formatDayString(marker) {
+        return marker.toISOString().replace(/T.*$/, '');
+    }
+    // TODO: use Date::toISOString and use everything after the T?
+    function formatIsoTimeString(marker) {
+        return padStart(marker.getUTCHours(), 2) + ':' +
+            padStart(marker.getUTCMinutes(), 2) + ':' +
+            padStart(marker.getUTCSeconds(), 2);
+    }
+    function formatTimeZoneOffset(minutes, doIso) {
+        if (doIso === void 0) { doIso = false; }
+        var sign = minutes < 0 ? '-' : '+';
+        var abs = Math.abs(minutes);
+        var hours = Math.floor(abs / 60);
+        var mins = Math.round(abs % 60);
+        if (doIso) {
+            return sign + padStart(hours, 2) + ':' + padStart(mins, 2);
+        }
+        else {
+            return 'GMT' + sign + hours + (mins ? ':' + padStart(mins, 2) : '');
+        }
+    }
+
+    function memoize(workerFunc, resEquality, teardownFunc) {
+        var currentArgs;
+        var currentRes;
+        return function () {
+            var newArgs = [];
+            for (var _i = 0; _i < arguments.length; _i++) {
+                newArgs[_i] = arguments[_i];
+            }
+            if (!currentArgs) {
+                currentRes = workerFunc.apply(this, newArgs);
+            }
+            else if (!isArraysEqual(currentArgs, newArgs)) {
+                if (teardownFunc) {
+                    teardownFunc(currentRes);
+                }
+                var res = workerFunc.apply(this, newArgs);
+                if (!resEquality || !resEquality(res, currentRes)) {
+                    currentRes = res;
+                }
+            }
+            currentArgs = newArgs;
+            return currentRes;
+        };
+    }
+    function memoizeObjArg(workerFunc, resEquality, teardownFunc) {
+        var currentArg;
+        var currentRes;
+        return function (newArg) {
+            if (!currentArg) {
+                currentRes = workerFunc.call(this, newArg);
+            }
+            else if (!isPropsEqual(currentArg, newArg)) {
+                if (teardownFunc) {
+                    teardownFunc(currentRes);
+                }
+                var res = workerFunc.call(this, newArg);
+                if (!resEquality || !resEquality(res, currentRes)) {
+                    currentRes = res;
+                }
+            }
+            currentArg = newArg;
+            return currentRes;
+        };
+    }
+    function memoizeArraylike(// used at all?
+    workerFunc, resEquality, teardownFunc) {
+        var currentArgSets = [];
+        var currentResults = [];
+        return function (newArgSets) {
+            var currentLen = currentArgSets.length;
+            var newLen = newArgSets.length;
+            var i = 0;
+            for (; i < currentLen; i++) {
+                if (!newArgSets[i]) { // one of the old sets no longer exists
+                    if (teardownFunc) {
+                        teardownFunc(currentResults[i]);
+                    }
+                }
+                else if (!isArraysEqual(currentArgSets[i], newArgSets[i])) {
+                    if (teardownFunc) {
+                        teardownFunc(currentResults[i]);
+                    }
+                    var res = workerFunc.apply(this, newArgSets[i]);
+                    if (!resEquality || !resEquality(res, currentResults[i])) {
+                        currentResults[i] = res;
+                    }
+                }
+            }
+            for (; i < newLen; i++) {
+                currentResults[i] = workerFunc.apply(this, newArgSets[i]);
+            }
+            currentArgSets = newArgSets;
+            currentResults.splice(newLen); // remove excess
+            return currentResults;
+        };
+    }
+    function memoizeHashlike(// used?
+    workerFunc, resEquality, teardownFunc // TODO: change arg order
+    ) {
+        var currentArgHash = {};
+        var currentResHash = {};
+        return function (newArgHash) {
+            var newResHash = {};
+            for (var key in newArgHash) {
+                if (!currentResHash[key]) {
+                    newResHash[key] = workerFunc.apply(this, newArgHash[key]);
+                }
+                else if (!isArraysEqual(currentArgHash[key], newArgHash[key])) {
+                    if (teardownFunc) {
+                        teardownFunc(currentResHash[key]);
+                    }
+                    var res = workerFunc.apply(this, newArgHash[key]);
+                    newResHash[key] = (resEquality && resEquality(res, currentResHash[key]))
+                        ? currentResHash[key]
+                        : res;
+                }
+                else {
+                    newResHash[key] = currentResHash[key];
+                }
+            }
+            currentArgHash = newArgHash;
+            currentResHash = newResHash;
+            return newResHash;
+        };
+    }
+
+    var EXTENDED_SETTINGS_AND_SEVERITIES = {
+        week: 3,
+        separator: 0,
+        omitZeroMinute: 0,
+        meridiem: 0,
+        omitCommas: 0
+    };
+    var STANDARD_DATE_PROP_SEVERITIES = {
+        timeZoneName: 7,
+        era: 6,
+        year: 5,
+        month: 4,
+        day: 2,
+        weekday: 2,
+        hour: 1,
+        minute: 1,
+        second: 1
+    };
+    var MERIDIEM_RE = /\s*([ap])\.?m\.?/i; // eats up leading spaces too
+    var COMMA_RE = /,/g; // we need re for globalness
+    var MULTI_SPACE_RE = /\s+/g;
+    var LTR_RE = /\u200e/g; // control character
+    var UTC_RE = /UTC|GMT/;
+    var NativeFormatter = /** @class */ (function () {
+        function NativeFormatter(formatSettings) {
+            var standardDateProps = {};
+            var extendedSettings = {};
+            var severity = 0;
+            for (var name_1 in formatSettings) {
+                if (name_1 in EXTENDED_SETTINGS_AND_SEVERITIES) {
+                    extendedSettings[name_1] = formatSettings[name_1];
+                    severity = Math.max(EXTENDED_SETTINGS_AND_SEVERITIES[name_1], severity);
+                }
+                else {
+                    standardDateProps[name_1] = formatSettings[name_1];
+                    if (name_1 in STANDARD_DATE_PROP_SEVERITIES) { // TODO: what about hour12? no severity
+                        severity = Math.max(STANDARD_DATE_PROP_SEVERITIES[name_1], severity);
+                    }
+                }
+            }
+            this.standardDateProps = standardDateProps;
+            this.extendedSettings = extendedSettings;
+            this.severity = severity;
+            this.buildFormattingFunc = memoize(buildFormattingFunc);
+        }
+        NativeFormatter.prototype.format = function (date, context) {
+            return this.buildFormattingFunc(this.standardDateProps, this.extendedSettings, context)(date);
+        };
+        NativeFormatter.prototype.formatRange = function (start, end, context, betterDefaultSeparator) {
+            var _a = this, standardDateProps = _a.standardDateProps, extendedSettings = _a.extendedSettings;
+            var diffSeverity = computeMarkerDiffSeverity(start.marker, end.marker, context.calendarSystem);
+            if (!diffSeverity) {
+                return this.format(start, context);
+            }
+            var biggestUnitForPartial = diffSeverity;
+            if (biggestUnitForPartial > 1 && // the two dates are different in a way that's larger scale than time
+                (standardDateProps.year === 'numeric' || standardDateProps.year === '2-digit') &&
+                (standardDateProps.month === 'numeric' || standardDateProps.month === '2-digit') &&
+                (standardDateProps.day === 'numeric' || standardDateProps.day === '2-digit')) {
+                biggestUnitForPartial = 1; // make it look like the dates are only different in terms of time
+            }
+            var full0 = this.format(start, context);
+            var full1 = this.format(end, context);
+            if (full0 === full1) {
+                return full0;
+            }
+            var partialDateProps = computePartialFormattingOptions(standardDateProps, biggestUnitForPartial);
+            var partialFormattingFunc = buildFormattingFunc(partialDateProps, extendedSettings, context);
+            var partial0 = partialFormattingFunc(start);
+            var partial1 = partialFormattingFunc(end);
+            var insertion = findCommonInsertion(full0, partial0, full1, partial1);
+            var separator = extendedSettings.separator || betterDefaultSeparator || context.defaultSeparator || '';
+            if (insertion) {
+                return insertion.before + partial0 + separator + partial1 + insertion.after;
+            }
+            return full0 + separator + full1;
+        };
+        NativeFormatter.prototype.getLargestUnit = function () {
+            switch (this.severity) {
+                case 7:
+                case 6:
+                case 5:
+                    return 'year';
+                case 4:
+                    return 'month';
+                case 3:
+                    return 'week';
+                case 2:
+                    return 'day';
+                default:
+                    return 'time'; // really?
+            }
+        };
+        return NativeFormatter;
+    }());
+    function buildFormattingFunc(standardDateProps, extendedSettings, context) {
+        var standardDatePropCnt = Object.keys(standardDateProps).length;
+        if (standardDatePropCnt === 1 && standardDateProps.timeZoneName === 'short') {
+            return function (date) {
+                return formatTimeZoneOffset(date.timeZoneOffset);
+            };
+        }
+        if (standardDatePropCnt === 0 && extendedSettings.week) {
+            return function (date) {
+                return formatWeekNumber(context.computeWeekNumber(date.marker), context.weekText, context.locale, extendedSettings.week);
+            };
+        }
+        return buildNativeFormattingFunc(standardDateProps, extendedSettings, context);
+    }
+    function buildNativeFormattingFunc(standardDateProps, extendedSettings, context) {
+        standardDateProps = __assign({}, standardDateProps); // copy
+        extendedSettings = __assign({}, extendedSettings); // copy
+        sanitizeSettings(standardDateProps, extendedSettings);
+        standardDateProps.timeZone = 'UTC'; // we leverage the only guaranteed timeZone for our UTC markers
+        var normalFormat = new Intl.DateTimeFormat(context.locale.codes, standardDateProps);
+        var zeroFormat; // needed?
+        if (extendedSettings.omitZeroMinute) {
+            var zeroProps = __assign({}, standardDateProps);
+            delete zeroProps.minute; // seconds and ms were already considered in sanitizeSettings
+            zeroFormat = new Intl.DateTimeFormat(context.locale.codes, zeroProps);
+        }
+        return function (date) {
+            var marker = date.marker;
+            var format;
+            if (zeroFormat && !marker.getUTCMinutes()) {
+                format = zeroFormat;
+            }
+            else {
+                format = normalFormat;
+            }
+            var s = format.format(marker);
+            return postProcess(s, date, standardDateProps, extendedSettings, context);
+        };
+    }
+    function sanitizeSettings(standardDateProps, extendedSettings) {
+        // deal with a browser inconsistency where formatting the timezone
+        // requires that the hour/minute be present.
+        if (standardDateProps.timeZoneName) {
+            if (!standardDateProps.hour) {
+                standardDateProps.hour = '2-digit';
+            }
+            if (!standardDateProps.minute) {
+                standardDateProps.minute = '2-digit';
+            }
+        }
+        // only support short timezone names
+        if (standardDateProps.timeZoneName === 'long') {
+            standardDateProps.timeZoneName = 'short';
+        }
+        // if requesting to display seconds, MUST display minutes
+        if (extendedSettings.omitZeroMinute && (standardDateProps.second || standardDateProps.millisecond)) {
+            delete extendedSettings.omitZeroMinute;
+        }
+    }
+    function postProcess(s, date, standardDateProps, extendedSettings, context) {
+        s = s.replace(LTR_RE, ''); // remove left-to-right control chars. do first. good for other regexes
+        if (standardDateProps.timeZoneName === 'short') {
+            s = injectTzoStr(s, (context.timeZone === 'UTC' || date.timeZoneOffset == null) ?
+                'UTC' : // important to normalize for IE, which does "GMT"
+                formatTimeZoneOffset(date.timeZoneOffset));
+        }
+        if (extendedSettings.omitCommas) {
+            s = s.replace(COMMA_RE, '').trim();
+        }
+        if (extendedSettings.omitZeroMinute) {
+            s = s.replace(':00', ''); // zeroFormat doesn't always achieve this
+        }
+        // ^ do anything that might create adjacent spaces before this point,
+        // because MERIDIEM_RE likes to eat up loading spaces
+        if (extendedSettings.meridiem === false) {
+            s = s.replace(MERIDIEM_RE, '').trim();
+        }
+        else if (extendedSettings.meridiem === 'narrow') { // a/p
+            s = s.replace(MERIDIEM_RE, function (m0, m1) {
+                return m1.toLocaleLowerCase();
+            });
+        }
+        else if (extendedSettings.meridiem === 'short') { // am/pm
+            s = s.replace(MERIDIEM_RE, function (m0, m1) {
+                return m1.toLocaleLowerCase() + 'm';
+            });
+        }
+        else if (extendedSettings.meridiem === 'lowercase') { // other meridiem transformers already converted to lowercase
+            s = s.replace(MERIDIEM_RE, function (m0) {
+                return m0.toLocaleLowerCase();
+            });
+        }
+        s = s.replace(MULTI_SPACE_RE, ' ');
+        s = s.trim();
+        return s;
+    }
+    function injectTzoStr(s, tzoStr) {
+        var replaced = false;
+        s = s.replace(UTC_RE, function () {
+            replaced = true;
+            return tzoStr;
+        });
+        // IE11 doesn't include UTC/GMT in the original string, so append to end
+        if (!replaced) {
+            s += ' ' + tzoStr;
+        }
+        return s;
+    }
+    function formatWeekNumber(num, weekText, locale, display) {
+        var parts = [];
+        if (display === 'narrow') {
+            parts.push(weekText);
+        }
+        else if (display === 'short') {
+            parts.push(weekText, ' ');
+        }
+        // otherwise, considered 'numeric'
+        parts.push(locale.simpleNumberFormat.format(num));
+        if (locale.options.direction === 'rtl') { // TODO: use control characters instead?
+            parts.reverse();
+        }
+        return parts.join('');
+    }
+    // Range Formatting Utils
+    // 0 = exactly the same
+    // 1 = different by time
+    // and bigger
+    function computeMarkerDiffSeverity(d0, d1, ca) {
+        if (ca.getMarkerYear(d0) !== ca.getMarkerYear(d1)) {
+            return 5;
+        }
+        if (ca.getMarkerMonth(d0) !== ca.getMarkerMonth(d1)) {
+            return 4;
+        }
+        if (ca.getMarkerDay(d0) !== ca.getMarkerDay(d1)) {
+            return 2;
+        }
+        if (timeAsMs(d0) !== timeAsMs(d1)) {
+            return 1;
+        }
+        return 0;
+    }
+    function computePartialFormattingOptions(options, biggestUnit) {
+        var partialOptions = {};
+        for (var name_2 in options) {
+            if (!(name_2 in STANDARD_DATE_PROP_SEVERITIES) || // not a date part prop (like timeZone)
+                STANDARD_DATE_PROP_SEVERITIES[name_2] <= biggestUnit) {
+                partialOptions[name_2] = options[name_2];
+            }
+        }
+        return partialOptions;
+    }
+    function findCommonInsertion(full0, partial0, full1, partial1) {
+        var i0 = 0;
+        while (i0 < full0.length) {
+            var found0 = full0.indexOf(partial0, i0);
+            if (found0 === -1) {
+                break;
+            }
+            var before0 = full0.substr(0, found0);
+            i0 = found0 + partial0.length;
+            var after0 = full0.substr(i0);
+            var i1 = 0;
+            while (i1 < full1.length) {
+                var found1 = full1.indexOf(partial1, i1);
+                if (found1 === -1) {
+                    break;
+                }
+                var before1 = full1.substr(0, found1);
+                i1 = found1 + partial1.length;
+                var after1 = full1.substr(i1);
+                if (before0 === before1 && after0 === after1) {
+                    return {
+                        before: before0,
+                        after: after0
+                    };
+                }
+            }
+        }
+        return null;
+    }
+
+    function expandZonedMarker(dateInfo, calendarSystem) {
+        var a = calendarSystem.markerToArray(dateInfo.marker);
+        return {
+            marker: dateInfo.marker,
+            timeZoneOffset: dateInfo.timeZoneOffset,
+            array: a,
+            year: a[0],
+            month: a[1],
+            day: a[2],
+            hour: a[3],
+            minute: a[4],
+            second: a[5],
+            millisecond: a[6]
+        };
+    }
+
+    function createVerboseFormattingArg(start, end, context, betterDefaultSeparator) {
+        var startInfo = expandZonedMarker(start, context.calendarSystem);
+        var endInfo = end ? expandZonedMarker(end, context.calendarSystem) : null;
+        return {
+            date: startInfo,
+            start: startInfo,
+            end: endInfo,
+            timeZone: context.timeZone,
+            localeCodes: context.locale.codes,
+            defaultSeparator: betterDefaultSeparator || context.defaultSeparator
+        };
+    }
+
+    /*
+    TODO: fix the terminology of "formatter" vs "formatting func"
+    */
+    /*
+    At the time of instantiation, this object does not know which cmd-formatting system it will use.
+    It receives this at the time of formatting, as a setting.
+    */
+    var CmdFormatter = /** @class */ (function () {
+        function CmdFormatter(cmdStr) {
+            this.cmdStr = cmdStr;
+        }
+        CmdFormatter.prototype.format = function (date, context, betterDefaultSeparator) {
+            return context.cmdFormatter(this.cmdStr, createVerboseFormattingArg(date, null, context, betterDefaultSeparator));
+        };
+        CmdFormatter.prototype.formatRange = function (start, end, context, betterDefaultSeparator) {
+            return context.cmdFormatter(this.cmdStr, createVerboseFormattingArg(start, end, context, betterDefaultSeparator));
+        };
+        return CmdFormatter;
+    }());
+
+    var FuncFormatter = /** @class */ (function () {
+        function FuncFormatter(func) {
+            this.func = func;
+        }
+        FuncFormatter.prototype.format = function (date, context, betterDefaultSeparator) {
+            return this.func(createVerboseFormattingArg(date, null, context, betterDefaultSeparator));
+        };
+        FuncFormatter.prototype.formatRange = function (start, end, context, betterDefaultSeparator) {
+            return this.func(createVerboseFormattingArg(start, end, context, betterDefaultSeparator));
+        };
+        return FuncFormatter;
+    }());
+
+    function createFormatter(input) {
+        if (typeof input === 'object' && input) { // non-null object
+            return new NativeFormatter(input);
+        }
+        else if (typeof input === 'string') {
+            return new CmdFormatter(input);
+        }
+        else if (typeof input === 'function') {
+            return new FuncFormatter(input);
+        }
+    }
+
+    // base options
+    // ------------
+    var BASE_OPTION_REFINERS = {
+        navLinkDayClick: identity,
+        navLinkWeekClick: identity,
+        duration: createDuration,
+        bootstrapFontAwesome: identity,
+        buttonIcons: identity,
+        customButtons: identity,
+        defaultAllDayEventDuration: createDuration,
+        defaultTimedEventDuration: createDuration,
+        nextDayThreshold: createDuration,
+        scrollTime: createDuration,
+        slotMinTime: createDuration,
+        slotMaxTime: createDuration,
+        dayPopoverFormat: createFormatter,
+        slotDuration: createDuration,
+        snapDuration: createDuration,
+        headerToolbar: identity,
+        footerToolbar: identity,
+        defaultRangeSeparator: String,
+        titleRangeSeparator: String,
+        forceEventDuration: Boolean,
+        dayHeaders: Boolean,
+        dayHeaderFormat: createFormatter,
+        dayHeaderClassNames: identity,
+        dayHeaderContent: identity,
+        dayHeaderDidMount: identity,
+        dayHeaderWillUnmount: identity,
+        dayCellClassNames: identity,
+        dayCellContent: identity,
+        dayCellDidMount: identity,
+        dayCellWillUnmount: identity,
+        initialView: String,
+        aspectRatio: Number,
+        weekends: Boolean,
+        weekNumberCalculation: identity,
+        weekNumbers: Boolean,
+        weekNumberClassNames: identity,
+        weekNumberContent: identity,
+        weekNumberDidMount: identity,
+        weekNumberWillUnmount: identity,
+        editable: Boolean,
+        viewClassNames: identity,
+        viewDidMount: identity,
+        viewWillUnmount: identity,
+        nowIndicator: Boolean,
+        nowIndicatorClassNames: identity,
+        nowIndicatorContent: identity,
+        nowIndicatorDidMount: identity,
+        nowIndicatorWillUnmount: identity,
+        showNonCurrentDates: Boolean,
+        lazyFetching: Boolean,
+        startParam: String,
+        endParam: String,
+        timeZoneParam: String,
+        timeZone: String,
+        locales: identity,
+        locale: identity,
+        themeSystem: String,
+        dragRevertDuration: Number,
+        dragScroll: Boolean,
+        allDayMaintainDuration: Boolean,
+        unselectAuto: Boolean,
+        dropAccept: identity,
+        eventOrder: parseFieldSpecs,
+        handleWindowResize: Boolean,
+        windowResizeDelay: Number,
+        longPressDelay: Number,
+        eventDragMinDistance: Number,
+        expandRows: Boolean,
+        height: identity,
+        contentHeight: identity,
+        direction: String,
+        weekNumberFormat: createFormatter,
+        eventResizableFromStart: Boolean,
+        displayEventTime: Boolean,
+        displayEventEnd: Boolean,
+        weekText: String,
+        progressiveEventRendering: Boolean,
+        businessHours: identity,
+        initialDate: identity,
+        now: identity,
+        eventDataTransform: identity,
+        stickyHeaderDates: identity,
+        stickyFooterScrollbar: identity,
+        viewHeight: identity,
+        defaultAllDay: Boolean,
+        eventSourceFailure: identity,
+        eventSourceSuccess: identity,
+        eventDisplay: String,
+        eventStartEditable: Boolean,
+        eventDurationEditable: Boolean,
+        eventOverlap: identity,
+        eventConstraint: identity,
+        eventAllow: identity,
+        eventBackgroundColor: String,
+        eventBorderColor: String,
+        eventTextColor: String,
+        eventColor: String,
+        eventClassNames: identity,
+        eventContent: identity,
+        eventDidMount: identity,
+        eventWillUnmount: identity,
+        selectConstraint: identity,
+        selectOverlap: identity,
+        selectAllow: identity,
+        droppable: Boolean,
+        unselectCancel: String,
+        slotLabelFormat: identity,
+        slotLaneClassNames: identity,
+        slotLaneContent: identity,
+        slotLaneDidMount: identity,
+        slotLaneWillUnmount: identity,
+        slotLabelClassNames: identity,
+        slotLabelContent: identity,
+        slotLabelDidMount: identity,
+        slotLabelWillUnmount: identity,
+        dayMaxEvents: identity,
+        dayMaxEventRows: identity,
+        dayMinWidth: Number,
+        slotLabelInterval: createDuration,
+        allDayText: String,
+        allDayClassNames: identity,
+        allDayContent: identity,
+        allDayDidMount: identity,
+        allDayWillUnmount: identity,
+        slotMinWidth: Number,
+        navLinks: Boolean,
+        eventTimeFormat: createFormatter,
+        rerenderDelay: Number,
+        moreLinkText: identity,
+        selectMinDistance: Number,
+        selectable: Boolean,
+        selectLongPressDelay: Number,
+        eventLongPressDelay: Number,
+        selectMirror: Boolean,
+        eventMinHeight: Number,
+        slotEventOverlap: Boolean,
+        plugins: identity,
+        firstDay: Number,
+        dayCount: Number,
+        dateAlignment: String,
+        dateIncrement: createDuration,
+        hiddenDays: identity,
+        monthMode: Boolean,
+        fixedWeekCount: Boolean,
+        validRange: identity,
+        visibleRange: identity,
+        titleFormat: identity,
+        // only used by list-view, but languages define the value, so we need it in base options
+        noEventsText: String
+    };
+    // do NOT give a type here. need `typeof BASE_OPTION_DEFAULTS` to give real results.
+    // raw values.
+    var BASE_OPTION_DEFAULTS = {
+        eventDisplay: 'auto',
+        defaultRangeSeparator: ' - ',
+        titleRangeSeparator: ' \u2013 ',
+        defaultTimedEventDuration: '01:00:00',
+        defaultAllDayEventDuration: { day: 1 },
+        forceEventDuration: false,
+        nextDayThreshold: '00:00:00',
+        dayHeaders: true,
+        initialView: '',
+        aspectRatio: 1.35,
+        headerToolbar: {
+            start: 'title',
+            center: '',
+            end: 'today prev,next'
+        },
+        weekends: true,
+        weekNumbers: false,
+        weekNumberCalculation: 'local',
+        editable: false,
+        nowIndicator: false,
+        scrollTime: '06:00:00',
+        slotMinTime: '00:00:00',
+        slotMaxTime: '24:00:00',
+        showNonCurrentDates: true,
+        lazyFetching: true,
+        startParam: 'start',
+        endParam: 'end',
+        timeZoneParam: 'timeZone',
+        timeZone: 'local',
+        locales: [],
+        locale: '',
+        themeSystem: 'standard',
+        dragRevertDuration: 500,
+        dragScroll: true,
+        allDayMaintainDuration: false,
+        unselectAuto: true,
+        dropAccept: '*',
+        eventOrder: 'start,-duration,allDay,title',
+        dayPopoverFormat: { month: 'long', day: 'numeric', year: 'numeric' },
+        handleWindowResize: true,
+        windowResizeDelay: 100,
+        longPressDelay: 1000,
+        eventDragMinDistance: 5,
+        expandRows: false,
+        navLinks: false,
+        selectable: false
+    };
+    // calendar listeners
+    // ------------------
+    var CALENDAR_LISTENER_REFINERS = {
+        datesSet: identity,
+        eventsSet: identity,
+        eventAdd: identity,
+        eventChange: identity,
+        eventRemove: identity,
+        windowResize: identity,
+        eventClick: identity,
+        eventMouseEnter: identity,
+        eventMouseLeave: identity,
+        select: identity,
+        unselect: identity,
+        loading: identity,
+        // internal
+        _unmount: identity,
+        _beforeprint: identity,
+        _afterprint: identity,
+        _noEventDrop: identity,
+        _noEventResize: identity,
+        _resize: identity,
+        _scrollRequest: identity
+    };
+    // calendar-specific options
+    // -------------------------
+    var CALENDAR_OPTION_REFINERS = {
+        buttonText: identity,
+        views: identity,
+        plugins: identity,
+        initialEvents: identity,
+        events: identity,
+        eventSources: identity
+    };
+    var COMPLEX_OPTION_COMPARATORS = {
+        headerToolbar: isBoolComplexEqual,
+        footerToolbar: isBoolComplexEqual,
+        buttonText: isBoolComplexEqual,
+        buttonIcons: isBoolComplexEqual
+    };
+    function isBoolComplexEqual(a, b) {
+        if (typeof a === 'object' && typeof b === 'object' && a && b) { // both non-null objects
+            return isPropsEqual(a, b);
+        }
+        else {
+            return a === b;
+        }
+    }
+    // view-specific options
+    // ---------------------
+    var VIEW_OPTION_REFINERS = {
+        type: String,
+        component: identity,
+        buttonText: String,
+        buttonTextKey: String,
+        dateProfileGeneratorClass: identity,
+        usesMinMaxTime: Boolean,
+        classNames: identity,
+        content: identity,
+        didMount: identity,
+        willUnmount: identity
+    };
+    // util funcs
+    // ----------------------------------------------------------------------------------------------------
+    function mergeRawOptions(optionSets) {
+        return mergeProps(optionSets, COMPLEX_OPTION_COMPARATORS);
+    }
+    function refineProps(input, refiners) {
+        var refined = {};
+        var extra = {};
+        for (var propName in refiners) {
+            if (propName in input) {
+                refined[propName] = refiners[propName](input[propName]);
+            }
+        }
+        for (var propName in input) {
+            if (!(propName in refiners)) {
+                extra[propName] = input[propName];
+            }
+        }
+        return { refined: refined, extra: extra };
+    }
+    function identity(raw) {
+        return raw;
+    }
+
+    function parseEvents(rawEvents, eventSource, context, allowOpenRange) {
+        var eventStore = createEmptyEventStore();
+        var eventRefiners = buildEventRefiners(context);
+        for (var _i = 0, rawEvents_1 = rawEvents; _i < rawEvents_1.length; _i++) {
+            var rawEvent = rawEvents_1[_i];
+            var tuple = parseEvent(rawEvent, eventSource, context, allowOpenRange, eventRefiners);
+            if (tuple) {
+                eventTupleToStore(tuple, eventStore);
+            }
+        }
+        return eventStore;
+    }
+    function eventTupleToStore(tuple, eventStore) {
+        if (eventStore === void 0) { eventStore = createEmptyEventStore(); }
+        eventStore.defs[tuple.def.defId] = tuple.def;
+        if (tuple.instance) {
+            eventStore.instances[tuple.instance.instanceId] = tuple.instance;
+        }
+        return eventStore;
+    }
+    // retrieves events that have the same groupId as the instance specified by `instanceId`
+    // or they are the same as the instance.
+    // why might instanceId not be in the store? an event from another calendar?
+    function getRelevantEvents(eventStore, instanceId) {
+        var instance = eventStore.instances[instanceId];
+        if (instance) {
+            var def_1 = eventStore.defs[instance.defId];
+            // get events/instances with same group
+            var newStore = filterEventStoreDefs(eventStore, function (lookDef) {
+                return isEventDefsGrouped(def_1, lookDef);
+            });
+            // add the original
+            // TODO: wish we could use eventTupleToStore or something like it
+            newStore.defs[def_1.defId] = def_1;
+            newStore.instances[instance.instanceId] = instance;
+            return newStore;
+        }
+        return createEmptyEventStore();
+    }
+    function isEventDefsGrouped(def0, def1) {
+        return Boolean(def0.groupId && def0.groupId === def1.groupId);
+    }
+    function createEmptyEventStore() {
+        return { defs: {}, instances: {} };
+    }
+    function mergeEventStores(store0, store1) {
+        return {
+            defs: __assign(__assign({}, store0.defs), store1.defs),
+            instances: __assign(__assign({}, store0.instances), store1.instances)
+        };
+    }
+    function filterEventStoreDefs(eventStore, filterFunc) {
+        var defs = filterHash(eventStore.defs, filterFunc);
+        var instances = filterHash(eventStore.instances, function (instance) {
+            return defs[instance.defId]; // still exists?
+        });
+        return { defs: defs, instances: instances };
+    }
+    function excludeSubEventStore(master, sub) {
+        var defs = master.defs, instances = master.instances;
+        var filteredDefs = {};
+        var filteredInstances = {};
+        for (var defId in defs) {
+            if (!sub.defs[defId]) { // not explicitly excluded
+                filteredDefs[defId] = defs[defId];
+            }
+        }
+        for (var instanceId in instances) {
+            if (!sub.instances[instanceId] && // not explicitly excluded
+                filteredDefs[instances[instanceId].defId] // def wasn't filtered away
+            ) {
+                filteredInstances[instanceId] = instances[instanceId];
+            }
+        }
+        return {
+            defs: filteredDefs,
+            instances: filteredInstances
+        };
+    }
+
+    function normalizeConstraint(input, context) {
+        if (Array.isArray(input)) {
+            return parseEvents(input, null, context, true); // allowOpenRange=true
+        }
+        else if (typeof input === 'object' && input) { // non-null object
+            return parseEvents([input], null, context, true); // allowOpenRange=true
+        }
+        else if (input != null) {
+            return String(input);
+        }
+        else {
+            return null;
+        }
+    }
+
+    function parseClassNames(raw) {
+        if (Array.isArray(raw)) {
+            return raw;
+        }
+        else if (typeof raw === 'string') {
+            return raw.split(/\s+/);
+        }
+        else {
+            return [];
+        }
+    }
+
+    // TODO: better called "EventSettings" or "EventConfig"
+    // TODO: move this file into structs
+    // TODO: separate constraint/overlap/allow, because selection uses only that, not other props
+    var EVENT_UI_REFINERS = {
+        display: String,
+        editable: Boolean,
+        startEditable: Boolean,
+        durationEditable: Boolean,
+        constraint: identity,
+        overlap: identity,
+        allow: identity,
+        className: parseClassNames,
+        classNames: parseClassNames,
+        color: String,
+        backgroundColor: String,
+        borderColor: String,
+        textColor: String
+    };
+    function createEventUi(refined, context) {
+        var constraint = normalizeConstraint(refined.constraint, context);
+        return {
+            display: refined.display || null,
+            startEditable: refined.startEditable != null ? refined.startEditable : refined.editable,
+            durationEditable: refined.durationEditable != null ? refined.durationEditable : refined.editable,
+            constraints: constraint != null ? [constraint] : [],
+            overlap: refined.overlap != null ? refined.overlap : null,
+            allows: refined.allow != null ? [refined.allow] : [],
+            backgroundColor: refined.backgroundColor || refined.color || '',
+            borderColor: refined.borderColor || refined.color || '',
+            textColor: refined.textColor || '',
+            classNames: (refined.className || []).concat(refined.classNames || []) // join singular and plural
+        };
+    }
+    // TODO: prevent against problems with <2 args!
+    function combineEventUis(uis) {
+        return uis.reduce(combineTwoEventUis, EMPTY_EVENT_UI);
+    }
+    function combineTwoEventUis(item0, item1) {
+        return {
+            display: item1.display != null ? item1.display : item0.display,
+            startEditable: item1.startEditable != null ? item1.startEditable : item0.startEditable,
+            durationEditable: item1.durationEditable != null ? item1.durationEditable : item0.durationEditable,
+            constraints: item0.constraints.concat(item1.constraints),
+            overlap: typeof item1.overlap === 'boolean' ? item1.overlap : item0.overlap,
+            allows: item0.allows.concat(item1.allows),
+            backgroundColor: item1.backgroundColor || item0.backgroundColor,
+            borderColor: item1.borderColor || item0.borderColor,
+            textColor: item1.textColor || item0.textColor,
+            classNames: item0.classNames.concat(item1.classNames)
+        };
+    }
+    var EMPTY_EVENT_UI = {
+        display: null,
+        startEditable: null,
+        durationEditable: null,
+        constraints: [],
+        overlap: null,
+        allows: [],
+        backgroundColor: '',
+        borderColor: '',
+        textColor: '',
+        classNames: []
+    };
+
+    var EVENT_NON_DATE_REFINERS = {
+        id: String,
+        groupId: String,
+        title: String,
+        url: String
+    };
+    var EVENT_DATE_REFINERS = {
+        start: identity,
+        end: identity,
+        date: identity,
+        allDay: Boolean
+    };
+    var EVENT_REFINERS = __assign(__assign(__assign({}, EVENT_NON_DATE_REFINERS), EVENT_DATE_REFINERS), { extendedProps: identity });
+    function parseEvent(raw, eventSource, context, allowOpenRange, refiners) {
+        if (refiners === void 0) { refiners = buildEventRefiners(context); }
+        var _a = refineEventDef(raw, context, refiners), refined = _a.refined, extra = _a.extra;
+        var defaultAllDay = computeIsDefaultAllDay(eventSource, context);
+        var recurringRes = parseRecurring(refined, defaultAllDay, context.dateEnv, context.pluginHooks.recurringTypes);
+        if (recurringRes) {
+            var def = parseEventDef(refined, extra, eventSource ? eventSource.sourceId : '', recurringRes.allDay, Boolean(recurringRes.duration), context);
+            def.recurringDef = {
+                typeId: recurringRes.typeId,
+                typeData: recurringRes.typeData,
+                duration: recurringRes.duration
+            };
+            return { def: def, instance: null };
+        }
+        else {
+            var singleRes = parseSingle(refined, defaultAllDay, context, allowOpenRange);
+            if (singleRes) {
+                var def = parseEventDef(refined, extra, eventSource ? eventSource.sourceId : '', singleRes.allDay, singleRes.hasEnd, context);
+                var instance = createEventInstance(def.defId, singleRes.range, singleRes.forcedStartTzo, singleRes.forcedEndTzo);
+                return { def: def, instance: instance };
+            }
+        }
+        return null;
+    }
+    function refineEventDef(raw, context, refiners) {
+        if (refiners === void 0) { refiners = buildEventRefiners(context); }
+        return refineProps(raw, refiners);
+    }
+    function buildEventRefiners(context) {
+        return __assign(__assign(__assign({}, EVENT_UI_REFINERS), EVENT_REFINERS), context.pluginHooks.eventRefiners);
+    }
+    /*
+    Will NOT populate extendedProps with the leftover properties.
+    Will NOT populate date-related props.
+    */
+    function parseEventDef(refined, extra, sourceId, allDay, hasEnd, context) {
+        var def = {
+            title: refined.title || '',
+            groupId: refined.groupId || '',
+            publicId: refined.id || '',
+            url: refined.url || '',
+            recurringDef: null,
+            defId: guid(),
+            sourceId: sourceId,
+            allDay: allDay,
+            hasEnd: hasEnd,
+            ui: createEventUi(refined, context),
+            extendedProps: __assign(__assign({}, (refined.extendedProps || {})), extra)
+        };
+        for (var _i = 0, _a = context.pluginHooks.eventDefMemberAdders; _i < _a.length; _i++) {
+            var memberAdder = _a[_i];
+            __assign(def, memberAdder(refined));
+        }
+        // help out EventApi from having user modify props
+        Object.freeze(def.ui.classNames);
+        Object.freeze(def.extendedProps);
+        return def;
+    }
+    function parseSingle(refined, defaultAllDay, context, allowOpenRange) {
+        var allDay = refined.allDay;
+        var startMeta;
+        var startMarker = null;
+        var hasEnd = false;
+        var endMeta;
+        var endMarker = null;
+        var startInput = refined.start != null ? refined.start : refined.date;
+        startMeta = context.dateEnv.createMarkerMeta(startInput);
+        if (startMeta) {
+            startMarker = startMeta.marker;
+        }
+        else if (!allowOpenRange) {
+            return null;
+        }
+        if (refined.end != null) {
+            endMeta = context.dateEnv.createMarkerMeta(refined.end);
+        }
+        if (allDay == null) {
+            if (defaultAllDay != null) {
+                allDay = defaultAllDay;
+            }
+            else {
+                // fall back to the date props LAST
+                allDay = (!startMeta || startMeta.isTimeUnspecified) &&
+                    (!endMeta || endMeta.isTimeUnspecified);
+            }
+        }
+        if (allDay && startMarker) {
+            startMarker = startOfDay(startMarker);
+        }
+        if (endMeta) {
+            endMarker = endMeta.marker;
+            if (allDay) {
+                endMarker = startOfDay(endMarker);
+            }
+            if (startMarker && endMarker <= startMarker) {
+                endMarker = null;
+            }
+        }
+        if (endMarker) {
+            hasEnd = true;
+        }
+        else if (!allowOpenRange) {
+            hasEnd = context.options.forceEventDuration || false;
+            endMarker = context.dateEnv.add(startMarker, allDay ?
+                context.options.defaultAllDayEventDuration :
+                context.options.defaultTimedEventDuration);
+        }
+        return {
+            allDay: allDay,
+            hasEnd: hasEnd,
+            range: { start: startMarker, end: endMarker },
+            forcedStartTzo: startMeta ? startMeta.forcedTzo : null,
+            forcedEndTzo: endMeta ? endMeta.forcedTzo : null
+        };
+    }
+    function computeIsDefaultAllDay(eventSource, context) {
+        var res = null;
+        if (eventSource) {
+            res = eventSource.defaultAllDay;
+        }
+        if (res == null) {
+            res = context.options.defaultAllDay;
+        }
+        return res;
+    }
+
+    /* Date stuff that doesn't belong in datelib core
+    ----------------------------------------------------------------------------------------------------------------------*/
+    // given a timed range, computes an all-day range that has the same exact duration,
+    // but whose start time is aligned with the start of the day.
+    function computeAlignedDayRange(timedRange) {
+        var dayCnt = Math.floor(diffDays(timedRange.start, timedRange.end)) || 1;
+        var start = startOfDay(timedRange.start);
+        var end = addDays(start, dayCnt);
+        return { start: start, end: end };
+    }
+    // given a timed range, computes an all-day range based on how for the end date bleeds into the next day
+    // TODO: give nextDayThreshold a default arg
+    function computeVisibleDayRange(timedRange, nextDayThreshold) {
+        if (nextDayThreshold === void 0) { nextDayThreshold = createDuration(0); }
+        var startDay = null;
+        var endDay = null;
+        if (timedRange.end) {
+            endDay = startOfDay(timedRange.end);
+            var endTimeMS = timedRange.end.valueOf() - endDay.valueOf(); // # of milliseconds into `endDay`
+            // If the end time is actually inclusively part of the next day and is equal to or
+            // beyond the next day threshold, adjust the end to be the exclusive end of `endDay`.
+            // Otherwise, leaving it as inclusive will cause it to exclude `endDay`.
+            if (endTimeMS && endTimeMS >= asRoughMs(nextDayThreshold)) {
+                endDay = addDays(endDay, 1);
+            }
+        }
+        if (timedRange.start) {
+            startDay = startOfDay(timedRange.start); // the beginning of the day the range starts
+            // If end is within `startDay` but not past nextDayThreshold, assign the default duration of one day.
+            if (endDay && endDay <= startDay) {
+                endDay = addDays(startDay, 1);
+            }
+        }
+        return { start: startDay, end: endDay };
+    }
+    // spans from one day into another?
+    function isMultiDayRange(range) {
+        var visibleRange = computeVisibleDayRange(range);
+        return diffDays(visibleRange.start, visibleRange.end) > 1;
+    }
+    function diffDates(date0, date1, dateEnv, largeUnit) {
+        if (largeUnit === 'year') {
+            return createDuration(dateEnv.diffWholeYears(date0, date1), 'year');
+        }
+        else if (largeUnit === 'month') {
+            return createDuration(dateEnv.diffWholeMonths(date0, date1), 'month');
+        }
+        else {
+            return diffDayAndTime(date0, date1); // returns a duration
+        }
+    }
+
+    function parseRange(input, dateEnv) {
+        var start = null;
+        var end = null;
+        if (input.start) {
+            start = dateEnv.createMarker(input.start);
+        }
+        if (input.end) {
+            end = dateEnv.createMarker(input.end);
+        }
+        if (!start && !end) {
+            return null;
+        }
+        if (start && end && end < start) {
+            return null;
+        }
+        return { start: start, end: end };
+    }
+    // SIDE-EFFECT: will mutate ranges.
+    // Will return a new array result.
+    function invertRanges(ranges, constraintRange) {
+        var invertedRanges = [];
+        var start = constraintRange.start; // the end of the previous range. the start of the new range
+        var i;
+        var dateRange;
+        // ranges need to be in order. required for our date-walking algorithm
+        ranges.sort(compareRanges);
+        for (i = 0; i < ranges.length; i++) {
+            dateRange = ranges[i];
+            // add the span of time before the event (if there is any)
+            if (dateRange.start > start) { // compare millisecond time (skip any ambig logic)
+                invertedRanges.push({ start: start, end: dateRange.start });
+            }
+            if (dateRange.end > start) {
+                start = dateRange.end;
+            }
+        }
+        // add the span of time after the last event (if there is any)
+        if (start < constraintRange.end) { // compare millisecond time (skip any ambig logic)
+            invertedRanges.push({ start: start, end: constraintRange.end });
+        }
+        return invertedRanges;
+    }
+    function compareRanges(range0, range1) {
+        return range0.start.valueOf() - range1.start.valueOf(); // earlier ranges go first
+    }
+    function intersectRanges(range0, range1) {
+        var start = range0.start;
+        var end = range0.end;
+        var newRange = null;
+        if (range1.start !== null) {
+            if (start === null) {
+                start = range1.start;
+            }
+            else {
+                start = new Date(Math.max(start.valueOf(), range1.start.valueOf()));
+            }
+        }
+        if (range1.end != null) {
+            if (end === null) {
+                end = range1.end;
+            }
+            else {
+                end = new Date(Math.min(end.valueOf(), range1.end.valueOf()));
+            }
+        }
+        if (start === null || end === null || start < end) {
+            newRange = { start: start, end: end };
+        }
+        return newRange;
+    }
+    function rangesEqual(range0, range1) {
+        return (range0.start === null ? null : range0.start.valueOf()) === (range1.start === null ? null : range1.start.valueOf()) &&
+            (range0.end === null ? null : range0.end.valueOf()) === (range1.end === null ? null : range1.end.valueOf());
+    }
+    function rangesIntersect(range0, range1) {
+        return (range0.end === null || range1.start === null || range0.end > range1.start) &&
+            (range0.start === null || range1.end === null || range0.start < range1.end);
+    }
+    function rangeContainsRange(outerRange, innerRange) {
+        return (outerRange.start === null || (innerRange.start !== null && innerRange.start >= outerRange.start)) &&
+            (outerRange.end === null || (innerRange.end !== null && innerRange.end <= outerRange.end));
+    }
+    function rangeContainsMarker(range, date) {
+        return (range.start === null || date >= range.start) &&
+            (range.end === null || date < range.end);
+    }
+    // If the given date is not within the given range, move it inside.
+    // (If it's past the end, make it one millisecond before the end).
+    function constrainMarkerToRange(date, range) {
+        if (range.start != null && date < range.start) {
+            return range.start;
+        }
+        if (range.end != null && date >= range.end) {
+            return new Date(range.end.valueOf() - 1);
+        }
+        return date;
+    }
+
+    /*
+    Specifying nextDayThreshold signals that all-day ranges should be sliced.
+    */
+    function sliceEventStore(eventStore, eventUiBases, framingRange, nextDayThreshold) {
+        var inverseBgByGroupId = {};
+        var inverseBgByDefId = {};
+        var defByGroupId = {};
+        var bgRanges = [];
+        var fgRanges = [];
+        var eventUis = compileEventUis(eventStore.defs, eventUiBases);
+        for (var defId in eventStore.defs) {
+            var def = eventStore.defs[defId];
+            var ui = eventUis[def.defId];
+            if (ui.display === 'inverse-background') {
+                if (def.groupId) {
+                    inverseBgByGroupId[def.groupId] = [];
+                    if (!defByGroupId[def.groupId]) {
+                        defByGroupId[def.groupId] = def;
+                    }
+                }
+                else {
+                    inverseBgByDefId[defId] = [];
+                }
+            }
+        }
+        for (var instanceId in eventStore.instances) {
+            var instance = eventStore.instances[instanceId];
+            var def = eventStore.defs[instance.defId];
+            var ui = eventUis[def.defId];
+            var origRange = instance.range;
+            var normalRange = (!def.allDay && nextDayThreshold) ?
+                computeVisibleDayRange(origRange, nextDayThreshold) :
+                origRange;
+            var slicedRange = intersectRanges(normalRange, framingRange);
+            if (slicedRange) {
+                if (ui.display === 'inverse-background') {
+                    if (def.groupId) {
+                        inverseBgByGroupId[def.groupId].push(slicedRange);
+                    }
+                    else {
+                        inverseBgByDefId[instance.defId].push(slicedRange);
+                    }
+                }
+                else if (ui.display !== 'none') {
+                    (ui.display === 'background' ? bgRanges : fgRanges).push({
+                        def: def,
+                        ui: ui,
+                        instance: instance,
+                        range: slicedRange,
+                        isStart: normalRange.start && normalRange.start.valueOf() === slicedRange.start.valueOf(),
+                        isEnd: normalRange.end && normalRange.end.valueOf() === slicedRange.end.valueOf()
+                    });
+                }
+            }
+        }
+        for (var groupId in inverseBgByGroupId) { // BY GROUP
+            var ranges = inverseBgByGroupId[groupId];
+            var invertedRanges = invertRanges(ranges, framingRange);
+            for (var _i = 0, invertedRanges_1 = invertedRanges; _i < invertedRanges_1.length; _i++) {
+                var invertedRange = invertedRanges_1[_i];
+                var def = defByGroupId[groupId];
+                var ui = eventUis[def.defId];
+                bgRanges.push({
+                    def: def,
+                    ui: ui,
+                    instance: null,
+                    range: invertedRange,
+                    isStart: false,
+                    isEnd: false
+                });
+            }
+        }
+        for (var defId in inverseBgByDefId) {
+            var ranges = inverseBgByDefId[defId];
+            var invertedRanges = invertRanges(ranges, framingRange);
+            for (var _a = 0, invertedRanges_2 = invertedRanges; _a < invertedRanges_2.length; _a++) {
+                var invertedRange = invertedRanges_2[_a];
+                bgRanges.push({
+                    def: eventStore.defs[defId],
+                    ui: eventUis[defId],
+                    instance: null,
+                    range: invertedRange,
+                    isStart: false,
+                    isEnd: false
+                });
+            }
+        }
+        return { bg: bgRanges, fg: fgRanges };
+    }
+    function hasBgRendering(def) {
+        return def.ui.display === 'background' || def.ui.display === 'inverse-background';
+    }
+    function setElSeg(el, seg) {
+        el.fcSeg = seg;
+    }
+    function getElSeg(el) {
+        return el.fcSeg ||
+            el.parentNode.fcSeg || // for the harness
+            null;
+    }
+    // event ui computation
+    function compileEventUis(eventDefs, eventUiBases) {
+        return mapHash(eventDefs, function (eventDef) {
+            return compileEventUi(eventDef, eventUiBases);
+        });
+    }
+    function compileEventUi(eventDef, eventUiBases) {
+        var uis = [];
+        if (eventUiBases['']) {
+            uis.push(eventUiBases['']);
+        }
+        if (eventUiBases[eventDef.defId]) {
+            uis.push(eventUiBases[eventDef.defId]);
+        }
+        uis.push(eventDef.ui);
+        return combineEventUis(uis);
+    }
+    function sortEventSegs(segs, eventOrderSpecs) {
+        var objs = segs.map(buildSegCompareObj);
+        objs.sort(function (obj0, obj1) {
+            return compareByFieldSpecs(obj0, obj1, eventOrderSpecs);
+        });
+        return objs.map(function (c) {
+            return c._seg;
+        });
+    }
+    // returns a object with all primitive props that can be compared
+    function buildSegCompareObj(seg) {
+        var eventRange = seg.eventRange;
+        var eventDef = eventRange.def;
+        var range = eventRange.instance ? eventRange.instance.range : eventRange.range;
+        var start = range.start ? range.start.valueOf() : 0; // TODO: better support for open-range events
+        var end = range.end ? range.end.valueOf() : 0; // "
+        return __assign(__assign(__assign({}, eventDef.extendedProps), eventDef), { id: eventDef.publicId, start: start,
+            end: end, duration: end - start, allDay: Number(eventDef.allDay), _seg: seg // for later retrieval
+         });
+    }
+    function computeSegDraggable(seg, context) {
+        var pluginHooks = context.pluginHooks;
+        var transformers = pluginHooks.isDraggableTransformers;
+        var _a = seg.eventRange, def = _a.def, ui = _a.ui;
+        var val = ui.startEditable;
+        for (var _i = 0, transformers_1 = transformers; _i < transformers_1.length; _i++) {
+            var transformer = transformers_1[_i];
+            val = transformer(val, def, ui, context);
+        }
+        return val;
+    }
+    function computeSegStartResizable(seg, context) {
+        return seg.isStart && seg.eventRange.ui.durationEditable && context.options.eventResizableFromStart;
+    }
+    function computeSegEndResizable(seg, context) {
+        return seg.isEnd && seg.eventRange.ui.durationEditable;
+    }
+    function buildSegTimeText(seg, timeFormat, context, defaultDisplayEventTime, // defaults to true
+    defaultDisplayEventEnd, // defaults to true
+    startOverride, endOverride) {
+        var dateEnv = context.dateEnv, options = context.options;
+        var displayEventTime = options.displayEventTime, displayEventEnd = options.displayEventEnd;
+        var eventDef = seg.eventRange.def;
+        var eventInstance = seg.eventRange.instance;
+        if (displayEventTime == null) {
+            displayEventTime = defaultDisplayEventTime !== false;
+        }
+        if (displayEventEnd == null) {
+            displayEventEnd = defaultDisplayEventEnd !== false;
+        }
+        if (displayEventTime && !eventDef.allDay && (seg.isStart || seg.isEnd)) {
+            var segStart = startOverride || (seg.isStart ? eventInstance.range.start : (seg.start || seg.eventRange.range.start));
+            var segEnd = endOverride || (seg.isEnd ? eventInstance.range.end : (seg.end || seg.eventRange.range.end));
+            if (displayEventEnd && eventDef.hasEnd) {
+                return dateEnv.formatRange(segStart, segEnd, timeFormat, {
+                    forcedStartTzo: startOverride ? null : eventInstance.forcedStartTzo,
+                    forcedEndTzo: endOverride ? null : eventInstance.forcedEndTzo
+                });
+            }
+            else {
+                return dateEnv.format(segStart, timeFormat, {
+                    forcedTzo: startOverride ? null : eventInstance.forcedStartTzo // nooooo, same
+                });
+            }
+        }
+        return '';
+    }
+    function getSegMeta(seg, todayRange, nowDate) {
+        var segRange = seg.eventRange.range;
+        return {
+            isPast: segRange.end < (nowDate || todayRange.start),
+            isFuture: segRange.start >= (nowDate || todayRange.end),
+            isToday: todayRange && rangeContainsMarker(todayRange, segRange.start)
+        };
+    }
+    function getEventClassNames(props) {
+        var classNames = ['fc-event'];
+        if (props.isMirror) {
+            classNames.push('fc-event-mirror');
+        }
+        if (props.isDraggable) {
+            classNames.push('fc-event-draggable');
+        }
+        if (props.isStartResizable || props.isEndResizable) {
+            classNames.push('fc-event-resizable');
+        }
+        if (props.isDragging) {
+            classNames.push('fc-event-dragging');
+        }
+        if (props.isResizing) {
+            classNames.push('fc-event-resizing');
+        }
+        if (props.isSelected) {
+            classNames.push('fc-event-selected');
+        }
+        if (props.isStart) {
+            classNames.push('fc-event-start');
+        }
+        if (props.isEnd) {
+            classNames.push('fc-event-end');
+        }
+        if (props.isPast) {
+            classNames.push('fc-event-past');
+        }
+        if (props.isToday) {
+            classNames.push('fc-event-today');
+        }
+        if (props.isFuture) {
+            classNames.push('fc-event-future');
+        }
+        return classNames;
+    }
+    function buildEventRangeKey(eventRange) {
+        return eventRange.instance
+            ? eventRange.instance.instanceId
+            : eventRange.def.defId + ':' + eventRange.range.start.toISOString();
+        // inverse-background events don't have specific instances. TODO: better solution
+    }
+
+    var STANDARD_PROPS = {
+        start: identity,
+        end: identity,
+        allDay: Boolean
+    };
+    function parseDateSpan(raw, dateEnv, defaultDuration) {
+        var span = parseOpenDateSpan(raw, dateEnv);
+        var range = span.range;
+        if (!range.start) {
+            return null;
+        }
+        if (!range.end) {
+            if (defaultDuration == null) {
+                return null;
+            }
+            else {
+                range.end = dateEnv.add(range.start, defaultDuration);
+            }
+        }
+        return span;
+    }
+    /*
+    TODO: somehow combine with parseRange?
+    Will return null if the start/end props were present but parsed invalidly.
+    */
+    function parseOpenDateSpan(raw, dateEnv) {
+        var _a = refineProps(raw, STANDARD_PROPS), standardProps = _a.refined, extra = _a.extra;
+        var startMeta = standardProps.start ? dateEnv.createMarkerMeta(standardProps.start) : null;
+        var endMeta = standardProps.end ? dateEnv.createMarkerMeta(standardProps.end) : null;
+        var allDay = standardProps.allDay;
+        if (allDay == null) {
+            allDay = (startMeta && startMeta.isTimeUnspecified) &&
+                (!endMeta || endMeta.isTimeUnspecified);
+        }
+        return __assign({ range: {
+                start: startMeta ? startMeta.marker : null,
+                end: endMeta ? endMeta.marker : null,
+            }, allDay: allDay }, extra);
+    }
+    function isDateSpansEqual(span0, span1) {
+        return rangesEqual(span0.range, span1.range) &&
+            span0.allDay === span1.allDay &&
+            isSpanPropsEqual(span0, span1);
+    }
+    // the NON-DATE-RELATED props
+    function isSpanPropsEqual(span0, span1) {
+        for (var propName in span1) {
+            if (propName !== 'range' && propName !== 'allDay') {
+                if (span0[propName] !== span1[propName]) {
+                    return false;
+                }
+            }
+        }
+        // are there any props that span0 has that span1 DOESN'T have?
+        // both have range/allDay, so no need to special-case.
+        for (var propName in span0) {
+            if (!(propName in span1)) {
+                return false;
+            }
+        }
+        return true;
+    }
+    function buildDateSpanApi(span, dateEnv) {
+        return __assign(__assign({}, buildRangeApi(span.range, dateEnv, span.allDay)), { allDay: span.allDay });
+    }
+    function buildRangeApiWithTimeZone(range, dateEnv, omitTime) {
+        return __assign(__assign({}, buildRangeApi(range, dateEnv, omitTime)), { timeZone: dateEnv.timeZone });
+    }
+    function buildRangeApi(range, dateEnv, omitTime) {
+        return {
+            start: dateEnv.toDate(range.start),
+            end: dateEnv.toDate(range.end),
+            startStr: dateEnv.formatIso(range.start, { omitTime: omitTime }),
+            endStr: dateEnv.formatIso(range.end, { omitTime: omitTime })
+        };
+    }
+    function fabricateEventRange(dateSpan, eventUiBases, context) {
+        var res = refineEventDef({ editable: false }, context);
+        var def = parseEventDef(res.refined, res.extra, '', // sourceId
+        dateSpan.allDay, true, // hasEnd
+        context);
+        return {
+            def: def,
+            ui: compileEventUi(def, eventUiBases),
+            instance: createEventInstance(def.defId, dateSpan.range),
+            range: dateSpan.range,
+            isStart: true,
+            isEnd: true
+        };
+    }
+
+    function triggerDateSelect(selection, pev, context) {
+        context.emitter.trigger('select', __assign(__assign({}, buildDateSpanApiWithContext(selection, context)), { jsEvent: pev ? pev.origEvent : null, view: context.viewApi || context.calendarApi.view }));
+    }
+    function triggerDateUnselect(pev, context) {
+        context.emitter.trigger('unselect', {
+            jsEvent: pev ? pev.origEvent : null,
+            view: context.viewApi || context.calendarApi.view
+        });
+    }
+    function buildDateSpanApiWithContext(dateSpan, context) {
+        var props = {};
+        for (var _i = 0, _a = context.pluginHooks.dateSpanTransforms; _i < _a.length; _i++) {
+            var transform = _a[_i];
+            __assign(props, transform(dateSpan, context));
+        }
+        __assign(props, buildDateSpanApi(dateSpan, context.dateEnv));
+        return props;
+    }
+    // Given an event's allDay status and start date, return what its fallback end date should be.
+    // TODO: rename to computeDefaultEventEnd
+    function getDefaultEventEnd(allDay, marker, context) {
+        var dateEnv = context.dateEnv, options = context.options;
+        var end = marker;
+        if (allDay) {
+            end = startOfDay(end);
+            end = dateEnv.add(end, options.defaultAllDayEventDuration);
+        }
+        else {
+            end = dateEnv.add(end, options.defaultTimedEventDuration);
+        }
+        return end;
+    }
+
+    // applies the mutation to ALL defs/instances within the event store
+    function applyMutationToEventStore(eventStore, eventConfigBase, mutation, context) {
+        var eventConfigs = compileEventUis(eventStore.defs, eventConfigBase);
+        var dest = createEmptyEventStore();
+        for (var defId in eventStore.defs) {
+            var def = eventStore.defs[defId];
+            dest.defs[defId] = applyMutationToEventDef(def, eventConfigs[defId], mutation, context);
+        }
+        for (var instanceId in eventStore.instances) {
+            var instance = eventStore.instances[instanceId];
+            var def = dest.defs[instance.defId]; // important to grab the newly modified def
+            dest.instances[instanceId] = applyMutationToEventInstance(instance, def, eventConfigs[instance.defId], mutation, context);
+        }
+        return dest;
+    }
+    function applyMutationToEventDef(eventDef, eventConfig, mutation, context) {
+        var standardProps = mutation.standardProps || {};
+        // if hasEnd has not been specified, guess a good value based on deltas.
+        // if duration will change, there's no way the default duration will persist,
+        // and thus, we need to mark the event as having a real end
+        if (standardProps.hasEnd == null &&
+            eventConfig.durationEditable &&
+            (mutation.startDelta || mutation.endDelta)) {
+            standardProps.hasEnd = true; // TODO: is this mutation okay?
+        }
+        var copy = __assign(__assign(__assign({}, eventDef), standardProps), { ui: __assign(__assign({}, eventDef.ui), standardProps.ui) });
+        if (mutation.extendedProps) {
+            copy.extendedProps = __assign(__assign({}, copy.extendedProps), mutation.extendedProps);
+        }
+        for (var _i = 0, _a = context.pluginHooks.eventDefMutationAppliers; _i < _a.length; _i++) {
+            var applier = _a[_i];
+            applier(copy, mutation, context);
+        }
+        if (!copy.hasEnd && context.options.forceEventDuration) {
+            copy.hasEnd = true;
+        }
+        return copy;
+    }
+    function applyMutationToEventInstance(eventInstance, eventDef, // must first be modified by applyMutationToEventDef
+    eventConfig, mutation, context) {
+        var dateEnv = context.dateEnv;
+        var forceAllDay = mutation.standardProps && mutation.standardProps.allDay === true;
+        var clearEnd = mutation.standardProps && mutation.standardProps.hasEnd === false;
+        var copy = __assign({}, eventInstance);
+        if (forceAllDay) {
+            copy.range = computeAlignedDayRange(copy.range);
+        }
+        if (mutation.datesDelta && eventConfig.startEditable) {
+            copy.range = {
+                start: dateEnv.add(copy.range.start, mutation.datesDelta),
+                end: dateEnv.add(copy.range.end, mutation.datesDelta)
+            };
+        }
+        if (mutation.startDelta && eventConfig.durationEditable) {
+            copy.range = {
+                start: dateEnv.add(copy.range.start, mutation.startDelta),
+                end: copy.range.end
+            };
+        }
+        if (mutation.endDelta && eventConfig.durationEditable) {
+            copy.range = {
+                start: copy.range.start,
+                end: dateEnv.add(copy.range.end, mutation.endDelta)
+            };
+        }
+        if (clearEnd) {
+            copy.range = {
+                start: copy.range.start,
+                end: getDefaultEventEnd(eventDef.allDay, copy.range.start, context)
+            };
+        }
+        // in case event was all-day but the supplied deltas were not
+        // better util for this?
+        if (eventDef.allDay) {
+            copy.range = {
+                start: startOfDay(copy.range.start),
+                end: startOfDay(copy.range.end)
+            };
+        }
+        // handle invalid durations
+        if (copy.range.end < copy.range.start) {
+            copy.range.end = getDefaultEventEnd(eventDef.allDay, copy.range.start, context);
+        }
+        return copy;
+    }
+
+    // no public types yet. when there are, export from:
+    // import {} from './api-type-deps'
+    var ViewApi = /** @class */ (function () {
+        function ViewApi(type, getCurrentData, dateEnv) {
+            this.type = type;
+            this.getCurrentData = getCurrentData;
+            this.dateEnv = dateEnv;
+        }
+        Object.defineProperty(ViewApi.prototype, "calendar", {
+            get: function () {
+                return this.getCurrentData().calendarApi;
+            },
+            enumerable: false,
+            configurable: true
+        });
+        Object.defineProperty(ViewApi.prototype, "title", {
+            get: function () {
+                return this.getCurrentData().viewTitle;
+            },
+            enumerable: false,
+            configurable: true
+        });
+        Object.defineProperty(ViewApi.prototype, "activeStart", {
+            get: function () {
+                return this.dateEnv.toDate(this.getCurrentData().dateProfile.activeRange.start);
+            },
+            enumerable: false,
+            configurable: true
+        });
+        Object.defineProperty(ViewApi.prototype, "activeEnd", {
+            get: function () {
+                return this.dateEnv.toDate(this.getCurrentData().dateProfile.activeRange.end);
+            },
+            enumerable: false,
+            configurable: true
+        });
+        Object.defineProperty(ViewApi.prototype, "currentStart", {
+            get: function () {
+                return this.dateEnv.toDate(this.getCurrentData().dateProfile.currentRange.start);
+            },
+            enumerable: false,
+            configurable: true
+        });
+        Object.defineProperty(ViewApi.prototype, "currentEnd", {
+            get: function () {
+                return this.dateEnv.toDate(this.getCurrentData().dateProfile.currentRange.end);
+            },
+            enumerable: false,
+            configurable: true
+        });
+        ViewApi.prototype.getOption = function (name) {
+            return this.getCurrentData().options[name]; // are the view-specific options
+        };
+        return ViewApi;
+    }());
+
+    var EVENT_SOURCE_REFINERS = {
+        id: String,
+        defaultAllDay: Boolean,
+        url: String,
+        events: identity,
+        eventDataTransform: identity,
+        // for any network-related sources
+        success: identity,
+        failure: identity,
+    };
+    function parseEventSource(raw, context, refiners) {
+        if (refiners === void 0) { refiners = buildEventSourceRefiners(context); }
+        var rawObj;
+        if (typeof raw === 'string') {
+            rawObj = { url: raw };
+        }
+        else if (typeof raw === 'function' || Array.isArray(raw)) {
+            rawObj = { events: raw };
+        }
+        else if (typeof raw === 'object' && raw) { // not null
+            rawObj = raw;
+        }
+        if (rawObj) {
+            var _a = refineProps(rawObj, refiners), refined = _a.refined, extra = _a.extra;
+            var metaRes = buildEventSourceMeta(refined, context);
+            if (metaRes) {
+                return {
+                    _raw: raw,
+                    isFetching: false,
+                    latestFetchId: '',
+                    fetchRange: null,
+                    defaultAllDay: refined.defaultAllDay,
+                    eventDataTransform: refined.eventDataTransform,
+                    success: refined.success,
+                    failure: refined.failure,
+                    publicId: refined.id || '',
+                    sourceId: guid(),
+                    sourceDefId: metaRes.sourceDefId,
+                    meta: metaRes.meta,
+                    ui: createEventUi(refined, context),
+                    extendedProps: extra
+                };
+            }
+        }
+        return null;
+    }
+    function buildEventSourceRefiners(context) {
+        return __assign(__assign(__assign({}, EVENT_UI_REFINERS), EVENT_SOURCE_REFINERS), context.pluginHooks.eventSourceRefiners);
+    }
+    function buildEventSourceMeta(raw, context) {
+        var defs = context.pluginHooks.eventSourceDefs;
+        for (var i = defs.length - 1; i >= 0; i--) { // later-added plugins take precedence
+            var def = defs[i];
+            var meta = def.parseMeta(raw);
+            if (meta) {
+                return { sourceDefId: i, meta: meta };
+            }
+        }
+        return null;
+    }
+
+    function reduceCurrentDate(currentDate, action) {
+        switch (action.type) {
+            case 'CHANGE_DATE':
+                return action.dateMarker;
+            default:
+                return currentDate;
+        }
+    }
+    function getInitialDate(options, dateEnv) {
+        var initialDateInput = options.initialDate;
+        // compute the initial ambig-timezone date
+        if (initialDateInput != null) {
+            return dateEnv.createMarker(initialDateInput);
+        }
+        else {
+            return getNow(options.now, dateEnv); // getNow already returns unzoned
+        }
+    }
+    function getNow(nowInput, dateEnv) {
+        if (typeof nowInput === 'function') {
+            nowInput = nowInput();
+        }
+        if (nowInput == null) {
+            return dateEnv.createNowMarker();
+        }
+        return dateEnv.createMarker(nowInput);
+    }
+
+    var CalendarApi = /** @class */ (function () {
+        function CalendarApi() {
+        }
+        CalendarApi.prototype.getCurrentData = function () {
+            return this.currentDataManager.getCurrentData();
+        };
+        CalendarApi.prototype.dispatch = function (action) {
+            return this.currentDataManager.dispatch(action);
+        };
+        Object.defineProperty(CalendarApi.prototype, "view", {
+            get: function () { return this.getCurrentData().viewApi; } // for public API
+            ,
+            enumerable: false,
+            configurable: true
+        });
+        CalendarApi.prototype.batchRendering = function (callback) {
+            callback();
+        };
+        CalendarApi.prototype.updateSize = function () {
+            this.trigger('_resize', true);
+        };
+        // Options
+        // -----------------------------------------------------------------------------------------------------------------
+        CalendarApi.prototype.setOption = function (name, val) {
+            this.dispatch({
+                type: 'SET_OPTION',
+                optionName: name,
+                rawOptionValue: val
+            });
+        };
+        CalendarApi.prototype.getOption = function (name) {
+            return this.currentDataManager.currentCalendarOptionsInput[name];
+        };
+        CalendarApi.prototype.getAvailableLocaleCodes = function () {
+            return Object.keys(this.getCurrentData().availableRawLocales);
+        };
+        // Trigger
+        // -----------------------------------------------------------------------------------------------------------------
+        CalendarApi.prototype.on = function (handlerName, handler) {
+            var currentDataManager = this.currentDataManager;
+            if (currentDataManager.currentCalendarOptionsRefiners[handlerName]) {
+                currentDataManager.emitter.on(handlerName, handler);
+            }
+            else {
+                console.warn("Unknown listener name '" + handlerName + "'");
+            }
+        };
+        CalendarApi.prototype.off = function (handlerName, handler) {
+            this.currentDataManager.emitter.off(handlerName, handler);
+        };
+        CalendarApi.prototype.trigger = function (handlerName) {
+            var _a;
+            var args = [];
+            for (var _i = 1; _i < arguments.length; _i++) {
+                args[_i - 1] = arguments[_i];
+            }
+            (_a = this.currentDataManager.emitter).trigger.apply(_a, __spreadArrays([handlerName], args));
+        };
+        // View
+        // -----------------------------------------------------------------------------------------------------------------
+        CalendarApi.prototype.changeView = function (viewType, dateOrRange) {
+            var _this = this;
+            this.batchRendering(function () {
+                _this.unselect();
+                if (dateOrRange) {
+                    if (dateOrRange.start && dateOrRange.end) { // a range
+                        _this.dispatch({
+                            type: 'CHANGE_VIEW_TYPE',
+                            viewType: viewType,
+                        });
+                        _this.dispatch({
+                            type: 'SET_OPTION',
+                            optionName: 'visibleRange',
+                            rawOptionValue: dateOrRange
+                        });
+                    }
+                    else {
+                        var dateEnv = _this.getCurrentData().dateEnv;
+                        _this.dispatch({
+                            type: 'CHANGE_VIEW_TYPE',
+                            viewType: viewType,
+                            dateMarker: dateEnv.createMarker(dateOrRange)
+                        });
+                    }
+                }
+                else {
+                    _this.dispatch({
+                        type: 'CHANGE_VIEW_TYPE',
+                        viewType: viewType
+                    });
+                }
+            });
+        };
+        // Forces navigation to a view for the given date.
+        // `viewType` can be a specific view name or a generic one like "week" or "day".
+        // needs to change
+        CalendarApi.prototype.zoomTo = function (dateMarker, viewType) {
+            var state = this.getCurrentData();
+            var spec;
+            viewType = viewType || 'day'; // day is default zoom
+            spec = state.viewSpecs[viewType] || this.getUnitViewSpec(viewType);
+            this.unselect();
+            if (spec) {
+                this.dispatch({
+                    type: 'CHANGE_VIEW_TYPE',
+                    viewType: spec.type,
+                    dateMarker: dateMarker
+                });
+            }
+            else {
+                this.dispatch({
+                    type: 'CHANGE_DATE',
+                    dateMarker: dateMarker
+                });
+            }
+        };
+        // Given a duration singular unit, like "week" or "day", finds a matching view spec.
+        // Preference is given to views that have corresponding buttons.
+        CalendarApi.prototype.getUnitViewSpec = function (unit) {
+            var _a = this.getCurrentData(), viewSpecs = _a.viewSpecs, toolbarConfig = _a.toolbarConfig;
+            var viewTypes = [].concat(toolbarConfig.viewsWithButtons);
+            var i;
+            var spec;
+            for (var viewType in viewSpecs) {
+                viewTypes.push(viewType);
+            }
+            for (i = 0; i < viewTypes.length; i++) {
+                spec = viewSpecs[viewTypes[i]];
+                if (spec) {
+                    if (spec.singleUnit === unit) {
+                        return spec;
+                    }
+                }
+            }
+        };
+        // Current Date
+        // -----------------------------------------------------------------------------------------------------------------
+        CalendarApi.prototype.prev = function () {
+            this.unselect();
+            this.dispatch({ type: 'PREV' });
+        };
+        CalendarApi.prototype.next = function () {
+            this.unselect();
+            this.dispatch({ type: 'NEXT' });
+        };
+        CalendarApi.prototype.prevYear = function () {
+            var state = this.getCurrentData();
+            this.unselect();
+            this.dispatch({
+                type: 'CHANGE_DATE',
+                dateMarker: state.dateEnv.addYears(state.currentDate, -1)
+            });
+        };
+        CalendarApi.prototype.nextYear = function () {
+            var state = this.getCurrentData();
+            this.unselect();
+            this.dispatch({
+                type: 'CHANGE_DATE',
+                dateMarker: state.dateEnv.addYears(state.currentDate, 1)
+            });
+        };
+        CalendarApi.prototype.today = function () {
+            var state = this.getCurrentData();
+            this.unselect();
+            this.dispatch({
+                type: 'CHANGE_DATE',
+                dateMarker: getNow(state.calendarOptions.now, state.dateEnv)
+            });
+        };
+        CalendarApi.prototype.gotoDate = function (zonedDateInput) {
+            var state = this.getCurrentData();
+            this.unselect();
+            this.dispatch({
+                type: 'CHANGE_DATE',
+                dateMarker: state.dateEnv.createMarker(zonedDateInput)
+            });
+        };
+        CalendarApi.prototype.incrementDate = function (deltaInput) {
+            var state = this.getCurrentData();
+            var delta = createDuration(deltaInput);
+            if (delta) { // else, warn about invalid input?
+                this.unselect();
+                this.dispatch({
+                    type: 'CHANGE_DATE',
+                    dateMarker: state.dateEnv.add(state.currentDate, delta)
+                });
+            }
+        };
+        // for external API
+        CalendarApi.prototype.getDate = function () {
+            var state = this.getCurrentData();
+            return state.dateEnv.toDate(state.currentDate);
+        };
+        // Date Formatting Utils
+        // -----------------------------------------------------------------------------------------------------------------
+        CalendarApi.prototype.formatDate = function (d, formatter) {
+            var dateEnv = this.getCurrentData().dateEnv;
+            return dateEnv.format(dateEnv.createMarker(d), createFormatter(formatter));
+        };
+        // `settings` is for formatter AND isEndExclusive
+        CalendarApi.prototype.formatRange = function (d0, d1, settings) {
+            var dateEnv = this.getCurrentData().dateEnv;
+            return dateEnv.formatRange(dateEnv.createMarker(d0), dateEnv.createMarker(d1), createFormatter(settings), settings);
+        };
+        CalendarApi.prototype.formatIso = function (d, omitTime) {
+            var dateEnv = this.getCurrentData().dateEnv;
+            return dateEnv.formatIso(dateEnv.createMarker(d), { omitTime: omitTime });
+        };
+        // Date Selection / Event Selection / DayClick
+        // -----------------------------------------------------------------------------------------------------------------
+        // this public method receives start/end dates in any format, with any timezone
+        // NOTE: args were changed from v3
+        CalendarApi.prototype.select = function (dateOrObj, endDate) {
+            var selectionInput;
+            if (endDate == null) {
+                if (dateOrObj.start != null) {
+                    selectionInput = dateOrObj;
+                }
+                else {
+                    selectionInput = {
+                        start: dateOrObj,
+                        end: null
+                    };
+                }
+            }
+            else {
+                selectionInput = {
+                    start: dateOrObj,
+                    end: endDate
+                };
+            }
+            var state = this.getCurrentData();
+            var selection = parseDateSpan(selectionInput, state.dateEnv, createDuration({ days: 1 }) // TODO: cache this?
+            );
+            if (selection) { // throw parse error otherwise?
+                this.dispatch({ type: 'SELECT_DATES', selection: selection });
+                triggerDateSelect(selection, null, state);
+            }
+        };
+        // public method
+        CalendarApi.prototype.unselect = function (pev) {
+            var state = this.getCurrentData();
+            if (state.dateSelection) {
+                this.dispatch({ type: 'UNSELECT_DATES' });
+                triggerDateUnselect(pev, state);
+            }
+        };
+        // Public Events API
+        // -----------------------------------------------------------------------------------------------------------------
+        CalendarApi.prototype.addEvent = function (eventInput, sourceInput) {
+            if (eventInput instanceof EventApi) {
+                var def = eventInput._def;
+                var instance = eventInput._instance;
+                var currentData = this.getCurrentData();
+                // not already present? don't want to add an old snapshot
+                if (!currentData.eventStore.defs[def.defId]) {
+                    this.dispatch({
+                        type: 'ADD_EVENTS',
+                        eventStore: eventTupleToStore({ def: def, instance: instance }) // TODO: better util for two args?
+                    });
+                    this.triggerEventAdd(eventInput);
+                }
+                return eventInput;
+            }
+            var state = this.getCurrentData();
+            var eventSource;
+            if (sourceInput instanceof EventSourceApi) {
+                eventSource = sourceInput.internalEventSource;
+            }
+            else if (typeof sourceInput === 'boolean') {
+                if (sourceInput) { // true. part of the first event source
+                    eventSource = hashValuesToArray(state.eventSources)[0];
+                }
+            }
+            else if (sourceInput != null) { // an ID. accepts a number too
+                var sourceApi = this.getEventSourceById(sourceInput); // TODO: use an internal function
+                if (!sourceApi) {
+                    console.warn('Could not find an event source with ID "' + sourceInput + '"'); // TODO: test
+                    return null;
+                }
+                else {
+                    eventSource = sourceApi.internalEventSource;
+                }
+            }
+            var tuple = parseEvent(eventInput, eventSource, state, false);
+            if (tuple) {
+                var newEventApi = new EventApi(state, tuple.def, tuple.def.recurringDef ? null : tuple.instance);
+                this.dispatch({
+                    type: 'ADD_EVENTS',
+                    eventStore: eventTupleToStore(tuple)
+                });
+                this.triggerEventAdd(newEventApi);
+                return newEventApi;
+            }
+            return null;
+        };
+        CalendarApi.prototype.triggerEventAdd = function (eventApi) {
+            var _this = this;
+            var emitter = this.getCurrentData().emitter;
+            emitter.trigger('eventAdd', {
+                event: eventApi,
+                relatedEvents: [],
+                revert: function () {
+                    _this.dispatch({
+                        type: 'REMOVE_EVENTS',
+                        eventStore: eventApiToStore(eventApi)
+                    });
+                }
+            });
+        };
+        // TODO: optimize
+        CalendarApi.prototype.getEventById = function (id) {
+            var state = this.getCurrentData();
+            var _a = state.eventStore, defs = _a.defs, instances = _a.instances;
+            id = String(id);
+            for (var defId in defs) {
+                var def = defs[defId];
+                if (def.publicId === id) {
+                    if (def.recurringDef) {
+                        return new EventApi(state, def, null);
+                    }
+                    else {
+                        for (var instanceId in instances) {
+                            var instance = instances[instanceId];
+                            if (instance.defId === def.defId) {
+                                return new EventApi(state, def, instance);
+                            }
+                        }
+                    }
+                }
+            }
+            return null;
+        };
+        CalendarApi.prototype.getEvents = function () {
+            var currentData = this.getCurrentData();
+            return buildEventApis(currentData.eventStore, currentData);
+        };
+        CalendarApi.prototype.removeAllEvents = function () {
+            this.dispatch({ type: 'REMOVE_ALL_EVENTS' });
+        };
+        // Public Event Sources API
+        // -----------------------------------------------------------------------------------------------------------------
+        CalendarApi.prototype.getEventSources = function () {
+            var state = this.getCurrentData();
+            var sourceHash = state.eventSources;
+            var sourceApis = [];
+            for (var internalId in sourceHash) {
+                sourceApis.push(new EventSourceApi(state, sourceHash[internalId]));
+            }
+            return sourceApis;
+        };
+        CalendarApi.prototype.getEventSourceById = function (id) {
+            var state = this.getCurrentData();
+            var sourceHash = state.eventSources;
+            id = String(id);
+            for (var sourceId in sourceHash) {
+                if (sourceHash[sourceId].publicId === id) {
+                    return new EventSourceApi(state, sourceHash[sourceId]);
+                }
+            }
+            return null;
+        };
+        CalendarApi.prototype.addEventSource = function (sourceInput) {
+            var state = this.getCurrentData();
+            if (sourceInput instanceof EventSourceApi) {
+                // not already present? don't want to add an old snapshot
+                if (!state.eventSources[sourceInput.internalEventSource.sourceId]) {
+                    this.dispatch({
+                        type: 'ADD_EVENT_SOURCES',
+                        sources: [sourceInput.internalEventSource]
+                    });
+                }
+                return sourceInput;
+            }
+            var eventSource = parseEventSource(sourceInput, state);
+            if (eventSource) { // TODO: error otherwise?
+                this.dispatch({ type: 'ADD_EVENT_SOURCES', sources: [eventSource] });
+                return new EventSourceApi(state, eventSource);
+            }
+            return null;
+        };
+        CalendarApi.prototype.removeAllEventSources = function () {
+            this.dispatch({ type: 'REMOVE_ALL_EVENT_SOURCES' });
+        };
+        CalendarApi.prototype.refetchEvents = function () {
+            this.dispatch({ type: 'FETCH_EVENT_SOURCES' });
+        };
+        // Scroll
+        // -----------------------------------------------------------------------------------------------------------------
+        CalendarApi.prototype.scrollToTime = function (timeInput) {
+            var time = createDuration(timeInput);
+            if (time) {
+                this.trigger('_scrollRequest', { time: time });
+            }
+        };
+        return CalendarApi;
+    }());
+
+    var EventApi = /** @class */ (function () {
+        // instance will be null if expressing a recurring event that has no current instances,
+        // OR if trying to validate an incoming external event that has no dates assigned
+        function EventApi(context, def, instance) {
+            this._context = context;
+            this._def = def;
+            this._instance = instance || null;
+        }
+        /*
+        TODO: make event struct more responsible for this
+        */
+        EventApi.prototype.setProp = function (name, val) {
+            var _a, _b;
+            if (name in EVENT_DATE_REFINERS) {
+                console.warn("Could not set date-related prop 'name'. Use one of the date-related methods instead.");
+            }
+            else if (name in EVENT_NON_DATE_REFINERS) {
+                val = EVENT_NON_DATE_REFINERS[name](val);
+                this.mutate({
+                    standardProps: (_a = {}, _a[name] = val, _a)
+                });
+            }
+            else if (name in EVENT_UI_REFINERS) {
+                var ui = EVENT_UI_REFINERS[name](val);
+                if (name === 'color') {
+                    ui = { backgroundColor: val, borderColor: val };
+                }
+                else if (name === 'editable') {
+                    ui = { startEditable: val, durationEditable: val };
+                }
+                else {
+                    ui = (_b = {}, _b[name] = val, _b);
+                }
+                this.mutate({
+                    standardProps: { ui: ui }
+                });
+            }
+            else {
+                console.warn("Could not set prop '" + name + "'. Use setExtendedProp instead.");
+            }
+        };
+        EventApi.prototype.setExtendedProp = function (name, val) {
+            var _a;
+            this.mutate({
+                extendedProps: (_a = {}, _a[name] = val, _a)
+            });
+        };
+        EventApi.prototype.setStart = function (startInput, options) {
+            if (options === void 0) { options = {}; }
+            var dateEnv = this._context.dateEnv;
+            var start = dateEnv.createMarker(startInput);
+            if (start && this._instance) { // TODO: warning if parsed bad
+                var instanceRange = this._instance.range;
+                var startDelta = diffDates(instanceRange.start, start, dateEnv, options.granularity); // what if parsed bad!?
+                if (options.maintainDuration) {
+                    this.mutate({ datesDelta: startDelta });
+                }
+                else {
+                    this.mutate({ startDelta: startDelta });
+                }
+            }
+        };
+        EventApi.prototype.setEnd = function (endInput, options) {
+            if (options === void 0) { options = {}; }
+            var dateEnv = this._context.dateEnv;
+            var end;
+            if (endInput != null) {
+                end = dateEnv.createMarker(endInput);
+                if (!end) {
+                    return; // TODO: warning if parsed bad
+                }
+            }
+            if (this._instance) {
+                if (end) {
+                    var endDelta = diffDates(this._instance.range.end, end, dateEnv, options.granularity);
+                    this.mutate({ endDelta: endDelta });
+                }
+                else {
+                    this.mutate({ standardProps: { hasEnd: false } });
+                }
+            }
+        };
+        EventApi.prototype.setDates = function (startInput, endInput, options) {
+            if (options === void 0) { options = {}; }
+            var dateEnv = this._context.dateEnv;
+            var standardProps = { allDay: options.allDay };
+            var start = dateEnv.createMarker(startInput);
+            var end;
+            if (!start) {
+                return; // TODO: warning if parsed bad
+            }
+            if (endInput != null) {
+                end = dateEnv.createMarker(endInput);
+                if (!end) { // TODO: warning if parsed bad
+                    return;
+                }
+            }
+            if (this._instance) {
+                var instanceRange = this._instance.range;
+                // when computing the diff for an event being converted to all-day,
+                // compute diff off of the all-day values the way event-mutation does.
+                if (options.allDay === true) {
+                    instanceRange = computeAlignedDayRange(instanceRange);
+                }
+                var startDelta = diffDates(instanceRange.start, start, dateEnv, options.granularity);
+                if (end) {
+                    var endDelta = diffDates(instanceRange.end, end, dateEnv, options.granularity);
+                    if (durationsEqual(startDelta, endDelta)) {
+                        this.mutate({ datesDelta: startDelta, standardProps: standardProps });
+                    }
+                    else {
+                        this.mutate({ startDelta: startDelta, endDelta: endDelta, standardProps: standardProps });
+                    }
+                }
+                else { // means "clear the end"
+                    standardProps.hasEnd = false;
+                    this.mutate({ datesDelta: startDelta, standardProps: standardProps });
+                }
+            }
+        };
+        EventApi.prototype.moveStart = function (deltaInput) {
+            var delta = createDuration(deltaInput);
+            if (delta) { // TODO: warning if parsed bad
+                this.mutate({ startDelta: delta });
+            }
+        };
+        EventApi.prototype.moveEnd = function (deltaInput) {
+            var delta = createDuration(deltaInput);
+            if (delta) { // TODO: warning if parsed bad
+                this.mutate({ endDelta: delta });
+            }
+        };
+        EventApi.prototype.moveDates = function (deltaInput) {
+            var delta = createDuration(deltaInput);
+            if (delta) { // TODO: warning if parsed bad
+                this.mutate({ datesDelta: delta });
+            }
+        };
+        EventApi.prototype.setAllDay = function (allDay, options) {
+            if (options === void 0) { options = {}; }
+            var standardProps = { allDay: allDay };
+            var maintainDuration = options.maintainDuration;
+            if (maintainDuration == null) {
+                maintainDuration = this._context.options.allDayMaintainDuration;
+            }
+            if (this._def.allDay !== allDay) {
+                standardProps.hasEnd = maintainDuration;
+            }
+            this.mutate({ standardProps: standardProps });
+        };
+        EventApi.prototype.formatRange = function (formatInput) {
+            var dateEnv = this._context.dateEnv;
+            var instance = this._instance;
+            var formatter = createFormatter(formatInput);
+            if (this._def.hasEnd) {
+                return dateEnv.formatRange(instance.range.start, instance.range.end, formatter, {
+                    forcedStartTzo: instance.forcedStartTzo,
+                    forcedEndTzo: instance.forcedEndTzo
+                });
+            }
+            else {
+                return dateEnv.format(instance.range.start, formatter, {
+                    forcedTzo: instance.forcedStartTzo
+                });
+            }
+        };
+        EventApi.prototype.mutate = function (mutation) {
+            var instance = this._instance;
+            if (instance) {
+                var def = this._def;
+                var context_1 = this._context;
+                var eventStore = context_1.getCurrentData().eventStore;
+                var relevantEvents_1 = getRelevantEvents(eventStore, instance.instanceId);
+                var eventConfigBase = {
+                    '': {
+                        display: '',
+                        startEditable: true,
+                        durationEditable: true,
+                        constraints: [],
+                        overlap: null,
+                        allows: [],
+                        backgroundColor: '',
+                        borderColor: '',
+                        textColor: '',
+                        classNames: []
+                    }
+                };
+                relevantEvents_1 = applyMutationToEventStore(relevantEvents_1, eventConfigBase, mutation, context_1);
+                var oldEvent = new EventApi(context_1, def, instance); // snapshot
+                this._def = relevantEvents_1.defs[def.defId];
+                this._instance = relevantEvents_1.instances[instance.instanceId];
+                context_1.dispatch({
+                    type: 'MERGE_EVENTS',
+                    eventStore: relevantEvents_1
+                });
+                context_1.emitter.trigger('eventChange', {
+                    oldEvent: oldEvent,
+                    event: this,
+                    relatedEvents: buildEventApis(relevantEvents_1, context_1, instance),
+                    revert: function () {
+                        context_1.dispatch({
+                            type: 'REMOVE_EVENTS',
+                            eventStore: relevantEvents_1
+                        });
+                    }
+                });
+            }
+        };
+        EventApi.prototype.remove = function () {
+            var context = this._context;
+            var asStore = eventApiToStore(this);
+            context.dispatch({
+                type: 'REMOVE_EVENTS',
+                eventStore: asStore
+            });
+            context.emitter.trigger('eventRemove', {
+                event: this,
+                relatedEvents: [],
+                revert: function () {
+                    context.dispatch({
+                        type: 'MERGE_EVENTS',
+                        eventStore: asStore
+                    });
+                }
+            });
+        };
+        Object.defineProperty(EventApi.prototype, "source", {
+            get: function () {
+                var sourceId = this._def.sourceId;
+                if (sourceId) {
+                    return new EventSourceApi(this._context, this._context.getCurrentData().eventSources[sourceId]);
+                }
+                return null;
+            },
+            enumerable: false,
+            configurable: true
+        });
+        Object.defineProperty(EventApi.prototype, "start", {
+            get: function () {
+                return this._instance ?
+                    this._context.dateEnv.toDate(this._instance.range.start) :
+                    null;
+            },
+            enumerable: false,
+            configurable: true
+        });
+        Object.defineProperty(EventApi.prototype, "end", {
+            get: function () {
+                return (this._instance && this._def.hasEnd) ?
+                    this._context.dateEnv.toDate(this._instance.range.end) :
+                    null;
+            },
+            enumerable: false,
+            configurable: true
+        });
+        Object.defineProperty(EventApi.prototype, "startStr", {
+            get: function () {
+                var instance = this._instance;
+                if (instance) {
+                    return this._context.dateEnv.formatIso(instance.range.start, {
+                        omitTime: this._def.allDay,
+                        forcedTzo: instance.forcedStartTzo
+                    });
+                }
+                return '';
+            },
+            enumerable: false,
+            configurable: true
+        });
+        Object.defineProperty(EventApi.prototype, "endStr", {
+            get: function () {
+                var instance = this._instance;
+                if (instance && this._def.hasEnd) {
+                    return this._context.dateEnv.formatIso(instance.range.end, {
+                        omitTime: this._def.allDay,
+                        forcedTzo: instance.forcedEndTzo
+                    });
+                }
+                return '';
+            },
+            enumerable: false,
+            configurable: true
+        });
+        Object.defineProperty(EventApi.prototype, "id", {
+            // computable props that all access the def
+            // TODO: find a TypeScript-compatible way to do this at scale
+            get: function () { return this._def.publicId; },
+            enumerable: false,
+            configurable: true
+        });
+        Object.defineProperty(EventApi.prototype, "groupId", {
+            get: function () { return this._def.groupId; },
+            enumerable: false,
+            configurable: true
+        });
+        Object.defineProperty(EventApi.prototype, "allDay", {
+            get: function () { return this._def.allDay; },
+            enumerable: false,
+            configurable: true
+        });
+        Object.defineProperty(EventApi.prototype, "title", {
+            get: function () { return this._def.title; },
+            enumerable: false,
+            configurable: true
+        });
+        Object.defineProperty(EventApi.prototype, "url", {
+            get: function () { return this._def.url; },
+            enumerable: false,
+            configurable: true
+        });
+        Object.defineProperty(EventApi.prototype, "display", {
+            get: function () { return this._def.ui.display || 'auto'; } // bad. just normalize the type earlier
+            ,
+            enumerable: false,
+            configurable: true
+        });
+        Object.defineProperty(EventApi.prototype, "startEditable", {
+            get: function () { return this._def.ui.startEditable; },
+            enumerable: false,
+            configurable: true
+        });
+        Object.defineProperty(EventApi.prototype, "durationEditable", {
+            get: function () { return this._def.ui.durationEditable; },
+            enumerable: false,
+            configurable: true
+        });
+        Object.defineProperty(EventApi.prototype, "constraint", {
+            get: function () { return this._def.ui.constraints[0] || null; },
+            enumerable: false,
+            configurable: true
+        });
+        Object.defineProperty(EventApi.prototype, "overlap", {
+            get: function () { return this._def.ui.overlap; },
+            enumerable: false,
+            configurable: true
+        });
+        Object.defineProperty(EventApi.prototype, "allow", {
+            get: function () { return this._def.ui.allows[0] || null; },
+            enumerable: false,
+            configurable: true
+        });
+        Object.defineProperty(EventApi.prototype, "backgroundColor", {
+            get: function () { return this._def.ui.backgroundColor; },
+            enumerable: false,
+            configurable: true
+        });
+        Object.defineProperty(EventApi.prototype, "borderColor", {
+            get: function () { return this._def.ui.borderColor; },
+            enumerable: false,
+            configurable: true
+        });
+        Object.defineProperty(EventApi.prototype, "textColor", {
+            get: function () { return this._def.ui.textColor; },
+            enumerable: false,
+            configurable: true
+        });
+        Object.defineProperty(EventApi.prototype, "classNames", {
+            // NOTE: user can't modify these because Object.freeze was called in event-def parsing
+            get: function () { return this._def.ui.classNames; },
+            enumerable: false,
+            configurable: true
+        });
+        Object.defineProperty(EventApi.prototype, "extendedProps", {
+            get: function () { return this._def.extendedProps; },
+            enumerable: false,
+            configurable: true
+        });
+        EventApi.prototype.toPlainObject = function (settings) {
+            if (settings === void 0) { settings = {}; }
+            var def = this._def;
+            var ui = def.ui;
+            var _a = this, startStr = _a.startStr, endStr = _a.endStr;
+            var res = {};
+            if (def.title) {
+                res.title = def.title;
+            }
+            if (startStr) {
+                res.start = startStr;
+            }
+            if (endStr) {
+                res.end = endStr;
+            }
+            if (def.publicId) {
+                res.id = def.publicId;
+            }
+            if (def.groupId) {
+                res.groupId = def.groupId;
+            }
+            if (def.url) {
+                res.url = def.url;
+            }
+            if (ui.display && ui.display !== 'auto') {
+                res.display = ui.display;
+            }
+            // TODO: what about recurring-event properties???
+            // TODO: include startEditable/durationEditable/constraint/overlap/allow
+            if (settings.collapseColor && ui.backgroundColor && ui.backgroundColor === ui.borderColor) {
+                res.color = ui.backgroundColor;
+            }
+            else {
+                if (ui.backgroundColor) {
+                    res.backgroundColor = ui.backgroundColor;
+                }
+                if (ui.borderColor) {
+                    res.borderColor = ui.borderColor;
+                }
+            }
+            if (ui.textColor) {
+                res.textColor = ui.textColor;
+            }
+            if (ui.classNames.length) {
+                res.classNames = ui.classNames;
+            }
+            if (Object.keys(def.extendedProps).length) {
+                if (settings.collapseExtendedProps) {
+                    __assign(res, def.extendedProps);
+                }
+                else {
+                    res.extendedProps = def.extendedProps;
+                }
+            }
+            return res;
+        };
+        EventApi.prototype.toJSON = function () {
+            return this.toPlainObject();
+        };
+        return EventApi;
+    }());
+    function eventApiToStore(eventApi) {
+        var _a, _b;
+        var def = eventApi._def;
+        var instance = eventApi._instance;
+        return {
+            defs: (_a = {}, _a[def.defId] = def, _a),
+            instances: instance
+                ? (_b = {}, _b[instance.instanceId] = instance, _b) : {}
+        };
+    }
+    function buildEventApis(eventStore, context, excludeInstance) {
+        var defs = eventStore.defs, instances = eventStore.instances;
+        var eventApis = [];
+        var excludeInstanceId = excludeInstance ? excludeInstance.instanceId : '';
+        for (var id in instances) {
+            var instance = instances[id];
+            var def = defs[instance.defId];
+            if (instance.instanceId !== excludeInstanceId) {
+                eventApis.push(new EventApi(context, def, instance));
+            }
+        }
+        return eventApis;
+    }
+
+    var calendarSystemClassMap = {};
+    function registerCalendarSystem(name, theClass) {
+        calendarSystemClassMap[name] = theClass;
+    }
+    function createCalendarSystem(name) {
+        return new calendarSystemClassMap[name]();
+    }
+    var GregorianCalendarSystem = /** @class */ (function () {
+        function GregorianCalendarSystem() {
+        }
+        GregorianCalendarSystem.prototype.getMarkerYear = function (d) {
+            return d.getUTCFullYear();
+        };
+        GregorianCalendarSystem.prototype.getMarkerMonth = function (d) {
+            return d.getUTCMonth();
+        };
+        GregorianCalendarSystem.prototype.getMarkerDay = function (d) {
+            return d.getUTCDate();
+        };
+        GregorianCalendarSystem.prototype.arrayToMarker = function (arr) {
+            return arrayToUtcDate(arr);
+        };
+        GregorianCalendarSystem.prototype.markerToArray = function (marker) {
+            return dateToUtcArray(marker);
+        };
+        return GregorianCalendarSystem;
+    }());
+    registerCalendarSystem('gregory', GregorianCalendarSystem);
+
+    var ISO_RE = /^\s*(\d{4})(-(\d{2})(-(\d{2})([T ](\d{2}):(\d{2})(:(\d{2})(\.(\d+))?)?(Z|(([-+])(\d{2})(:?(\d{2}))?))?)?)?)?$/;
+    function parse(str) {
+        var m = ISO_RE.exec(str);
+        if (m) {
+            var marker = new Date(Date.UTC(Number(m[1]), m[3] ? Number(m[3]) - 1 : 0, Number(m[5] || 1), Number(m[7] || 0), Number(m[8] || 0), Number(m[10] || 0), m[12] ? Number('0.' + m[12]) * 1000 : 0));
+            if (isValidDate(marker)) {
+                var timeZoneOffset = null;
+                if (m[13]) {
+                    timeZoneOffset = (m[15] === '-' ? -1 : 1) * (Number(m[16] || 0) * 60 +
+                        Number(m[18] || 0));
+                }
+                return {
+                    marker: marker,
+                    isTimeUnspecified: !m[6],
+                    timeZoneOffset: timeZoneOffset
+                };
+            }
+        }
+        return null;
+    }
+
+    var DateEnv = /** @class */ (function () {
+        function DateEnv(settings) {
+            var timeZone = this.timeZone = settings.timeZone;
+            var isNamedTimeZone = timeZone !== 'local' && timeZone !== 'UTC';
+            if (settings.namedTimeZoneImpl && isNamedTimeZone) {
+                this.namedTimeZoneImpl = new settings.namedTimeZoneImpl(timeZone);
+            }
+            this.canComputeOffset = Boolean(!isNamedTimeZone || this.namedTimeZoneImpl);
+            this.calendarSystem = createCalendarSystem(settings.calendarSystem);
+            this.locale = settings.locale;
+            this.weekDow = settings.locale.week.dow;
+            this.weekDoy = settings.locale.week.doy;
+            if (settings.weekNumberCalculation === 'ISO') {
+                this.weekDow = 1;
+                this.weekDoy = 4;
+            }
+            if (typeof settings.firstDay === 'number') {
+                this.weekDow = settings.firstDay;
+            }
+            if (typeof settings.weekNumberCalculation === 'function') {
+                this.weekNumberFunc = settings.weekNumberCalculation;
+            }
+            this.weekText = settings.weekText != null ? settings.weekText : settings.locale.options.weekText;
+            this.cmdFormatter = settings.cmdFormatter;
+            this.defaultSeparator = settings.defaultSeparator;
+        }
+        // Creating / Parsing
+        DateEnv.prototype.createMarker = function (input) {
+            var meta = this.createMarkerMeta(input);
+            if (meta === null) {
+                return null;
+            }
+            return meta.marker;
+        };
+        DateEnv.prototype.createNowMarker = function () {
+            if (this.canComputeOffset) {
+                return this.timestampToMarker(new Date().valueOf());
+            }
+            else {
+                // if we can't compute the current date val for a timezone,
+                // better to give the current local date vals than UTC
+                return arrayToUtcDate(dateToLocalArray(new Date()));
+            }
+        };
+        DateEnv.prototype.createMarkerMeta = function (input) {
+            if (typeof input === 'string') {
+                return this.parse(input);
+            }
+            var marker = null;
+            if (typeof input === 'number') {
+                marker = this.timestampToMarker(input);
+            }
+            else if (input instanceof Date) {
+                input = input.valueOf();
+                if (!isNaN(input)) {
+                    marker = this.timestampToMarker(input);
+                }
+            }
+            else if (Array.isArray(input)) {
+                marker = arrayToUtcDate(input);
+            }
+            if (marker === null || !isValidDate(marker)) {
+                return null;
+            }
+            return { marker: marker, isTimeUnspecified: false, forcedTzo: null };
+        };
+        DateEnv.prototype.parse = function (s) {
+            var parts = parse(s);
+            if (parts === null) {
+                return null;
+            }
+            var marker = parts.marker;
+            var forcedTzo = null;
+            if (parts.timeZoneOffset !== null) {
+                if (this.canComputeOffset) {
+                    marker = this.timestampToMarker(marker.valueOf() - parts.timeZoneOffset * 60 * 1000);
+                }
+                else {
+                    forcedTzo = parts.timeZoneOffset;
+                }
+            }
+            return { marker: marker, isTimeUnspecified: parts.isTimeUnspecified, forcedTzo: forcedTzo };
+        };
+        // Accessors
+        DateEnv.prototype.getYear = function (marker) {
+            return this.calendarSystem.getMarkerYear(marker);
+        };
+        DateEnv.prototype.getMonth = function (marker) {
+            return this.calendarSystem.getMarkerMonth(marker);
+        };
+        // Adding / Subtracting
+        DateEnv.prototype.add = function (marker, dur) {
+            var a = this.calendarSystem.markerToArray(marker);
+            a[0] += dur.years;
+            a[1] += dur.months;
+            a[2] += dur.days;
+            a[6] += dur.milliseconds;
+            return this.calendarSystem.arrayToMarker(a);
+        };
+        DateEnv.prototype.subtract = function (marker, dur) {
+            var a = this.calendarSystem.markerToArray(marker);
+            a[0] -= dur.years;
+            a[1] -= dur.months;
+            a[2] -= dur.days;
+            a[6] -= dur.milliseconds;
+            return this.calendarSystem.arrayToMarker(a);
+        };
+        DateEnv.prototype.addYears = function (marker, n) {
+            var a = this.calendarSystem.markerToArray(marker);
+            a[0] += n;
+            return this.calendarSystem.arrayToMarker(a);
+        };
+        DateEnv.prototype.addMonths = function (marker, n) {
+            var a = this.calendarSystem.markerToArray(marker);
+            a[1] += n;
+            return this.calendarSystem.arrayToMarker(a);
+        };
+        // Diffing Whole Units
+        DateEnv.prototype.diffWholeYears = function (m0, m1) {
+            var calendarSystem = this.calendarSystem;
+            if (timeAsMs(m0) === timeAsMs(m1) &&
+                calendarSystem.getMarkerDay(m0) === calendarSystem.getMarkerDay(m1) &&
+                calendarSystem.getMarkerMonth(m0) === calendarSystem.getMarkerMonth(m1)) {
+                return calendarSystem.getMarkerYear(m1) - calendarSystem.getMarkerYear(m0);
+            }
+            return null;
+        };
+        DateEnv.prototype.diffWholeMonths = function (m0, m1) {
+            var calendarSystem = this.calendarSystem;
+            if (timeAsMs(m0) === timeAsMs(m1) &&
+                calendarSystem.getMarkerDay(m0) === calendarSystem.getMarkerDay(m1)) {
+                return (calendarSystem.getMarkerMonth(m1) - calendarSystem.getMarkerMonth(m0)) +
+                    (calendarSystem.getMarkerYear(m1) - calendarSystem.getMarkerYear(m0)) * 12;
+            }
+            return null;
+        };
+        // Range / Duration
+        DateEnv.prototype.greatestWholeUnit = function (m0, m1) {
+            var n = this.diffWholeYears(m0, m1);
+            if (n !== null) {
+                return { unit: 'year', value: n };
+            }
+            n = this.diffWholeMonths(m0, m1);
+            if (n !== null) {
+                return { unit: 'month', value: n };
+            }
+            n = diffWholeWeeks(m0, m1);
+            if (n !== null) {
+                return { unit: 'week', value: n };
+            }
+            n = diffWholeDays(m0, m1);
+            if (n !== null) {
+                return { unit: 'day', value: n };
+            }
+            n = diffHours(m0, m1);
+            if (isInt(n)) {
+                return { unit: 'hour', value: n };
+            }
+            n = diffMinutes(m0, m1);
+            if (isInt(n)) {
+                return { unit: 'minute', value: n };
+            }
+            n = diffSeconds(m0, m1);
+            if (isInt(n)) {
+                return { unit: 'second', value: n };
+            }
+            return { unit: 'millisecond', value: m1.valueOf() - m0.valueOf() };
+        };
+        DateEnv.prototype.countDurationsBetween = function (m0, m1, d) {
+            // TODO: can use greatestWholeUnit
+            var diff;
+            if (d.years) {
+                diff = this.diffWholeYears(m0, m1);
+                if (diff !== null) {
+                    return diff / asRoughYears(d);
+                }
+            }
+            if (d.months) {
+                diff = this.diffWholeMonths(m0, m1);
+                if (diff !== null) {
+                    return diff / asRoughMonths(d);
+                }
+            }
+            if (d.days) {
+                diff = diffWholeDays(m0, m1);
+                if (diff !== null) {
+                    return diff / asRoughDays(d);
+                }
+            }
+            return (m1.valueOf() - m0.valueOf()) / asRoughMs(d);
+        };
+        // Start-Of
+        // these DON'T return zoned-dates. only UTC start-of dates
+        DateEnv.prototype.startOf = function (m, unit) {
+            if (unit === 'year') {
+                return this.startOfYear(m);
+            }
+            else if (unit === 'month') {
+                return this.startOfMonth(m);
+            }
+            else if (unit === 'week') {
+                return this.startOfWeek(m);
+            }
+            else if (unit === 'day') {
+                return startOfDay(m);
+            }
+            else if (unit === 'hour') {
+                return startOfHour(m);
+            }
+            else if (unit === 'minute') {
+                return startOfMinute(m);
+            }
+            else if (unit === 'second') {
+                return startOfSecond(m);
+            }
+        };
+        DateEnv.prototype.startOfYear = function (m) {
+            return this.calendarSystem.arrayToMarker([
+                this.calendarSystem.getMarkerYear(m)
+            ]);
+        };
+        DateEnv.prototype.startOfMonth = function (m) {
+            return this.calendarSystem.arrayToMarker([
+                this.calendarSystem.getMarkerYear(m),
+                this.calendarSystem.getMarkerMonth(m)
+            ]);
+        };
+        DateEnv.prototype.startOfWeek = function (m) {
+            return this.calendarSystem.arrayToMarker([
+                this.calendarSystem.getMarkerYear(m),
+                this.calendarSystem.getMarkerMonth(m),
+                m.getUTCDate() - ((m.getUTCDay() - this.weekDow + 7) % 7)
+            ]);
+        };
+        // Week Number
+        DateEnv.prototype.computeWeekNumber = function (marker) {
+            if (this.weekNumberFunc) {
+                return this.weekNumberFunc(this.toDate(marker));
+            }
+            else {
+                return weekOfYear(marker, this.weekDow, this.weekDoy);
+            }
+        };
+        // TODO: choke on timeZoneName: long
+        DateEnv.prototype.format = function (marker, formatter, dateOptions) {
+            if (dateOptions === void 0) { dateOptions = {}; }
+            return formatter.format({
+                marker: marker,
+                timeZoneOffset: dateOptions.forcedTzo != null ?
+                    dateOptions.forcedTzo :
+                    this.offsetForMarker(marker)
+            }, this);
+        };
+        DateEnv.prototype.formatRange = function (start, end, formatter, dateOptions) {
+            if (dateOptions === void 0) { dateOptions = {}; }
+            if (dateOptions.isEndExclusive) {
+                end = addMs(end, -1);
+            }
+            return formatter.formatRange({
+                marker: start,
+                timeZoneOffset: dateOptions.forcedStartTzo != null ?
+                    dateOptions.forcedStartTzo :
+                    this.offsetForMarker(start)
+            }, {
+                marker: end,
+                timeZoneOffset: dateOptions.forcedEndTzo != null ?
+                    dateOptions.forcedEndTzo :
+                    this.offsetForMarker(end)
+            }, this, dateOptions.defaultSeparator);
+        };
+        /*
+        DUMB: the omitTime arg is dumb. if we omit the time, we want to omit the timezone offset. and if we do that,
+        might as well use buildIsoString or some other util directly
+        */
+        DateEnv.prototype.formatIso = function (marker, extraOptions) {
+            if (extraOptions === void 0) { extraOptions = {}; }
+            var timeZoneOffset = null;
+            if (!extraOptions.omitTimeZoneOffset) {
+                if (extraOptions.forcedTzo != null) {
+                    timeZoneOffset = extraOptions.forcedTzo;
+                }
+                else {
+                    timeZoneOffset = this.offsetForMarker(marker);
+                }
+            }
+            return buildIsoString(marker, timeZoneOffset, extraOptions.omitTime);
+        };
+        // TimeZone
+        DateEnv.prototype.timestampToMarker = function (ms) {
+            if (this.timeZone === 'local') {
+                return arrayToUtcDate(dateToLocalArray(new Date(ms)));
+            }
+            else if (this.timeZone === 'UTC' || !this.namedTimeZoneImpl) {
+                return new Date(ms);
+            }
+            else {
+                return arrayToUtcDate(this.namedTimeZoneImpl.timestampToArray(ms));
+            }
+        };
+        DateEnv.prototype.offsetForMarker = function (m) {
+            if (this.timeZone === 'local') {
+                return -arrayToLocalDate(dateToUtcArray(m)).getTimezoneOffset(); // convert "inverse" offset to "normal" offset
+            }
+            else if (this.timeZone === 'UTC') {
+                return 0;
+            }
+            else if (this.namedTimeZoneImpl) {
+                return this.namedTimeZoneImpl.offsetForArray(dateToUtcArray(m));
+            }
+            return null;
+        };
+        // Conversion
+        DateEnv.prototype.toDate = function (m, forcedTzo) {
+            if (this.timeZone === 'local') {
+                return arrayToLocalDate(dateToUtcArray(m));
+            }
+            else if (this.timeZone === 'UTC') {
+                return new Date(m.valueOf()); // make sure it's a copy
+            }
+            else if (!this.namedTimeZoneImpl) {
+                return new Date(m.valueOf() - (forcedTzo || 0));
+            }
+            else {
+                return new Date(m.valueOf() -
+                    this.namedTimeZoneImpl.offsetForArray(dateToUtcArray(m)) * 1000 * 60 // convert minutes -> ms
+                );
+            }
+        };
+        return DateEnv;
+    }());
+
+    var globalLocales = [];
+
+    var RAW_EN_LOCALE = {
+        code: 'en',
+        week: {
+            dow: 0,
+            doy: 4 // 4 days need to be within the year to be considered the first week
+        },
+        direction: 'ltr',
+        buttonText: {
+            prev: 'prev',
+            next: 'next',
+            prevYear: 'prev year',
+            nextYear: 'next year',
+            year: 'year',
+            today: 'today',
+            month: 'month',
+            week: 'week',
+            day: 'day',
+            list: 'list'
+        },
+        weekText: 'W',
+        allDayText: 'all-day',
+        moreLinkText: 'more',
+        noEventsText: 'No events to display'
+    };
+    function organizeRawLocales(explicitRawLocales) {
+        var defaultCode = explicitRawLocales.length > 0 ? explicitRawLocales[0].code : 'en';
+        var allRawLocales = globalLocales.concat(explicitRawLocales);
+        var rawLocaleMap = {
+            en: RAW_EN_LOCALE // necessary?
+        };
+        for (var _i = 0, allRawLocales_1 = allRawLocales; _i < allRawLocales_1.length; _i++) {
+            var rawLocale = allRawLocales_1[_i];
+            rawLocaleMap[rawLocale.code] = rawLocale;
+        }
+        return {
+            map: rawLocaleMap,
+            defaultCode: defaultCode
+        };
+    }
+    function buildLocale(inputSingular, available) {
+        if (typeof inputSingular === 'object' && !Array.isArray(inputSingular)) {
+            return parseLocale(inputSingular.code, [inputSingular.code], inputSingular);
+        }
+        else {
+            return queryLocale(inputSingular, available);
+        }
+    }
+    function queryLocale(codeArg, available) {
+        var codes = [].concat(codeArg || []); // will convert to array
+        var raw = queryRawLocale(codes, available) || RAW_EN_LOCALE;
+        return parseLocale(codeArg, codes, raw);
+    }
+    function queryRawLocale(codes, available) {
+        for (var i = 0; i < codes.length; i++) {
+            var parts = codes[i].toLocaleLowerCase().split('-');
+            for (var j = parts.length; j > 0; j--) {
+                var simpleId = parts.slice(0, j).join('-');
+                if (available[simpleId]) {
+                    return available[simpleId];
+                }
+            }
+        }
+        return null;
+    }
+    function parseLocale(codeArg, codes, raw) {
+        var merged = mergeProps([RAW_EN_LOCALE, raw], ['buttonText']);
+        delete merged.code; // don't want this part of the options
+        var week = merged.week;
+        delete merged.week;
+        return {
+            codeArg: codeArg,
+            codes: codes,
+            week: week,
+            simpleNumberFormat: new Intl.NumberFormat(codeArg),
+            options: merged
+        };
+    }
+
+    function formatDate(dateInput, options) {
+        if (options === void 0) { options = {}; }
+        var dateEnv = buildDateEnv(options);
+        var formatter = createFormatter(options);
+        var dateMeta = dateEnv.createMarkerMeta(dateInput);
+        if (!dateMeta) { // TODO: warning?
+            return '';
+        }
+        return dateEnv.format(dateMeta.marker, formatter, {
+            forcedTzo: dateMeta.forcedTzo
+        });
+    }
+    function formatRange(startInput, endInput, options // mixture of env and formatter settings
+    ) {
+        var dateEnv = buildDateEnv(typeof options === 'object' && options ? options : {}); // pass in if non-null object
+        var formatter = createFormatter(options);
+        var startMeta = dateEnv.createMarkerMeta(startInput);
+        var endMeta = dateEnv.createMarkerMeta(endInput);
+        if (!startMeta || !endMeta) { // TODO: warning?
+            return '';
+        }
+        return dateEnv.formatRange(startMeta.marker, endMeta.marker, formatter, {
+            forcedStartTzo: startMeta.forcedTzo,
+            forcedEndTzo: endMeta.forcedTzo,
+            isEndExclusive: options.isEndExclusive,
+            defaultSeparator: BASE_OPTION_DEFAULTS.defaultRangeSeparator
+        });
+    }
+    // TODO: more DRY and optimized
+    function buildDateEnv(settings) {
+        var locale = buildLocale(settings.locale || 'en', organizeRawLocales([]).map); // TODO: don't hardcode 'en' everywhere
+        return new DateEnv(__assign(__assign({ timeZone: BASE_OPTION_DEFAULTS.timeZone, calendarSystem: 'gregory' }, settings), { locale: locale }));
+    }
+
+    var DEF_DEFAULTS = {
+        startTime: '09:00',
+        endTime: '17:00',
+        daysOfWeek: [1, 2, 3, 4, 5],
+        display: 'inverse-background',
+        classNames: 'fc-non-business',
+        groupId: '_businessHours' // so multiple defs get grouped
+    };
+    /*
+    TODO: pass around as EventDefHash!!!
+    */
+    function parseBusinessHours(input, context) {
+        return parseEvents(refineInputs(input), null, context);
+    }
+    function refineInputs(input) {
+        var rawDefs;
+        if (input === true) {
+            rawDefs = [{}]; // will get DEF_DEFAULTS verbatim
+        }
+        else if (Array.isArray(input)) {
+            // if specifying an array, every sub-definition NEEDS a day-of-week
+            rawDefs = input.filter(function (rawDef) {
+                return rawDef.daysOfWeek;
+            });
+        }
+        else if (typeof input === 'object' && input) { // non-null object
+            rawDefs = [input];
+        }
+        else { // is probably false
+            rawDefs = [];
+        }
+        rawDefs = rawDefs.map(function (rawDef) {
+            return __assign(__assign({}, DEF_DEFAULTS), rawDef);
+        });
+        return rawDefs;
+    }
+
+    function pointInsideRect(point, rect) {
+        return point.left >= rect.left &&
+            point.left < rect.right &&
+            point.top >= rect.top &&
+            point.top < rect.bottom;
+    }
+    // Returns a new rectangle that is the intersection of the two rectangles. If they don't intersect, returns false
+    function intersectRects(rect1, rect2) {
+        var res = {
+            left: Math.max(rect1.left, rect2.left),
+            right: Math.min(rect1.right, rect2.right),
+            top: Math.max(rect1.top, rect2.top),
+            bottom: Math.min(rect1.bottom, rect2.bottom)
+        };
+        if (res.left < res.right && res.top < res.bottom) {
+            return res;
+        }
+        return false;
+    }
+    function translateRect(rect, deltaX, deltaY) {
+        return {
+            left: rect.left + deltaX,
+            right: rect.right + deltaX,
+            top: rect.top + deltaY,
+            bottom: rect.bottom + deltaY
+        };
+    }
+    // Returns a new point that will have been moved to reside within the given rectangle
+    function constrainPoint(point, rect) {
+        return {
+            left: Math.min(Math.max(point.left, rect.left), rect.right),
+            top: Math.min(Math.max(point.top, rect.top), rect.bottom)
+        };
+    }
+    // Returns a point that is the center of the given rectangle
+    function getRectCenter(rect) {
+        return {
+            left: (rect.left + rect.right) / 2,
+            top: (rect.top + rect.bottom) / 2
+        };
+    }
+    // Subtracts point2's coordinates from point1's coordinates, returning a delta
+    function diffPoints(point1, point2) {
+        return {
+            left: point1.left - point2.left,
+            top: point1.top - point2.top
+        };
+    }
+
+    var EMPTY_EVENT_STORE = createEmptyEventStore(); // for purecomponents. TODO: keep elsewhere
+    var Splitter = /** @class */ (function () {
+        function Splitter() {
+            this.getKeysForEventDefs = memoize(this._getKeysForEventDefs);
+            this.splitDateSelection = memoize(this._splitDateSpan);
+            this.splitEventStore = memoize(this._splitEventStore);
+            this.splitIndividualUi = memoize(this._splitIndividualUi);
+            this.splitEventDrag = memoize(this._splitInteraction);
+            this.splitEventResize = memoize(this._splitInteraction);
+            this.eventUiBuilders = {}; // TODO: typescript protection
+        }
+        Splitter.prototype.splitProps = function (props) {
+            var _this = this;
+            var keyInfos = this.getKeyInfo(props);
+            var defKeys = this.getKeysForEventDefs(props.eventStore);
+            var dateSelections = this.splitDateSelection(props.dateSelection);
+            var individualUi = this.splitIndividualUi(props.eventUiBases, defKeys); // the individual *bases*
+            var eventStores = this.splitEventStore(props.eventStore, defKeys);
+            var eventDrags = this.splitEventDrag(props.eventDrag);
+            var eventResizes = this.splitEventResize(props.eventResize);
+            var splitProps = {};
+            this.eventUiBuilders = mapHash(keyInfos, function (info, key) {
+                return _this.eventUiBuilders[key] || memoize(buildEventUiForKey);
+            });
+            for (var key in keyInfos) {
+                var keyInfo = keyInfos[key];
+                var eventStore = eventStores[key] || EMPTY_EVENT_STORE;
+                var buildEventUi = this.eventUiBuilders[key];
+                splitProps[key] = {
+                    businessHours: keyInfo.businessHours || props.businessHours,
+                    dateSelection: dateSelections[key] || null,
+                    eventStore: eventStore,
+                    eventUiBases: buildEventUi(props.eventUiBases[''], keyInfo.ui, individualUi[key]),
+                    eventSelection: eventStore.instances[props.eventSelection] ? props.eventSelection : '',
+                    eventDrag: eventDrags[key] || null,
+                    eventResize: eventResizes[key] || null
+                };
+            }
+            return splitProps;
+        };
+        Splitter.prototype._splitDateSpan = function (dateSpan) {
+            var dateSpans = {};
+            if (dateSpan) {
+                var keys = this.getKeysForDateSpan(dateSpan);
+                for (var _i = 0, keys_1 = keys; _i < keys_1.length; _i++) {
+                    var key = keys_1[_i];
+                    dateSpans[key] = dateSpan;
+                }
+            }
+            return dateSpans;
+        };
+        Splitter.prototype._getKeysForEventDefs = function (eventStore) {
+            var _this = this;
+            return mapHash(eventStore.defs, function (eventDef) {
+                return _this.getKeysForEventDef(eventDef);
+            });
+        };
+        Splitter.prototype._splitEventStore = function (eventStore, defKeys) {
+            var defs = eventStore.defs, instances = eventStore.instances;
+            var splitStores = {};
+            for (var defId in defs) {
+                for (var _i = 0, _a = defKeys[defId]; _i < _a.length; _i++) {
+                    var key = _a[_i];
+                    if (!splitStores[key]) {
+                        splitStores[key] = createEmptyEventStore();
+                    }
+                    splitStores[key].defs[defId] = defs[defId];
+                }
+            }
+            for (var instanceId in instances) {
+                var instance = instances[instanceId];
+                for (var _b = 0, _c = defKeys[instance.defId]; _b < _c.length; _b++) {
+                    var key = _c[_b];
+                    if (splitStores[key]) { // must have already been created
+                        splitStores[key].instances[instanceId] = instance;
+                    }
+                }
+            }
+            return splitStores;
+        };
+        Splitter.prototype._splitIndividualUi = function (eventUiBases, defKeys) {
+            var splitHashes = {};
+            for (var defId in eventUiBases) {
+                if (defId) { // not the '' key
+                    for (var _i = 0, _a = defKeys[defId]; _i < _a.length; _i++) {
+                        var key = _a[_i];
+                        if (!splitHashes[key]) {
+                            splitHashes[key] = {};
+                        }
+                        splitHashes[key][defId] = eventUiBases[defId];
+                    }
+                }
+            }
+            return splitHashes;
+        };
+        Splitter.prototype._splitInteraction = function (interaction) {
+            var splitStates = {};
+            if (interaction) {
+                var affectedStores_1 = this._splitEventStore(interaction.affectedEvents, this._getKeysForEventDefs(interaction.affectedEvents) // can't use cached. might be events from other calendar
+                );
+                // can't rely on defKeys because event data is mutated
+                var mutatedKeysByDefId = this._getKeysForEventDefs(interaction.mutatedEvents);
+                var mutatedStores_1 = this._splitEventStore(interaction.mutatedEvents, mutatedKeysByDefId);
+                var populate = function (key) {
+                    if (!splitStates[key]) {
+                        splitStates[key] = {
+                            affectedEvents: affectedStores_1[key] || EMPTY_EVENT_STORE,
+                            mutatedEvents: mutatedStores_1[key] || EMPTY_EVENT_STORE,
+                            isEvent: interaction.isEvent
+                        };
+                    }
+                };
+                for (var key in affectedStores_1) {
+                    populate(key);
+                }
+                for (var key in mutatedStores_1) {
+                    populate(key);
+                }
+            }
+            return splitStates;
+        };
+        return Splitter;
+    }());
+    function buildEventUiForKey(allUi, eventUiForKey, individualUi) {
+        var baseParts = [];
+        if (allUi) {
+            baseParts.push(allUi);
+        }
+        if (eventUiForKey) {
+            baseParts.push(eventUiForKey);
+        }
+        var stuff = {
+            '': combineEventUis(baseParts)
+        };
+        if (individualUi) {
+            __assign(stuff, individualUi);
+        }
+        return stuff;
+    }
+
+    function getDateMeta(date, todayRange, nowDate, dateProfile) {
+        return {
+            dow: date.getUTCDay(),
+            isDisabled: Boolean(dateProfile && !rangeContainsMarker(dateProfile.activeRange, date)),
+            isOther: Boolean(dateProfile && !rangeContainsMarker(dateProfile.currentRange, date)),
+            isToday: Boolean(todayRange && rangeContainsMarker(todayRange, date)),
+            isPast: Boolean(nowDate ? (date < nowDate) : todayRange ? (date < todayRange.start) : false),
+            isFuture: Boolean(nowDate ? (date > nowDate) : todayRange ? (date >= todayRange.end) : false)
+        };
+    }
+    function getDayClassNames(meta, theme) {
+        var classNames = [
+            'fc-day',
+            'fc-day-' + DAY_IDS[meta.dow]
+        ];
+        if (meta.isDisabled) {
+            classNames.push('fc-day-disabled');
+        }
+        else {
+            if (meta.isToday) {
+                classNames.push('fc-day-today');
+                classNames.push(theme.getClass('today'));
+            }
+            if (meta.isPast) {
+                classNames.push('fc-day-past');
+            }
+            if (meta.isFuture) {
+                classNames.push('fc-day-future');
+            }
+            if (meta.isOther) {
+                classNames.push('fc-day-other');
+            }
+        }
+        return classNames;
+    }
+    function getSlotClassNames(meta, theme) {
+        var classNames = [
+            'fc-slot',
+            'fc-slot-' + DAY_IDS[meta.dow]
+        ];
+        if (meta.isDisabled) {
+            classNames.push('fc-slot-disabled');
+        }
+        else {
+            if (meta.isToday) {
+                classNames.push('fc-slot-today');
+                classNames.push(theme.getClass('today'));
+            }
+            if (meta.isPast) {
+                classNames.push('fc-slot-past');
+            }
+            if (meta.isFuture) {
+                classNames.push('fc-slot-future');
+            }
+        }
+        return classNames;
+    }
+
+    function buildNavLinkData(date, type) {
+        if (type === void 0) { type = 'day'; }
+        return JSON.stringify({
+            date: formatDayString(date),
+            type: type
+        });
+    }
+
+    var _isRtlScrollbarOnLeft = null;
+    function getIsRtlScrollbarOnLeft() {
+        if (_isRtlScrollbarOnLeft === null) {
+            _isRtlScrollbarOnLeft = computeIsRtlScrollbarOnLeft();
+        }
+        return _isRtlScrollbarOnLeft;
+    }
+    function computeIsRtlScrollbarOnLeft() {
+        // TODO: use htmlToElement
+        var outerEl = document.createElement('div');
+        applyStyle(outerEl, {
+            position: 'absolute',
+            top: -1000,
+            left: 0,
+            border: 0,
+            padding: 0,
+            overflow: 'scroll',
+            direction: 'rtl'
+        });
+        outerEl.innerHTML = '<div></div>';
+        document.body.appendChild(outerEl);
+        var innerEl = outerEl.firstChild;
+        var res = innerEl.getBoundingClientRect().left > outerEl.getBoundingClientRect().left;
+        removeElement(outerEl);
+        return res;
+    }
+
+    var _scrollbarWidths;
+    function getScrollbarWidths() {
+        if (!_scrollbarWidths) {
+            _scrollbarWidths = computeScrollbarWidths();
+        }
+        return _scrollbarWidths;
+    }
+    function computeScrollbarWidths() {
+        var el = document.createElement('div');
+        el.style.overflow = 'scroll';
+        document.body.appendChild(el);
+        var res = computeScrollbarWidthsForEl(el);
+        document.body.removeChild(el);
+        return res;
+    }
+    // WARNING: will include border
+    function computeScrollbarWidthsForEl(el) {
+        return {
+            x: el.offsetHeight - el.clientHeight,
+            y: el.offsetWidth - el.clientWidth
+        };
+    }
+
+    function computeEdges(el, getPadding) {
+        if (getPadding === void 0) { getPadding = false; }
+        var computedStyle = window.getComputedStyle(el);
+        var borderLeft = parseInt(computedStyle.borderLeftWidth, 10) || 0;
+        var borderRight = parseInt(computedStyle.borderRightWidth, 10) || 0;
+        var borderTop = parseInt(computedStyle.borderTopWidth, 10) || 0;
+        var borderBottom = parseInt(computedStyle.borderBottomWidth, 10) || 0;
+        var badScrollbarWidths = computeScrollbarWidthsForEl(el); // includes border!
+        var scrollbarLeftRight = badScrollbarWidths.y - borderLeft - borderRight;
+        var scrollbarBottom = badScrollbarWidths.x - borderTop - borderBottom;
+        var res = {
+            borderLeft: borderLeft,
+            borderRight: borderRight,
+            borderTop: borderTop,
+            borderBottom: borderBottom,
+            scrollbarBottom: scrollbarBottom,
+            scrollbarLeft: 0,
+            scrollbarRight: 0
+        };
+        if (getIsRtlScrollbarOnLeft() && computedStyle.direction === 'rtl') { // is the scrollbar on the left side?
+            res.scrollbarLeft = scrollbarLeftRight;
+        }
+        else {
+            res.scrollbarRight = scrollbarLeftRight;
+        }
+        if (getPadding) {
+            res.paddingLeft = parseInt(computedStyle.paddingLeft, 10) || 0;
+            res.paddingRight = parseInt(computedStyle.paddingRight, 10) || 0;
+            res.paddingTop = parseInt(computedStyle.paddingTop, 10) || 0;
+            res.paddingBottom = parseInt(computedStyle.paddingBottom, 10) || 0;
+        }
+        return res;
+    }
+    function computeInnerRect(el, goWithinPadding, doFromWindowViewport) {
+        if (goWithinPadding === void 0) { goWithinPadding = false; }
+        var outerRect = doFromWindowViewport ? el.getBoundingClientRect() : computeRect(el);
+        var edges = computeEdges(el, goWithinPadding);
+        var res = {
+            left: outerRect.left + edges.borderLeft + edges.scrollbarLeft,
+            right: outerRect.right - edges.borderRight - edges.scrollbarRight,
+            top: outerRect.top + edges.borderTop,
+            bottom: outerRect.bottom - edges.borderBottom - edges.scrollbarBottom
+        };
+        if (goWithinPadding) {
+            res.left += edges.paddingLeft;
+            res.right -= edges.paddingRight;
+            res.top += edges.paddingTop;
+            res.bottom -= edges.paddingBottom;
+        }
+        return res;
+    }
+    function computeRect(el) {
+        var rect = el.getBoundingClientRect();
+        return {
+            left: rect.left + window.pageXOffset,
+            top: rect.top + window.pageYOffset,
+            right: rect.right + window.pageXOffset,
+            bottom: rect.bottom + window.pageYOffset
+        };
+    }
+    function computeHeightAndMargins(el) {
+        return el.getBoundingClientRect().height + computeVMargins(el);
+    }
+    function computeVMargins(el) {
+        var computed = window.getComputedStyle(el);
+        return parseInt(computed.marginTop, 10) +
+            parseInt(computed.marginBottom, 10);
+    }
+    // does not return window
+    function getClippingParents(el) {
+        var parents = [];
+        while (el instanceof HTMLElement) { // will stop when gets to document or null
+            var computedStyle = window.getComputedStyle(el);
+            if (computedStyle.position === 'fixed') {
+                break;
+            }
+            if ((/(auto|scroll)/).test(computedStyle.overflow + computedStyle.overflowY + computedStyle.overflowX)) {
+                parents.push(el);
+            }
+            el = el.parentNode;
+        }
+        return parents;
+    }
+
+    // given a function that resolves a result asynchronously.
+    // the function can either call passed-in success and failure callbacks,
+    // or it can return a promise.
+    // if you need to pass additional params to func, bind them first.
+    function unpromisify(func, success, failure) {
+        // guard against success/failure callbacks being called more than once
+        // and guard against a promise AND callback being used together.
+        var isResolved = false;
+        var wrappedSuccess = function () {
+            if (!isResolved) {
+                isResolved = true;
+                success.apply(this, arguments);
+            }
+        };
+        var wrappedFailure = function () {
+            if (!isResolved) {
+                isResolved = true;
+                if (failure) {
+                    failure.apply(this, arguments);
+                }
+            }
+        };
+        var res = func(wrappedSuccess, wrappedFailure);
+        if (res && typeof res.then === 'function') {
+            res.then(wrappedSuccess, wrappedFailure);
+        }
+    }
+
+    var Emitter = /** @class */ (function () {
+        function Emitter() {
+            this.handlers = {};
+            this.thisContext = null;
+        }
+        Emitter.prototype.setThisContext = function (thisContext) {
+            this.thisContext = thisContext;
+        };
+        Emitter.prototype.setOptions = function (options) {
+            this.options = options;
+        };
+        Emitter.prototype.on = function (type, handler) {
+            addToHash(this.handlers, type, handler);
+        };
+        Emitter.prototype.off = function (type, handler) {
+            removeFromHash(this.handlers, type, handler);
+        };
+        Emitter.prototype.trigger = function (type) {
+            var args = [];
+            for (var _i = 1; _i < arguments.length; _i++) {
+                args[_i - 1] = arguments[_i];
+            }
+            var attachedHandlers = this.handlers[type] || [];
+            var optionHandler = this.options && this.options[type];
+            var handlers = [].concat(optionHandler || [], attachedHandlers);
+            for (var _a = 0, handlers_1 = handlers; _a < handlers_1.length; _a++) {
+                var handler = handlers_1[_a];
+                handler.apply(this.thisContext, args);
+            }
+        };
+        Emitter.prototype.hasHandlers = function (type) {
+            return (this.handlers[type] && this.handlers[type].length) ||
+                (this.options && this.options[type]);
+        };
+        return Emitter;
+    }());
+    function addToHash(hash, type, handler) {
+        (hash[type] || (hash[type] = []))
+            .push(handler);
+    }
+    function removeFromHash(hash, type, handler) {
+        if (handler) {
+            if (hash[type]) {
+                hash[type] = hash[type].filter(function (func) {
+                    return func !== handler;
+                });
+            }
+        }
+        else {
+            delete hash[type]; // remove all handler funcs for this type
+        }
+    }
+
+    /*
+    Records offset information for a set of elements, relative to an origin element.
+    Can record the left/right OR the top/bottom OR both.
+    Provides methods for querying the cache by position.
+    */
+    var PositionCache = /** @class */ (function () {
+        function PositionCache(originEl, els, isHorizontal, isVertical) {
+            this.els = els;
+            var originClientRect = this.originClientRect = originEl.getBoundingClientRect(); // relative to viewport top-left
+            if (isHorizontal) {
+                this.buildElHorizontals(originClientRect.left);
+            }
+            if (isVertical) {
+                this.buildElVerticals(originClientRect.top);
+            }
+        }
+        // Populates the left/right internal coordinate arrays
+        PositionCache.prototype.buildElHorizontals = function (originClientLeft) {
+            var lefts = [];
+            var rights = [];
+            for (var _i = 0, _a = this.els; _i < _a.length; _i++) {
+                var el = _a[_i];
+                var rect = el.getBoundingClientRect();
+                lefts.push(rect.left - originClientLeft);
+                rights.push(rect.right - originClientLeft);
+            }
+            this.lefts = lefts;
+            this.rights = rights;
+        };
+        // Populates the top/bottom internal coordinate arrays
+        PositionCache.prototype.buildElVerticals = function (originClientTop) {
+            var tops = [];
+            var bottoms = [];
+            for (var _i = 0, _a = this.els; _i < _a.length; _i++) {
+                var el = _a[_i];
+                var rect = el.getBoundingClientRect();
+                tops.push(rect.top - originClientTop);
+                bottoms.push(rect.bottom - originClientTop);
+            }
+            this.tops = tops;
+            this.bottoms = bottoms;
+        };
+        // Given a left offset (from document left), returns the index of the el that it horizontally intersects.
+        // If no intersection is made, returns undefined.
+        PositionCache.prototype.leftToIndex = function (leftPosition) {
+            var lefts = this.lefts;
+            var rights = this.rights;
+            var len = lefts.length;
+            var i;
+            for (i = 0; i < len; i++) {
+                if (leftPosition >= lefts[i] && leftPosition < rights[i]) {
+                    return i;
+                }
+            }
+        };
+        // Given a top offset (from document top), returns the index of the el that it vertically intersects.
+        // If no intersection is made, returns undefined.
+        PositionCache.prototype.topToIndex = function (topPosition) {
+            var tops = this.tops;
+            var bottoms = this.bottoms;
+            var len = tops.length;
+            var i;
+            for (i = 0; i < len; i++) {
+                if (topPosition >= tops[i] && topPosition < bottoms[i]) {
+                    return i;
+                }
+            }
+        };
+        // Gets the width of the element at the given index
+        PositionCache.prototype.getWidth = function (leftIndex) {
+            return this.rights[leftIndex] - this.lefts[leftIndex];
+        };
+        // Gets the height of the element at the given index
+        PositionCache.prototype.getHeight = function (topIndex) {
+            return this.bottoms[topIndex] - this.tops[topIndex];
+        };
+        return PositionCache;
+    }());
+
+    /*
+    An object for getting/setting scroll-related information for an element.
+    Internally, this is done very differently for window versus DOM element,
+    so this object serves as a common interface.
+    */
+    var ScrollController = /** @class */ (function () {
+        function ScrollController() {
+        }
+        ScrollController.prototype.getMaxScrollTop = function () {
+            return this.getScrollHeight() - this.getClientHeight();
+        };
+        ScrollController.prototype.getMaxScrollLeft = function () {
+            return this.getScrollWidth() - this.getClientWidth();
+        };
+        ScrollController.prototype.canScrollVertically = function () {
+            return this.getMaxScrollTop() > 0;
+        };
+        ScrollController.prototype.canScrollHorizontally = function () {
+            return this.getMaxScrollLeft() > 0;
+        };
+        ScrollController.prototype.canScrollUp = function () {
+            return this.getScrollTop() > 0;
+        };
+        ScrollController.prototype.canScrollDown = function () {
+            return this.getScrollTop() < this.getMaxScrollTop();
+        };
+        ScrollController.prototype.canScrollLeft = function () {
+            return this.getScrollLeft() > 0;
+        };
+        ScrollController.prototype.canScrollRight = function () {
+            return this.getScrollLeft() < this.getMaxScrollLeft();
+        };
+        return ScrollController;
+    }());
+    var ElementScrollController = /** @class */ (function (_super) {
+        __extends(ElementScrollController, _super);
+        function ElementScrollController(el) {
+            var _this = _super.call(this) || this;
+            _this.el = el;
+            return _this;
+        }
+        ElementScrollController.prototype.getScrollTop = function () {
+            return this.el.scrollTop;
+        };
+        ElementScrollController.prototype.getScrollLeft = function () {
+            return this.el.scrollLeft;
+        };
+        ElementScrollController.prototype.setScrollTop = function (top) {
+            this.el.scrollTop = top;
+        };
+        ElementScrollController.prototype.setScrollLeft = function (left) {
+            this.el.scrollLeft = left;
+        };
+        ElementScrollController.prototype.getScrollWidth = function () {
+            return this.el.scrollWidth;
+        };
+        ElementScrollController.prototype.getScrollHeight = function () {
+            return this.el.scrollHeight;
+        };
+        ElementScrollController.prototype.getClientHeight = function () {
+            return this.el.clientHeight;
+        };
+        ElementScrollController.prototype.getClientWidth = function () {
+            return this.el.clientWidth;
+        };
+        return ElementScrollController;
+    }(ScrollController));
+    var WindowScrollController = /** @class */ (function (_super) {
+        __extends(WindowScrollController, _super);
+        function WindowScrollController() {
+            return _super !== null && _super.apply(this, arguments) || this;
+        }
+        WindowScrollController.prototype.getScrollTop = function () {
+            return window.pageYOffset;
+        };
+        WindowScrollController.prototype.getScrollLeft = function () {
+            return window.pageXOffset;
+        };
+        WindowScrollController.prototype.setScrollTop = function (n) {
+            window.scroll(window.pageXOffset, n);
+        };
+        WindowScrollController.prototype.setScrollLeft = function (n) {
+            window.scroll(n, window.pageYOffset);
+        };
+        WindowScrollController.prototype.getScrollWidth = function () {
+            return document.documentElement.scrollWidth;
+        };
+        WindowScrollController.prototype.getScrollHeight = function () {
+            return document.documentElement.scrollHeight;
+        };
+        WindowScrollController.prototype.getClientHeight = function () {
+            return document.documentElement.clientHeight;
+        };
+        WindowScrollController.prototype.getClientWidth = function () {
+            return document.documentElement.clientWidth;
+        };
+        return WindowScrollController;
+    }(ScrollController));
+
+    var Theme = /** @class */ (function () {
+        function Theme(calendarOptions) {
+            if (this.iconOverrideOption) {
+                this.setIconOverride(calendarOptions[this.iconOverrideOption]);
+            }
+        }
+        Theme.prototype.setIconOverride = function (iconOverrideHash) {
+            var iconClassesCopy;
+            var buttonName;
+            if (typeof iconOverrideHash === 'object' && iconOverrideHash) { // non-null object
+                iconClassesCopy = __assign({}, this.iconClasses);
+                for (buttonName in iconOverrideHash) {
+                    iconClassesCopy[buttonName] = this.applyIconOverridePrefix(iconOverrideHash[buttonName]);
+                }
+                this.iconClasses = iconClassesCopy;
+            }
+            else if (iconOverrideHash === false) {
+                this.iconClasses = {};
+            }
+        };
+        Theme.prototype.applyIconOverridePrefix = function (className) {
+            var prefix = this.iconOverridePrefix;
+            if (prefix && className.indexOf(prefix) !== 0) { // if not already present
+                className = prefix + className;
+            }
+            return className;
+        };
+        Theme.prototype.getClass = function (key) {
+            return this.classes[key] || '';
+        };
+        Theme.prototype.getIconClass = function (buttonName, isRtl) {
+            var className;
+            if (isRtl && this.rtlIconClasses) {
+                className = this.rtlIconClasses[buttonName] || this.iconClasses[buttonName];
+            }
+            else {
+                className = this.iconClasses[buttonName];
+            }
+            if (className) {
+                return this.baseIconClass + ' ' + className;
+            }
+            return '';
+        };
+        Theme.prototype.getCustomButtonIconClass = function (customButtonProps) {
+            var className;
+            if (this.iconOverrideCustomButtonOption) {
+                className = customButtonProps[this.iconOverrideCustomButtonOption];
+                if (className) {
+                    return this.baseIconClass + ' ' + this.applyIconOverridePrefix(className);
+                }
+            }
+            return '';
+        };
+        return Theme;
+    }());
+    Theme.prototype.classes = {};
+    Theme.prototype.iconClasses = {};
+    Theme.prototype.baseIconClass = '';
+    Theme.prototype.iconOverridePrefix = '';
+
+    /// <reference types="@fullcalendar/core-vdom" />
+    if (typeof FullCalendarVDom === 'undefined') {
+        throw new Error('Please import the top-level fullcalendar lib before attempting to import a plugin.');
+    }
+    var Component = FullCalendarVDom.Component;
+    var createElement = FullCalendarVDom.createElement;
+    var render = FullCalendarVDom.render;
+    var createRef = FullCalendarVDom.createRef;
+    var Fragment = FullCalendarVDom.Fragment;
+    var createContext$1 = FullCalendarVDom.createContext;
+    var flushToDom$1 = FullCalendarVDom.flushToDom;
+
+    var ScrollResponder = /** @class */ (function () {
+        function ScrollResponder(execFunc, emitter, scrollTime) {
+            var _this = this;
+            this.execFunc = execFunc;
+            this.emitter = emitter;
+            this.scrollTime = scrollTime;
+            this.handleScrollRequest = function (request) {
+                _this.queuedRequest = __assign({}, _this.queuedRequest || {}, request);
+                _this.drain();
+            };
+            emitter.on('_scrollRequest', this.handleScrollRequest);
+            this.fireInitialScroll();
+        }
+        ScrollResponder.prototype.detach = function () {
+            this.emitter.off('_scrollRequest', this.handleScrollRequest);
+        };
+        ScrollResponder.prototype.update = function (isDatesNew) {
+            if (isDatesNew) {
+                this.fireInitialScroll(); // will drain
+            }
+            else {
+                this.drain();
+            }
+        };
+        ScrollResponder.prototype.fireInitialScroll = function () {
+            this.handleScrollRequest({
+                time: this.scrollTime
+            });
+        };
+        ScrollResponder.prototype.drain = function () {
+            if (this.queuedRequest && this.execFunc(this.queuedRequest)) {
+                this.queuedRequest = null;
+            }
+        };
+        return ScrollResponder;
+    }());
+
+    var ViewContextType = createContext$1({}); // for Components
+    function buildViewContext(viewSpec, viewApi, viewOptions, dateProfileGenerator, dateEnv, theme, pluginHooks, dispatch, getCurrentData, emitter, calendarApi, registerInteractiveComponent, unregisterInteractiveComponent) {
+        return {
+            dateEnv: dateEnv,
+            options: viewOptions,
+            pluginHooks: pluginHooks,
+            emitter: emitter,
+            dispatch: dispatch,
+            getCurrentData: getCurrentData,
+            calendarApi: calendarApi,
+            viewSpec: viewSpec,
+            viewApi: viewApi,
+            dateProfileGenerator: dateProfileGenerator,
+            theme: theme,
+            isRtl: viewOptions.direction === 'rtl',
+            addResizeHandler: function (handler) {
+                emitter.on('_resize', handler);
+            },
+            removeResizeHandler: function (handler) {
+                emitter.off('_resize', handler);
+            },
+            createScrollResponder: function (execFunc) {
+                return new ScrollResponder(execFunc, emitter, createDuration(viewOptions.scrollTime));
+            },
+            registerInteractiveComponent: registerInteractiveComponent,
+            unregisterInteractiveComponent: unregisterInteractiveComponent
+        };
+    }
+
+    var PureComponent = /** @class */ (function (_super) {
+        __extends(PureComponent, _super);
+        function PureComponent() {
+            return _super !== null && _super.apply(this, arguments) || this;
+        }
+        PureComponent.prototype.shouldComponentUpdate = function (nextProps, nextState) {
+            if (this.debug) {
+                console.log(getUnequalProps(nextProps, this.props), getUnequalProps(nextState, this.state));
+            }
+            return !compareObjs(this.props, nextProps, this.propEquality) ||
+                !compareObjs(this.state, nextState, this.stateEquality);
+        };
+        PureComponent.addPropsEquality = addPropsEquality;
+        PureComponent.addStateEquality = addStateEquality;
+        PureComponent.contextType = ViewContextType;
+        return PureComponent;
+    }(Component));
+    PureComponent.prototype.propEquality = {};
+    PureComponent.prototype.stateEquality = {};
+    var BaseComponent = /** @class */ (function (_super) {
+        __extends(BaseComponent, _super);
+        function BaseComponent() {
+            return _super !== null && _super.apply(this, arguments) || this;
+        }
+        BaseComponent.contextType = ViewContextType;
+        return BaseComponent;
+    }(PureComponent));
+    function addPropsEquality(propEquality) {
+        var hash = Object.create(this.prototype.propEquality);
+        __assign(hash, propEquality);
+        this.prototype.propEquality = hash;
+    }
+    function addStateEquality(stateEquality) {
+        var hash = Object.create(this.prototype.stateEquality);
+        __assign(hash, stateEquality);
+        this.prototype.stateEquality = hash;
+    }
+    // use other one
+    function setRef(ref, current) {
+        if (typeof ref === 'function') {
+            ref(current);
+        }
+        else if (ref) {
+            // see https://github.com/facebook/react/issues/13029
+            ref.current = current;
+        }
+    }
+
+    function reduceEventStore(eventStore, action, eventSources, dateProfile, context) {
+        switch (action.type) {
+            case 'RECEIVE_EVENTS': // raw
+                return receiveRawEvents(eventStore, eventSources[action.sourceId], action.fetchId, action.fetchRange, action.rawEvents, context);
+            case 'ADD_EVENTS': // already parsed, but not expanded
+                return addEvent(eventStore, action.eventStore, // new ones
+                dateProfile ? dateProfile.activeRange : null, context);
+            case 'MERGE_EVENTS': // already parsed and expanded
+                return mergeEventStores(eventStore, action.eventStore);
+            case 'PREV': // TODO: how do we track all actions that affect dateProfile :(
+            case 'NEXT':
+            case 'CHANGE_DATE':
+            case 'CHANGE_VIEW_TYPE':
+                if (dateProfile) {
+                    return expandRecurring(eventStore, dateProfile.activeRange, context);
+                }
+                else {
+                    return eventStore;
+                }
+            case 'REMOVE_EVENTS':
+                return excludeSubEventStore(eventStore, action.eventStore);
+            case 'REMOVE_EVENT_SOURCE':
+                return excludeEventsBySourceId(eventStore, action.sourceId);
+            case 'REMOVE_ALL_EVENT_SOURCES':
+                return filterEventStoreDefs(eventStore, function (eventDef) {
+                    return !eventDef.sourceId; // only keep events with no source id
+                });
+            case 'REMOVE_ALL_EVENTS':
+                return createEmptyEventStore();
+            default:
+                return eventStore;
+        }
+    }
+    function receiveRawEvents(eventStore, eventSource, fetchId, fetchRange, rawEvents, context) {
+        if (eventSource && // not already removed
+            fetchId === eventSource.latestFetchId // TODO: wish this logic was always in event-sources
+        ) {
+            var subset = parseEvents(transformRawEvents(rawEvents, eventSource, context), eventSource, context);
+            if (fetchRange) {
+                subset = expandRecurring(subset, fetchRange, context);
+            }
+            return mergeEventStores(excludeEventsBySourceId(eventStore, eventSource.sourceId), subset);
+        }
+        return eventStore;
+    }
+    function transformRawEvents(rawEvents, eventSource, context) {
+        var calEachTransform = context.options.eventDataTransform;
+        var sourceEachTransform = eventSource ? eventSource.eventDataTransform : null;
+        if (sourceEachTransform) {
+            rawEvents = transformEachRawEvent(rawEvents, sourceEachTransform);
+        }
+        if (calEachTransform) {
+            rawEvents = transformEachRawEvent(rawEvents, calEachTransform);
+        }
+        return rawEvents;
+    }
+    function transformEachRawEvent(rawEvents, func) {
+        var refinedEvents;
+        if (!func) {
+            refinedEvents = rawEvents;
+        }
+        else {
+            refinedEvents = [];
+            for (var _i = 0, rawEvents_1 = rawEvents; _i < rawEvents_1.length; _i++) {
+                var rawEvent = rawEvents_1[_i];
+                var refinedEvent = func(rawEvent);
+                if (refinedEvent) {
+                    refinedEvents.push(refinedEvent);
+                }
+                else if (refinedEvent == null) {
+                    refinedEvents.push(rawEvent);
+                } // if a different falsy value, do nothing
+            }
+        }
+        return refinedEvents;
+    }
+    function addEvent(eventStore, subset, expandRange, context) {
+        if (expandRange) {
+            subset = expandRecurring(subset, expandRange, context);
+        }
+        return mergeEventStores(eventStore, subset);
+    }
+    function rezoneEventStoreDates(eventStore, oldDateEnv, newDateEnv) {
+        var defs = eventStore.defs;
+        var instances = mapHash(eventStore.instances, function (instance) {
+            var def = defs[instance.defId];
+            if (def.allDay || def.recurringDef) {
+                return instance; // isn't dependent on timezone
+            }
+            else {
+                return __assign(__assign({}, instance), { range: {
+                        start: newDateEnv.createMarker(oldDateEnv.toDate(instance.range.start, instance.forcedStartTzo)),
+                        end: newDateEnv.createMarker(oldDateEnv.toDate(instance.range.end, instance.forcedEndTzo))
+                    }, forcedStartTzo: newDateEnv.canComputeOffset ? null : instance.forcedStartTzo, forcedEndTzo: newDateEnv.canComputeOffset ? null : instance.forcedEndTzo });
+            }
+        });
+        return { defs: defs, instances: instances };
+    }
+    function excludeEventsBySourceId(eventStore, sourceId) {
+        return filterEventStoreDefs(eventStore, function (eventDef) {
+            return eventDef.sourceId !== sourceId;
+        });
+    }
+    // QUESTION: why not just return instances? do a general object-property-exclusion util
+    function excludeInstances(eventStore, removals) {
+        return {
+            defs: eventStore.defs,
+            instances: filterHash(eventStore.instances, function (instance) {
+                return !removals[instance.instanceId];
+            })
+        };
+    }
+
+    // high-level segmenting-aware tester functions
+    // ------------------------------------------------------------------------------------------------------------------------
+    function isInteractionValid(interaction, context) {
+        return isNewPropsValid({ eventDrag: interaction }, context); // HACK: the eventDrag props is used for ALL interactions
+    }
+    function isDateSelectionValid(dateSelection, context) {
+        return isNewPropsValid({ dateSelection: dateSelection }, context);
+    }
+    function isNewPropsValid(newProps, context) {
+        var calendarState = context.getCurrentData();
+        var props = __assign({ businessHours: calendarState.businessHours, dateSelection: '', eventStore: calendarState.eventStore, eventUiBases: calendarState.eventUiBases, eventSelection: '', eventDrag: null, eventResize: null }, newProps);
+        return (context.pluginHooks.isPropsValid || isPropsValid)(props, context);
+    }
+    function isPropsValid(state, context, dateSpanMeta, filterConfig) {
+        if (dateSpanMeta === void 0) { dateSpanMeta = {}; }
+        if (state.eventDrag && !isInteractionPropsValid(state, context, dateSpanMeta, filterConfig)) {
+            return false;
+        }
+        if (state.dateSelection && !isDateSelectionPropsValid(state, context, dateSpanMeta, filterConfig)) {
+            return false;
+        }
+        return true;
+    }
+    // Moving Event Validation
+    // ------------------------------------------------------------------------------------------------------------------------
+    function isInteractionPropsValid(state, context, dateSpanMeta, filterConfig) {
+        var currentState = context.getCurrentData();
+        var interaction = state.eventDrag; // HACK: the eventDrag props is used for ALL interactions
+        var subjectEventStore = interaction.mutatedEvents;
+        var subjectDefs = subjectEventStore.defs;
+        var subjectInstances = subjectEventStore.instances;
+        var subjectConfigs = compileEventUis(subjectDefs, interaction.isEvent ?
+            state.eventUiBases :
+            { '': currentState.selectionConfig } // if not a real event, validate as a selection
+        );
+        if (filterConfig) {
+            subjectConfigs = mapHash(subjectConfigs, filterConfig);
+        }
+        var otherEventStore = excludeInstances(state.eventStore, interaction.affectedEvents.instances); // exclude the subject events. TODO: exclude defs too?
+        var otherDefs = otherEventStore.defs;
+        var otherInstances = otherEventStore.instances;
+        var otherConfigs = compileEventUis(otherDefs, state.eventUiBases);
+        for (var subjectInstanceId in subjectInstances) {
+            var subjectInstance = subjectInstances[subjectInstanceId];
+            var subjectRange = subjectInstance.range;
+            var subjectConfig = subjectConfigs[subjectInstance.defId];
+            var subjectDef = subjectDefs[subjectInstance.defId];
+            // constraint
+            if (!allConstraintsPass(subjectConfig.constraints, subjectRange, otherEventStore, state.businessHours, context)) {
+                return false;
+            }
+            // overlap
+            var eventOverlap = context.options.eventOverlap;
+            var eventOverlapFunc = typeof eventOverlap === 'function' ? eventOverlap : null;
+            for (var otherInstanceId in otherInstances) {
+                var otherInstance = otherInstances[otherInstanceId];
+                // intersect! evaluate
+                if (rangesIntersect(subjectRange, otherInstance.range)) {
+                    var otherOverlap = otherConfigs[otherInstance.defId].overlap;
+                    // consider the other event's overlap. only do this if the subject event is a "real" event
+                    if (otherOverlap === false && interaction.isEvent) {
+                        return false;
+                    }
+                    if (subjectConfig.overlap === false) {
+                        return false;
+                    }
+                    if (eventOverlapFunc && !eventOverlapFunc(new EventApi(context, otherDefs[otherInstance.defId], otherInstance), // still event
+                    new EventApi(context, subjectDef, subjectInstance) // moving event
+                    )) {
+                        return false;
+                    }
+                }
+            }
+            // allow (a function)
+            var calendarEventStore = currentState.eventStore; // need global-to-calendar, not local to component (splittable)state
+            for (var _i = 0, _a = subjectConfig.allows; _i < _a.length; _i++) {
+                var subjectAllow = _a[_i];
+                var subjectDateSpan = __assign(__assign({}, dateSpanMeta), { range: subjectInstance.range, allDay: subjectDef.allDay });
+                var origDef = calendarEventStore.defs[subjectDef.defId];
+                var origInstance = calendarEventStore.instances[subjectInstanceId];
+                var eventApi = void 0;
+                if (origDef) { // was previously in the calendar
+                    eventApi = new EventApi(context, origDef, origInstance);
+                }
+                else { // was an external event
+                    eventApi = new EventApi(context, subjectDef); // no instance, because had no dates
+                }
+                if (!subjectAllow(buildDateSpanApiWithContext(subjectDateSpan, context), eventApi)) {
+                    return false;
+                }
+            }
+        }
+        return true;
+    }
+    // Date Selection Validation
+    // ------------------------------------------------------------------------------------------------------------------------
+    function isDateSelectionPropsValid(state, context, dateSpanMeta, filterConfig) {
+        var relevantEventStore = state.eventStore;
+        var relevantDefs = relevantEventStore.defs;
+        var relevantInstances = relevantEventStore.instances;
+        var selection = state.dateSelection;
+        var selectionRange = selection.range;
+        var selectionConfig = context.getCurrentData().selectionConfig;
+        if (filterConfig) {
+            selectionConfig = filterConfig(selectionConfig);
+        }
+        // constraint
+        if (!allConstraintsPass(selectionConfig.constraints, selectionRange, relevantEventStore, state.businessHours, context)) {
+            return false;
+        }
+        // overlap
+        var selectOverlap = context.options.selectOverlap;
+        var selectOverlapFunc = typeof selectOverlap === 'function' ? selectOverlap : null;
+        for (var relevantInstanceId in relevantInstances) {
+            var relevantInstance = relevantInstances[relevantInstanceId];
+            // intersect! evaluate
+            if (rangesIntersect(selectionRange, relevantInstance.range)) {
+                if (selectionConfig.overlap === false) {
+                    return false;
+                }
+                if (selectOverlapFunc && !selectOverlapFunc(new EventApi(context, relevantDefs[relevantInstance.defId], relevantInstance), null)) {
+                    return false;
+                }
+            }
+        }
+        // allow (a function)
+        for (var _i = 0, _a = selectionConfig.allows; _i < _a.length; _i++) {
+            var selectionAllow = _a[_i];
+            var fullDateSpan = __assign(__assign({}, dateSpanMeta), selection);
+            if (!selectionAllow(buildDateSpanApiWithContext(fullDateSpan, context), null)) {
+                return false;
+            }
+        }
+        return true;
+    }
+    // Constraint Utils
+    // ------------------------------------------------------------------------------------------------------------------------
+    function allConstraintsPass(constraints, subjectRange, otherEventStore, businessHoursUnexpanded, context) {
+        for (var _i = 0, constraints_1 = constraints; _i < constraints_1.length; _i++) {
+            var constraint = constraints_1[_i];
+            if (!anyRangesContainRange(constraintToRanges(constraint, subjectRange, otherEventStore, businessHoursUnexpanded, context), subjectRange)) {
+                return false;
+            }
+        }
+        return true;
+    }
+    function constraintToRanges(constraint, subjectRange, // for expanding a recurring constraint, or expanding business hours
+    otherEventStore, // for if constraint is an even group ID
+    businessHoursUnexpanded, // for if constraint is 'businessHours'
+    context // for expanding businesshours
+    ) {
+        if (constraint === 'businessHours') {
+            return eventStoreToRanges(expandRecurring(businessHoursUnexpanded, subjectRange, context));
+        }
+        else if (typeof constraint === 'string') { // an group ID
+            return eventStoreToRanges(filterEventStoreDefs(otherEventStore, function (eventDef) {
+                return eventDef.groupId === constraint;
+            }));
+        }
+        else if (typeof constraint === 'object' && constraint) { // non-null object
+            return eventStoreToRanges(expandRecurring(constraint, subjectRange, context));
+        }
+        return []; // if it's false
+    }
+    // TODO: move to event-store file?
+    function eventStoreToRanges(eventStore) {
+        var instances = eventStore.instances;
+        var ranges = [];
+        for (var instanceId in instances) {
+            ranges.push(instances[instanceId].range);
+        }
+        return ranges;
+    }
+    // TODO: move to geom file?
+    function anyRangesContainRange(outerRanges, innerRange) {
+        for (var _i = 0, outerRanges_1 = outerRanges; _i < outerRanges_1.length; _i++) {
+            var outerRange = outerRanges_1[_i];
+            if (rangeContainsRange(outerRange, innerRange)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /*
+    an INTERACTABLE date component
+
+    PURPOSES:
+    - hook up to fg, fill, and mirror renderers
+    - interface for dragging and hits
+    */
+    var DateComponent = /** @class */ (function (_super) {
+        __extends(DateComponent, _super);
+        function DateComponent() {
+            var _this = _super !== null && _super.apply(this, arguments) || this;
+            _this.uid = guid();
+            return _this;
+        }
+        // Hit System
+        // -----------------------------------------------------------------------------------------------------------------
+        DateComponent.prototype.prepareHits = function () {
+        };
+        DateComponent.prototype.queryHit = function (positionLeft, positionTop, elWidth, elHeight) {
+            return null; // this should be abstract
+        };
+        // Validation
+        // -----------------------------------------------------------------------------------------------------------------
+        DateComponent.prototype.isInteractionValid = function (interaction) {
+            var dateProfile = this.props.dateProfile; // HACK
+            var instances = interaction.mutatedEvents.instances;
+            if (dateProfile) { // HACK for MorePopover
+                for (var instanceId in instances) {
+                    if (!rangeContainsRange(dateProfile.validRange, instances[instanceId].range)) {
+                        return false;
+                    }
+                }
+            }
+            return isInteractionValid(interaction, this.context);
+        };
+        DateComponent.prototype.isDateSelectionValid = function (selection) {
+            var dateProfile = this.props.dateProfile; // HACK
+            if (dateProfile && // HACK for MorePopover
+                !rangeContainsRange(dateProfile.validRange, selection.range)) {
+                return false;
+            }
+            return isDateSelectionValid(selection, this.context);
+        };
+        // Pointer Interaction Utils
+        // -----------------------------------------------------------------------------------------------------------------
+        DateComponent.prototype.isValidSegDownEl = function (el) {
+            return !this.props.eventDrag && // HACK
+                !this.props.eventResize && // HACK
+                !elementClosest(el, '.fc-event-mirror') &&
+                (this.isPopover() || !this.isInPopover(el));
+            // ^above line ensures we don't detect a seg interaction within a nested component.
+            // it's a HACK because it only supports a popover as the nested component.
+        };
+        DateComponent.prototype.isValidDateDownEl = function (el) {
+            return !elementClosest(el, '.fc-event:not(.fc-bg-event)') &&
+                !elementClosest(el, '.fc-daygrid-more-link') && // a "more.." link
+                !elementClosest(el, 'a[data-navlink]') && // a clickable nav link
+                !this.isInPopover(el);
+        };
+        DateComponent.prototype.isPopover = function () {
+            return false;
+        };
+        DateComponent.prototype.isInPopover = function (el) {
+            return Boolean(elementClosest(el, '.fc-popover'));
+        };
+        return DateComponent;
+    }(BaseComponent));
+
+    // TODO: easier way to add new hooks? need to update a million things
+    function createPlugin(input) {
+        return {
+            id: guid(),
+            deps: input.deps || [],
+            reducers: input.reducers || [],
+            contextInit: [].concat(input.contextInit || []),
+            eventRefiners: input.eventRefiners || {},
+            eventDefMemberAdders: input.eventDefMemberAdders || [],
+            eventSourceRefiners: input.eventSourceRefiners || {},
+            isDraggableTransformers: input.isDraggableTransformers || [],
+            eventDragMutationMassagers: input.eventDragMutationMassagers || [],
+            eventDefMutationAppliers: input.eventDefMutationAppliers || [],
+            dateSelectionTransformers: input.dateSelectionTransformers || [],
+            datePointTransforms: input.datePointTransforms || [],
+            dateSpanTransforms: input.dateSpanTransforms || [],
+            views: input.views || {},
+            viewPropsTransformers: input.viewPropsTransformers || [],
+            isPropsValid: input.isPropsValid || null,
+            externalDefTransforms: input.externalDefTransforms || [],
+            eventResizeJoinTransforms: input.eventResizeJoinTransforms || [],
+            viewContainerAppends: input.viewContainerAppends || [],
+            eventDropTransformers: input.eventDropTransformers || [],
+            componentInteractions: input.componentInteractions || [],
+            calendarInteractions: input.calendarInteractions || [],
+            themeClasses: input.themeClasses || {},
+            eventSourceDefs: input.eventSourceDefs || [],
+            cmdFormatter: input.cmdFormatter,
+            recurringTypes: input.recurringTypes || [],
+            namedTimeZonedImpl: input.namedTimeZonedImpl,
+            initialView: input.initialView || '',
+            elementDraggingImpl: input.elementDraggingImpl,
+            optionChangeHandlers: input.optionChangeHandlers || {},
+            scrollGridImpl: input.scrollGridImpl || null,
+            contentTypeHandlers: input.contentTypeHandlers || {},
+            listenerRefiners: input.listenerRefiners || {},
+            optionRefiners: input.optionRefiners || {},
+            propSetHandlers: input.propSetHandlers || {}
+        };
+    }
+    function buildPluginHooks(pluginDefs, globalDefs) {
+        var isAdded = {};
+        var hooks = {
+            reducers: [],
+            contextInit: [],
+            eventRefiners: {},
+            eventDefMemberAdders: [],
+            eventSourceRefiners: {},
+            isDraggableTransformers: [],
+            eventDragMutationMassagers: [],
+            eventDefMutationAppliers: [],
+            dateSelectionTransformers: [],
+            datePointTransforms: [],
+            dateSpanTransforms: [],
+            views: {},
+            viewPropsTransformers: [],
+            isPropsValid: null,
+            externalDefTransforms: [],
+            eventResizeJoinTransforms: [],
+            viewContainerAppends: [],
+            eventDropTransformers: [],
+            componentInteractions: [],
+            calendarInteractions: [],
+            themeClasses: {},
+            eventSourceDefs: [],
+            cmdFormatter: null,
+            recurringTypes: [],
+            namedTimeZonedImpl: null,
+            initialView: '',
+            elementDraggingImpl: null,
+            optionChangeHandlers: {},
+            scrollGridImpl: null,
+            contentTypeHandlers: {},
+            listenerRefiners: {},
+            optionRefiners: {},
+            propSetHandlers: {}
+        };
+        function addDefs(defs) {
+            for (var _i = 0, defs_1 = defs; _i < defs_1.length; _i++) {
+                var def = defs_1[_i];
+                if (!isAdded[def.id]) {
+                    isAdded[def.id] = true;
+                    addDefs(def.deps);
+                    hooks = combineHooks(hooks, def);
+                }
+            }
+        }
+        if (pluginDefs) {
+            addDefs(pluginDefs);
+        }
+        addDefs(globalDefs);
+        return hooks;
+    }
+    function buildBuildPluginHooks() {
+        var currentOverrideDefs = [];
+        var currentGlobalDefs = [];
+        var currentHooks;
+        return function (overrideDefs, globalDefs) {
+            if (!currentHooks || !isArraysEqual(overrideDefs, currentOverrideDefs) || !isArraysEqual(globalDefs, currentGlobalDefs)) {
+                currentHooks = buildPluginHooks(overrideDefs, globalDefs);
+            }
+            currentOverrideDefs = overrideDefs;
+            currentGlobalDefs = globalDefs;
+            return currentHooks;
+        };
+    }
+    function combineHooks(hooks0, hooks1) {
+        return {
+            reducers: hooks0.reducers.concat(hooks1.reducers),
+            contextInit: hooks0.contextInit.concat(hooks1.contextInit),
+            eventRefiners: __assign(__assign({}, hooks0.eventRefiners), hooks1.eventRefiners),
+            eventDefMemberAdders: hooks0.eventDefMemberAdders.concat(hooks1.eventDefMemberAdders),
+            eventSourceRefiners: __assign(__assign({}, hooks0.eventSourceRefiners), hooks1.eventSourceRefiners),
+            isDraggableTransformers: hooks0.isDraggableTransformers.concat(hooks1.isDraggableTransformers),
+            eventDragMutationMassagers: hooks0.eventDragMutationMassagers.concat(hooks1.eventDragMutationMassagers),
+            eventDefMutationAppliers: hooks0.eventDefMutationAppliers.concat(hooks1.eventDefMutationAppliers),
+            dateSelectionTransformers: hooks0.dateSelectionTransformers.concat(hooks1.dateSelectionTransformers),
+            datePointTransforms: hooks0.datePointTransforms.concat(hooks1.datePointTransforms),
+            dateSpanTransforms: hooks0.dateSpanTransforms.concat(hooks1.dateSpanTransforms),
+            views: __assign(__assign({}, hooks0.views), hooks1.views),
+            viewPropsTransformers: hooks0.viewPropsTransformers.concat(hooks1.viewPropsTransformers),
+            isPropsValid: hooks1.isPropsValid || hooks0.isPropsValid,
+            externalDefTransforms: hooks0.externalDefTransforms.concat(hooks1.externalDefTransforms),
+            eventResizeJoinTransforms: hooks0.eventResizeJoinTransforms.concat(hooks1.eventResizeJoinTransforms),
+            viewContainerAppends: hooks0.viewContainerAppends.concat(hooks1.viewContainerAppends),
+            eventDropTransformers: hooks0.eventDropTransformers.concat(hooks1.eventDropTransformers),
+            calendarInteractions: hooks0.calendarInteractions.concat(hooks1.calendarInteractions),
+            componentInteractions: hooks0.componentInteractions.concat(hooks1.componentInteractions),
+            themeClasses: __assign(__assign({}, hooks0.themeClasses), hooks1.themeClasses),
+            eventSourceDefs: hooks0.eventSourceDefs.concat(hooks1.eventSourceDefs),
+            cmdFormatter: hooks1.cmdFormatter || hooks0.cmdFormatter,
+            recurringTypes: hooks0.recurringTypes.concat(hooks1.recurringTypes),
+            namedTimeZonedImpl: hooks1.namedTimeZonedImpl || hooks0.namedTimeZonedImpl,
+            initialView: hooks0.initialView || hooks1.initialView,
+            elementDraggingImpl: hooks0.elementDraggingImpl || hooks1.elementDraggingImpl,
+            optionChangeHandlers: __assign(__assign({}, hooks0.optionChangeHandlers), hooks1.optionChangeHandlers),
+            scrollGridImpl: hooks1.scrollGridImpl || hooks0.scrollGridImpl,
+            contentTypeHandlers: __assign(__assign({}, hooks0.contentTypeHandlers), hooks1.contentTypeHandlers),
+            listenerRefiners: __assign(__assign({}, hooks0.listenerRefiners), hooks1.listenerRefiners),
+            optionRefiners: __assign(__assign({}, hooks0.optionRefiners), hooks1.optionRefiners),
+            propSetHandlers: __assign(__assign({}, hooks0.propSetHandlers), hooks1.propSetHandlers)
+        };
+    }
+
+    var StandardTheme = /** @class */ (function (_super) {
+        __extends(StandardTheme, _super);
+        function StandardTheme() {
+            return _super !== null && _super.apply(this, arguments) || this;
+        }
+        return StandardTheme;
+    }(Theme));
+    StandardTheme.prototype.classes = {
+        root: 'fc-theme-standard',
+        tableCellShaded: 'fc-cell-shaded',
+        buttonGroup: 'fc-button-group',
+        button: 'fc-button fc-button-primary',
+        buttonActive: 'fc-button-active'
+    };
+    StandardTheme.prototype.baseIconClass = 'fc-icon';
+    StandardTheme.prototype.iconClasses = {
+        close: 'fc-icon-x',
+        prev: 'fc-icon-chevron-left',
+        next: 'fc-icon-chevron-right',
+        prevYear: 'fc-icon-chevrons-left',
+        nextYear: 'fc-icon-chevrons-right'
+    };
+    StandardTheme.prototype.rtlIconClasses = {
+        prev: 'fc-icon-chevron-right',
+        next: 'fc-icon-chevron-left',
+        prevYear: 'fc-icon-chevrons-right',
+        nextYear: 'fc-icon-chevrons-left'
+    };
+    StandardTheme.prototype.iconOverrideOption = 'buttonIcons'; // TODO: make TS-friendly
+    StandardTheme.prototype.iconOverrideCustomButtonOption = 'icon';
+    StandardTheme.prototype.iconOverridePrefix = 'fc-icon-';
+
+    function compileViewDefs(defaultConfigs, overrideConfigs) {
+        var hash = {};
+        var viewType;
+        for (viewType in defaultConfigs) {
+            ensureViewDef(viewType, hash, defaultConfigs, overrideConfigs);
+        }
+        for (viewType in overrideConfigs) {
+            ensureViewDef(viewType, hash, defaultConfigs, overrideConfigs);
+        }
+        return hash;
+    }
+    function ensureViewDef(viewType, hash, defaultConfigs, overrideConfigs) {
+        if (hash[viewType]) {
+            return hash[viewType];
+        }
+        var viewDef = buildViewDef(viewType, hash, defaultConfigs, overrideConfigs);
+        if (viewDef) {
+            hash[viewType] = viewDef;
+        }
+        return viewDef;
+    }
+    function buildViewDef(viewType, hash, defaultConfigs, overrideConfigs) {
+        var defaultConfig = defaultConfigs[viewType];
+        var overrideConfig = overrideConfigs[viewType];
+        var queryProp = function (name) {
+            return (defaultConfig && defaultConfig[name] !== null) ? defaultConfig[name] :
+                ((overrideConfig && overrideConfig[name] !== null) ? overrideConfig[name] : null);
+        };
+        var theComponent = queryProp('component');
+        var superType = queryProp('superType');
+        var superDef = null;
+        if (superType) {
+            if (superType === viewType) {
+                throw new Error('Can\'t have a custom view type that references itself');
+            }
+            superDef = ensureViewDef(superType, hash, defaultConfigs, overrideConfigs);
+        }
+        if (!theComponent && superDef) {
+            theComponent = superDef.component;
+        }
+        if (!theComponent) {
+            return null; // don't throw a warning, might be settings for a single-unit view
+        }
+        return {
+            type: viewType,
+            component: theComponent,
+            defaults: __assign(__assign({}, (superDef ? superDef.defaults : {})), (defaultConfig ? defaultConfig.rawOptions : {})),
+            overrides: __assign(__assign({}, (superDef ? superDef.overrides : {})), (overrideConfig ? overrideConfig.rawOptions : {}))
+        };
+    }
+
+    // NOTE: in JSX, you should always use this class with <HookProps> arg. otherwise, will default to any???
+    var RenderHook = /** @class */ (function (_super) {
+        __extends(RenderHook, _super);
+        function RenderHook() {
+            var _this = _super !== null && _super.apply(this, arguments) || this;
+            _this.rootElRef = createRef();
+            _this.handleRootEl = function (el) {
+                setRef(_this.rootElRef, el);
+                if (_this.props.elRef) {
+                    setRef(_this.props.elRef, el);
+                }
+            };
+            return _this;
+        }
+        RenderHook.prototype.render = function () {
+            var _this = this;
+            var props = this.props;
+            var hookProps = props.hookProps;
+            return (createElement(MountHook, { hookProps: hookProps, didMount: props.didMount, willUnmount: props.willUnmount, elRef: this.handleRootEl }, function (rootElRef) { return (createElement(ContentHook, { hookProps: hookProps, content: props.content, defaultContent: props.defaultContent, backupElRef: _this.rootElRef }, function (innerElRef, innerContent) { return props.children(rootElRef, normalizeClassNames(props.classNames, hookProps), innerElRef, innerContent); })); }));
+        };
+        return RenderHook;
+    }(BaseComponent));
+    // for forcing rerender of components that use the ContentHook
+    var CustomContentRenderContext = createContext$1(0);
+    var ContentHook = /** @class */ (function (_super) {
+        __extends(ContentHook, _super);
+        function ContentHook() {
+            var _this = _super !== null && _super.apply(this, arguments) || this;
+            _this.innerElRef = createRef();
+            return _this;
+        }
+        ContentHook.prototype.render = function () {
+            var _this = this;
+            return (createElement(CustomContentRenderContext.Consumer, null, function () { return (_this.props.children(_this.innerElRef, _this.renderInnerContent())); }));
+        };
+        ContentHook.prototype.componentDidMount = function () {
+            this.updateCustomContent();
+        };
+        ContentHook.prototype.componentDidUpdate = function () {
+            this.updateCustomContent();
+        };
+        ContentHook.prototype.renderInnerContent = function () {
+            var contentTypeHandlers = this.context.pluginHooks.contentTypeHandlers;
+            var _a = this, props = _a.props, customContentInfo = _a.customContentInfo;
+            var rawVal = props.content;
+            var innerContent = normalizeContent(rawVal, props.hookProps);
+            var innerContentVDom = null;
+            if (innerContent === undefined) { // use the default
+                innerContent = normalizeContent(props.defaultContent, props.hookProps);
+            }
+            if (innerContent !== undefined) { // we allow custom content handlers to return nothing
+                if (customContentInfo) {
+                    customContentInfo.contentVal = innerContent[customContentInfo.contentKey];
+                }
+                else if (typeof innerContent === 'object') {
+                    // look for a prop that would indicate a custom content handler is needed
+                    for (var contentKey in contentTypeHandlers) {
+                        if (innerContent[contentKey] !== undefined) {
+                            customContentInfo = this.customContentInfo = {
+                                contentKey: contentKey,
+                                contentVal: innerContent[contentKey],
+                                handler: contentTypeHandlers[contentKey]()
+                            };
+                            break;
+                        }
+                    }
+                }
+                if (customContentInfo) {
+                    innerContentVDom = []; // signal that something was specified
+                }
+                else {
+                    innerContentVDom = innerContent; // assume a [p]react vdom node. use it
+                }
+            }
+            return innerContentVDom;
+        };
+        ContentHook.prototype.updateCustomContent = function () {
+            if (this.customContentInfo) {
+                this.customContentInfo.handler(this.innerElRef.current || this.props.backupElRef.current, // the element to render into
+                this.customContentInfo.contentVal);
+            }
+        };
+        return ContentHook;
+    }(BaseComponent));
+    var MountHook = /** @class */ (function (_super) {
+        __extends(MountHook, _super);
+        function MountHook() {
+            var _this = _super !== null && _super.apply(this, arguments) || this;
+            _this.handleRootEl = function (rootEl) {
+                _this.rootEl = rootEl;
+                if (_this.props.elRef) {
+                    setRef(_this.props.elRef, rootEl);
+                }
+            };
+            return _this;
+        }
+        MountHook.prototype.render = function () {
+            return this.props.children(this.handleRootEl);
+        };
+        MountHook.prototype.componentDidMount = function () {
+            var callback = this.props.didMount;
+            callback && callback(__assign(__assign({}, this.props.hookProps), { el: this.rootEl }));
+        };
+        MountHook.prototype.componentWillUnmount = function () {
+            var callback = this.props.willUnmount;
+            callback && callback(__assign(__assign({}, this.props.hookProps), { el: this.rootEl }));
+        };
+        return MountHook;
+    }(BaseComponent));
+    function buildClassNameNormalizer() {
+        var currentGenerator;
+        var currentHookProps;
+        var currentClassNames = [];
+        return function (generator, hookProps) {
+            if (!currentHookProps || !isPropsEqual(currentHookProps, hookProps) || generator !== currentGenerator) {
+                currentGenerator = generator;
+                currentHookProps = hookProps;
+                currentClassNames = normalizeClassNames(generator, hookProps);
+            }
+            return currentClassNames;
+        };
+    }
+    function normalizeClassNames(classNames, hookProps) {
+        if (typeof classNames === 'function') {
+            classNames = classNames(hookProps);
+        }
+        return parseClassNames(classNames);
+    }
+    function normalizeContent(input, hookProps) {
+        if (typeof input === 'function') {
+            return input(hookProps, createElement); // give the function the vdom-creation func
+        }
+        else {
+            return input;
+        }
+    }
+
+    var ViewRoot = /** @class */ (function (_super) {
+        __extends(ViewRoot, _super);
+        function ViewRoot() {
+            var _this = _super !== null && _super.apply(this, arguments) || this;
+            _this.normalizeClassNames = buildClassNameNormalizer();
+            return _this;
+        }
+        ViewRoot.prototype.render = function () {
+            var _a = this, props = _a.props, context = _a.context;
+            var options = context.options;
+            var hookProps = { view: context.viewApi };
+            var customClassNames = this.normalizeClassNames(options.viewClassNames, hookProps);
+            return (createElement(MountHook, { hookProps: hookProps, didMount: options.viewDidMount, willUnmount: options.viewWillUnmount, elRef: props.elRef }, function (rootElRef) { return props.children(rootElRef, ["fc-" + props.viewSpec.type + "-view", 'fc-view'].concat(customClassNames)); }));
+        };
+        return ViewRoot;
+    }(BaseComponent));
+
+    function parseViewConfigs(inputs) {
+        return mapHash(inputs, parseViewConfig);
+    }
+    function parseViewConfig(input) {
+        var rawOptions = typeof input === 'function' ?
+            { component: input } :
+            input;
+        var component = rawOptions.component;
+        if (rawOptions.content) {
+            component = createViewHookComponent(rawOptions);
+            // TODO: remove content/classNames/didMount/etc from options?
+        }
+        return {
+            superType: rawOptions.type,
+            component: component,
+            rawOptions: rawOptions // includes type and component too :(
+        };
+    }
+    function createViewHookComponent(options) {
+        return function (viewProps) {
+            return (createElement(ViewContextType.Consumer, null, function (context) { return (createElement(ViewRoot, { viewSpec: context.viewSpec }, function (rootElRef, viewClassNames) {
+                var hookProps = __assign(__assign({}, viewProps), { nextDayThreshold: context.options.nextDayThreshold });
+                return (createElement(RenderHook, { hookProps: hookProps, classNames: options.classNames, content: options.content, didMount: options.didMount, willUnmount: options.willUnmount, elRef: rootElRef }, function (rootElRef, customClassNames, innerElRef, innerContent) { return (createElement("div", { className: viewClassNames.concat(customClassNames).join(' '), ref: rootElRef }, innerContent)); }));
+            })); }));
+        };
+    }
+
+    function buildViewSpecs(defaultInputs, optionOverrides, dynamicOptionOverrides, localeDefaults) {
+        var defaultConfigs = parseViewConfigs(defaultInputs);
+        var overrideConfigs = parseViewConfigs(optionOverrides.views);
+        var viewDefs = compileViewDefs(defaultConfigs, overrideConfigs);
+        return mapHash(viewDefs, function (viewDef) {
+            return buildViewSpec(viewDef, overrideConfigs, optionOverrides, dynamicOptionOverrides, localeDefaults);
+        });
+    }
+    function buildViewSpec(viewDef, overrideConfigs, optionOverrides, dynamicOptionOverrides, localeDefaults) {
+        var durationInput = viewDef.overrides.duration ||
+            viewDef.defaults.duration ||
+            dynamicOptionOverrides.duration ||
+            optionOverrides.duration;
+        var duration = null;
+        var durationUnit = '';
+        var singleUnit = '';
+        var singleUnitOverrides = {};
+        if (durationInput) {
+            duration = createDurationCached(durationInput);
+            if (duration) { // valid?
+                var denom = greatestDurationDenominator(duration);
+                durationUnit = denom.unit;
+                if (denom.value === 1) {
+                    singleUnit = durationUnit;
+                    singleUnitOverrides = overrideConfigs[durationUnit] ? overrideConfigs[durationUnit].rawOptions : {};
+                }
+            }
+        }
+        var queryButtonText = function (optionsSubset) {
+            var buttonTextMap = optionsSubset.buttonText || {};
+            var buttonTextKey = viewDef.defaults.buttonTextKey;
+            if (buttonTextKey != null && buttonTextMap[buttonTextKey] != null) {
+                return buttonTextMap[buttonTextKey];
+            }
+            if (buttonTextMap[viewDef.type] != null) {
+                return buttonTextMap[viewDef.type];
+            }
+            if (buttonTextMap[singleUnit] != null) {
+                return buttonTextMap[singleUnit];
+            }
+        };
+        return {
+            type: viewDef.type,
+            component: viewDef.component,
+            duration: duration,
+            durationUnit: durationUnit,
+            singleUnit: singleUnit,
+            optionDefaults: viewDef.defaults,
+            optionOverrides: __assign(__assign({}, singleUnitOverrides), viewDef.overrides),
+            buttonTextOverride: queryButtonText(dynamicOptionOverrides) ||
+                queryButtonText(optionOverrides) || // constructor-specified buttonText lookup hash takes precedence
+                viewDef.overrides.buttonText,
+            buttonTextDefault: queryButtonText(localeDefaults) ||
+                viewDef.defaults.buttonText ||
+                queryButtonText(BASE_OPTION_DEFAULTS) ||
+                viewDef.type // fall back to given view name
+        };
+    }
+    // hack to get memoization working
+    var durationInputMap = {};
+    function createDurationCached(durationInput) {
+        var json = JSON.stringify(durationInput);
+        var res = durationInputMap[json];
+        if (res === undefined) {
+            res = createDuration(durationInput);
+            durationInputMap[json] = res;
+        }
+        return res;
+    }
+
+    var DateProfileGenerator = /** @class */ (function () {
+        function DateProfileGenerator(props) {
+            this.props = props;
+            this.nowDate = getNow(props.nowInput, props.dateEnv);
+            this.initHiddenDays();
+        }
+        /* Date Range Computation
+        ------------------------------------------------------------------------------------------------------------------*/
+        // Builds a structure with info about what the dates/ranges will be for the "prev" view.
+        DateProfileGenerator.prototype.buildPrev = function (currentDateProfile, currentDate, forceToValid) {
+            var dateEnv = this.props.dateEnv;
+            var prevDate = dateEnv.subtract(dateEnv.startOf(currentDate, currentDateProfile.currentRangeUnit), // important for start-of-month
+            currentDateProfile.dateIncrement);
+            return this.build(prevDate, -1, forceToValid);
+        };
+        // Builds a structure with info about what the dates/ranges will be for the "next" view.
+        DateProfileGenerator.prototype.buildNext = function (currentDateProfile, currentDate, forceToValid) {
+            var dateEnv = this.props.dateEnv;
+            var nextDate = dateEnv.add(dateEnv.startOf(currentDate, currentDateProfile.currentRangeUnit), // important for start-of-month
+            currentDateProfile.dateIncrement);
+            return this.build(nextDate, 1, forceToValid);
+        };
+        // Builds a structure holding dates/ranges for rendering around the given date.
+        // Optional direction param indicates whether the date is being incremented/decremented
+        // from its previous value. decremented = -1, incremented = 1 (default).
+        DateProfileGenerator.prototype.build = function (currentDate, direction, forceToValid) {
+            if (forceToValid === void 0) { forceToValid = true; }
+            var props = this.props;
+            var validRange;
+            var currentInfo;
+            var isRangeAllDay;
+            var renderRange;
+            var activeRange;
+            var isValid;
+            validRange = this.buildValidRange();
+            validRange = this.trimHiddenDays(validRange);
+            if (forceToValid) {
+                currentDate = constrainMarkerToRange(currentDate, validRange);
+            }
+            currentInfo = this.buildCurrentRangeInfo(currentDate, direction);
+            isRangeAllDay = /^(year|month|week|day)$/.test(currentInfo.unit);
+            renderRange = this.buildRenderRange(this.trimHiddenDays(currentInfo.range), currentInfo.unit, isRangeAllDay);
+            renderRange = this.trimHiddenDays(renderRange);
+            activeRange = renderRange;
+            if (!props.showNonCurrentDates) {
+                activeRange = intersectRanges(activeRange, currentInfo.range);
+            }
+            activeRange = this.adjustActiveRange(activeRange);
+            activeRange = intersectRanges(activeRange, validRange); // might return null
+            // it's invalid if the originally requested date is not contained,
+            // or if the range is completely outside of the valid range.
+            isValid = rangesIntersect(currentInfo.range, validRange);
+            return {
+                // constraint for where prev/next operations can go and where events can be dragged/resized to.
+                // an object with optional start and end properties.
+                validRange: validRange,
+                // range the view is formally responsible for.
+                // for example, a month view might have 1st-31st, excluding padded dates
+                currentRange: currentInfo.range,
+                // name of largest unit being displayed, like "month" or "week"
+                currentRangeUnit: currentInfo.unit,
+                isRangeAllDay: isRangeAllDay,
+                // dates that display events and accept drag-n-drop
+                // will be `null` if no dates accept events
+                activeRange: activeRange,
+                // date range with a rendered skeleton
+                // includes not-active days that need some sort of DOM
+                renderRange: renderRange,
+                // Duration object that denotes the first visible time of any given day
+                slotMinTime: props.slotMinTime,
+                // Duration object that denotes the exclusive visible end time of any given day
+                slotMaxTime: props.slotMaxTime,
+                isValid: isValid,
+                // how far the current date will move for a prev/next operation
+                dateIncrement: this.buildDateIncrement(currentInfo.duration)
+                // pass a fallback (might be null) ^
+            };
+        };
+        // Builds an object with optional start/end properties.
+        // Indicates the minimum/maximum dates to display.
+        // not responsible for trimming hidden days.
+        DateProfileGenerator.prototype.buildValidRange = function () {
+            var input = this.props.validRangeInput;
+            var simpleInput = typeof input === 'function'
+                ? input.call(this.props.calendarApi, this.nowDate)
+                : input;
+            return this.refineRange(simpleInput) ||
+                { start: null, end: null }; // completely open-ended
+        };
+        // Builds a structure with info about the "current" range, the range that is
+        // highlighted as being the current month for example.
+        // See build() for a description of `direction`.
+        // Guaranteed to have `range` and `unit` properties. `duration` is optional.
+        DateProfileGenerator.prototype.buildCurrentRangeInfo = function (date, direction) {
+            var props = this.props;
+            var duration = null;
+            var unit = null;
+            var range = null;
+            var dayCount;
+            if (props.duration) {
+                duration = props.duration;
+                unit = props.durationUnit;
+                range = this.buildRangeFromDuration(date, direction, duration, unit);
+            }
+            else if ((dayCount = this.props.dayCount)) {
+                unit = 'day';
+                range = this.buildRangeFromDayCount(date, direction, dayCount);
+            }
+            else if ((range = this.buildCustomVisibleRange(date))) {
+                unit = props.dateEnv.greatestWholeUnit(range.start, range.end).unit;
+            }
+            else {
+                duration = this.getFallbackDuration();
+                unit = greatestDurationDenominator(duration).unit;
+                range = this.buildRangeFromDuration(date, direction, duration, unit);
+            }
+            return { duration: duration, unit: unit, range: range };
+        };
+        DateProfileGenerator.prototype.getFallbackDuration = function () {
+            return createDuration({ day: 1 });
+        };
+        // Returns a new activeRange to have time values (un-ambiguate)
+        // slotMinTime or slotMaxTime causes the range to expand.
+        DateProfileGenerator.prototype.adjustActiveRange = function (range) {
+            var _a = this.props, dateEnv = _a.dateEnv, usesMinMaxTime = _a.usesMinMaxTime, slotMinTime = _a.slotMinTime, slotMaxTime = _a.slotMaxTime;
+            var start = range.start;
+            var end = range.end;
+            if (usesMinMaxTime) {
+                // expand active range if slotMinTime is negative (why not when positive?)
+                if (asRoughDays(slotMinTime) < 0) {
+                    start = startOfDay(start); // necessary?
+                    start = dateEnv.add(start, slotMinTime);
+                }
+                // expand active range if slotMaxTime is beyond one day (why not when negative?)
+                if (asRoughDays(slotMaxTime) > 1) {
+                    end = startOfDay(end); // necessary?
+                    end = addDays(end, -1);
+                    end = dateEnv.add(end, slotMaxTime);
+                }
+            }
+            return { start: start, end: end };
+        };
+        // Builds the "current" range when it is specified as an explicit duration.
+        // `unit` is the already-computed greatestDurationDenominator unit of duration.
+        DateProfileGenerator.prototype.buildRangeFromDuration = function (date, direction, duration, unit) {
+            var _a = this.props, dateEnv = _a.dateEnv, dateAlignment = _a.dateAlignment;
+            var start;
+            var end;
+            var res;
+            // compute what the alignment should be
+            if (!dateAlignment) {
+                var dateIncrement = this.props.dateIncrement;
+                if (dateIncrement) {
+                    // use the smaller of the two units
+                    if (asRoughMs(dateIncrement) < asRoughMs(duration)) {
+                        dateAlignment = greatestDurationDenominator(dateIncrement).unit;
+                    }
+                    else {
+                        dateAlignment = unit;
+                    }
+                }
+                else {
+                    dateAlignment = unit;
+                }
+            }
+            // if the view displays a single day or smaller
+            if (asRoughDays(duration) <= 1) {
+                if (this.isHiddenDay(start)) {
+                    start = this.skipHiddenDays(start, direction);
+                    start = startOfDay(start);
+                }
+            }
+            function computeRes() {
+                start = dateEnv.startOf(date, dateAlignment);
+                end = dateEnv.add(start, duration);
+                res = { start: start, end: end };
+            }
+            computeRes();
+            // if range is completely enveloped by hidden days, go past the hidden days
+            if (!this.trimHiddenDays(res)) {
+                date = this.skipHiddenDays(date, direction);
+                computeRes();
+            }
+            return res;
+        };
+        // Builds the "current" range when a dayCount is specified.
+        DateProfileGenerator.prototype.buildRangeFromDayCount = function (date, direction, dayCount) {
+            var _a = this.props, dateEnv = _a.dateEnv, dateAlignment = _a.dateAlignment;
+            var runningCount = 0;
+            var start = date;
+            var end;
+            if (dateAlignment) {
+                start = dateEnv.startOf(start, dateAlignment);
+            }
+            start = startOfDay(start);
+            start = this.skipHiddenDays(start, direction);
+            end = start;
+            do {
+                end = addDays(end, 1);
+                if (!this.isHiddenDay(end)) {
+                    runningCount++;
+                }
+            } while (runningCount < dayCount);
+            return { start: start, end: end };
+        };
+        // Builds a normalized range object for the "visible" range,
+        // which is a way to define the currentRange and activeRange at the same time.
+        DateProfileGenerator.prototype.buildCustomVisibleRange = function (date) {
+            var props = this.props;
+            var input = props.visibleRangeInput;
+            var simpleInput = typeof input === 'function'
+                ? input.call(props.calendarApi, props.dateEnv.toDate(date))
+                : input;
+            var range = this.refineRange(simpleInput);
+            if (range && (range.start == null || range.end == null)) {
+                return null;
+            }
+            return range;
+        };
+        // Computes the range that will represent the element/cells for *rendering*,
+        // but which may have voided days/times.
+        // not responsible for trimming hidden days.
+        DateProfileGenerator.prototype.buildRenderRange = function (currentRange, currentRangeUnit, isRangeAllDay) {
+            return currentRange;
+        };
+        // Compute the duration value that should be added/substracted to the current date
+        // when a prev/next operation happens.
+        DateProfileGenerator.prototype.buildDateIncrement = function (fallback) {
+            var dateIncrement = this.props.dateIncrement;
+            var customAlignment;
+            if (dateIncrement) {
+                return dateIncrement;
+            }
+            else if ((customAlignment = this.props.dateAlignment)) {
+                return createDuration(1, customAlignment);
+            }
+            else if (fallback) {
+                return fallback;
+            }
+            else {
+                return createDuration({ days: 1 });
+            }
+        };
+        DateProfileGenerator.prototype.refineRange = function (rangeInput) {
+            if (rangeInput) {
+                var range = parseRange(rangeInput, this.props.dateEnv);
+                if (range) {
+                    range = computeVisibleDayRange(range);
+                }
+                return range;
+            }
+            return null;
+        };
+        /* Hidden Days
+        ------------------------------------------------------------------------------------------------------------------*/
+        // Initializes internal variables related to calculating hidden days-of-week
+        DateProfileGenerator.prototype.initHiddenDays = function () {
+            var hiddenDays = this.props.hiddenDays || []; // array of day-of-week indices that are hidden
+            var isHiddenDayHash = []; // is the day-of-week hidden? (hash with day-of-week-index -> bool)
+            var dayCnt = 0;
+            var i;
+            if (this.props.weekends === false) {
+                hiddenDays.push(0, 6); // 0=sunday, 6=saturday
+            }
+            for (i = 0; i < 7; i++) {
+                if (!(isHiddenDayHash[i] = hiddenDays.indexOf(i) !== -1)) {
+                    dayCnt++;
+                }
+            }
+            if (!dayCnt) {
+                throw new Error('invalid hiddenDays'); // all days were hidden? bad.
+            }
+            this.isHiddenDayHash = isHiddenDayHash;
+        };
+        // Remove days from the beginning and end of the range that are computed as hidden.
+        // If the whole range is trimmed off, returns null
+        DateProfileGenerator.prototype.trimHiddenDays = function (range) {
+            var start = range.start;
+            var end = range.end;
+            if (start) {
+                start = this.skipHiddenDays(start);
+            }
+            if (end) {
+                end = this.skipHiddenDays(end, -1, true);
+            }
+            if (start == null || end == null || start < end) {
+                return { start: start, end: end };
+            }
+            return null;
+        };
+        // Is the current day hidden?
+        // `day` is a day-of-week index (0-6), or a Date (used for UTC)
+        DateProfileGenerator.prototype.isHiddenDay = function (day) {
+            if (day instanceof Date) {
+                day = day.getUTCDay();
+            }
+            return this.isHiddenDayHash[day];
+        };
+        // Incrementing the current day until it is no longer a hidden day, returning a copy.
+        // DOES NOT CONSIDER validRange!
+        // If the initial value of `date` is not a hidden day, don't do anything.
+        // Pass `isExclusive` as `true` if you are dealing with an end date.
+        // `inc` defaults to `1` (increment one day forward each time)
+        DateProfileGenerator.prototype.skipHiddenDays = function (date, inc, isExclusive) {
+            if (inc === void 0) { inc = 1; }
+            if (isExclusive === void 0) { isExclusive = false; }
+            while (this.isHiddenDayHash[(date.getUTCDay() + (isExclusive ? inc : 0) + 7) % 7]) {
+                date = addDays(date, inc);
+            }
+            return date;
+        };
+        return DateProfileGenerator;
+    }());
+
+    function reduceViewType(viewType, action) {
+        switch (action.type) {
+            case 'CHANGE_VIEW_TYPE':
+                return viewType = action.viewType;
+        }
+        return viewType;
+    }
+
+    function reduceDynamicOptionOverrides(dynamicOptionOverrides, action) {
+        var _a;
+        switch (action.type) {
+            case 'SET_OPTION':
+                return __assign(__assign({}, dynamicOptionOverrides), (_a = {}, _a[action.optionName] = action.rawOptionValue, _a));
+            default:
+                return dynamicOptionOverrides;
+        }
+    }
+
+    function reduceDateProfile(currentDateProfile, action, currentDate, dateProfileGenerator) {
+        var dp;
+        switch (action.type) {
+            case 'CHANGE_VIEW_TYPE':
+                return dateProfileGenerator.build(action.dateMarker || currentDate);
+            case 'CHANGE_DATE':
+                if (!currentDateProfile.activeRange ||
+                    !rangeContainsMarker(currentDateProfile.currentRange, action.dateMarker) // don't move if date already in view
+                ) {
+                    return dateProfileGenerator.build(action.dateMarker);
+                }
+                break;
+            case 'PREV':
+                dp = dateProfileGenerator.buildPrev(currentDateProfile, currentDate);
+                if (dp.isValid) {
+                    return dp;
+                }
+                break;
+            case 'NEXT':
+                dp = dateProfileGenerator.buildNext(currentDateProfile, currentDate);
+                if (dp.isValid) {
+                    return dp;
+                }
+                break;
+        }
+        return currentDateProfile;
+    }
+
+    function initEventSources(calendarOptions, dateProfile, context) {
+        var activeRange = dateProfile ? dateProfile.activeRange : null;
+        return addSources({}, parseInitialSources(calendarOptions, context), activeRange, context);
+    }
+    function reduceEventSources(eventSources, action, dateProfile, context) {
+        var activeRange = dateProfile ? dateProfile.activeRange : null; // need this check?
+        switch (action.type) {
+            case 'ADD_EVENT_SOURCES': // already parsed
+                return addSources(eventSources, action.sources, activeRange, context);
+            case 'REMOVE_EVENT_SOURCE':
+                return removeSource(eventSources, action.sourceId);
+            case 'PREV': // TODO: how do we track all actions that affect dateProfile :(
+            case 'NEXT':
+            case 'CHANGE_DATE':
+            case 'CHANGE_VIEW_TYPE':
+                if (dateProfile) {
+                    return fetchDirtySources(eventSources, activeRange, context);
+                }
+                else {
+                    return eventSources;
+                }
+            case 'FETCH_EVENT_SOURCES':
+                return fetchSourcesByIds(eventSources, action.sourceIds ? // why no type?
+                    arrayToHash(action.sourceIds) :
+                    excludeStaticSources(eventSources, context), activeRange, context);
+            case 'RECEIVE_EVENTS':
+            case 'RECEIVE_EVENT_ERROR':
+                return receiveResponse(eventSources, action.sourceId, action.fetchId, action.fetchRange);
+            case 'REMOVE_ALL_EVENT_SOURCES':
+                return {};
+            default:
+                return eventSources;
+        }
+    }
+    function reduceEventSourcesNewTimeZone(eventSources, dateProfile, context) {
+        var activeRange = dateProfile ? dateProfile.activeRange : null; // need this check?
+        return fetchSourcesByIds(eventSources, excludeStaticSources(eventSources, context), activeRange, context);
+    }
+    function computeEventSourceLoadingLevel(eventSources) {
+        var cnt = 0;
+        for (var sourceId in eventSources) {
+            if (eventSources[sourceId].isFetching) {
+                cnt++;
+            }
+        }
+        return cnt;
+    }
+    function addSources(eventSourceHash, sources, fetchRange, context) {
+        var hash = {};
+        for (var _i = 0, sources_1 = sources; _i < sources_1.length; _i++) {
+            var source = sources_1[_i];
+            hash[source.sourceId] = source;
+        }
+        if (fetchRange) {
+            hash = fetchDirtySources(hash, fetchRange, context);
+        }
+        return __assign(__assign({}, eventSourceHash), hash);
+    }
+    function removeSource(eventSourceHash, sourceId) {
+        return filterHash(eventSourceHash, function (eventSource) {
+            return eventSource.sourceId !== sourceId;
+        });
+    }
+    function fetchDirtySources(sourceHash, fetchRange, context) {
+        return fetchSourcesByIds(sourceHash, filterHash(sourceHash, function (eventSource) {
+            return isSourceDirty(eventSource, fetchRange, context);
+        }), fetchRange, context);
+    }
+    function isSourceDirty(eventSource, fetchRange, context) {
+        if (!doesSourceNeedRange(eventSource, context)) {
+            return !eventSource.latestFetchId;
+        }
+        else {
+            return !context.options.lazyFetching ||
+                !eventSource.fetchRange ||
+                eventSource.isFetching || // always cancel outdated in-progress fetches
+                fetchRange.start < eventSource.fetchRange.start ||
+                fetchRange.end > eventSource.fetchRange.end;
+        }
+    }
+    function fetchSourcesByIds(prevSources, sourceIdHash, fetchRange, context) {
+        var nextSources = {};
+        for (var sourceId in prevSources) {
+            var source = prevSources[sourceId];
+            if (sourceIdHash[sourceId]) {
+                nextSources[sourceId] = fetchSource(source, fetchRange, context);
+            }
+            else {
+                nextSources[sourceId] = source;
+            }
+        }
+        return nextSources;
+    }
+    function fetchSource(eventSource, fetchRange, context) {
+        var options = context.options, calendarApi = context.calendarApi;
+        var sourceDef = context.pluginHooks.eventSourceDefs[eventSource.sourceDefId];
+        var fetchId = guid();
+        sourceDef.fetch({
+            eventSource: eventSource,
+            range: fetchRange,
+            context: context
+        }, function (res) {
+            var rawEvents = res.rawEvents;
+            if (options.eventSourceSuccess) {
+                rawEvents = options.eventSourceSuccess.call(calendarApi, rawEvents, res.xhr) || rawEvents;
+            }
+            if (eventSource.success) {
+                rawEvents = eventSource.success.call(calendarApi, rawEvents, res.xhr) || rawEvents;
+            }
+            context.dispatch({
+                type: 'RECEIVE_EVENTS',
+                sourceId: eventSource.sourceId,
+                fetchId: fetchId,
+                fetchRange: fetchRange,
+                rawEvents: rawEvents
+            });
+        }, function (error) {
+            console.warn(error.message, error);
+            if (options.eventSourceFailure) {
+                options.eventSourceFailure.call(calendarApi, error);
+            }
+            if (eventSource.failure) {
+                eventSource.failure(error);
+            }
+            context.dispatch({
+                type: 'RECEIVE_EVENT_ERROR',
+                sourceId: eventSource.sourceId,
+                fetchId: fetchId,
+                fetchRange: fetchRange,
+                error: error
+            });
+        });
+        return __assign(__assign({}, eventSource), { isFetching: true, latestFetchId: fetchId });
+    }
+    function receiveResponse(sourceHash, sourceId, fetchId, fetchRange) {
+        var _a;
+        var eventSource = sourceHash[sourceId];
+        if (eventSource && // not already removed
+            fetchId === eventSource.latestFetchId) {
+            return __assign(__assign({}, sourceHash), (_a = {}, _a[sourceId] = __assign(__assign({}, eventSource), { isFetching: false, fetchRange: fetchRange // also serves as a marker that at least one fetch has completed
+             }), _a));
+        }
+        return sourceHash;
+    }
+    function excludeStaticSources(eventSources, context) {
+        return filterHash(eventSources, function (eventSource) {
+            return doesSourceNeedRange(eventSource, context);
+        });
+    }
+    function parseInitialSources(rawOptions, context) {
+        var refiners = buildEventSourceRefiners(context);
+        var rawSources = [].concat(rawOptions.eventSources || []);
+        var sources = []; // parsed
+        if (rawOptions.initialEvents) {
+            rawSources.unshift(rawOptions.initialEvents);
+        }
+        if (rawOptions.events) {
+            rawSources.unshift(rawOptions.events);
+        }
+        for (var _i = 0, rawSources_1 = rawSources; _i < rawSources_1.length; _i++) {
+            var rawSource = rawSources_1[_i];
+            var source = parseEventSource(rawSource, context, refiners);
+            if (source) {
+                sources.push(source);
+            }
+        }
+        return sources;
+    }
+    function doesSourceNeedRange(eventSource, context) {
+        var defs = context.pluginHooks.eventSourceDefs;
+        return !defs[eventSource.sourceDefId].ignoreRange;
+    }
+
+    function reduceDateSelection(currentSelection, action) {
+        switch (action.type) {
+            case 'UNSELECT_DATES':
+                return null;
+            case 'SELECT_DATES':
+                return action.selection;
+            default:
+                return currentSelection;
+        }
+    }
+
+    function reduceSelectedEvent(currentInstanceId, action) {
+        switch (action.type) {
+            case 'UNSELECT_EVENT':
+                return '';
+            case 'SELECT_EVENT':
+                return action.eventInstanceId;
+            default:
+                return currentInstanceId;
+        }
+    }
+
+    function reduceEventDrag(currentDrag, action) {
+        var newDrag;
+        switch (action.type) {
+            case 'UNSET_EVENT_DRAG':
+                return null;
+            case 'SET_EVENT_DRAG':
+                newDrag = action.state;
+                return {
+                    affectedEvents: newDrag.affectedEvents,
+                    mutatedEvents: newDrag.mutatedEvents,
+                    isEvent: newDrag.isEvent
+                };
+            default:
+                return currentDrag;
+        }
+    }
+
+    function reduceEventResize(currentResize, action) {
+        var newResize;
+        switch (action.type) {
+            case 'UNSET_EVENT_RESIZE':
+                return null;
+            case 'SET_EVENT_RESIZE':
+                newResize = action.state;
+                return {
+                    affectedEvents: newResize.affectedEvents,
+                    mutatedEvents: newResize.mutatedEvents,
+                    isEvent: newResize.isEvent
+                };
+            default:
+                return currentResize;
+        }
+    }
+
+    function parseToolbars(calendarOptions, calendarOptionOverrides, theme, viewSpecs, calendarApi) {
+        var viewsWithButtons = [];
+        var headerToolbar = calendarOptions.headerToolbar ? parseToolbar(calendarOptions.headerToolbar, calendarOptions, calendarOptionOverrides, theme, viewSpecs, calendarApi, viewsWithButtons) : null;
+        var footerToolbar = calendarOptions.footerToolbar ? parseToolbar(calendarOptions.footerToolbar, calendarOptions, calendarOptionOverrides, theme, viewSpecs, calendarApi, viewsWithButtons) : null;
+        return { headerToolbar: headerToolbar, footerToolbar: footerToolbar, viewsWithButtons: viewsWithButtons };
+    }
+    function parseToolbar(sectionStrHash, calendarOptions, calendarOptionOverrides, theme, viewSpecs, calendarApi, viewsWithButtons // dump side effects
+    ) {
+        return mapHash(sectionStrHash, function (sectionStr) { return parseSection(sectionStr, calendarOptions, calendarOptionOverrides, theme, viewSpecs, calendarApi, viewsWithButtons); });
+    }
+    /*
+    BAD: querying icons and text here. should be done at render time
+    */
+    function parseSection(sectionStr, calendarOptions, calendarOptionOverrides, theme, viewSpecs, calendarApi, viewsWithButtons // dump side effects
+    ) {
+        var isRtl = calendarOptions.direction === 'rtl';
+        var calendarCustomButtons = calendarOptions.customButtons || {};
+        var calendarButtonTextOverrides = calendarOptionOverrides.buttonText || {};
+        var calendarButtonText = calendarOptions.buttonText || {};
+        var sectionSubstrs = sectionStr ? sectionStr.split(' ') : [];
+        return sectionSubstrs.map(function (buttonGroupStr) {
+            return buttonGroupStr.split(',').map(function (buttonName) {
+                if (buttonName === 'title') {
+                    return { buttonName: buttonName };
+                }
+                else {
+                    var customButtonProps_1;
+                    var viewSpec = void 0;
+                    var buttonClick = void 0;
+                    var buttonIcon = void 0; // only one of these will be set
+                    var buttonText = void 0; // "
+                    if ((customButtonProps_1 = calendarCustomButtons[buttonName])) {
+                        buttonClick = function (ev) {
+                            if (customButtonProps_1.click) {
+                                customButtonProps_1.click.call(ev.target, ev); // TODO: correct to use `target`?
+                            }
+                        };
+                        (buttonIcon = theme.getCustomButtonIconClass(customButtonProps_1)) ||
+                            (buttonIcon = theme.getIconClass(buttonName, isRtl)) ||
+                            (buttonText = customButtonProps_1.text);
+                    }
+                    else if ((viewSpec = viewSpecs[buttonName])) {
+                        viewsWithButtons.push(buttonName);
+                        buttonClick = function () {
+                            calendarApi.changeView(buttonName);
+                        };
+                        (buttonText = viewSpec.buttonTextOverride) ||
+                            (buttonIcon = theme.getIconClass(buttonName, isRtl)) ||
+                            (buttonText = viewSpec.buttonTextDefault);
+                    }
+                    else if (calendarApi[buttonName]) { // a calendarApi method
+                        buttonClick = function () {
+                            calendarApi[buttonName]();
+                        };
+                        (buttonText = calendarButtonTextOverrides[buttonName]) ||
+                            (buttonIcon = theme.getIconClass(buttonName, isRtl)) ||
+                            (buttonText = calendarButtonText[buttonName]);
+                        //            ^ everything else is considered default
+                    }
+                    return { buttonName: buttonName, buttonClick: buttonClick, buttonIcon: buttonIcon, buttonText: buttonText };
+                }
+            });
+        });
+    }
+
+    var eventSourceDef = {
+        ignoreRange: true,
+        parseMeta: function (refined) {
+            if (Array.isArray(refined.events)) {
+                return refined.events;
+            }
+            return null;
+        },
+        fetch: function (arg, success) {
+            success({
+                rawEvents: arg.eventSource.meta
+            });
+        }
+    };
+    var arrayEventSourcePlugin = createPlugin({
+        eventSourceDefs: [eventSourceDef]
+    });
+
+    var eventSourceDef$1 = {
+        parseMeta: function (refined) {
+            if (typeof refined.events === 'function') {
+                return refined.events;
+            }
+            return null;
+        },
+        fetch: function (arg, success, failure) {
+            var dateEnv = arg.context.dateEnv;
+            var func = arg.eventSource.meta;
+            unpromisify(func.bind(null, buildRangeApiWithTimeZone(arg.range, dateEnv)), function (rawEvents) {
+                success({ rawEvents: rawEvents }); // needs an object response
+            }, failure // send errorObj directly to failure callback
+            );
+        }
+    };
+    var funcEventSourcePlugin = createPlugin({
+        eventSourceDefs: [eventSourceDef$1]
+    });
+
+    function requestJson(method, url, params, successCallback, failureCallback) {
+        method = method.toUpperCase();
+        var body = null;
+        if (method === 'GET') {
+            url = injectQueryStringParams(url, params);
+        }
+        else {
+            body = encodeParams(params);
+        }
+        var xhr = new XMLHttpRequest();
+        xhr.open(method, url, true);
+        if (method !== 'GET') {
+            xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
+        }
+        xhr.onload = function () {
+            if (xhr.status >= 200 && xhr.status < 400) {
+                var parsed = false;
+                var res = void 0;
+                try {
+                    res = JSON.parse(xhr.responseText);
+                    parsed = true;
+                }
+                catch (err) {
+                    // will handle parsed=false
+                }
+                if (parsed) {
+                    successCallback(res, xhr);
+                }
+                else {
+                    failureCallback('Failure parsing JSON', xhr);
+                }
+            }
+            else {
+                failureCallback('Request failed', xhr);
+            }
+        };
+        xhr.onerror = function () {
+            failureCallback('Request failed', xhr);
+        };
+        xhr.send(body);
+    }
+    function injectQueryStringParams(url, params) {
+        return url +
+            (url.indexOf('?') === -1 ? '?' : '&') +
+            encodeParams(params);
+    }
+    function encodeParams(params) {
+        var parts = [];
+        for (var key in params) {
+            parts.push(encodeURIComponent(key) + '=' + encodeURIComponent(params[key]));
+        }
+        return parts.join('&');
+    }
+
+    var JSON_FEED_EVENT_SOURCE_REFINERS = {
+        method: String,
+        extraParams: identity,
+        startParam: String,
+        endParam: String,
+        timeZoneParam: String
+    };
+
+    var eventSourceDef$2 = {
+        parseMeta: function (refined) {
+            if (refined.url) {
+                return {
+                    url: refined.url,
+                    method: (refined.method || 'GET').toUpperCase(),
+                    extraParams: refined.extraParams,
+                    startParam: refined.startParam,
+                    endParam: refined.endParam,
+                    timeZoneParam: refined.timeZoneParam
+                };
+            }
+            return null;
+        },
+        fetch: function (arg, success, failure) {
+            var meta = arg.eventSource.meta;
+            var requestParams = buildRequestParams(meta, arg.range, arg.context);
+            requestJson(meta.method, meta.url, requestParams, function (rawEvents, xhr) {
+                success({ rawEvents: rawEvents, xhr: xhr });
+            }, function (errorMessage, xhr) {
+                failure({ message: errorMessage, xhr: xhr });
+            });
+        }
+    };
+    var jsonFeedEventSourcePlugin = createPlugin({
+        eventSourceRefiners: JSON_FEED_EVENT_SOURCE_REFINERS,
+        eventSourceDefs: [eventSourceDef$2]
+    });
+    function buildRequestParams(meta, range, context) {
+        var dateEnv = context.dateEnv, options = context.options;
+        var startParam;
+        var endParam;
+        var timeZoneParam;
+        var customRequestParams;
+        var params = {};
+        startParam = meta.startParam;
+        if (startParam == null) {
+            startParam = options.startParam;
+        }
+        endParam = meta.endParam;
+        if (endParam == null) {
+            endParam = options.endParam;
+        }
+        timeZoneParam = meta.timeZoneParam;
+        if (timeZoneParam == null) {
+            timeZoneParam = options.timeZoneParam;
+        }
+        // retrieve any outbound GET/POST data from the options
+        if (typeof meta.extraParams === 'function') {
+            // supplied as a function that returns a key/value object
+            customRequestParams = meta.extraParams();
+        }
+        else {
+            // probably supplied as a straight key/value object
+            customRequestParams = meta.extraParams || {};
+        }
+        __assign(params, customRequestParams);
+        params[startParam] = dateEnv.formatIso(range.start);
+        params[endParam] = dateEnv.formatIso(range.end);
+        if (dateEnv.timeZone !== 'local') {
+            params[timeZoneParam] = dateEnv.timeZone;
+        }
+        return params;
+    }
+
+    var SIMPLE_RECURRING_REFINERS = {
+        daysOfWeek: identity,
+        startTime: createDuration,
+        endTime: createDuration,
+        duration: createDuration,
+        startRecur: identity,
+        endRecur: identity
+    };
+
+    var recurring = {
+        parse: function (refined, dateEnv) {
+            if (refined.daysOfWeek || refined.startTime || refined.endTime || refined.startRecur || refined.endRecur) {
+                var recurringData = {
+                    daysOfWeek: refined.daysOfWeek || null,
+                    startTime: refined.startTime || null,
+                    endTime: refined.endTime || null,
+                    startRecur: refined.startRecur ? dateEnv.createMarker(refined.startRecur) : null,
+                    endRecur: refined.endRecur ? dateEnv.createMarker(refined.endRecur) : null
+                };
+                var duration = void 0;
+                if (refined.duration) {
+                    duration = refined.duration;
+                }
+                if (!duration && refined.startTime && refined.endTime) {
+                    duration = subtractDurations(refined.endTime, refined.startTime);
+                }
+                return {
+                    allDayGuess: Boolean(!refined.startTime && !refined.endTime),
+                    duration: duration,
+                    typeData: recurringData // doesn't need endTime anymore but oh well
+                };
+            }
+            return null;
+        },
+        expand: function (typeData, framingRange, dateEnv) {
+            var clippedFramingRange = intersectRanges(framingRange, { start: typeData.startRecur, end: typeData.endRecur });
+            if (clippedFramingRange) {
+                return expandRanges(typeData.daysOfWeek, typeData.startTime, clippedFramingRange, dateEnv);
+            }
+            else {
+                return [];
+            }
+        }
+    };
+    var simpleRecurringEventsPlugin = createPlugin({
+        recurringTypes: [recurring],
+        eventRefiners: SIMPLE_RECURRING_REFINERS
+    });
+    function expandRanges(daysOfWeek, startTime, framingRange, dateEnv) {
+        var dowHash = daysOfWeek ? arrayToHash(daysOfWeek) : null;
+        var dayMarker = startOfDay(framingRange.start);
+        var endMarker = framingRange.end;
+        var instanceStarts = [];
+        while (dayMarker < endMarker) {
+            var instanceStart 
+            // if everyday, or this particular day-of-week
+            = void 0;
+            // if everyday, or this particular day-of-week
+            if (!dowHash || dowHash[dayMarker.getUTCDay()]) {
+                if (startTime) {
+                    instanceStart = dateEnv.add(dayMarker, startTime);
+                }
+                else {
+                    instanceStart = dayMarker;
+                }
+                instanceStarts.push(instanceStart);
+            }
+            dayMarker = addDays(dayMarker, 1);
+        }
+        return instanceStarts;
+    }
+
+    var changeHandlerPlugin = createPlugin({
+        optionChangeHandlers: {
+            events: function (events, context) {
+                handleEventSources([events], context);
+            },
+            eventSources: handleEventSources
+        }
+    });
+    /*
+    BUG: if `event` was supplied, all previously-given `eventSources` will be wiped out
+    */
+    function handleEventSources(inputs, context) {
+        var unfoundSources = hashValuesToArray(context.getCurrentData().eventSources);
+        var newInputs = [];
+        for (var _i = 0, inputs_1 = inputs; _i < inputs_1.length; _i++) {
+            var input = inputs_1[_i];
+            var inputFound = false;
+            for (var i = 0; i < unfoundSources.length; i++) {
+                if (unfoundSources[i]._raw === input) {
+                    unfoundSources.splice(i, 1); // delete
+                    inputFound = true;
+                    break;
+                }
+            }
+            if (!inputFound) {
+                newInputs.push(input);
+            }
+        }
+        for (var _a = 0, unfoundSources_1 = unfoundSources; _a < unfoundSources_1.length; _a++) {
+            var unfoundSource = unfoundSources_1[_a];
+            context.dispatch({
+                type: 'REMOVE_EVENT_SOURCE',
+                sourceId: unfoundSource.sourceId
+            });
+        }
+        for (var _b = 0, newInputs_1 = newInputs; _b < newInputs_1.length; _b++) {
+            var newInput = newInputs_1[_b];
+            context.calendarApi.addEventSource(newInput);
+        }
+    }
+
+    function handleDateProfile(dateProfile, context) {
+        context.emitter.trigger('datesSet', __assign(__assign({}, buildRangeApiWithTimeZone(dateProfile.activeRange, context.dateEnv)), { view: context.viewApi }));
+    }
+
+    function handleEventStore(eventStore, context) {
+        var emitter = context.emitter;
+        if (emitter.hasHandlers('eventsSet')) {
+            emitter.trigger('eventsSet', buildEventApis(eventStore, context));
+        }
+    }
+
+    /*
+    this array is exposed on the root namespace so that UMD plugins can add to it.
+    see the rollup-bundles script.
+    */
+    var globalPlugins = [
+        arrayEventSourcePlugin,
+        funcEventSourcePlugin,
+        jsonFeedEventSourcePlugin,
+        simpleRecurringEventsPlugin,
+        changeHandlerPlugin,
+        createPlugin({
+            contentTypeHandlers: {
+                html: function () { return injectHtml; },
+                domNodes: function () { return injectDomNodes; }
+            },
+            propSetHandlers: {
+                dateProfile: handleDateProfile,
+                eventStore: handleEventStore
+            }
+        })
+    ];
+
+    var DelayedRunner = /** @class */ (function () {
+        function DelayedRunner(drainedOption) {
+            this.drainedOption = drainedOption;
+            this.isRunning = false;
+            this.isDirty = false;
+            this.pauseDepths = {};
+            this.timeoutId = 0;
+        }
+        DelayedRunner.prototype.request = function (delay) {
+            this.isDirty = true;
+            if (!this.isPaused()) {
+                this.clearTimeout();
+                if (delay == null) {
+                    this.tryDrain();
+                }
+                else {
+                    this.timeoutId = setTimeout(// NOT OPTIMAL! TODO: look at debounce
+                    this.tryDrain.bind(this), delay);
+                }
+            }
+        };
+        DelayedRunner.prototype.pause = function (scope) {
+            if (scope === void 0) { scope = ''; }
+            var pauseDepths = this.pauseDepths;
+            pauseDepths[scope] = (pauseDepths[scope] || 0) + 1;
+            this.clearTimeout();
+        };
+        DelayedRunner.prototype.resume = function (scope, force) {
+            if (scope === void 0) { scope = ''; }
+            var pauseDepths = this.pauseDepths;
+            if (scope in pauseDepths) {
+                if (force) {
+                    delete pauseDepths[scope];
+                }
+                else {
+                    var depth = --pauseDepths[scope];
+                    if (depth <= 0) {
+                        delete pauseDepths[scope];
+                    }
+                }
+                this.tryDrain();
+            }
+        };
+        DelayedRunner.prototype.isPaused = function () {
+            return Object.keys(this.pauseDepths).length;
+        };
+        DelayedRunner.prototype.tryDrain = function () {
+            if (!this.isRunning && !this.isPaused()) {
+                this.isRunning = true;
+                while (this.isDirty) {
+                    this.isDirty = false;
+                    this.drained(); // might set isDirty to true again
+                }
+                this.isRunning = false;
+            }
+        };
+        DelayedRunner.prototype.clear = function () {
+            this.clearTimeout();
+            this.isDirty = false;
+            this.pauseDepths = {};
+        };
+        DelayedRunner.prototype.clearTimeout = function () {
+            if (this.timeoutId) {
+                clearTimeout(this.timeoutId);
+                this.timeoutId = 0;
+            }
+        };
+        DelayedRunner.prototype.drained = function () {
+            if (this.drainedOption) {
+                this.drainedOption();
+            }
+        };
+        return DelayedRunner;
+    }());
+    var TaskRunner = /** @class */ (function () {
+        function TaskRunner(runTaskOption, drainedOption) {
+            this.runTaskOption = runTaskOption;
+            this.drainedOption = drainedOption;
+            this.queue = [];
+            this.delayedRunner = new DelayedRunner(this.drain.bind(this));
+        }
+        TaskRunner.prototype.request = function (task, delay) {
+            this.queue.push(task);
+            this.delayedRunner.request(delay);
+        };
+        TaskRunner.prototype.pause = function (scope) {
+            this.delayedRunner.pause(scope);
+        };
+        TaskRunner.prototype.resume = function (scope, force) {
+            this.delayedRunner.resume(scope, force);
+        };
+        TaskRunner.prototype.drain = function () {
+            var queue = this.queue;
+            while (queue.length) {
+                var completedTasks = [];
+                var task = void 0;
+                while ((task = queue.shift())) {
+                    this.runTask(task);
+                    completedTasks.push(task);
+                }
+                this.drained(completedTasks);
+            } // keep going, in case new tasks were added in the drained handler
+        };
+        TaskRunner.prototype.runTask = function (task) {
+            if (this.runTaskOption) {
+                this.runTaskOption(task);
+            }
+        };
+        TaskRunner.prototype.drained = function (completedTasks) {
+            if (this.drainedOption) {
+                this.drainedOption(completedTasks);
+            }
+        };
+        return TaskRunner;
+    }());
+
+    // Computes what the title at the top of the calendarApi should be for this view
+    function buildTitle(dateProfile, viewOptions, dateEnv) {
+        var range;
+        // for views that span a large unit of time, show the proper interval, ignoring stray days before and after
+        if (/^(year|month)$/.test(dateProfile.currentRangeUnit)) {
+            range = dateProfile.currentRange;
+        }
+        else { // for day units or smaller, use the actual day range
+            range = dateProfile.activeRange;
+        }
+        return dateEnv.formatRange(range.start, range.end, createFormatter(viewOptions.titleFormat || buildTitleFormat(dateProfile)), {
+            isEndExclusive: dateProfile.isRangeAllDay,
+            defaultSeparator: viewOptions.titleRangeSeparator
+        });
+    }
+    // Generates the format string that should be used to generate the title for the current date range.
+    // Attempts to compute the most appropriate format if not explicitly specified with `titleFormat`.
+    function buildTitleFormat(dateProfile) {
+        var currentRangeUnit = dateProfile.currentRangeUnit;
+        if (currentRangeUnit === 'year') {
+            return { year: 'numeric' };
+        }
+        else if (currentRangeUnit === 'month') {
+            return { year: 'numeric', month: 'long' }; // like "September 2014"
+        }
+        else {
+            var days = diffWholeDays(dateProfile.currentRange.start, dateProfile.currentRange.end);
+            if (days !== null && days > 1) {
+                // multi-day range. shorter, like "Sep 9 - 10 2014"
+                return { year: 'numeric', month: 'short', day: 'numeric' };
+            }
+            else {
+                // one day. longer, like "September 9 2014"
+                return { year: 'numeric', month: 'long', day: 'numeric' };
+            }
+        }
+    }
+
+    // in future refactor, do the redux-style function(state=initial) for initial-state
+    // also, whatever is happening in constructor, have it happen in action queue too
+    var CalendarDataManager = /** @class */ (function () {
+        function CalendarDataManager(props) {
+            var _this = this;
+            this.computeOptionsData = memoize(this._computeOptionsData);
+            this.computeCurrentViewData = memoize(this._computeCurrentViewData);
+            this.organizeRawLocales = memoize(organizeRawLocales);
+            this.buildLocale = memoize(buildLocale);
+            this.buildPluginHooks = buildBuildPluginHooks();
+            this.buildDateEnv = memoize(buildDateEnv$1);
+            this.buildTheme = memoize(buildTheme);
+            this.parseToolbars = memoize(parseToolbars);
+            this.buildViewSpecs = memoize(buildViewSpecs);
+            this.buildDateProfileGenerator = memoizeObjArg(buildDateProfileGenerator);
+            this.buildViewApi = memoize(buildViewApi);
+            this.buildViewUiProps = memoizeObjArg(buildViewUiProps);
+            this.buildEventUiBySource = memoize(buildEventUiBySource, isPropsEqual);
+            this.buildEventUiBases = memoize(buildEventUiBases);
+            this.parseContextBusinessHours = memoizeObjArg(parseContextBusinessHours);
+            this.buildTitle = memoize(buildTitle);
+            this.emitter = new Emitter();
+            this.actionRunner = new TaskRunner(this._handleAction.bind(this), this.updateData.bind(this));
+            this.currentCalendarOptionsInput = {};
+            this.currentCalendarOptionsRefined = {};
+            this.currentViewOptionsInput = {};
+            this.currentViewOptionsRefined = {};
+            this.currentCalendarOptionsRefiners = {};
+            this.getCurrentData = function () {
+                return _this.data;
+            };
+            this.dispatch = function (action) {
+                _this.actionRunner.request(action); // protects against recursive calls to _handleAction
+            };
+            this.props = props;
+            this.actionRunner.pause();
+            var dynamicOptionOverrides = {};
+            var optionsData = this.computeOptionsData(props.optionOverrides, dynamicOptionOverrides, props.calendarApi);
+            var currentViewType = optionsData.calendarOptions.initialView || optionsData.pluginHooks.initialView;
+            var currentViewData = this.computeCurrentViewData(currentViewType, optionsData, props.optionOverrides, dynamicOptionOverrides);
+            // wire things up
+            // TODO: not DRY
+            props.calendarApi.currentDataManager = this;
+            this.emitter.setThisContext(props.calendarApi);
+            this.emitter.setOptions(currentViewData.options);
+            var currentDate = getInitialDate(optionsData.calendarOptions, optionsData.dateEnv);
+            var dateProfile = currentViewData.dateProfileGenerator.build(currentDate);
+            if (!rangeContainsMarker(dateProfile.activeRange, currentDate)) {
+                currentDate = dateProfile.currentRange.start;
+            }
+            var calendarContext = {
+                dateEnv: optionsData.dateEnv,
+                options: optionsData.calendarOptions,
+                pluginHooks: optionsData.pluginHooks,
+                calendarApi: props.calendarApi,
+                dispatch: this.dispatch,
+                emitter: this.emitter,
+                getCurrentData: this.getCurrentData
+            };
+            // needs to be after setThisContext
+            for (var _i = 0, _a = optionsData.pluginHooks.contextInit; _i < _a.length; _i++) {
+                var callback = _a[_i];
+                callback(calendarContext);
+            }
+            // NOT DRY
+            var eventSources = initEventSources(optionsData.calendarOptions, dateProfile, calendarContext);
+            var initialState = {
+                dynamicOptionOverrides: dynamicOptionOverrides,
+                currentViewType: currentViewType,
+                currentDate: currentDate,
+                dateProfile: dateProfile,
+                businessHours: this.parseContextBusinessHours(calendarContext),
+                eventSources: eventSources,
+                eventUiBases: {},
+                loadingLevel: computeEventSourceLoadingLevel(eventSources),
+                eventStore: createEmptyEventStore(),
+                renderableEventStore: createEmptyEventStore(),
+                dateSelection: null,
+                eventSelection: '',
+                eventDrag: null,
+                eventResize: null,
+                selectionConfig: this.buildViewUiProps(calendarContext).selectionConfig
+            };
+            var contextAndState = __assign(__assign({}, calendarContext), initialState);
+            for (var _b = 0, _c = optionsData.pluginHooks.reducers; _b < _c.length; _b++) {
+                var reducer = _c[_b];
+                __assign(initialState, reducer(null, null, contextAndState));
+            }
+            if (initialState.loadingLevel) {
+                this.emitter.trigger('loading', true); // NOT DRY
+            }
+            this.state = initialState;
+            this.updateData();
+            this.actionRunner.resume();
+        }
+        CalendarDataManager.prototype.resetOptions = function (optionOverrides, append) {
+            var props = this.props;
+            props.optionOverrides = append
+                ? __assign(__assign({}, props.optionOverrides), optionOverrides) : optionOverrides;
+            this.actionRunner.request({
+                type: 'NOTHING'
+            });
+        };
+        CalendarDataManager.prototype._handleAction = function (action) {
+            var _a = this, props = _a.props, state = _a.state, emitter = _a.emitter;
+            var dynamicOptionOverrides = reduceDynamicOptionOverrides(state.dynamicOptionOverrides, action);
+            var optionsData = this.computeOptionsData(props.optionOverrides, dynamicOptionOverrides, props.calendarApi);
+            var currentViewType = reduceViewType(state.currentViewType, action);
+            var currentViewData = this.computeCurrentViewData(currentViewType, optionsData, props.optionOverrides, dynamicOptionOverrides);
+            // wire things up
+            // TODO: not DRY
+            props.calendarApi.currentDataManager = this;
+            emitter.setThisContext(props.calendarApi);
+            emitter.setOptions(currentViewData.options);
+            var calendarContext = {
+                dateEnv: optionsData.dateEnv,
+                options: optionsData.calendarOptions,
+                pluginHooks: optionsData.pluginHooks,
+                calendarApi: props.calendarApi,
+                dispatch: this.dispatch,
+                emitter: emitter,
+                getCurrentData: this.getCurrentData
+            };
+            var currentDate = state.currentDate;
+            var dateProfile = state.dateProfile;
+            if (this.data && this.data.dateProfileGenerator !== currentViewData.dateProfileGenerator) { // hack
+                dateProfile = currentViewData.dateProfileGenerator.build(currentDate);
+            }
+            currentDate = reduceCurrentDate(currentDate, action);
+            dateProfile = reduceDateProfile(dateProfile, action, currentDate, currentViewData.dateProfileGenerator);
+            if (!rangeContainsMarker(dateProfile.currentRange, currentDate)) {
+                currentDate = dateProfile.currentRange.start;
+            }
+            var eventSources = reduceEventSources(state.eventSources, action, dateProfile, calendarContext);
+            var eventSourceLoadingLevel = computeEventSourceLoadingLevel(eventSources);
+            var eventStore = reduceEventStore(state.eventStore, action, eventSources, dateProfile, calendarContext);
+            var renderableEventStore = (eventSourceLoadingLevel && !currentViewData.options.progressiveEventRendering) ?
+                (state.renderableEventStore || eventStore) : // try from previous state
+                eventStore;
+            var _b = this.buildViewUiProps(calendarContext), eventUiSingleBase = _b.eventUiSingleBase, selectionConfig = _b.selectionConfig; // will memoize obj
+            var eventUiBySource = this.buildEventUiBySource(eventSources);
+            var eventUiBases = this.buildEventUiBases(renderableEventStore.defs, eventUiSingleBase, eventUiBySource);
+            var prevLoadingLevel = state.loadingLevel || 0;
+            var loadingLevel = eventSourceLoadingLevel;
+            var newState = {
+                dynamicOptionOverrides: dynamicOptionOverrides,
+                currentViewType: currentViewType,
+                currentDate: currentDate,
+                dateProfile: dateProfile,
+                eventSources: eventSources,
+                eventStore: eventStore,
+                renderableEventStore: renderableEventStore,
+                selectionConfig: selectionConfig,
+                eventUiBases: eventUiBases,
+                loadingLevel: loadingLevel,
+                businessHours: this.parseContextBusinessHours(calendarContext),
+                dateSelection: reduceDateSelection(state.dateSelection, action),
+                eventSelection: reduceSelectedEvent(state.eventSelection, action),
+                eventDrag: reduceEventDrag(state.eventDrag, action),
+                eventResize: reduceEventResize(state.eventResize, action)
+            };
+            var contextAndState = __assign(__assign({}, calendarContext), newState);
+            for (var _i = 0, _c = optionsData.pluginHooks.reducers; _i < _c.length; _i++) {
+                var reducer = _c[_i];
+                __assign(newState, reducer(state, action, contextAndState)); // give the OLD state, for old value
+            }
+            // TODO: use propSetHandlers in plugin system
+            if (!prevLoadingLevel && loadingLevel) {
+                emitter.trigger('loading', true);
+            }
+            else if (prevLoadingLevel && !loadingLevel) {
+                emitter.trigger('loading', false);
+            }
+            this.state = newState;
+            if (props.onAction) {
+                props.onAction(action);
+            }
+        };
+        CalendarDataManager.prototype.updateData = function () {
+            var _a = this, props = _a.props, state = _a.state;
+            var oldData = this.data;
+            var optionsData = this.computeOptionsData(props.optionOverrides, state.dynamicOptionOverrides, props.calendarApi);
+            var currentViewData = this.computeCurrentViewData(state.currentViewType, optionsData, props.optionOverrides, state.dynamicOptionOverrides);
+            var data = this.data = __assign(__assign(__assign({ viewTitle: this.buildTitle(state.dateProfile, currentViewData.options, optionsData.dateEnv), calendarApi: props.calendarApi, dispatch: this.dispatch, emitter: this.emitter, getCurrentData: this.getCurrentData }, optionsData), currentViewData), state);
+            var changeHandlers = optionsData.pluginHooks.optionChangeHandlers;
+            var oldCalendarOptions = oldData && oldData.calendarOptions;
+            var newCalendarOptions = optionsData.calendarOptions;
+            if (oldCalendarOptions && oldCalendarOptions !== newCalendarOptions) {
+                if (oldCalendarOptions.timeZone !== newCalendarOptions.timeZone) {
+                    // hack
+                    state.eventSources = data.eventSources = reduceEventSourcesNewTimeZone(data.eventSources, state.dateProfile, data);
+                    state.eventStore = data.eventStore = rezoneEventStoreDates(data.eventStore, oldData.dateEnv, data.dateEnv);
+                }
+                for (var optionName in changeHandlers) {
+                    if (oldCalendarOptions[optionName] !== newCalendarOptions[optionName]) {
+                        changeHandlers[optionName](newCalendarOptions[optionName], data);
+                    }
+                }
+            }
+            if (props.onData) {
+                props.onData(data);
+            }
+        };
+        CalendarDataManager.prototype._computeOptionsData = function (optionOverrides, dynamicOptionOverrides, calendarApi) {
+            // TODO: blacklist options that are handled by optionChangeHandlers
+            var _a = this.processRawCalendarOptions(optionOverrides, dynamicOptionOverrides), refinedOptions = _a.refinedOptions, pluginHooks = _a.pluginHooks, localeDefaults = _a.localeDefaults, availableLocaleData = _a.availableLocaleData, extra = _a.extra;
+            warnUnknownOptions(extra);
+            var dateEnv = this.buildDateEnv(refinedOptions.timeZone, refinedOptions.locale, refinedOptions.weekNumberCalculation, refinedOptions.firstDay, refinedOptions.weekText, pluginHooks, availableLocaleData, refinedOptions.defaultRangeSeparator);
+            var viewSpecs = this.buildViewSpecs(pluginHooks.views, optionOverrides, dynamicOptionOverrides, localeDefaults);
+            var theme = this.buildTheme(refinedOptions, pluginHooks);
+            var toolbarConfig = this.parseToolbars(refinedOptions, optionOverrides, theme, viewSpecs, calendarApi);
+            return {
+                calendarOptions: refinedOptions,
+                pluginHooks: pluginHooks,
+                dateEnv: dateEnv,
+                viewSpecs: viewSpecs,
+                theme: theme,
+                toolbarConfig: toolbarConfig,
+                localeDefaults: localeDefaults,
+                availableRawLocales: availableLocaleData.map
+            };
+        };
+        // always called from behind a memoizer
+        CalendarDataManager.prototype.processRawCalendarOptions = function (optionOverrides, dynamicOptionOverrides) {
+            var _a = mergeRawOptions([
+                BASE_OPTION_DEFAULTS,
+                optionOverrides,
+                dynamicOptionOverrides
+            ]), locales = _a.locales, locale = _a.locale;
+            var availableLocaleData = this.organizeRawLocales(locales);
+            var availableRawLocales = availableLocaleData.map;
+            var localeDefaults = this.buildLocale(locale || availableLocaleData.defaultCode, availableRawLocales).options;
+            var pluginHooks = this.buildPluginHooks(optionOverrides.plugins || [], globalPlugins);
+            var refiners = this.currentCalendarOptionsRefiners = __assign(__assign(__assign(__assign(__assign({}, BASE_OPTION_REFINERS), CALENDAR_LISTENER_REFINERS), CALENDAR_OPTION_REFINERS), pluginHooks.listenerRefiners), pluginHooks.optionRefiners);
+            var extra = {};
+            var raw = mergeRawOptions([
+                BASE_OPTION_DEFAULTS,
+                localeDefaults,
+                optionOverrides,
+                dynamicOptionOverrides
+            ]);
+            var refined = {};
+            var currentRaw = this.currentCalendarOptionsInput;
+            var currentRefined = this.currentCalendarOptionsRefined;
+            var anyChanges = false;
+            for (var optionName in raw) {
+                if (optionName !== 'plugins') { // because plugins is special-cased
+                    if (raw[optionName] === currentRaw[optionName] ||
+                        (COMPLEX_OPTION_COMPARATORS[optionName] && (optionName in currentRaw) && COMPLEX_OPTION_COMPARATORS[optionName](currentRaw[optionName], raw[optionName]))) {
+                        refined[optionName] = currentRefined[optionName];
+                    }
+                    else if (refiners[optionName]) {
+                        refined[optionName] = refiners[optionName](raw[optionName]);
+                        anyChanges = true;
+                    }
+                    else {
+                        extra[optionName] = currentRaw[optionName];
+                    }
+                }
+            }
+            if (anyChanges) {
+                this.currentCalendarOptionsInput = raw;
+                this.currentCalendarOptionsRefined = refined;
+            }
+            return {
+                rawOptions: this.currentCalendarOptionsInput,
+                refinedOptions: this.currentCalendarOptionsRefined,
+                pluginHooks: pluginHooks,
+                availableLocaleData: availableLocaleData,
+                localeDefaults: localeDefaults,
+                extra: extra
+            };
+        };
+        CalendarDataManager.prototype._computeCurrentViewData = function (viewType, optionsData, optionOverrides, dynamicOptionOverrides) {
+            var viewSpec = optionsData.viewSpecs[viewType];
+            if (!viewSpec) {
+                throw new Error("viewType \"" + viewType + "\" is not available. Please make sure you've loaded all neccessary plugins");
+            }
+            var _a = this.processRawViewOptions(viewSpec, optionsData.pluginHooks, optionsData.localeDefaults, optionOverrides, dynamicOptionOverrides), refinedOptions = _a.refinedOptions, extra = _a.extra;
+            warnUnknownOptions(extra);
+            var dateProfileGenerator = this.buildDateProfileGenerator({
+                dateProfileGeneratorClass: viewSpec.optionDefaults.dateProfileGeneratorClass,
+                duration: viewSpec.duration,
+                durationUnit: viewSpec.durationUnit,
+                usesMinMaxTime: viewSpec.optionDefaults.usesMinMaxTime,
+                dateEnv: optionsData.dateEnv,
+                calendarApi: this.props.calendarApi,
+                slotMinTime: refinedOptions.slotMinTime,
+                slotMaxTime: refinedOptions.slotMaxTime,
+                showNonCurrentDates: refinedOptions.showNonCurrentDates,
+                dayCount: refinedOptions.dayCount,
+                dateAlignment: refinedOptions.dateAlignment,
+                dateIncrement: refinedOptions.dateIncrement,
+                hiddenDays: refinedOptions.hiddenDays,
+                weekends: refinedOptions.weekends,
+                nowInput: refinedOptions.now,
+                validRangeInput: refinedOptions.validRange,
+                visibleRangeInput: refinedOptions.visibleRange,
+                monthMode: refinedOptions.monthMode,
+                fixedWeekCount: refinedOptions.fixedWeekCount
+            });
+            var viewApi = this.buildViewApi(viewType, this.getCurrentData, optionsData.dateEnv);
+            return { viewSpec: viewSpec, options: refinedOptions, dateProfileGenerator: dateProfileGenerator, viewApi: viewApi };
+        };
+        CalendarDataManager.prototype.processRawViewOptions = function (viewSpec, pluginHooks, localeDefaults, optionOverrides, dynamicOptionOverrides) {
+            var raw = mergeRawOptions([
+                BASE_OPTION_DEFAULTS,
+                viewSpec.optionDefaults,
+                localeDefaults,
+                optionOverrides,
+                viewSpec.optionOverrides,
+                dynamicOptionOverrides
+            ]);
+            var refiners = __assign(__assign(__assign(__assign(__assign(__assign({}, BASE_OPTION_REFINERS), CALENDAR_LISTENER_REFINERS), CALENDAR_OPTION_REFINERS), VIEW_OPTION_REFINERS), pluginHooks.listenerRefiners), pluginHooks.optionRefiners);
+            var refined = {};
+            var currentRaw = this.currentViewOptionsInput;
+            var currentRefined = this.currentViewOptionsRefined;
+            var anyChanges = false;
+            var extra = {};
+            for (var optionName in raw) {
+                if (raw[optionName] === currentRaw[optionName]) {
+                    refined[optionName] = currentRefined[optionName];
+                }
+                else {
+                    if (raw[optionName] === this.currentCalendarOptionsInput[optionName]) {
+                        if (optionName in this.currentCalendarOptionsRefined) { // might be an "extra" prop
+                            refined[optionName] = this.currentCalendarOptionsRefined[optionName];
+                        }
+                    }
+                    else if (refiners[optionName]) {
+                        refined[optionName] = refiners[optionName](raw[optionName]);
+                    }
+                    else {
+                        extra[optionName] = raw[optionName];
+                    }
+                    anyChanges = true;
+                }
+            }
+            if (anyChanges) {
+                this.currentViewOptionsInput = raw;
+                this.currentViewOptionsRefined = refined;
+            }
+            return {
+                rawOptions: this.currentViewOptionsInput,
+                refinedOptions: this.currentViewOptionsRefined,
+                extra: extra
+            };
+        };
+        return CalendarDataManager;
+    }());
+    function buildDateEnv$1(timeZone, explicitLocale, weekNumberCalculation, firstDay, weekText, pluginHooks, availableLocaleData, defaultSeparator) {
+        var locale = buildLocale(explicitLocale || availableLocaleData.defaultCode, availableLocaleData.map);
+        return new DateEnv({
+            calendarSystem: 'gregory',
+            timeZone: timeZone,
+            namedTimeZoneImpl: pluginHooks.namedTimeZonedImpl,
+            locale: locale,
+            weekNumberCalculation: weekNumberCalculation,
+            firstDay: firstDay,
+            weekText: weekText,
+            cmdFormatter: pluginHooks.cmdFormatter,
+            defaultSeparator: defaultSeparator
+        });
+    }
+    function buildTheme(options, pluginHooks) {
+        var ThemeClass = pluginHooks.themeClasses[options.themeSystem] || StandardTheme;
+        return new ThemeClass(options);
+    }
+    function buildDateProfileGenerator(props) {
+        var DateProfileGeneratorClass = props.dateProfileGeneratorClass || DateProfileGenerator;
+        return new DateProfileGeneratorClass(props);
+    }
+    function buildViewApi(type, getCurrentData, dateEnv) {
+        return new ViewApi(type, getCurrentData, dateEnv);
+    }
+    function buildEventUiBySource(eventSources) {
+        return mapHash(eventSources, function (eventSource) {
+            return eventSource.ui;
+        });
+    }
+    function buildEventUiBases(eventDefs, eventUiSingleBase, eventUiBySource) {
+        var eventUiBases = { '': eventUiSingleBase };
+        for (var defId in eventDefs) {
+            var def = eventDefs[defId];
+            if (def.sourceId && eventUiBySource[def.sourceId]) {
+                eventUiBases[defId] = eventUiBySource[def.sourceId];
+            }
+        }
+        return eventUiBases;
+    }
+    function buildViewUiProps(calendarContext) {
+        var options = calendarContext.options;
+        return {
+            eventUiSingleBase: createEventUi({
+                display: options.eventDisplay,
+                editable: options.editable,
+                startEditable: options.eventStartEditable,
+                durationEditable: options.eventDurationEditable,
+                constraint: options.eventConstraint,
+                overlap: typeof options.eventOverlap === 'boolean' ? options.eventOverlap : undefined,
+                allow: options.eventAllow,
+                backgroundColor: options.eventBackgroundColor,
+                borderColor: options.eventBorderColor,
+                textColor: options.eventTextColor,
+                color: options.eventColor
+                // classNames: options.eventClassNames // render hook will handle this
+            }, calendarContext),
+            selectionConfig: createEventUi({
+                constraint: options.selectConstraint,
+                overlap: typeof options.selectOverlap === 'boolean' ? options.selectOverlap : undefined,
+                allow: options.selectAllow
+            }, calendarContext)
+        };
+    }
+    function parseContextBusinessHours(calendarContext) {
+        return parseBusinessHours(calendarContext.options.businessHours, calendarContext);
+    }
+    function warnUnknownOptions(options, viewName) {
+        for (var optionName in options) {
+            console.warn("Unknown option '" + optionName + "'" +
+                (viewName ? " for view '" + viewName + "'" : ''));
+        }
+    }
+
+    // TODO: move this to react plugin?
+    var CalendarDataProvider = /** @class */ (function (_super) {
+        __extends(CalendarDataProvider, _super);
+        function CalendarDataProvider(props) {
+            var _this = _super.call(this, props) || this;
+            _this.handleData = function (data) {
+                if (!_this.dataManager) { // still within initial run, before assignment in constructor
+                    // eslint-disable-next-line react/no-direct-mutation-state
+                    _this.state = data; // can't use setState yet
+                }
+                else {
+                    _this.setState(data);
+                }
+            };
+            _this.dataManager = new CalendarDataManager({
+                optionOverrides: props.optionOverrides,
+                calendarApi: props.calendarApi,
+                onData: _this.handleData
+            });
+            return _this;
+        }
+        CalendarDataProvider.prototype.render = function () {
+            return this.props.children(this.state);
+        };
+        CalendarDataProvider.prototype.componentDidUpdate = function (prevProps) {
+            var newOptionOverrides = this.props.optionOverrides;
+            if (newOptionOverrides !== prevProps.optionOverrides) { // prevent recursive handleData
+                this.dataManager.resetOptions(newOptionOverrides);
+            }
+        };
+        return CalendarDataProvider;
+    }(Component));
+
+    // HELPERS
+    /*
+    if nextDayThreshold is specified, slicing is done in an all-day fashion.
+    you can get nextDayThreshold from context.nextDayThreshold
+    */
+    function sliceEvents(props, allDay) {
+        return sliceEventStore(props.eventStore, props.eventUiBases, props.dateProfile.activeRange, allDay ? props.nextDayThreshold : null).fg;
+    }
+
+    var NamedTimeZoneImpl = /** @class */ (function () {
+        function NamedTimeZoneImpl(timeZoneName) {
+            this.timeZoneName = timeZoneName;
+        }
+        return NamedTimeZoneImpl;
+    }());
+
+    var Interaction = /** @class */ (function () {
+        function Interaction(settings) {
+            this.component = settings.component;
+        }
+        Interaction.prototype.destroy = function () {
+        };
+        return Interaction;
+    }());
+    function parseInteractionSettings(component, input) {
+        return {
+            component: component,
+            el: input.el,
+            useEventCenter: input.useEventCenter != null ? input.useEventCenter : true
+        };
+    }
+    function interactionSettingsToStore(settings) {
+        var _a;
+        return _a = {},
+            _a[settings.component.uid] = settings,
+            _a;
+    }
+    // global state
+    var interactionSettingsStore = {};
+
+    /*
+    An abstraction for a dragging interaction originating on an event.
+    Does higher-level things than PointerDragger, such as possibly:
+    - a "mirror" that moves with the pointer
+    - a minimum number of pixels or other criteria for a true drag to begin
+
+    subclasses must emit:
+    - pointerdown
+    - dragstart
+    - dragmove
+    - pointerup
+    - dragend
+    */
+    var ElementDragging = /** @class */ (function () {
+        function ElementDragging(el, selector) {
+            this.emitter = new Emitter();
+        }
+        ElementDragging.prototype.destroy = function () {
+        };
+        ElementDragging.prototype.setMirrorIsVisible = function (bool) {
+            // optional if subclass doesn't want to support a mirror
+        };
+        ElementDragging.prototype.setMirrorNeedsRevert = function (bool) {
+            // optional if subclass doesn't want to support a mirror
+        };
+        ElementDragging.prototype.setAutoScrollEnabled = function (bool) {
+            // optional
+        };
+        return ElementDragging;
+    }());
+
+    // TODO: get rid of this in favor of options system,
+    // tho it's really easy to access this globally rather than pass thru options.
+    var config = {};
+
+    /*
+    Information about what will happen when an external element is dragged-and-dropped
+    onto a calendar. Contains information for creating an event.
+    */
+    var DRAG_META_REFINERS = {
+        startTime: createDuration,
+        duration: createDuration,
+        create: Boolean,
+        sourceId: String
+    };
+    function parseDragMeta(raw) {
+        var _a = refineProps(raw, DRAG_META_REFINERS), refined = _a.refined, extra = _a.extra;
+        return {
+            startTime: refined.startTime || null,
+            duration: refined.duration || null,
+            create: refined.create != null ? refined.create : true,
+            sourceId: refined.sourceId,
+            leftoverProps: extra
+        };
+    }
+
+    var Toolbar = /** @class */ (function (_super) {
+        __extends(Toolbar, _super);
+        function Toolbar() {
+            return _super !== null && _super.apply(this, arguments) || this;
+        }
+        Toolbar.prototype.render = function () {
+            var _a = this.props, model = _a.model, extraClassName = _a.extraClassName;
+            var forceLtr = false;
+            var startContent, endContent;
+            var centerContent = model.center;
+            if (model.left) {
+                forceLtr = true;
+                startContent = model.left;
+            }
+            else {
+                startContent = model.start;
+            }
+            if (model.right) {
+                forceLtr = true;
+                endContent = model.right;
+            }
+            else {
+                endContent = model.end;
+            }
+            var classNames = [
+                extraClassName || '',
+                'fc-toolbar',
+                forceLtr ? 'fc-toolbar-ltr' : ''
+            ];
+            return (createElement("div", { className: classNames.join(' ') },
+                this.renderSection('start', startContent || []),
+                this.renderSection('center', centerContent || []),
+                this.renderSection('end', endContent || [])));
+        };
+        Toolbar.prototype.renderSection = function (key, widgetGroups) {
+            var props = this.props;
+            return (createElement(ToolbarSection, { key: key, widgetGroups: widgetGroups, title: props.title, activeButton: props.activeButton, isTodayEnabled: props.isTodayEnabled, isPrevEnabled: props.isPrevEnabled, isNextEnabled: props.isNextEnabled }));
+        };
+        return Toolbar;
+    }(BaseComponent));
+    var ToolbarSection = /** @class */ (function (_super) {
+        __extends(ToolbarSection, _super);
+        function ToolbarSection() {
+            return _super !== null && _super.apply(this, arguments) || this;
+        }
+        ToolbarSection.prototype.render = function () {
+            var _this = this;
+            var children = this.props.widgetGroups.map(function (widgetGroup) { return _this.renderWidgetGroup(widgetGroup); });
+            return createElement.apply(void 0, __spreadArrays(['div', { className: 'fc-toolbar-chunk' }], children));
+        };
+        ToolbarSection.prototype.renderWidgetGroup = function (widgetGroup) {
+            var props = this.props;
+            var theme = this.context.theme;
+            var children = [];
+            var isOnlyButtons = true;
+            for (var _i = 0, widgetGroup_1 = widgetGroup; _i < widgetGroup_1.length; _i++) {
+                var widget = widgetGroup_1[_i];
+                var buttonName = widget.buttonName, buttonClick = widget.buttonClick, buttonText = widget.buttonText, buttonIcon = widget.buttonIcon;
+                if (buttonName === 'title') {
+                    isOnlyButtons = false;
+                    children.push(createElement("h2", { className: 'fc-toolbar-title' }, props.title));
+                }
+                else {
+                    var ariaAttrs = buttonIcon ? { 'aria-label': buttonName } : {};
+                    var buttonClasses = ['fc-' + buttonName + '-button', theme.getClass('button')];
+                    if (buttonName === props.activeButton) {
+                        buttonClasses.push(theme.getClass('buttonActive'));
+                    }
+                    var isDisabled = (!props.isTodayEnabled && buttonName === 'today') ||
+                        (!props.isPrevEnabled && buttonName === 'prev') ||
+                        (!props.isNextEnabled && buttonName === 'next');
+                    children.push(createElement("button", __assign({ disabled: isDisabled, className: buttonClasses.join(' '), onClick: buttonClick, type: 'button' }, ariaAttrs), buttonText || (buttonIcon ? createElement("span", { className: buttonIcon }) : '')));
+                }
+            }
+            if (children.length > 1) {
+                var groupClassName = (isOnlyButtons && theme.getClass('buttonGroup')) || '';
+                return createElement.apply(void 0, __spreadArrays(['div', { className: groupClassName }], children));
+            }
+            else {
+                return children[0];
+            }
+        };
+        return ToolbarSection;
+    }(BaseComponent));
+
+    // TODO: do function component?
+    var ViewContainer = /** @class */ (function (_super) {
+        __extends(ViewContainer, _super);
+        function ViewContainer() {
+            return _super !== null && _super.apply(this, arguments) || this;
+        }
+        ViewContainer.prototype.render = function () {
+            var props = this.props;
+            var aspectRatio = props.aspectRatio;
+            var classNames = [
+                'fc-view-harness',
+                (aspectRatio || props.liquid || props.height)
+                    ? 'fc-view-harness-active' // harness controls the height
+                    : 'fc-view-harness-passive' // let the view do the height
+            ];
+            var height = '';
+            var paddingBottom = '';
+            if (aspectRatio) {
+                paddingBottom = (1 / aspectRatio) * 100 + '%';
+            }
+            else {
+                height = props.height || '';
+            }
+            return (createElement("div", { ref: props.elRef, onClick: props.onClick, className: classNames.join(' '), style: { height: height, paddingBottom: paddingBottom } }, props.children));
+        };
+        return ViewContainer;
+    }(BaseComponent));
+
+    /*
+    Detects when the user clicks on an event within a DateComponent
+    */
+    var EventClicking = /** @class */ (function (_super) {
+        __extends(EventClicking, _super);
+        function EventClicking(settings) {
+            var _this = _super.call(this, settings) || this;
+            _this.handleSegClick = function (ev, segEl) {
+                var component = _this.component;
+                var context = component.context;
+                var seg = getElSeg(segEl);
+                if (seg && // might be the <div> surrounding the more link
+                    component.isValidSegDownEl(ev.target)) {
+                    // our way to simulate a link click for elements that can't be <a> tags
+                    // grab before trigger fired in case trigger trashes DOM thru rerendering
+                    var hasUrlContainer = elementClosest(ev.target, '.fc-event-forced-url');
+                    var url = hasUrlContainer ? hasUrlContainer.querySelector('a[href]').href : '';
+                    context.emitter.trigger('eventClick', {
+                        el: segEl,
+                        event: new EventApi(component.context, seg.eventRange.def, seg.eventRange.instance),
+                        jsEvent: ev,
+                        view: context.viewApi
+                    });
+                    if (url && !ev.defaultPrevented) {
+                        window.location.href = url;
+                    }
+                }
+            };
+            _this.destroy = listenBySelector(settings.el, 'click', '.fc-event', // on both fg and bg events
+            _this.handleSegClick);
+            return _this;
+        }
+        return EventClicking;
+    }(Interaction));
+
+    /*
+    Triggers events and adds/removes core classNames when the user's pointer
+    enters/leaves event-elements of a component.
+    */
+    var EventHovering = /** @class */ (function (_super) {
+        __extends(EventHovering, _super);
+        function EventHovering(settings) {
+            var _this = _super.call(this, settings) || this;
+            // for simulating an eventMouseLeave when the event el is destroyed while mouse is over it
+            _this.handleEventElRemove = function (el) {
+                if (el === _this.currentSegEl) {
+                    _this.handleSegLeave(null, _this.currentSegEl);
+                }
+            };
+            _this.handleSegEnter = function (ev, segEl) {
+                if (getElSeg(segEl)) { // TODO: better way to make sure not hovering over more+ link or its wrapper
+                    _this.currentSegEl = segEl;
+                    _this.triggerEvent('eventMouseEnter', ev, segEl);
+                }
+            };
+            _this.handleSegLeave = function (ev, segEl) {
+                if (_this.currentSegEl) {
+                    _this.currentSegEl = null;
+                    _this.triggerEvent('eventMouseLeave', ev, segEl);
+                }
+            };
+            _this.removeHoverListeners = listenToHoverBySelector(settings.el, '.fc-event', // on both fg and bg events
+            _this.handleSegEnter, _this.handleSegLeave);
+            return _this;
+        }
+        EventHovering.prototype.destroy = function () {
+            this.removeHoverListeners();
+        };
+        EventHovering.prototype.triggerEvent = function (publicEvName, ev, segEl) {
+            var component = this.component;
+            var context = component.context;
+            var seg = getElSeg(segEl);
+            if (!ev || component.isValidSegDownEl(ev.target)) {
+                context.emitter.trigger(publicEvName, {
+                    el: segEl,
+                    event: new EventApi(context, seg.eventRange.def, seg.eventRange.instance),
+                    jsEvent: ev,
+                    view: context.viewApi
+                });
+            }
+        };
+        return EventHovering;
+    }(Interaction));
+
+    var CalendarContent = /** @class */ (function (_super) {
+        __extends(CalendarContent, _super);
+        function CalendarContent() {
+            var _this = _super !== null && _super.apply(this, arguments) || this;
+            _this.buildViewContext = memoize(buildViewContext);
+            _this.buildViewPropTransformers = memoize(buildViewPropTransformers);
+            _this.buildToolbarProps = memoize(buildToolbarProps);
+            _this.handleNavLinkClick = buildDelegationHandler('a[data-navlink]', _this._handleNavLinkClick.bind(_this));
+            _this.headerRef = createRef();
+            _this.footerRef = createRef();
+            _this.interactionsStore = {};
+            // Component Registration
+            // -----------------------------------------------------------------------------------------------------------------
+            _this.registerInteractiveComponent = function (component, settingsInput) {
+                var settings = parseInteractionSettings(component, settingsInput);
+                var DEFAULT_INTERACTIONS = [
+                    EventClicking,
+                    EventHovering
+                ];
+                var interactionClasses = DEFAULT_INTERACTIONS.concat(_this.props.pluginHooks.componentInteractions);
+                var interactions = interactionClasses.map(function (interactionClass) {
+                    return new interactionClass(settings);
+                });
+                _this.interactionsStore[component.uid] = interactions;
+                interactionSettingsStore[component.uid] = settings;
+            };
+            _this.unregisterInteractiveComponent = function (component) {
+                for (var _i = 0, _a = _this.interactionsStore[component.uid]; _i < _a.length; _i++) {
+                    var listener = _a[_i];
+                    listener.destroy();
+                }
+                delete _this.interactionsStore[component.uid];
+                delete interactionSettingsStore[component.uid];
+            };
+            // Resizing
+            // -----------------------------------------------------------------------------------------------------------------
+            _this.resizeRunner = new DelayedRunner(function () {
+                _this.props.emitter.trigger('_resize', true); // should window resizes be considered "forced" ?
+                _this.props.emitter.trigger('windowResize', { view: _this.props.viewApi });
+            });
+            _this.handleWindowResize = function (ev) {
+                var options = _this.props.options;
+                if (options.handleWindowResize &&
+                    ev.target === window // avoid jqui events
+                ) {
+                    _this.resizeRunner.request(options.windowResizeDelay);
+                }
+            };
+            return _this;
+        }
+        /*
+        renders INSIDE of an outer div
+        */
+        CalendarContent.prototype.render = function () {
+            var props = this.props;
+            var toolbarConfig = props.toolbarConfig, options = props.options;
+            var toolbarProps = this.buildToolbarProps(props.viewSpec, props.dateProfile, props.dateProfileGenerator, props.currentDate, getNow(props.options.now, props.dateEnv), // TODO: use NowTimer????
+            props.viewTitle);
+            var viewVGrow = false;
+            var viewHeight = '';
+            var viewAspectRatio;
+            if (props.isHeightAuto || props.forPrint) {
+                viewHeight = '';
+            }
+            else if (options.height != null) {
+                viewVGrow = true;
+            }
+            else if (options.contentHeight != null) {
+                viewHeight = options.contentHeight;
+            }
+            else {
+                viewAspectRatio = Math.max(options.aspectRatio, 0.5); // prevent from getting too tall
+            }
+            var viewContext = this.buildViewContext(props.viewSpec, props.viewApi, props.options, props.dateProfileGenerator, props.dateEnv, props.theme, props.pluginHooks, props.dispatch, props.getCurrentData, props.emitter, props.calendarApi, this.registerInteractiveComponent, this.unregisterInteractiveComponent);
+            return (createElement(ViewContextType.Provider, { value: viewContext },
+                toolbarConfig.headerToolbar &&
+                    createElement(Toolbar, __assign({ ref: this.headerRef, extraClassName: 'fc-header-toolbar', model: toolbarConfig.headerToolbar }, toolbarProps)),
+                createElement(ViewContainer, { liquid: viewVGrow, height: viewHeight, aspectRatio: viewAspectRatio, onClick: this.handleNavLinkClick },
+                    this.renderView(props),
+                    this.buildAppendContent()),
+                toolbarConfig.footerToolbar &&
+                    createElement(Toolbar, __assign({ ref: this.footerRef, extraClassName: 'fc-footer-toolbar', model: toolbarConfig.footerToolbar }, toolbarProps))));
+        };
+        CalendarContent.prototype.componentDidMount = function () {
+            var props = this.props;
+            this.calendarInteractions = props.pluginHooks.calendarInteractions
+                .map(function (calendarInteractionClass) {
+                return new calendarInteractionClass(props);
+            });
+            window.addEventListener('resize', this.handleWindowResize);
+            var propSetHandlers = props.pluginHooks.propSetHandlers;
+            for (var propName in propSetHandlers) {
+                propSetHandlers[propName](props[propName], props);
+            }
+        };
+        CalendarContent.prototype.componentDidUpdate = function (prevProps) {
+            var props = this.props;
+            var propSetHandlers = props.pluginHooks.propSetHandlers;
+            for (var propName in propSetHandlers) {
+                if (props[propName] !== prevProps[propName]) {
+                    propSetHandlers[propName](props[propName], props);
+                }
+            }
+        };
+        CalendarContent.prototype.componentWillUnmount = function () {
+            window.removeEventListener('resize', this.handleWindowResize);
+            this.resizeRunner.clear();
+            for (var _i = 0, _a = this.calendarInteractions; _i < _a.length; _i++) {
+                var interaction = _a[_i];
+                interaction.destroy();
+            }
+            this.props.emitter.trigger('_unmount');
+        };
+        CalendarContent.prototype._handleNavLinkClick = function (ev, anchorEl) {
+            var _a = this.props, dateEnv = _a.dateEnv, options = _a.options, calendarApi = _a.calendarApi;
+            var navLinkOptions = anchorEl.getAttribute('data-navlink');
+            navLinkOptions = navLinkOptions ? JSON.parse(navLinkOptions) : {};
+            var dateMarker = dateEnv.createMarker(navLinkOptions.date);
+            var viewType = navLinkOptions.type;
+            var customAction = viewType === 'day' ? options.navLinkDayClick :
+                viewType === 'week' ? options.navLinkWeekClick : null;
+            if (typeof customAction === 'function') {
+                customAction.call(calendarApi, dateEnv.toDate(dateMarker), ev);
+            }
+            else {
+                if (typeof customAction === 'string') {
+                    viewType = customAction;
+                }
+                calendarApi.zoomTo(dateMarker, viewType);
+            }
+        };
+        CalendarContent.prototype.buildAppendContent = function () {
+            var props = this.props;
+            var children = props.pluginHooks.viewContainerAppends.map(function (buildAppendContent) { return buildAppendContent(props); });
+            return createElement.apply(void 0, __spreadArrays([Fragment, {}], children));
+        };
+        CalendarContent.prototype.renderView = function (props) {
+            var pluginHooks = props.pluginHooks;
+            var viewSpec = props.viewSpec;
+            var viewProps = {
+                dateProfile: props.dateProfile,
+                businessHours: props.businessHours,
+                eventStore: props.renderableEventStore,
+                eventUiBases: props.eventUiBases,
+                dateSelection: props.dateSelection,
+                eventSelection: props.eventSelection,
+                eventDrag: props.eventDrag,
+                eventResize: props.eventResize,
+                isHeightAuto: props.isHeightAuto,
+                forPrint: props.forPrint
+            };
+            var transformers = this.buildViewPropTransformers(pluginHooks.viewPropsTransformers);
+            for (var _i = 0, transformers_1 = transformers; _i < transformers_1.length; _i++) {
+                var transformer = transformers_1[_i];
+                __assign(viewProps, transformer.transform(viewProps, props));
+            }
+            var ViewComponent = viewSpec.component;
+            return (createElement(ViewComponent, __assign({}, viewProps)));
+        };
+        return CalendarContent;
+    }(PureComponent));
+    function buildToolbarProps(viewSpec, dateProfile, dateProfileGenerator, currentDate, now, title) {
+        // don't force any date-profiles to valid date profiles (the `false`) so that we can tell if it's invalid
+        var todayInfo = dateProfileGenerator.build(now, undefined, false); // TODO: need `undefined` or else INFINITE LOOP for some reason
+        var prevInfo = dateProfileGenerator.buildPrev(dateProfile, currentDate, false);
+        var nextInfo = dateProfileGenerator.buildNext(dateProfile, currentDate, false);
+        return {
+            title: title,
+            activeButton: viewSpec.type,
+            isTodayEnabled: todayInfo.isValid && !rangeContainsMarker(dateProfile.currentRange, now),
+            isPrevEnabled: prevInfo.isValid,
+            isNextEnabled: nextInfo.isValid
+        };
+    }
+    // Plugin
+    // -----------------------------------------------------------------------------------------------------------------
+    function buildViewPropTransformers(theClasses) {
+        return theClasses.map(function (theClass) {
+            return new theClass();
+        });
+    }
+
+    var canVGrowWithinCell;
+    function getCanVGrowWithinCell() {
+        if (canVGrowWithinCell == null) {
+            canVGrowWithinCell = computeCanVGrowWithinCell();
+        }
+        return canVGrowWithinCell;
+    }
+    function computeCanVGrowWithinCell() {
+        // TODO: abstraction for creating these temporary detection-based els
+        var el = document.createElement('div');
+        el.style.position = 'absolute'; // for not interfering with current layout
+        el.style.top = '0';
+        el.style.left = '0';
+        el.innerHTML = '<table style="height:100px"><tr><td><div style="height:100%"></div></td></tr></table>';
+        document.body.appendChild(el);
+        var div = el.querySelector('div');
+        var possible = div.offsetHeight > 0;
+        document.body.removeChild(el);
+        return possible;
+    }
+
+    var CalendarRoot = /** @class */ (function (_super) {
+        __extends(CalendarRoot, _super);
+        function CalendarRoot() {
+            var _this = _super !== null && _super.apply(this, arguments) || this;
+            _this.state = {
+                forPrint: false
+            };
+            _this.handleBeforePrint = function () {
+                _this.setState({ forPrint: true });
+            };
+            _this.handleAfterPrint = function () {
+                _this.setState({ forPrint: false });
+            };
+            return _this;
+        }
+        CalendarRoot.prototype.render = function () {
+            var props = this.props;
+            var options = props.options;
+            var forPrint = this.state.forPrint;
+            var isHeightAuto = forPrint || options.height === 'auto' || options.contentHeight === 'auto';
+            var height = (!isHeightAuto && options.height != null) ? options.height : '';
+            var classNames = [
+                'fc',
+                forPrint ? 'fc-media-print' : 'fc-media-screen',
+                'fc-direction-' + options.direction,
+                props.theme.getClass('root')
+            ];
+            if (!getCanVGrowWithinCell()) {
+                classNames.push('fc-liquid-hack');
+            }
+            return props.children(classNames, height, isHeightAuto, forPrint);
+        };
+        CalendarRoot.prototype.componentDidMount = function () {
+            var emitter = this.props.emitter;
+            emitter.on('_beforeprint', this.handleBeforePrint);
+            emitter.on('_afterprint', this.handleAfterPrint);
+        };
+        CalendarRoot.prototype.componentWillUnmount = function () {
+            var emitter = this.props.emitter;
+            emitter.off('_beforeprint', this.handleBeforePrint);
+            emitter.off('_afterprint', this.handleAfterPrint);
+        };
+        return CalendarRoot;
+    }(BaseComponent));
+
+    // Computes a default column header formatting string if `colFormat` is not explicitly defined
+    function computeFallbackHeaderFormat(datesRepDistinctDays, dayCnt) {
+        // if more than one week row, or if there are a lot of columns with not much space,
+        // put just the day numbers will be in each cell
+        if (!datesRepDistinctDays || dayCnt > 10) {
+            return createFormatter({ weekday: 'short' }); // "Sat"
+        }
+        else if (dayCnt > 1) {
+            return createFormatter({ weekday: 'short', month: 'numeric', day: 'numeric', omitCommas: true }); // "Sat 11/12"
+        }
+        else {
+            return createFormatter({ weekday: 'long' }); // "Saturday"
+        }
+    }
+
+    var CLASS_NAME = 'fc-col-header-cell'; // do the cushion too? no
+    var TableDateCell = /** @class */ (function (_super) {
+        __extends(TableDateCell, _super);
+        function TableDateCell() {
+            return _super !== null && _super.apply(this, arguments) || this;
+        }
+        TableDateCell.prototype.render = function () {
+            var _a = this.context, dateEnv = _a.dateEnv, options = _a.options, theme = _a.theme, viewApi = _a.viewApi;
+            var props = this.props;
+            var date = props.date, dateProfile = props.dateProfile;
+            var dayMeta = getDateMeta(date, props.todayRange, null, dateProfile);
+            var classNames = [CLASS_NAME].concat(getDayClassNames(dayMeta, theme));
+            var text = dateEnv.format(date, props.dayHeaderFormat);
+            // if colCnt is 1, we are already in a day-view and don't need a navlink
+            var navLinkAttrs = (options.navLinks && !dayMeta.isDisabled && props.colCnt > 1)
+                ? { 'data-navlink': buildNavLinkData(date), tabIndex: 0 }
+                : {};
+            var hookProps = __assign(__assign(__assign({ date: dateEnv.toDate(date), view: viewApi }, props.extraHookProps), { text: text }), dayMeta);
+            return (createElement(RenderHook, { hookProps: hookProps, classNames: options.dayHeaderClassNames, content: options.dayHeaderContent, defaultContent: renderInner, didMount: options.dayHeaderDidMount, willUnmount: options.dayHeaderWillUnmount }, function (rootElRef, customClassNames, innerElRef, innerContent) { return (createElement("th", __assign({ ref: rootElRef, className: classNames.concat(customClassNames).join(' '), "data-date": !dayMeta.isDisabled ? formatDayString(date) : undefined, colSpan: props.colSpan }, props.extraDataAttrs),
+                createElement("div", { className: 'fc-scrollgrid-sync-inner' }, !dayMeta.isDisabled &&
+                    createElement("a", __assign({ ref: innerElRef, className: [
+                            'fc-col-header-cell-cushion',
+                            props.isSticky ? 'fc-sticky' : ''
+                        ].join(' ') }, navLinkAttrs), innerContent)))); }));
+        };
+        return TableDateCell;
+    }(BaseComponent));
+    var TableDowCell = /** @class */ (function (_super) {
+        __extends(TableDowCell, _super);
+        function TableDowCell() {
+            return _super !== null && _super.apply(this, arguments) || this;
+        }
+        TableDowCell.prototype.render = function () {
+            var props = this.props;
+            var _a = this.context, dateEnv = _a.dateEnv, theme = _a.theme, viewApi = _a.viewApi, options = _a.options;
+            var date = addDays(new Date(259200000), props.dow); // start with Sun, 04 Jan 1970 00:00:00 GMT
+            var dateMeta = {
+                dow: props.dow,
+                isDisabled: false,
+                isFuture: false,
+                isPast: false,
+                isToday: false,
+                isOther: false
+            };
+            var classNames = [CLASS_NAME].concat(getDayClassNames(dateMeta, theme), props.extraClassNames || []);
+            var text = dateEnv.format(date, props.dayHeaderFormat);
+            var hookProps = __assign(__assign(__assign(__assign({ // TODO: make this public?
+                date: date }, dateMeta), { view: viewApi }), props.extraHookProps), { text: text });
+            return (createElement(RenderHook, { hookProps: hookProps, classNames: options.dayHeaderClassNames, content: options.dayHeaderContent, defaultContent: renderInner, didMount: options.dayHeaderDidMount, willUnmount: options.dayHeaderWillUnmount }, function (rootElRef, customClassNames, innerElRef, innerContent) { return (createElement("th", __assign({ ref: rootElRef, className: classNames.concat(customClassNames).join(' '), colSpan: props.colSpan }, props.extraDataAttrs),
+                createElement("div", { className: 'fc-scrollgrid-sync-inner' },
+                    createElement("a", { className: [
+                            'fc-col-header-cell-cushion',
+                            props.isSticky ? 'fc-sticky' : ''
+                        ].join(' '), ref: innerElRef }, innerContent)))); }));
+        };
+        return TableDowCell;
+    }(BaseComponent));
+    function renderInner(hookProps) {
+        return hookProps.text;
+    }
+
+    var NowTimer = /** @class */ (function (_super) {
+        __extends(NowTimer, _super);
+        function NowTimer(props, context) {
+            var _this = _super.call(this, props, context) || this;
+            _this.initialNowDate = getNow(context.options.now, context.dateEnv);
+            _this.initialNowQueriedMs = new Date().valueOf();
+            _this.state = _this.computeTiming().currentState;
+            return _this;
+        }
+        NowTimer.prototype.render = function () {
+            var _a = this, props = _a.props, state = _a.state;
+            return props.children(state.nowDate, state.todayRange);
+        };
+        NowTimer.prototype.componentDidMount = function () {
+            this.setTimeout();
+        };
+        NowTimer.prototype.componentDidUpdate = function (prevProps) {
+            if (prevProps.unit !== this.props.unit) {
+                this.clearTimeout();
+                this.setTimeout();
+            }
+        };
+        NowTimer.prototype.componentWillUnmount = function () {
+            this.clearTimeout();
+        };
+        NowTimer.prototype.computeTiming = function () {
+            var _a = this, props = _a.props, context = _a.context;
+            var unroundedNow = addMs(this.initialNowDate, new Date().valueOf() - this.initialNowQueriedMs);
+            var currentUnitStart = context.dateEnv.startOf(unroundedNow, props.unit);
+            var nextUnitStart = context.dateEnv.add(currentUnitStart, createDuration(1, props.unit));
+            var waitMs = nextUnitStart.valueOf() - unroundedNow.valueOf();
+            return {
+                currentState: { nowDate: currentUnitStart, todayRange: buildDayRange(currentUnitStart) },
+                nextState: { nowDate: nextUnitStart, todayRange: buildDayRange(nextUnitStart) },
+                waitMs: waitMs
+            };
+        };
+        NowTimer.prototype.setTimeout = function () {
+            var _this = this;
+            var _a = this.computeTiming(), nextState = _a.nextState, waitMs = _a.waitMs;
+            this.timeoutId = setTimeout(function () {
+                _this.setState(nextState, function () {
+                    _this.setTimeout();
+                });
+            }, waitMs);
+        };
+        NowTimer.prototype.clearTimeout = function () {
+            if (this.timeoutId) {
+                clearTimeout(this.timeoutId);
+            }
+        };
+        NowTimer.contextType = ViewContextType;
+        return NowTimer;
+    }(Component));
+    function buildDayRange(date) {
+        var start = startOfDay(date);
+        var end = addDays(start, 1);
+        return { start: start, end: end };
+    }
+
+    var DayHeader = /** @class */ (function (_super) {
+        __extends(DayHeader, _super);
+        function DayHeader() {
+            var _this = _super !== null && _super.apply(this, arguments) || this;
+            _this.createDayHeaderFormatter = memoize(createDayHeaderFormatter);
+            return _this;
+        }
+        DayHeader.prototype.render = function () {
+            var context = this.context;
+            var _a = this.props, dates = _a.dates, dateProfile = _a.dateProfile, datesRepDistinctDays = _a.datesRepDistinctDays, renderIntro = _a.renderIntro;
+            var dayHeaderFormat = this.createDayHeaderFormatter(context.options.dayHeaderFormat, datesRepDistinctDays, dates.length);
+            return (createElement(NowTimer, { unit: 'day' }, function (nowDate, todayRange) { return (createElement("tr", null,
+                renderIntro && renderIntro(),
+                dates.map(function (date) { return (datesRepDistinctDays ?
+                    createElement(TableDateCell, { key: date.toISOString(), date: date, dateProfile: dateProfile, todayRange: todayRange, colCnt: dates.length, dayHeaderFormat: dayHeaderFormat }) :
+                    createElement(TableDowCell, { key: date.getUTCDay(), dow: date.getUTCDay(), dayHeaderFormat: dayHeaderFormat })); }))); }));
+        };
+        return DayHeader;
+    }(BaseComponent));
+    function createDayHeaderFormatter(explicitFormat, datesRepDistinctDays, dateCnt) {
+        return explicitFormat || computeFallbackHeaderFormat(datesRepDistinctDays, dateCnt);
+    }
+
+    var DaySeriesModel = /** @class */ (function () {
+        function DaySeriesModel(range, dateProfileGenerator) {
+            var date = range.start;
+            var end = range.end;
+            var indices = [];
+            var dates = [];
+            var dayIndex = -1;
+            while (date < end) { // loop each day from start to end
+                if (dateProfileGenerator.isHiddenDay(date)) {
+                    indices.push(dayIndex + 0.5); // mark that it's between indices
+                }
+                else {
+                    dayIndex++;
+                    indices.push(dayIndex);
+                    dates.push(date);
+                }
+                date = addDays(date, 1);
+            }
+            this.dates = dates;
+            this.indices = indices;
+            this.cnt = dates.length;
+        }
+        DaySeriesModel.prototype.sliceRange = function (range) {
+            var firstIndex = this.getDateDayIndex(range.start); // inclusive first index
+            var lastIndex = this.getDateDayIndex(addDays(range.end, -1)); // inclusive last index
+            var clippedFirstIndex = Math.max(0, firstIndex);
+            var clippedLastIndex = Math.min(this.cnt - 1, lastIndex);
+            // deal with in-between indices
+            clippedFirstIndex = Math.ceil(clippedFirstIndex); // in-between starts round to next cell
+            clippedLastIndex = Math.floor(clippedLastIndex); // in-between ends round to prev cell
+            if (clippedFirstIndex <= clippedLastIndex) {
+                return {
+                    firstIndex: clippedFirstIndex,
+                    lastIndex: clippedLastIndex,
+                    isStart: firstIndex === clippedFirstIndex,
+                    isEnd: lastIndex === clippedLastIndex
+                };
+            }
+            else {
+                return null;
+            }
+        };
+        // Given a date, returns its chronolocial cell-index from the first cell of the grid.
+        // If the date lies between cells (because of hiddenDays), returns a floating-point value between offsets.
+        // If before the first offset, returns a negative number.
+        // If after the last offset, returns an offset past the last cell offset.
+        // Only works for *start* dates of cells. Will not work for exclusive end dates for cells.
+        DaySeriesModel.prototype.getDateDayIndex = function (date) {
+            var indices = this.indices;
+            var dayOffset = Math.floor(diffDays(this.dates[0], date));
+            if (dayOffset < 0) {
+                return indices[0] - 1;
+            }
+            else if (dayOffset >= indices.length) {
+                return indices[indices.length - 1] + 1;
+            }
+            else {
+                return indices[dayOffset];
+            }
+        };
+        return DaySeriesModel;
+    }());
+
+    var DayTableModel = /** @class */ (function () {
+        function DayTableModel(daySeries, breakOnWeeks) {
+            var dates = daySeries.dates;
+            var daysPerRow;
+            var firstDay;
+            var rowCnt;
+            if (breakOnWeeks) {
+                // count columns until the day-of-week repeats
+                firstDay = dates[0].getUTCDay();
+                for (daysPerRow = 1; daysPerRow < dates.length; daysPerRow++) {
+                    if (dates[daysPerRow].getUTCDay() === firstDay) {
+                        break;
+                    }
+                }
+                rowCnt = Math.ceil(dates.length / daysPerRow);
+            }
+            else {
+                rowCnt = 1;
+                daysPerRow = dates.length;
+            }
+            this.rowCnt = rowCnt;
+            this.colCnt = daysPerRow;
+            this.daySeries = daySeries;
+            this.cells = this.buildCells();
+            this.headerDates = this.buildHeaderDates();
+        }
+        DayTableModel.prototype.buildCells = function () {
+            var rows = [];
+            for (var row = 0; row < this.rowCnt; row++) {
+                var cells = [];
+                for (var col = 0; col < this.colCnt; col++) {
+                    cells.push(this.buildCell(row, col));
+                }
+                rows.push(cells);
+            }
+            return rows;
+        };
+        DayTableModel.prototype.buildCell = function (row, col) {
+            var date = this.daySeries.dates[row * this.colCnt + col];
+            return {
+                key: date.toISOString(),
+                date: date
+            };
+        };
+        DayTableModel.prototype.buildHeaderDates = function () {
+            var dates = [];
+            for (var col = 0; col < this.colCnt; col++) {
+                dates.push(this.cells[0][col].date);
+            }
+            return dates;
+        };
+        DayTableModel.prototype.sliceRange = function (range) {
+            var colCnt = this.colCnt;
+            var seriesSeg = this.daySeries.sliceRange(range);
+            var segs = [];
+            if (seriesSeg) {
+                var firstIndex = seriesSeg.firstIndex, lastIndex = seriesSeg.lastIndex;
+                var index = firstIndex;
+                while (index <= lastIndex) {
+                    var row = Math.floor(index / colCnt);
+                    var nextIndex = Math.min((row + 1) * colCnt, lastIndex + 1);
+                    segs.push({
+                        row: row,
+                        firstCol: index % colCnt,
+                        lastCol: (nextIndex - 1) % colCnt,
+                        isStart: seriesSeg.isStart && index === firstIndex,
+                        isEnd: seriesSeg.isEnd && (nextIndex - 1) === lastIndex
+                    });
+                    index = nextIndex;
+                }
+            }
+            return segs;
+        };
+        return DayTableModel;
+    }());
+
+    var Slicer = /** @class */ (function () {
+        function Slicer() {
+            this.sliceBusinessHours = memoize(this._sliceBusinessHours);
+            this.sliceDateSelection = memoize(this._sliceDateSpan);
+            this.sliceEventStore = memoize(this._sliceEventStore);
+            this.sliceEventDrag = memoize(this._sliceInteraction);
+            this.sliceEventResize = memoize(this._sliceInteraction);
+            this.forceDayIfListItem = false; // hack
+        }
+        Slicer.prototype.sliceProps = function (props, dateProfile, nextDayThreshold, context) {
+            var extraArgs = [];
+            for (var _i = 4; _i < arguments.length; _i++) {
+                extraArgs[_i - 4] = arguments[_i];
+            }
+            var eventUiBases = props.eventUiBases;
+            var eventSegs = this.sliceEventStore.apply(this, __spreadArrays([props.eventStore, eventUiBases, dateProfile, nextDayThreshold], extraArgs));
+            return {
+                dateSelectionSegs: this.sliceDateSelection.apply(this, __spreadArrays([props.dateSelection, eventUiBases, context], extraArgs)),
+                businessHourSegs: this.sliceBusinessHours.apply(this, __spreadArrays([props.businessHours, dateProfile, nextDayThreshold, context], extraArgs)),
+                fgEventSegs: eventSegs.fg,
+                bgEventSegs: eventSegs.bg,
+                eventDrag: this.sliceEventDrag.apply(this, __spreadArrays([props.eventDrag, eventUiBases, dateProfile, nextDayThreshold], extraArgs)),
+                eventResize: this.sliceEventResize.apply(this, __spreadArrays([props.eventResize, eventUiBases, dateProfile, nextDayThreshold], extraArgs)),
+                eventSelection: props.eventSelection
+            }; // TODO: give interactionSegs?
+        };
+        Slicer.prototype.sliceNowDate = function (// does not memoize
+        date, context) {
+            var extraArgs = [];
+            for (var _i = 2; _i < arguments.length; _i++) {
+                extraArgs[_i - 2] = arguments[_i];
+            }
+            return this._sliceDateSpan.apply(this, __spreadArrays([{ range: { start: date, end: addMs(date, 1) }, allDay: false },
+                {},
+                context], extraArgs));
+        };
+        Slicer.prototype._sliceBusinessHours = function (businessHours, dateProfile, nextDayThreshold, context) {
+            var extraArgs = [];
+            for (var _i = 4; _i < arguments.length; _i++) {
+                extraArgs[_i - 4] = arguments[_i];
+            }
+            if (!businessHours) {
+                return [];
+            }
+            return this._sliceEventStore.apply(this, __spreadArrays([expandRecurring(businessHours, computeActiveRange(dateProfile, Boolean(nextDayThreshold)), context),
+                {},
+                dateProfile,
+                nextDayThreshold], extraArgs)).bg;
+        };
+        Slicer.prototype._sliceEventStore = function (eventStore, eventUiBases, dateProfile, nextDayThreshold) {
+            var extraArgs = [];
+            for (var _i = 4; _i < arguments.length; _i++) {
+                extraArgs[_i - 4] = arguments[_i];
+            }
+            if (eventStore) {
+                var rangeRes = sliceEventStore(eventStore, eventUiBases, computeActiveRange(dateProfile, Boolean(nextDayThreshold)), nextDayThreshold);
+                return {
+                    bg: this.sliceEventRanges(rangeRes.bg, extraArgs),
+                    fg: this.sliceEventRanges(rangeRes.fg, extraArgs)
+                };
+            }
+            else {
+                return { bg: [], fg: [] };
+            }
+        };
+        Slicer.prototype._sliceInteraction = function (interaction, eventUiBases, dateProfile, nextDayThreshold) {
+            var extraArgs = [];
+            for (var _i = 4; _i < arguments.length; _i++) {
+                extraArgs[_i - 4] = arguments[_i];
+            }
+            if (!interaction) {
+                return null;
+            }
+            var rangeRes = sliceEventStore(interaction.mutatedEvents, eventUiBases, computeActiveRange(dateProfile, Boolean(nextDayThreshold)), nextDayThreshold);
+            return {
+                segs: this.sliceEventRanges(rangeRes.fg, extraArgs),
+                affectedInstances: interaction.affectedEvents.instances,
+                isEvent: interaction.isEvent
+            };
+        };
+        Slicer.prototype._sliceDateSpan = function (dateSpan, eventUiBases, context) {
+            var extraArgs = [];
+            for (var _i = 3; _i < arguments.length; _i++) {
+                extraArgs[_i - 3] = arguments[_i];
+            }
+            if (!dateSpan) {
+                return [];
+            }
+            var eventRange = fabricateEventRange(dateSpan, eventUiBases, context);
+            var segs = this.sliceRange.apply(this, __spreadArrays([dateSpan.range], extraArgs));
+            for (var _a = 0, segs_1 = segs; _a < segs_1.length; _a++) {
+                var seg = segs_1[_a];
+                seg.eventRange = eventRange;
+            }
+            return segs;
+        };
+        /*
+        "complete" seg means it has component and eventRange
+        */
+        Slicer.prototype.sliceEventRanges = function (eventRanges, extraArgs) {
+            var segs = [];
+            for (var _i = 0, eventRanges_1 = eventRanges; _i < eventRanges_1.length; _i++) {
+                var eventRange = eventRanges_1[_i];
+                segs.push.apply(segs, this.sliceEventRange(eventRange, extraArgs));
+            }
+            return segs;
+        };
+        /*
+        "complete" seg means it has component and eventRange
+        */
+        Slicer.prototype.sliceEventRange = function (eventRange, extraArgs) {
+            var dateRange = eventRange.range;
+            // hack to make multi-day events that are being force-displayed as list-items to take up only one day
+            if (this.forceDayIfListItem && eventRange.ui.display === 'list-item') {
+                dateRange = {
+                    start: dateRange.start,
+                    end: addDays(dateRange.start, 1)
+                };
+            }
+            var segs = this.sliceRange.apply(this, __spreadArrays([dateRange], extraArgs));
+            for (var _i = 0, segs_2 = segs; _i < segs_2.length; _i++) {
+                var seg = segs_2[_i];
+                seg.eventRange = eventRange;
+                seg.isStart = eventRange.isStart && seg.isStart;
+                seg.isEnd = eventRange.isEnd && seg.isEnd;
+            }
+            return segs;
+        };
+        return Slicer;
+    }());
+    /*
+    for incorporating slotMinTime/slotMaxTime if appropriate
+    TODO: should be part of DateProfile!
+    TimelineDateProfile already does this btw
+    */
+    function computeActiveRange(dateProfile, isComponentAllDay) {
+        var range = dateProfile.activeRange;
+        if (isComponentAllDay) {
+            return range;
+        }
+        return {
+            start: addMs(range.start, dateProfile.slotMinTime.milliseconds),
+            end: addMs(range.end, dateProfile.slotMaxTime.milliseconds - 864e5) // 864e5 = ms in a day
+        };
+    }
+
+    var VISIBLE_HIDDEN_RE = /^(visible|hidden)$/;
+    var Scroller = /** @class */ (function (_super) {
+        __extends(Scroller, _super);
+        function Scroller() {
+            var _this = _super !== null && _super.apply(this, arguments) || this;
+            _this.handleEl = function (el) {
+                _this.el = el;
+                setRef(_this.props.elRef, el);
+            };
+            return _this;
+        }
+        Scroller.prototype.render = function () {
+            var props = this.props;
+            var liquid = props.liquid, liquidIsAbsolute = props.liquidIsAbsolute;
+            var isAbsolute = liquid && liquidIsAbsolute;
+            var className = ['fc-scroller'];
+            if (liquid) {
+                if (liquidIsAbsolute) {
+                    className.push('fc-scroller-liquid-absolute');
+                }
+                else {
+                    className.push('fc-scroller-liquid');
+                }
+            }
+            return (createElement("div", { ref: this.handleEl, className: className.join(' '), style: {
+                    overflowX: props.overflowX,
+                    overflowY: props.overflowY,
+                    left: (isAbsolute && -(props.overcomeLeft || 0)) || '',
+                    right: (isAbsolute && -(props.overcomeRight || 0)) || '',
+                    bottom: (isAbsolute && -(props.overcomeBottom || 0)) || '',
+                    marginLeft: (!isAbsolute && -(props.overcomeLeft || 0)) || '',
+                    marginRight: (!isAbsolute && -(props.overcomeRight || 0)) || '',
+                    marginBottom: (!isAbsolute && -(props.overcomeBottom || 0)) || '',
+                    maxHeight: props.maxHeight || ''
+                } }, props.children));
+        };
+        Scroller.prototype.needsXScrolling = function () {
+            if (VISIBLE_HIDDEN_RE.test(this.props.overflowX)) {
+                return false;
+            }
+            // testing scrollWidth>clientWidth is unreliable cross-browser when pixel heights aren't integers.
+            // much more reliable to see if children are taller than the scroller, even tho doesn't account for
+            // inner-child margins and absolute positioning
+            var el = this.el;
+            var realClientWidth = this.el.getBoundingClientRect().width - this.getYScrollbarWidth();
+            var children = el.children;
+            for (var i = 0; i < children.length; i++) {
+                var childEl = children[i];
+                if (childEl.getBoundingClientRect().width > realClientWidth) {
+                    return true;
+                }
+            }
+            return false;
+        };
+        Scroller.prototype.needsYScrolling = function () {
+            if (VISIBLE_HIDDEN_RE.test(this.props.overflowY)) {
+                return false;
+            }
+            // testing scrollHeight>clientHeight is unreliable cross-browser when pixel heights aren't integers.
+            // much more reliable to see if children are taller than the scroller, even tho doesn't account for
+            // inner-child margins and absolute positioning
+            var el = this.el;
+            var realClientHeight = this.el.getBoundingClientRect().height - this.getXScrollbarWidth();
+            var children = el.children;
+            for (var i = 0; i < children.length; i++) {
+                var childEl = children[i];
+                if (childEl.getBoundingClientRect().height > realClientHeight) {
+                    return true;
+                }
+            }
+            return false;
+        };
+        Scroller.prototype.getXScrollbarWidth = function () {
+            if (VISIBLE_HIDDEN_RE.test(this.props.overflowX)) {
+                return 0;
+            }
+            else {
+                return this.el.offsetHeight - this.el.clientHeight; // only works because we guarantee no borders. TODO: add to CSS with important?
+            }
+        };
+        Scroller.prototype.getYScrollbarWidth = function () {
+            if (VISIBLE_HIDDEN_RE.test(this.props.overflowY)) {
+                return 0;
+            }
+            else {
+                return this.el.offsetWidth - this.el.clientWidth; // only works because we guarantee no borders. TODO: add to CSS with important?
+            }
+        };
+        return Scroller;
+    }(BaseComponent));
+
+    /*
+    TODO: somehow infer OtherArgs from masterCallback?
+    TODO: infer RefType from masterCallback if provided
+    */
+    var RefMap = /** @class */ (function () {
+        function RefMap(masterCallback) {
+            var _this = this;
+            this.masterCallback = masterCallback;
+            this.currentMap = {};
+            this.depths = {};
+            this.callbackMap = {};
+            this.handleValue = function (val, key) {
+                var _a = _this, depths = _a.depths, currentMap = _a.currentMap;
+                var removed = false;
+                var added = false;
+                if (val !== null) {
+                    removed = (key in currentMap); // for bug... ACTUALLY: can probably do away with this now that callers don't share numeric indices anymore
+                    currentMap[key] = val;
+                    depths[key] = (depths[key] || 0) + 1;
+                    added = true;
+                }
+                else if (--depths[key] === 0) {
+                    delete currentMap[key];
+                    delete _this.callbackMap[key];
+                    removed = true;
+                }
+                if (_this.masterCallback) {
+                    if (removed) {
+                        _this.masterCallback(null, String(key));
+                    }
+                    if (added) {
+                        _this.masterCallback(val, String(key));
+                    }
+                }
+            };
+        }
+        RefMap.prototype.createRef = function (key) {
+            var _this = this;
+            var refCallback = this.callbackMap[key];
+            if (!refCallback) {
+                refCallback = this.callbackMap[key] = function (val) {
+                    _this.handleValue(val, String(key));
+                };
+            }
+            return refCallback;
+        };
+        // TODO: check callers that don't care about order. should use getAll instead
+        // NOTE: this method has become less valuable now that we are encouraged to map order by some other index
+        // TODO: provide ONE array-export function, buildArray, which fails on non-numeric indexes. caller can manipulate and "collect"
+        RefMap.prototype.collect = function (startIndex, endIndex, step) {
+            return collectFromHash(this.currentMap, startIndex, endIndex, step);
+        };
+        RefMap.prototype.getAll = function () {
+            return hashValuesToArray(this.currentMap);
+        };
+        return RefMap;
+    }());
+
+    function computeShrinkWidth(chunkEls) {
+        var shrinkCells = findElements(chunkEls, '.fc-scrollgrid-shrink');
+        var largestWidth = 0;
+        for (var _i = 0, shrinkCells_1 = shrinkCells; _i < shrinkCells_1.length; _i++) {
+            var shrinkCell = shrinkCells_1[_i];
+            largestWidth = Math.max(largestWidth, computeSmallestCellWidth(shrinkCell));
+        }
+        return Math.ceil(largestWidth); // <table> elements work best with integers. round up to ensure contents fits
+    }
+    function getSectionHasLiquidHeight(props, sectionConfig) {
+        return props.liquid && sectionConfig.liquid; // does the section do liquid-height? (need to have whole scrollgrid liquid-height as well)
+    }
+    function getAllowYScrolling(props, sectionConfig) {
+        return sectionConfig.maxHeight != null || // if its possible for the height to max out, we might need scrollbars
+            getSectionHasLiquidHeight(props, sectionConfig); // if the section is liquid height, it might condense enough to require scrollbars
+    }
+    // TODO: ONLY use `arg`. force out internal function to use same API
+    function renderChunkContent(sectionConfig, chunkConfig, arg) {
+        var expandRows = arg.expandRows;
+        var content = typeof chunkConfig.content === 'function' ?
+            chunkConfig.content(arg) :
+            createElement('table', {
+                className: [
+                    chunkConfig.tableClassName,
+                    sectionConfig.syncRowHeights ? 'fc-scrollgrid-sync-table' : ''
+                ].join(' '),
+                style: {
+                    minWidth: arg.tableMinWidth,
+                    width: arg.clientWidth,
+                    height: expandRows ? arg.clientHeight : '' // css `height` on a <table> serves as a min-height
+                }
+            }, arg.tableColGroupNode, createElement('tbody', {}, typeof chunkConfig.rowContent === 'function' ? chunkConfig.rowContent(arg) : chunkConfig.rowContent));
+        return content;
+    }
+    function isColPropsEqual(cols0, cols1) {
+        return isArraysEqual(cols0, cols1, isPropsEqual);
+    }
+    function renderMicroColGroup(cols, shrinkWidth) {
+        var colNodes = [];
+        /*
+        for ColProps with spans, it would have been great to make a single <col span="">
+        HOWEVER, Chrome was getting messing up distributing the width to <td>/<th> elements with colspans.
+        SOLUTION: making individual <col> elements makes Chrome behave.
+        */
+        for (var _i = 0, cols_1 = cols; _i < cols_1.length; _i++) {
+            var colProps = cols_1[_i];
+            var span = colProps.span || 1;
+            for (var i = 0; i < span; i++) {
+                colNodes.push(createElement("col", { style: {
+                        width: colProps.width === 'shrink' ? sanitizeShrinkWidth(shrinkWidth) : (colProps.width || ''),
+                        minWidth: colProps.minWidth || ''
+                    } }));
+            }
+        }
+        return createElement.apply(void 0, __spreadArrays(['colgroup', {}], colNodes));
+    }
+    function sanitizeShrinkWidth(shrinkWidth) {
+        /* why 4? if we do 0, it will kill any border, which are needed for computeSmallestCellWidth
+        4 accounts for 2 2-pixel borders. TODO: better solution? */
+        return shrinkWidth == null ? 4 : shrinkWidth;
+    }
+    function hasShrinkWidth(cols) {
+        for (var _i = 0, cols_2 = cols; _i < cols_2.length; _i++) {
+            var col = cols_2[_i];
+            if (col.width === 'shrink') {
+                return true;
+            }
+        }
+        return false;
+    }
+    function getScrollGridClassNames(liquid, context) {
+        var classNames = [
+            'fc-scrollgrid',
+            context.theme.getClass('table')
+        ];
+        if (liquid) {
+            classNames.push('fc-scrollgrid-liquid');
+        }
+        return classNames;
+    }
+    function getSectionClassNames(sectionConfig, wholeTableVGrow) {
+        var classNames = [
+            'fc-scrollgrid-section',
+            sectionConfig.className // used?
+        ];
+        if (wholeTableVGrow && sectionConfig.liquid && sectionConfig.maxHeight == null) {
+            classNames.push('fc-scrollgrid-section-liquid');
+        }
+        if (sectionConfig.isSticky) {
+            classNames.push('fc-scrollgrid-section-sticky');
+        }
+        return classNames;
+    }
+    function renderScrollShim(arg) {
+        return (createElement("div", { className: 'fc-scrollgrid-sticky-shim', style: {
+                width: arg.clientWidth,
+                minWidth: arg.tableMinWidth
+            } }));
+    }
+    function getStickyHeaderDates(options) {
+        var stickyHeaderDates = options.stickyHeaderDates;
+        if (stickyHeaderDates == null || stickyHeaderDates === 'auto') {
+            stickyHeaderDates = options.height === 'auto' || options.viewHeight === 'auto';
+        }
+        return stickyHeaderDates;
+    }
+    function getStickyFooterScrollbar(options) {
+        var stickyFooterScrollbar = options.stickyFooterScrollbar;
+        if (stickyFooterScrollbar == null || stickyFooterScrollbar === 'auto') {
+            stickyFooterScrollbar = options.height === 'auto' || options.viewHeight === 'auto';
+        }
+        return stickyFooterScrollbar;
+    }
+
+    var SimpleScrollGrid = /** @class */ (function (_super) {
+        __extends(SimpleScrollGrid, _super);
+        function SimpleScrollGrid() {
+            var _this = _super !== null && _super.apply(this, arguments) || this;
+            _this.processCols = memoize(function (a) { return a; }, isColPropsEqual); // so we get same `cols` props every time
+            _this.renderMicroColGroup = memoize(renderMicroColGroup); // yucky to memoize VNodes, but much more efficient for consumers
+            _this.scrollerRefs = new RefMap();
+            _this.scrollerElRefs = new RefMap(_this._handleScrollerEl.bind(_this));
+            _this.state = {
+                shrinkWidth: null,
+                forceYScrollbars: false,
+                scrollerClientWidths: {},
+                scrollerClientHeights: {}
+            };
+            // TODO: can do a really simple print-view. dont need to join rows
+            _this.handleSizing = function () {
+                _this.setState(__assign({ shrinkWidth: _this.computeShrinkWidth() }, _this.computeScrollerDims()));
+            };
+            return _this;
+        }
+        SimpleScrollGrid.prototype.render = function () {
+            var _a = this, props = _a.props, state = _a.state, context = _a.context;
+            var sectionConfigs = props.sections || [];
+            var cols = this.processCols(props.cols);
+            var microColGroupNode = this.renderMicroColGroup(cols, state.shrinkWidth);
+            var classNames = getScrollGridClassNames(props.liquid, context);
+            // TODO: make DRY
+            var configCnt = sectionConfigs.length;
+            var configI = 0;
+            var currentConfig;
+            var headSectionNodes = [];
+            var bodySectionNodes = [];
+            var footSectionNodes = [];
+            while (configI < configCnt && (currentConfig = sectionConfigs[configI]).type === 'header') {
+                headSectionNodes.push(this.renderSection(currentConfig, configI, microColGroupNode));
+                configI++;
+            }
+            while (configI < configCnt && (currentConfig = sectionConfigs[configI]).type === 'body') {
+                bodySectionNodes.push(this.renderSection(currentConfig, configI, microColGroupNode));
+                configI++;
+            }
+            while (configI < configCnt && (currentConfig = sectionConfigs[configI]).type === 'footer') {
+                footSectionNodes.push(this.renderSection(currentConfig, configI, microColGroupNode));
+                configI++;
+            }
+            return (createElement("table", { className: classNames.join(' '), style: { height: props.height } },
+                Boolean(headSectionNodes.length) && createElement.apply(void 0, __spreadArrays(['thead', {}], headSectionNodes)),
+                Boolean(bodySectionNodes.length) && createElement.apply(void 0, __spreadArrays(['tbody', {}], bodySectionNodes)),
+                Boolean(footSectionNodes.length) && createElement.apply(void 0, __spreadArrays(['tfoot', {}], footSectionNodes))));
+        };
+        SimpleScrollGrid.prototype.renderSection = function (sectionConfig, sectionI, microColGroupNode) {
+            if ('outerContent' in sectionConfig) {
+                return (createElement(Fragment, { key: sectionConfig.key }, sectionConfig.outerContent));
+            }
+            return (createElement("tr", { key: sectionConfig.key, className: getSectionClassNames(sectionConfig, this.props.liquid).join(' ') }, this.renderChunkTd(sectionConfig, sectionI, microColGroupNode, sectionConfig.chunk)));
+        };
+        SimpleScrollGrid.prototype.renderChunkTd = function (sectionConfig, sectionI, microColGroupNode, chunkConfig) {
+            if ('outerContent' in chunkConfig) {
+                return chunkConfig.outerContent;
+            }
+            var props = this.props;
+            var _a = this.state, forceYScrollbars = _a.forceYScrollbars, scrollerClientWidths = _a.scrollerClientWidths, scrollerClientHeights = _a.scrollerClientHeights;
+            var needsYScrolling = getAllowYScrolling(props, sectionConfig); // TODO: do lazily. do in section config?
+            var isLiquid = getSectionHasLiquidHeight(props, sectionConfig);
+            // for `!props.liquid` - is WHOLE scrollgrid natural height?
+            // TODO: do same thing in advanced scrollgrid? prolly not b/c always has horizontal scrollbars
+            var overflowY = !props.liquid ? 'visible' :
+                forceYScrollbars ? 'scroll' :
+                    !needsYScrolling ? 'hidden' :
+                        'auto';
+            var content = renderChunkContent(sectionConfig, chunkConfig, {
+                tableColGroupNode: microColGroupNode,
+                tableMinWidth: '',
+                clientWidth: scrollerClientWidths[sectionI] !== undefined ? scrollerClientWidths[sectionI] : null,
+                clientHeight: scrollerClientHeights[sectionI] !== undefined ? scrollerClientHeights[sectionI] : null,
+                expandRows: sectionConfig.expandRows,
+                syncRowHeights: false,
+                rowSyncHeights: [],
+                reportRowHeightChange: function () { }
+            });
+            return (createElement("td", { ref: chunkConfig.elRef },
+                createElement("div", { className: 'fc-scroller-harness' + (isLiquid ? ' fc-scroller-harness-liquid' : '') },
+                    createElement(Scroller, { ref: this.scrollerRefs.createRef(sectionI), elRef: this.scrollerElRefs.createRef(sectionI), overflowY: overflowY, overflowX: !props.liquid ? 'visible' : 'hidden' /* natural height? */, maxHeight: sectionConfig.maxHeight, liquid: isLiquid, liquidIsAbsolute: true /* because its within a harness */ }, content))));
+        };
+        SimpleScrollGrid.prototype._handleScrollerEl = function (scrollerEl, key) {
+            var sectionI = parseInt(key, 10);
+            var chunkConfig = this.props.sections[sectionI].chunk;
+            setRef(chunkConfig.scrollerElRef, scrollerEl);
+        };
+        SimpleScrollGrid.prototype.componentDidMount = function () {
+            this.handleSizing();
+            this.context.addResizeHandler(this.handleSizing);
+        };
+        SimpleScrollGrid.prototype.componentDidUpdate = function () {
+            // TODO: need better solution when state contains non-sizing things
+            this.handleSizing();
+        };
+        SimpleScrollGrid.prototype.componentWillUnmount = function () {
+            this.context.removeResizeHandler(this.handleSizing);
+        };
+        SimpleScrollGrid.prototype.computeShrinkWidth = function () {
+            return hasShrinkWidth(this.props.cols)
+                ? computeShrinkWidth(this.scrollerElRefs.getAll())
+                : 0;
+        };
+        SimpleScrollGrid.prototype.computeScrollerDims = function () {
+            var scrollbarWidth = getScrollbarWidths();
+            var sectionCnt = this.props.sections.length;
+            var _a = this, scrollerRefs = _a.scrollerRefs, scrollerElRefs = _a.scrollerElRefs;
+            var forceYScrollbars = false;
+            var scrollerClientWidths = {};
+            var scrollerClientHeights = {};
+            for (var sectionI = 0; sectionI < sectionCnt; sectionI++) { // along edge
+                var scroller = scrollerRefs.currentMap[sectionI];
+                if (scroller && scroller.needsYScrolling()) {
+                    forceYScrollbars = true;
+                    break;
+                }
+            }
+            for (var sectionI = 0; sectionI < sectionCnt; sectionI++) { // along edge
+                var scrollerEl = scrollerElRefs.currentMap[sectionI];
+                if (scrollerEl) {
+                    var harnessEl = scrollerEl.parentNode; // TODO: weird way to get this. need harness b/c doesn't include table borders
+                    scrollerClientWidths[sectionI] = Math.floor(harnessEl.getBoundingClientRect().width - (forceYScrollbars
+                        ? scrollbarWidth.y // use global because scroller might not have scrollbars yet but will need them in future
+                        : 0));
+                    scrollerClientHeights[sectionI] = Math.floor(harnessEl.getBoundingClientRect().height // never has horizontal scrollbars
+                    );
+                }
+            }
+            return { forceYScrollbars: forceYScrollbars, scrollerClientWidths: scrollerClientWidths, scrollerClientHeights: scrollerClientHeights };
+        };
+        return SimpleScrollGrid;
+    }(BaseComponent));
+    SimpleScrollGrid.addStateEquality({
+        scrollerClientWidths: isPropsEqual,
+        scrollerClientHeights: isPropsEqual
+    });
+
+    var EventRoot = /** @class */ (function (_super) {
+        __extends(EventRoot, _super);
+        function EventRoot() {
+            var _this = _super !== null && _super.apply(this, arguments) || this;
+            _this.elRef = createRef();
+            return _this;
+        }
+        EventRoot.prototype.render = function () {
+            var _a = this, props = _a.props, context = _a.context;
+            var options = context.options;
+            var seg = props.seg;
+            var eventRange = seg.eventRange;
+            var ui = eventRange.ui;
+            var hookProps = {
+                event: new EventApi(context, eventRange.def, eventRange.instance),
+                view: context.viewApi,
+                timeText: props.timeText,
+                textColor: ui.textColor,
+                backgroundColor: ui.backgroundColor,
+                borderColor: ui.borderColor,
+                isDraggable: !props.disableDragging && computeSegDraggable(seg, context),
+                isStartResizable: !props.disableResizing && computeSegStartResizable(seg, context),
+                isEndResizable: !props.disableResizing && computeSegEndResizable(seg),
+                isMirror: Boolean(props.isDragging || props.isResizing || props.isDateSelecting),
+                isStart: Boolean(seg.isStart),
+                isEnd: Boolean(seg.isEnd),
+                isPast: Boolean(props.isPast),
+                isFuture: Boolean(props.isFuture),
+                isToday: Boolean(props.isToday),
+                isSelected: Boolean(props.isSelected),
+                isDragging: Boolean(props.isDragging),
+                isResizing: Boolean(props.isResizing)
+            };
+            var standardClassNames = getEventClassNames(hookProps).concat(ui.classNames);
+            return (createElement(RenderHook, { hookProps: hookProps, classNames: options.eventClassNames, content: options.eventContent, defaultContent: props.defaultContent, didMount: options.eventDidMount, willUnmount: options.eventWillUnmount, elRef: this.elRef }, function (rootElRef, customClassNames, innerElRef, innerContent) { return props.children(rootElRef, standardClassNames.concat(customClassNames), innerElRef, innerContent, hookProps); }));
+        };
+        EventRoot.prototype.componentDidMount = function () {
+            setElSeg(this.elRef.current, this.props.seg);
+        };
+        /*
+        need to re-assign seg to the element if seg changes, even if the element is the same
+        */
+        EventRoot.prototype.componentDidUpdate = function (prevProps) {
+            var seg = this.props.seg;
+            if (seg !== prevProps.seg) {
+                setElSeg(this.elRef.current, seg);
+            }
+        };
+        return EventRoot;
+    }(BaseComponent));
+
+    // should not be a purecomponent
+    var StandardEvent = /** @class */ (function (_super) {
+        __extends(StandardEvent, _super);
+        function StandardEvent() {
+            return _super !== null && _super.apply(this, arguments) || this;
+        }
+        StandardEvent.prototype.render = function () {
+            var _a = this, props = _a.props, context = _a.context;
+            var seg = props.seg;
+            var timeFormat = context.options.eventTimeFormat || props.defaultTimeFormat;
+            var timeText = buildSegTimeText(seg, timeFormat, context, props.defaultDisplayEventTime, props.defaultDisplayEventEnd);
+            return (createElement(EventRoot, { seg: seg, timeText: timeText, disableDragging: props.disableDragging, disableResizing: props.disableResizing, defaultContent: props.defaultContent || renderInnerContent, isDragging: props.isDragging, isResizing: props.isResizing, isDateSelecting: props.isDateSelecting, isSelected: props.isSelected, isPast: props.isPast, isFuture: props.isFuture, isToday: props.isToday }, function (rootElRef, classNames, innerElRef, innerContent, hookProps) { return (createElement("a", __assign({ className: props.extraClassNames.concat(classNames).join(' '), style: {
+                    borderColor: hookProps.borderColor,
+                    backgroundColor: hookProps.backgroundColor
+                }, ref: rootElRef }, getSegAnchorAttrs(seg)),
+                createElement("div", { className: 'fc-event-main', ref: innerElRef, style: { color: hookProps.textColor } }, innerContent),
+                hookProps.isStartResizable &&
+                    createElement("div", { className: 'fc-event-resizer fc-event-resizer-start' }),
+                hookProps.isEndResizable &&
+                    createElement("div", { className: 'fc-event-resizer fc-event-resizer-end' }))); }));
+        };
+        return StandardEvent;
+    }(BaseComponent));
+    function renderInnerContent(innerProps) {
+        return (createElement("div", { className: 'fc-event-main-frame' },
+            innerProps.timeText &&
+                createElement("div", { className: 'fc-event-time' }, innerProps.timeText),
+            createElement("div", { className: 'fc-event-title-container' },
+                createElement("div", { className: 'fc-event-title fc-sticky' }, innerProps.event.title || createElement(Fragment, null, "\u00A0")))));
+    }
+    function getSegAnchorAttrs(seg) {
+        var url = seg.eventRange.def.url;
+        return url ? { href: url } : {};
+    }
+
+    var NowIndicatorRoot = function (props) { return (createElement(ViewContextType.Consumer, null, function (context) {
+        var options = context.options;
+        var hookProps = {
+            isAxis: props.isAxis,
+            date: context.dateEnv.toDate(props.date),
+            view: context.viewApi
+        };
+        return (createElement(RenderHook, { hookProps: hookProps, classNames: options.nowIndicatorClassNames, content: options.nowIndicatorContent, didMount: options.nowIndicatorDidMount, willUnmount: options.nowIndicatorWillUnmount }, props.children));
+    })); };
+
+    var DAY_NUM_FORMAT = createFormatter({ day: 'numeric' });
+    var DayCellRoot = /** @class */ (function (_super) {
+        __extends(DayCellRoot, _super);
+        function DayCellRoot() {
+            var _this = _super !== null && _super.apply(this, arguments) || this;
+            _this.refineHookProps = memoizeObjArg(refineHookProps);
+            _this.normalizeClassNames = buildClassNameNormalizer();
+            return _this;
+        }
+        DayCellRoot.prototype.render = function () {
+            var _a = this, props = _a.props, context = _a.context;
+            var options = context.options;
+            var hookProps = this.refineHookProps({
+                date: props.date,
+                dateProfile: props.dateProfile,
+                todayRange: props.todayRange,
+                showDayNumber: props.showDayNumber,
+                extraProps: props.extraHookProps,
+                viewApi: context.viewApi,
+                dateEnv: context.dateEnv
+            });
+            var classNames = getDayClassNames(hookProps, context.theme).concat(hookProps.isDisabled
+                ? [] // don't use custom classNames if disabled
+                : this.normalizeClassNames(options.dayCellClassNames, hookProps));
+            var dataAttrs = hookProps.isDisabled ? {} : {
+                'data-date': formatDayString(props.date)
+            };
+            return (createElement(MountHook, { hookProps: hookProps, didMount: options.dayCellDidMount, willUnmount: options.dayCellWillUnmount, elRef: props.elRef }, function (rootElRef) { return props.children(rootElRef, classNames, dataAttrs, hookProps.isDisabled); }));
+        };
+        return DayCellRoot;
+    }(BaseComponent));
+    var DayCellContent = /** @class */ (function (_super) {
+        __extends(DayCellContent, _super);
+        function DayCellContent() {
+            return _super !== null && _super.apply(this, arguments) || this;
+        }
+        DayCellContent.prototype.render = function () {
+            var _a = this, props = _a.props, context = _a.context;
+            var options = context.options;
+            var hookProps = refineHookProps({
+                date: props.date,
+                dateProfile: props.dateProfile,
+                todayRange: props.todayRange,
+                showDayNumber: props.showDayNumber,
+                extraProps: props.extraHookProps,
+                viewApi: context.viewApi,
+                dateEnv: context.dateEnv
+            });
+            return (createElement(ContentHook, { hookProps: hookProps, content: options.dayCellContent, defaultContent: props.defaultContent }, props.children));
+        };
+        return DayCellContent;
+    }(BaseComponent));
+    function refineHookProps(raw) {
+        var date = raw.date, dateEnv = raw.dateEnv;
+        var dayMeta = getDateMeta(date, raw.todayRange, null, raw.dateProfile);
+        return __assign(__assign(__assign({ date: dateEnv.toDate(date), view: raw.viewApi }, dayMeta), { dayNumberText: raw.showDayNumber ? dateEnv.format(date, DAY_NUM_FORMAT) : '' }), raw.extraProps);
+    }
+
+    function renderFill(fillType) {
+        return (createElement("div", { className: "fc-" + fillType }));
+    }
+    var BgEvent = function (props) { return (createElement(EventRoot, { defaultContent: renderInnerContent$1, seg: props.seg /* uselesss i think */, timeText: '' /* weird */, disableDragging: true, disableResizing: true, isDragging: false, isResizing: false, isDateSelecting: false, isSelected: false, isPast: props.isPast, isFuture: props.isFuture, isToday: props.isToday }, function (rootElRef, classNames, innerElRef, innerContent, hookProps) { return (createElement("div", { ref: rootElRef, className: ['fc-bg-event'].concat(classNames).join(' '), style: {
+            backgroundColor: hookProps.backgroundColor
+        } }, innerContent)); })); };
+    function renderInnerContent$1(props) {
+        var title = props.event.title;
+        return title && (createElement("div", { className: 'fc-event-title' }, props.event.title));
+    }
+
+    var WeekNumberRoot = function (props) { return (createElement(ViewContextType.Consumer, null, function (context) {
+        var dateEnv = context.dateEnv, options = context.options;
+        var date = props.date;
+        var format = options.weekNumberFormat || props.defaultFormat;
+        var num = dateEnv.computeWeekNumber(date); // TODO: somehow use for formatting as well?
+        var text = dateEnv.format(date, format);
+        var hookProps = { num: num, text: text, date: date };
+        return (createElement(RenderHook, { hookProps: hookProps, classNames: options.weekNumberClassNames, content: options.weekNumberContent, defaultContent: renderInner$1, didMount: options.weekNumberDidMount, willUnmount: options.weekNumberWillUnmount }, props.children));
+    })); };
+    function renderInner$1(innerProps) {
+        return innerProps.text;
+    }
+
+    // exports
+    // --------------------------------------------------------------------------------------------------
+    var version = '<%= version %>'; // important to type it, so .d.ts has generic string
+
+    var Calendar = /** @class */ (function (_super) {
+        __extends(Calendar, _super);
+        function Calendar(el, optionOverrides) {
+            if (optionOverrides === void 0) { optionOverrides = {}; }
+            var _this = _super.call(this) || this;
+            _this.isRendering = false;
+            _this.isRendered = false;
+            _this.currentClassNames = [];
+            _this.customContentRenderId = 0; // will affect custom generated classNames?
+            _this.handleAction = function (action) {
+                // actions we know we want to render immediately
+                switch (action.type) {
+                    case 'SET_EVENT_DRAG':
+                    case 'SET_EVENT_RESIZE':
+                        _this.renderRunner.tryDrain();
+                }
+            };
+            _this.handleData = function (data) {
+                _this.currentData = data;
+                _this.renderRunner.request(data.calendarOptions.rerenderDelay);
+            };
+            _this.handleRenderRequest = function () {
+                if (_this.isRendering) {
+                    _this.isRendered = true;
+                    var currentData_1 = _this.currentData;
+                    render(createElement(CalendarRoot, { options: currentData_1.calendarOptions, theme: currentData_1.theme, emitter: currentData_1.emitter }, function (classNames, height, isHeightAuto, forPrint) {
+                        _this.setClassNames(classNames);
+                        _this.setHeight(height);
+                        return (createElement(CustomContentRenderContext.Provider, { value: _this.customContentRenderId },
+                            createElement(CalendarContent, __assign({ isHeightAuto: isHeightAuto, forPrint: forPrint }, currentData_1))));
+                    }), _this.el);
+                }
+                else if (_this.isRendered) {
+                    _this.isRendered = false;
+                    render(null, _this.el);
+                    _this.setClassNames([]);
+                    _this.setHeight('');
+                }
+                flushToDom$1();
+            };
+            _this.el = el;
+            _this.renderRunner = new DelayedRunner(_this.handleRenderRequest);
+            new CalendarDataManager({
+                optionOverrides: optionOverrides,
+                calendarApi: _this,
+                onAction: _this.handleAction,
+                onData: _this.handleData
+            });
+            return _this;
+        }
+        Object.defineProperty(Calendar.prototype, "view", {
+            get: function () { return this.currentData.viewApi; } // for public API
+            ,
+            enumerable: false,
+            configurable: true
+        });
+        Calendar.prototype.render = function () {
+            if (!this.isRendering) {
+                this.isRendering = true;
+            }
+            else {
+                this.customContentRenderId++;
+            }
+            this.renderRunner.request();
+        };
+        Calendar.prototype.destroy = function () {
+            if (this.isRendering) {
+                this.isRendering = false;
+                this.renderRunner.request();
+            }
+        };
+        Calendar.prototype.updateSize = function () {
+            _super.prototype.updateSize.call(this);
+            flushToDom$1();
+        };
+        Calendar.prototype.batchRendering = function (func) {
+            this.renderRunner.pause('batchRendering');
+            func();
+            this.renderRunner.resume('batchRendering');
+        };
+        Calendar.prototype.pauseRendering = function () {
+            this.renderRunner.pause('pauseRendering');
+        };
+        Calendar.prototype.resumeRendering = function () {
+            this.renderRunner.resume('pauseRendering', true);
+        };
+        Calendar.prototype.resetOptions = function (optionOverrides, append) {
+            this.currentDataManager.resetOptions(optionOverrides, append);
+        };
+        Calendar.prototype.setClassNames = function (classNames) {
+            if (!isArraysEqual(classNames, this.currentClassNames)) {
+                var classList = this.el.classList;
+                for (var _i = 0, _a = this.currentClassNames; _i < _a.length; _i++) {
+                    var className = _a[_i];
+                    classList.remove(className);
+                }
+                for (var _b = 0, classNames_1 = classNames; _b < classNames_1.length; _b++) {
+                    var className = classNames_1[_b];
+                    classList.add(className);
+                }
+                this.currentClassNames = classNames;
+            }
+        };
+        Calendar.prototype.setHeight = function (height) {
+            applyStyleProp(this.el, 'height', height);
+        };
+        return Calendar;
+    }(CalendarApi));
+
+    config.touchMouseIgnoreWait = 500;
+    var ignoreMouseDepth = 0;
+    var listenerCnt = 0;
+    var isWindowTouchMoveCancelled = false;
+    /*
+    Uses a "pointer" abstraction, which monitors UI events for both mouse and touch.
+    Tracks when the pointer "drags" on a certain element, meaning down+move+up.
+
+    Also, tracks if there was touch-scrolling.
+    Also, can prevent touch-scrolling from happening.
+    Also, can fire pointermove events when scrolling happens underneath, even when no real pointer movement.
+
+    emits:
+    - pointerdown
+    - pointermove
+    - pointerup
+    */
+    var PointerDragging = /** @class */ (function () {
+        function PointerDragging(containerEl) {
+            var _this = this;
+            this.subjectEl = null;
+            this.downEl = null;
+            // options that can be directly assigned by caller
+            this.selector = ''; // will cause subjectEl in all emitted events to be this element
+            this.handleSelector = '';
+            this.shouldIgnoreMove = false;
+            this.shouldWatchScroll = true; // for simulating pointermove on scroll
+            // internal states
+            this.isDragging = false;
+            this.isTouchDragging = false;
+            this.wasTouchScroll = false;
+            // Mouse
+            // ----------------------------------------------------------------------------------------------------
+            this.handleMouseDown = function (ev) {
+                if (!_this.shouldIgnoreMouse() &&
+                    isPrimaryMouseButton(ev) &&
+                    _this.tryStart(ev)) {
+                    var pev = _this.createEventFromMouse(ev, true);
+                    _this.emitter.trigger('pointerdown', pev);
+                    _this.initScrollWatch(pev);
+                    if (!_this.shouldIgnoreMove) {
+                        document.addEventListener('mousemove', _this.handleMouseMove);
+                    }
+                    document.addEventListener('mouseup', _this.handleMouseUp);
+                }
+            };
+            this.handleMouseMove = function (ev) {
+                var pev = _this.createEventFromMouse(ev);
+                _this.recordCoords(pev);
+                _this.emitter.trigger('pointermove', pev);
+            };
+            this.handleMouseUp = function (ev) {
+                document.removeEventListener('mousemove', _this.handleMouseMove);
+                document.removeEventListener('mouseup', _this.handleMouseUp);
+                _this.emitter.trigger('pointerup', _this.createEventFromMouse(ev));
+                _this.cleanup(); // call last so that pointerup has access to props
+            };
+            // Touch
+            // ----------------------------------------------------------------------------------------------------
+            this.handleTouchStart = function (ev) {
+                if (_this.tryStart(ev)) {
+                    _this.isTouchDragging = true;
+                    var pev = _this.createEventFromTouch(ev, true);
+                    _this.emitter.trigger('pointerdown', pev);
+                    _this.initScrollWatch(pev);
+                    // unlike mouse, need to attach to target, not document
+                    // https://stackoverflow.com/a/45760014
+                    var target = ev.target;
+                    if (!_this.shouldIgnoreMove) {
+                        target.addEventListener('touchmove', _this.handleTouchMove);
+                    }
+                    target.addEventListener('touchend', _this.handleTouchEnd);
+                    target.addEventListener('touchcancel', _this.handleTouchEnd); // treat it as a touch end
+                    // attach a handler to get called when ANY scroll action happens on the page.
+                    // this was impossible to do with normal on/off because 'scroll' doesn't bubble.
+                    // http://stackoverflow.com/a/32954565/96342
+                    window.addEventListener('scroll', _this.handleTouchScroll, true // useCapture
+                    );
+                }
+            };
+            this.handleTouchMove = function (ev) {
+                var pev = _this.createEventFromTouch(ev);
+                _this.recordCoords(pev);
+                _this.emitter.trigger('pointermove', pev);
+            };
+            this.handleTouchEnd = function (ev) {
+                if (_this.isDragging) { // done to guard against touchend followed by touchcancel
+                    var target = ev.target;
+                    target.removeEventListener('touchmove', _this.handleTouchMove);
+                    target.removeEventListener('touchend', _this.handleTouchEnd);
+                    target.removeEventListener('touchcancel', _this.handleTouchEnd);
+                    window.removeEventListener('scroll', _this.handleTouchScroll, true); // useCaptured=true
+                    _this.emitter.trigger('pointerup', _this.createEventFromTouch(ev));
+                    _this.cleanup(); // call last so that pointerup has access to props
+                    _this.isTouchDragging = false;
+                    startIgnoringMouse();
+                }
+            };
+            this.handleTouchScroll = function () {
+                _this.wasTouchScroll = true;
+            };
+            this.handleScroll = function (ev) {
+                if (!_this.shouldIgnoreMove) {
+                    var pageX = (window.pageXOffset - _this.prevScrollX) + _this.prevPageX;
+                    var pageY = (window.pageYOffset - _this.prevScrollY) + _this.prevPageY;
+                    _this.emitter.trigger('pointermove', {
+                        origEvent: ev,
+                        isTouch: _this.isTouchDragging,
+                        subjectEl: _this.subjectEl,
+                        pageX: pageX,
+                        pageY: pageY,
+                        deltaX: pageX - _this.origPageX,
+                        deltaY: pageY - _this.origPageY
+                    });
+                }
+            };
+            this.containerEl = containerEl;
+            this.emitter = new Emitter();
+            containerEl.addEventListener('mousedown', this.handleMouseDown);
+            containerEl.addEventListener('touchstart', this.handleTouchStart, { passive: true });
+            listenerCreated();
+        }
+        PointerDragging.prototype.destroy = function () {
+            this.containerEl.removeEventListener('mousedown', this.handleMouseDown);
+            this.containerEl.removeEventListener('touchstart', this.handleTouchStart, { passive: true });
+            listenerDestroyed();
+        };
+        PointerDragging.prototype.tryStart = function (ev) {
+            var subjectEl = this.querySubjectEl(ev);
+            var downEl = ev.target;
+            if (subjectEl &&
+                (!this.handleSelector || elementClosest(downEl, this.handleSelector))) {
+                this.subjectEl = subjectEl;
+                this.downEl = downEl;
+                this.isDragging = true; // do this first so cancelTouchScroll will work
+                this.wasTouchScroll = false;
+                return true;
+            }
+            return false;
+        };
+        PointerDragging.prototype.cleanup = function () {
+            isWindowTouchMoveCancelled = false;
+            this.isDragging = false;
+            this.subjectEl = null;
+            this.downEl = null;
+            // keep wasTouchScroll around for later access
+            this.destroyScrollWatch();
+        };
+        PointerDragging.prototype.querySubjectEl = function (ev) {
+            if (this.selector) {
+                return elementClosest(ev.target, this.selector);
+            }
+            else {
+                return this.containerEl;
+            }
+        };
+        PointerDragging.prototype.shouldIgnoreMouse = function () {
+            return ignoreMouseDepth || this.isTouchDragging;
+        };
+        // can be called by user of this class, to cancel touch-based scrolling for the current drag
+        PointerDragging.prototype.cancelTouchScroll = function () {
+            if (this.isDragging) {
+                isWindowTouchMoveCancelled = true;
+            }
+        };
+        // Scrolling that simulates pointermoves
+        // ----------------------------------------------------------------------------------------------------
+        PointerDragging.prototype.initScrollWatch = function (ev) {
+            if (this.shouldWatchScroll) {
+                this.recordCoords(ev);
+                window.addEventListener('scroll', this.handleScroll, true); // useCapture=true
+            }
+        };
+        PointerDragging.prototype.recordCoords = function (ev) {
+            if (this.shouldWatchScroll) {
+                this.prevPageX = ev.pageX;
+                this.prevPageY = ev.pageY;
+                this.prevScrollX = window.pageXOffset;
+                this.prevScrollY = window.pageYOffset;
+            }
+        };
+        PointerDragging.prototype.destroyScrollWatch = function () {
+            if (this.shouldWatchScroll) {
+                window.removeEventListener('scroll', this.handleScroll, true); // useCaptured=true
+            }
+        };
+        // Event Normalization
+        // ----------------------------------------------------------------------------------------------------
+        PointerDragging.prototype.createEventFromMouse = function (ev, isFirst) {
+            var deltaX = 0;
+            var deltaY = 0;
+            // TODO: repeat code
+            if (isFirst) {
+                this.origPageX = ev.pageX;
+                this.origPageY = ev.pageY;
+            }
+            else {
+                deltaX = ev.pageX - this.origPageX;
+                deltaY = ev.pageY - this.origPageY;
+            }
+            return {
+                origEvent: ev,
+                isTouch: false,
+                subjectEl: this.subjectEl,
+                pageX: ev.pageX,
+                pageY: ev.pageY,
+                deltaX: deltaX,
+                deltaY: deltaY
+            };
+        };
+        PointerDragging.prototype.createEventFromTouch = function (ev, isFirst) {
+            var touches = ev.touches;
+            var pageX;
+            var pageY;
+            var deltaX = 0;
+            var deltaY = 0;
+            // if touch coords available, prefer,
+            // because FF would give bad ev.pageX ev.pageY
+            if (touches && touches.length) {
+                pageX = touches[0].pageX;
+                pageY = touches[0].pageY;
+            }
+            else {
+                pageX = ev.pageX;
+                pageY = ev.pageY;
+            }
+            // TODO: repeat code
+            if (isFirst) {
+                this.origPageX = pageX;
+                this.origPageY = pageY;
+            }
+            else {
+                deltaX = pageX - this.origPageX;
+                deltaY = pageY - this.origPageY;
+            }
+            return {
+                origEvent: ev,
+                isTouch: true,
+                subjectEl: this.subjectEl,
+                pageX: pageX,
+                pageY: pageY,
+                deltaX: deltaX,
+                deltaY: deltaY
+            };
+        };
+        return PointerDragging;
+    }());
+    // Returns a boolean whether this was a left mouse click and no ctrl key (which means right click on Mac)
+    function isPrimaryMouseButton(ev) {
+        return ev.button === 0 && !ev.ctrlKey;
+    }
+    // Ignoring fake mouse events generated by touch
+    // ----------------------------------------------------------------------------------------------------
+    function startIgnoringMouse() {
+        ignoreMouseDepth++;
+        setTimeout(function () {
+            ignoreMouseDepth--;
+        }, config.touchMouseIgnoreWait);
+    }
+    // We want to attach touchmove as early as possible for Safari
+    // ----------------------------------------------------------------------------------------------------
+    function listenerCreated() {
+        if (!(listenerCnt++)) {
+            window.addEventListener('touchmove', onWindowTouchMove, { passive: false });
+        }
+    }
+    function listenerDestroyed() {
+        if (!(--listenerCnt)) {
+            window.removeEventListener('touchmove', onWindowTouchMove, { passive: false });
+        }
+    }
+    function onWindowTouchMove(ev) {
+        if (isWindowTouchMoveCancelled) {
+            ev.preventDefault();
+        }
+    }
+
+    /*
+    An effect in which an element follows the movement of a pointer across the screen.
+    The moving element is a clone of some other element.
+    Must call start + handleMove + stop.
+    */
+    var ElementMirror = /** @class */ (function () {
+        function ElementMirror() {
+            this.isVisible = false; // must be explicitly enabled
+            this.sourceEl = null;
+            this.mirrorEl = null;
+            this.sourceElRect = null; // screen coords relative to viewport
+            // options that can be set directly by caller
+            this.parentNode = document.body;
+            this.zIndex = 9999;
+            this.revertDuration = 0;
+        }
+        ElementMirror.prototype.start = function (sourceEl, pageX, pageY) {
+            this.sourceEl = sourceEl;
+            this.sourceElRect = this.sourceEl.getBoundingClientRect();
+            this.origScreenX = pageX - window.pageXOffset;
+            this.origScreenY = pageY - window.pageYOffset;
+            this.deltaX = 0;
+            this.deltaY = 0;
+            this.updateElPosition();
+        };
+        ElementMirror.prototype.handleMove = function (pageX, pageY) {
+            this.deltaX = (pageX - window.pageXOffset) - this.origScreenX;
+            this.deltaY = (pageY - window.pageYOffset) - this.origScreenY;
+            this.updateElPosition();
+        };
+        // can be called before start
+        ElementMirror.prototype.setIsVisible = function (bool) {
+            if (bool) {
+                if (!this.isVisible) {
+                    if (this.mirrorEl) {
+                        this.mirrorEl.style.display = '';
+                    }
+                    this.isVisible = bool; // needs to happen before updateElPosition
+                    this.updateElPosition(); // because was not updating the position while invisible
+                }
+            }
+            else {
+                if (this.isVisible) {
+                    if (this.mirrorEl) {
+                        this.mirrorEl.style.display = 'none';
+                    }
+                    this.isVisible = bool;
+                }
+            }
+        };
+        // always async
+        ElementMirror.prototype.stop = function (needsRevertAnimation, callback) {
+            var _this = this;
+            var done = function () {
+                _this.cleanup();
+                callback();
+            };
+            if (needsRevertAnimation &&
+                this.mirrorEl &&
+                this.isVisible &&
+                this.revertDuration && // if 0, transition won't work
+                (this.deltaX || this.deltaY) // if same coords, transition won't work
+            ) {
+                this.doRevertAnimation(done, this.revertDuration);
+            }
+            else {
+                setTimeout(done, 0);
+            }
+        };
+        ElementMirror.prototype.doRevertAnimation = function (callback, revertDuration) {
+            var mirrorEl = this.mirrorEl;
+            var finalSourceElRect = this.sourceEl.getBoundingClientRect(); // because autoscrolling might have happened
+            mirrorEl.style.transition =
+                'top ' + revertDuration + 'ms,' +
+                    'left ' + revertDuration + 'ms';
+            applyStyle(mirrorEl, {
+                left: finalSourceElRect.left,
+                top: finalSourceElRect.top
+            });
+            whenTransitionDone(mirrorEl, function () {
+                mirrorEl.style.transition = '';
+                callback();
+            });
+        };
+        ElementMirror.prototype.cleanup = function () {
+            if (this.mirrorEl) {
+                removeElement(this.mirrorEl);
+                this.mirrorEl = null;
+            }
+            this.sourceEl = null;
+        };
+        ElementMirror.prototype.updateElPosition = function () {
+            if (this.sourceEl && this.isVisible) {
+                applyStyle(this.getMirrorEl(), {
+                    left: this.sourceElRect.left + this.deltaX,
+                    top: this.sourceElRect.top + this.deltaY
+                });
+            }
+        };
+        ElementMirror.prototype.getMirrorEl = function () {
+            var sourceElRect = this.sourceElRect;
+            var mirrorEl = this.mirrorEl;
+            if (!mirrorEl) {
+                mirrorEl = this.mirrorEl = this.sourceEl.cloneNode(true); // cloneChildren=true
+                // we don't want long taps or any mouse interaction causing selection/menus.
+                // would use preventSelection(), but that prevents selectstart, causing problems.
+                mirrorEl.classList.add('fc-unselectable');
+                mirrorEl.classList.add('fc-event-dragging');
+                applyStyle(mirrorEl, {
+                    position: 'fixed',
+                    zIndex: this.zIndex,
+                    visibility: '',
+                    boxSizing: 'border-box',
+                    width: sourceElRect.right - sourceElRect.left,
+                    height: sourceElRect.bottom - sourceElRect.top,
+                    right: 'auto',
+                    bottom: 'auto',
+                    margin: 0
+                });
+                this.parentNode.appendChild(mirrorEl);
+            }
+            return mirrorEl;
+        };
+        return ElementMirror;
+    }());
+
+    /*
+    Is a cache for a given element's scroll information (all the info that ScrollController stores)
+    in addition the "client rectangle" of the element.. the area within the scrollbars.
+
+    The cache can be in one of two modes:
+    - doesListening:false - ignores when the container is scrolled by someone else
+    - doesListening:true - watch for scrolling and update the cache
+    */
+    var ScrollGeomCache = /** @class */ (function (_super) {
+        __extends(ScrollGeomCache, _super);
+        function ScrollGeomCache(scrollController, doesListening) {
+            var _this = _super.call(this) || this;
+            _this.handleScroll = function () {
+                _this.scrollTop = _this.scrollController.getScrollTop();
+                _this.scrollLeft = _this.scrollController.getScrollLeft();
+                _this.handleScrollChange();
+            };
+            _this.scrollController = scrollController;
+            _this.doesListening = doesListening;
+            _this.scrollTop = _this.origScrollTop = scrollController.getScrollTop();
+            _this.scrollLeft = _this.origScrollLeft = scrollController.getScrollLeft();
+            _this.scrollWidth = scrollController.getScrollWidth();
+            _this.scrollHeight = scrollController.getScrollHeight();
+            _this.clientWidth = scrollController.getClientWidth();
+            _this.clientHeight = scrollController.getClientHeight();
+            _this.clientRect = _this.computeClientRect(); // do last in case it needs cached values
+            if (_this.doesListening) {
+                _this.getEventTarget().addEventListener('scroll', _this.handleScroll);
+            }
+            return _this;
+        }
+        ScrollGeomCache.prototype.destroy = function () {
+            if (this.doesListening) {
+                this.getEventTarget().removeEventListener('scroll', this.handleScroll);
+            }
+        };
+        ScrollGeomCache.prototype.getScrollTop = function () {
+            return this.scrollTop;
+        };
+        ScrollGeomCache.prototype.getScrollLeft = function () {
+            return this.scrollLeft;
+        };
+        ScrollGeomCache.prototype.setScrollTop = function (top) {
+            this.scrollController.setScrollTop(top);
+            if (!this.doesListening) {
+                // we are not relying on the element to normalize out-of-bounds scroll values
+                // so we need to sanitize ourselves
+                this.scrollTop = Math.max(Math.min(top, this.getMaxScrollTop()), 0);
+                this.handleScrollChange();
+            }
+        };
+        ScrollGeomCache.prototype.setScrollLeft = function (top) {
+            this.scrollController.setScrollLeft(top);
+            if (!this.doesListening) {
+                // we are not relying on the element to normalize out-of-bounds scroll values
+                // so we need to sanitize ourselves
+                this.scrollLeft = Math.max(Math.min(top, this.getMaxScrollLeft()), 0);
+                this.handleScrollChange();
+            }
+        };
+        ScrollGeomCache.prototype.getClientWidth = function () {
+            return this.clientWidth;
+        };
+        ScrollGeomCache.prototype.getClientHeight = function () {
+            return this.clientHeight;
+        };
+        ScrollGeomCache.prototype.getScrollWidth = function () {
+            return this.scrollWidth;
+        };
+        ScrollGeomCache.prototype.getScrollHeight = function () {
+            return this.scrollHeight;
+        };
+        ScrollGeomCache.prototype.handleScrollChange = function () {
+        };
+        return ScrollGeomCache;
+    }(ScrollController));
+    var ElementScrollGeomCache = /** @class */ (function (_super) {
+        __extends(ElementScrollGeomCache, _super);
+        function ElementScrollGeomCache(el, doesListening) {
+            return _super.call(this, new ElementScrollController(el), doesListening) || this;
+        }
+        ElementScrollGeomCache.prototype.getEventTarget = function () {
+            return this.scrollController.el;
+        };
+        ElementScrollGeomCache.prototype.computeClientRect = function () {
+            return computeInnerRect(this.scrollController.el);
+        };
+        return ElementScrollGeomCache;
+    }(ScrollGeomCache));
+    var WindowScrollGeomCache = /** @class */ (function (_super) {
+        __extends(WindowScrollGeomCache, _super);
+        function WindowScrollGeomCache(doesListening) {
+            return _super.call(this, new WindowScrollController(), doesListening) || this;
+        }
+        WindowScrollGeomCache.prototype.getEventTarget = function () {
+            return window;
+        };
+        WindowScrollGeomCache.prototype.computeClientRect = function () {
+            return {
+                left: this.scrollLeft,
+                right: this.scrollLeft + this.clientWidth,
+                top: this.scrollTop,
+                bottom: this.scrollTop + this.clientHeight
+            };
+        };
+        // the window is the only scroll object that changes it's rectangle relative
+        // to the document's topleft as it scrolls
+        WindowScrollGeomCache.prototype.handleScrollChange = function () {
+            this.clientRect = this.computeClientRect();
+        };
+        return WindowScrollGeomCache;
+    }(ScrollGeomCache));
+
+    // If available we are using native "performance" API instead of "Date"
+    // Read more about it on MDN:
+    // https://developer.mozilla.org/en-US/docs/Web/API/Performance
+    var getTime = typeof performance === 'function' ? performance.now : Date.now;
+    /*
+    For a pointer interaction, automatically scrolls certain scroll containers when the pointer
+    approaches the edge.
+
+    The caller must call start + handleMove + stop.
+    */
+    var AutoScroller = /** @class */ (function () {
+        function AutoScroller() {
+            var _this = this;
+            // options that can be set by caller
+            this.isEnabled = true;
+            this.scrollQuery = [window, '.fc-scroller'];
+            this.edgeThreshold = 50; // pixels
+            this.maxVelocity = 300; // pixels per second
+            // internal state
+            this.pointerScreenX = null;
+            this.pointerScreenY = null;
+            this.isAnimating = false;
+            this.scrollCaches = null;
+            // protect against the initial pointerdown being too close to an edge and starting the scroll
+            this.everMovedUp = false;
+            this.everMovedDown = false;
+            this.everMovedLeft = false;
+            this.everMovedRight = false;
+            this.animate = function () {
+                if (_this.isAnimating) { // wasn't cancelled between animation calls
+                    var edge = _this.computeBestEdge(_this.pointerScreenX + window.pageXOffset, _this.pointerScreenY + window.pageYOffset);
+                    if (edge) {
+                        var now = getTime();
+                        _this.handleSide(edge, (now - _this.msSinceRequest) / 1000);
+                        _this.requestAnimation(now);
+                    }
+                    else {
+                        _this.isAnimating = false; // will stop animation
+                    }
+                }
+            };
+        }
+        AutoScroller.prototype.start = function (pageX, pageY) {
+            if (this.isEnabled) {
+                this.scrollCaches = this.buildCaches();
+                this.pointerScreenX = null;
+                this.pointerScreenY = null;
+                this.everMovedUp = false;
+                this.everMovedDown = false;
+                this.everMovedLeft = false;
+                this.everMovedRight = false;
+                this.handleMove(pageX, pageY);
+            }
+        };
+        AutoScroller.prototype.handleMove = function (pageX, pageY) {
+            if (this.isEnabled) {
+                var pointerScreenX = pageX - window.pageXOffset;
+                var pointerScreenY = pageY - window.pageYOffset;
+                var yDelta = this.pointerScreenY === null ? 0 : pointerScreenY - this.pointerScreenY;
+                var xDelta = this.pointerScreenX === null ? 0 : pointerScreenX - this.pointerScreenX;
+                if (yDelta < 0) {
+                    this.everMovedUp = true;
+                }
+                else if (yDelta > 0) {
+                    this.everMovedDown = true;
+                }
+                if (xDelta < 0) {
+                    this.everMovedLeft = true;
+                }
+                else if (xDelta > 0) {
+                    this.everMovedRight = true;
+                }
+                this.pointerScreenX = pointerScreenX;
+                this.pointerScreenY = pointerScreenY;
+                if (!this.isAnimating) {
+                    this.isAnimating = true;
+                    this.requestAnimation(getTime());
+                }
+            }
+        };
+        AutoScroller.prototype.stop = function () {
+            if (this.isEnabled) {
+                this.isAnimating = false; // will stop animation
+                for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) {
+                    var scrollCache = _a[_i];
+                    scrollCache.destroy();
+                }
+                this.scrollCaches = null;
+            }
+        };
+        AutoScroller.prototype.requestAnimation = function (now) {
+            this.msSinceRequest = now;
+            requestAnimationFrame(this.animate);
+        };
+        AutoScroller.prototype.handleSide = function (edge, seconds) {
+            var scrollCache = edge.scrollCache;
+            var edgeThreshold = this.edgeThreshold;
+            var invDistance = edgeThreshold - edge.distance;
+            var velocity = // the closer to the edge, the faster we scroll
+             (invDistance * invDistance) / (edgeThreshold * edgeThreshold) * // quadratic
+                this.maxVelocity * seconds;
+            var sign = 1;
+            switch (edge.name) {
+                case 'left':
+                    sign = -1;
+                // falls through
+                case 'right':
+                    scrollCache.setScrollLeft(scrollCache.getScrollLeft() + velocity * sign);
+                    break;
+                case 'top':
+                    sign = -1;
+                // falls through
+                case 'bottom':
+                    scrollCache.setScrollTop(scrollCache.getScrollTop() + velocity * sign);
+                    break;
+            }
+        };
+        // left/top are relative to document topleft
+        AutoScroller.prototype.computeBestEdge = function (left, top) {
+            var edgeThreshold = this.edgeThreshold;
+            var bestSide = null;
+            for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) {
+                var scrollCache = _a[_i];
+                var rect = scrollCache.clientRect;
+                var leftDist = left - rect.left;
+                var rightDist = rect.right - left;
+                var topDist = top - rect.top;
+                var bottomDist = rect.bottom - top;
+                // completely within the rect?
+                if (leftDist >= 0 && rightDist >= 0 && topDist >= 0 && bottomDist >= 0) {
+                    if (topDist <= edgeThreshold && this.everMovedUp && scrollCache.canScrollUp() &&
+                        (!bestSide || bestSide.distance > topDist)) {
+                        bestSide = { scrollCache: scrollCache, name: 'top', distance: topDist };
+                    }
+                    if (bottomDist <= edgeThreshold && this.everMovedDown && scrollCache.canScrollDown() &&
+                        (!bestSide || bestSide.distance > bottomDist)) {
+                        bestSide = { scrollCache: scrollCache, name: 'bottom', distance: bottomDist };
+                    }
+                    if (leftDist <= edgeThreshold && this.everMovedLeft && scrollCache.canScrollLeft() &&
+                        (!bestSide || bestSide.distance > leftDist)) {
+                        bestSide = { scrollCache: scrollCache, name: 'left', distance: leftDist };
+                    }
+                    if (rightDist <= edgeThreshold && this.everMovedRight && scrollCache.canScrollRight() &&
+                        (!bestSide || bestSide.distance > rightDist)) {
+                        bestSide = { scrollCache: scrollCache, name: 'right', distance: rightDist };
+                    }
+                }
+            }
+            return bestSide;
+        };
+        AutoScroller.prototype.buildCaches = function () {
+            return this.queryScrollEls().map(function (el) {
+                if (el === window) {
+                    return new WindowScrollGeomCache(false); // false = don't listen to user-generated scrolls
+                }
+                else {
+                    return new ElementScrollGeomCache(el, false); // false = don't listen to user-generated scrolls
+                }
+            });
+        };
+        AutoScroller.prototype.queryScrollEls = function () {
+            var els = [];
+            for (var _i = 0, _a = this.scrollQuery; _i < _a.length; _i++) {
+                var query = _a[_i];
+                if (typeof query === 'object') {
+                    els.push(query);
+                }
+                else {
+                    els.push.apply(els, Array.prototype.slice.call(document.querySelectorAll(query)));
+                }
+            }
+            return els;
+        };
+        return AutoScroller;
+    }());
+
+    /*
+    Monitors dragging on an element. Has a number of high-level features:
+    - minimum distance required before dragging
+    - minimum wait time ("delay") before dragging
+    - a mirror element that follows the pointer
+    */
+    var FeaturefulElementDragging = /** @class */ (function (_super) {
+        __extends(FeaturefulElementDragging, _super);
+        function FeaturefulElementDragging(containerEl, selector) {
+            var _this = _super.call(this, containerEl) || this;
+            // options that can be directly set by caller
+            // the caller can also set the PointerDragging's options as well
+            _this.delay = null;
+            _this.minDistance = 0;
+            _this.touchScrollAllowed = true; // prevents drag from starting and blocks scrolling during drag
+            _this.mirrorNeedsRevert = false;
+            _this.isInteracting = false; // is the user validly moving the pointer? lasts until pointerup
+            _this.isDragging = false; // is it INTENTFULLY dragging? lasts until after revert animation
+            _this.isDelayEnded = false;
+            _this.isDistanceSurpassed = false;
+            _this.delayTimeoutId = null;
+            _this.onPointerDown = function (ev) {
+                if (!_this.isDragging) { // so new drag doesn't happen while revert animation is going
+                    _this.isInteracting = true;
+                    _this.isDelayEnded = false;
+                    _this.isDistanceSurpassed = false;
+                    preventSelection(document.body);
+                    preventContextMenu(document.body);
+                    // prevent links from being visited if there's an eventual drag.
+                    // also prevents selection in older browsers (maybe?).
+                    // not necessary for touch, besides, browser would complain about passiveness.
+                    if (!ev.isTouch) {
+                        ev.origEvent.preventDefault();
+                    }
+                    _this.emitter.trigger('pointerdown', ev);
+                    if (_this.isInteracting && // not destroyed via pointerdown handler
+                        !_this.pointer.shouldIgnoreMove) {
+                        // actions related to initiating dragstart+dragmove+dragend...
+                        _this.mirror.setIsVisible(false); // reset. caller must set-visible
+                        _this.mirror.start(ev.subjectEl, ev.pageX, ev.pageY); // must happen on first pointer down
+                        _this.startDelay(ev);
+                        if (!_this.minDistance) {
+                            _this.handleDistanceSurpassed(ev);
+                        }
+                    }
+                }
+            };
+            _this.onPointerMove = function (ev) {
+                if (_this.isInteracting) {
+                    _this.emitter.trigger('pointermove', ev);
+                    if (!_this.isDistanceSurpassed) {
+                        var minDistance = _this.minDistance;
+                        var distanceSq = void 0; // current distance from the origin, squared
+                        var deltaX = ev.deltaX, deltaY = ev.deltaY;
+                        distanceSq = deltaX * deltaX + deltaY * deltaY;
+                        if (distanceSq >= minDistance * minDistance) { // use pythagorean theorem
+                            _this.handleDistanceSurpassed(ev);
+                        }
+                    }
+                    if (_this.isDragging) {
+                        // a real pointer move? (not one simulated by scrolling)
+                        if (ev.origEvent.type !== 'scroll') {
+                            _this.mirror.handleMove(ev.pageX, ev.pageY);
+                            _this.autoScroller.handleMove(ev.pageX, ev.pageY);
+                        }
+                        _this.emitter.trigger('dragmove', ev);
+                    }
+                }
+            };
+            _this.onPointerUp = function (ev) {
+                if (_this.isInteracting) {
+                    _this.isInteracting = false;
+                    allowSelection(document.body);
+                    allowContextMenu(document.body);
+                    _this.emitter.trigger('pointerup', ev); // can potentially set mirrorNeedsRevert
+                    if (_this.isDragging) {
+                        _this.autoScroller.stop();
+                        _this.tryStopDrag(ev); // which will stop the mirror
+                    }
+                    if (_this.delayTimeoutId) {
+                        clearTimeout(_this.delayTimeoutId);
+                        _this.delayTimeoutId = null;
+                    }
+                }
+            };
+            var pointer = _this.pointer = new PointerDragging(containerEl);
+            pointer.emitter.on('pointerdown', _this.onPointerDown);
+            pointer.emitter.on('pointermove', _this.onPointerMove);
+            pointer.emitter.on('pointerup', _this.onPointerUp);
+            if (selector) {
+                pointer.selector = selector;
+            }
+            _this.mirror = new ElementMirror();
+            _this.autoScroller = new AutoScroller();
+            return _this;
+        }
+        FeaturefulElementDragging.prototype.destroy = function () {
+            this.pointer.destroy();
+            // HACK: simulate a pointer-up to end the current drag
+            // TODO: fire 'dragend' directly and stop interaction. discourage use of pointerup event (b/c might not fire)
+            this.onPointerUp({});
+        };
+        FeaturefulElementDragging.prototype.startDelay = function (ev) {
+            var _this = this;
+            if (typeof this.delay === 'number') {
+                this.delayTimeoutId = setTimeout(function () {
+                    _this.delayTimeoutId = null;
+                    _this.handleDelayEnd(ev);
+                }, this.delay); // not assignable to number!
+            }
+            else {
+                this.handleDelayEnd(ev);
+            }
+        };
+        FeaturefulElementDragging.prototype.handleDelayEnd = function (ev) {
+            this.isDelayEnded = true;
+            this.tryStartDrag(ev);
+        };
+        FeaturefulElementDragging.prototype.handleDistanceSurpassed = function (ev) {
+            this.isDistanceSurpassed = true;
+            this.tryStartDrag(ev);
+        };
+        FeaturefulElementDragging.prototype.tryStartDrag = function (ev) {
+            if (this.isDelayEnded && this.isDistanceSurpassed) {
+                if (!this.pointer.wasTouchScroll || this.touchScrollAllowed) {
+                    this.isDragging = true;
+                    this.mirrorNeedsRevert = false;
+                    this.autoScroller.start(ev.pageX, ev.pageY);
+                    this.emitter.trigger('dragstart', ev);
+                    if (this.touchScrollAllowed === false) {
+                        this.pointer.cancelTouchScroll();
+                    }
+                }
+            }
+        };
+        FeaturefulElementDragging.prototype.tryStopDrag = function (ev) {
+            // .stop() is ALWAYS asynchronous, which we NEED because we want all pointerup events
+            // that come from the document to fire beforehand. much more convenient this way.
+            this.mirror.stop(this.mirrorNeedsRevert, this.stopDrag.bind(this, ev) // bound with args
+            );
+        };
+        FeaturefulElementDragging.prototype.stopDrag = function (ev) {
+            this.isDragging = false;
+            this.emitter.trigger('dragend', ev);
+        };
+        // fill in the implementations...
+        FeaturefulElementDragging.prototype.setIgnoreMove = function (bool) {
+            this.pointer.shouldIgnoreMove = bool;
+        };
+        FeaturefulElementDragging.prototype.setMirrorIsVisible = function (bool) {
+            this.mirror.setIsVisible(bool);
+        };
+        FeaturefulElementDragging.prototype.setMirrorNeedsRevert = function (bool) {
+            this.mirrorNeedsRevert = bool;
+        };
+        FeaturefulElementDragging.prototype.setAutoScrollEnabled = function (bool) {
+            this.autoScroller.isEnabled = bool;
+        };
+        return FeaturefulElementDragging;
+    }(ElementDragging));
+
+    /*
+    When this class is instantiated, it records the offset of an element (relative to the document topleft),
+    and continues to monitor scrolling, updating the cached coordinates if it needs to.
+    Does not access the DOM after instantiation, so highly performant.
+
+    Also keeps track of all scrolling/overflow:hidden containers that are parents of the given element
+    and an determine if a given point is inside the combined clipping rectangle.
+    */
+    var OffsetTracker = /** @class */ (function () {
+        function OffsetTracker(el) {
+            this.origRect = computeRect(el);
+            // will work fine for divs that have overflow:hidden
+            this.scrollCaches = getClippingParents(el).map(function (el) {
+                return new ElementScrollGeomCache(el, true); // listen=true
+            });
+        }
+        OffsetTracker.prototype.destroy = function () {
+            for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) {
+                var scrollCache = _a[_i];
+                scrollCache.destroy();
+            }
+        };
+        OffsetTracker.prototype.computeLeft = function () {
+            var left = this.origRect.left;
+            for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) {
+                var scrollCache = _a[_i];
+                left += scrollCache.origScrollLeft - scrollCache.getScrollLeft();
+            }
+            return left;
+        };
+        OffsetTracker.prototype.computeTop = function () {
+            var top = this.origRect.top;
+            for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) {
+                var scrollCache = _a[_i];
+                top += scrollCache.origScrollTop - scrollCache.getScrollTop();
+            }
+            return top;
+        };
+        OffsetTracker.prototype.isWithinClipping = function (pageX, pageY) {
+            var point = { left: pageX, top: pageY };
+            for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) {
+                var scrollCache = _a[_i];
+                if (!isIgnoredClipping(scrollCache.getEventTarget()) &&
+                    !pointInsideRect(point, scrollCache.clientRect)) {
+                    return false;
+                }
+            }
+            return true;
+        };
+        return OffsetTracker;
+    }());
+    // certain clipping containers should never constrain interactions, like <html> and <body>
+    // https://github.com/fullcalendar/fullcalendar/issues/3615
+    function isIgnoredClipping(node) {
+        var tagName = node.tagName;
+        return tagName === 'HTML' || tagName === 'BODY';
+    }
+
+    /*
+    Tracks movement over multiple droppable areas (aka "hits")
+    that exist in one or more DateComponents.
+    Relies on an existing draggable.
+
+    emits:
+    - pointerdown
+    - dragstart
+    - hitchange - fires initially, even if not over a hit
+    - pointerup
+    - (hitchange - again, to null, if ended over a hit)
+    - dragend
+    */
+    var HitDragging = /** @class */ (function () {
+        function HitDragging(dragging, droppableStore) {
+            var _this = this;
+            // options that can be set by caller
+            this.useSubjectCenter = false;
+            this.requireInitial = true; // if doesn't start out on a hit, won't emit any events
+            this.initialHit = null;
+            this.movingHit = null;
+            this.finalHit = null; // won't ever be populated if shouldIgnoreMove
+            this.handlePointerDown = function (ev) {
+                var dragging = _this.dragging;
+                _this.initialHit = null;
+                _this.movingHit = null;
+                _this.finalHit = null;
+                _this.prepareHits();
+                _this.processFirstCoord(ev);
+                if (_this.initialHit || !_this.requireInitial) {
+                    dragging.setIgnoreMove(false);
+                    _this.emitter.trigger('pointerdown', ev); // TODO: fire this before computing processFirstCoord, so listeners can cancel. this gets fired by almost every handler :(
+                }
+                else {
+                    dragging.setIgnoreMove(true);
+                }
+            };
+            this.handleDragStart = function (ev) {
+                _this.emitter.trigger('dragstart', ev);
+                _this.handleMove(ev, true); // force = fire even if initially null
+            };
+            this.handleDragMove = function (ev) {
+                _this.emitter.trigger('dragmove', ev);
+                _this.handleMove(ev);
+            };
+            this.handlePointerUp = function (ev) {
+                _this.releaseHits();
+                _this.emitter.trigger('pointerup', ev);
+            };
+            this.handleDragEnd = function (ev) {
+                if (_this.movingHit) {
+                    _this.emitter.trigger('hitupdate', null, true, ev);
+                }
+                _this.finalHit = _this.movingHit;
+                _this.movingHit = null;
+                _this.emitter.trigger('dragend', ev);
+            };
+            this.droppableStore = droppableStore;
+            dragging.emitter.on('pointerdown', this.handlePointerDown);
+            dragging.emitter.on('dragstart', this.handleDragStart);
+            dragging.emitter.on('dragmove', this.handleDragMove);
+            dragging.emitter.on('pointerup', this.handlePointerUp);
+            dragging.emitter.on('dragend', this.handleDragEnd);
+            this.dragging = dragging;
+            this.emitter = new Emitter();
+        }
+        // sets initialHit
+        // sets coordAdjust
+        HitDragging.prototype.processFirstCoord = function (ev) {
+            var origPoint = { left: ev.pageX, top: ev.pageY };
+            var adjustedPoint = origPoint;
+            var subjectEl = ev.subjectEl;
+            var subjectRect;
+            if (subjectEl !== document) {
+                subjectRect = computeRect(subjectEl);
+                adjustedPoint = constrainPoint(adjustedPoint, subjectRect);
+            }
+            var initialHit = this.initialHit = this.queryHitForOffset(adjustedPoint.left, adjustedPoint.top);
+            if (initialHit) {
+                if (this.useSubjectCenter && subjectRect) {
+                    var slicedSubjectRect = intersectRects(subjectRect, initialHit.rect);
+                    if (slicedSubjectRect) {
+                        adjustedPoint = getRectCenter(slicedSubjectRect);
+                    }
+                }
+                this.coordAdjust = diffPoints(adjustedPoint, origPoint);
+            }
+            else {
+                this.coordAdjust = { left: 0, top: 0 };
+            }
+        };
+        HitDragging.prototype.handleMove = function (ev, forceHandle) {
+            var hit = this.queryHitForOffset(ev.pageX + this.coordAdjust.left, ev.pageY + this.coordAdjust.top);
+            if (forceHandle || !isHitsEqual(this.movingHit, hit)) {
+                this.movingHit = hit;
+                this.emitter.trigger('hitupdate', hit, false, ev);
+            }
+        };
+        HitDragging.prototype.prepareHits = function () {
+            this.offsetTrackers = mapHash(this.droppableStore, function (interactionSettings) {
+                interactionSettings.component.prepareHits();
+                return new OffsetTracker(interactionSettings.el);
+            });
+        };
+        HitDragging.prototype.releaseHits = function () {
+            var offsetTrackers = this.offsetTrackers;
+            for (var id in offsetTrackers) {
+                offsetTrackers[id].destroy();
+            }
+            this.offsetTrackers = {};
+        };
+        HitDragging.prototype.queryHitForOffset = function (offsetLeft, offsetTop) {
+            var _a = this, droppableStore = _a.droppableStore, offsetTrackers = _a.offsetTrackers;
+            var bestHit = null;
+            for (var id in droppableStore) {
+                var component = droppableStore[id].component;
+                var offsetTracker = offsetTrackers[id];
+                if (offsetTracker && // wasn't destroyed mid-drag
+                    offsetTracker.isWithinClipping(offsetLeft, offsetTop)) {
+                    var originLeft = offsetTracker.computeLeft();
+                    var originTop = offsetTracker.computeTop();
+                    var positionLeft = offsetLeft - originLeft;
+                    var positionTop = offsetTop - originTop;
+                    var origRect = offsetTracker.origRect;
+                    var width = origRect.right - origRect.left;
+                    var height = origRect.bottom - origRect.top;
+                    if (
+                    // must be within the element's bounds
+                    positionLeft >= 0 && positionLeft < width &&
+                        positionTop >= 0 && positionTop < height) {
+                        var hit = component.queryHit(positionLeft, positionTop, width, height);
+                        var dateProfile = component.context.getCurrentData().dateProfile;
+                        if (hit &&
+                            (
+                            // make sure the hit is within activeRange, meaning it's not a deal cell
+                            rangeContainsRange(dateProfile.activeRange, hit.dateSpan.range)) &&
+                            (!bestHit || hit.layer > bestHit.layer)) {
+                            // TODO: better way to re-orient rectangle
+                            hit.rect.left += originLeft;
+                            hit.rect.right += originLeft;
+                            hit.rect.top += originTop;
+                            hit.rect.bottom += originTop;
+                            bestHit = hit;
+                        }
+                    }
+                }
+            }
+            return bestHit;
+        };
+        return HitDragging;
+    }());
+    function isHitsEqual(hit0, hit1) {
+        if (!hit0 && !hit1) {
+            return true;
+        }
+        if (Boolean(hit0) !== Boolean(hit1)) {
+            return false;
+        }
+        return isDateSpansEqual(hit0.dateSpan, hit1.dateSpan);
+    }
+
+    function buildDatePointApiWithContext(dateSpan, context) {
+        var props = {};
+        for (var _i = 0, _a = context.pluginHooks.datePointTransforms; _i < _a.length; _i++) {
+            var transform = _a[_i];
+            __assign(props, transform(dateSpan, context));
+        }
+        __assign(props, buildDatePointApi(dateSpan, context.dateEnv));
+        return props;
+    }
+    function buildDatePointApi(span, dateEnv) {
+        return {
+            date: dateEnv.toDate(span.range.start),
+            dateStr: dateEnv.formatIso(span.range.start, { omitTime: span.allDay }),
+            allDay: span.allDay
+        };
+    }
+
+    /*
+    Monitors when the user clicks on a specific date/time of a component.
+    A pointerdown+pointerup on the same "hit" constitutes a click.
+    */
+    var DateClicking = /** @class */ (function (_super) {
+        __extends(DateClicking, _super);
+        function DateClicking(settings) {
+            var _this = _super.call(this, settings) || this;
+            _this.handlePointerDown = function (ev) {
+                var dragging = _this.dragging;
+                // do this in pointerdown (not dragend) because DOM might be mutated by the time dragend is fired
+                dragging.setIgnoreMove(!_this.component.isValidDateDownEl(dragging.pointer.downEl));
+            };
+            // won't even fire if moving was ignored
+            _this.handleDragEnd = function (ev) {
+                var component = _this.component;
+                var pointer = _this.dragging.pointer;
+                if (!pointer.wasTouchScroll) {
+                    var _a = _this.hitDragging, initialHit = _a.initialHit, finalHit = _a.finalHit;
+                    if (initialHit && finalHit && isHitsEqual(initialHit, finalHit)) {
+                        var context = component.context;
+                        var arg = __assign(__assign({}, buildDatePointApiWithContext(initialHit.dateSpan, context)), { dayEl: initialHit.dayEl, jsEvent: ev.origEvent, view: context.viewApi || context.calendarApi.view });
+                        context.emitter.trigger('dateClick', arg);
+                    }
+                }
+            };
+            // we DO want to watch pointer moves because otherwise finalHit won't get populated
+            _this.dragging = new FeaturefulElementDragging(settings.el);
+            _this.dragging.autoScroller.isEnabled = false;
+            var hitDragging = _this.hitDragging = new HitDragging(_this.dragging, interactionSettingsToStore(settings));
+            hitDragging.emitter.on('pointerdown', _this.handlePointerDown);
+            hitDragging.emitter.on('dragend', _this.handleDragEnd);
+            return _this;
+        }
+        DateClicking.prototype.destroy = function () {
+            this.dragging.destroy();
+        };
+        return DateClicking;
+    }(Interaction));
+
+    /*
+    Tracks when the user selects a portion of time of a component,
+    constituted by a drag over date cells, with a possible delay at the beginning of the drag.
+    */
+    var DateSelecting = /** @class */ (function (_super) {
+        __extends(DateSelecting, _super);
+        function DateSelecting(settings) {
+            var _this = _super.call(this, settings) || this;
+            _this.dragSelection = null;
+            _this.handlePointerDown = function (ev) {
+                var _a = _this, component = _a.component, dragging = _a.dragging;
+                var options = component.context.options;
+                var canSelect = options.selectable &&
+                    component.isValidDateDownEl(ev.origEvent.target);
+                // don't bother to watch expensive moves if component won't do selection
+                dragging.setIgnoreMove(!canSelect);
+                // if touch, require user to hold down
+                dragging.delay = ev.isTouch ? getComponentTouchDelay(component) : null;
+            };
+            _this.handleDragStart = function (ev) {
+                _this.component.context.calendarApi.unselect(ev); // unselect previous selections
+            };
+            _this.handleHitUpdate = function (hit, isFinal) {
+                var context = _this.component.context;
+                var dragSelection = null;
+                var isInvalid = false;
+                if (hit) {
+                    dragSelection = joinHitsIntoSelection(_this.hitDragging.initialHit, hit, context.pluginHooks.dateSelectionTransformers);
+                    if (!dragSelection || !_this.component.isDateSelectionValid(dragSelection)) {
+                        isInvalid = true;
+                        dragSelection = null;
+                    }
+                }
+                if (dragSelection) {
+                    context.dispatch({ type: 'SELECT_DATES', selection: dragSelection });
+                }
+                else if (!isFinal) { // only unselect if moved away while dragging
+                    context.dispatch({ type: 'UNSELECT_DATES' });
+                }
+                if (!isInvalid) {
+                    enableCursor();
+                }
+                else {
+                    disableCursor();
+                }
+                if (!isFinal) {
+                    _this.dragSelection = dragSelection; // only clear if moved away from all hits while dragging
+                }
+            };
+            _this.handlePointerUp = function (pev) {
+                if (_this.dragSelection) {
+                    // selection is already rendered, so just need to report selection
+                    triggerDateSelect(_this.dragSelection, pev, _this.component.context);
+                    _this.dragSelection = null;
+                }
+            };
+            var component = settings.component;
+            var options = component.context.options;
+            var dragging = _this.dragging = new FeaturefulElementDragging(settings.el);
+            dragging.touchScrollAllowed = false;
+            dragging.minDistance = options.selectMinDistance || 0;
+            dragging.autoScroller.isEnabled = options.dragScroll;
+            var hitDragging = _this.hitDragging = new HitDragging(_this.dragging, interactionSettingsToStore(settings));
+            hitDragging.emitter.on('pointerdown', _this.handlePointerDown);
+            hitDragging.emitter.on('dragstart', _this.handleDragStart);
+            hitDragging.emitter.on('hitupdate', _this.handleHitUpdate);
+            hitDragging.emitter.on('pointerup', _this.handlePointerUp);
+            return _this;
+        }
+        DateSelecting.prototype.destroy = function () {
+            this.dragging.destroy();
+        };
+        return DateSelecting;
+    }(Interaction));
+    function getComponentTouchDelay(component) {
+        var options = component.context.options;
+        var delay = options.selectLongPressDelay;
+        if (delay == null) {
+            delay = options.longPressDelay;
+        }
+        return delay;
+    }
+    function joinHitsIntoSelection(hit0, hit1, dateSelectionTransformers) {
+        var dateSpan0 = hit0.dateSpan;
+        var dateSpan1 = hit1.dateSpan;
+        var ms = [
+            dateSpan0.range.start,
+            dateSpan0.range.end,
+            dateSpan1.range.start,
+            dateSpan1.range.end
+        ];
+        ms.sort(compareNumbers);
+        var props = {};
+        for (var _i = 0, dateSelectionTransformers_1 = dateSelectionTransformers; _i < dateSelectionTransformers_1.length; _i++) {
+            var transformer = dateSelectionTransformers_1[_i];
+            var res = transformer(hit0, hit1);
+            if (res === false) {
+                return null;
+            }
+            else if (res) {
+                __assign(props, res);
+            }
+        }
+        props.range = { start: ms[0], end: ms[3] };
+        props.allDay = dateSpan0.allDay;
+        return props;
+    }
+
+    var EventDragging = /** @class */ (function (_super) {
+        __extends(EventDragging, _super);
+        function EventDragging(settings) {
+            var _this = _super.call(this, settings) || this;
+            // internal state
+            _this.subjectEl = null;
+            _this.subjectSeg = null; // the seg being selected/dragged
+            _this.isDragging = false;
+            _this.eventRange = null;
+            _this.relevantEvents = null; // the events being dragged
+            _this.receivingContext = null;
+            _this.validMutation = null;
+            _this.mutatedRelevantEvents = null;
+            _this.handlePointerDown = function (ev) {
+                var origTarget = ev.origEvent.target;
+                var _a = _this, component = _a.component, dragging = _a.dragging;
+                var mirror = dragging.mirror;
+                var options = component.context.options;
+                var initialContext = component.context;
+                _this.subjectEl = ev.subjectEl;
+                var subjectSeg = _this.subjectSeg = getElSeg(ev.subjectEl);
+                var eventRange = _this.eventRange = subjectSeg.eventRange;
+                var eventInstanceId = eventRange.instance.instanceId;
+                _this.relevantEvents = getRelevantEvents(initialContext.getCurrentData().eventStore, eventInstanceId);
+                dragging.minDistance = ev.isTouch ? 0 : options.eventDragMinDistance;
+                dragging.delay =
+                    // only do a touch delay if touch and this event hasn't been selected yet
+                    (ev.isTouch && eventInstanceId !== component.props.eventSelection) ?
+                        getComponentTouchDelay$1(component) :
+                        null;
+                mirror.parentNode = elementClosest(origTarget, '.fc');
+                mirror.revertDuration = options.dragRevertDuration;
+                var isValid = component.isValidSegDownEl(origTarget) &&
+                    !elementClosest(origTarget, '.fc-event-resizer'); // NOT on a resizer
+                dragging.setIgnoreMove(!isValid);
+                // disable dragging for elements that are resizable (ie, selectable)
+                // but are not draggable
+                _this.isDragging = isValid &&
+                    ev.subjectEl.classList.contains('fc-event-draggable');
+            };
+            _this.handleDragStart = function (ev) {
+                var initialContext = _this.component.context;
+                var eventRange = _this.eventRange;
+                var eventInstanceId = eventRange.instance.instanceId;
+                if (ev.isTouch) {
+                    // need to select a different event?
+                    if (eventInstanceId !== _this.component.props.eventSelection) {
+                        initialContext.dispatch({ type: 'SELECT_EVENT', eventInstanceId: eventInstanceId });
+                    }
+                }
+                else {
+                    // if now using mouse, but was previous touch interaction, clear selected event
+                    initialContext.dispatch({ type: 'UNSELECT_EVENT' });
+                }
+                if (_this.isDragging) {
+                    initialContext.calendarApi.unselect(ev); // unselect *date* selection
+                    initialContext.emitter.trigger('eventDragStart', {
+                        el: _this.subjectEl,
+                        event: new EventApi(initialContext, eventRange.def, eventRange.instance),
+                        jsEvent: ev.origEvent,
+                        view: initialContext.viewApi
+                    });
+                }
+            };
+            _this.handleHitUpdate = function (hit, isFinal) {
+                if (!_this.isDragging) {
+                    return;
+                }
+                var relevantEvents = _this.relevantEvents;
+                var initialHit = _this.hitDragging.initialHit;
+                var initialContext = _this.component.context;
+                // states based on new hit
+                var receivingContext = null;
+                var mutation = null;
+                var mutatedRelevantEvents = null;
+                var isInvalid = false;
+                var interaction = {
+                    affectedEvents: relevantEvents,
+                    mutatedEvents: createEmptyEventStore(),
+                    isEvent: true
+                };
+                if (hit) {
+                    var receivingComponent = hit.component;
+                    receivingContext = receivingComponent.context;
+                    var receivingOptions = receivingContext.options;
+                    if (initialContext === receivingContext ||
+                        receivingOptions.editable && receivingOptions.droppable) {
+                        mutation = computeEventMutation(initialHit, hit, receivingContext.getCurrentData().pluginHooks.eventDragMutationMassagers);
+                        if (mutation) {
+                            mutatedRelevantEvents = applyMutationToEventStore(relevantEvents, receivingContext.getCurrentData().eventUiBases, mutation, receivingContext);
+                            interaction.mutatedEvents = mutatedRelevantEvents;
+                            if (!receivingComponent.isInteractionValid(interaction)) {
+                                isInvalid = true;
+                                mutation = null;
+                                mutatedRelevantEvents = null;
+                                interaction.mutatedEvents = createEmptyEventStore();
+                            }
+                        }
+                    }
+                    else {
+                        receivingContext = null;
+                    }
+                }
+                _this.displayDrag(receivingContext, interaction);
+                if (!isInvalid) {
+                    enableCursor();
+                }
+                else {
+                    disableCursor();
+                }
+                if (!isFinal) {
+                    if (initialContext === receivingContext && // TODO: write test for this
+                        isHitsEqual(initialHit, hit)) {
+                        mutation = null;
+                    }
+                    _this.dragging.setMirrorNeedsRevert(!mutation);
+                    // render the mirror if no already-rendered mirror
+                    // TODO: wish we could somehow wait for dispatch to guarantee render
+                    _this.dragging.setMirrorIsVisible(!hit || !document.querySelector('.fc-event-mirror'));
+                    // assign states based on new hit
+                    _this.receivingContext = receivingContext;
+                    _this.validMutation = mutation;
+                    _this.mutatedRelevantEvents = mutatedRelevantEvents;
+                }
+            };
+            _this.handlePointerUp = function () {
+                if (!_this.isDragging) {
+                    _this.cleanup(); // because handleDragEnd won't fire
+                }
+            };
+            _this.handleDragEnd = function (ev) {
+                if (_this.isDragging) {
+                    var initialContext_1 = _this.component.context;
+                    var initialView = initialContext_1.viewApi;
+                    var _a = _this, receivingContext_1 = _a.receivingContext, validMutation = _a.validMutation;
+                    var eventDef = _this.eventRange.def;
+                    var eventInstance = _this.eventRange.instance;
+                    var eventApi = new EventApi(initialContext_1, eventDef, eventInstance);
+                    var relevantEvents_1 = _this.relevantEvents;
+                    var mutatedRelevantEvents_1 = _this.mutatedRelevantEvents;
+                    var finalHit = _this.hitDragging.finalHit;
+                    _this.clearDrag(); // must happen after revert animation
+                    initialContext_1.emitter.trigger('eventDragStop', {
+                        el: _this.subjectEl,
+                        event: eventApi,
+                        jsEvent: ev.origEvent,
+                        view: initialView
+                    });
+                    if (validMutation) {
+                        // dropped within same calendar
+                        if (receivingContext_1 === initialContext_1) {
+                            var updatedEventApi = new EventApi(initialContext_1, mutatedRelevantEvents_1.defs[eventDef.defId], eventInstance ? mutatedRelevantEvents_1.instances[eventInstance.instanceId] : null);
+                            initialContext_1.dispatch({
+                                type: 'MERGE_EVENTS',
+                                eventStore: mutatedRelevantEvents_1
+                            });
+                            var eventChangeArg = {
+                                oldEvent: eventApi,
+                                event: updatedEventApi,
+                                relatedEvents: buildEventApis(mutatedRelevantEvents_1, initialContext_1, eventInstance),
+                                revert: function () {
+                                    initialContext_1.dispatch({
+                                        type: 'MERGE_EVENTS',
+                                        eventStore: relevantEvents_1 // the pre-change data
+                                    });
+                                }
+                            };
+                            var transformed = {};
+                            for (var _i = 0, _b = initialContext_1.getCurrentData().pluginHooks.eventDropTransformers; _i < _b.length; _i++) {
+                                var transformer = _b[_i];
+                                __assign(transformed, transformer(validMutation, initialContext_1));
+                            }
+                            initialContext_1.emitter.trigger('eventDrop', __assign(__assign(__assign({}, eventChangeArg), transformed), { el: ev.subjectEl, delta: validMutation.datesDelta, jsEvent: ev.origEvent, view: initialView }));
+                            initialContext_1.emitter.trigger('eventChange', eventChangeArg);
+                            // dropped in different calendar
+                        }
+                        else if (receivingContext_1) {
+                            initialContext_1.emitter.trigger('eventLeave', {
+                                draggedEl: ev.subjectEl,
+                                event: eventApi,
+                                view: initialView
+                            });
+                            initialContext_1.dispatch({
+                                type: 'REMOVE_EVENTS',
+                                eventStore: relevantEvents_1
+                            });
+                            initialContext_1.emitter.trigger('eventRemove', {
+                                event: eventApi,
+                                relatedEvents: buildEventApis(relevantEvents_1, initialContext_1, eventInstance),
+                                revert: function () {
+                                    initialContext_1.dispatch({
+                                        type: 'MERGE_EVENTS',
+                                        eventStore: relevantEvents_1
+                                    });
+                                }
+                            });
+                            var addedEventDef = mutatedRelevantEvents_1.defs[eventDef.defId];
+                            var addedEventInstance = mutatedRelevantEvents_1.instances[eventInstance.instanceId];
+                            var addedEventApi = new EventApi(receivingContext_1, addedEventDef, addedEventInstance);
+                            receivingContext_1.dispatch({
+                                type: 'MERGE_EVENTS',
+                                eventStore: mutatedRelevantEvents_1
+                            });
+                            receivingContext_1.emitter.trigger('eventAdd', {
+                                event: addedEventApi,
+                                relatedEvents: buildEventApis(mutatedRelevantEvents_1, receivingContext_1, addedEventInstance),
+                                revert: function () {
+                                    receivingContext_1.dispatch({
+                                        type: 'REMOVE_EVENTS',
+                                        eventStore: mutatedRelevantEvents_1
+                                    });
+                                }
+                            });
+                            if (ev.isTouch) {
+                                receivingContext_1.dispatch({
+                                    type: 'SELECT_EVENT',
+                                    eventInstanceId: eventInstance.instanceId
+                                });
+                            }
+                            receivingContext_1.emitter.trigger('drop', __assign(__assign({}, buildDatePointApiWithContext(finalHit.dateSpan, receivingContext_1)), { draggedEl: ev.subjectEl, jsEvent: ev.origEvent, view: finalHit.component.context.viewApi }));
+                            receivingContext_1.emitter.trigger('eventReceive', {
+                                draggedEl: ev.subjectEl,
+                                event: addedEventApi,
+                                view: finalHit.component.context.viewApi
+                            });
+                        }
+                    }
+                    else {
+                        initialContext_1.emitter.trigger('_noEventDrop');
+                    }
+                }
+                _this.cleanup();
+            };
+            var component = _this.component;
+            var options = component.context.options;
+            var dragging = _this.dragging = new FeaturefulElementDragging(settings.el);
+            dragging.pointer.selector = EventDragging.SELECTOR;
+            dragging.touchScrollAllowed = false;
+            dragging.autoScroller.isEnabled = options.dragScroll;
+            var hitDragging = _this.hitDragging = new HitDragging(_this.dragging, interactionSettingsStore);
+            hitDragging.useSubjectCenter = settings.useEventCenter;
+            hitDragging.emitter.on('pointerdown', _this.handlePointerDown);
+            hitDragging.emitter.on('dragstart', _this.handleDragStart);
+            hitDragging.emitter.on('hitupdate', _this.handleHitUpdate);
+            hitDragging.emitter.on('pointerup', _this.handlePointerUp);
+            hitDragging.emitter.on('dragend', _this.handleDragEnd);
+            return _this;
+        }
+        EventDragging.prototype.destroy = function () {
+            this.dragging.destroy();
+        };
+        // render a drag state on the next receivingCalendar
+        EventDragging.prototype.displayDrag = function (nextContext, state) {
+            var initialContext = this.component.context;
+            var prevContext = this.receivingContext;
+            // does the previous calendar need to be cleared?
+            if (prevContext && prevContext !== nextContext) {
+                // does the initial calendar need to be cleared?
+                // if so, don't clear all the way. we still need to to hide the affectedEvents
+                if (prevContext === initialContext) {
+                    prevContext.dispatch({
+                        type: 'SET_EVENT_DRAG',
+                        state: {
+                            affectedEvents: state.affectedEvents,
+                            mutatedEvents: createEmptyEventStore(),
+                            isEvent: true
+                        }
+                    });
+                    // completely clear the old calendar if it wasn't the initial
+                }
+                else {
+                    prevContext.dispatch({ type: 'UNSET_EVENT_DRAG' });
+                }
+            }
+            if (nextContext) {
+                nextContext.dispatch({ type: 'SET_EVENT_DRAG', state: state });
+            }
+        };
+        EventDragging.prototype.clearDrag = function () {
+            var initialCalendar = this.component.context;
+            var receivingContext = this.receivingContext;
+            if (receivingContext) {
+                receivingContext.dispatch({ type: 'UNSET_EVENT_DRAG' });
+            }
+            // the initial calendar might have an dummy drag state from displayDrag
+            if (initialCalendar !== receivingContext) {
+                initialCalendar.dispatch({ type: 'UNSET_EVENT_DRAG' });
+            }
+        };
+        EventDragging.prototype.cleanup = function () {
+            this.subjectSeg = null;
+            this.isDragging = false;
+            this.eventRange = null;
+            this.relevantEvents = null;
+            this.receivingContext = null;
+            this.validMutation = null;
+            this.mutatedRelevantEvents = null;
+        };
+        // TODO: test this in IE11
+        // QUESTION: why do we need it on the resizable???
+        EventDragging.SELECTOR = '.fc-event-draggable, .fc-event-resizable';
+        return EventDragging;
+    }(Interaction));
+    function computeEventMutation(hit0, hit1, massagers) {
+        var dateSpan0 = hit0.dateSpan;
+        var dateSpan1 = hit1.dateSpan;
+        var date0 = dateSpan0.range.start;
+        var date1 = dateSpan1.range.start;
+        var standardProps = {};
+        if (dateSpan0.allDay !== dateSpan1.allDay) {
+            standardProps.allDay = dateSpan1.allDay;
+            standardProps.hasEnd = hit1.component.context.options.allDayMaintainDuration;
+            if (dateSpan1.allDay) {
+                // means date1 is already start-of-day,
+                // but date0 needs to be converted
+                date0 = startOfDay(date0);
+            }
+        }
+        var delta = diffDates(date0, date1, hit0.component.context.dateEnv, hit0.component === hit1.component ?
+            hit0.component.largeUnit :
+            null);
+        if (delta.milliseconds) { // has hours/minutes/seconds
+            standardProps.allDay = false;
+        }
+        var mutation = {
+            datesDelta: delta,
+            standardProps: standardProps
+        };
+        for (var _i = 0, massagers_1 = massagers; _i < massagers_1.length; _i++) {
+            var massager = massagers_1[_i];
+            massager(mutation, hit0, hit1);
+        }
+        return mutation;
+    }
+    function getComponentTouchDelay$1(component) {
+        var options = component.context.options;
+        var delay = options.eventLongPressDelay;
+        if (delay == null) {
+            delay = options.longPressDelay;
+        }
+        return delay;
+    }
+
+    var EventResizing = /** @class */ (function (_super) {
+        __extends(EventResizing, _super);
+        function EventResizing(settings) {
+            var _this = _super.call(this, settings) || this;
+            // internal state
+            _this.draggingSegEl = null;
+            _this.draggingSeg = null; // TODO: rename to resizingSeg? subjectSeg?
+            _this.eventRange = null;
+            _this.relevantEvents = null;
+            _this.validMutation = null;
+            _this.mutatedRelevantEvents = null;
+            _this.handlePointerDown = function (ev) {
+                var component = _this.component;
+                var segEl = _this.querySegEl(ev);
+                var seg = getElSeg(segEl);
+                var eventRange = _this.eventRange = seg.eventRange;
+                _this.dragging.minDistance = component.context.options.eventDragMinDistance;
+                // if touch, need to be working with a selected event
+                _this.dragging.setIgnoreMove(!_this.component.isValidSegDownEl(ev.origEvent.target) ||
+                    (ev.isTouch && _this.component.props.eventSelection !== eventRange.instance.instanceId));
+            };
+            _this.handleDragStart = function (ev) {
+                var context = _this.component.context;
+                var eventRange = _this.eventRange;
+                _this.relevantEvents = getRelevantEvents(context.getCurrentData().eventStore, _this.eventRange.instance.instanceId);
+                var segEl = _this.querySegEl(ev);
+                _this.draggingSegEl = segEl;
+                _this.draggingSeg = getElSeg(segEl);
+                context.calendarApi.unselect();
+                context.emitter.trigger('eventResizeStart', {
+                    el: segEl,
+                    event: new EventApi(context, eventRange.def, eventRange.instance),
+                    jsEvent: ev.origEvent,
+                    view: context.viewApi
+                });
+            };
+            _this.handleHitUpdate = function (hit, isFinal, ev) {
+                var context = _this.component.context;
+                var relevantEvents = _this.relevantEvents;
+                var initialHit = _this.hitDragging.initialHit;
+                var eventInstance = _this.eventRange.instance;
+                var mutation = null;
+                var mutatedRelevantEvents = null;
+                var isInvalid = false;
+                var interaction = {
+                    affectedEvents: relevantEvents,
+                    mutatedEvents: createEmptyEventStore(),
+                    isEvent: true
+                };
+                if (hit) {
+                    mutation = computeMutation(initialHit, hit, ev.subjectEl.classList.contains('fc-event-resizer-start'), eventInstance.range, context.pluginHooks.eventResizeJoinTransforms);
+                }
+                if (mutation) {
+                    mutatedRelevantEvents = applyMutationToEventStore(relevantEvents, context.getCurrentData().eventUiBases, mutation, context);
+                    interaction.mutatedEvents = mutatedRelevantEvents;
+                    if (!_this.component.isInteractionValid(interaction)) {
+                        isInvalid = true;
+                        mutation = null;
+                        mutatedRelevantEvents = null;
+                        interaction.mutatedEvents = null;
+                    }
+                }
+                if (mutatedRelevantEvents) {
+                    context.dispatch({
+                        type: 'SET_EVENT_RESIZE',
+                        state: interaction
+                    });
+                }
+                else {
+                    context.dispatch({ type: 'UNSET_EVENT_RESIZE' });
+                }
+                if (!isInvalid) {
+                    enableCursor();
+                }
+                else {
+                    disableCursor();
+                }
+                if (!isFinal) {
+                    if (mutation && isHitsEqual(initialHit, hit)) {
+                        mutation = null;
+                    }
+                    _this.validMutation = mutation;
+                    _this.mutatedRelevantEvents = mutatedRelevantEvents;
+                }
+            };
+            _this.handleDragEnd = function (ev) {
+                var context = _this.component.context;
+                var eventDef = _this.eventRange.def;
+                var eventInstance = _this.eventRange.instance;
+                var eventApi = new EventApi(context, eventDef, eventInstance);
+                var relevantEvents = _this.relevantEvents;
+                var mutatedRelevantEvents = _this.mutatedRelevantEvents;
+                context.emitter.trigger('eventResizeStop', {
+                    el: _this.draggingSegEl,
+                    event: eventApi,
+                    jsEvent: ev.origEvent,
+                    view: context.viewApi
+                });
+                if (_this.validMutation) {
+                    var updatedEventApi = new EventApi(context, mutatedRelevantEvents.defs[eventDef.defId], eventInstance ? mutatedRelevantEvents.instances[eventInstance.instanceId] : null);
+                    context.dispatch({
+                        type: 'MERGE_EVENTS',
+                        eventStore: mutatedRelevantEvents
+                    });
+                    var eventChangeArg = {
+                        oldEvent: eventApi,
+                        event: updatedEventApi,
+                        relatedEvents: buildEventApis(mutatedRelevantEvents, context, eventInstance),
+                        revert: function () {
+                            context.dispatch({
+                                type: 'MERGE_EVENTS',
+                                eventStore: relevantEvents // the pre-change events
+                            });
+                        }
+                    };
+                    context.emitter.trigger('eventResize', __assign(__assign({}, eventChangeArg), { el: _this.draggingSegEl, startDelta: _this.validMutation.startDelta || createDuration(0), endDelta: _this.validMutation.endDelta || createDuration(0), jsEvent: ev.origEvent, view: context.viewApi }));
+                    context.emitter.trigger('eventChange', eventChangeArg);
+                }
+                else {
+                    context.emitter.trigger('_noEventResize');
+                }
+                // reset all internal state
+                _this.draggingSeg = null;
+                _this.relevantEvents = null;
+                _this.validMutation = null;
+                // okay to keep eventInstance around. useful to set it in handlePointerDown
+            };
+            var component = settings.component;
+            var dragging = _this.dragging = new FeaturefulElementDragging(settings.el);
+            dragging.pointer.selector = '.fc-event-resizer';
+            dragging.touchScrollAllowed = false;
+            dragging.autoScroller.isEnabled = component.context.options.dragScroll;
+            var hitDragging = _this.hitDragging = new HitDragging(_this.dragging, interactionSettingsToStore(settings));
+            hitDragging.emitter.on('pointerdown', _this.handlePointerDown);
+            hitDragging.emitter.on('dragstart', _this.handleDragStart);
+            hitDragging.emitter.on('hitupdate', _this.handleHitUpdate);
+            hitDragging.emitter.on('dragend', _this.handleDragEnd);
+            return _this;
+        }
+        EventResizing.prototype.destroy = function () {
+            this.dragging.destroy();
+        };
+        EventResizing.prototype.querySegEl = function (ev) {
+            return elementClosest(ev.subjectEl, '.fc-event');
+        };
+        return EventResizing;
+    }(Interaction));
+    function computeMutation(hit0, hit1, isFromStart, instanceRange, transforms) {
+        var dateEnv = hit0.component.context.dateEnv;
+        var date0 = hit0.dateSpan.range.start;
+        var date1 = hit1.dateSpan.range.start;
+        var delta = diffDates(date0, date1, dateEnv, hit0.component.largeUnit);
+        var props = {};
+        for (var _i = 0, transforms_1 = transforms; _i < transforms_1.length; _i++) {
+            var transform = transforms_1[_i];
+            var res = transform(hit0, hit1);
+            if (res === false) {
+                return null;
+            }
+            else if (res) {
+                __assign(props, res);
+            }
+        }
+        if (isFromStart) {
+            if (dateEnv.add(instanceRange.start, delta) < instanceRange.end) {
+                props.startDelta = delta;
+                return props;
+            }
+        }
+        else {
+            if (dateEnv.add(instanceRange.end, delta) > instanceRange.start) {
+                props.endDelta = delta;
+                return props;
+            }
+        }
+        return null;
+    }
+
+    var UnselectAuto = /** @class */ (function () {
+        function UnselectAuto(context) {
+            var _this = this;
+            this.context = context;
+            this.isRecentPointerDateSelect = false; // wish we could use a selector to detect date selection, but uses hit system
+            this.onSelect = function (selectInfo) {
+                if (selectInfo.jsEvent) {
+                    _this.isRecentPointerDateSelect = true;
+                }
+            };
+            this.onDocumentPointerUp = function (pev) {
+                var context = _this.context;
+                var documentPointer = _this.documentPointer;
+                var calendarState = context.getCurrentData();
+                // touch-scrolling should never unfocus any type of selection
+                if (!documentPointer.wasTouchScroll) {
+                    if (calendarState.dateSelection && // an existing date selection?
+                        !_this.isRecentPointerDateSelect // a new pointer-initiated date selection since last onDocumentPointerUp?
+                    ) {
+                        var unselectAuto = context.options.unselectAuto;
+                        var unselectCancel = context.options.unselectCancel;
+                        if (unselectAuto && (!unselectAuto || !elementClosest(documentPointer.downEl, unselectCancel))) {
+                            context.calendarApi.unselect(pev);
+                        }
+                    }
+                    if (calendarState.eventSelection && // an existing event selected?
+                        !elementClosest(documentPointer.downEl, EventDragging.SELECTOR) // interaction DIDN'T start on an event
+                    ) {
+                        context.dispatch({ type: 'UNSELECT_EVENT' });
+                    }
+                }
+                _this.isRecentPointerDateSelect = false;
+            };
+            var documentPointer = this.documentPointer = new PointerDragging(document);
+            documentPointer.shouldIgnoreMove = true;
+            documentPointer.shouldWatchScroll = false;
+            documentPointer.emitter.on('pointerup', this.onDocumentPointerUp);
+            /*
+            TODO: better way to know about whether there was a selection with the pointer
+            */
+            context.emitter.on('select', this.onSelect);
+        }
+        UnselectAuto.prototype.destroy = function () {
+            this.context.emitter.off('select', this.onSelect);
+            this.documentPointer.destroy();
+        };
+        return UnselectAuto;
+    }());
+
+    var LISTENER_REFINERS = {
+        dateClick: identity,
+        eventDragStart: identity,
+        eventDragStop: identity,
+        eventDrop: identity,
+        eventResizeStart: identity,
+        eventResizeStop: identity,
+        eventResize: identity,
+        drop: identity,
+        eventReceive: identity,
+        eventLeave: identity
+    };
+
+    /*
+    Given an already instantiated draggable object for one-or-more elements,
+    Interprets any dragging as an attempt to drag an events that lives outside
+    of a calendar onto a calendar.
+    */
+    var ExternalElementDragging = /** @class */ (function () {
+        function ExternalElementDragging(dragging, suppliedDragMeta) {
+            var _this = this;
+            this.receivingContext = null;
+            this.droppableEvent = null; // will exist for all drags, even if create:false
+            this.suppliedDragMeta = null;
+            this.dragMeta = null;
+            this.handleDragStart = function (ev) {
+                _this.dragMeta = _this.buildDragMeta(ev.subjectEl);
+            };
+            this.handleHitUpdate = function (hit, isFinal, ev) {
+                var dragging = _this.hitDragging.dragging;
+                var receivingContext = null;
+                var droppableEvent = null;
+                var isInvalid = false;
+                var interaction = {
+                    affectedEvents: createEmptyEventStore(),
+                    mutatedEvents: createEmptyEventStore(),
+                    isEvent: _this.dragMeta.create
+                };
+                if (hit) {
+                    receivingContext = hit.component.context;
+                    if (_this.canDropElOnCalendar(ev.subjectEl, receivingContext)) {
+                        droppableEvent = computeEventForDateSpan(hit.dateSpan, _this.dragMeta, receivingContext);
+                        interaction.mutatedEvents = eventTupleToStore(droppableEvent);
+                        isInvalid = !isInteractionValid(interaction, receivingContext);
+                        if (isInvalid) {
+                            interaction.mutatedEvents = createEmptyEventStore();
+                            droppableEvent = null;
+                        }
+                    }
+                }
+                _this.displayDrag(receivingContext, interaction);
+                // show mirror if no already-rendered mirror element OR if we are shutting down the mirror (?)
+                // TODO: wish we could somehow wait for dispatch to guarantee render
+                dragging.setMirrorIsVisible(isFinal || !droppableEvent || !document.querySelector('.fc-event-mirror'));
+                if (!isInvalid) {
+                    enableCursor();
+                }
+                else {
+                    disableCursor();
+                }
+                if (!isFinal) {
+                    dragging.setMirrorNeedsRevert(!droppableEvent);
+                    _this.receivingContext = receivingContext;
+                    _this.droppableEvent = droppableEvent;
+                }
+            };
+            this.handleDragEnd = function (pev) {
+                var _a = _this, receivingContext = _a.receivingContext, droppableEvent = _a.droppableEvent;
+                _this.clearDrag();
+                if (receivingContext && droppableEvent) {
+                    var finalHit = _this.hitDragging.finalHit;
+                    var finalView = finalHit.component.context.viewApi;
+                    var dragMeta = _this.dragMeta;
+                    receivingContext.emitter.trigger('drop', __assign(__assign({}, buildDatePointApiWithContext(finalHit.dateSpan, receivingContext)), { draggedEl: pev.subjectEl, jsEvent: pev.origEvent, view: finalView }));
+                    if (dragMeta.create) {
+                        receivingContext.dispatch({
+                            type: 'MERGE_EVENTS',
+                            eventStore: eventTupleToStore(droppableEvent)
+                        });
+                        if (pev.isTouch) {
+                            receivingContext.dispatch({
+                                type: 'SELECT_EVENT',
+                                eventInstanceId: droppableEvent.instance.instanceId
+                            });
+                        }
+                        // signal that an external event landed
+                        receivingContext.emitter.trigger('eventReceive', {
+                            draggedEl: pev.subjectEl,
+                            event: new EventApi(receivingContext, droppableEvent.def, droppableEvent.instance),
+                            view: finalView
+                        });
+                    }
+                }
+                _this.receivingContext = null;
+                _this.droppableEvent = null;
+            };
+            var hitDragging = this.hitDragging = new HitDragging(dragging, interactionSettingsStore);
+            hitDragging.requireInitial = false; // will start outside of a component
+            hitDragging.emitter.on('dragstart', this.handleDragStart);
+            hitDragging.emitter.on('hitupdate', this.handleHitUpdate);
+            hitDragging.emitter.on('dragend', this.handleDragEnd);
+            this.suppliedDragMeta = suppliedDragMeta;
+        }
+        ExternalElementDragging.prototype.buildDragMeta = function (subjectEl) {
+            if (typeof this.suppliedDragMeta === 'object') {
+                return parseDragMeta(this.suppliedDragMeta);
+            }
+            else if (typeof this.suppliedDragMeta === 'function') {
+                return parseDragMeta(this.suppliedDragMeta(subjectEl));
+            }
+            else {
+                return getDragMetaFromEl(subjectEl);
+            }
+        };
+        ExternalElementDragging.prototype.displayDrag = function (nextContext, state) {
+            var prevContext = this.receivingContext;
+            if (prevContext && prevContext !== nextContext) {
+                prevContext.dispatch({ type: 'UNSET_EVENT_DRAG' });
+            }
+            if (nextContext) {
+                nextContext.dispatch({ type: 'SET_EVENT_DRAG', state: state });
+            }
+        };
+        ExternalElementDragging.prototype.clearDrag = function () {
+            if (this.receivingContext) {
+                this.receivingContext.dispatch({ type: 'UNSET_EVENT_DRAG' });
+            }
+        };
+        ExternalElementDragging.prototype.canDropElOnCalendar = function (el, receivingContext) {
+            var dropAccept = receivingContext.options.dropAccept;
+            if (typeof dropAccept === 'function') {
+                return dropAccept.call(receivingContext.calendarApi, el);
+            }
+            else if (typeof dropAccept === 'string' && dropAccept) {
+                return Boolean(elementMatches(el, dropAccept));
+            }
+            return true;
+        };
+        return ExternalElementDragging;
+    }());
+    // Utils for computing event store from the DragMeta
+    // ----------------------------------------------------------------------------------------------------
+    function computeEventForDateSpan(dateSpan, dragMeta, context) {
+        var defProps = __assign({}, dragMeta.leftoverProps);
+        for (var _i = 0, _a = context.pluginHooks.externalDefTransforms; _i < _a.length; _i++) {
+            var transform = _a[_i];
+            __assign(defProps, transform(dateSpan, dragMeta));
+        }
+        var _b = refineEventDef(defProps, context), refined = _b.refined, extra = _b.extra;
+        var def = parseEventDef(refined, extra, dragMeta.sourceId, dateSpan.allDay, context.options.forceEventDuration || Boolean(dragMeta.duration), // hasEnd
+        context);
+        var start = dateSpan.range.start;
+        // only rely on time info if drop zone is all-day,
+        // otherwise, we already know the time
+        if (dateSpan.allDay && dragMeta.startTime) {
+            start = context.dateEnv.add(start, dragMeta.startTime);
+        }
+        var end = dragMeta.duration ?
+            context.dateEnv.add(start, dragMeta.duration) :
+            getDefaultEventEnd(dateSpan.allDay, start, context);
+        var instance = createEventInstance(def.defId, { start: start, end: end });
+        return { def: def, instance: instance };
+    }
+    // Utils for extracting data from element
+    // ----------------------------------------------------------------------------------------------------
+    function getDragMetaFromEl(el) {
+        var str = getEmbeddedElData(el, 'event');
+        var obj = str ?
+            JSON.parse(str) :
+            { create: false }; // if no embedded data, assume no event creation
+        return parseDragMeta(obj);
+    }
+    config.dataAttrPrefix = '';
+    function getEmbeddedElData(el, name) {
+        var prefix = config.dataAttrPrefix;
+        var prefixedName = (prefix ? prefix + '-' : '') + name;
+        return el.getAttribute('data-' + prefixedName) || '';
+    }
+
+    /*
+    Makes an element (that is *external* to any calendar) draggable.
+    Can pass in data that determines how an event will be created when dropped onto a calendar.
+    Leverages FullCalendar's internal drag-n-drop functionality WITHOUT a third-party drag system.
+    */
+    var ExternalDraggable = /** @class */ (function () {
+        function ExternalDraggable(el, settings) {
+            var _this = this;
+            if (settings === void 0) { settings = {}; }
+            this.handlePointerDown = function (ev) {
+                var dragging = _this.dragging;
+                var _a = _this.settings, minDistance = _a.minDistance, longPressDelay = _a.longPressDelay;
+                dragging.minDistance =
+                    minDistance != null ?
+                        minDistance :
+                        (ev.isTouch ? 0 : BASE_OPTION_DEFAULTS.eventDragMinDistance);
+                dragging.delay =
+                    ev.isTouch ? // TODO: eventually read eventLongPressDelay instead vvv
+                        (longPressDelay != null ? longPressDelay : BASE_OPTION_DEFAULTS.longPressDelay) :
+                        0;
+            };
+            this.handleDragStart = function (ev) {
+                if (ev.isTouch &&
+                    _this.dragging.delay &&
+                    ev.subjectEl.classList.contains('fc-event')) {
+                    _this.dragging.mirror.getMirrorEl().classList.add('fc-event-selected');
+                }
+            };
+            this.settings = settings;
+            var dragging = this.dragging = new FeaturefulElementDragging(el);
+            dragging.touchScrollAllowed = false;
+            if (settings.itemSelector != null) {
+                dragging.pointer.selector = settings.itemSelector;
+            }
+            if (settings.appendTo != null) {
+                dragging.mirror.parentNode = settings.appendTo; // TODO: write tests
+            }
+            dragging.emitter.on('pointerdown', this.handlePointerDown);
+            dragging.emitter.on('dragstart', this.handleDragStart);
+            new ExternalElementDragging(dragging, settings.eventData);
+        }
+        ExternalDraggable.prototype.destroy = function () {
+            this.dragging.destroy();
+        };
+        return ExternalDraggable;
+    }());
+
+    /*
+    Detects when a *THIRD-PARTY* drag-n-drop system interacts with elements.
+    The third-party system is responsible for drawing the visuals effects of the drag.
+    This class simply monitors for pointer movements and fires events.
+    It also has the ability to hide the moving element (the "mirror") during the drag.
+    */
+    var InferredElementDragging = /** @class */ (function (_super) {
+        __extends(InferredElementDragging, _super);
+        function InferredElementDragging(containerEl) {
+            var _this = _super.call(this, containerEl) || this;
+            _this.shouldIgnoreMove = false;
+            _this.mirrorSelector = '';
+            _this.currentMirrorEl = null;
+            _this.handlePointerDown = function (ev) {
+                _this.emitter.trigger('pointerdown', ev);
+                if (!_this.shouldIgnoreMove) {
+                    // fire dragstart right away. does not support delay or min-distance
+                    _this.emitter.trigger('dragstart', ev);
+                }
+            };
+            _this.handlePointerMove = function (ev) {
+                if (!_this.shouldIgnoreMove) {
+                    _this.emitter.trigger('dragmove', ev);
+                }
+            };
+            _this.handlePointerUp = function (ev) {
+                _this.emitter.trigger('pointerup', ev);
+                if (!_this.shouldIgnoreMove) {
+                    // fire dragend right away. does not support a revert animation
+                    _this.emitter.trigger('dragend', ev);
+                }
+            };
+            var pointer = _this.pointer = new PointerDragging(containerEl);
+            pointer.emitter.on('pointerdown', _this.handlePointerDown);
+            pointer.emitter.on('pointermove', _this.handlePointerMove);
+            pointer.emitter.on('pointerup', _this.handlePointerUp);
+            return _this;
+        }
+        InferredElementDragging.prototype.destroy = function () {
+            this.pointer.destroy();
+        };
+        InferredElementDragging.prototype.setIgnoreMove = function (bool) {
+            this.shouldIgnoreMove = bool;
+        };
+        InferredElementDragging.prototype.setMirrorIsVisible = function (bool) {
+            if (bool) {
+                // restore a previously hidden element.
+                // use the reference in case the selector class has already been removed.
+                if (this.currentMirrorEl) {
+                    this.currentMirrorEl.style.visibility = '';
+                    this.currentMirrorEl = null;
+                }
+            }
+            else {
+                var mirrorEl = this.mirrorSelector ?
+                    document.querySelector(this.mirrorSelector) :
+                    null;
+                if (mirrorEl) {
+                    this.currentMirrorEl = mirrorEl;
+                    mirrorEl.style.visibility = 'hidden';
+                }
+            }
+        };
+        return InferredElementDragging;
+    }(ElementDragging));
+
+    /*
+    Bridges third-party drag-n-drop systems with FullCalendar.
+    Must be instantiated and destroyed by caller.
+    */
+    var ThirdPartyDraggable = /** @class */ (function () {
+        function ThirdPartyDraggable(containerOrSettings, settings) {
+            var containerEl = document;
+            if (
+            // wish we could just test instanceof EventTarget, but doesn't work in IE11
+            containerOrSettings === document ||
+                containerOrSettings instanceof Element) {
+                containerEl = containerOrSettings;
+                settings = settings || {};
+            }
+            else {
+                settings = (containerOrSettings || {});
+            }
+            var dragging = this.dragging = new InferredElementDragging(containerEl);
+            if (typeof settings.itemSelector === 'string') {
+                dragging.pointer.selector = settings.itemSelector;
+            }
+            else if (containerEl === document) {
+                dragging.pointer.selector = '[data-event]';
+            }
+            if (typeof settings.mirrorSelector === 'string') {
+                dragging.mirrorSelector = settings.mirrorSelector;
+            }
+            new ExternalElementDragging(dragging, settings.eventData);
+        }
+        ThirdPartyDraggable.prototype.destroy = function () {
+            this.dragging.destroy();
+        };
+        return ThirdPartyDraggable;
+    }());
+
+    var interactionPlugin = createPlugin({
+        componentInteractions: [DateClicking, DateSelecting, EventDragging, EventResizing],
+        calendarInteractions: [UnselectAuto],
+        elementDraggingImpl: FeaturefulElementDragging,
+        listenerRefiners: LISTENER_REFINERS
+    });
+
+    /* An abstract class for the daygrid views, as well as month view. Renders one or more rows of day cells.
+    ----------------------------------------------------------------------------------------------------------------------*/
+    // It is a manager for a Table subcomponent, which does most of the heavy lifting.
+    // It is responsible for managing width/height.
+    var TableView = /** @class */ (function (_super) {
+        __extends(TableView, _super);
+        function TableView() {
+            var _this = _super !== null && _super.apply(this, arguments) || this;
+            _this.headerElRef = createRef();
+            return _this;
+        }
+        TableView.prototype.renderSimpleLayout = function (headerRowContent, bodyContent) {
+            var _a = this, props = _a.props, context = _a.context;
+            var sections = [];
+            var stickyHeaderDates = getStickyHeaderDates(context.options);
+            if (headerRowContent) {
+                sections.push({
+                    type: 'header',
+                    key: 'header',
+                    isSticky: stickyHeaderDates,
+                    chunk: {
+                        elRef: this.headerElRef,
+                        tableClassName: 'fc-col-header',
+                        rowContent: headerRowContent
+                    }
+                });
+            }
+            sections.push({
+                type: 'body',
+                key: 'body',
+                liquid: true,
+                chunk: { content: bodyContent }
+            });
+            return (createElement(ViewRoot, { viewSpec: context.viewSpec }, function (rootElRef, classNames) { return (createElement("div", { ref: rootElRef, className: ['fc-daygrid'].concat(classNames).join(' ') },
+                createElement(SimpleScrollGrid, { liquid: !props.isHeightAuto && !props.forPrint, cols: [] /* TODO: make optional? */, sections: sections }))); }));
+        };
+        TableView.prototype.renderHScrollLayout = function (headerRowContent, bodyContent, colCnt, dayMinWidth) {
+            var ScrollGrid = this.context.pluginHooks.scrollGridImpl;
+            if (!ScrollGrid) {
+                throw new Error('No ScrollGrid implementation');
+            }
+            var _a = this, props = _a.props, context = _a.context;
+            var stickyHeaderDates = !props.forPrint && getStickyHeaderDates(context.options);
+            var stickyFooterScrollbar = !props.forPrint && getStickyFooterScrollbar(context.options);
+            var sections = [];
+            if (headerRowContent) {
+                sections.push({
+                    type: 'header',
+                    key: 'header',
+                    isSticky: stickyHeaderDates,
+                    chunks: [{
+                            key: 'main',
+                            elRef: this.headerElRef,
+                            tableClassName: 'fc-col-header',
+                            rowContent: headerRowContent
+                        }]
+                });
+            }
+            sections.push({
+                type: 'body',
+                key: 'body',
+                liquid: true,
+                chunks: [{
+                        key: 'main',
+                        content: bodyContent
+                    }]
+            });
+            if (stickyFooterScrollbar) {
+                sections.push({
+                    type: 'footer',
+                    key: 'footer',
+                    isSticky: true,
+                    chunks: [{
+                            key: 'main',
+                            content: renderScrollShim
+                        }]
+                });
+            }
+            return (createElement(ViewRoot, { viewSpec: context.viewSpec }, function (rootElRef, classNames) { return (createElement("div", { ref: rootElRef, className: ['fc-daygrid'].concat(classNames).join(' ') },
+                createElement(ScrollGrid, { liquid: !props.isHeightAuto && !props.forPrint, colGroups: [{ cols: [{ span: colCnt, minWidth: dayMinWidth }] }], sections: sections }))); }));
+        };
+        return TableView;
+    }(DateComponent));
+
+    function splitSegsByRow(segs, rowCnt) {
+        var byRow = [];
+        for (var i = 0; i < rowCnt; i++) {
+            byRow[i] = [];
+        }
+        for (var _i = 0, segs_1 = segs; _i < segs_1.length; _i++) {
+            var seg = segs_1[_i];
+            byRow[seg.row].push(seg);
+        }
+        return byRow;
+    }
+    function splitSegsByFirstCol(segs, colCnt) {
+        var byCol = [];
+        for (var i = 0; i < colCnt; i++) {
+            byCol[i] = [];
+        }
+        for (var _i = 0, segs_2 = segs; _i < segs_2.length; _i++) {
+            var seg = segs_2[_i];
+            byCol[seg.firstCol].push(seg);
+        }
+        return byCol;
+    }
+    function splitInteractionByRow(ui, rowCnt) {
+        var byRow = [];
+        if (!ui) {
+            for (var i = 0; i < rowCnt; i++) {
+                byRow[i] = null;
+            }
+        }
+        else {
+            for (var i = 0; i < rowCnt; i++) {
+                byRow[i] = {
+                    affectedInstances: ui.affectedInstances,
+                    isEvent: ui.isEvent,
+                    segs: []
+                };
+            }
+            for (var _i = 0, _a = ui.segs; _i < _a.length; _i++) {
+                var seg = _a[_i];
+                byRow[seg.row].segs.push(seg);
+            }
+        }
+        return byRow;
+    }
+
+    var DEFAULT_WEEK_NUM_FORMAT = createFormatter({ week: 'narrow' });
+    var TableCell = /** @class */ (function (_super) {
+        __extends(TableCell, _super);
+        function TableCell() {
+            var _this = _super !== null && _super.apply(this, arguments) || this;
+            _this.handleRootEl = function (el) {
+                _this.rootEl = el;
+                setRef(_this.props.elRef, el);
+            };
+            _this.handleMoreLinkClick = function (ev) {
+                var props = _this.props;
+                if (props.onMoreClick) {
+                    var allSegs = props.segsByEachCol;
+                    var hiddenSegs = allSegs.filter(function (seg) { return props.segIsHidden[seg.eventRange.instance.instanceId]; });
+                    props.onMoreClick({
+                        date: props.date,
+                        allSegs: allSegs,
+                        hiddenSegs: hiddenSegs,
+                        moreCnt: props.moreCnt,
+                        dayEl: _this.rootEl,
+                        ev: ev
+                    });
+                }
+            };
+            return _this;
+        }
+        TableCell.prototype.render = function () {
+            var _this = this;
+            var _a = this.context, options = _a.options, viewApi = _a.viewApi;
+            var props = this.props;
+            var date = props.date, dateProfile = props.dateProfile;
+            var hookProps = {
+                num: props.moreCnt,
+                text: props.buildMoreLinkText(props.moreCnt),
+                view: viewApi
+            };
+            var navLinkAttrs = options.navLinks
+                ? { 'data-navlink': buildNavLinkData(date, 'week'), tabIndex: 0 }
+                : {};
+            return (createElement(DayCellRoot, { date: date, dateProfile: dateProfile, todayRange: props.todayRange, showDayNumber: props.showDayNumber, extraHookProps: props.extraHookProps, elRef: this.handleRootEl }, function (rootElRef, classNames, rootDataAttrs, isDisabled) { return (createElement("td", __assign({ ref: rootElRef, className: ['fc-daygrid-day'].concat(classNames, props.extraClassNames || []).join(' ') }, rootDataAttrs, props.extraDataAttrs),
+                createElement("div", { className: 'fc-daygrid-day-frame fc-scrollgrid-sync-inner', ref: props.innerElRef /* different from hook system! RENAME */ },
+                    props.showWeekNumber &&
+                        createElement(WeekNumberRoot, { date: date, defaultFormat: DEFAULT_WEEK_NUM_FORMAT }, function (rootElRef, classNames, innerElRef, innerContent) { return (createElement("a", __assign({ ref: rootElRef, className: ['fc-daygrid-week-number'].concat(classNames).join(' ') }, navLinkAttrs), innerContent)); }),
+                    !isDisabled &&
+                        createElement(TableCellTop, { date: date, dateProfile: dateProfile, showDayNumber: props.showDayNumber, todayRange: props.todayRange, extraHookProps: props.extraHookProps }),
+                    createElement("div", { className: 'fc-daygrid-day-events', ref: props.fgContentElRef, style: { paddingBottom: props.fgPaddingBottom } },
+                        props.fgContent,
+                        Boolean(props.moreCnt) &&
+                            createElement("div", { className: 'fc-daygrid-day-bottom', style: { marginTop: props.moreMarginTop } },
+                                createElement(RenderHook, { hookProps: hookProps, classNames: options.moreLinkClassNames, content: options.moreLinkContent, defaultContent: renderMoreLinkInner, didMount: options.moreLinkDidMount, willUnmount: options.moreLinkWillUnmount }, function (rootElRef, classNames, innerElRef, innerContent) { return (createElement("a", { onClick: _this.handleMoreLinkClick, ref: rootElRef, className: ['fc-daygrid-more-link'].concat(classNames).join(' ') }, innerContent)); }))),
+                    createElement("div", { className: 'fc-daygrid-day-bg' }, props.bgContent)))); }));
+        };
+        return TableCell;
+    }(DateComponent));
+    function renderTopInner(props) {
+        return props.dayNumberText;
+    }
+    function renderMoreLinkInner(props) {
+        return props.text;
+    }
+    var TableCellTop = /** @class */ (function (_super) {
+        __extends(TableCellTop, _super);
+        function TableCellTop() {
+            return _super !== null && _super.apply(this, arguments) || this;
+        }
+        TableCellTop.prototype.render = function () {
+            var props = this.props;
+            var navLinkAttrs = this.context.options.navLinks
+                ? { 'data-navlink': buildNavLinkData(props.date), tabIndex: 0 }
+                : {};
+            return (createElement(DayCellContent, { date: props.date, dateProfile: props.dateProfile, todayRange: props.todayRange, showDayNumber: props.showDayNumber, extraHookProps: props.extraHookProps, defaultContent: renderTopInner }, function (innerElRef, innerContent) { return (innerContent &&
+                createElement("div", { className: 'fc-daygrid-day-top', ref: innerElRef },
+                    createElement("a", __assign({ className: 'fc-daygrid-day-number' }, navLinkAttrs), innerContent))); }));
+        };
+        return TableCellTop;
+    }(BaseComponent));
+
+    var DEFAULT_TABLE_EVENT_TIME_FORMAT = createFormatter({
+        hour: 'numeric',
+        minute: '2-digit',
+        omitZeroMinute: true,
+        meridiem: 'narrow'
+    });
+    function hasListItemDisplay(seg) {
+        var display = seg.eventRange.ui.display;
+        return display === 'list-item' || (display === 'auto' &&
+            !seg.eventRange.def.allDay &&
+            seg.firstCol === seg.lastCol // can't be multi-day
+        );
+    }
+
+    var TableListItemEvent = /** @class */ (function (_super) {
+        __extends(TableListItemEvent, _super);
+        function TableListItemEvent() {
+            return _super !== null && _super.apply(this, arguments) || this;
+        }
+        TableListItemEvent.prototype.render = function () {
+            var _a = this, props = _a.props, context = _a.context;
+            var timeFormat = context.options.eventTimeFormat || DEFAULT_TABLE_EVENT_TIME_FORMAT;
+            var timeText = buildSegTimeText(props.seg, timeFormat, context, true, props.defaultDisplayEventEnd);
+            return (createElement(EventRoot, { seg: props.seg, timeText: timeText, defaultContent: renderInnerContent$2, isDragging: props.isDragging, isResizing: false, isDateSelecting: false, isSelected: props.isSelected, isPast: props.isPast, isFuture: props.isFuture, isToday: props.isToday }, function (rootElRef, classNames, innerElRef, innerContent) { return ( // we don't use styles!
+            createElement("a", __assign({ className: ['fc-daygrid-event', 'fc-daygrid-dot-event'].concat(classNames).join(' '), ref: rootElRef }, getSegAnchorAttrs$1(props.seg)), innerContent)); }));
+        };
+        return TableListItemEvent;
+    }(BaseComponent));
+    function renderInnerContent$2(innerProps) {
+        return (createElement(Fragment, null,
+            createElement("div", { className: 'fc-daygrid-event-dot', style: { borderColor: innerProps.borderColor || innerProps.backgroundColor } }),
+            innerProps.timeText &&
+                createElement("div", { className: 'fc-event-time' }, innerProps.timeText),
+            createElement("div", { className: 'fc-event-title' }, innerProps.event.title || createElement(Fragment, null, "\u00A0"))));
+    }
+    function getSegAnchorAttrs$1(seg) {
+        var url = seg.eventRange.def.url;
+        return url ? { href: url } : {};
+    }
+
+    var TableBlockEvent = /** @class */ (function (_super) {
+        __extends(TableBlockEvent, _super);
+        function TableBlockEvent() {
+            return _super !== null && _super.apply(this, arguments) || this;
+        }
+        TableBlockEvent.prototype.render = function () {
+            var props = this.props;
+            return (createElement(StandardEvent, __assign({}, props, { extraClassNames: ['fc-daygrid-event', 'fc-daygrid-block-event', 'fc-h-event'], defaultTimeFormat: DEFAULT_TABLE_EVENT_TIME_FORMAT, defaultDisplayEventEnd: props.defaultDisplayEventEnd, disableResizing: !props.seg.eventRange.def.allDay })));
+        };
+        return TableBlockEvent;
+    }(BaseComponent));
+
+    function computeFgSegPlacement(// for one row. TODO: print mode?
+    cellModels, segs, dayMaxEvents, dayMaxEventRows, eventHeights, maxContentHeight, colCnt, eventOrderSpecs) {
+        var colPlacements = []; // if event spans multiple cols, its present in each col
+        var moreCnts = []; // by-col
+        var segIsHidden = {};
+        var segTops = {}; // always populated for each seg
+        var segMarginTops = {}; // simetimes populated for each seg
+        var moreTops = {};
+        var paddingBottoms = {}; // for each cell's inner-wrapper div
+        for (var i = 0; i < colCnt; i++) {
+            colPlacements.push([]);
+            moreCnts.push(0);
+        }
+        segs = sortEventSegs(segs, eventOrderSpecs);
+        for (var _i = 0, segs_1 = segs; _i < segs_1.length; _i++) {
+            var seg = segs_1[_i];
+            var instanceId = seg.eventRange.instance.instanceId;
+            var eventHeight = eventHeights[instanceId + ':' + seg.firstCol];
+            placeSeg(seg, eventHeight || 0); // will keep colPlacements sorted by top
+        }
+        if (dayMaxEvents === true || dayMaxEventRows === true) {
+            limitByMaxHeight(moreCnts, segIsHidden, colPlacements, maxContentHeight); // populates moreCnts/segIsHidden
+        }
+        else if (typeof dayMaxEvents === 'number') {
+            limitByMaxEvents(moreCnts, segIsHidden, colPlacements, dayMaxEvents); // populates moreCnts/segIsHidden
+        }
+        else if (typeof dayMaxEventRows === 'number') {
+            limitByMaxRows(moreCnts, segIsHidden, colPlacements, dayMaxEventRows); // populates moreCnts/segIsHidden
+        }
+        // computes segTops/segMarginTops/moreTops/paddingBottoms
+        for (var col = 0; col < colCnt; col++) {
+            var placements = colPlacements[col];
+            var currentNonAbsBottom = 0;
+            var runningAbsHeight = 0;
+            for (var _a = 0, placements_1 = placements; _a < placements_1.length; _a++) {
+                var placement = placements_1[_a];
+                var seg = placement.seg;
+                if (!segIsHidden[seg.eventRange.instance.instanceId]) {
+                    segTops[seg.eventRange.instance.instanceId] = placement.top; // from top of container
+                    if (seg.firstCol === seg.lastCol && seg.isStart && seg.isEnd) { // TODO: simpler way? NOT DRY
+                        segMarginTops[seg.eventRange.instance.instanceId] =
+                            placement.top - currentNonAbsBottom; // from previous seg bottom
+                        runningAbsHeight = 0;
+                        currentNonAbsBottom = placement.bottom;
+                    }
+                    else { // multi-col event, abs positioned
+                        runningAbsHeight += placement.bottom - placement.top;
+                    }
+                }
+            }
+            if (runningAbsHeight) {
+                if (moreCnts[col]) {
+                    moreTops[col] = runningAbsHeight;
+                }
+                else {
+                    paddingBottoms[col] = runningAbsHeight;
+                }
+            }
+        }
+        function placeSeg(seg, segHeight) {
+            if (!tryPlaceSegAt(seg, segHeight, 0)) {
+                for (var col = seg.firstCol; col <= seg.lastCol; col++) {
+                    for (var _i = 0, _a = colPlacements[col]; _i < _a.length; _i++) { // will repeat multi-day segs!!!!!!! bad!!!!!!
+                        var placement = _a[_i];
+                        if (tryPlaceSegAt(seg, segHeight, placement.bottom)) {
+                            return;
+                        }
+                    }
+                }
+            }
+        }
+        function tryPlaceSegAt(seg, segHeight, top) {
+            if (canPlaceSegAt(seg, segHeight, top)) {
+                for (var col = seg.firstCol; col <= seg.lastCol; col++) {
+                    var placements = colPlacements[col];
+                    var insertionIndex = 0;
+                    while (insertionIndex < placements.length &&
+                        top >= placements[insertionIndex].top) {
+                        insertionIndex++;
+                    }
+                    placements.splice(insertionIndex, 0, {
+                        seg: seg,
+                        top: top,
+                        bottom: top + segHeight
+                    });
+                }
+                return true;
+            }
+            else {
+                return false;
+            }
+        }
+        function canPlaceSegAt(seg, segHeight, top) {
+            for (var col = seg.firstCol; col <= seg.lastCol; col++) {
+                for (var _i = 0, _a = colPlacements[col]; _i < _a.length; _i++) {
+                    var placement = _a[_i];
+                    if (top < placement.bottom && top + segHeight > placement.top) { // collide?
+                        return false;
+                    }
+                }
+            }
+            return true;
+        }
+        // what does this do!?
+        for (var instanceIdAndFirstCol in eventHeights) {
+            if (!eventHeights[instanceIdAndFirstCol]) {
+                segIsHidden[instanceIdAndFirstCol.split(':')[0]] = true;
+            }
+        }
+        var segsByFirstCol = colPlacements.map(extractFirstColSegs); // operates on the sorted cols
+        var segsByEachCol = colPlacements.map(function (placements, col) {
+            var segs = extractAllColSegs(placements);
+            segs = resliceDaySegs(segs, cellModels[col].date, col);
+            return segs;
+        });
+        return {
+            segsByFirstCol: segsByFirstCol,
+            segsByEachCol: segsByEachCol,
+            segIsHidden: segIsHidden,
+            segTops: segTops,
+            segMarginTops: segMarginTops,
+            moreCnts: moreCnts,
+            moreTops: moreTops,
+            paddingBottoms: paddingBottoms
+        };
+    }
+    function extractFirstColSegs(oneColPlacements, col) {
+        var segs = [];
+        for (var _i = 0, oneColPlacements_1 = oneColPlacements; _i < oneColPlacements_1.length; _i++) {
+            var placement = oneColPlacements_1[_i];
+            if (placement.seg.firstCol === col) {
+                segs.push(placement.seg);
+            }
+        }
+        return segs;
+    }
+    function extractAllColSegs(oneColPlacements) {
+        var segs = [];
+        for (var _i = 0, oneColPlacements_2 = oneColPlacements; _i < oneColPlacements_2.length; _i++) {
+            var placement = oneColPlacements_2[_i];
+            segs.push(placement.seg);
+        }
+        return segs;
+    }
+    function limitByMaxHeight(hiddenCnts, segIsHidden, colPlacements, maxContentHeight) {
+        limitEvents(hiddenCnts, segIsHidden, colPlacements, true, function (placement) {
+            return placement.bottom <= maxContentHeight;
+        });
+    }
+    function limitByMaxEvents(hiddenCnts, segIsHidden, colPlacements, dayMaxEvents) {
+        limitEvents(hiddenCnts, segIsHidden, colPlacements, false, function (placement, levelIndex) {
+            return levelIndex < dayMaxEvents;
+        });
+    }
+    function limitByMaxRows(hiddenCnts, segIsHidden, colPlacements, dayMaxEventRows) {
+        limitEvents(hiddenCnts, segIsHidden, colPlacements, true, function (placement, levelIndex) {
+            return levelIndex < dayMaxEventRows;
+        });
+    }
+    /*
+    populates the given hiddenCnts/segIsHidden, which are supplied empty.
+    TODO: return them instead
+    */
+    function limitEvents(hiddenCnts, segIsHidden, colPlacements, moreLinkConsumesLevel, isPlacementInBounds) {
+        var colCnt = hiddenCnts.length;
+        var segIsVisible = {}; // TODO: instead, use segIsHidden with true/false?
+        var visibleColPlacements = []; // will mirror colPlacements
+        for (var col = 0; col < colCnt; col++) {
+            visibleColPlacements.push([]);
+        }
+        for (var col = 0; col < colCnt; col++) {
+            var placements = colPlacements[col];
+            var level = 0;
+            for (var _i = 0, placements_2 = placements; _i < placements_2.length; _i++) {
+                var placement = placements_2[_i];
+                if (isPlacementInBounds(placement, level)) {
+                    recordVisible(placement);
+                }
+                else {
+                    recordHidden(placement);
+                }
+                // only considered a level if the seg had height
+                if (placement.top !== placement.bottom) {
+                    level++;
+                }
+            }
+        }
+        function recordVisible(placement) {
+            var seg = placement.seg;
+            var instanceId = seg.eventRange.instance.instanceId;
+            if (!segIsVisible[instanceId]) {
+                segIsVisible[instanceId] = true;
+                for (var col = seg.firstCol; col <= seg.lastCol; col++) {
+                    visibleColPlacements[col].push(placement);
+                }
+            }
+        }
+        function recordHidden(placement) {
+            var seg = placement.seg;
+            var instanceId = seg.eventRange.instance.instanceId;
+            if (!segIsHidden[instanceId]) {
+                segIsHidden[instanceId] = true;
+                for (var col = seg.firstCol; col <= seg.lastCol; col++) {
+                    var hiddenCnt = ++hiddenCnts[col];
+                    if (moreLinkConsumesLevel && hiddenCnt === 1) {
+                        var lastVisiblePlacement = visibleColPlacements[col].pop();
+                        if (lastVisiblePlacement) {
+                            recordHidden(lastVisiblePlacement);
+                        }
+                    }
+                }
+            }
+        }
+    }
+    // Given the events within an array of segment objects, reslice them to be in a single day
+    function resliceDaySegs(segs, dayDate, colIndex) {
+        var dayStart = dayDate;
+        var dayEnd = addDays(dayStart, 1);
+        var dayRange = { start: dayStart, end: dayEnd };
+        var newSegs = [];
+        for (var _i = 0, segs_2 = segs; _i < segs_2.length; _i++) {
+            var seg = segs_2[_i];
+            var eventRange = seg.eventRange;
+            var origRange = eventRange.range;
+            var slicedRange = intersectRanges(origRange, dayRange);
+            if (slicedRange) {
+                newSegs.push(__assign(__assign({}, seg), { firstCol: colIndex, lastCol: colIndex, eventRange: {
+                        def: eventRange.def,
+                        ui: __assign(__assign({}, eventRange.ui), { durationEditable: false }),
+                        instance: eventRange.instance,
+                        range: slicedRange
+                    }, isStart: seg.isStart && slicedRange.start.valueOf() === origRange.start.valueOf(), isEnd: seg.isEnd && slicedRange.end.valueOf() === origRange.end.valueOf() }));
+            }
+        }
+        return newSegs;
+    }
+
+    var TableRow = /** @class */ (function (_super) {
+        __extends(TableRow, _super);
+        function TableRow() {
+            var _this = _super !== null && _super.apply(this, arguments) || this;
+            _this.cellElRefs = new RefMap(); // the <td>
+            _this.frameElRefs = new RefMap(); // the fc-daygrid-day-frame
+            _this.fgElRefs = new RefMap(); // the fc-daygrid-day-events
+            _this.segHarnessRefs = new RefMap(); // indexed by "instanceId:firstCol"
+            _this.rootElRef = createRef();
+            _this.state = {
+                framePositions: null,
+                maxContentHeight: null,
+                segHeights: {}
+            };
+            return _this;
+        }
+        TableRow.prototype.render = function () {
+            var _this = this;
+            var _a = this, props = _a.props, state = _a.state, context = _a.context;
+            var colCnt = props.cells.length;
+            var businessHoursByCol = splitSegsByFirstCol(props.businessHourSegs, colCnt);
+            var bgEventSegsByCol = splitSegsByFirstCol(props.bgEventSegs, colCnt);
+            var highlightSegsByCol = splitSegsByFirstCol(this.getHighlightSegs(), colCnt);
+            var mirrorSegsByCol = splitSegsByFirstCol(this.getMirrorSegs(), colCnt);
+            var _b = computeFgSegPlacement(props.cells, props.fgEventSegs, props.dayMaxEvents, props.dayMaxEventRows, state.segHeights, state.maxContentHeight, colCnt, context.options.eventOrder), paddingBottoms = _b.paddingBottoms, segsByFirstCol = _b.segsByFirstCol, segsByEachCol = _b.segsByEachCol, segIsHidden = _b.segIsHidden, segTops = _b.segTops, segMarginTops = _b.segMarginTops, moreCnts = _b.moreCnts, moreTops = _b.moreTops;
+            var selectedInstanceHash = // TODO: messy way to compute this
+             (props.eventDrag && props.eventDrag.affectedInstances) ||
+                (props.eventResize && props.eventResize.affectedInstances) ||
+                {};
+            return (createElement("tr", { ref: this.rootElRef },
+                props.renderIntro && props.renderIntro(),
+                props.cells.map(function (cell, col) {
+                    var normalFgNodes = _this.renderFgSegs(segsByFirstCol[col], segIsHidden, segTops, segMarginTops, selectedInstanceHash, props.todayRange);
+                    var mirrorFgNodes = _this.renderFgSegs(mirrorSegsByCol[col], {}, segTops, // use same tops as real rendering
+                    {}, {}, props.todayRange, Boolean(props.eventDrag), Boolean(props.eventResize), false // date-selecting (because mirror is never drawn for date selection)
+                    );
+                    var showWeekNumber = props.showWeekNumbers && col === 0;
+                    return (createElement(TableCell, { key: cell.key, elRef: _this.cellElRefs.createRef(cell.key), innerElRef: _this.frameElRefs.createRef(cell.key) /* FF <td> problem, but okay to use for left/right. TODO: rename prop */, dateProfile: props.dateProfile, date: cell.date, showDayNumber: props.showDayNumbers || showWeekNumber /* for spacing, we need to force day-numbers if week numbers */, showWeekNumber: showWeekNumber, todayRange: props.todayRange, extraHookProps: cell.extraHookProps, extraDataAttrs: cell.extraDataAttrs, extraClassNames: cell.extraClassNames, moreCnt: moreCnts[col], buildMoreLinkText: props.buildMoreLinkText, onMoreClick: props.onMoreClick, segIsHidden: segIsHidden, moreMarginTop: moreTops[col] /* rename */, segsByEachCol: segsByEachCol[col], fgPaddingBottom: paddingBottoms[col], fgContentElRef: _this.fgElRefs.createRef(cell.key), fgContent: ( // Fragment scopes the keys
+                        createElement(Fragment, null,
+                            createElement(Fragment, null, normalFgNodes),
+                            createElement(Fragment, null, mirrorFgNodes))), bgContent: ( // Fragment scopes the keys
+                        createElement(Fragment, null,
+                            _this.renderFillSegs(highlightSegsByCol[col], 'highlight'),
+                            _this.renderFillSegs(businessHoursByCol[col], 'non-business'),
+                            _this.renderFillSegs(bgEventSegsByCol[col], 'bg-event'))) }));
+                })));
+        };
+        TableRow.prototype.componentDidMount = function () {
+            this.updateSizing(true);
+        };
+        TableRow.prototype.componentDidUpdate = function (prevProps, prevState) {
+            var currentProps = this.props;
+            this.updateSizing(!isPropsEqual(prevProps, currentProps));
+        };
+        TableRow.prototype.getHighlightSegs = function () {
+            var props = this.props;
+            if (props.eventDrag && props.eventDrag.segs.length) { // messy check
+                return props.eventDrag.segs;
+            }
+            else if (props.eventResize && props.eventResize.segs.length) { // messy check
+                return props.eventResize.segs;
+            }
+            else {
+                return props.dateSelectionSegs;
+            }
+        };
+        TableRow.prototype.getMirrorSegs = function () {
+            var props = this.props;
+            if (props.eventResize && props.eventResize.segs.length) { // messy check
+                return props.eventResize.segs;
+            }
+            else {
+                return [];
+            }
+        };
+        TableRow.prototype.renderFgSegs = function (segs, segIsHidden, // does NOT mean display:hidden
+        segTops, segMarginTops, selectedInstanceHash, todayRange, isDragging, isResizing, isDateSelecting) {
+            var context = this.context;
+            var eventSelection = this.props.eventSelection;
+            var framePositions = this.state.framePositions;
+            var defaultDisplayEventEnd = this.props.cells.length === 1; // colCnt === 1
+            var nodes = [];
+            if (framePositions) {
+                for (var _i = 0, segs_1 = segs; _i < segs_1.length; _i++) {
+                    var seg = segs_1[_i];
+                    var instanceId = seg.eventRange.instance.instanceId;
+                    var isMirror = isDragging || isResizing || isDateSelecting;
+                    var isSelected = selectedInstanceHash[instanceId];
+                    var isInvisible = segIsHidden[instanceId] || isSelected;
+                    var isAbsolute = segIsHidden[instanceId] || isMirror || seg.firstCol !== seg.lastCol || !seg.isStart || !seg.isEnd; // TODO: simpler way? NOT DRY
+                    var marginTop = void 0;
+                    var top_1 = void 0;
+                    var left = void 0;
+                    var right = void 0;
+                    if (isAbsolute) {
+                        top_1 = segTops[instanceId];
+                        if (context.isRtl) {
+                            right = 0;
+                            left = framePositions.lefts[seg.lastCol] - framePositions.lefts[seg.firstCol];
+                        }
+                        else {
+                            left = 0;
+                            right = framePositions.rights[seg.firstCol] - framePositions.rights[seg.lastCol];
+                        }
+                    }
+                    else {
+                        marginTop = segMarginTops[instanceId];
+                    }
+                    /*
+                    known bug: events that are force to be list-item but span multiple days still take up space in later columns
+                    */
+                    nodes.push(createElement("div", { className: 'fc-daygrid-event-harness' + (isAbsolute ? ' fc-daygrid-event-harness-abs' : ''), key: instanceId, ref: isMirror ? null : this.segHarnessRefs.createRef(instanceId + ':' + seg.firstCol) /* in print mode when in mult cols, could collide */, style: {
+                            visibility: isInvisible ? 'hidden' : '',
+                            marginTop: marginTop || '',
+                            top: top_1 || '',
+                            left: left || '',
+                            right: right || ''
+                        } }, hasListItemDisplay(seg) ?
+                        createElement(TableListItemEvent, __assign({ seg: seg, isDragging: isDragging, isSelected: instanceId === eventSelection, defaultDisplayEventEnd: defaultDisplayEventEnd }, getSegMeta(seg, todayRange))) :
+                        createElement(TableBlockEvent, __assign({ seg: seg, isDragging: isDragging, isResizing: isResizing, isDateSelecting: isDateSelecting, isSelected: instanceId === eventSelection, defaultDisplayEventEnd: defaultDisplayEventEnd }, getSegMeta(seg, todayRange)))));
+                }
+            }
+            return nodes;
+        };
+        TableRow.prototype.renderFillSegs = function (segs, fillType) {
+            var isRtl = this.context.isRtl;
+            var todayRange = this.props.todayRange;
+            var framePositions = this.state.framePositions;
+            var nodes = [];
+            if (framePositions) {
+                for (var _i = 0, segs_2 = segs; _i < segs_2.length; _i++) {
+                    var seg = segs_2[_i];
+                    var leftRightCss = isRtl ? {
+                        right: 0,
+                        left: framePositions.lefts[seg.lastCol] - framePositions.lefts[seg.firstCol]
+                    } : {
+                        left: 0,
+                        right: framePositions.rights[seg.firstCol] - framePositions.rights[seg.lastCol],
+                    };
+                    nodes.push(createElement("div", { key: buildEventRangeKey(seg.eventRange), className: 'fc-daygrid-bg-harness', style: leftRightCss }, fillType === 'bg-event' ?
+                        createElement(BgEvent, __assign({ seg: seg }, getSegMeta(seg, todayRange))) :
+                        renderFill(fillType)));
+                }
+            }
+            return createElement.apply(void 0, __spreadArrays([Fragment, {}], nodes));
+        };
+        TableRow.prototype.updateSizing = function (isExternalSizingChange) {
+            var _a = this, props = _a.props, frameElRefs = _a.frameElRefs;
+            if (props.clientWidth !== null) { // positioning ready?
+                if (isExternalSizingChange) {
+                    var frameEls = props.cells.map(function (cell) { return frameElRefs.currentMap[cell.key]; });
+                    if (frameEls.length) {
+                        var originEl = this.rootElRef.current;
+                        this.setState({
+                            framePositions: new PositionCache(originEl, frameEls, true, // isHorizontal
+                            false)
+                        });
+                    }
+                }
+                var limitByContentHeight = props.dayMaxEvents === true || props.dayMaxEventRows === true;
+                this.setState({
+                    segHeights: this.computeSegHeights(),
+                    maxContentHeight: limitByContentHeight ? this.computeMaxContentHeight() : null
+                });
+            }
+        };
+        TableRow.prototype.computeSegHeights = function () {
+            return mapHash(this.segHarnessRefs.currentMap, function (eventHarnessEl) { return (eventHarnessEl.getBoundingClientRect().height); });
+        };
+        TableRow.prototype.computeMaxContentHeight = function () {
+            var firstKey = this.props.cells[0].key;
+            var cellEl = this.cellElRefs.currentMap[firstKey];
+            var fcContainerEl = this.fgElRefs.currentMap[firstKey];
+            return cellEl.getBoundingClientRect().bottom - fcContainerEl.getBoundingClientRect().top;
+        };
+        TableRow.prototype.getCellEls = function () {
+            var elMap = this.cellElRefs.currentMap;
+            return this.props.cells.map(function (cell) { return elMap[cell.key]; });
+        };
+        return TableRow;
+    }(DateComponent));
+    TableRow.addStateEquality({
+        segHeights: isPropsEqual
+    });
+
+    var PADDING_FROM_VIEWPORT = 10;
+    var SCROLL_DEBOUNCE = 10;
+    var Popover = /** @class */ (function (_super) {
+        __extends(Popover, _super);
+        function Popover() {
+            var _this = _super !== null && _super.apply(this, arguments) || this;
+            _this.repositioner = new DelayedRunner(_this.updateSize.bind(_this));
+            _this.handleRootEl = function (el) {
+                _this.rootEl = el;
+                if (_this.props.elRef) {
+                    setRef(_this.props.elRef, el);
+                }
+            };
+            // Triggered when the user clicks *anywhere* in the document, for the autoHide feature
+            _this.handleDocumentMousedown = function (ev) {
+                var onClose = _this.props.onClose;
+                // only hide the popover if the click happened outside the popover
+                if (onClose && !_this.rootEl.contains(ev.target)) {
+                    onClose();
+                }
+            };
+            _this.handleDocumentScroll = function () {
+                _this.repositioner.request(SCROLL_DEBOUNCE);
+            };
+            _this.handleCloseClick = function () {
+                var onClose = _this.props.onClose;
+                if (onClose) {
+                    onClose();
+                }
+            };
+            return _this;
+        }
+        Popover.prototype.render = function () {
+            var theme = this.context.theme;
+            var props = this.props;
+            var classNames = [
+                'fc-popover',
+                theme.getClass('popover')
+            ].concat(props.extraClassNames || []);
+            return (createElement("div", __assign({ className: classNames.join(' ') }, props.extraAttrs, { ref: this.handleRootEl }),
+                createElement("div", { className: 'fc-popover-header ' + theme.getClass('popoverHeader') },
+                    createElement("span", { className: 'fc-popover-title' }, props.title),
+                    createElement("span", { className: 'fc-popover-close ' + theme.getIconClass('close'), onClick: this.handleCloseClick })),
+                createElement("div", { className: 'fc-popover-body ' + theme.getClass('popoverContent') }, props.children)));
+        };
+        Popover.prototype.componentDidMount = function () {
+            document.addEventListener('mousedown', this.handleDocumentMousedown);
+            document.addEventListener('scroll', this.handleDocumentScroll);
+            this.updateSize();
+        };
+        Popover.prototype.componentWillUnmount = function () {
+            document.removeEventListener('mousedown', this.handleDocumentMousedown);
+            document.removeEventListener('scroll', this.handleDocumentScroll);
+        };
+        // TODO: adjust on window resize
+        /*
+        NOTE: the popover is position:fixed, so coordinates are relative to the viewport
+        NOTE: the PARENT calls this as well, on window resize. we would have wanted to use the repositioner,
+              but need to ensure that all other components have updated size first (for alignmentEl)
+        */
+        Popover.prototype.updateSize = function () {
+            var _a = this.props, alignmentEl = _a.alignmentEl, topAlignmentEl = _a.topAlignmentEl;
+            var rootEl = this.rootEl;
+            if (!rootEl) {
+                return; // not sure why this was null, but we shouldn't let external components call updateSize() anyway
+            }
+            var dims = rootEl.getBoundingClientRect(); // only used for width,height
+            var alignment = alignmentEl.getBoundingClientRect();
+            var top = topAlignmentEl ? topAlignmentEl.getBoundingClientRect().top : alignment.top;
+            top = Math.min(top, window.innerHeight - dims.height - PADDING_FROM_VIEWPORT);
+            top = Math.max(top, PADDING_FROM_VIEWPORT);
+            var left;
+            if (this.context.isRtl) {
+                left = alignment.right - dims.width;
+            }
+            else {
+                left = alignment.left;
+            }
+            left = Math.min(left, window.innerWidth - dims.width - PADDING_FROM_VIEWPORT);
+            left = Math.max(left, PADDING_FROM_VIEWPORT);
+            applyStyle(rootEl, { top: top, left: left });
+        };
+        return Popover;
+    }(BaseComponent));
+
+    var MorePopover = /** @class */ (function (_super) {
+        __extends(MorePopover, _super);
+        function MorePopover() {
+            var _this = _super !== null && _super.apply(this, arguments) || this;
+            _this.handlePopoverEl = function (popoverEl) {
+                _this.popoverEl = popoverEl;
+                if (popoverEl) {
+                    _this.context.registerInteractiveComponent(_this, {
+                        el: popoverEl,
+                        useEventCenter: false
+                    });
+                }
+                else {
+                    _this.context.unregisterInteractiveComponent(_this);
+                }
+            };
+            return _this;
+        }
+        MorePopover.prototype.render = function () {
+            var _a = this.context, options = _a.options, dateEnv = _a.dateEnv;
+            var props = this.props;
+            var date = props.date, hiddenInstances = props.hiddenInstances, todayRange = props.todayRange, dateProfile = props.dateProfile, selectedInstanceId = props.selectedInstanceId;
+            var title = dateEnv.format(date, options.dayPopoverFormat);
+            return (createElement(DayCellRoot, { date: date, dateProfile: dateProfile, todayRange: todayRange, elRef: this.handlePopoverEl }, function (rootElRef, dayClassNames, dataAttrs) { return (createElement(Popover, { elRef: rootElRef, title: title, extraClassNames: ['fc-more-popover'].concat(dayClassNames), extraAttrs: dataAttrs, onClose: props.onCloseClick, alignmentEl: props.alignmentEl, topAlignmentEl: props.topAlignmentEl },
+                createElement(DayCellContent, { date: date, dateProfile: dateProfile, todayRange: todayRange }, function (innerElRef, innerContent) { return (innerContent &&
+                    createElement("div", { className: 'fc-more-popover-misc', ref: innerElRef }, innerContent)); }),
+                props.segs.map(function (seg) {
+                    var instanceId = seg.eventRange.instance.instanceId;
+                    return (createElement("div", { className: 'fc-daygrid-event-harness', key: instanceId, style: {
+                            visibility: hiddenInstances[instanceId] ? 'hidden' : ''
+                        } }, hasListItemDisplay(seg) ?
+                        createElement(TableListItemEvent, __assign({ seg: seg, isDragging: false, isSelected: instanceId === selectedInstanceId, defaultDisplayEventEnd: false }, getSegMeta(seg, todayRange))) :
+                        createElement(TableBlockEvent, __assign({ seg: seg, isDragging: false, isResizing: false, isDateSelecting: false, isSelected: instanceId === selectedInstanceId, defaultDisplayEventEnd: false }, getSegMeta(seg, todayRange)))));
+                }))); }));
+        };
+        MorePopover.prototype.queryHit = function (positionLeft, positionTop, elWidth, elHeight) {
+            var date = this.props.date;
+            if (positionLeft < elWidth && positionTop < elHeight) {
+                return {
+                    component: this,
+                    dateSpan: {
+                        allDay: true,
+                        range: { start: date, end: addDays(date, 1) }
+                    },
+                    dayEl: this.popoverEl,
+                    rect: {
+                        left: 0,
+                        top: 0,
+                        right: elWidth,
+                        bottom: elHeight
+                    },
+                    layer: 1
+                };
+            }
+        };
+        MorePopover.prototype.isPopover = function () {
+            return true; // gross
+        };
+        return MorePopover;
+    }(DateComponent));
+
+    var Table = /** @class */ (function (_super) {
+        __extends(Table, _super);
+        function Table() {
+            var _this = _super !== null && _super.apply(this, arguments) || this;
+            _this.splitBusinessHourSegs = memoize(splitSegsByRow);
+            _this.splitBgEventSegs = memoize(splitSegsByRow);
+            _this.splitFgEventSegs = memoize(splitSegsByRow);
+            _this.splitDateSelectionSegs = memoize(splitSegsByRow);
+            _this.splitEventDrag = memoize(splitInteractionByRow);
+            _this.splitEventResize = memoize(splitInteractionByRow);
+            _this.buildBuildMoreLinkText = memoize(buildBuildMoreLinkText);
+            _this.rowRefs = new RefMap();
+            _this.state = {
+                morePopoverState: null
+            };
+            _this.handleRootEl = function (rootEl) {
+                _this.rootEl = rootEl;
+                setRef(_this.props.elRef, rootEl);
+            };
+            _this.handleMoreLinkClick = function (arg) {
+                var context = _this.context;
+                var dateEnv = context.dateEnv;
+                var clickOption = context.options.moreLinkClick;
+                function segForPublic(seg) {
+                    var _a = seg.eventRange, def = _a.def, instance = _a.instance, range = _a.range;
+                    return {
+                        event: new EventApi(context, def, instance),
+                        start: dateEnv.toDate(range.start),
+                        end: dateEnv.toDate(range.end),
+                        isStart: seg.isStart,
+                        isEnd: seg.isEnd
+                    };
+                }
+                if (typeof clickOption === 'function') {
+                    clickOption = clickOption({
+                        date: dateEnv.toDate(arg.date),
+                        allDay: true,
+                        allSegs: arg.allSegs.map(segForPublic),
+                        hiddenSegs: arg.hiddenSegs.map(segForPublic),
+                        jsEvent: arg.ev,
+                        view: context.viewApi
+                    }); // hack to handle void
+                }
+                if (!clickOption || clickOption === 'popover') {
+                    _this.setState({
+                        morePopoverState: __assign(__assign({}, arg), { currentFgEventSegs: _this.props.fgEventSegs })
+                    });
+                }
+                else if (typeof clickOption === 'string') { // a view name
+                    context.calendarApi.zoomTo(arg.date, clickOption);
+                }
+            };
+            _this.handleMorePopoverClose = function () {
+                _this.setState({
+                    morePopoverState: null
+                });
+            };
+            return _this;
+        }
+        Table.prototype.render = function () {
+            var _this = this;
+            var props = this.props;
+            var dateProfile = props.dateProfile, dayMaxEventRows = props.dayMaxEventRows, dayMaxEvents = props.dayMaxEvents, expandRows = props.expandRows;
+            var morePopoverState = this.state.morePopoverState;
+            var rowCnt = props.cells.length;
+            var businessHourSegsByRow = this.splitBusinessHourSegs(props.businessHourSegs, rowCnt);
+            var bgEventSegsByRow = this.splitBgEventSegs(props.bgEventSegs, rowCnt);
+            var fgEventSegsByRow = this.splitFgEventSegs(props.fgEventSegs, rowCnt);
+            var dateSelectionSegsByRow = this.splitDateSelectionSegs(props.dateSelectionSegs, rowCnt);
+            var eventDragByRow = this.splitEventDrag(props.eventDrag, rowCnt);
+            var eventResizeByRow = this.splitEventResize(props.eventResize, rowCnt);
+            var buildMoreLinkText = this.buildBuildMoreLinkText(this.context.options.moreLinkText);
+            var limitViaBalanced = dayMaxEvents === true || dayMaxEventRows === true;
+            // if rows can't expand to fill fixed height, can't do balanced-height event limit
+            // TODO: best place to normalize these options?
+            if (limitViaBalanced && !expandRows) {
+                limitViaBalanced = false;
+                dayMaxEventRows = null;
+                dayMaxEvents = null;
+            }
+            var classNames = [
+                'fc-daygrid-body',
+                limitViaBalanced ? 'fc-daygrid-body-balanced' : 'fc-daygrid-body-unbalanced',
+                expandRows ? '' : 'fc-daygrid-body-natural' // will height of one row depend on the others?
+            ];
+            return (createElement("div", { className: classNames.join(' '), ref: this.handleRootEl, style: {
+                    // these props are important to give this wrapper correct dimensions for interactions
+                    // TODO: if we set it here, can we avoid giving to inner tables?
+                    width: props.clientWidth,
+                    minWidth: props.tableMinWidth
+                } },
+                createElement(NowTimer, { unit: 'day' }, function (nowDate, todayRange) { return (createElement(Fragment, null,
+                    createElement("table", { className: 'fc-scrollgrid-sync-table', style: {
+                            width: props.clientWidth,
+                            minWidth: props.tableMinWidth,
+                            height: expandRows ? props.clientHeight : ''
+                        } },
+                        props.colGroupNode,
+                        createElement("tbody", null, props.cells.map(function (cells, row) { return (createElement(TableRow, { ref: _this.rowRefs.createRef(row), key: cells.length
+                                ? cells[0].date.toISOString() /* best? or put key on cell? or use diff formatter? */
+                                : row // in case there are no cells (like when resource view is loading)
+                            , showDayNumbers: rowCnt > 1, showWeekNumbers: props.showWeekNumbers, todayRange: todayRange, dateProfile: dateProfile, cells: cells, renderIntro: props.renderRowIntro, businessHourSegs: businessHourSegsByRow[row], eventSelection: props.eventSelection, bgEventSegs: bgEventSegsByRow[row].filter(isSegAllDay) /* hack */, fgEventSegs: fgEventSegsByRow[row], dateSelectionSegs: dateSelectionSegsByRow[row], eventDrag: eventDragByRow[row], eventResize: eventResizeByRow[row], dayMaxEvents: dayMaxEvents, dayMaxEventRows: dayMaxEventRows, clientWidth: props.clientWidth, clientHeight: props.clientHeight, buildMoreLinkText: buildMoreLinkText, onMoreClick: _this.handleMoreLinkClick })); }))),
+                    (!props.forPrint && morePopoverState && morePopoverState.currentFgEventSegs === props.fgEventSegs) && // clear popover on event mod
+                        createElement(MorePopover, { date: morePopoverState.date, dateProfile: dateProfile, segs: morePopoverState.allSegs, alignmentEl: morePopoverState.dayEl, topAlignmentEl: rowCnt === 1 ? props.headerAlignElRef.current : null, onCloseClick: _this.handleMorePopoverClose, selectedInstanceId: props.eventSelection, hiddenInstances: // yuck
+                            (props.eventDrag ? props.eventDrag.affectedInstances : null) ||
+                                (props.eventResize ? props.eventResize.affectedInstances : null) ||
+                                {}, todayRange: todayRange }))); })));
+        };
+        // Hit System
+        // ----------------------------------------------------------------------------------------------------
+        Table.prototype.prepareHits = function () {
+            this.rowPositions = new PositionCache(this.rootEl, this.rowRefs.collect().map(function (rowObj) { return rowObj.getCellEls()[0]; }), // first cell el in each row. TODO: not optimal
+            false, true // vertical
+            );
+            this.colPositions = new PositionCache(this.rootEl, this.rowRefs.currentMap[0].getCellEls(), // cell els in first row
+            true, // horizontal
+            false);
+        };
+        Table.prototype.positionToHit = function (leftPosition, topPosition) {
+            var _a = this, colPositions = _a.colPositions, rowPositions = _a.rowPositions;
+            var col = colPositions.leftToIndex(leftPosition);
+            var row = rowPositions.topToIndex(topPosition);
+            if (row != null && col != null) {
+                return {
+                    row: row,
+                    col: col,
+                    dateSpan: {
+                        range: this.getCellRange(row, col),
+                        allDay: true
+                    },
+                    dayEl: this.getCellEl(row, col),
+                    relativeRect: {
+                        left: colPositions.lefts[col],
+                        right: colPositions.rights[col],
+                        top: rowPositions.tops[row],
+                        bottom: rowPositions.bottoms[row]
+                    }
+                };
+            }
+        };
+        Table.prototype.getCellEl = function (row, col) {
+            return this.rowRefs.currentMap[row].getCellEls()[col]; // TODO: not optimal
+        };
+        Table.prototype.getCellRange = function (row, col) {
+            var start = this.props.cells[row][col].date;
+            var end = addDays(start, 1);
+            return { start: start, end: end };
+        };
+        return Table;
+    }(DateComponent));
+    function buildBuildMoreLinkText(moreLinkTextInput) {
+        if (typeof moreLinkTextInput === 'function') {
+            return moreLinkTextInput;
+        }
+        else {
+            return function (num) {
+                return "+" + num + " " + moreLinkTextInput;
+            };
+        }
+    }
+    function isSegAllDay(seg) {
+        return seg.eventRange.def.allDay;
+    }
+
+    var DayTable = /** @class */ (function (_super) {
+        __extends(DayTable, _super);
+        function DayTable() {
+            var _this = _super !== null && _super.apply(this, arguments) || this;
+            _this.slicer = new DayTableSlicer();
+            _this.tableRef = createRef();
+            _this.handleRootEl = function (rootEl) {
+                if (rootEl) {
+                    _this.context.registerInteractiveComponent(_this, { el: rootEl });
+                }
+                else {
+                    _this.context.unregisterInteractiveComponent(_this);
+                }
+            };
+            return _this;
+        }
+        DayTable.prototype.render = function () {
+            var _a = this, props = _a.props, context = _a.context;
+            return (createElement(Table, __assign({ ref: this.tableRef, elRef: this.handleRootEl }, this.slicer.sliceProps(props, props.dateProfile, props.nextDayThreshold, context, props.dayTableModel), { dateProfile: props.dateProfile, cells: props.dayTableModel.cells, colGroupNode: props.colGroupNode, tableMinWidth: props.tableMinWidth, renderRowIntro: props.renderRowIntro, dayMaxEvents: props.dayMaxEvents, dayMaxEventRows: props.dayMaxEventRows, showWeekNumbers: props.showWeekNumbers, expandRows: props.expandRows, headerAlignElRef: props.headerAlignElRef, clientWidth: props.clientWidth, clientHeight: props.clientHeight, forPrint: props.forPrint })));
+        };
+        DayTable.prototype.prepareHits = function () {
+            this.tableRef.current.prepareHits();
+        };
+        DayTable.prototype.queryHit = function (positionLeft, positionTop) {
+            var rawHit = this.tableRef.current.positionToHit(positionLeft, positionTop);
+            if (rawHit) {
+                return {
+                    component: this,
+                    dateSpan: rawHit.dateSpan,
+                    dayEl: rawHit.dayEl,
+                    rect: {
+                        left: rawHit.relativeRect.left,
+                        right: rawHit.relativeRect.right,
+                        top: rawHit.relativeRect.top,
+                        bottom: rawHit.relativeRect.bottom
+                    },
+                    layer: 0
+                };
+            }
+        };
+        return DayTable;
+    }(DateComponent));
+    var DayTableSlicer = /** @class */ (function (_super) {
+        __extends(DayTableSlicer, _super);
+        function DayTableSlicer() {
+            var _this = _super !== null && _super.apply(this, arguments) || this;
+            _this.forceDayIfListItem = true;
+            return _this;
+        }
+        DayTableSlicer.prototype.sliceRange = function (dateRange, dayTableModel) {
+            return dayTableModel.sliceRange(dateRange);
+        };
+        return DayTableSlicer;
+    }(Slicer));
+
+    var DayTableView = /** @class */ (function (_super) {
+        __extends(DayTableView, _super);
+        function DayTableView() {
+            var _this = _super !== null && _super.apply(this, arguments) || this;
+            _this.buildDayTableModel = memoize(buildDayTableModel);
+            _this.headerRef = createRef();
+            _this.tableRef = createRef();
+            return _this;
+        }
+        DayTableView.prototype.render = function () {
+            var _this = this;
+            var _a = this.context, options = _a.options, dateProfileGenerator = _a.dateProfileGenerator;
+            var props = this.props;
+            var dayTableModel = this.buildDayTableModel(props.dateProfile, dateProfileGenerator);
+            var headerContent = options.dayHeaders &&
+                createElement(DayHeader, { ref: this.headerRef, dateProfile: props.dateProfile, dates: dayTableModel.headerDates, datesRepDistinctDays: dayTableModel.rowCnt === 1 });
+            var bodyContent = function (contentArg) { return (createElement(DayTable, { ref: _this.tableRef, dateProfile: props.dateProfile, dayTableModel: dayTableModel, businessHours: props.businessHours, dateSelection: props.dateSelection, eventStore: props.eventStore, eventUiBases: props.eventUiBases, eventSelection: props.eventSelection, eventDrag: props.eventDrag, eventResize: props.eventResize, nextDayThreshold: options.nextDayThreshold, colGroupNode: contentArg.tableColGroupNode, tableMinWidth: contentArg.tableMinWidth, dayMaxEvents: options.dayMaxEvents, dayMaxEventRows: options.dayMaxEventRows, showWeekNumbers: options.weekNumbers, expandRows: !props.isHeightAuto, headerAlignElRef: _this.headerElRef, clientWidth: contentArg.clientWidth, clientHeight: contentArg.clientHeight, forPrint: props.forPrint })); };
+            return options.dayMinWidth
+                ? this.renderHScrollLayout(headerContent, bodyContent, dayTableModel.colCnt, options.dayMinWidth)
+                : this.renderSimpleLayout(headerContent, bodyContent);
+        };
+        return DayTableView;
+    }(TableView));
+    function buildDayTableModel(dateProfile, dateProfileGenerator) {
+        var daySeries = new DaySeriesModel(dateProfile.renderRange, dateProfileGenerator);
+        return new DayTableModel(daySeries, /year|month|week/.test(dateProfile.currentRangeUnit));
+    }
+
+    var TableDateProfileGenerator = /** @class */ (function (_super) {
+        __extends(TableDateProfileGenerator, _super);
+        function TableDateProfileGenerator() {
+            return _super !== null && _super.apply(this, arguments) || this;
+        }
+        // Computes the date range that will be rendered.
+        TableDateProfileGenerator.prototype.buildRenderRange = function (currentRange, currentRangeUnit, isRangeAllDay) {
+            var dateEnv = this.props.dateEnv;
+            var renderRange = _super.prototype.buildRenderRange.call(this, currentRange, currentRangeUnit, isRangeAllDay);
+            var start = renderRange.start;
+            var end = renderRange.end;
+            var endOfWeek;
+            // year and month views should be aligned with weeks. this is already done for week
+            if (/^(year|month)$/.test(currentRangeUnit)) {
+                start = dateEnv.startOfWeek(start);
+                // make end-of-week if not already
+                endOfWeek = dateEnv.startOfWeek(end);
+                if (endOfWeek.valueOf() !== end.valueOf()) {
+                    end = addWeeks(endOfWeek, 1);
+                }
+            }
+            // ensure 6 weeks
+            if (this.props.monthMode &&
+                this.props.fixedWeekCount) {
+                var rowCnt = Math.ceil(// could be partial weeks due to hiddenDays
+                diffWeeks(start, end));
+                end = addWeeks(end, 6 - rowCnt);
+            }
+            return { start: start, end: end };
+        };
+        return TableDateProfileGenerator;
+    }(DateProfileGenerator));
+
+    var OPTION_REFINERS = {
+        moreLinkClick: identity,
+        moreLinkClassNames: identity,
+        moreLinkContent: identity,
+        moreLinkDidMount: identity,
+        moreLinkWillUnmount: identity,
+    };
+
+    var dayGridPlugin = createPlugin({
+        initialView: 'dayGridMonth',
+        optionRefiners: OPTION_REFINERS,
+        views: {
+            dayGrid: {
+                component: DayTableView,
+                dateProfileGeneratorClass: TableDateProfileGenerator
+            },
+            dayGridDay: {
+                type: 'dayGrid',
+                duration: { days: 1 }
+            },
+            dayGridWeek: {
+                type: 'dayGrid',
+                duration: { weeks: 1 }
+            },
+            dayGridMonth: {
+                type: 'dayGrid',
+                duration: { months: 1 },
+                monthMode: true,
+                fixedWeekCount: true
+            }
+        }
+    });
+
+    var AllDaySplitter = /** @class */ (function (_super) {
+        __extends(AllDaySplitter, _super);
+        function AllDaySplitter() {
+            return _super !== null && _super.apply(this, arguments) || this;
+        }
+        AllDaySplitter.prototype.getKeyInfo = function () {
+            return {
+                allDay: {},
+                timed: {}
+            };
+        };
+        AllDaySplitter.prototype.getKeysForDateSpan = function (dateSpan) {
+            if (dateSpan.allDay) {
+                return ['allDay'];
+            }
+            else {
+                return ['timed'];
+            }
+        };
+        AllDaySplitter.prototype.getKeysForEventDef = function (eventDef) {
+            if (!eventDef.allDay) {
+                return ['timed'];
+            }
+            else if (hasBgRendering(eventDef)) {
+                return ['timed', 'allDay'];
+            }
+            else {
+                return ['allDay'];
+            }
+        };
+        return AllDaySplitter;
+    }(Splitter));
+
+    var TimeColsSlatsCoords = /** @class */ (function () {
+        function TimeColsSlatsCoords(positions, dateProfile, slatMetas) {
+            this.positions = positions;
+            this.dateProfile = dateProfile;
+            this.slatMetas = slatMetas;
+        }
+        TimeColsSlatsCoords.prototype.safeComputeTop = function (date) {
+            var dateProfile = this.dateProfile;
+            if (rangeContainsMarker(dateProfile.currentRange, date)) {
+                var startOfDayDate = startOfDay(date);
+                var timeMs = date.valueOf() - startOfDayDate.valueOf();
+                if (timeMs >= asRoughMs(dateProfile.slotMinTime) &&
+                    timeMs < asRoughMs(dateProfile.slotMaxTime)) {
+                    return this.computeTimeTop(createDuration(timeMs));
+                }
+            }
+        };
+        // Computes the top coordinate, relative to the bounds of the grid, of the given date.
+        // A `startOfDayDate` must be given for avoiding ambiguity over how to treat midnight.
+        TimeColsSlatsCoords.prototype.computeDateTop = function (when, startOfDayDate) {
+            if (!startOfDayDate) {
+                startOfDayDate = startOfDay(when);
+            }
+            return this.computeTimeTop(createDuration(when.valueOf() - startOfDayDate.valueOf()));
+        };
+        // Computes the top coordinate, relative to the bounds of the grid, of the given time (a Duration).
+        // This is a makeshify way to compute the time-top. Assumes all slatMetas dates are uniform.
+        // Eventually allow computation with arbirary slat dates.
+        TimeColsSlatsCoords.prototype.computeTimeTop = function (duration) {
+            var _a = this, positions = _a.positions, dateProfile = _a.dateProfile, slatMetas = _a.slatMetas;
+            var len = positions.els.length;
+            var slotDurationMs = slatMetas[1].date.valueOf() - slatMetas[0].date.valueOf(); // we assume dates are uniform
+            var slatCoverage = (duration.milliseconds - asRoughMs(dateProfile.slotMinTime)) / slotDurationMs; // floating-point value of # of slots covered
+            var slatIndex;
+            var slatRemainder;
+            // compute a floating-point number for how many slats should be progressed through.
+            // from 0 to number of slats (inclusive)
+            // constrained because slotMinTime/slotMaxTime might be customized.
+            slatCoverage = Math.max(0, slatCoverage);
+            slatCoverage = Math.min(len, slatCoverage);
+            // an integer index of the furthest whole slat
+            // from 0 to number slats (*exclusive*, so len-1)
+            slatIndex = Math.floor(slatCoverage);
+            slatIndex = Math.min(slatIndex, len - 1);
+            // how much further through the slatIndex slat (from 0.0-1.0) must be covered in addition.
+            // could be 1.0 if slatCoverage is covering *all* the slots
+            slatRemainder = slatCoverage - slatIndex;
+            return positions.tops[slatIndex] +
+                positions.getHeight(slatIndex) * slatRemainder;
+        };
+        return TimeColsSlatsCoords;
+    }());
+
+    // potential nice values for the slot-duration and interval-duration
+    // from largest to smallest
+    var STOCK_SUB_DURATIONS = [
+        { hours: 1 },
+        { minutes: 30 },
+        { minutes: 15 },
+        { seconds: 30 },
+        { seconds: 15 }
+    ];
+    /*
+    for the horizontal "slats" that run width-wise. Has a time axis on a side. Depends on RTL.
+    */
+    var TimeColsSlats = /** @class */ (function (_super) {
+        __extends(TimeColsSlats, _super);
+        function TimeColsSlats() {
+            var _this = _super !== null && _super.apply(this, arguments) || this;
+            _this.rootElRef = createRef();
+            _this.slatElRefs = new RefMap();
+            return _this;
+        }
+        TimeColsSlats.prototype.render = function () {
+            var _a = this, props = _a.props, context = _a.context;
+            return (createElement("div", { className: 'fc-timegrid-slots', ref: this.rootElRef },
+                createElement("table", { className: context.theme.getClass('table'), style: {
+                        minWidth: props.tableMinWidth,
+                        width: props.clientWidth,
+                        height: props.minHeight
+                    } },
+                    props.tableColGroupNode /* relies on there only being a single <col> for the axis */,
+                    createElement(TimeColsSlatsBody, { slatElRefs: this.slatElRefs, axis: props.axis, slatMetas: props.slatMetas }))));
+        };
+        TimeColsSlats.prototype.componentDidMount = function () {
+            this.updateSizing();
+        };
+        TimeColsSlats.prototype.componentDidUpdate = function () {
+            this.updateSizing();
+        };
+        TimeColsSlats.prototype.componentWillUnmount = function () {
+            if (this.props.onCoords) {
+                this.props.onCoords(null);
+            }
+        };
+        TimeColsSlats.prototype.updateSizing = function () {
+            var props = this.props;
+            if (props.onCoords &&
+                props.clientWidth !== null // means sizing has stabilized
+            ) {
+                var rootEl = this.rootElRef.current;
+                if (rootEl.offsetHeight) { // not hidden by css
+                    props.onCoords(new TimeColsSlatsCoords(new PositionCache(this.rootElRef.current, collectSlatEls(this.slatElRefs.currentMap, props.slatMetas), false, true // vertical
+                    ), this.props.dateProfile, props.slatMetas));
+                }
+            }
+        };
+        return TimeColsSlats;
+    }(BaseComponent));
+    function collectSlatEls(elMap, slatMetas) {
+        return slatMetas.map(function (slatMeta) { return elMap[slatMeta.key]; });
+    }
+    var TimeColsSlatsBody = /** @class */ (function (_super) {
+        __extends(TimeColsSlatsBody, _super);
+        function TimeColsSlatsBody() {
+            return _super !== null && _super.apply(this, arguments) || this;
+        }
+        TimeColsSlatsBody.prototype.render = function () {
+            var _a = this, props = _a.props, context = _a.context;
+            var options = context.options;
+            var slatElRefs = props.slatElRefs;
+            return (createElement("tbody", null, props.slatMetas.map(function (slatMeta, i) {
+                var hookProps = {
+                    time: slatMeta.time,
+                    date: context.dateEnv.toDate(slatMeta.date),
+                    view: context.viewApi
+                };
+                var classNames = [
+                    'fc-timegrid-slot',
+                    'fc-timegrid-slot-lane',
+                    slatMeta.isLabeled ? '' : 'fc-timegrid-slot-minor'
+                ];
+                return (createElement("tr", { key: slatMeta.key, ref: slatElRefs.createRef(slatMeta.key) },
+                    props.axis &&
+                        createElement(TimeColsAxisCell, __assign({}, slatMeta)),
+                    createElement(RenderHook, { hookProps: hookProps, classNames: options.slotLaneClassNames, content: options.slotLaneContent, didMount: options.slotLaneDidMount, willUnmount: options.slotLaneWillUnmount }, function (rootElRef, customClassNames, innerElRef, innerContent) { return (createElement("td", { ref: rootElRef, className: classNames.concat(customClassNames).join(' '), "data-time": slatMeta.isoTimeStr }, innerContent)); })));
+            })));
+        };
+        return TimeColsSlatsBody;
+    }(BaseComponent));
+    var DEFAULT_SLAT_LABEL_FORMAT = createFormatter({
+        hour: 'numeric',
+        minute: '2-digit',
+        omitZeroMinute: true,
+        meridiem: 'short'
+    });
+    function TimeColsAxisCell(props) {
+        var classNames = [
+            'fc-timegrid-slot',
+            'fc-timegrid-slot-label',
+            props.isLabeled ? 'fc-scrollgrid-shrink' : 'fc-timegrid-slot-minor'
+        ];
+        return (createElement(ViewContextType.Consumer, null, function (context) {
+            if (!props.isLabeled) {
+                return (createElement("td", { className: classNames.join(' '), "data-time": props.isoTimeStr }));
+            }
+            else {
+                var dateEnv = context.dateEnv, options = context.options, viewApi = context.viewApi;
+                var labelFormat = // TODO: fully pre-parse
+                 options.slotLabelFormat == null ? DEFAULT_SLAT_LABEL_FORMAT :
+                    Array.isArray(options.slotLabelFormat) ? createFormatter(options.slotLabelFormat[0]) :
+                        createFormatter(options.slotLabelFormat);
+                var hookProps = {
+                    time: props.time,
+                    date: dateEnv.toDate(props.date),
+                    view: viewApi,
+                    text: dateEnv.format(props.date, labelFormat)
+                };
+                return (createElement(RenderHook, { hookProps: hookProps, classNames: options.slotLabelClassNames, content: options.slotLabelContent, defaultContent: renderInnerContent$3, didMount: options.slotLabelDidMount, willUnmount: options.slotLabelWillUnmount }, function (rootElRef, customClassNames, innerElRef, innerContent) { return (createElement("td", { ref: rootElRef, className: classNames.concat(customClassNames).join(' '), "data-time": props.isoTimeStr },
+                    createElement("div", { className: 'fc-timegrid-slot-label-frame fc-scrollgrid-shrink-frame' },
+                        createElement("div", { className: 'fc-timegrid-slot-label-cushion fc-scrollgrid-shrink-cushion', ref: innerElRef }, innerContent)))); }));
+            }
+        }));
+    }
+    function renderInnerContent$3(props) {
+        return props.text;
+    }
+    function buildSlatMetas(slotMinTime, slotMaxTime, explicitLabelInterval, slotDuration, dateEnv) {
+        var dayStart = new Date(0);
+        var slatTime = slotMinTime;
+        var slatIterator = createDuration(0);
+        var labelInterval = explicitLabelInterval || computeLabelInterval(slotDuration);
+        var metas = [];
+        while (asRoughMs(slatTime) < asRoughMs(slotMaxTime)) {
+            var date = dateEnv.add(dayStart, slatTime);
+            var isLabeled = wholeDivideDurations(slatIterator, labelInterval) !== null;
+            metas.push({
+                date: date,
+                time: slatTime,
+                key: date.toISOString(),
+                isoTimeStr: formatIsoTimeString(date),
+                isLabeled: isLabeled
+            });
+            slatTime = addDurations(slatTime, slotDuration);
+            slatIterator = addDurations(slatIterator, slotDuration);
+        }
+        return metas;
+    }
+    // Computes an automatic value for slotLabelInterval
+    function computeLabelInterval(slotDuration) {
+        var i;
+        var labelInterval;
+        var slotsPerLabel;
+        // find the smallest stock label interval that results in more than one slots-per-label
+        for (i = STOCK_SUB_DURATIONS.length - 1; i >= 0; i--) {
+            labelInterval = createDuration(STOCK_SUB_DURATIONS[i]);
+            slotsPerLabel = wholeDivideDurations(labelInterval, slotDuration);
+            if (slotsPerLabel !== null && slotsPerLabel > 1) {
+                return labelInterval;
+            }
+        }
+        return slotDuration; // fall back
+    }
+
+    var DEFAULT_WEEK_NUM_FORMAT$1 = createFormatter({ week: 'short' });
+    var AUTO_ALL_DAY_MAX_EVENT_ROWS = 5;
+    var TimeColsView = /** @class */ (function (_super) {
+        __extends(TimeColsView, _super);
+        function TimeColsView() {
+            var _this = _super !== null && _super.apply(this, arguments) || this;
+            _this.allDaySplitter = new AllDaySplitter(); // for use by subclasses
+            _this.headerElRef = createRef();
+            _this.rootElRef = createRef();
+            _this.scrollerElRef = createRef();
+            _this.state = {
+                slatCoords: null
+            };
+            _this.handleScrollTopRequest = function (scrollTop) {
+                var scrollerEl = _this.scrollerElRef.current;
+                if (scrollerEl) { // TODO: not sure how this could ever be null. weirdness with the reducer
+                    scrollerEl.scrollTop = scrollTop;
+                }
+            };
+            /* Header Render Methods
+            ------------------------------------------------------------------------------------------------------------------*/
+            _this.renderHeadAxis = function (frameHeight) {
+                if (frameHeight === void 0) { frameHeight = ''; }
+                var options = _this.context.options;
+                var dateProfile = _this.props.dateProfile;
+                var range = dateProfile.renderRange;
+                var dayCnt = diffDays(range.start, range.end);
+                var navLinkAttrs = (options.navLinks && dayCnt === 1) // only do in day views (to avoid doing in week views that dont need it)
+                    ? { 'data-navlink': buildNavLinkData(range.start, 'week'), tabIndex: 0 }
+                    : {};
+                if (options.weekNumbers) {
+                    return (createElement(WeekNumberRoot, { date: range.start, defaultFormat: DEFAULT_WEEK_NUM_FORMAT$1 }, function (rootElRef, classNames, innerElRef, innerContent) { return (createElement("th", { ref: rootElRef, className: [
+                            'fc-timegrid-axis',
+                            'fc-scrollgrid-shrink'
+                        ].concat(classNames).join(' ') },
+                        createElement("div", { className: 'fc-timegrid-axis-frame fc-scrollgrid-shrink-frame fc-timegrid-axis-frame-liquid', style: { height: frameHeight } },
+                            createElement("a", __assign({ ref: innerElRef, className: 'fc-timegrid-axis-cushion fc-scrollgrid-shrink-cushion' }, navLinkAttrs), innerContent)))); }));
+                }
+                return (createElement("th", { className: 'fc-timegrid-axis' },
+                    createElement("div", { className: 'fc-timegrid-axis-frame', style: { height: frameHeight } })));
+            };
+            /* Table Component Render Methods
+            ------------------------------------------------------------------------------------------------------------------*/
+            // only a one-way height sync. we don't send the axis inner-content height to the DayGrid,
+            // but DayGrid still needs to have classNames on inner elements in order to measure.
+            _this.renderTableRowAxis = function (rowHeight) {
+                var _a = _this.context, options = _a.options, viewApi = _a.viewApi;
+                var hookProps = {
+                    text: options.allDayText,
+                    view: viewApi
+                };
+                return (
+                // TODO: make reusable hook. used in list view too
+                createElement(RenderHook, { hookProps: hookProps, classNames: options.allDayClassNames, content: options.allDayContent, defaultContent: renderAllDayInner, didMount: options.allDayDidMount, willUnmount: options.allDayWillUnmount }, function (rootElRef, classNames, innerElRef, innerContent) { return (createElement("td", { ref: rootElRef, className: [
+                        'fc-timegrid-axis',
+                        'fc-scrollgrid-shrink'
+                    ].concat(classNames).join(' ') },
+                    createElement("div", { className: 'fc-timegrid-axis-frame fc-scrollgrid-shrink-frame' + (rowHeight == null ? ' fc-timegrid-axis-frame-liquid' : ''), style: { height: rowHeight } },
+                        createElement("span", { className: 'fc-timegrid-axis-cushion fc-scrollgrid-shrink-cushion', ref: innerElRef }, innerContent)))); }));
+            };
+            _this.handleSlatCoords = function (slatCoords) {
+                _this.setState({ slatCoords: slatCoords });
+            };
+            return _this;
+        }
+        // rendering
+        // ----------------------------------------------------------------------------------------------------
+        TimeColsView.prototype.renderSimpleLayout = function (headerRowContent, allDayContent, timeContent) {
+            var _a = this, context = _a.context, props = _a.props;
+            var sections = [];
+            var stickyHeaderDates = getStickyHeaderDates(context.options);
+            if (headerRowContent) {
+                sections.push({
+                    type: 'header',
+                    key: 'header',
+                    isSticky: stickyHeaderDates,
+                    chunk: {
+                        elRef: this.headerElRef,
+                        tableClassName: 'fc-col-header',
+                        rowContent: headerRowContent
+                    }
+                });
+            }
+            if (allDayContent) {
+                sections.push({
+                    type: 'body',
+                    key: 'all-day',
+                    chunk: { content: allDayContent }
+                });
+                sections.push({
+                    type: 'body',
+                    key: 'all-day-divider',
+                    outerContent: ( // TODO: rename to cellContent so don't need to define <tr>?
+                    createElement("tr", { className: 'fc-scrollgrid-section' },
+                        createElement("td", { className: 'fc-timegrid-divider ' + context.theme.getClass('tableCellShaded') })))
+                });
+            }
+            sections.push({
+                type: 'body',
+                key: 'body',
+                liquid: true,
+                expandRows: Boolean(context.options.expandRows),
+                chunk: {
+                    scrollerElRef: this.scrollerElRef,
+                    content: timeContent
+                }
+            });
+            return (createElement(ViewRoot, { viewSpec: context.viewSpec, elRef: this.rootElRef }, function (rootElRef, classNames) { return (createElement("div", { className: ['fc-timegrid'].concat(classNames).join(' '), ref: rootElRef },
+                createElement(SimpleScrollGrid, { liquid: !props.isHeightAuto && !props.forPrint, cols: [{ width: 'shrink' }], sections: sections }))); }));
+        };
+        TimeColsView.prototype.renderHScrollLayout = function (headerRowContent, allDayContent, timeContent, colCnt, dayMinWidth, slatMetas, slatCoords // yuck
+        ) {
+            var _this = this;
+            var ScrollGrid = this.context.pluginHooks.scrollGridImpl;
+            if (!ScrollGrid) {
+                throw new Error('No ScrollGrid implementation');
+            }
+            var _a = this, context = _a.context, props = _a.props;
+            var stickyHeaderDates = !props.forPrint && getStickyHeaderDates(context.options);
+            var stickyFooterScrollbar = !props.forPrint && getStickyFooterScrollbar(context.options);
+            var sections = [];
+            if (headerRowContent) {
+                sections.push({
+                    type: 'header',
+                    key: 'header',
+                    isSticky: stickyHeaderDates,
+                    syncRowHeights: true,
+                    chunks: [
+                        {
+                            key: 'axis',
+                            rowContent: function (arg) { return (createElement("tr", null, _this.renderHeadAxis(arg.rowSyncHeights[0]))); }
+                        },
+                        {
+                            key: 'cols',
+                            elRef: this.headerElRef,
+                            tableClassName: 'fc-col-header',
+                            rowContent: headerRowContent
+                        }
+                    ]
+                });
+            }
+            if (allDayContent) {
+                sections.push({
+                    type: 'body',
+                    key: 'all-day',
+                    syncRowHeights: true,
+                    chunks: [
+                        {
+                            key: 'axis',
+                            rowContent: function (contentArg) { return (createElement("tr", null, _this.renderTableRowAxis(contentArg.rowSyncHeights[0]))); },
+                        },
+                        {
+                            key: 'cols',
+                            content: allDayContent
+                        }
+                    ]
+                });
+                sections.push({
+                    key: 'all-day-divider',
+                    type: 'body',
+                    outerContent: ( // TODO: rename to cellContent so don't need to define <tr>?
+                    createElement("tr", { className: 'fc-scrollgrid-section' },
+                        createElement("td", { colSpan: 2, className: 'fc-timegrid-divider ' + context.theme.getClass('tableCellShaded') })))
+                });
+            }
+            var isNowIndicator = context.options.nowIndicator;
+            sections.push({
+                type: 'body',
+                key: 'body',
+                liquid: true,
+                expandRows: Boolean(context.options.expandRows),
+                chunks: [
+                    {
+                        key: 'axis',
+                        content: function (arg) {
+                            // TODO: make this now-indicator arrow more DRY with TimeColsContent
+                            return (createElement("div", { className: 'fc-timegrid-axis-chunk' },
+                                createElement("table", null,
+                                    arg.tableColGroupNode,
+                                    createElement("tbody", null,
+                                        createElement(TimeBodyAxis, { slatMetas: slatMetas }))),
+                                createElement("div", { className: 'fc-timegrid-now-indicator-container' },
+                                    createElement(NowTimer, { unit: isNowIndicator ? 'minute' : 'day' /* hacky */ }, function (nowDate) {
+                                        var nowIndicatorTop = isNowIndicator &&
+                                            slatCoords &&
+                                            slatCoords.safeComputeTop(nowDate); // might return void
+                                        if (typeof nowIndicatorTop === 'number') {
+                                            return (createElement(NowIndicatorRoot, { isAxis: true, date: nowDate }, function (rootElRef, classNames, innerElRef, innerContent) { return (createElement("div", { ref: rootElRef, className: ['fc-timegrid-now-indicator-arrow'].concat(classNames).join(' '), style: { top: nowIndicatorTop } }, innerContent)); }));
+                                        }
+                                    }))));
+                        }
+                    },
+                    {
+                        key: 'cols',
+                        scrollerElRef: this.scrollerElRef,
+                        content: timeContent
+                    }
+                ]
+            });
+            if (stickyFooterScrollbar) {
+                sections.push({
+                    key: 'footer',
+                    type: 'footer',
+                    isSticky: true,
+                    chunks: [
+                        {
+                            key: 'axis',
+                            content: renderScrollShim
+                        },
+                        {
+                            key: 'cols',
+                            content: renderScrollShim
+                        }
+                    ]
+                });
+            }
+            return (createElement(ViewRoot, { viewSpec: context.viewSpec, elRef: this.rootElRef }, function (rootElRef, classNames) { return (createElement("div", { className: ['fc-timegrid'].concat(classNames).join(' '), ref: rootElRef },
+                createElement(ScrollGrid, { liquid: !props.isHeightAuto && !props.forPrint, colGroups: [
+                        { width: 'shrink', cols: [{ width: 'shrink' }] },
+                        { cols: [{ span: colCnt, minWidth: dayMinWidth }] }
+                    ], sections: sections }))); }));
+        };
+        /* Dimensions
+        ------------------------------------------------------------------------------------------------------------------*/
+        TimeColsView.prototype.getAllDayMaxEventProps = function () {
+            var _a = this.context.options, dayMaxEvents = _a.dayMaxEvents, dayMaxEventRows = _a.dayMaxEventRows;
+            if (dayMaxEvents === true || dayMaxEventRows === true) { // is auto?
+                dayMaxEvents = undefined;
+                dayMaxEventRows = AUTO_ALL_DAY_MAX_EVENT_ROWS; // make sure "auto" goes to a real number
+            }
+            return { dayMaxEvents: dayMaxEvents, dayMaxEventRows: dayMaxEventRows };
+        };
+        return TimeColsView;
+    }(DateComponent));
+    function renderAllDayInner(hookProps) {
+        return hookProps.text;
+    }
+    var TimeBodyAxis = /** @class */ (function (_super) {
+        __extends(TimeBodyAxis, _super);
+        function TimeBodyAxis() {
+            return _super !== null && _super.apply(this, arguments) || this;
+        }
+        TimeBodyAxis.prototype.render = function () {
+            return this.props.slatMetas.map(function (slatMeta) { return (createElement("tr", { key: slatMeta.key },
+                createElement(TimeColsAxisCell, __assign({}, slatMeta)))); });
+        };
+        return TimeBodyAxis;
+    }(BaseComponent));
+
+    function splitSegsByCol(segs, colCnt) {
+        var segsByCol = [];
+        var i;
+        for (i = 0; i < colCnt; i++) {
+            segsByCol.push([]);
+        }
+        if (segs) {
+            for (i = 0; i < segs.length; i++) {
+                segsByCol[segs[i].col].push(segs[i]);
+            }
+        }
+        return segsByCol;
+    }
+    function splitInteractionByCol(ui, colCnt) {
+        var byRow = [];
+        if (!ui) {
+            for (var i = 0; i < colCnt; i++) {
+                byRow[i] = null;
+            }
+        }
+        else {
+            for (var i = 0; i < colCnt; i++) {
+                byRow[i] = {
+                    affectedInstances: ui.affectedInstances,
+                    isEvent: ui.isEvent,
+                    segs: []
+                };
+            }
+            for (var _i = 0, _a = ui.segs; _i < _a.length; _i++) {
+                var seg = _a[_i];
+                byRow[seg.col].segs.push(seg);
+            }
+        }
+        return byRow;
+    }
+
+    // UNFORTUNATELY, assigns results to the top/bottom/level/forwardCoord/backwardCoord props of the actual segs.
+    // TODO: return hash (by instanceId) of results
+    function computeSegCoords(segs, dayDate, slatCoords, eventMinHeight, eventOrderSpecs) {
+        computeSegVerticals(segs, dayDate, slatCoords, eventMinHeight);
+        return computeSegHorizontals(segs, eventOrderSpecs); // requires top/bottom from computeSegVerticals
+    }
+    // For each segment in an array, computes and assigns its top and bottom properties
+    function computeSegVerticals(segs, dayDate, slatCoords, eventMinHeight) {
+        for (var _i = 0, segs_1 = segs; _i < segs_1.length; _i++) {
+            var seg = segs_1[_i];
+            seg.top = slatCoords.computeDateTop(seg.start, dayDate);
+            seg.bottom = Math.max(seg.top + (eventMinHeight || 0), // yuck
+            slatCoords.computeDateTop(seg.end, dayDate));
+        }
+    }
+    // Given an array of segments that are all in the same column, sets the backwardCoord and forwardCoord on each.
+    // Assumed the segs are already ordered.
+    // NOTE: Also reorders the given array by date!
+    function computeSegHorizontals(segs, eventOrderSpecs) {
+        // IMPORTANT TO CLEAR OLD RESULTS :(
+        for (var _i = 0, segs_2 = segs; _i < segs_2.length; _i++) {
+            var seg = segs_2[_i];
+            seg.level = null;
+            seg.forwardCoord = null;
+            seg.backwardCoord = null;
+            seg.forwardPressure = null;
+        }
+        segs = sortEventSegs(segs, eventOrderSpecs);
+        var level0;
+        var levels = buildSlotSegLevels(segs);
+        computeForwardSlotSegs(levels);
+        if ((level0 = levels[0])) {
+            for (var _a = 0, level0_1 = level0; _a < level0_1.length; _a++) {
+                var seg = level0_1[_a];
+                computeSlotSegPressures(seg);
+            }
+            for (var _b = 0, level0_2 = level0; _b < level0_2.length; _b++) {
+                var seg = level0_2[_b];
+                computeSegForwardBack(seg, 0, 0, eventOrderSpecs);
+            }
+        }
+        return segs;
+    }
+    // Builds an array of segments "levels". The first level will be the leftmost tier of segments if the calendar is
+    // left-to-right, or the rightmost if the calendar is right-to-left. Assumes the segments are already ordered by date.
+    function buildSlotSegLevels(segs) {
+        var levels = [];
+        var i;
+        var seg;
+        var j;
+        for (i = 0; i < segs.length; i++) {
+            seg = segs[i];
+            // go through all the levels and stop on the first level where there are no collisions
+            for (j = 0; j < levels.length; j++) {
+                if (!computeSlotSegCollisions(seg, levels[j]).length) {
+                    break;
+                }
+            }
+            seg.level = j;
+            (levels[j] || (levels[j] = [])).push(seg);
+        }
+        return levels;
+    }
+    // Find all the segments in `otherSegs` that vertically collide with `seg`.
+    // Append into an optionally-supplied `results` array and return.
+    function computeSlotSegCollisions(seg, otherSegs, results) {
+        if (results === void 0) { results = []; }
+        for (var i = 0; i < otherSegs.length; i++) {
+            if (isSlotSegCollision(seg, otherSegs[i])) {
+                results.push(otherSegs[i]);
+            }
+        }
+        return results;
+    }
+    // Do these segments occupy the same vertical space?
+    function isSlotSegCollision(seg1, seg2) {
+        return seg1.bottom > seg2.top && seg1.top < seg2.bottom;
+    }
+    // For every segment, figure out the other segments that are in subsequent
+    // levels that also occupy the same vertical space. Accumulate in seg.forwardSegs
+    function computeForwardSlotSegs(levels) {
+        var i;
+        var level;
+        var j;
+        var seg;
+        var k;
+        for (i = 0; i < levels.length; i++) {
+            level = levels[i];
+            for (j = 0; j < level.length; j++) {
+                seg = level[j];
+                seg.forwardSegs = [];
+                for (k = i + 1; k < levels.length; k++) {
+                    computeSlotSegCollisions(seg, levels[k], seg.forwardSegs);
+                }
+            }
+        }
+    }
+    // Figure out which path forward (via seg.forwardSegs) results in the longest path until
+    // the furthest edge is reached. The number of segments in this path will be seg.forwardPressure
+    function computeSlotSegPressures(seg) {
+        var forwardSegs = seg.forwardSegs;
+        var forwardPressure = 0;
+        var i;
+        var forwardSeg;
+        if (seg.forwardPressure == null) { // not already computed
+            for (i = 0; i < forwardSegs.length; i++) {
+                forwardSeg = forwardSegs[i];
+                // figure out the child's maximum forward path
+                computeSlotSegPressures(forwardSeg);
+                // either use the existing maximum, or use the child's forward pressure
+                // plus one (for the forwardSeg itself)
+                forwardPressure = Math.max(forwardPressure, 1 + forwardSeg.forwardPressure);
+            }
+            seg.forwardPressure = forwardPressure;
+        }
+    }
+    // Calculate seg.forwardCoord and seg.backwardCoord for the segment, where both values range
+    // from 0 to 1. If the calendar is left-to-right, the seg.backwardCoord maps to "left" and
+    // seg.forwardCoord maps to "right" (via percentage). Vice-versa if the calendar is right-to-left.
+    //
+    // The segment might be part of a "series", which means consecutive segments with the same pressure
+    // who's width is unknown until an edge has been hit. `seriesBackwardPressure` is the number of
+    // segments behind this one in the current series, and `seriesBackwardCoord` is the starting
+    // coordinate of the first segment in the series.
+    function computeSegForwardBack(seg, seriesBackwardPressure, seriesBackwardCoord, eventOrderSpecs) {
+        var forwardSegs = seg.forwardSegs;
+        var i;
+        if (seg.forwardCoord == null) { // not already computed
+            if (!forwardSegs.length) {
+                // if there are no forward segments, this segment should butt up against the edge
+                seg.forwardCoord = 1;
+            }
+            else {
+                // sort highest pressure first
+                sortForwardSegs(forwardSegs, eventOrderSpecs);
+                // this segment's forwardCoord will be calculated from the backwardCoord of the
+                // highest-pressure forward segment.
+                computeSegForwardBack(forwardSegs[0], seriesBackwardPressure + 1, seriesBackwardCoord, eventOrderSpecs);
+                seg.forwardCoord = forwardSegs[0].backwardCoord;
+            }
+            // calculate the backwardCoord from the forwardCoord. consider the series
+            seg.backwardCoord = seg.forwardCoord -
+                (seg.forwardCoord - seriesBackwardCoord) / // available width for series
+                    (seriesBackwardPressure + 1); // # of segments in the series
+            // use this segment's coordinates to computed the coordinates of the less-pressurized
+            // forward segments
+            for (i = 0; i < forwardSegs.length; i++) {
+                computeSegForwardBack(forwardSegs[i], 0, seg.forwardCoord, eventOrderSpecs);
+            }
+        }
+    }
+    function sortForwardSegs(forwardSegs, eventOrderSpecs) {
+        var objs = forwardSegs.map(buildTimeGridSegCompareObj);
+        var specs = [
+            // put higher-pressure first
+            { field: 'forwardPressure', order: -1 },
+            // put segments that are closer to initial edge first (and favor ones with no coords yet)
+            { field: 'backwardCoord', order: 1 }
+        ].concat(eventOrderSpecs);
+        objs.sort(function (obj0, obj1) {
+            return compareByFieldSpecs(obj0, obj1, specs);
+        });
+        return objs.map(function (c) {
+            return c._seg;
+        });
+    }
+    function buildTimeGridSegCompareObj(seg) {
+        var obj = buildSegCompareObj(seg);
+        obj.forwardPressure = seg.forwardPressure;
+        obj.backwardCoord = seg.backwardCoord;
+        return obj;
+    }
+
+    var DEFAULT_TIME_FORMAT = createFormatter({
+        hour: 'numeric',
+        minute: '2-digit',
+        meridiem: false
+    });
+    var TimeColEvent = /** @class */ (function (_super) {
+        __extends(TimeColEvent, _super);
+        function TimeColEvent() {
+            return _super !== null && _super.apply(this, arguments) || this;
+        }
+        TimeColEvent.prototype.render = function () {
+            var classNames = [
+                'fc-timegrid-event',
+                'fc-v-event'
+            ];
+            if (this.props.isCondensed) {
+                classNames.push('fc-timegrid-event-condensed');
+            }
+            return (createElement(StandardEvent, __assign({}, this.props, { defaultTimeFormat: DEFAULT_TIME_FORMAT, extraClassNames: classNames })));
+        };
+        return TimeColEvent;
+    }(BaseComponent));
+
+    config.timeGridEventCondensedHeight = 30;
+    var TimeCol = /** @class */ (function (_super) {
+        __extends(TimeCol, _super);
+        function TimeCol() {
+            return _super !== null && _super.apply(this, arguments) || this;
+        }
+        TimeCol.prototype.render = function () {
+            var _this = this;
+            var _a = this, props = _a.props, context = _a.context;
+            var isSelectMirror = context.options.selectMirror;
+            var mirrorSegs = (props.eventDrag && props.eventDrag.segs) ||
+                (props.eventResize && props.eventResize.segs) ||
+                (isSelectMirror && props.dateSelectionSegs) ||
+                [];
+            var interactionAffectedInstances = // TODO: messy way to compute this
+             (props.eventDrag && props.eventDrag.affectedInstances) ||
+                (props.eventResize && props.eventResize.affectedInstances) ||
+                {};
+            return (createElement(DayCellRoot, { elRef: props.elRef, date: props.date, dateProfile: props.dateProfile, todayRange: props.todayRange, extraHookProps: props.extraHookProps }, function (rootElRef, classNames, dataAttrs) { return (createElement("td", __assign({ ref: rootElRef, className: ['fc-timegrid-col'].concat(classNames, props.extraClassNames || []).join(' ') }, dataAttrs, props.extraDataAttrs),
+                createElement("div", { className: 'fc-timegrid-col-frame' },
+                    createElement("div", { className: 'fc-timegrid-col-bg' },
+                        _this.renderFillSegs(props.businessHourSegs, 'non-business'),
+                        _this.renderFillSegs(props.bgEventSegs, 'bg-event'),
+                        _this.renderFillSegs(props.dateSelectionSegs, 'highlight')),
+                    createElement("div", { className: 'fc-timegrid-col-events' }, _this.renderFgSegs(props.fgEventSegs, interactionAffectedInstances)),
+                    createElement("div", { className: 'fc-timegrid-col-events' }, _this.renderFgSegs(mirrorSegs, {}, Boolean(props.eventDrag), Boolean(props.eventResize), Boolean(isSelectMirror)
+                    // TODO: pass in left/right instead of using only computeSegTopBottomCss
+                    )),
+                    createElement("div", { className: 'fc-timegrid-now-indicator-container' }, _this.renderNowIndicator(props.nowIndicatorSegs)),
+                    createElement(TimeColMisc, { date: props.date, dateProfile: props.dateProfile, todayRange: props.todayRange, extraHookProps: props.extraHookProps })))); }));
+        };
+        TimeCol.prototype.renderFgSegs = function (segs, segIsInvisible, isDragging, isResizing, isDateSelecting) {
+            var props = this.props;
+            if (props.forPrint) {
+                return this.renderPrintFgSegs(segs);
+            }
+            else if (props.slatCoords) {
+                return this.renderPositionedFgSegs(segs, segIsInvisible, isDragging, isResizing, isDateSelecting);
+            }
+        };
+        TimeCol.prototype.renderPrintFgSegs = function (segs) {
+            var props = this.props;
+            return segs.map(function (seg) { return (createElement("div", { className: 'fc-timegrid-event-harness', key: seg.eventRange.instance.instanceId },
+                createElement(TimeColEvent, __assign({ seg: seg, isDragging: false, isResizing: false, isDateSelecting: false, isSelected: false, isCondensed: false }, getSegMeta(seg, props.todayRange, props.nowDate))))); });
+        };
+        TimeCol.prototype.renderPositionedFgSegs = function (segs, segIsInvisible, isDragging, isResizing, isDateSelecting) {
+            var _this = this;
+            var _a = this, context = _a.context, props = _a.props;
+            // assigns TO THE SEGS THEMSELVES
+            // also, receives resorted array
+            segs = computeSegCoords(segs, props.date, props.slatCoords, context.options.eventMinHeight, context.options.eventOrder);
+            return segs.map(function (seg) {
+                var instanceId = seg.eventRange.instance.instanceId;
+                var isMirror = isDragging || isResizing || isDateSelecting;
+                var positionCss = isMirror ? __assign({ left: 0, right: 0 }, _this.computeSegTopBottomCss(seg)) :
+                    _this.computeFgSegPositionCss(seg);
+                return (createElement("div", { className: 'fc-timegrid-event-harness' + (seg.level > 0 ? ' fc-timegrid-event-harness-inset' : ''), key: instanceId, style: __assign({ visibility: segIsInvisible[instanceId] ? 'hidden' : '' }, positionCss) },
+                    createElement(TimeColEvent, __assign({ seg: seg, isDragging: isDragging, isResizing: isResizing, isDateSelecting: isDateSelecting, isSelected: instanceId === props.eventSelection, isCondensed: (seg.bottom - seg.top) < config.timeGridEventCondensedHeight }, getSegMeta(seg, props.todayRange, props.nowDate)))));
+            });
+        };
+        TimeCol.prototype.renderFillSegs = function (segs, fillType) {
+            var _this = this;
+            var _a = this, context = _a.context, props = _a.props;
+            if (!props.slatCoords) {
+                return;
+            }
+            // BAD: assigns TO THE SEGS THEMSELVES
+            computeSegVerticals(segs, props.date, props.slatCoords, context.options.eventMinHeight);
+            var children = segs.map(function (seg) { return (createElement("div", { key: buildEventRangeKey(seg.eventRange), className: 'fc-timegrid-bg-harness', style: _this.computeSegTopBottomCss(seg) }, fillType === 'bg-event' ?
+                createElement(BgEvent, __assign({ seg: seg }, getSegMeta(seg, props.todayRange, props.nowDate))) :
+                renderFill(fillType))); });
+            return createElement(Fragment, null, children);
+        };
+        TimeCol.prototype.renderNowIndicator = function (segs) {
+            var _a = this.props, slatCoords = _a.slatCoords, date = _a.date;
+            if (!slatCoords) {
+                return;
+            }
+            return segs.map(function (seg, i) { return (createElement(NowIndicatorRoot, { isAxis: false, date: date, key: i /* key doesn't matter. will only ever be one */ }, function (rootElRef, classNames, innerElRef, innerContent) { return (createElement("div", { ref: rootElRef, className: ['fc-timegrid-now-indicator-line'].concat(classNames).join(' '), style: { top: slatCoords.computeDateTop(seg.start, date) } }, innerContent)); })); });
+        };
+        TimeCol.prototype.computeFgSegPositionCss = function (seg) {
+            var _a = this.context, isRtl = _a.isRtl, options = _a.options;
+            var shouldOverlap = options.slotEventOverlap;
+            var backwardCoord = seg.backwardCoord; // the left side if LTR. the right side if RTL. floating-point
+            var forwardCoord = seg.forwardCoord; // the right side if LTR. the left side if RTL. floating-point
+            var left; // amount of space from left edge, a fraction of the total width
+            var right; // amount of space from right edge, a fraction of the total width
+            if (shouldOverlap) {
+                // double the width, but don't go beyond the maximum forward coordinate (1.0)
+                forwardCoord = Math.min(1, backwardCoord + (forwardCoord - backwardCoord) * 2);
+            }
+            if (isRtl) {
+                left = 1 - forwardCoord;
+                right = backwardCoord;
+            }
+            else {
+                left = backwardCoord;
+                right = 1 - forwardCoord;
+            }
+            var props = {
+                zIndex: seg.level + 1,
+                left: left * 100 + '%',
+                right: right * 100 + '%'
+            };
+            if (shouldOverlap && seg.forwardPressure) {
+                // add padding to the edge so that forward stacked events don't cover the resizer's icon
+                props[isRtl ? 'marginLeft' : 'marginRight'] = 10 * 2; // 10 is a guesstimate of the icon's width
+            }
+            return __assign(__assign({}, props), this.computeSegTopBottomCss(seg));
+        };
+        TimeCol.prototype.computeSegTopBottomCss = function (seg) {
+            return {
+                top: seg.top,
+                bottom: -seg.bottom
+            };
+        };
+        return TimeCol;
+    }(BaseComponent));
+    var TimeColMisc = /** @class */ (function (_super) {
+        __extends(TimeColMisc, _super);
+        function TimeColMisc() {
+            return _super !== null && _super.apply(this, arguments) || this;
+        }
+        TimeColMisc.prototype.render = function () {
+            var props = this.props;
+            return (createElement(DayCellContent, { date: props.date, dateProfile: props.dateProfile, todayRange: props.todayRange, extraHookProps: props.extraHookProps }, function (innerElRef, innerContent) { return (innerContent &&
+                createElement("div", { className: 'fc-timegrid-col-misc', ref: innerElRef }, innerContent)); }));
+        };
+        return TimeColMisc;
+    }(BaseComponent));
+
+    var TimeColsContent = /** @class */ (function (_super) {
+        __extends(TimeColsContent, _super);
+        function TimeColsContent() {
+            var _this = _super !== null && _super.apply(this, arguments) || this;
+            _this.splitFgEventSegs = memoize(splitSegsByCol);
+            _this.splitBgEventSegs = memoize(splitSegsByCol);
+            _this.splitBusinessHourSegs = memoize(splitSegsByCol);
+            _this.splitNowIndicatorSegs = memoize(splitSegsByCol);
+            _this.splitDateSelectionSegs = memoize(splitSegsByCol);
+            _this.splitEventDrag = memoize(splitInteractionByCol);
+            _this.splitEventResize = memoize(splitInteractionByCol);
+            _this.rootElRef = createRef();
+            _this.cellElRefs = new RefMap();
+            return _this;
+        }
+        TimeColsContent.prototype.render = function () {
+            var _this = this;
+            var _a = this, props = _a.props, context = _a.context;
+            var nowIndicatorTop = context.options.nowIndicator &&
+                props.slatCoords &&
+                props.slatCoords.safeComputeTop(props.nowDate); // might return void
+            var colCnt = props.cells.length;
+            var fgEventSegsByRow = this.splitFgEventSegs(props.fgEventSegs, colCnt);
+            var bgEventSegsByRow = this.splitBgEventSegs(props.bgEventSegs, colCnt);
+            var businessHourSegsByRow = this.splitBusinessHourSegs(props.businessHourSegs, colCnt);
+            var nowIndicatorSegsByRow = this.splitNowIndicatorSegs(props.nowIndicatorSegs, colCnt);
+            var dateSelectionSegsByRow = this.splitDateSelectionSegs(props.dateSelectionSegs, colCnt);
+            var eventDragByRow = this.splitEventDrag(props.eventDrag, colCnt);
+            var eventResizeByRow = this.splitEventResize(props.eventResize, colCnt);
+            return (createElement("div", { className: 'fc-timegrid-cols', ref: this.rootElRef },
+                createElement("table", { style: {
+                        minWidth: props.tableMinWidth,
+                        width: props.clientWidth
+                    } },
+                    props.tableColGroupNode,
+                    createElement("tbody", null,
+                        createElement("tr", null,
+                            props.axis &&
+                                createElement("td", { className: 'fc-timegrid-col fc-timegrid-axis' },
+                                    createElement("div", { className: 'fc-timegrid-col-frame' },
+                                        createElement("div", { className: 'fc-timegrid-now-indicator-container' }, typeof nowIndicatorTop === 'number' &&
+                                            createElement(NowIndicatorRoot, { isAxis: true, date: props.nowDate }, function (rootElRef, classNames, innerElRef, innerContent) { return (createElement("div", { ref: rootElRef, className: ['fc-timegrid-now-indicator-arrow'].concat(classNames).join(' '), style: { top: nowIndicatorTop } }, innerContent)); })))),
+                            props.cells.map(function (cell, i) { return (createElement(TimeCol, { key: cell.key, elRef: _this.cellElRefs.createRef(cell.key), dateProfile: props.dateProfile, date: cell.date, nowDate: props.nowDate, todayRange: props.todayRange, extraHookProps: cell.extraHookProps, extraDataAttrs: cell.extraDataAttrs, extraClassNames: cell.extraClassNames, fgEventSegs: fgEventSegsByRow[i], bgEventSegs: bgEventSegsByRow[i], businessHourSegs: businessHourSegsByRow[i], nowIndicatorSegs: nowIndicatorSegsByRow[i], dateSelectionSegs: dateSelectionSegsByRow[i], eventDrag: eventDragByRow[i], eventResize: eventResizeByRow[i], slatCoords: props.slatCoords, eventSelection: props.eventSelection, forPrint: props.forPrint })); }))))));
+        };
+        TimeColsContent.prototype.componentDidMount = function () {
+            this.updateCoords();
+        };
+        TimeColsContent.prototype.componentDidUpdate = function () {
+            this.updateCoords();
+        };
+        TimeColsContent.prototype.updateCoords = function () {
+            var props = this.props;
+            if (props.onColCoords &&
+                props.clientWidth !== null // means sizing has stabilized
+            ) {
+                props.onColCoords(new PositionCache(this.rootElRef.current, collectCellEls(this.cellElRefs.currentMap, props.cells), true, // horizontal
+                false));
+            }
+        };
+        return TimeColsContent;
+    }(BaseComponent));
+    function collectCellEls(elMap, cells) {
+        return cells.map(function (cell) { return elMap[cell.key]; });
+    }
+
+    /* A component that renders one or more columns of vertical time slots
+    ----------------------------------------------------------------------------------------------------------------------*/
+    var TimeCols = /** @class */ (function (_super) {
+        __extends(TimeCols, _super);
+        function TimeCols() {
+            var _this = _super !== null && _super.apply(this, arguments) || this;
+            _this.processSlotOptions = memoize(processSlotOptions);
+            _this.state = {
+                slatCoords: null
+            };
+            _this.handleScrollRequest = function (request) {
+                var onScrollTopRequest = _this.props.onScrollTopRequest;
+                var slatCoords = _this.state.slatCoords;
+                if (onScrollTopRequest && slatCoords) {
+                    if (request.time) {
+                        var top_1 = slatCoords.computeTimeTop(request.time);
+                        top_1 = Math.ceil(top_1); // zoom can give weird floating-point values. rather scroll a little bit further
+                        if (top_1) {
+                            top_1++;
+                        } // to overcome top border that slots beyond the first have. looks better
+                        onScrollTopRequest(top_1);
+                    }
+                    return true;
+                }
+            };
+            _this.handleColCoords = function (colCoords) {
+                _this.colCoords = colCoords;
+            };
+            _this.handleSlatCoords = function (slatCoords) {
+                _this.setState({ slatCoords: slatCoords });
+                if (_this.props.onSlatCoords) {
+                    _this.props.onSlatCoords(slatCoords);
+                }
+            };
+            return _this;
+        }
+        TimeCols.prototype.render = function () {
+            var _a = this, props = _a.props, state = _a.state;
+            return (createElement("div", { className: 'fc-timegrid-body', ref: props.rootElRef, style: {
+                    // these props are important to give this wrapper correct dimensions for interactions
+                    // TODO: if we set it here, can we avoid giving to inner tables?
+                    width: props.clientWidth,
+                    minWidth: props.tableMinWidth
+                } },
+                createElement(TimeColsSlats, { axis: props.axis, dateProfile: props.dateProfile, slatMetas: props.slatMetas, clientWidth: props.clientWidth, minHeight: props.expandRows ? props.clientHeight : '', tableMinWidth: props.tableMinWidth, tableColGroupNode: props.axis ? props.tableColGroupNode : null /* axis depends on the colgroup's shrinking */, onCoords: this.handleSlatCoords }),
+                createElement(TimeColsContent, { cells: props.cells, axis: props.axis, dateProfile: props.dateProfile, businessHourSegs: props.businessHourSegs, bgEventSegs: props.bgEventSegs, fgEventSegs: props.fgEventSegs, dateSelectionSegs: props.dateSelectionSegs, eventSelection: props.eventSelection, eventDrag: props.eventDrag, eventResize: props.eventResize, todayRange: props.todayRange, nowDate: props.nowDate, nowIndicatorSegs: props.nowIndicatorSegs, clientWidth: props.clientWidth, tableMinWidth: props.tableMinWidth, tableColGroupNode: props.tableColGroupNode, slatCoords: state.slatCoords, onColCoords: this.handleColCoords, forPrint: props.forPrint })));
+        };
+        TimeCols.prototype.componentDidMount = function () {
+            this.scrollResponder = this.context.createScrollResponder(this.handleScrollRequest);
+        };
+        TimeCols.prototype.componentDidUpdate = function (prevProps) {
+            this.scrollResponder.update(prevProps.dateProfile !== this.props.dateProfile);
+        };
+        TimeCols.prototype.componentWillUnmount = function () {
+            this.scrollResponder.detach();
+        };
+        TimeCols.prototype.positionToHit = function (positionLeft, positionTop) {
+            var _a = this.context, dateEnv = _a.dateEnv, options = _a.options;
+            var colCoords = this.colCoords;
+            var dateProfile = this.props.dateProfile;
+            var slatCoords = this.state.slatCoords;
+            var _b = this.processSlotOptions(this.props.slotDuration, options.snapDuration), snapDuration = _b.snapDuration, snapsPerSlot = _b.snapsPerSlot;
+            var colIndex = colCoords.leftToIndex(positionLeft);
+            var slatIndex = slatCoords.positions.topToIndex(positionTop);
+            if (colIndex != null && slatIndex != null) {
+                var slatTop = slatCoords.positions.tops[slatIndex];
+                var slatHeight = slatCoords.positions.getHeight(slatIndex);
+                var partial = (positionTop - slatTop) / slatHeight; // floating point number between 0 and 1
+                var localSnapIndex = Math.floor(partial * snapsPerSlot); // the snap # relative to start of slat
+                var snapIndex = slatIndex * snapsPerSlot + localSnapIndex;
+                var dayDate = this.props.cells[colIndex].date;
+                var time = addDurations(dateProfile.slotMinTime, multiplyDuration(snapDuration, snapIndex));
+                var start = dateEnv.add(dayDate, time);
+                var end = dateEnv.add(start, snapDuration);
+                return {
+                    col: colIndex,
+                    dateSpan: {
+                        range: { start: start, end: end },
+                        allDay: false
+                    },
+                    dayEl: colCoords.els[colIndex],
+                    relativeRect: {
+                        left: colCoords.lefts[colIndex],
+                        right: colCoords.rights[colIndex],
+                        top: slatTop,
+                        bottom: slatTop + slatHeight
+                    }
+                };
+            }
+        };
+        return TimeCols;
+    }(BaseComponent));
+    function processSlotOptions(slotDuration, snapDurationOverride) {
+        var snapDuration = snapDurationOverride || slotDuration;
+        var snapsPerSlot = wholeDivideDurations(slotDuration, snapDuration);
+        if (snapsPerSlot === null) {
+            snapDuration = slotDuration;
+            snapsPerSlot = 1;
+            // TODO: say warning?
+        }
+        return { snapDuration: snapDuration, snapsPerSlot: snapsPerSlot };
+    }
+
+    var DayTimeCols = /** @class */ (function (_super) {
+        __extends(DayTimeCols, _super);
+        function DayTimeCols() {
+            var _this = _super !== null && _super.apply(this, arguments) || this;
+            _this.buildDayRanges = memoize(buildDayRanges);
+            _this.slicer = new DayTimeColsSlicer();
+            _this.timeColsRef = createRef();
+            _this.handleRootEl = function (rootEl) {
+                if (rootEl) {
+                    _this.context.registerInteractiveComponent(_this, { el: rootEl });
+                }
+                else {
+                    _this.context.unregisterInteractiveComponent(_this);
+                }
+            };
+            return _this;
+        }
+        DayTimeCols.prototype.render = function () {
+            var _this = this;
+            var _a = this, props = _a.props, context = _a.context;
+            var dateProfile = props.dateProfile, dayTableModel = props.dayTableModel;
+            var isNowIndicator = context.options.nowIndicator;
+            var dayRanges = this.buildDayRanges(dayTableModel, dateProfile, context.dateEnv);
+            // give it the first row of cells
+            // TODO: would move this further down hierarchy, but sliceNowDate needs it
+            return (createElement(NowTimer, { unit: isNowIndicator ? 'minute' : 'day' }, function (nowDate, todayRange) { return (createElement(TimeCols, __assign({ ref: _this.timeColsRef, rootElRef: _this.handleRootEl }, _this.slicer.sliceProps(props, dateProfile, null, context, dayRanges), { forPrint: props.forPrint, axis: props.axis, dateProfile: dateProfile, slatMetas: props.slatMetas, slotDuration: props.slotDuration, cells: dayTableModel.cells[0], tableColGroupNode: props.tableColGroupNode, tableMinWidth: props.tableMinWidth, clientWidth: props.clientWidth, clientHeight: props.clientHeight, expandRows: props.expandRows, nowDate: nowDate, nowIndicatorSegs: isNowIndicator && _this.slicer.sliceNowDate(nowDate, context, dayRanges), todayRange: todayRange, onScrollTopRequest: props.onScrollTopRequest, onSlatCoords: props.onSlatCoords }))); }));
+        };
+        DayTimeCols.prototype.queryHit = function (positionLeft, positionTop) {
+            var rawHit = this.timeColsRef.current.positionToHit(positionLeft, positionTop);
+            if (rawHit) {
+                return {
+                    component: this,
+                    dateSpan: rawHit.dateSpan,
+                    dayEl: rawHit.dayEl,
+                    rect: {
+                        left: rawHit.relativeRect.left,
+                        right: rawHit.relativeRect.right,
+                        top: rawHit.relativeRect.top,
+                        bottom: rawHit.relativeRect.bottom
+                    },
+                    layer: 0
+                };
+            }
+        };
+        return DayTimeCols;
+    }(DateComponent));
+    function buildDayRanges(dayTableModel, dateProfile, dateEnv) {
+        var ranges = [];
+        for (var _i = 0, _a = dayTableModel.headerDates; _i < _a.length; _i++) {
+            var date = _a[_i];
+            ranges.push({
+                start: dateEnv.add(date, dateProfile.slotMinTime),
+                end: dateEnv.add(date, dateProfile.slotMaxTime)
+            });
+        }
+        return ranges;
+    }
+    var DayTimeColsSlicer = /** @class */ (function (_super) {
+        __extends(DayTimeColsSlicer, _super);
+        function DayTimeColsSlicer() {
+            return _super !== null && _super.apply(this, arguments) || this;
+        }
+        DayTimeColsSlicer.prototype.sliceRange = function (range, dayRanges) {
+            var segs = [];
+            for (var col = 0; col < dayRanges.length; col++) {
+                var segRange = intersectRanges(range, dayRanges[col]);
+                if (segRange) {
+                    segs.push({
+                        start: segRange.start,
+                        end: segRange.end,
+                        isStart: segRange.start.valueOf() === range.start.valueOf(),
+                        isEnd: segRange.end.valueOf() === range.end.valueOf(),
+                        col: col
+                    });
+                }
+            }
+            return segs;
+        };
+        return DayTimeColsSlicer;
+    }(Slicer));
+
+    var DayTimeColsView = /** @class */ (function (_super) {
+        __extends(DayTimeColsView, _super);
+        function DayTimeColsView() {
+            var _this = _super !== null && _super.apply(this, arguments) || this;
+            _this.buildTimeColsModel = memoize(buildTimeColsModel);
+            _this.buildSlatMetas = memoize(buildSlatMetas);
+            return _this;
+        }
+        DayTimeColsView.prototype.render = function () {
+            var _this = this;
+            var _a = this.context, options = _a.options, dateEnv = _a.dateEnv, dateProfileGenerator = _a.dateProfileGenerator;
+            var props = this.props;
+            var dateProfile = props.dateProfile;
+            var dayTableModel = this.buildTimeColsModel(dateProfile, dateProfileGenerator);
+            var splitProps = this.allDaySplitter.splitProps(props);
+            var slatMetas = this.buildSlatMetas(dateProfile.slotMinTime, dateProfile.slotMaxTime, options.slotLabelInterval, options.slotDuration, dateEnv);
+            var dayMinWidth = options.dayMinWidth;
+            var hasAttachedAxis = !dayMinWidth;
+            var hasDetachedAxis = dayMinWidth;
+            var headerContent = options.dayHeaders &&
+                createElement(DayHeader, { dates: dayTableModel.headerDates, dateProfile: dateProfile, datesRepDistinctDays: true, renderIntro: hasAttachedAxis ? this.renderHeadAxis : null });
+            var allDayContent = (options.allDaySlot !== false) && (function (contentArg) { return (createElement(DayTable, __assign({}, splitProps['allDay'], { dateProfile: dateProfile, dayTableModel: dayTableModel, nextDayThreshold: options.nextDayThreshold, tableMinWidth: contentArg.tableMinWidth, colGroupNode: contentArg.tableColGroupNode, renderRowIntro: hasAttachedAxis ? _this.renderTableRowAxis : null, showWeekNumbers: false, expandRows: false, headerAlignElRef: _this.headerElRef, clientWidth: contentArg.clientWidth, clientHeight: contentArg.clientHeight, forPrint: props.forPrint }, _this.getAllDayMaxEventProps()))); });
+            var timeGridContent = function (contentArg) { return (createElement(DayTimeCols, __assign({}, splitProps['timed'], { dayTableModel: dayTableModel, dateProfile: dateProfile, axis: hasAttachedAxis, slotDuration: options.slotDuration, slatMetas: slatMetas, forPrint: props.forPrint, tableColGroupNode: contentArg.tableColGroupNode, tableMinWidth: contentArg.tableMinWidth, clientWidth: contentArg.clientWidth, clientHeight: contentArg.clientHeight, onSlatCoords: _this.handleSlatCoords, expandRows: contentArg.expandRows, onScrollTopRequest: _this.handleScrollTopRequest }))); };
+            return hasDetachedAxis
+                ? this.renderHScrollLayout(headerContent, allDayContent, timeGridContent, dayTableModel.colCnt, dayMinWidth, slatMetas, this.state.slatCoords)
+                : this.renderSimpleLayout(headerContent, allDayContent, timeGridContent);
+        };
+        return DayTimeColsView;
+    }(TimeColsView));
+    function buildTimeColsModel(dateProfile, dateProfileGenerator) {
+        var daySeries = new DaySeriesModel(dateProfile.renderRange, dateProfileGenerator);
+        return new DayTableModel(daySeries, false);
+    }
+
+    var OPTION_REFINERS$1 = {
+        allDaySlot: Boolean
+    };
+
+    var timeGridPlugin = createPlugin({
+        initialView: 'timeGridWeek',
+        optionRefiners: OPTION_REFINERS$1,
+        views: {
+            timeGrid: {
+                component: DayTimeColsView,
+                usesMinMaxTime: true,
+                allDaySlot: true,
+                slotDuration: '00:30:00',
+                slotEventOverlap: true // a bad name. confused with overlap/constraint system
+            },
+            timeGridDay: {
+                type: 'timeGrid',
+                duration: { days: 1 }
+            },
+            timeGridWeek: {
+                type: 'timeGrid',
+                duration: { weeks: 1 }
+            }
+        }
+    });
+
+    var ListViewHeaderRow = /** @class */ (function (_super) {
+        __extends(ListViewHeaderRow, _super);
+        function ListViewHeaderRow() {
+            return _super !== null && _super.apply(this, arguments) || this;
+        }
+        ListViewHeaderRow.prototype.render = function () {
+            var _a = this.props, dayDate = _a.dayDate, todayRange = _a.todayRange;
+            var _b = this.context, theme = _b.theme, dateEnv = _b.dateEnv, options = _b.options, viewApi = _b.viewApi;
+            var dayMeta = getDateMeta(dayDate, todayRange);
+            var text = options.listDayFormat ? dateEnv.format(dayDate, options.listDayFormat) : ''; // will ever be falsy?
+            var sideText = options.listDaySideFormat ? dateEnv.format(dayDate, options.listDaySideFormat) : ''; // will ever be falsy? also, BAD NAME "alt"
+            var navLinkData = options.navLinks
+                ? buildNavLinkData(dayDate)
+                : null;
+            var hookProps = __assign({ date: dateEnv.toDate(dayDate), view: viewApi, text: text,
+                sideText: sideText,
+                navLinkData: navLinkData }, dayMeta);
+            var classNames = ['fc-list-day'].concat(getDayClassNames(dayMeta, theme));
+            // TODO: make a reusable HOC for dayHeader (used in daygrid/timegrid too)
+            return (createElement(RenderHook, { hookProps: hookProps, classNames: options.dayHeaderClassNames, content: options.dayHeaderContent, defaultContent: renderInnerContent$4, didMount: options.dayHeaderDidMount, willUnmount: options.dayHeaderWillUnmount }, function (rootElRef, customClassNames, innerElRef, innerContent) { return (createElement("tr", { ref: rootElRef, className: classNames.concat(customClassNames).join(' '), "data-date": formatDayString(dayDate) },
+                createElement("th", { colSpan: 3 },
+                    createElement("div", { className: 'fc-list-day-cushion ' + theme.getClass('tableCellShaded'), ref: innerElRef }, innerContent)))); }));
+        };
+        return ListViewHeaderRow;
+    }(BaseComponent));
+    function renderInnerContent$4(props) {
+        var navLinkAttrs = props.navLinkData // is there a type for this?
+            ? { 'data-navlink': props.navLinkData, tabIndex: 0 }
+            : {};
+        return (createElement(Fragment, null,
+            props.text &&
+                createElement("a", __assign({ className: 'fc-list-day-text' }, navLinkAttrs), props.text),
+            props.sideText &&
+                createElement("a", __assign({ className: 'fc-list-day-side-text' }, navLinkAttrs), props.sideText)));
+    }
+
+    var DEFAULT_TIME_FORMAT$1 = createFormatter({
+        hour: 'numeric',
+        minute: '2-digit',
+        meridiem: 'short'
+    });
+    var ListViewEventRow = /** @class */ (function (_super) {
+        __extends(ListViewEventRow, _super);
+        function ListViewEventRow() {
+            return _super !== null && _super.apply(this, arguments) || this;
+        }
+        ListViewEventRow.prototype.render = function () {
+            var _a = this, props = _a.props, context = _a.context;
+            var seg = props.seg;
+            var timeFormat = context.options.eventTimeFormat || DEFAULT_TIME_FORMAT$1;
+            return (createElement(EventRoot, { seg: seg, timeText: '' /* BAD. because of all-day content */, disableDragging: true, disableResizing: true, defaultContent: renderEventInnerContent, isPast: props.isPast, isFuture: props.isFuture, isToday: props.isToday, isSelected: props.isSelected, isDragging: props.isDragging, isResizing: props.isResizing, isDateSelecting: props.isDateSelecting }, function (rootElRef, classNames, innerElRef, innerContent, hookProps) { return (createElement("tr", { className: ['fc-list-event', hookProps.event.url ? 'fc-event-forced-url' : ''].concat(classNames).join(' '), ref: rootElRef },
+                buildTimeContent(seg, timeFormat, context),
+                createElement("td", { className: 'fc-list-event-graphic' },
+                    createElement("span", { className: 'fc-list-event-dot', style: { borderColor: hookProps.borderColor || hookProps.backgroundColor } })),
+                createElement("td", { className: 'fc-list-event-title', ref: innerElRef }, innerContent))); }));
+        };
+        return ListViewEventRow;
+    }(BaseComponent));
+    function renderEventInnerContent(props) {
+        var event = props.event;
+        var url = event.url;
+        var anchorAttrs = url ? { href: url } : {};
+        return (createElement("a", __assign({}, anchorAttrs), event.title));
+    }
+    function buildTimeContent(seg, timeFormat, context) {
+        var options = context.options;
+        if (options.displayEventTime !== false) {
+            var eventDef = seg.eventRange.def;
+            var eventInstance = seg.eventRange.instance;
+            var doAllDay = false;
+            var timeText = void 0;
+            if (eventDef.allDay) {
+                doAllDay = true;
+            }
+            else if (isMultiDayRange(seg.eventRange.range)) { // TODO: use (!isStart || !isEnd) instead?
+                if (seg.isStart) {
+                    timeText = buildSegTimeText(seg, timeFormat, context, null, null, eventInstance.range.start, seg.end);
+                }
+                else if (seg.isEnd) {
+                    timeText = buildSegTimeText(seg, timeFormat, context, null, null, seg.start, eventInstance.range.end);
+                }
+                else {
+                    doAllDay = true;
+                }
+            }
+            else {
+                timeText = buildSegTimeText(seg, timeFormat, context);
+            }
+            if (doAllDay) {
+                var hookProps = {
+                    text: context.options.allDayText,
+                    view: context.viewApi
+                };
+                return (createElement(RenderHook, { hookProps: hookProps, classNames: options.allDayClassNames, content: options.allDayContent, defaultContent: renderAllDayInner$1, didMount: options.allDayDidMount, willUnmount: options.allDayWillUnmount }, function (rootElRef, classNames, innerElRef, innerContent) { return (createElement("td", { className: ['fc-list-event-time'].concat(classNames).join(' '), ref: rootElRef }, innerContent)); }));
+            }
+            else {
+                return (createElement("td", { className: 'fc-list-event-time' }, timeText));
+            }
+        }
+        return null;
+    }
+    function renderAllDayInner$1(hookProps) {
+        return hookProps.text;
+    }
+
+    /*
+    Responsible for the scroller, and forwarding event-related actions into the "grid".
+    */
+    var ListView = /** @class */ (function (_super) {
+        __extends(ListView, _super);
+        function ListView() {
+            var _this = _super !== null && _super.apply(this, arguments) || this;
+            _this.computeDateVars = memoize(computeDateVars);
+            _this.eventStoreToSegs = memoize(_this._eventStoreToSegs);
+            _this.setRootEl = function (rootEl) {
+                if (rootEl) {
+                    _this.context.registerInteractiveComponent(_this, {
+                        el: rootEl
+                    });
+                }
+                else {
+                    _this.context.unregisterInteractiveComponent(_this);
+                }
+            };
+            return _this;
+        }
+        ListView.prototype.render = function () {
+            var _this = this;
+            var _a = this, props = _a.props, context = _a.context;
+            var extraClassNames = [
+                'fc-list',
+                context.theme.getClass('table'),
+                context.options.stickyHeaderDates !== false ? 'fc-list-sticky' : ''
+            ];
+            var _b = this.computeDateVars(props.dateProfile), dayDates = _b.dayDates, dayRanges = _b.dayRanges;
+            var eventSegs = this.eventStoreToSegs(props.eventStore, props.eventUiBases, dayRanges);
+            return (createElement(ViewRoot, { viewSpec: context.viewSpec, elRef: this.setRootEl }, function (rootElRef, classNames) { return (createElement("div", { ref: rootElRef, className: extraClassNames.concat(classNames).join(' ') },
+                createElement(Scroller, { liquid: !props.isHeightAuto, overflowX: props.isHeightAuto ? 'visible' : 'hidden', overflowY: props.isHeightAuto ? 'visible' : 'auto' }, eventSegs.length > 0 ?
+                    _this.renderSegList(eventSegs, dayDates) :
+                    _this.renderEmptyMessage()))); }));
+        };
+        ListView.prototype.renderEmptyMessage = function () {
+            var _a = this.context, options = _a.options, viewApi = _a.viewApi;
+            var hookProps = {
+                text: options.noEventsText,
+                view: viewApi
+            };
+            return (createElement(RenderHook, { hookProps: hookProps, classNames: options.noEventsClassNames, content: options.noEventsContent, defaultContent: renderNoEventsInner, didMount: options.noEventsDidMount, willUnmount: options.noEventsWillUnmount }, function (rootElRef, classNames, innerElRef, innerContent) { return (createElement("div", { className: ['fc-list-empty'].concat(classNames).join(' '), ref: rootElRef },
+                createElement("div", { className: 'fc-list-empty-cushion', ref: innerElRef }, innerContent))); }));
+        };
+        ListView.prototype.renderSegList = function (allSegs, dayDates) {
+            var _a = this.context, theme = _a.theme, options = _a.options;
+            var segsByDay = groupSegsByDay(allSegs); // sparse array
+            return (createElement(NowTimer, { unit: 'day' }, function (nowDate, todayRange) {
+                var innerNodes = [];
+                for (var dayIndex = 0; dayIndex < segsByDay.length; dayIndex++) {
+                    var daySegs = segsByDay[dayIndex];
+                    if (daySegs) { // sparse array, so might be undefined
+                        var dayStr = dayDates[dayIndex].toISOString();
+                        // append a day header
+                        innerNodes.push(createElement(ListViewHeaderRow, { key: dayStr, dayDate: dayDates[dayIndex], todayRange: todayRange }));
+                        daySegs = sortEventSegs(daySegs, options.eventOrder);
+                        for (var _i = 0, daySegs_1 = daySegs; _i < daySegs_1.length; _i++) {
+                            var seg = daySegs_1[_i];
+                            innerNodes.push(createElement(ListViewEventRow, __assign({ key: dayStr + ':' + seg.eventRange.instance.instanceId /* are multiple segs for an instanceId */, seg: seg, isDragging: false, isResizing: false, isDateSelecting: false, isSelected: false }, getSegMeta(seg, todayRange, nowDate))));
+                        }
+                    }
+                }
+                return (createElement("table", { className: 'fc-list-table ' + theme.getClass('table') },
+                    createElement("tbody", null, innerNodes)));
+            }));
+        };
+        ListView.prototype._eventStoreToSegs = function (eventStore, eventUiBases, dayRanges) {
+            return this.eventRangesToSegs(sliceEventStore(eventStore, eventUiBases, this.props.dateProfile.activeRange, this.context.options.nextDayThreshold).fg, dayRanges);
+        };
+        ListView.prototype.eventRangesToSegs = function (eventRanges, dayRanges) {
+            var segs = [];
+            for (var _i = 0, eventRanges_1 = eventRanges; _i < eventRanges_1.length; _i++) {
+                var eventRange = eventRanges_1[_i];
+                segs.push.apply(segs, this.eventRangeToSegs(eventRange, dayRanges));
+            }
+            return segs;
+        };
+        ListView.prototype.eventRangeToSegs = function (eventRange, dayRanges) {
+            var dateEnv = this.context.dateEnv;
+            var nextDayThreshold = this.context.options.nextDayThreshold;
+            var range = eventRange.range;
+            var allDay = eventRange.def.allDay;
+            var dayIndex;
+            var segRange;
+            var seg;
+            var segs = [];
+            for (dayIndex = 0; dayIndex < dayRanges.length; dayIndex++) {
+                segRange = intersectRanges(range, dayRanges[dayIndex]);
+                if (segRange) {
+                    seg = {
+                        component: this,
+                        eventRange: eventRange,
+                        start: segRange.start,
+                        end: segRange.end,
+                        isStart: eventRange.isStart && segRange.start.valueOf() === range.start.valueOf(),
+                        isEnd: eventRange.isEnd && segRange.end.valueOf() === range.end.valueOf(),
+                        dayIndex: dayIndex
+                    };
+                    segs.push(seg);
+                    // detect when range won't go fully into the next day,
+                    // and mutate the latest seg to the be the end.
+                    if (!seg.isEnd && !allDay &&
+                        dayIndex + 1 < dayRanges.length &&
+                        range.end <
+                            dateEnv.add(dayRanges[dayIndex + 1].start, nextDayThreshold)) {
+                        seg.end = range.end;
+                        seg.isEnd = true;
+                        break;
+                    }
+                }
+            }
+            return segs;
+        };
+        return ListView;
+    }(DateComponent));
+    function renderNoEventsInner(hookProps) {
+        return hookProps.text;
+    }
+    function computeDateVars(dateProfile) {
+        var dayStart = startOfDay(dateProfile.renderRange.start);
+        var viewEnd = dateProfile.renderRange.end;
+        var dayDates = [];
+        var dayRanges = [];
+        while (dayStart < viewEnd) {
+            dayDates.push(dayStart);
+            dayRanges.push({
+                start: dayStart,
+                end: addDays(dayStart, 1)
+            });
+            dayStart = addDays(dayStart, 1);
+        }
+        return { dayDates: dayDates, dayRanges: dayRanges };
+    }
+    // Returns a sparse array of arrays, segs grouped by their dayIndex
+    function groupSegsByDay(segs) {
+        var segsByDay = []; // sparse array
+        var i;
+        var seg;
+        for (i = 0; i < segs.length; i++) {
+            seg = segs[i];
+            (segsByDay[seg.dayIndex] || (segsByDay[seg.dayIndex] = []))
+                .push(seg);
+        }
+        return segsByDay;
+    }
+
+    var OPTION_REFINERS$2 = {
+        listDayFormat: createFalsableFormatter,
+        listDaySideFormat: createFalsableFormatter,
+        noEventsClassNames: identity,
+        noEventsContent: identity,
+        noEventsDidMount: identity,
+        noEventsWillUnmount: identity
+        // noEventsText is defined in base options
+    };
+    function createFalsableFormatter(input) {
+        return input === false ? null : createFormatter(input);
+    }
+
+    var listPlugin = createPlugin({
+        optionRefiners: OPTION_REFINERS$2,
+        views: {
+            list: {
+                component: ListView,
+                buttonTextKey: 'list',
+                listDayFormat: { month: 'long', day: 'numeric', year: 'numeric' } // like "January 1, 2016"
+            },
+            listDay: {
+                type: 'list',
+                duration: { days: 1 },
+                listDayFormat: { weekday: 'long' } // day-of-week is all we need. full date is probably in headerToolbar
+            },
+            listWeek: {
+                type: 'list',
+                duration: { weeks: 1 },
+                listDayFormat: { weekday: 'long' },
+                listDaySideFormat: { month: 'long', day: 'numeric', year: 'numeric' }
+            },
+            listMonth: {
+                type: 'list',
+                duration: { month: 1 },
+                listDaySideFormat: { weekday: 'long' } // day-of-week is nice-to-have
+            },
+            listYear: {
+                type: 'list',
+                duration: { year: 1 },
+                listDaySideFormat: { weekday: 'long' } // day-of-week is nice-to-have
+            }
+        }
+    });
+
+    var BootstrapTheme = /** @class */ (function (_super) {
+        __extends(BootstrapTheme, _super);
+        function BootstrapTheme() {
+            return _super !== null && _super.apply(this, arguments) || this;
+        }
+        return BootstrapTheme;
+    }(Theme));
+    BootstrapTheme.prototype.classes = {
+        root: 'fc-theme-bootstrap',
+        table: 'table-bordered',
+        tableCellShaded: 'table-active',
+        buttonGroup: 'btn-group',
+        button: 'btn btn-primary',
+        buttonActive: 'active',
+        popover: 'popover',
+        popoverHeader: 'popover-header',
+        popoverContent: 'popover-body'
+    };
+    BootstrapTheme.prototype.baseIconClass = 'fa';
+    BootstrapTheme.prototype.iconClasses = {
+        close: 'fa-times',
+        prev: 'fa-chevron-left',
+        next: 'fa-chevron-right',
+        prevYear: 'fa-angle-double-left',
+        nextYear: 'fa-angle-double-right'
+    };
+    BootstrapTheme.prototype.rtlIconClasses = {
+        prev: 'fa-chevron-right',
+        next: 'fa-chevron-left',
+        prevYear: 'fa-angle-double-right',
+        nextYear: 'fa-angle-double-left'
+    };
+    BootstrapTheme.prototype.iconOverrideOption = 'bootstrapFontAwesome'; // TODO: make TS-friendly. move the option-processing into this plugin
+    BootstrapTheme.prototype.iconOverrideCustomButtonOption = 'bootstrapFontAwesome';
+    BootstrapTheme.prototype.iconOverridePrefix = 'fa-';
+    var plugin = createPlugin({
+        themeClasses: {
+            bootstrap: BootstrapTheme
+        }
+    });
+
+    // rename this file to options.ts like other packages?
+    var OPTION_REFINERS$3 = {
+        googleCalendarApiKey: String
+    };
+
+    var EVENT_SOURCE_REFINERS$1 = {
+        googleCalendarApiKey: String,
+        googleCalendarId: String,
+        googleCalendarApiBase: String,
+        extraParams: identity
+    };
+
+    // TODO: expose somehow
+    var API_BASE = 'https://www.googleapis.com/calendar/v3/calendars';
+    var eventSourceDef$3 = {
+        parseMeta: function (refined) {
+            var googleCalendarId = refined.googleCalendarId;
+            if (!googleCalendarId && refined.url) {
+                googleCalendarId = parseGoogleCalendarId(refined.url);
+            }
+            if (googleCalendarId) {
+                return {
+                    googleCalendarId: googleCalendarId,
+                    googleCalendarApiKey: refined.googleCalendarApiKey,
+                    googleCalendarApiBase: refined.googleCalendarApiBase,
+                    extraParams: refined.extraParams
+                };
+            }
+            return null;
+        },
+        fetch: function (arg, onSuccess, onFailure) {
+            var _a = arg.context, dateEnv = _a.dateEnv, options = _a.options;
+            var meta = arg.eventSource.meta;
+            var apiKey = meta.googleCalendarApiKey || options.googleCalendarApiKey;
+            if (!apiKey) {
+                onFailure({
+                    message: 'Specify a googleCalendarApiKey. See http://fullcalendar.io/docs/google_calendar/'
+                });
+            }
+            else {
+                var url = buildUrl(meta);
+                // TODO: make DRY with json-feed-event-source
+                var extraParams = meta.extraParams;
+                var extraParamsObj = typeof extraParams === 'function' ? extraParams() : extraParams;
+                var requestParams_1 = buildRequestParams$1(arg.range, apiKey, extraParamsObj, dateEnv);
+                requestJson('GET', url, requestParams_1, function (body, xhr) {
+                    if (body.error) {
+                        onFailure({
+                            message: 'Google Calendar API: ' + body.error.message,
+                            errors: body.error.errors,
+                            xhr: xhr
+                        });
+                    }
+                    else {
+                        onSuccess({
+                            rawEvents: gcalItemsToRawEventDefs(body.items, requestParams_1.timeZone),
+                            xhr: xhr
+                        });
+                    }
+                }, function (message, xhr) {
+                    onFailure({ message: message, xhr: xhr });
+                });
+            }
+        }
+    };
+    function parseGoogleCalendarId(url) {
+        var match;
+        // detect if the ID was specified as a single string.
+        // will match calendars like "asdf1234@calendar.google.com" in addition to person email calendars.
+        if (/^[^/]+@([^/.]+\.)*(google|googlemail|gmail)\.com$/.test(url)) {
+            return url;
+        }
+        else if ((match = /^https:\/\/www.googleapis.com\/calendar\/v3\/calendars\/([^/]*)/.exec(url)) ||
+            (match = /^https?:\/\/www.google.com\/calendar\/feeds\/([^/]*)/.exec(url))) {
+            return decodeURIComponent(match[1]);
+        }
+    }
+    function buildUrl(meta) {
+        var apiBase = meta.googleCalendarApiBase;
+        if (!apiBase) {
+            apiBase = API_BASE;
+        }
+        return apiBase + '/' + encodeURIComponent(meta.googleCalendarId) + '/events';
+    }
+    function buildRequestParams$1(range, apiKey, extraParams, dateEnv) {
+        var params;
+        var startStr;
+        var endStr;
+        if (dateEnv.canComputeOffset) {
+            // strings will naturally have offsets, which GCal needs
+            startStr = dateEnv.formatIso(range.start);
+            endStr = dateEnv.formatIso(range.end);
+        }
+        else {
+            // when timezone isn't known, we don't know what the UTC offset should be, so ask for +/- 1 day
+            // from the UTC day-start to guarantee we're getting all the events
+            // (start/end will be UTC-coerced dates, so toISOString is okay)
+            startStr = addDays(range.start, -1).toISOString();
+            endStr = addDays(range.end, 1).toISOString();
+        }
+        params = __assign(__assign({}, (extraParams || {})), { key: apiKey, timeMin: startStr, timeMax: endStr, singleEvents: true, maxResults: 9999 });
+        if (dateEnv.timeZone !== 'local') {
+            params.timeZone = dateEnv.timeZone;
+        }
+        return params;
+    }
+    function gcalItemsToRawEventDefs(items, gcalTimezone) {
+        return items.map(function (item) {
+            return gcalItemToRawEventDef(item, gcalTimezone);
+        });
+    }
+    function gcalItemToRawEventDef(item, gcalTimezone) {
+        var url = item.htmlLink || null;
+        // make the URLs for each event show times in the correct timezone
+        if (url && gcalTimezone) {
+            url = injectQsComponent(url, 'ctz=' + gcalTimezone);
+        }
+        return {
+            id: item.id,
+            title: item.summary,
+            start: item.start.dateTime || item.start.date,
+            end: item.end.dateTime || item.end.date,
+            url: url,
+            location: item.location,
+            description: item.description
+        };
+    }
+    // Injects a string like "arg=value" into the querystring of a URL
+    // TODO: move to a general util file?
+    function injectQsComponent(url, component) {
+        // inject it after the querystring but before the fragment
+        return url.replace(/(\?.*?)?(#|$)/, function (whole, qs, hash) {
+            return (qs ? qs + '&' : '?') + component + hash;
+        });
+    }
+    var googleCalendarPlugin = createPlugin({
+        eventSourceDefs: [eventSourceDef$3],
+        optionRefiners: OPTION_REFINERS$3,
+        eventSourceRefiners: EVENT_SOURCE_REFINERS$1
+    });
+
+    var RELEASE_DATE = '2020-06-29'; // for Scheduler
+    var UPGRADE_WINDOW = 365 + 7; // days. 1 week leeway, for tz shift reasons too
+    var LICENSE_INFO_URL = 'http://fullcalendar.io/scheduler/license/';
+    var PRESET_LICENSE_KEYS = [
+        'GPL-My-Project-Is-Open-Source',
+        'CC-Attribution-NonCommercial-NoDerivatives'
+    ];
+    var CSS = {
+        position: 'absolute',
+        zIndex: 99999,
+        bottom: '1px',
+        left: '1px',
+        background: '#eee',
+        borderColor: '#ddd',
+        borderStyle: 'solid',
+        borderWidth: '1px 1px 0 0',
+        padding: '2px 4px',
+        fontSize: '12px',
+        borderTopRightRadius: '3px'
+    };
+    function buildLicenseWarning(context) {
+        var key = context.options.schedulerLicenseKey;
+        if (!isImmuneUrl(window.location.href) && !isValidKey(key)) {
+            return (createElement("div", { className: 'fc-license-message', style: CSS },
+                "Please use a valid license key. ",
+                createElement("a", { href: LICENSE_INFO_URL }, "More Info")));
+        }
+    }
+    /*
+    This decryption is not meant to be bulletproof. Just a way to remind about an upgrade.
+    */
+    function isValidKey(key) {
+        if (PRESET_LICENSE_KEYS.indexOf(key) !== -1) {
+            return true;
+        }
+        var parts = (key || '').match(/^(\d+)-fcs-(\d+)$/);
+        if (parts && (parts[1].length === 10)) {
+            var purchaseDate = new Date(parseInt(parts[2], 10) * 1000);
+            var releaseDate = new Date(config.mockSchedulerReleaseDate || RELEASE_DATE);
+            if (isValidDate(releaseDate)) { // token won't be replaced in dev mode
+                var minPurchaseDate = addDays(releaseDate, -UPGRADE_WINDOW);
+                if (minPurchaseDate < purchaseDate) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+    function isImmuneUrl(url) {
+        return /\w+:\/\/fullcalendar\.io\/|\/examples\/[\w-]+\.html$/.test(url);
+    }
+
+    var OPTION_REFINERS$4 = {
+        schedulerLicenseKey: String
+    };
+
+    var premiumCommonPlugin = createPlugin({
+        optionRefiners: OPTION_REFINERS$4,
+        viewContainerAppends: [buildLicenseWarning]
+    });
+
+    var WHEEL_EVENT_NAMES = 'wheel mousewheel DomMouseScroll MozMousePixelScroll'.split(' ');
+    /*
+    ALSO, with the ability to disable touch
+    */
+    var ScrollListener = /** @class */ (function () {
+        function ScrollListener(el) {
+            var _this = this;
+            this.el = el;
+            this.emitter = new Emitter();
+            this.isScrolling = false;
+            this.isTouching = false; // user currently has finger down?
+            this.isRecentlyWheeled = false;
+            this.isRecentlyScrolled = false;
+            this.wheelWaiter = new DelayedRunner(this._handleWheelWaited.bind(this));
+            this.scrollWaiter = new DelayedRunner(this._handleScrollWaited.bind(this));
+            // Handlers
+            // ----------------------------------------------------------------------------------------------
+            this.handleScroll = function () {
+                _this.startScroll();
+                _this.emitter.trigger('scroll', _this.isRecentlyWheeled, _this.isTouching);
+                _this.isRecentlyScrolled = true;
+                _this.scrollWaiter.request(500);
+            };
+            // will fire *before* the scroll event is fired (might not cause a scroll)
+            this.handleWheel = function () {
+                _this.isRecentlyWheeled = true;
+                _this.wheelWaiter.request(500);
+            };
+            // will fire *before* the scroll event is fired (might not cause a scroll)
+            this.handleTouchStart = function () {
+                _this.isTouching = true;
+            };
+            this.handleTouchEnd = function () {
+                _this.isTouching = false;
+                // if the user ended their touch, and the scroll area wasn't moving,
+                // we consider this to be the end of the scroll.
+                if (!_this.isRecentlyScrolled) {
+                    _this.endScroll(); // won't fire if already ended
+                }
+            };
+            el.addEventListener('scroll', this.handleScroll);
+            el.addEventListener('touchstart', this.handleTouchStart, { passive: true });
+            el.addEventListener('touchend', this.handleTouchEnd);
+            for (var _i = 0, WHEEL_EVENT_NAMES_1 = WHEEL_EVENT_NAMES; _i < WHEEL_EVENT_NAMES_1.length; _i++) {
+                var eventName = WHEEL_EVENT_NAMES_1[_i];
+                el.addEventListener(eventName, this.handleWheel);
+            }
+        }
+        ScrollListener.prototype.destroy = function () {
+            var el = this.el;
+            el.removeEventListener('scroll', this.handleScroll);
+            el.removeEventListener('touchstart', this.handleTouchStart, { passive: true });
+            el.removeEventListener('touchend', this.handleTouchEnd);
+            for (var _i = 0, WHEEL_EVENT_NAMES_2 = WHEEL_EVENT_NAMES; _i < WHEEL_EVENT_NAMES_2.length; _i++) {
+                var eventName = WHEEL_EVENT_NAMES_2[_i];
+                el.removeEventListener(eventName, this.handleWheel);
+            }
+        };
+        // Start / Stop
+        // ----------------------------------------------------------------------------------------------
+        ScrollListener.prototype.startScroll = function () {
+            if (!this.isScrolling) {
+                this.isScrolling = true;
+                this.emitter.trigger('scrollStart', this.isRecentlyWheeled, this.isTouching);
+            }
+        };
+        ScrollListener.prototype.endScroll = function () {
+            if (this.isScrolling) {
+                this.emitter.trigger('scrollEnd');
+                this.isScrolling = false;
+                this.isRecentlyScrolled = true;
+                this.isRecentlyWheeled = false;
+                this.scrollWaiter.clear();
+                this.wheelWaiter.clear();
+            }
+        };
+        ScrollListener.prototype._handleScrollWaited = function () {
+            this.isRecentlyScrolled = false;
+            // only end the scroll if not currently touching.
+            // if touching, the scrolling will end later, on touchend.
+            if (!this.isTouching) {
+                this.endScroll(); // won't fire if already ended
+            }
+        };
+        ScrollListener.prototype._handleWheelWaited = function () {
+            this.isRecentlyWheeled = false;
+        };
+        return ScrollListener;
+    }());
+
+    // TODO: assume the el has no borders?
+    function getScrollCanvasOrigin(scrollEl) {
+        var rect = scrollEl.getBoundingClientRect();
+        var edges = computeEdges(scrollEl); // TODO: pass in isRtl?
+        return {
+            left: rect.left + edges.borderLeft + edges.scrollbarLeft - getScrollFromLeftEdge(scrollEl),
+            top: rect.top + edges.borderTop - scrollEl.scrollTop
+        };
+    }
+    function getScrollFromLeftEdge(el) {
+        var val = el.scrollLeft;
+        var computedStyles = window.getComputedStyle(el); // TODO: pass in isRtl?
+        if (computedStyles.direction === 'rtl') {
+            switch (getRtlScrollSystem()) {
+                case 'negative':
+                    val = el.scrollWidth - el.clientWidth + val; // maxScrollDistance + val
+                    break;
+                case 'reverse':
+                    val = el.scrollWidth - el.clientWidth - val; // maxScrollDistance - val
+                    break;
+            }
+        }
+        return val;
+    }
+    /*
+    `val` is in the "negative" scheme
+    */
+    function setScrollFromStartingEdge(el, val) {
+        var computedStyles = window.getComputedStyle(el); // TODO: pass in isRtl?
+        if (computedStyles.direction === 'rtl') {
+            switch (getRtlScrollSystem()) {
+                case 'positive':
+                    val = (el.scrollWidth - el.clientWidth) + val; // maxScrollDistance + val
+                    break;
+                case 'reverse':
+                    val = -val;
+                    break;
+            }
+        }
+        el.scrollLeft = val;
+    }
+    // Horizontal Scroll System Detection
+    // ----------------------------------------------------------------------------------------------
+    var _rtlScrollSystem;
+    function getRtlScrollSystem() {
+        return _rtlScrollSystem || (_rtlScrollSystem = detectRtlScrollSystem());
+    }
+    function detectRtlScrollSystem() {
+        var el = htmlToElement("<div style=\" position: absolute; top: -1000px; width: 1px; height: 1px; overflow: scroll; direction: rtl; font-size: 100px; \">A</div>");
+        document.body.appendChild(el);
+        var system;
+        if (el.scrollLeft > 0) {
+            system = 'positive'; // scroll is a positive number from the left edge
+        }
+        else {
+            el.scrollLeft = 1;
+            if (el.scrollLeft > 0) {
+                system = 'reverse'; // scroll is a positive number from the right edge
+            }
+            else {
+                system = 'negative'; // scroll is a negative number from the right edge
+            }
+        }
+        removeElement(el);
+        return system;
+    }
+
+    var STICKY_PROP_VAL = computeStickyPropVal(); // if null, means not supported at all
+    var IS_MS_EDGE = /Edge/.test(navigator.userAgent); // TODO: what about Chromeum-based Edge?
+    var STICKY_SELECTOR = '.fc-sticky';
+    /*
+    useful beyond the native position:sticky for these reasons:
+    - support in IE11
+    - nice centering support
+
+    REQUIREMENT: fc-sticky elements, if the fc-sticky className is taken away, should NOT have relative or absolute positioning.
+    This is because we attach the coords with JS, and the VDOM might take away the fc-sticky class but doesn't know kill the positioning.
+
+    TODO: don't query text-align:center. isn't compatible with flexbox centering. instead, check natural X coord within parent container
+    */
+    var StickyScrolling = /** @class */ (function () {
+        function StickyScrolling(scrollEl, isRtl) {
+            var _this = this;
+            this.scrollEl = scrollEl;
+            this.isRtl = isRtl;
+            this.usingRelative = null;
+            this.updateSize = function () {
+                var scrollEl = _this.scrollEl;
+                var els = findElements(scrollEl, STICKY_SELECTOR);
+                var elGeoms = _this.queryElGeoms(els);
+                var viewportWidth = scrollEl.clientWidth;
+                var viewportHeight = scrollEl.clientHeight;
+                if (_this.usingRelative) {
+                    var elDestinations = _this.computeElDestinations(elGeoms, viewportWidth); // read before prepPositioning
+                    assignRelativePositions(els, elGeoms, elDestinations, viewportWidth, viewportHeight);
+                }
+                else {
+                    assignStickyPositions(els, elGeoms, viewportWidth);
+                }
+            };
+            this.usingRelative =
+                !STICKY_PROP_VAL || // IE11
+                    (IS_MS_EDGE && isRtl); // https://stackoverflow.com/questions/56835658/in-microsoft-edge-sticky-positioning-doesnt-work-when-combined-with-dir-rtl
+            if (this.usingRelative) {
+                this.listener = new ScrollListener(scrollEl);
+                this.listener.emitter.on('scrollEnd', this.updateSize);
+            }
+        }
+        StickyScrolling.prototype.destroy = function () {
+            if (this.listener) {
+                this.listener.destroy();
+            }
+        };
+        StickyScrolling.prototype.queryElGeoms = function (els) {
+            var _a = this, scrollEl = _a.scrollEl, isRtl = _a.isRtl;
+            var canvasOrigin = getScrollCanvasOrigin(scrollEl);
+            var elGeoms = [];
+            for (var _i = 0, els_1 = els; _i < els_1.length; _i++) {
+                var el = els_1[_i];
+                var parentBound = translateRect(computeInnerRect(el.parentNode, true, true), // weird way to call this!!!
+                -canvasOrigin.left, -canvasOrigin.top);
+                var elRect = el.getBoundingClientRect();
+                var computedStyles = window.getComputedStyle(el);
+                var textAlign = window.getComputedStyle(el.parentNode).textAlign; // ask the parent
+                var naturalBound = null;
+                if (textAlign === 'start') {
+                    textAlign = isRtl ? 'right' : 'left';
+                }
+                else if (textAlign === 'end') {
+                    textAlign = isRtl ? 'left' : 'right';
+                }
+                if (computedStyles.position !== 'sticky') {
+                    naturalBound = translateRect(elRect, -canvasOrigin.left - (parseFloat(computedStyles.left) || 0), // could be 'auto'
+                    -canvasOrigin.top - (parseFloat(computedStyles.top) || 0));
+                }
+                elGeoms.push({
+                    parentBound: parentBound,
+                    naturalBound: naturalBound,
+                    elWidth: elRect.width,
+                    elHeight: elRect.height,
+                    textAlign: textAlign
+                });
+            }
+            return elGeoms;
+        };
+        // only for IE
+        StickyScrolling.prototype.computeElDestinations = function (elGeoms, viewportWidth) {
+            var scrollEl = this.scrollEl;
+            var viewportTop = scrollEl.scrollTop;
+            var viewportLeft = getScrollFromLeftEdge(scrollEl);
+            var viewportRight = viewportLeft + viewportWidth;
+            return elGeoms.map(function (elGeom) {
+                var elWidth = elGeom.elWidth, elHeight = elGeom.elHeight, parentBound = elGeom.parentBound, naturalBound = elGeom.naturalBound;
+                var destLeft; // relative to canvas topleft
+                var destTop; // "
+                switch (elGeom.textAlign) {
+                    case 'left':
+                        destLeft = viewportLeft;
+                        break;
+                    case 'right':
+                        destLeft = viewportRight - elWidth;
+                        break;
+                    case 'center':
+                        destLeft = (viewportLeft + viewportRight) / 2 - elWidth / 2; /// noooo, use half-width insteadddddddd
+                        break;
+                }
+                destLeft = Math.min(destLeft, parentBound.right - elWidth);
+                destLeft = Math.max(destLeft, parentBound.left);
+                destTop = viewportTop;
+                destTop = Math.min(destTop, parentBound.bottom - elHeight);
+                destTop = Math.max(destTop, naturalBound.top); // better to use natural top for upper bound
+                return { left: destLeft, top: destTop };
+            });
+        };
+        return StickyScrolling;
+    }());
+    function assignRelativePositions(els, elGeoms, elDestinations, viewportWidth, viewportHeight) {
+        els.forEach(function (el, i) {
+            var _a = elGeoms[i], naturalBound = _a.naturalBound, parentBound = _a.parentBound;
+            var parentWidth = parentBound.right - parentBound.left;
+            var parentHeight = parentBound.bottom - parentBound.bottom;
+            var left;
+            var top;
+            if (parentWidth > viewportWidth ||
+                parentHeight > viewportHeight) {
+                left = elDestinations[i].left - naturalBound.left;
+                top = elDestinations[i].top - naturalBound.top;
+            }
+            else { // if parent container can be completely in view, we don't need stickiness
+                left = '';
+                top = '';
+            }
+            applyStyle(el, {
+                position: 'relative',
+                left: left,
+                right: -left,
+                top: top
+            });
+        });
+    }
+    function assignStickyPositions(els, elGeoms, viewportWidth) {
+        els.forEach(function (el, i) {
+            var _a = elGeoms[i], textAlign = _a.textAlign, elWidth = _a.elWidth, parentBound = _a.parentBound;
+            var parentWidth = parentBound.right - parentBound.left;
+            var left;
+            if (textAlign === 'center' &&
+                parentWidth > viewportWidth) {
+                left = (viewportWidth - elWidth) / 2;
+            }
+            else { // if parent container can be completely in view, we don't need stickiness
+                left = '';
+            }
+            applyStyle(el, {
+                left: left,
+                right: left,
+                top: 0
+            });
+        });
+    }
+    // overkill now that we use the stylesheet to set it!
+    // just test that the 'position' value of a div with the fc-sticky classname has the word 'sticky' in it
+    function computeStickyPropVal() {
+        var el = htmlToElement('<div style="position:-webkit-sticky;position:sticky"></div>');
+        var val = el.style.position;
+        if (val.indexOf('sticky') !== -1) {
+            return val;
+        }
+        else {
+            return null;
+        }
+    }
+
+    var ClippedScroller = /** @class */ (function (_super) {
+        __extends(ClippedScroller, _super);
+        function ClippedScroller() {
+            var _this = _super !== null && _super.apply(this, arguments) || this;
+            _this.elRef = createRef();
+            _this.state = {
+                xScrollbarWidth: getScrollbarWidths().x,
+                yScrollbarWidth: getScrollbarWidths().y
+            };
+            _this.handleScroller = function (scroller) {
+                _this.scroller = scroller;
+                setRef(_this.props.scrollerRef, scroller);
+            };
+            _this.handleSizing = function () {
+                var props = _this.props;
+                if (props.overflowY === 'scroll-hidden') {
+                    _this.setState({ yScrollbarWidth: _this.scroller.getYScrollbarWidth() });
+                }
+                if (props.overflowX === 'scroll-hidden') {
+                    _this.setState({ xScrollbarWidth: _this.scroller.getXScrollbarWidth() });
+                }
+            };
+            return _this;
+        }
+        ClippedScroller.prototype.render = function () {
+            var _a = this, props = _a.props, state = _a.state, context = _a.context;
+            var isScrollbarOnLeft = context.isRtl && getIsRtlScrollbarOnLeft();
+            var overcomeLeft = 0;
+            var overcomeRight = 0;
+            var overcomeBottom = 0;
+            if (props.overflowX === 'scroll-hidden') {
+                overcomeBottom = state.xScrollbarWidth;
+            }
+            if (props.overflowY === 'scroll-hidden') {
+                if (state.yScrollbarWidth != null) {
+                    if (isScrollbarOnLeft) {
+                        overcomeLeft = state.yScrollbarWidth;
+                    }
+                    else {
+                        overcomeRight = state.yScrollbarWidth;
+                    }
+                }
+            }
+            return (createElement("div", { ref: this.elRef, className: 'fc-scroller-harness' + (props.liquid ? ' fc-scroller-harness-liquid' : '') },
+                createElement(Scroller, { ref: this.handleScroller, elRef: this.props.scrollerElRef, overflowX: props.overflowX === 'scroll-hidden' ? 'scroll' : props.overflowX, overflowY: props.overflowY === 'scroll-hidden' ? 'scroll' : props.overflowY, overcomeLeft: overcomeLeft, overcomeRight: overcomeRight, overcomeBottom: overcomeBottom, maxHeight: typeof props.maxHeight === 'number' ? (props.maxHeight + (props.overflowX === 'scroll-hidden' ? state.xScrollbarWidth : 0)) : '', liquid: props.liquid, liquidIsAbsolute: true }, props.children)));
+        };
+        ClippedScroller.prototype.componentDidMount = function () {
+            this.handleSizing();
+            this.context.addResizeHandler(this.handleSizing);
+        };
+        ClippedScroller.prototype.componentDidUpdate = function (prevProps) {
+            if (!isPropsEqual(prevProps, this.props)) { // an external change?
+                this.handleSizing();
+            }
+        };
+        ClippedScroller.prototype.componentWillUnmount = function () {
+            this.context.removeResizeHandler(this.handleSizing);
+        };
+        ClippedScroller.prototype.needsXScrolling = function () {
+            return this.scroller.needsXScrolling();
+        };
+        ClippedScroller.prototype.needsYScrolling = function () {
+            return this.scroller.needsYScrolling();
+        };
+        return ClippedScroller;
+    }(BaseComponent));
+
+    var ScrollSyncer = /** @class */ (function () {
+        function ScrollSyncer(isVertical, scrollEls) {
+            var _this = this;
+            this.isVertical = isVertical;
+            this.scrollEls = scrollEls;
+            this.isPaused = false;
+            this.scrollListeners = scrollEls.map(function (el) { return _this.bindScroller(el); });
+        }
+        ScrollSyncer.prototype.destroy = function () {
+            for (var _i = 0, _a = this.scrollListeners; _i < _a.length; _i++) {
+                var scrollListener = _a[_i];
+                scrollListener.destroy();
+            }
+        };
+        ScrollSyncer.prototype.bindScroller = function (el) {
+            var _this = this;
+            var _a = this, scrollEls = _a.scrollEls, isVertical = _a.isVertical;
+            var scrollListener = new ScrollListener(el);
+            var onScroll = function (isWheel, isTouch) {
+                if (!_this.isPaused) {
+                    if (!_this.masterEl || (_this.masterEl !== el && (isWheel || isTouch))) {
+                        _this.assignMaster(el);
+                    }
+                    if (_this.masterEl === el) { // dealing with current
+                        for (var _i = 0, scrollEls_1 = scrollEls; _i < scrollEls_1.length; _i++) {
+                            var otherEl = scrollEls_1[_i];
+                            if (otherEl !== el) {
+                                if (isVertical) {
+                                    otherEl.scrollTop = el.scrollTop;
+                                }
+                                else {
+                                    otherEl.scrollLeft = el.scrollLeft;
+                                }
+                            }
+                        }
+                    }
+                }
+            };
+            var onScrollEnd = function () {
+                if (_this.masterEl === el) {
+                    _this.masterEl = null;
+                }
+            };
+            scrollListener.emitter.on('scroll', onScroll);
+            scrollListener.emitter.on('scrollEnd', onScrollEnd);
+            return scrollListener;
+        };
+        ScrollSyncer.prototype.assignMaster = function (el) {
+            this.masterEl = el;
+            for (var _i = 0, _a = this.scrollListeners; _i < _a.length; _i++) {
+                var scrollListener = _a[_i];
+                if (scrollListener.el !== el) {
+                    scrollListener.endScroll(); // to prevent residual scrolls from reclaiming master
+                }
+            }
+        };
+        /*
+        will normalize the scrollLeft value
+        */
+        ScrollSyncer.prototype.forceScrollLeft = function (scrollLeft) {
+            this.isPaused = true;
+            for (var _i = 0, _a = this.scrollListeners; _i < _a.length; _i++) {
+                var listener = _a[_i];
+                setScrollFromStartingEdge(listener.el, scrollLeft);
+            }
+            this.isPaused = false;
+        };
+        ScrollSyncer.prototype.forceScrollTop = function (top) {
+            this.isPaused = true;
+            for (var _i = 0, _a = this.scrollListeners; _i < _a.length; _i++) {
+                var listener = _a[_i];
+                listener.el.scrollTop = top;
+            }
+            this.isPaused = false;
+        };
+        return ScrollSyncer;
+    }());
+
+    var ScrollGrid = /** @class */ (function (_super) {
+        __extends(ScrollGrid, _super);
+        function ScrollGrid() {
+            var _this = _super !== null && _super.apply(this, arguments) || this;
+            _this.compileColGroupStats = memoizeArraylike(compileColGroupStat, isColGroupStatsEqual);
+            _this.renderMicroColGroups = memoizeArraylike(renderMicroColGroup); // yucky to memoize VNodes, but much more efficient for consumers
+            _this.clippedScrollerRefs = new RefMap();
+            _this.scrollerElRefs = new RefMap(_this._handleScrollerEl.bind(_this)); // doesn't hold non-scrolling els used just for padding
+            _this.chunkElRefs = new RefMap(_this._handleChunkEl.bind(_this));
+            _this.getStickyScrolling = memoizeArraylike(initStickyScrolling, null, destroyStickyScrolling);
+            _this.getScrollSyncersBySection = memoizeHashlike(initScrollSyncer.bind(_this, true), null, destroyScrollSyncer);
+            _this.getScrollSyncersByColumn = memoizeHashlike(initScrollSyncer.bind(_this, false), null, destroyScrollSyncer);
+            _this.stickyScrollings = [];
+            _this.scrollSyncersBySection = {};
+            _this.scrollSyncersByColumn = {};
+            // for row-height-syncing
+            _this.rowUnstableMap = new Map(); // no need to groom. always self-cancels
+            _this.rowInnerMaxHeightMap = new Map();
+            _this.anyRowHeightsChanged = false;
+            _this.state = {
+                shrinkWidths: [],
+                forceYScrollbars: false,
+                forceXScrollbars: false,
+                scrollerClientWidths: {},
+                scrollerClientHeights: {},
+                sectionRowMaxHeights: []
+            };
+            _this.handleSizing = function (sectionRowMaxHeightsChanged) {
+                if (!sectionRowMaxHeightsChanged) { // something else changed, probably external
+                    _this.anyRowHeightsChanged = true;
+                }
+                var otherState = {};
+                // if reacting to self-change of sectionRowMaxHeightsChanged, or not stable, don't do anything
+                if (!sectionRowMaxHeightsChanged && !_this.rowUnstableMap.size) {
+                    otherState.sectionRowMaxHeights = _this.computeSectionRowMaxHeights();
+                }
+                _this.setState(__assign(__assign({ shrinkWidths: _this.computeShrinkWidths() }, _this.computeScrollerDims()), otherState // wtf
+                ), function () {
+                    if (!_this.rowUnstableMap.size) {
+                        _this.updateStickyScrolling(); // needs to happen AFTER final positioning committed to DOM
+                    }
+                });
+            };
+            _this.handleRowHeightChange = function (rowEl, isStable) {
+                var _a = _this, rowUnstableMap = _a.rowUnstableMap, rowInnerMaxHeightMap = _a.rowInnerMaxHeightMap;
+                if (!isStable) {
+                    rowUnstableMap.set(rowEl, true);
+                }
+                else {
+                    rowUnstableMap.delete(rowEl);
+                    var innerMaxHeight = getRowInnerMaxHeight(rowEl);
+                    if (!rowInnerMaxHeightMap.has(rowEl) || rowInnerMaxHeightMap.get(rowEl) !== innerMaxHeight) {
+                        rowInnerMaxHeightMap.set(rowEl, innerMaxHeight);
+                        _this.anyRowHeightsChanged = true;
+                    }
+                    if (!rowUnstableMap.size && _this.anyRowHeightsChanged) {
+                        _this.anyRowHeightsChanged = false;
+                        _this.setState({
+                            sectionRowMaxHeights: _this.computeSectionRowMaxHeights()
+                        });
+                    }
+                }
+            };
+            return _this;
+        }
+        ScrollGrid.prototype.render = function () {
+            var _a = this, props = _a.props, state = _a.state, context = _a.context;
+            var shrinkWidths = state.shrinkWidths;
+            var colGroupStats = this.compileColGroupStats(props.colGroups.map(function (colGroup) { return [colGroup]; }));
+            var microColGroupNodes = this.renderMicroColGroups(colGroupStats.map(function (stat, i) { return [stat.cols, shrinkWidths[i]]; }));
+            var classNames = getScrollGridClassNames(props.liquid, context);
+            var _b = this.getDims(), sectionCnt = _b[0], chunksPerSection = _b[1];
+            // TODO: make DRY
+            var sectionConfigs = props.sections;
+            var configCnt = sectionConfigs.length;
+            var configI = 0;
+            var currentConfig;
+            var headSectionNodes = [];
+            var bodySectionNodes = [];
+            var footSectionNodes = [];
+            while (configI < configCnt && (currentConfig = sectionConfigs[configI]).type === 'header') {
+                headSectionNodes.push(this.renderSection(currentConfig, configI, colGroupStats, microColGroupNodes, state.sectionRowMaxHeights));
+                configI++;
+            }
+            while (configI < configCnt && (currentConfig = sectionConfigs[configI]).type === 'body') {
+                bodySectionNodes.push(this.renderSection(currentConfig, configI, colGroupStats, microColGroupNodes, state.sectionRowMaxHeights));
+                configI++;
+            }
+            while (configI < configCnt && (currentConfig = sectionConfigs[configI]).type === 'footer') {
+                footSectionNodes.push(this.renderSection(currentConfig, configI, colGroupStats, microColGroupNodes, state.sectionRowMaxHeights));
+                configI++;
+            }
+            return (createElement(Fragment, null,
+                createElement("table", { ref: props.elRef, className: classNames.join(' ') },
+                    renderMacroColGroup(colGroupStats, shrinkWidths),
+                    Boolean(headSectionNodes.length) && createElement.apply(void 0, __spreadArrays(['thead', {}], headSectionNodes)),
+                    Boolean(bodySectionNodes.length) && createElement.apply(void 0, __spreadArrays(['tbody', {}], bodySectionNodes)),
+                    Boolean(footSectionNodes.length) && createElement.apply(void 0, __spreadArrays(['tfoot', {}], footSectionNodes)))));
+        };
+        ScrollGrid.prototype.renderSection = function (sectionConfig, sectionIndex, colGroupStats, microColGroupNodes, sectionRowMaxHeights) {
+            var _this = this;
+            if ('outerContent' in sectionConfig) {
+                return (createElement(Fragment, { key: sectionConfig.key }, sectionConfig.outerContent));
+            }
+            return (createElement("tr", { key: sectionConfig.key, className: getSectionClassNames(sectionConfig, this.props.liquid).join(' ') }, sectionConfig.chunks.map(function (chunkConfig, i) {
+                return _this.renderChunk(sectionConfig, sectionIndex, colGroupStats[i], microColGroupNodes[i], chunkConfig, i, (sectionRowMaxHeights[sectionIndex] || [])[i] || []);
+            })));
+        };
+        ScrollGrid.prototype.renderChunk = function (sectionConfig, sectionIndex, colGroupStat, microColGroupNode, chunkConfig, chunkIndex, rowHeights) {
+            if ('outerContent' in chunkConfig) {
+                return (createElement(Fragment, { key: chunkConfig.key }, chunkConfig.outerContent));
+            }
+            var state = this.state;
+            var scrollerClientWidths = state.scrollerClientWidths, scrollerClientHeights = state.scrollerClientHeights;
+            var _a = this.getDims(), sectionCnt = _a[0], chunksPerSection = _a[1];
+            var index = sectionIndex * chunksPerSection + chunkIndex;
+            var sideScrollIndex = (!this.context.isRtl || getIsRtlScrollbarOnLeft()) ? chunksPerSection - 1 : 0;
+            var isVScrollSide = chunkIndex === sideScrollIndex;
+            var isLastSection = sectionIndex === sectionCnt - 1;
+            var forceXScrollbars = isLastSection && state.forceXScrollbars; // NOOOO can result in `null`
+            var forceYScrollbars = isVScrollSide && state.forceYScrollbars; // NOOOO can result in `null`
+            var allowXScrolling = colGroupStat && colGroupStat.allowXScrolling; // rename?
+            var allowYScrolling = getAllowYScrolling(this.props, sectionConfig); // rename? do in section func?
+            var chunkVGrow = getSectionHasLiquidHeight(this.props, sectionConfig); // do in section func?
+            var expandRows = sectionConfig.expandRows && chunkVGrow;
+            var tableMinWidth = (colGroupStat && colGroupStat.totalColMinWidth) || '';
+            var content = renderChunkContent(sectionConfig, chunkConfig, {
+                tableColGroupNode: microColGroupNode,
+                tableMinWidth: tableMinWidth,
+                clientWidth: scrollerClientWidths[index] !== undefined ? scrollerClientWidths[index] : null,
+                clientHeight: scrollerClientHeights[index] !== undefined ? scrollerClientHeights[index] : null,
+                expandRows: expandRows,
+                syncRowHeights: Boolean(sectionConfig.syncRowHeights),
+                rowSyncHeights: rowHeights,
+                reportRowHeightChange: this.handleRowHeightChange
+            });
+            var overflowX = forceXScrollbars ? (isLastSection ? 'scroll' : 'scroll-hidden') :
+                !allowXScrolling ? 'hidden' :
+                    (isLastSection ? 'auto' : 'scroll-hidden');
+            var overflowY = forceYScrollbars ? (isVScrollSide ? 'scroll' : 'scroll-hidden') :
+                !allowYScrolling ? 'hidden' :
+                    (isVScrollSide ? 'auto' : 'scroll-hidden');
+            // it *could* be possible to reduce DOM wrappers by only doing a ClippedScroller when allowXScrolling or allowYScrolling,
+            // but if these values were to change, the inner components would be unmounted/remounted because of the parent change.
+            content = (createElement(ClippedScroller, { ref: this.clippedScrollerRefs.createRef(index), scrollerElRef: this.scrollerElRefs.createRef(index), overflowX: overflowX, overflowY: overflowY, liquid: chunkVGrow, maxHeight: sectionConfig.maxHeight }, content));
+            return (createElement("td", { key: chunkConfig.key, ref: this.chunkElRefs.createRef(index) }, content));
+        };
+        ScrollGrid.prototype.componentDidMount = function () {
+            this.updateScrollSyncers();
+            this.handleSizing();
+            this.context.addResizeHandler(this.handleSizing);
+        };
+        ScrollGrid.prototype.componentDidUpdate = function (prevProps, prevState) {
+            this.updateScrollSyncers();
+            // TODO: need better solution when state contains non-sizing things
+            this.handleSizing(prevState.sectionRowMaxHeights !== this.state.sectionRowMaxHeights);
+        };
+        ScrollGrid.prototype.componentWillUnmount = function () {
+            this.context.removeResizeHandler(this.handleSizing);
+            this.destroyStickyScrolling();
+            this.destroyScrollSyncers();
+        };
+        ScrollGrid.prototype.computeShrinkWidths = function () {
+            var _this = this;
+            var colGroupStats = this.compileColGroupStats(this.props.colGroups.map(function (colGroup) { return [colGroup]; }));
+            var _a = this.getDims(), sectionCnt = _a[0], chunksPerSection = _a[1];
+            var cnt = sectionCnt * chunksPerSection;
+            var shrinkWidths = [];
+            colGroupStats.forEach(function (colGroupStat, i) {
+                if (colGroupStat.hasShrinkCol) {
+                    var chunkEls = _this.chunkElRefs.collect(i, cnt, chunksPerSection); // in one col
+                    shrinkWidths[i] = computeShrinkWidth(chunkEls);
+                }
+            });
+            return shrinkWidths;
+        };
+        // has the side effect of grooming rowInnerMaxHeightMap
+        // TODO: somehow short-circuit if there are no new height changes
+        ScrollGrid.prototype.computeSectionRowMaxHeights = function () {
+            var oldHeightMap = this.rowInnerMaxHeightMap;
+            var newHeightMap = new Map();
+            var _a = this.getDims(), sectionCnt = _a[0], chunksPerSection = _a[1];
+            var sectionRowMaxHeights = [];
+            for (var sectionI = 0; sectionI < sectionCnt; sectionI++) {
+                var sectionConfig = this.props.sections[sectionI];
+                var assignableHeights = []; // chunk, row
+                if (sectionConfig && sectionConfig.syncRowHeights) {
+                    var rowHeightsByChunk = [];
+                    for (var chunkI = 0; chunkI < chunksPerSection; chunkI++) {
+                        var index = sectionI * chunksPerSection + chunkI;
+                        var rowHeights = [];
+                        var chunkEl = this.chunkElRefs.currentMap[index];
+                        if (chunkEl) {
+                            rowHeights = findElements(chunkEl, '.fc-scrollgrid-sync-table tr').map(function (rowEl) {
+                                var max = oldHeightMap.get(rowEl);
+                                if (max == null) {
+                                    max = getRowInnerMaxHeight(rowEl);
+                                }
+                                newHeightMap.set(rowEl, max);
+                                return max;
+                            });
+                        }
+                        else {
+                            rowHeights = [];
+                        }
+                        rowHeightsByChunk.push(rowHeights);
+                    }
+                    var rowCnt = rowHeightsByChunk[0].length;
+                    var isEqualRowCnt = true;
+                    for (var chunkI = 1; chunkI < chunksPerSection; chunkI++) {
+                        var isOuterContent = sectionConfig.chunks[chunkI] && sectionConfig.chunks[chunkI].outerContent !== undefined; // can be null
+                        if (!isOuterContent && rowHeightsByChunk[chunkI].length !== rowCnt) { // skip outer content
+                            isEqualRowCnt = false;
+                            break;
+                        }
+                    }
+                    if (!isEqualRowCnt) {
+                        var chunkHeightSums = [];
+                        for (var chunkI = 0; chunkI < chunksPerSection; chunkI++) {
+                            chunkHeightSums.push(sumNumbers(rowHeightsByChunk[chunkI]) + rowHeightsByChunk[chunkI].length // add in border
+                            );
+                        }
+                        var maxTotalSum = Math.max.apply(Math, chunkHeightSums);
+                        for (var chunkI = 0; chunkI < chunksPerSection; chunkI++) {
+                            var rowInChunkCnt = rowHeightsByChunk[chunkI].length;
+                            var rowInChunkTotalHeight = maxTotalSum - rowInChunkCnt; // subtract border
+                            var rowInChunkHeightOthers = Math.floor(rowInChunkTotalHeight / rowInChunkCnt); // height of non-first row. we do this to avoid rounding, because it's unreliable within a table
+                            var rowInChunkHeightFirst = rowInChunkTotalHeight - rowInChunkHeightOthers * (rowInChunkCnt - 1); // whatever is leftover goes to the first row
+                            var rowInChunkHeights = [];
+                            var row = 0;
+                            if (row < rowInChunkCnt) {
+                                rowInChunkHeights.push(rowInChunkHeightFirst);
+                                row++;
+                            }
+                            while (row < rowInChunkCnt) {
+                                rowInChunkHeights.push(rowInChunkHeightOthers);
+                                row++;
+                            }
+                            assignableHeights.push(rowInChunkHeights);
+                        }
+                    }
+                    else {
+                        for (var chunkI = 0; chunkI < chunksPerSection; chunkI++) {
+                            assignableHeights.push([]);
+                        }
+                        for (var row = 0; row < rowCnt; row++) {
+                            var rowHeightsAcrossChunks = [];
+                            for (var chunkI = 0; chunkI < chunksPerSection; chunkI++) {
+                                var h = rowHeightsByChunk[chunkI][row];
+                                if (h != null) { // protect against outerContent
+                                    rowHeightsAcrossChunks.push(h);
+                                }
+                            }
+                            var maxHeight = Math.max.apply(Math, rowHeightsAcrossChunks);
+                            for (var chunkI = 0; chunkI < chunksPerSection; chunkI++) {
+                                assignableHeights[chunkI].push(maxHeight);
+                            }
+                        }
+                    }
+                }
+                sectionRowMaxHeights.push(assignableHeights);
+            }
+            this.rowInnerMaxHeightMap = newHeightMap;
+            return sectionRowMaxHeights;
+        };
+        ScrollGrid.prototype.computeScrollerDims = function () {
+            var scrollbarWidth = getScrollbarWidths();
+            var _a = this.getDims(), sectionCnt = _a[0], chunksPerSection = _a[1];
+            var sideScrollI = (!this.context.isRtl || getIsRtlScrollbarOnLeft()) ? chunksPerSection - 1 : 0;
+            var lastSectionI = sectionCnt - 1;
+            var currentScrollers = this.clippedScrollerRefs.currentMap;
+            var scrollerEls = this.scrollerElRefs.currentMap;
+            var forceYScrollbars = false;
+            var forceXScrollbars = false;
+            var scrollerClientWidths = {};
+            var scrollerClientHeights = {};
+            for (var sectionI = 0; sectionI < sectionCnt; sectionI++) { // along edge
+                var index = sectionI * chunksPerSection + sideScrollI;
+                var scroller = currentScrollers[index];
+                if (scroller && scroller.needsYScrolling()) {
+                    forceYScrollbars = true;
+                    break;
+                }
+            }
+            for (var chunkI = 0; chunkI < chunksPerSection; chunkI++) { // along last row
+                var index = lastSectionI * chunksPerSection + chunkI;
+                var scroller = currentScrollers[index];
+                if (scroller && scroller.needsXScrolling()) {
+                    forceXScrollbars = true;
+                    break;
+                }
+            }
+            for (var sectionI = 0; sectionI < sectionCnt; sectionI++) {
+                for (var chunkI = 0; chunkI < chunksPerSection; chunkI++) {
+                    var index = sectionI * chunksPerSection + chunkI;
+                    var scrollerEl = scrollerEls[index];
+                    if (scrollerEl) {
+                        var harnessEl = scrollerEl.parentNode; // TODO: weird way to get this. need harness b/c doesn't include table borders
+                        scrollerClientWidths[index] = Math.floor(harnessEl.getBoundingClientRect().width - ((chunkI === sideScrollI && forceYScrollbars)
+                            ? scrollbarWidth.y // use global because scroller might not have scrollbars yet but will need them in future
+                            : 0));
+                        scrollerClientHeights[index] = Math.floor(harnessEl.getBoundingClientRect().height - ((sectionI === lastSectionI && forceXScrollbars)
+                            ? scrollbarWidth.x // use global because scroller might not have scrollbars yet but will need them in future
+                            : 0));
+                    }
+                }
+            }
+            return { forceYScrollbars: forceYScrollbars, forceXScrollbars: forceXScrollbars, scrollerClientWidths: scrollerClientWidths, scrollerClientHeights: scrollerClientHeights };
+        };
+        ScrollGrid.prototype.updateStickyScrolling = function () {
+            var isRtl = this.context.isRtl;
+            var argsByKey = this.scrollerElRefs.getAll().map(function (scrollEl) { return [scrollEl, isRtl]; });
+            var stickyScrollings = this.getStickyScrolling(argsByKey);
+            for (var key in stickyScrollings) {
+                stickyScrollings[key].updateSize();
+            }
+            this.stickyScrollings = stickyScrollings;
+        };
+        ScrollGrid.prototype.destroyStickyScrolling = function () {
+            this.stickyScrollings.forEach(destroyStickyScrolling);
+        };
+        ScrollGrid.prototype.updateScrollSyncers = function () {
+            var _a = this.getDims(), sectionCnt = _a[0], chunksPerSection = _a[1];
+            var cnt = sectionCnt * chunksPerSection;
+            var scrollElsBySection = {};
+            var scrollElsByColumn = {};
+            var scrollElMap = this.scrollerElRefs.currentMap;
+            for (var sectionI = 0; sectionI < sectionCnt; sectionI++) {
+                var startIndex = sectionI * chunksPerSection;
+                var endIndex = startIndex + chunksPerSection;
+                scrollElsBySection[sectionI] = collectFromHash(scrollElMap, startIndex, endIndex, 1); // use the filtered
+            }
+            for (var col = 0; col < chunksPerSection; col++) {
+                scrollElsByColumn[col] = this.scrollerElRefs.collect(col, cnt, chunksPerSection); // DON'T use the filtered
+            }
+            this.scrollSyncersBySection = this.getScrollSyncersBySection(scrollElsBySection);
+            this.scrollSyncersByColumn = this.getScrollSyncersByColumn(scrollElsByColumn);
+        };
+        ScrollGrid.prototype.destroyScrollSyncers = function () {
+            mapHash(this.scrollSyncersBySection, destroyScrollSyncer);
+            mapHash(this.scrollSyncersByColumn, destroyScrollSyncer);
+        };
+        ScrollGrid.prototype.getChunkConfigByIndex = function (index) {
+            var chunksPerSection = this.getDims()[1];
+            var sectionI = Math.floor(index / chunksPerSection);
+            var chunkI = index % chunksPerSection;
+            var sectionConfig = this.props.sections[sectionI];
+            return sectionConfig && sectionConfig.chunks[chunkI];
+        };
+        ScrollGrid.prototype.forceScrollLeft = function (col, scrollLeft) {
+            var scrollSyncer = this.scrollSyncersByColumn[col];
+            if (scrollSyncer) {
+                scrollSyncer.forceScrollLeft(scrollLeft);
+            }
+        };
+        ScrollGrid.prototype.forceScrollTop = function (sectionI, scrollTop) {
+            var scrollSyncer = this.scrollSyncersBySection[sectionI];
+            if (scrollSyncer) {
+                scrollSyncer.forceScrollTop(scrollTop);
+            }
+        };
+        ScrollGrid.prototype._handleChunkEl = function (chunkEl, key) {
+            var chunkConfig = this.getChunkConfigByIndex(parseInt(key, 10));
+            if (chunkConfig) { // null if section disappeared. bad, b/c won't null-set the elRef
+                setRef(chunkConfig.elRef, chunkEl);
+            }
+        };
+        ScrollGrid.prototype._handleScrollerEl = function (scrollerEl, key) {
+            var chunkConfig = this.getChunkConfigByIndex(parseInt(key, 10));
+            if (chunkConfig) { // null if section disappeared. bad, b/c won't null-set the elRef
+                setRef(chunkConfig.scrollerElRef, scrollerEl);
+            }
+        };
+        ScrollGrid.prototype.getDims = function () {
+            var sectionCnt = this.props.sections.length;
+            var chunksPerSection = sectionCnt ? this.props.sections[0].chunks.length : 0;
+            return [sectionCnt, chunksPerSection];
+        };
+        return ScrollGrid;
+    }(BaseComponent));
+    ScrollGrid.addStateEquality({
+        shrinkWidths: isArraysEqual,
+        scrollerClientWidths: isPropsEqual,
+        scrollerClientHeights: isPropsEqual
+    });
+    function sumNumbers(numbers) {
+        var sum = 0;
+        for (var _i = 0, numbers_1 = numbers; _i < numbers_1.length; _i++) {
+            var n = numbers_1[_i];
+            sum += n;
+        }
+        return sum;
+    }
+    function getRowInnerMaxHeight(rowEl) {
+        var innerHeights = findElements(rowEl, '.fc-scrollgrid-sync-inner').map(getElHeight);
+        if (innerHeights.length) {
+            return Math.max.apply(Math, innerHeights);
+        }
+        return 0;
+    }
+    function getElHeight(el) {
+        return el.offsetHeight; // better to deal with integers, for rounding, for PureComponent
+    }
+    function renderMacroColGroup(colGroupStats, shrinkWidths) {
+        var children = colGroupStats.map(function (colGroupStat, i) {
+            var width = colGroupStat.width;
+            if (width === 'shrink') {
+                width = colGroupStat.totalColWidth + sanitizeShrinkWidth(shrinkWidths[i]) + 1; // +1 for border :(
+            }
+            return ( // eslint-disable-next-line react/jsx-key
+            createElement("col", { style: { width: width } }));
+        });
+        return createElement.apply(void 0, __spreadArrays(['colgroup', {}], children));
+    }
+    function compileColGroupStat(colGroupConfig) {
+        var totalColWidth = sumColProp(colGroupConfig.cols, 'width'); // excludes "shrink"
+        var totalColMinWidth = sumColProp(colGroupConfig.cols, 'minWidth');
+        var hasShrinkCol = hasShrinkWidth(colGroupConfig.cols);
+        var allowXScrolling = colGroupConfig.width !== 'shrink' && Boolean(totalColWidth || totalColMinWidth || hasShrinkCol);
+        return {
+            hasShrinkCol: hasShrinkCol,
+            totalColWidth: totalColWidth,
+            totalColMinWidth: totalColMinWidth,
+            allowXScrolling: allowXScrolling,
+            cols: colGroupConfig.cols,
+            width: colGroupConfig.width
+        };
+    }
+    function sumColProp(cols, propName) {
+        var total = 0;
+        for (var _i = 0, cols_1 = cols; _i < cols_1.length; _i++) {
+            var col = cols_1[_i];
+            var val = col[propName];
+            if (typeof val === 'number') {
+                total += val * (col.span || 1);
+            }
+        }
+        return total;
+    }
+    var COL_GROUP_STAT_EQUALITY = {
+        cols: isColPropsEqual
+    };
+    function isColGroupStatsEqual(stat0, stat1) {
+        return compareObjs(stat0, stat1, COL_GROUP_STAT_EQUALITY);
+    }
+    // for memoizers...
+    function initScrollSyncer(isVertical) {
+        var scrollEls = [];
+        for (var _i = 1; _i < arguments.length; _i++) {
+            scrollEls[_i - 1] = arguments[_i];
+        }
+        return new ScrollSyncer(isVertical, scrollEls);
+    }
+    function destroyScrollSyncer(scrollSyncer) {
+        scrollSyncer.destroy();
+    }
+    function initStickyScrolling(scrollEl, isRtl) {
+        return new StickyScrolling(scrollEl, isRtl);
+    }
+    function destroyStickyScrolling(stickyScrolling) {
+        stickyScrolling.destroy();
+    }
+
+    var scrollGridPlugin = createPlugin({
+        deps: [
+            premiumCommonPlugin
+        ],
+        scrollGridImpl: ScrollGrid
+    });
+
+    var contexts = [];
+    var undoFuncs = [];
+    var adaptivePlugin = createPlugin({
+        deps: [
+            premiumCommonPlugin
+        ],
+        contextInit: function (context) {
+            if (!contexts.length) {
+                attachGlobalHandlers();
+            }
+            contexts.push(context);
+            context.calendarApi.on('_unmount', function () {
+                removeExact(contexts, context);
+                if (!contexts.length) {
+                    removeGlobalHandlers();
+                }
+            });
+        }
+    });
+    function attachGlobalHandlers() {
+        window.addEventListener('beforeprint', handleBeforePrint);
+        window.addEventListener('afterprint', handleAfterPrint);
+        // // for testing
+        // let forPrint = false
+        // document.addEventListener('keypress', (ev) => {
+        //   if (ev.key === 'p') {
+        //     forPrint = !forPrint
+        //     if (forPrint) {
+        //       handleBeforePrint()
+        //     } else {
+        //       handleAfterPrint()
+        //     }
+        //   }
+        // })
+    }
+    function removeGlobalHandlers() {
+        window.removeEventListener('beforeprint', handleBeforePrint);
+        window.removeEventListener('afterprint', handleAfterPrint);
+    }
+    function handleBeforePrint() {
+        var scrollEls = queryScrollerEls();
+        var scrollCoords = queryScrollerCoords(scrollEls);
+        for (var _i = 0, contexts_1 = contexts; _i < contexts_1.length; _i++) {
+            var context = contexts_1[_i];
+            context.emitter.trigger('_beforeprint');
+        }
+        flushToDom$1(); // because printing grabs DOM immediately after
+        killHorizontalScrolling(scrollEls, scrollCoords);
+        undoFuncs.push(function () { return restoreScrollerCoords(scrollEls, scrollCoords); });
+        undoFuncs.push(freezeScrollgridWidths());
+    }
+    function handleAfterPrint() {
+        for (var _i = 0, contexts_2 = contexts; _i < contexts_2.length; _i++) {
+            var context = contexts_2[_i];
+            context.emitter.trigger('_afterprint');
+        }
+        flushToDom$1(); // guarantee that there are real scrollers
+        while (undoFuncs.length) {
+            undoFuncs.shift()();
+        }
+    }
+    // scrollgrid widths
+    function freezeScrollgridWidths() {
+        var els = findElements(document.body, '.fc-scrollgrid');
+        els.forEach(freezeScrollGridWidth);
+        return function () { return els.forEach(unfreezeScrollGridWidth); };
+    }
+    function freezeScrollGridWidth(el) {
+        el.style.width = el.getBoundingClientRect().width + 'px';
+    }
+    function unfreezeScrollGridWidth(el) {
+        el.style.width = '';
+    }
+    // scrollers
+    // TODO: use scroll normalization!? yes
+    function queryScrollerEls() {
+        return findElements(document.body, '.fc-scroller-harness > .fc-scroller');
+    }
+    function queryScrollerCoords(els) {
+        return els.map(function (el) {
+            var computedStyle = window.getComputedStyle(el);
+            return {
+                scrollLeft: el.scrollLeft,
+                scrollTop: el.scrollTop,
+                overflowX: computedStyle.overflowX,
+                overflowY: computedStyle.overflowY,
+                marginBottom: computedStyle.marginBottom
+            };
+        });
+    }
+    function killHorizontalScrolling(els, coords) {
+        els.forEach(function (el, i) {
+            el.style.overflowX = 'visible'; // need to clear X/Y to get true overflow
+            el.style.overflowY = 'visible'; // "
+            el.style.marginBottom = ''; // for clipping away scrollbar. disable
+            el.style.left = -coords[i].scrollLeft + 'px'; // simulate scrollLeft! will be position:relative
+        });
+    }
+    function restoreScrollerCoords(els, coords) {
+        els.forEach(function (el, i) {
+            var c = coords[i];
+            el.style.overflowX = c.overflowX;
+            el.style.overflowY = c.overflowY;
+            el.style.marginBottom = c.marginBottom;
+            el.style.left = '';
+            el.scrollLeft = c.scrollLeft;
+            el.scrollTop = c.scrollTop;
+        });
+    }
+
+    var MIN_AUTO_LABELS = 18; // more than `12` months but less that `24` hours
+    var MAX_AUTO_SLOTS_PER_LABEL = 6; // allows 6 10-min slots in an hour
+    var MAX_AUTO_CELLS = 200; // allows 4-days to have a :30 slot duration
+    config.MAX_TIMELINE_SLOTS = 1000;
+    // potential nice values for slot-duration and interval-duration
+    var STOCK_SUB_DURATIONS$1 = [
+        { years: 1 },
+        { months: 1 },
+        { days: 1 },
+        { hours: 1 },
+        { minutes: 30 },
+        { minutes: 15 },
+        { minutes: 10 },
+        { minutes: 5 },
+        { minutes: 1 },
+        { seconds: 30 },
+        { seconds: 15 },
+        { seconds: 10 },
+        { seconds: 5 },
+        { seconds: 1 },
+        { milliseconds: 500 },
+        { milliseconds: 100 },
+        { milliseconds: 10 },
+        { milliseconds: 1 }
+    ];
+    function buildTimelineDateProfile(dateProfile, dateEnv, allOptions, dateProfileGenerator) {
+        var tDateProfile = {
+            labelInterval: allOptions.slotLabelInterval,
+            slotDuration: allOptions.slotDuration
+        };
+        validateLabelAndSlot(tDateProfile, dateProfile, dateEnv); // validate after computed grid duration
+        ensureLabelInterval(tDateProfile, dateProfile, dateEnv);
+        ensureSlotDuration(tDateProfile, dateProfile, dateEnv);
+        var input = allOptions.slotLabelFormat;
+        var rawFormats = Array.isArray(input) ? input :
+            (input != null) ? [input] :
+                computeHeaderFormats(tDateProfile, dateProfile, dateEnv, allOptions);
+        tDateProfile.headerFormats = rawFormats.map(function (rawFormat) {
+            return createFormatter(rawFormat);
+        });
+        tDateProfile.isTimeScale = Boolean(tDateProfile.slotDuration.milliseconds);
+        var largeUnit = null;
+        if (!tDateProfile.isTimeScale) {
+            var slotUnit = greatestDurationDenominator(tDateProfile.slotDuration).unit;
+            if (/year|month|week/.test(slotUnit)) {
+                largeUnit = slotUnit;
+            }
+        }
+        tDateProfile.largeUnit = largeUnit;
+        tDateProfile.emphasizeWeeks =
+            isSingleDay(tDateProfile.slotDuration) &&
+                currentRangeAs('weeks', dateProfile, dateEnv) >= 2 &&
+                !allOptions.businessHours;
+        /*
+        console.log('label interval =', timelineView.labelInterval.humanize())
+        console.log('slot duration =', timelineView.slotDuration.humanize())
+        console.log('header formats =', timelineView.headerFormats)
+        console.log('isTimeScale', timelineView.isTimeScale)
+        console.log('largeUnit', timelineView.largeUnit)
+        */
+        var rawSnapDuration = allOptions.snapDuration;
+        var snapDuration;
+        var snapsPerSlot;
+        if (rawSnapDuration) {
+            snapDuration = createDuration(rawSnapDuration);
+            snapsPerSlot = wholeDivideDurations(tDateProfile.slotDuration, snapDuration);
+            // ^ TODO: warning if not whole?
+        }
+        if (snapsPerSlot == null) {
+            snapDuration = tDateProfile.slotDuration;
+            snapsPerSlot = 1;
+        }
+        tDateProfile.snapDuration = snapDuration;
+        tDateProfile.snapsPerSlot = snapsPerSlot;
+        // more...
+        var timeWindowMs = asRoughMs(dateProfile.slotMaxTime) - asRoughMs(dateProfile.slotMinTime);
+        // TODO: why not use normalizeRange!?
+        var normalizedStart = normalizeDate(dateProfile.renderRange.start, tDateProfile, dateEnv);
+        var normalizedEnd = normalizeDate(dateProfile.renderRange.end, tDateProfile, dateEnv);
+        // apply slotMinTime/slotMaxTime
+        // TODO: View should be responsible.
+        if (tDateProfile.isTimeScale) {
+            normalizedStart = dateEnv.add(normalizedStart, dateProfile.slotMinTime);
+            normalizedEnd = dateEnv.add(addDays(normalizedEnd, -1), dateProfile.slotMaxTime);
+        }
+        tDateProfile.timeWindowMs = timeWindowMs;
+        tDateProfile.normalizedRange = { start: normalizedStart, end: normalizedEnd };
+        var slotDates = [];
+        var date = normalizedStart;
+        while (date < normalizedEnd) {
+            if (isValidDate$1(date, tDateProfile, dateProfile, dateProfileGenerator)) {
+                slotDates.push(date);
+            }
+            date = dateEnv.add(date, tDateProfile.slotDuration);
+        }
+        tDateProfile.slotDates = slotDates;
+        // more...
+        var snapIndex = -1;
+        var snapDiff = 0; // index of the diff :(
+        var snapDiffToIndex = [];
+        var snapIndexToDiff = [];
+        date = normalizedStart;
+        while (date < normalizedEnd) {
+            if (isValidDate$1(date, tDateProfile, dateProfile, dateProfileGenerator)) {
+                snapIndex++;
+                snapDiffToIndex.push(snapIndex);
+                snapIndexToDiff.push(snapDiff);
+            }
+            else {
+                snapDiffToIndex.push(snapIndex + 0.5);
+            }
+            date = dateEnv.add(date, tDateProfile.snapDuration);
+            snapDiff++;
+        }
+        tDateProfile.snapDiffToIndex = snapDiffToIndex;
+        tDateProfile.snapIndexToDiff = snapIndexToDiff;
+        tDateProfile.snapCnt = snapIndex + 1; // is always one behind
+        tDateProfile.slotCnt = tDateProfile.snapCnt / tDateProfile.snapsPerSlot;
+        // more...
+        tDateProfile.isWeekStarts = buildIsWeekStarts(tDateProfile, dateEnv);
+        tDateProfile.cellRows = buildCellRows(tDateProfile, dateEnv);
+        tDateProfile.slotsPerLabel = wholeDivideDurations(tDateProfile.labelInterval, tDateProfile.slotDuration);
+        return tDateProfile;
+    }
+    /*
+    snaps to appropriate unit
+    */
+    function normalizeDate(date, tDateProfile, dateEnv) {
+        var normalDate = date;
+        if (!tDateProfile.isTimeScale) {
+            normalDate = startOfDay(normalDate);
+            if (tDateProfile.largeUnit) {
+                normalDate = dateEnv.startOf(normalDate, tDateProfile.largeUnit);
+            }
+        }
+        return normalDate;
+    }
+    /*
+    snaps to appropriate unit
+    */
+    function normalizeRange(range, tDateProfile, dateEnv) {
+        if (!tDateProfile.isTimeScale) {
+            range = computeVisibleDayRange(range);
+            if (tDateProfile.largeUnit) {
+                var dayRange = range; // preserve original result
+                range = {
+                    start: dateEnv.startOf(range.start, tDateProfile.largeUnit),
+                    end: dateEnv.startOf(range.end, tDateProfile.largeUnit)
+                };
+                // if date is partially through the interval, or is in the same interval as the start,
+                // make the exclusive end be the *next* interval
+                if (range.end.valueOf() !== dayRange.end.valueOf() || range.end <= range.start) {
+                    range = {
+                        start: range.start,
+                        end: dateEnv.add(range.end, tDateProfile.slotDuration)
+                    };
+                }
+            }
+        }
+        return range;
+    }
+    function isValidDate$1(date, tDateProfile, dateProfile, dateProfileGenerator) {
+        if (dateProfileGenerator.isHiddenDay(date)) {
+            return false;
+        }
+        else if (tDateProfile.isTimeScale) {
+            // determine if the time is within slotMinTime/slotMaxTime, which may have wacky values
+            var day = startOfDay(date);
+            var timeMs = date.valueOf() - day.valueOf();
+            var ms = timeMs - asRoughMs(dateProfile.slotMinTime); // milliseconds since slotMinTime
+            ms = ((ms % 86400000) + 86400000) % 86400000; // make negative values wrap to 24hr clock
+            return ms < tDateProfile.timeWindowMs; // before the slotMaxTime?
+        }
+        else {
+            return true;
+        }
+    }
+    function validateLabelAndSlot(tDateProfile, dateProfile, dateEnv) {
+        var currentRange = dateProfile.currentRange;
+        // make sure labelInterval doesn't exceed the max number of cells
+        if (tDateProfile.labelInterval) {
+            var labelCnt = dateEnv.countDurationsBetween(currentRange.start, currentRange.end, tDateProfile.labelInterval);
+            if (labelCnt > config.MAX_TIMELINE_SLOTS) {
+                console.warn('slotLabelInterval results in too many cells');
+                tDateProfile.labelInterval = null;
+            }
+        }
+        // make sure slotDuration doesn't exceed the maximum number of cells
+        if (tDateProfile.slotDuration) {
+            var slotCnt = dateEnv.countDurationsBetween(currentRange.start, currentRange.end, tDateProfile.slotDuration);
+            if (slotCnt > config.MAX_TIMELINE_SLOTS) {
+                console.warn('slotDuration results in too many cells');
+                tDateProfile.slotDuration = null;
+            }
+        }
+        // make sure labelInterval is a multiple of slotDuration
+        if (tDateProfile.labelInterval && tDateProfile.slotDuration) {
+            var slotsPerLabel = wholeDivideDurations(tDateProfile.labelInterval, tDateProfile.slotDuration);
+            if (slotsPerLabel === null || slotsPerLabel < 1) {
+                console.warn('slotLabelInterval must be a multiple of slotDuration');
+                tDateProfile.slotDuration = null;
+            }
+        }
+    }
+    function ensureLabelInterval(tDateProfile, dateProfile, dateEnv) {
+        var currentRange = dateProfile.currentRange;
+        var labelInterval = tDateProfile.labelInterval;
+        if (!labelInterval) {
+            // compute based off the slot duration
+            // find the largest label interval with an acceptable slots-per-label
+            var input = void 0;
+            if (tDateProfile.slotDuration) {
+                for (var _i = 0, STOCK_SUB_DURATIONS_1 = STOCK_SUB_DURATIONS$1; _i < STOCK_SUB_DURATIONS_1.length; _i++) {
+                    input = STOCK_SUB_DURATIONS_1[_i];
+                    var tryLabelInterval = createDuration(input);
+                    var slotsPerLabel = wholeDivideDurations(tryLabelInterval, tDateProfile.slotDuration);
+                    if (slotsPerLabel !== null && slotsPerLabel <= MAX_AUTO_SLOTS_PER_LABEL) {
+                        labelInterval = tryLabelInterval;
+                        break;
+                    }
+                }
+                // use the slot duration as a last resort
+                if (!labelInterval) {
+                    labelInterval = tDateProfile.slotDuration;
+                }
+                // compute based off the view's duration
+                // find the largest label interval that yields the minimum number of labels
+            }
+            else {
+                for (var _a = 0, STOCK_SUB_DURATIONS_2 = STOCK_SUB_DURATIONS$1; _a < STOCK_SUB_DURATIONS_2.length; _a++) {
+                    input = STOCK_SUB_DURATIONS_2[_a];
+                    labelInterval = createDuration(input);
+                    var labelCnt = dateEnv.countDurationsBetween(currentRange.start, currentRange.end, labelInterval);
+                    if (labelCnt >= MIN_AUTO_LABELS) {
+                        break;
+                    }
+                }
+            }
+            tDateProfile.labelInterval = labelInterval;
+        }
+        return labelInterval;
+    }
+    function ensureSlotDuration(tDateProfile, dateProfile, dateEnv) {
+        var currentRange = dateProfile.currentRange;
+        var slotDuration = tDateProfile.slotDuration;
+        if (!slotDuration) {
+            var labelInterval = ensureLabelInterval(tDateProfile, dateProfile, dateEnv); // will compute if necessary
+            // compute based off the label interval
+            // find the largest slot duration that is different from labelInterval, but still acceptable
+            for (var _i = 0, STOCK_SUB_DURATIONS_3 = STOCK_SUB_DURATIONS$1; _i < STOCK_SUB_DURATIONS_3.length; _i++) {
+                var input = STOCK_SUB_DURATIONS_3[_i];
+                var trySlotDuration = createDuration(input);
+                var slotsPerLabel = wholeDivideDurations(labelInterval, trySlotDuration);
+                if (slotsPerLabel !== null && slotsPerLabel > 1 && slotsPerLabel <= MAX_AUTO_SLOTS_PER_LABEL) {
+                    slotDuration = trySlotDuration;
+                    break;
+                }
+            }
+            // only allow the value if it won't exceed the view's # of slots limit
+            if (slotDuration) {
+                var slotCnt = dateEnv.countDurationsBetween(currentRange.start, currentRange.end, slotDuration);
+                if (slotCnt > MAX_AUTO_CELLS) {
+                    slotDuration = null;
+                }
+            }
+            // use the label interval as a last resort
+            if (!slotDuration) {
+                slotDuration = labelInterval;
+            }
+            tDateProfile.slotDuration = slotDuration;
+        }
+        return slotDuration;
+    }
+    function computeHeaderFormats(tDateProfile, dateProfile, dateEnv, allOptions) {
+        var format1;
+        var format2;
+        var labelInterval = tDateProfile.labelInterval;
+        var unit = greatestDurationDenominator(labelInterval).unit;
+        var weekNumbersVisible = allOptions.weekNumbers;
+        var format0 = (format1 = (format2 = null));
+        // NOTE: weekNumber computation function wont work
+        if ((unit === 'week') && !weekNumbersVisible) {
+            unit = 'day';
+        }
+        switch (unit) {
+            case 'year':
+                format0 = { year: 'numeric' }; // '2015'
+                break;
+            case 'month':
+                if (currentRangeAs('years', dateProfile, dateEnv) > 1) {
+                    format0 = { year: 'numeric' }; // '2015'
+                }
+                format1 = { month: 'short' }; // 'Jan'
+                break;
+            case 'week':
+                if (currentRangeAs('years', dateProfile, dateEnv) > 1) {
+                    format0 = { year: 'numeric' }; // '2015'
+                }
+                format1 = { week: 'narrow' }; // 'Wk4'
+                break;
+            case 'day':
+                if (currentRangeAs('years', dateProfile, dateEnv) > 1) {
+                    format0 = { year: 'numeric', month: 'long' }; // 'January 2014'
+                }
+                else if (currentRangeAs('months', dateProfile, dateEnv) > 1) {
+                    format0 = { month: 'long' }; // 'January'
+                }
+                if (weekNumbersVisible) {
+                    format1 = { week: 'short' }; // 'Wk 4'
+                }
+                format2 = { weekday: 'narrow', day: 'numeric' }; // 'Su 9'
+                break;
+            case 'hour':
+                if (weekNumbersVisible) {
+                    format0 = { week: 'short' }; // 'Wk 4'
+                }
+                if (currentRangeAs('days', dateProfile, dateEnv) > 1) {
+                    format1 = { weekday: 'short', day: 'numeric', month: 'numeric', omitCommas: true }; // Sat 4/7
+                }
+                format2 = {
+                    hour: 'numeric',
+                    minute: '2-digit',
+                    omitZeroMinute: true,
+                    meridiem: 'short'
+                };
+                break;
+            case 'minute':
+                // sufficiently large number of different minute cells?
+                if ((asRoughMinutes(labelInterval) / 60) >= MAX_AUTO_SLOTS_PER_LABEL) {
+                    format0 = {
+                        hour: 'numeric',
+                        meridiem: 'short'
+                    };
+                    format1 = function (params) {
+                        return ':' + padStart(params.date.minute, 2); // ':30'
+                    };
+                }
+                else {
+                    format0 = {
+                        hour: 'numeric',
+                        minute: 'numeric',
+                        meridiem: 'short'
+                    };
+                }
+                break;
+            case 'second':
+                // sufficiently large number of different second cells?
+                if ((asRoughSeconds(labelInterval) / 60) >= MAX_AUTO_SLOTS_PER_LABEL) {
+                    format0 = { hour: 'numeric', minute: '2-digit', meridiem: 'lowercase' }; // '8:30 PM'
+                    format1 = function (params) {
+                        return ':' + padStart(params.date.second, 2); // ':30'
+                    };
+                }
+                else {
+                    format0 = { hour: 'numeric', minute: '2-digit', second: '2-digit', meridiem: 'lowercase' }; // '8:30:45 PM'
+                }
+                break;
+            case 'millisecond':
+                format0 = { hour: 'numeric', minute: '2-digit', second: '2-digit', meridiem: 'lowercase' }; // '8:30:45 PM'
+                format1 = function (params) {
+                    return '.' + padStart(params.millisecond, 3);
+                };
+                break;
+        }
+        return [].concat(format0 || [], format1 || [], format2 || []);
+    }
+    // Compute the number of the give units in the "current" range.
+    // Won't go more precise than days.
+    // Will return `0` if there's not a clean whole interval.
+    function currentRangeAs(unit, dateProfile, dateEnv) {
+        var range = dateProfile.currentRange;
+        var res = null;
+        if (unit === 'years') {
+            res = dateEnv.diffWholeYears(range.start, range.end);
+        }
+        else if (unit === 'months') {
+            res = dateEnv.diffWholeMonths(range.start, range.end);
+        }
+        else if (unit === 'weeks') {
+            res = dateEnv.diffWholeMonths(range.start, range.end);
+        }
+        else if (unit === 'days') {
+            res = diffWholeDays(range.start, range.end);
+        }
+        return res || 0;
+    }
+    function buildIsWeekStarts(tDateProfile, dateEnv) {
+        var slotDates = tDateProfile.slotDates, emphasizeWeeks = tDateProfile.emphasizeWeeks;
+        var prevWeekNumber = null;
+        var isWeekStarts = [];
+        for (var _i = 0, slotDates_1 = slotDates; _i < slotDates_1.length; _i++) {
+            var slotDate = slotDates_1[_i];
+            var weekNumber = dateEnv.computeWeekNumber(slotDate);
+            var isWeekStart = emphasizeWeeks && (prevWeekNumber !== null) && (prevWeekNumber !== weekNumber);
+            prevWeekNumber = weekNumber;
+            isWeekStarts.push(isWeekStart);
+        }
+        return isWeekStarts;
+    }
+    function buildCellRows(tDateProfile, dateEnv) {
+        var slotDates = tDateProfile.slotDates;
+        var formats = tDateProfile.headerFormats;
+        var cellRows = formats.map(function (format) { return []; }); // indexed by row,col
+        // specifically for navclicks
+        var rowUnits = formats.map(function (format) {
+            return format.getLargestUnit ? format.getLargestUnit() : null;
+        });
+        // builds cellRows and slotCells
+        for (var i = 0; i < slotDates.length; i++) {
+            var date = slotDates[i];
+            var isWeekStart = tDateProfile.isWeekStarts[i];
+            for (var row = 0; row < formats.length; row++) {
+                var format = formats[row];
+                var rowCells = cellRows[row];
+                var leadingCell = rowCells[rowCells.length - 1];
+                var isSuperRow = (formats.length > 1) && (row < (formats.length - 1)); // more than one row and not the last
+                var newCell = null;
+                if (isSuperRow) {
+                    var text = dateEnv.format(date, format);
+                    if (!leadingCell || (leadingCell.text !== text)) {
+                        newCell = buildCellObject(date, text, rowUnits[row]);
+                    }
+                    else {
+                        leadingCell.colspan += 1;
+                    }
+                }
+                else {
+                    if (!leadingCell ||
+                        isInt(dateEnv.countDurationsBetween(tDateProfile.normalizedRange.start, date, tDateProfile.labelInterval))) {
+                        var text = dateEnv.format(date, format);
+                        newCell = buildCellObject(date, text, rowUnits[row]);
+                    }
+                    else {
+                        leadingCell.colspan += 1;
+                    }
+                }
+                if (newCell) {
+                    newCell.weekStart = isWeekStart;
+                    rowCells.push(newCell);
+                }
+            }
+        }
+        return cellRows;
+    }
+    function buildCellObject(date, text, rowUnit) {
+        return { date: date, text: text, rowUnit: rowUnit, colspan: 1, isWeekStart: false };
+    }
+
+    var TimelineHeaderTh = /** @class */ (function (_super) {
+        __extends(TimelineHeaderTh, _super);
+        function TimelineHeaderTh() {
+            var _this = _super !== null && _super.apply(this, arguments) || this;
+            _this.refineHookProps = memoizeObjArg(refineHookProps$1);
+            _this.normalizeClassNames = buildClassNameNormalizer();
+            return _this;
+        }
+        TimelineHeaderTh.prototype.render = function () {
+            var _a = this, props = _a.props, context = _a.context;
+            var dateEnv = context.dateEnv, options = context.options;
+            var cell = props.cell, dateProfile = props.dateProfile, tDateProfile = props.tDateProfile;
+            // the cell.rowUnit is f'd
+            // giving 'month' for a 3-day view
+            // workaround: to infer day, do NOT time
+            var dateMeta = getDateMeta(cell.date, props.todayRange, props.nowDate, dateProfile);
+            var classNames = ['fc-timeline-slot', 'fc-timeline-slot-label'].concat(cell.rowUnit === 'time' // TODO: so slot classnames for week/month/bigger. see note above about rowUnit
+                ? getSlotClassNames(dateMeta, context.theme)
+                : getDayClassNames(dateMeta, context.theme));
+            if (cell.isWeekStart) {
+                classNames.push('fc-timeline-slot-em');
+            }
+            var navLinkData = (options.navLinks && cell.rowUnit && cell.rowUnit !== 'time')
+                ? buildNavLinkData(cell.date, cell.rowUnit)
+                : null;
+            var hookProps = this.refineHookProps({
+                dateMarker: cell.date,
+                text: cell.text,
+                dateEnv: context.dateEnv,
+                viewApi: context.viewApi
+            });
+            var customClassNames = this.normalizeClassNames(options.slotLabelClassNames, hookProps);
+            return (createElement(MountHook, { hookProps: hookProps, didMount: options.slotLabelDidMount, willUnmount: options.slotLabelWillUnmount }, function (rootElRef) { return (createElement("th", { ref: rootElRef, className: classNames.concat(customClassNames).join(' '), "data-date": dateEnv.formatIso(cell.date, { omitTime: !tDateProfile.isTimeScale, omitTimeZoneOffset: true }), colSpan: cell.colspan },
+                createElement("div", { className: 'fc-timeline-slot-frame', style: { height: props.rowInnerHeight } },
+                    createElement(TimelineHeaderThInner, { hookProps: hookProps, isSticky: props.isSticky, navLinkData: navLinkData })))); }));
+        };
+        return TimelineHeaderTh;
+    }(BaseComponent));
+    var TimelineHeaderThInner = /** @class */ (function (_super) {
+        __extends(TimelineHeaderThInner, _super);
+        function TimelineHeaderThInner() {
+            return _super !== null && _super.apply(this, arguments) || this;
+        }
+        TimelineHeaderThInner.prototype.render = function () {
+            var _a = this, props = _a.props, context = _a.context;
+            var navLinkAttrs = props.navLinkData
+                ? { 'data-navlink': props.navLinkData, tabIndex: 0 }
+                : {};
+            return (createElement(ContentHook, { hookProps: props.hookProps, content: context.options.slotLabelContent, defaultContent: renderInnerContent$5 }, function (innerElRef, innerContent) { return (createElement("a", __assign({ ref: innerElRef, className: 'fc-timeline-slot-cushion fc-scrollgrid-sync-inner' + (props.isSticky ? ' fc-sticky' : '') }, navLinkAttrs), innerContent)); }));
+        };
+        return TimelineHeaderThInner;
+    }(BaseComponent));
+    function renderInnerContent$5(props) {
+        return props.text;
+    }
+    function refineHookProps$1(input) {
+        return {
+            date: input.dateEnv.toDate(input.dateMarker),
+            view: input.viewApi,
+            text: input.text
+        };
+    }
+
+    var TimelineHeaderRows = /** @class */ (function (_super) {
+        __extends(TimelineHeaderRows, _super);
+        function TimelineHeaderRows() {
+            return _super !== null && _super.apply(this, arguments) || this;
+        }
+        TimelineHeaderRows.prototype.render = function () {
+            var _a = this.props, dateProfile = _a.dateProfile, tDateProfile = _a.tDateProfile, rowInnerHeights = _a.rowInnerHeights, todayRange = _a.todayRange, nowDate = _a.nowDate;
+            var cellRows = tDateProfile.cellRows;
+            return (createElement(Fragment, null, cellRows.map(function (rowCells, i) {
+                var isLast = i === cellRows.length - 1;
+                var isChrono = tDateProfile.isTimeScale && isLast; // the final row, with times?
+                var classNames = [
+                    'fc-timeline-header-row',
+                    isChrono ? 'fc-timeline-header-row-chrono' : ''
+                ];
+                return (createElement("tr", { key: i, className: classNames.join(' ') }, rowCells.map(function (cell) { return (createElement(TimelineHeaderTh, { key: cell.date.toISOString(), cell: cell, dateProfile: dateProfile, tDateProfile: tDateProfile, todayRange: todayRange, nowDate: nowDate, rowInnerHeight: rowInnerHeights && rowInnerHeights[i], isSticky: !isLast })); })));
+            })));
+        };
+        return TimelineHeaderRows;
+    }(BaseComponent));
+
+    var TimelineHeader = /** @class */ (function (_super) {
+        __extends(TimelineHeader, _super);
+        function TimelineHeader() {
+            var _this = _super !== null && _super.apply(this, arguments) || this;
+            _this.rootElRef = createRef();
+            return _this;
+        }
+        TimelineHeader.prototype.render = function () {
+            var _this = this;
+            var _a = this, props = _a.props, context = _a.context;
+            // TODO: very repetitive
+            // TODO: make part of tDateProfile?
+            var timerUnit = greatestDurationDenominator(props.tDateProfile.slotDuration).unit;
+            return (createElement(NowTimer, { unit: timerUnit }, function (nowDate, todayRange) { return (createElement("div", { className: 'fc-timeline-header', ref: _this.rootElRef },
+                createElement("table", { className: 'fc-scrollgrid-sync-table', style: { minWidth: props.tableMinWidth, width: props.clientWidth } },
+                    props.tableColGroupNode,
+                    createElement("tbody", null,
+                        createElement(TimelineHeaderRows, { dateProfile: props.dateProfile, tDateProfile: props.tDateProfile, nowDate: nowDate, todayRange: todayRange, rowInnerHeights: props.rowInnerHeights }))),
+                (context.options.nowIndicator && props.slatCoords && props.slatCoords.isDateInRange(nowDate)) &&
+                    createElement(NowIndicatorRoot, { isAxis: true, date: nowDate }, function (rootElRef, classNames, innerElRef, innerContent) { return (createElement("div", { ref: rootElRef, className: ['fc-timeline-now-indicator-arrow'].concat(classNames).join(' '), style: { left: props.slatCoords.dateToCoord(nowDate) } }, innerContent)); }))); }));
+        };
+        TimelineHeader.prototype.componentDidMount = function () {
+            this.updateSize();
+        };
+        TimelineHeader.prototype.componentDidUpdate = function () {
+            this.updateSize();
+        };
+        TimelineHeader.prototype.updateSize = function () {
+            if (this.props.onMaxCushionWidth) {
+                this.props.onMaxCushionWidth(this.computeMaxCushionWidth());
+            }
+        };
+        TimelineHeader.prototype.computeMaxCushionWidth = function () {
+            return Math.max.apply(Math, findElements(this.rootElRef.current, '.fc-timeline-header-row:last-child .fc-timeline-slot-cushion').map(function (el) { return el.getBoundingClientRect().width; }));
+        };
+        return TimelineHeader;
+    }(BaseComponent));
+
+    var TimelineSlatCell = /** @class */ (function (_super) {
+        __extends(TimelineSlatCell, _super);
+        function TimelineSlatCell() {
+            return _super !== null && _super.apply(this, arguments) || this;
+        }
+        TimelineSlatCell.prototype.render = function () {
+            var _a = this, props = _a.props, context = _a.context;
+            var dateEnv = context.dateEnv, options = context.options, theme = context.theme;
+            var date = props.date, tDateProfile = props.tDateProfile, isEm = props.isEm;
+            var dateMeta = getDateMeta(props.date, props.todayRange, props.nowDate, props.dateProfile);
+            var classNames = ['fc-timeline-slot', 'fc-timeline-slot-lane'];
+            var dataAttrs = { 'data-date': dateEnv.formatIso(date, { omitTimeZoneOffset: true, omitTime: !tDateProfile.isTimeScale }) };
+            var hookProps = __assign(__assign({ date: dateEnv.toDate(props.date) }, dateMeta), { view: context.viewApi });
+            if (isEm) {
+                classNames.push('fc-timeline-slot-em');
+            }
+            if (tDateProfile.isTimeScale) {
+                classNames.push(isInt(dateEnv.countDurationsBetween(tDateProfile.normalizedRange.start, props.date, tDateProfile.labelInterval)) ?
+                    'fc-timeline-slot-major' :
+                    'fc-timeline-slot-minor');
+            }
+            classNames.push.apply(classNames, (props.isDay
+                ? getDayClassNames(dateMeta, theme)
+                : getSlotClassNames(dateMeta, theme)));
+            return (createElement(RenderHook, { hookProps: hookProps, classNames: options.slotLaneClassNames, content: options.slotLaneContent, didMount: options.slotLaneDidMount, willUnmount: options.slotLaneWillUnmount, elRef: props.elRef }, function (rootElRef, customClassNames, innerElRef, innerContent) { return (createElement("td", __assign({ ref: rootElRef, className: classNames.concat(customClassNames).join(' ') }, dataAttrs),
+                createElement("div", { ref: innerElRef }, innerContent))); }));
+        };
+        return TimelineSlatCell;
+    }(BaseComponent));
+
+    var TimelineCoords = /** @class */ (function () {
+        function TimelineCoords(slatRootEl, // okay to expose?
+        slatEls, dateProfile, tDateProfile, dateEnv, isRtl) {
+            this.slatRootEl = slatRootEl;
+            this.dateProfile = dateProfile;
+            this.tDateProfile = tDateProfile;
+            this.dateEnv = dateEnv;
+            this.isRtl = isRtl;
+            this.outerCoordCache = new PositionCache(slatRootEl, slatEls, true, // isHorizontal
+            false // isVertical
+            );
+            // for the inner divs within the slats
+            // used for event rendering and scrollTime, to disregard slat border
+            this.innerCoordCache = new PositionCache(slatRootEl, findDirectChildren(slatEls, 'div'), true, // isHorizontal
+            false // isVertical
+            );
+        }
+        TimelineCoords.prototype.rangeToCoords = function (range) {
+            if (this.isRtl) {
+                return { right: this.dateToCoord(range.start), left: this.dateToCoord(range.end) };
+            }
+            else {
+                return { left: this.dateToCoord(range.start), right: this.dateToCoord(range.end) };
+            }
+        };
+        TimelineCoords.prototype.isDateInRange = function (date) {
+            return rangeContainsMarker(this.dateProfile.currentRange, date);
+        };
+        // for LTR, results range from 0 to width of area
+        // for RTL, results range from negative width of area to 0
+        TimelineCoords.prototype.dateToCoord = function (date) {
+            var tDateProfile = this.tDateProfile;
+            var snapCoverage = this.computeDateSnapCoverage(date);
+            var slotCoverage = snapCoverage / tDateProfile.snapsPerSlot;
+            var slotIndex = Math.floor(slotCoverage);
+            slotIndex = Math.min(slotIndex, tDateProfile.slotCnt - 1);
+            var partial = slotCoverage - slotIndex;
+            var _a = this, innerCoordCache = _a.innerCoordCache, outerCoordCache = _a.outerCoordCache;
+            if (this.isRtl) {
+                return (outerCoordCache.rights[slotIndex] -
+                    (innerCoordCache.getWidth(slotIndex) * partial)) - outerCoordCache.originClientRect.width;
+            }
+            else {
+                return (outerCoordCache.lefts[slotIndex] +
+                    (innerCoordCache.getWidth(slotIndex) * partial));
+            }
+        };
+        // returned value is between 0 and the number of snaps
+        TimelineCoords.prototype.computeDateSnapCoverage = function (date) {
+            return computeDateSnapCoverage(date, this.tDateProfile, this.dateEnv);
+        };
+        TimelineCoords.prototype.computeDurationLeft = function (duration) {
+            var _a = this, dateProfile = _a.dateProfile, dateEnv = _a.dateEnv, isRtl = _a.isRtl;
+            var left = 0;
+            if (dateProfile) {
+                left = this.dateToCoord(dateEnv.add(startOfDay(dateProfile.activeRange.start), // startOfDay needed?
+                duration));
+                // hack to overcome the left borders of non-first slat
+                if (!isRtl && left) {
+                    left += 1;
+                }
+            }
+            return left;
+        };
+        return TimelineCoords;
+    }());
+    // returned value is between 0 and the number of snaps
+    function computeDateSnapCoverage(date, tDateProfile, dateEnv) {
+        var snapDiff = dateEnv.countDurationsBetween(tDateProfile.normalizedRange.start, date, tDateProfile.snapDuration);
+        if (snapDiff < 0) {
+            return 0;
+        }
+        else if (snapDiff >= tDateProfile.snapDiffToIndex.length) {
+            return tDateProfile.snapCnt;
+        }
+        else {
+            var snapDiffInt = Math.floor(snapDiff);
+            var snapCoverage = tDateProfile.snapDiffToIndex[snapDiffInt];
+            if (isInt(snapCoverage)) { // not an in-between value
+                snapCoverage += snapDiff - snapDiffInt; // add the remainder
+            }
+            else {
+                // a fractional value, meaning the date is not visible
+                // always round up in this case. works for start AND end dates in a range.
+                snapCoverage = Math.ceil(snapCoverage);
+            }
+            return snapCoverage;
+        }
+    }
+
+    var TimelineSlats = /** @class */ (function (_super) {
+        __extends(TimelineSlats, _super);
+        function TimelineSlats() {
+            var _this = _super !== null && _super.apply(this, arguments) || this;
+            _this.rootElRef = createRef();
+            _this.cellElRefs = new RefMap();
+            _this.handleScrollRequest = function (request) {
+                var onScrollLeftRequest = _this.props.onScrollLeftRequest;
+                var coords = _this.coords;
+                if (onScrollLeftRequest && coords) {
+                    if (request.time) {
+                        var scrollLeft = coords.computeDurationLeft(request.time);
+                        onScrollLeftRequest(scrollLeft);
+                    }
+                    return true;
+                }
+            };
+            return _this;
+        }
+        TimelineSlats.prototype.render = function () {
+            var _a = this, props = _a.props, context = _a.context;
+            return (createElement("div", { className: 'fc-timeline-slots', ref: this.rootElRef },
+                createElement("table", { className: context.theme.getClass('table'), style: {
+                        minWidth: props.tableMinWidth,
+                        width: props.clientWidth
+                    } },
+                    props.tableColGroupNode,
+                    createElement(TimelineSlatsBody, { cellElRefs: this.cellElRefs, dateProfile: props.dateProfile, tDateProfile: props.tDateProfile, nowDate: props.nowDate, todayRange: props.todayRange }))));
+        };
+        TimelineSlats.prototype.componentDidMount = function () {
+            this.updateSizing();
+            this.scrollResponder = this.context.createScrollResponder(this.handleScrollRequest);
+        };
+        TimelineSlats.prototype.componentDidUpdate = function (prevProps) {
+            this.updateSizing();
+            this.scrollResponder.update(prevProps.dateProfile !== this.props.dateProfile);
+        };
+        TimelineSlats.prototype.componentWillUnmount = function () {
+            this.scrollResponder.detach();
+            if (this.props.onCoords) {
+                this.props.onCoords(null);
+            }
+        };
+        TimelineSlats.prototype.updateSizing = function () {
+            var _a = this, props = _a.props, context = _a.context;
+            if (props.clientWidth !== null && // is sizing stable?
+                this.scrollResponder // it's possible to have clientWidth immediately after mount (when returning from print view), but w/o scrollResponder
+            ) {
+                var rootEl = this.rootElRef.current;
+                if (rootEl.offsetWidth) {
+                    this.coords = new TimelineCoords(this.rootElRef.current, collectCellEls$1(this.cellElRefs.currentMap, props.tDateProfile.slotDates), props.dateProfile, props.tDateProfile, context.dateEnv, context.isRtl);
+                    if (props.onCoords) {
+                        props.onCoords(this.coords);
+                    }
+                    this.scrollResponder.update(false); // TODO: wouldn't have to do this if coords were in state
+                }
+            }
+        };
+        TimelineSlats.prototype.positionToHit = function (leftPosition) {
+            var outerCoordCache = this.coords.outerCoordCache;
+            var _a = this.context, dateEnv = _a.dateEnv, isRtl = _a.isRtl;
+            var tDateProfile = this.props.tDateProfile;
+            var slatIndex = outerCoordCache.leftToIndex(leftPosition);
+            if (slatIndex != null) {
+                // somewhat similar to what TimeGrid does. consolidate?
+                var slatWidth = outerCoordCache.getWidth(slatIndex);
+                var partial = isRtl ?
+                    (outerCoordCache.rights[slatIndex] - leftPosition) / slatWidth :
+                    (leftPosition - outerCoordCache.lefts[slatIndex]) / slatWidth;
+                var localSnapIndex = Math.floor(partial * tDateProfile.snapsPerSlot);
+                var start = dateEnv.add(tDateProfile.slotDates[slatIndex], multiplyDuration(tDateProfile.snapDuration, localSnapIndex));
+                var end = dateEnv.add(start, tDateProfile.snapDuration);
+                return {
+                    dateSpan: {
+                        range: { start: start, end: end },
+                        allDay: !this.props.tDateProfile.isTimeScale
+                    },
+                    dayEl: this.cellElRefs.currentMap[slatIndex],
+                    left: outerCoordCache.lefts[slatIndex],
+                    right: outerCoordCache.rights[slatIndex]
+                };
+            }
+            return null;
+        };
+        return TimelineSlats;
+    }(BaseComponent));
+    var TimelineSlatsBody = /** @class */ (function (_super) {
+        __extends(TimelineSlatsBody, _super);
+        function TimelineSlatsBody() {
+            return _super !== null && _super.apply(this, arguments) || this;
+        }
+        TimelineSlatsBody.prototype.render = function () {
+            var props = this.props;
+            var tDateProfile = props.tDateProfile, cellElRefs = props.cellElRefs;
+            var slotDates = tDateProfile.slotDates, isWeekStarts = tDateProfile.isWeekStarts;
+            var isDay = !tDateProfile.isTimeScale && !tDateProfile.largeUnit;
+            return (createElement("tbody", null,
+                createElement("tr", null, slotDates.map(function (slotDate, i) {
+                    var key = slotDate.toISOString();
+                    return (createElement(TimelineSlatCell, { key: key, elRef: cellElRefs.createRef(key), date: slotDate, dateProfile: props.dateProfile, tDateProfile: tDateProfile, nowDate: props.nowDate, todayRange: props.todayRange, isEm: isWeekStarts[i], isDay: isDay }));
+                }))));
+        };
+        return TimelineSlatsBody;
+    }(BaseComponent));
+    function collectCellEls$1(elMap, slotDates) {
+        return slotDates.map(function (slotDate) {
+            var key = slotDate.toISOString();
+            return elMap[key];
+        });
+    }
+
+    var TimelineLaneBg = /** @class */ (function (_super) {
+        __extends(TimelineLaneBg, _super);
+        function TimelineLaneBg() {
+            return _super !== null && _super.apply(this, arguments) || this;
+        }
+        TimelineLaneBg.prototype.render = function () {
+            var props = this.props;
+            var highlightSeg = [].concat(props.eventResizeSegs, props.dateSelectionSegs);
+            return props.timelineCoords && (createElement("div", { className: 'fc-timeline-bg' },
+                this.renderSegs(props.businessHourSegs || [], props.timelineCoords, 'non-business'),
+                this.renderSegs(props.bgEventSegs || [], props.timelineCoords, 'bg-event'),
+                this.renderSegs(highlightSeg, props.timelineCoords, 'highlight')));
+        };
+        TimelineLaneBg.prototype.renderSegs = function (segs, timelineCoords, fillType) {
+            var _a = this.props, todayRange = _a.todayRange, nowDate = _a.nowDate;
+            var children = segs.map(function (seg) {
+                var coords = timelineCoords.rangeToCoords(seg); // seg has { start, end }
+                return (createElement("div", { key: buildEventRangeKey(seg.eventRange), className: 'fc-timeline-bg-harness', style: {
+                        left: coords.left,
+                        right: -coords.right // outwards from right edge (which is same as left edge)
+                    } }, fillType === 'bg-event' ?
+                    createElement(BgEvent, __assign({ seg: seg }, getSegMeta(seg, todayRange, nowDate))) :
+                    renderFill(fillType)));
+            });
+            return createElement(Fragment, null, children);
+        };
+        return TimelineLaneBg;
+    }(BaseComponent));
+
+    var TimelineLaneSlicer = /** @class */ (function (_super) {
+        __extends(TimelineLaneSlicer, _super);
+        function TimelineLaneSlicer() {
+            return _super !== null && _super.apply(this, arguments) || this;
+        }
+        TimelineLaneSlicer.prototype.sliceRange = function (origRange, dateProfile, dateProfileGenerator, tDateProfile, dateEnv) {
+            var normalRange = normalizeRange(origRange, tDateProfile, dateEnv);
+            var segs = [];
+            // protect against when the span is entirely in an invalid date region
+            if (computeDateSnapCoverage(normalRange.start, tDateProfile, dateEnv) < computeDateSnapCoverage(normalRange.end, tDateProfile, dateEnv)) {
+                // intersect the footprint's range with the grid's range
+                var slicedRange = intersectRanges(normalRange, tDateProfile.normalizedRange);
+                if (slicedRange) {
+                    segs.push({
+                        start: slicedRange.start,
+                        end: slicedRange.end,
+                        isStart: slicedRange.start.valueOf() === normalRange.start.valueOf() && isValidDate$1(slicedRange.start, tDateProfile, dateProfile, dateProfileGenerator),
+                        isEnd: slicedRange.end.valueOf() === normalRange.end.valueOf() && isValidDate$1(addMs(slicedRange.end, -1), tDateProfile, dateProfile, dateProfileGenerator)
+                    });
+                }
+            }
+            return segs;
+        };
+        return TimelineLaneSlicer;
+    }(Slicer));
+
+    var DEFAULT_TIME_FORMAT$2 = createFormatter({
+        hour: 'numeric',
+        minute: '2-digit',
+        omitZeroMinute: true,
+        meridiem: 'narrow'
+    });
+    var TimelineEvent = /** @class */ (function (_super) {
+        __extends(TimelineEvent, _super);
+        function TimelineEvent() {
+            return _super !== null && _super.apply(this, arguments) || this;
+        }
+        TimelineEvent.prototype.render = function () {
+            var props = this.props;
+            return (createElement(StandardEvent, __assign({}, props, { extraClassNames: ['fc-timeline-event', 'fc-h-event'], defaultTimeFormat: DEFAULT_TIME_FORMAT$2, defaultDisplayEventTime: !props.isTimeScale })));
+        };
+        return TimelineEvent;
+    }(BaseComponent));
+
+    function computeSegHorizontals$1(segs, timelineCoords) {
+        var horizontals = {};
+        if (timelineCoords) {
+            for (var _i = 0, segs_1 = segs; _i < segs_1.length; _i++) {
+                var seg = segs_1[_i];
+                var instanceId = seg.eventRange.instance.instanceId;
+                horizontals[instanceId] = timelineCoords.rangeToCoords(seg); // seg has { start, end }
+            }
+        }
+        return horizontals;
+    }
+    function computeSegVerticals$1(segs, eventOrderSpecs, dimHash) {
+        var placements = []; // sorted by top
+        var maxBottom = 0;
+        if (dimHash) { // protection for if dims not computed yet
+            segs = sortEventSegs(segs, eventOrderSpecs);
+            for (var _i = 0, segs_2 = segs; _i < segs_2.length; _i++) {
+                var seg = segs_2[_i];
+                var key = seg.eventRange.instance.instanceId;
+                var dims = dimHash[key];
+                if (dims) { // MORE-link protection
+                    var top_1 = 0;
+                    var insertI = 0; // where to start searching for an insert position
+                    for (var i = 0; i < placements.length; i++) { // loop through existing placements
+                        var placement = placements[i];
+                        if (testCollide(dims, top_1, placement.dims, placement.top)) {
+                            top_1 = placement.top + placement.dims.height;
+                            insertI = i;
+                        }
+                    }
+                    // move insertI along to be after the placement whos top is below the current top
+                    while (insertI < placements.length && top_1 >= placements[insertI].top) {
+                        insertI++;
+                    }
+                    placements.splice(insertI, 0, { key: key, dims: dims, top: top_1 }); // insert
+                    maxBottom = Math.max(maxBottom, top_1 + dims.height);
+                }
+            }
+        }
+        var topHash = {};
+        for (var _a = 0, placements_1 = placements; _a < placements_1.length; _a++) {
+            var placement = placements_1[_a];
+            topHash[placement.key] = placement.top;
+        }
+        return { segTops: topHash, height: maxBottom };
+    }
+    function testCollide(dims0, top0, dims1, top1) {
+        return dims0.right > dims1.left &&
+            dims0.left < dims1.right &&
+            top0 + dims0.height > top1 &&
+            top0 < top1 + dims1.height;
+    }
+
+    var TimelineLane = /** @class */ (function (_super) {
+        __extends(TimelineLane, _super);
+        function TimelineLane() {
+            var _this = _super !== null && _super.apply(this, arguments) || this;
+            _this.slicer = new TimelineLaneSlicer();
+            _this.computeFgSegHorizontals = memoize(computeSegHorizontals$1); // only for fg event segs, not mirror
+            _this.computeSegVerticals = memoize(computeSegVerticals$1);
+            _this.harnessElRefs = new RefMap();
+            _this.innerElRef = createRef();
+            _this.state = {
+                segDims: null
+            };
+            return _this;
+        }
+        TimelineLane.prototype.render = function () {
+            var _a = this, props = _a.props, state = _a.state, context = _a.context;
+            var dateProfile = props.dateProfile, tDateProfile = props.tDateProfile;
+            var slicedProps = this.slicer.sliceProps(props, dateProfile, tDateProfile.isTimeScale ? null : props.nextDayThreshold, context, // wish we didn't have to pass in the rest of the args...
+            dateProfile, context.dateProfileGenerator, tDateProfile, context.dateEnv);
+            var mirrorSegs = (slicedProps.eventDrag ? slicedProps.eventDrag.segs : null) ||
+                (slicedProps.eventResize ? slicedProps.eventResize.segs : null) ||
+                [];
+            var segHorizontals = this.computeFgSegHorizontals(slicedProps.fgEventSegs, props.timelineCoords); // ONLY for non-mirror. needed?
+            var _b = this.computeSegVerticals(slicedProps.fgEventSegs, context.options.eventOrder, state.segDims), segTops = _b.segTops, height = _b.height;
+            var hiddenSegs = // TODO: more convenient
+             (slicedProps.eventDrag ? slicedProps.eventDrag.affectedInstances : null) ||
+                (slicedProps.eventResize ? slicedProps.eventResize.affectedInstances : null) ||
+                {};
+            return (createElement(Fragment, null,
+                createElement(TimelineLaneBg, { businessHourSegs: slicedProps.businessHourSegs, bgEventSegs: slicedProps.bgEventSegs, timelineCoords: props.timelineCoords, eventResizeSegs: slicedProps.eventResize ? slicedProps.eventResize.segs : [] /* bad new empty array? */, dateSelectionSegs: slicedProps.dateSelectionSegs, nowDate: props.nowDate, todayRange: props.todayRange }),
+                createElement("div", { className: 'fc-timeline-events fc-scrollgrid-sync-inner', ref: this.innerElRef, style: { height: height /* computed by computeSegVerticals */ } },
+                    this.renderFgSegs(slicedProps.fgEventSegs, segHorizontals, segTops, hiddenSegs, false, false, false),
+                    this.renderFgSegs(mirrorSegs, computeSegHorizontals$1(mirrorSegs, props.timelineCoords), // not memoized
+                    segTops, // reuse same tops for mirror
+                    {}, Boolean(slicedProps.eventDrag), Boolean(slicedProps.eventResize), false // because mirror is never drawn for date selection
+                    ))));
+        };
+        TimelineLane.prototype.componentDidMount = function () {
+            this.updateSize();
+        };
+        TimelineLane.prototype.componentDidUpdate = function (prevProps, prevState) {
+            if (prevProps.eventStore !== this.props.eventStore ||
+                prevProps.timelineCoords !== this.props.timelineCoords
+            // won't trigger on a segDims change
+            ) {
+                this.updateSize();
+            }
+        };
+        TimelineLane.prototype.updateSize = function () {
+            var _this = this;
+            var props = this.props;
+            var timelineCoords = props.timelineCoords;
+            if (props.onHeightChange) {
+                props.onHeightChange(this.innerElRef.current, false);
+            }
+            if (timelineCoords) {
+                var originRect_1 = timelineCoords.slatRootEl.getBoundingClientRect();
+                this.setState({
+                    segDims: mapHash(this.harnessElRefs.currentMap, function (harnessEl) {
+                        var harnessRect = harnessEl.getBoundingClientRect();
+                        return {
+                            left: Math.round(harnessRect.left - originRect_1.left),
+                            right: Math.round(harnessRect.right - originRect_1.left),
+                            height: Math.round(harnessRect.height)
+                        };
+                    })
+                }, function () {
+                    if (props.onHeightChange) {
+                        props.onHeightChange(_this.innerElRef.current, true);
+                    }
+                });
+            }
+        };
+        TimelineLane.prototype.renderFgSegs = function (segs, segHorizontals, segTops, hiddenSegs, isDragging, isResizing, isDateSelecting) {
+            var _this = this;
+            var _a = this, harnessElRefs = _a.harnessElRefs, props = _a.props;
+            var isMirror = isDragging || isResizing || isDateSelecting;
+            return (createElement(Fragment, null, segs.map(function (seg) {
+                var instanceId = seg.eventRange.instance.instanceId;
+                var horizontalCoords = segHorizontals[instanceId];
+                var top = segTops[instanceId];
+                return (createElement("div", { key: instanceId, ref: isMirror ? null : harnessElRefs.createRef(instanceId), className: 'fc-timeline-event-harness', style: {
+                        left: horizontalCoords ? horizontalCoords.left : '',
+                        right: horizontalCoords ? -horizontalCoords.right : '',
+                        top: top != null ? top : '',
+                        visibility: hiddenSegs[instanceId] ? 'hidden' : '' /* wtf, file @types/react bug */
+                    } },
+                    createElement(TimelineEvent, __assign({ isTimeScale: _this.props.tDateProfile.isTimeScale, seg: seg, isDragging: isDragging, isResizing: isResizing, isDateSelecting: isDateSelecting, isSelected: instanceId === _this.props.eventSelection /* TODO: bad for mirror? */ }, getSegMeta(seg, props.todayRange, props.nowDate)))));
+            })));
+        };
+        return TimelineLane;
+    }(BaseComponent));
+
+    var TimelineGrid = /** @class */ (function (_super) {
+        __extends(TimelineGrid, _super);
+        function TimelineGrid() {
+            var _this = _super !== null && _super.apply(this, arguments) || this;
+            _this.slatsRef = createRef();
+            _this.state = {
+                coords: null
+            };
+            _this.handeEl = function (el) {
+                if (el) {
+                    _this.context.registerInteractiveComponent(_this, { el: el });
+                }
+                else {
+                    _this.context.unregisterInteractiveComponent(_this);
+                }
+            };
+            _this.handleCoords = function (coords) {
+                _this.setState({ coords: coords });
+                if (_this.props.onSlatCoords) {
+                    _this.props.onSlatCoords(coords);
+                }
+            };
+            return _this;
+        }
+        TimelineGrid.prototype.render = function () {
+            var _this = this;
+            var _a = this, props = _a.props, state = _a.state, context = _a.context;
+            var options = context.options;
+            var dateProfile = props.dateProfile, tDateProfile = props.tDateProfile;
+            var timerUnit = greatestDurationDenominator(tDateProfile.slotDuration).unit;
+            return (createElement("div", { className: 'fc-timeline-body', ref: this.handeEl, style: {
+                    minWidth: props.tableMinWidth,
+                    height: props.clientHeight,
+                    width: props.clientWidth
+                } },
+                createElement(NowTimer, { unit: timerUnit }, function (nowDate, todayRange) { return (createElement(Fragment, null,
+                    createElement(TimelineSlats, { ref: _this.slatsRef, dateProfile: dateProfile, tDateProfile: tDateProfile, nowDate: nowDate, todayRange: todayRange, clientWidth: props.clientWidth, tableColGroupNode: props.tableColGroupNode, tableMinWidth: props.tableMinWidth, onCoords: _this.handleCoords, onScrollLeftRequest: props.onScrollLeftRequest }),
+                    createElement(TimelineLane, { dateProfile: dateProfile, tDateProfile: props.tDateProfile, nowDate: nowDate, todayRange: todayRange, nextDayThreshold: options.nextDayThreshold, businessHours: props.businessHours, eventStore: props.eventStore, eventUiBases: props.eventUiBases, dateSelection: props.dateSelection, eventSelection: props.eventSelection, eventDrag: props.eventDrag, eventResize: props.eventResize, timelineCoords: state.coords }),
+                    (options.nowIndicator && state.coords && state.coords.isDateInRange(nowDate)) &&
+                        createElement(NowIndicatorRoot, { isAxis: false, date: nowDate }, function (rootElRef, classNames, innerElRef, innerContent) { return (createElement("div", { ref: rootElRef, className: ['fc-timeline-now-indicator-line'].concat(classNames).join(' '), style: { left: state.coords.dateToCoord(nowDate) } }, innerContent)); }))); })));
+        };
+        // Hit System
+        // ------------------------------------------------------------------------------------------
+        TimelineGrid.prototype.queryHit = function (positionLeft, positionTop, elWidth, elHeight) {
+            var slats = this.slatsRef.current;
+            var slatHit = slats.positionToHit(positionLeft);
+            if (slatHit) {
+                return {
+                    component: this,
+                    dateSpan: slatHit.dateSpan,
+                    rect: {
+                        left: slatHit.left,
+                        right: slatHit.right,
+                        top: 0,
+                        bottom: elHeight
+                    },
+                    dayEl: slatHit.dayEl,
+                    layer: 0
+                };
+            }
+        };
+        return TimelineGrid;
+    }(DateComponent));
+
+    var TimelineView = /** @class */ (function (_super) {
+        __extends(TimelineView, _super);
+        function TimelineView() {
+            var _this = _super !== null && _super.apply(this, arguments) || this;
+            _this.buildTimelineDateProfile = memoize(buildTimelineDateProfile);
+            _this.scrollGridRef = createRef();
+            _this.state = {
+                slatCoords: null,
+                slotCushionMaxWidth: null
+            };
+            _this.handleSlatCoords = function (slatCoords) {
+                _this.setState({ slatCoords: slatCoords });
+            };
+            _this.handleScrollLeftRequest = function (scrollLeft) {
+                var scrollGrid = _this.scrollGridRef.current;
+                scrollGrid.forceScrollLeft(0, scrollLeft);
+            };
+            _this.handleMaxCushionWidth = function (slotCushionMaxWidth) {
+                _this.setState({
+                    slotCushionMaxWidth: Math.ceil(slotCushionMaxWidth) // for less rerendering TODO: DRY
+                });
+            };
+            return _this;
+        }
+        TimelineView.prototype.render = function () {
+            var _this = this;
+            var _a = this, props = _a.props, state = _a.state, context = _a.context;
+            var options = context.options;
+            var stickyHeaderDates = !props.forPrint && getStickyHeaderDates(options);
+            var stickyFooterScrollbar = !props.forPrint && getStickyFooterScrollbar(options);
+            var tDateProfile = this.buildTimelineDateProfile(props.dateProfile, context.dateEnv, options, context.dateProfileGenerator);
+            var extraClassNames = [
+                'fc-timeline',
+                options.eventOverlap === false ? 'fc-timeline-overlap-disabled' : ''
+            ];
+            var slotMinWidth = options.slotMinWidth;
+            var slatCols = buildSlatCols(tDateProfile, slotMinWidth || this.computeFallbackSlotMinWidth(tDateProfile));
+            var sections = [
+                {
+                    type: 'header',
+                    key: 'header',
+                    isSticky: stickyHeaderDates,
+                    chunks: [{
+                            key: 'timeline',
+                            content: function (contentArg) { return (createElement(TimelineHeader, { dateProfile: props.dateProfile, clientWidth: contentArg.clientWidth, clientHeight: contentArg.clientHeight, tableMinWidth: contentArg.tableMinWidth, tableColGroupNode: contentArg.tableColGroupNode, tDateProfile: tDateProfile, slatCoords: state.slatCoords, onMaxCushionWidth: slotMinWidth ? null : _this.handleMaxCushionWidth })); }
+                        }]
+                },
+                {
+                    type: 'body',
+                    key: 'body',
+                    liquid: true,
+                    chunks: [{
+                            key: 'timeline',
+                            content: function (contentArg) { return (createElement(TimelineGrid, __assign({}, props, { clientWidth: contentArg.clientWidth, clientHeight: contentArg.clientHeight, tableMinWidth: contentArg.tableMinWidth, tableColGroupNode: contentArg.tableColGroupNode, tDateProfile: tDateProfile, onSlatCoords: _this.handleSlatCoords, onScrollLeftRequest: _this.handleScrollLeftRequest }))); }
+                        }]
+                }
+            ];
+            if (stickyFooterScrollbar) {
+                sections.push({
+                    type: 'footer',
+                    key: 'footer',
+                    isSticky: true,
+                    chunks: [{
+                            key: 'timeline',
+                            content: renderScrollShim
+                        }]
+                });
+            }
+            return (createElement(ViewRoot, { viewSpec: context.viewSpec }, function (rootElRef, classNames) { return (createElement("div", { ref: rootElRef, className: extraClassNames.concat(classNames).join(' ') },
+                createElement(ScrollGrid, { ref: _this.scrollGridRef, liquid: !props.isHeightAuto && !props.forPrint, colGroups: [
+                        { cols: slatCols }
+                    ], sections: sections }))); }));
+        };
+        TimelineView.prototype.computeFallbackSlotMinWidth = function (tDateProfile) {
+            return Math.max(30, ((this.state.slotCushionMaxWidth || 0) / tDateProfile.slotsPerLabel));
+        };
+        return TimelineView;
+    }(DateComponent));
+    function buildSlatCols(tDateProfile, slotMinWidth) {
+        return [{
+                span: tDateProfile.slotCnt,
+                minWidth: slotMinWidth || 1 // needs to be a non-zero number to trigger horizontal scrollbars!??????
+            }];
+    }
+
+    var timelinePlugin = createPlugin({
+        deps: [
+            premiumCommonPlugin
+        ],
+        initialView: 'timelineDay',
+        views: {
+            timeline: {
+                component: TimelineView,
+                eventResizableFromStart: true // how is this consumed for TimelineView tho?
+            },
+            timelineDay: {
+                type: 'timeline',
+                duration: { days: 1 }
+            },
+            timelineWeek: {
+                type: 'timeline',
+                duration: { weeks: 1 }
+            },
+            timelineMonth: {
+                type: 'timeline',
+                duration: { months: 1 }
+            },
+            timelineYear: {
+                type: 'timeline',
+                duration: { years: 1 }
+            }
+        }
+    });
+
+    function massageEventDragMutation(eventMutation, hit0, hit1) {
+        var resource0 = hit0.dateSpan.resourceId;
+        var resource1 = hit1.dateSpan.resourceId;
+        if (resource0 && resource1 &&
+            resource0 !== resource1) {
+            eventMutation.resourceMutation = {
+                matchResourceId: resource0,
+                setResourceId: resource1
+            };
+        }
+    }
+    /*
+    TODO: all this would be much easier if we were using a hash!
+    */
+    function applyEventDefMutation(eventDef, mutation, context) {
+        var resourceMutation = mutation.resourceMutation;
+        if (resourceMutation && computeResourceEditable(eventDef, context)) {
+            var index = eventDef.resourceIds.indexOf(resourceMutation.matchResourceId);
+            if (index !== -1) {
+                var resourceIds = eventDef.resourceIds.slice(); // copy
+                resourceIds.splice(index, 1); // remove
+                if (resourceIds.indexOf(resourceMutation.setResourceId) === -1) { // not already in there
+                    resourceIds.push(resourceMutation.setResourceId); // add
+                }
+                eventDef.resourceIds = resourceIds;
+            }
+        }
+    }
+    /*
+    HACK
+    TODO: use EventUi system instead of this
+    */
+    function computeResourceEditable(eventDef, context) {
+        var resourceEditable = eventDef.resourceEditable;
+        if (resourceEditable == null) {
+            var source = eventDef.sourceId && context.getCurrentData().eventSources[eventDef.sourceId];
+            if (source) {
+                resourceEditable = source.extendedProps.resourceEditable; // used the Source::extendedProps hack
+            }
+            if (resourceEditable == null) {
+                resourceEditable = context.options.eventResourceEditable;
+                if (resourceEditable == null) {
+                    resourceEditable = context.options.editable; // TODO: use defaults system instead
+                }
+            }
+        }
+        return resourceEditable;
+    }
+    function transformEventDrop(mutation, context) {
+        var resourceMutation = mutation.resourceMutation;
+        if (resourceMutation) {
+            var calendarApi = context.calendarApi;
+            return {
+                oldResource: calendarApi.getResourceById(resourceMutation.matchResourceId),
+                newResource: calendarApi.getResourceById(resourceMutation.setResourceId)
+            };
+        }
+        else {
+            return {
+                oldResource: null,
+                newResource: null
+            };
+        }
+    }
+
+    var ResourceDataAdder = /** @class */ (function () {
+        function ResourceDataAdder() {
+            this.filterResources = memoize(filterResources);
+        }
+        ResourceDataAdder.prototype.transform = function (viewProps, calendarProps) {
+            if (calendarProps.viewSpec.optionDefaults.needsResourceData) {
+                return {
+                    resourceStore: this.filterResources(calendarProps.resourceStore, calendarProps.options.filterResourcesWithEvents, calendarProps.eventStore, calendarProps.dateProfile.activeRange),
+                    resourceEntityExpansions: calendarProps.resourceEntityExpansions
+                };
+            }
+        };
+        return ResourceDataAdder;
+    }());
+    function filterResources(resourceStore, doFilterResourcesWithEvents, eventStore, activeRange) {
+        if (doFilterResourcesWithEvents) {
+            var instancesInRange = filterEventInstancesInRange(eventStore.instances, activeRange);
+            var hasEvents_1 = computeHasEvents(instancesInRange, eventStore.defs);
+            __assign(hasEvents_1, computeAncestorHasEvents(hasEvents_1, resourceStore));
+            return filterHash(resourceStore, function (resource, resourceId) {
+                return hasEvents_1[resourceId];
+            });
+        }
+        else {
+            return resourceStore;
+        }
+    }
+    function filterEventInstancesInRange(eventInstances, activeRange) {
+        return filterHash(eventInstances, function (eventInstance) {
+            return rangesIntersect(eventInstance.range, activeRange);
+        });
+    }
+    function computeHasEvents(eventInstances, eventDefs) {
+        var hasEvents = {};
+        for (var instanceId in eventInstances) {
+            var instance = eventInstances[instanceId];
+            for (var _i = 0, _a = eventDefs[instance.defId].resourceIds; _i < _a.length; _i++) {
+                var resourceId = _a[_i];
+                hasEvents[resourceId] = true;
+            }
+        }
+        return hasEvents;
+    }
+    /*
+    mark resources as having events if any of their ancestors have them
+    NOTE: resourceStore might not have all the resources that hasEvents{} has keyed
+    */
+    function computeAncestorHasEvents(hasEvents, resourceStore) {
+        var res = {};
+        for (var resourceId in hasEvents) {
+            var resource = void 0;
+            while ((resource = resourceStore[resourceId])) {
+                resourceId = resource.parentId; // now functioning as the parentId
+                if (resourceId) {
+                    res[resourceId] = true;
+                }
+                else {
+                    break;
+                }
+            }
+        }
+        return res;
+    }
+    // for when non-resource view should be given EventUi info (for event coloring/constraints based off of resource data)
+    var ResourceEventConfigAdder = /** @class */ (function () {
+        function ResourceEventConfigAdder() {
+            this.buildResourceEventUis = memoize(buildResourceEventUis, isPropsEqual);
+            this.injectResourceEventUis = memoize(injectResourceEventUis);
+        }
+        ResourceEventConfigAdder.prototype.transform = function (viewProps, calendarProps) {
+            if (!calendarProps.viewSpec.optionDefaults.needsResourceData) {
+                return {
+                    eventUiBases: this.injectResourceEventUis(viewProps.eventUiBases, viewProps.eventStore.defs, this.buildResourceEventUis(calendarProps.resourceStore))
+                };
+            }
+        };
+        return ResourceEventConfigAdder;
+    }());
+    function buildResourceEventUis(resourceStore) {
+        return mapHash(resourceStore, function (resource) {
+            return resource.ui;
+        });
+    }
+    function injectResourceEventUis(eventUiBases, eventDefs, resourceEventUis) {
+        return mapHash(eventUiBases, function (eventUi, defId) {
+            if (defId) { // not the '' key
+                return injectResourceEventUi(eventUi, eventDefs[defId], resourceEventUis);
+            }
+            else {
+                return eventUi;
+            }
+        });
+    }
+    function injectResourceEventUi(origEventUi, eventDef, resourceEventUis) {
+        var parts = [];
+        // first resource takes precedence, which fights with the ordering of combineEventUis, thus the unshifts
+        for (var _i = 0, _a = eventDef.resourceIds; _i < _a.length; _i++) {
+            var resourceId = _a[_i];
+            if (resourceEventUis[resourceId]) {
+                parts.unshift(resourceEventUis[resourceId]);
+            }
+        }
+        parts.unshift(origEventUi);
+        return combineEventUis(parts);
+    }
+    // for making sure events that have editable resources are always draggable in resource views
+    function transformIsDraggable(val, eventDef, eventUi, context) {
+        if (!val) {
+            var state = context.getCurrentData();
+            var viewSpec = state.viewSpecs[state.currentViewType];
+            if (viewSpec.optionDefaults.needsResourceData) {
+                if (computeResourceEditable(eventDef, context)) {
+                    return true;
+                }
+            }
+        }
+        return val;
+    }
+
+    var defs = []; // TODO: use plugin system
+    function registerResourceSourceDef(def) {
+        defs.push(def);
+    }
+    function getResourceSourceDef(id) {
+        return defs[id];
+    }
+    function getResourceSourceDefs() {
+        return defs;
+    }
+
+    // TODO: make this a plugin-able parser
+    // TODO: success/failure
+    var RESOURCE_SOURCE_REFINERS = {
+        id: String,
+        // for array. TODO: move to resource-array
+        resources: identity,
+        // for json feed. TODO: move to resource-json-feed
+        url: String,
+        method: String,
+        startParam: String,
+        endParam: String,
+        timeZoneParam: String,
+        extraParams: identity
+    };
+    function parseResourceSource(input) {
+        var inputObj;
+        if (typeof input === 'string') {
+            inputObj = { url: input };
+        }
+        else if (typeof input === 'function' || Array.isArray(input)) {
+            inputObj = { resources: input };
+        }
+        else if (typeof input === 'object' && input) { // non-null object
+            inputObj = input;
+        }
+        if (inputObj) {
+            var _a = refineProps(inputObj, RESOURCE_SOURCE_REFINERS), refined = _a.refined, extra = _a.extra;
+            warnUnknownProps(extra);
+            var metaRes = buildResourceSourceMeta(refined);
+            if (metaRes) {
+                return {
+                    _raw: input,
+                    sourceId: guid(),
+                    sourceDefId: metaRes.sourceDefId,
+                    meta: metaRes.meta,
+                    publicId: refined.id || '',
+                    isFetching: false,
+                    latestFetchId: '',
+                    fetchRange: null
+                };
+            }
+        }
+        return null;
+    }
+    function buildResourceSourceMeta(refined) {
+        var defs = getResourceSourceDefs();
+        for (var i = defs.length - 1; i >= 0; i--) { // later-added plugins take precedence
+            var def = defs[i];
+            var meta = def.parseMeta(refined);
+            if (meta) {
+                return { meta: meta, sourceDefId: i };
+            }
+        }
+    }
+    function warnUnknownProps(props) {
+        for (var propName in props) {
+            console.warn("Unknown resource prop '" + propName + "'");
+        }
+    }
+
+    function reduceResourceSource(source, action, context) {
+        var options = context.options, dateProfile = context.dateProfile;
+        if (!source || !action) {
+            return createSource(options.initialResources || options.resources, dateProfile.activeRange, options.refetchResourcesOnNavigate, context);
+        }
+        switch (action.type) {
+            case 'RESET_RESOURCE_SOURCE':
+                return createSource(action.resourceSourceInput, dateProfile.activeRange, options.refetchResourcesOnNavigate, context);
+            case 'PREV': // TODO: how do we track all actions that affect dateProfile :(
+            case 'NEXT':
+            case 'CHANGE_DATE':
+            case 'CHANGE_VIEW_TYPE':
+                return handleRangeChange(source, dateProfile.activeRange, options.refetchResourcesOnNavigate, context);
+            case 'RECEIVE_RESOURCES':
+            case 'RECEIVE_RESOURCE_ERROR':
+                return receiveResponse$1(source, action.fetchId, action.fetchRange);
+            case 'REFETCH_RESOURCES':
+                return fetchSource$1(source, dateProfile.activeRange, context);
+            default:
+                return source;
+        }
+    }
+    function createSource(input, activeRange, refetchResourcesOnNavigate, context) {
+        if (input) {
+            var source = parseResourceSource(input);
+            source = fetchSource$1(source, refetchResourcesOnNavigate ? activeRange : null, context);
+            return source;
+        }
+        return null;
+    }
+    function handleRangeChange(source, activeRange, refetchResourcesOnNavigate, context) {
+        if (refetchResourcesOnNavigate &&
+            !doesSourceIgnoreRange(source) &&
+            (!source.fetchRange || !rangesEqual(source.fetchRange, activeRange))) {
+            return fetchSource$1(source, activeRange, context);
+        }
+        else {
+            return source;
+        }
+    }
+    function doesSourceIgnoreRange(source) {
+        return Boolean(getResourceSourceDef(source.sourceDefId).ignoreRange);
+    }
+    function fetchSource$1(source, fetchRange, context) {
+        var sourceDef = getResourceSourceDef(source.sourceDefId);
+        var fetchId = guid();
+        sourceDef.fetch({
+            resourceSource: source,
+            range: fetchRange,
+            context: context
+        }, function (res) {
+            context.dispatch({
+                type: 'RECEIVE_RESOURCES',
+                fetchId: fetchId,
+                fetchRange: fetchRange,
+                rawResources: res.rawResources
+            });
+        }, function (error) {
+            context.dispatch({
+                type: 'RECEIVE_RESOURCE_ERROR',
+                fetchId: fetchId,
+                fetchRange: fetchRange,
+                error: error
+            });
+        });
+        return __assign(__assign({}, source), { isFetching: true, latestFetchId: fetchId });
+    }
+    function receiveResponse$1(source, fetchId, fetchRange) {
+        if (fetchId === source.latestFetchId) {
+            return __assign(__assign({}, source), { isFetching: false, fetchRange: fetchRange });
+        }
+        return source;
+    }
+
+    var PRIVATE_ID_PREFIX = '_fc:';
+    var RESOURCE_REFINERS = {
+        id: String,
+        parentId: String,
+        children: identity,
+        title: String,
+        businessHours: identity,
+        extendedProps: identity,
+        // event-ui
+        eventEditable: Boolean,
+        eventStartEditable: Boolean,
+        eventDurationEditable: Boolean,
+        eventConstraint: identity,
+        eventOverlap: Boolean,
+        eventAllow: identity,
+        eventClassNames: parseClassNames,
+        eventBackgroundColor: String,
+        eventBorderColor: String,
+        eventTextColor: String,
+        eventColor: String
+    };
+    /*
+    needs a full store so that it can populate children too
+    */
+    function parseResource(raw, parentId, store, context) {
+        if (parentId === void 0) { parentId = ''; }
+        var _a = refineProps(raw, RESOURCE_REFINERS), refined = _a.refined, extra = _a.extra;
+        var resource = {
+            id: refined.id || (PRIVATE_ID_PREFIX + guid()),
+            parentId: refined.parentId || parentId,
+            title: refined.title || '',
+            businessHours: refined.businessHours ? parseBusinessHours(refined.businessHours, context) : null,
+            ui: createEventUi({
+                editable: refined.eventEditable,
+                startEditable: refined.eventStartEditable,
+                durationEditable: refined.eventDurationEditable,
+                constraint: refined.eventConstraint,
+                overlap: refined.eventOverlap,
+                allow: refined.eventAllow,
+                classNames: refined.eventClassNames,
+                backgroundColor: refined.eventBackgroundColor,
+                borderColor: refined.eventBorderColor,
+                textColor: refined.eventTextColor,
+                color: refined.eventColor
+            }, context),
+            extendedProps: __assign(__assign({}, extra), refined.extendedProps)
+        };
+        // help out ResourceApi from having user modify props
+        Object.freeze(resource.ui.classNames);
+        Object.freeze(resource.extendedProps);
+        if (store[resource.id]) ;
+        else {
+            store[resource.id] = resource;
+            if (refined.children) {
+                for (var _i = 0, _b = refined.children; _i < _b.length; _i++) {
+                    var childInput = _b[_i];
+                    parseResource(childInput, resource.id, store, context);
+                }
+            }
+        }
+        return resource;
+    }
+    /*
+    TODO: use this in more places
+    */
+    function getPublicId(id) {
+        if (id.indexOf(PRIVATE_ID_PREFIX) === 0) {
+            return '';
+        }
+        return id;
+    }
+
+    function reduceResourceStore(store, action, source, context) {
+        if (!store || !action) {
+            return {};
+        }
+        switch (action.type) {
+            case 'RECEIVE_RESOURCES':
+                return receiveRawResources(store, action.rawResources, action.fetchId, source, context);
+            case 'ADD_RESOURCE':
+                return addResource(store, action.resourceHash);
+            case 'REMOVE_RESOURCE':
+                return removeResource(store, action.resourceId);
+            case 'SET_RESOURCE_PROP':
+                return setResourceProp(store, action.resourceId, action.propName, action.propValue);
+            case 'SET_RESOURCE_EXTENDED_PROP':
+                return setResourceExtendedProp(store, action.resourceId, action.propName, action.propValue);
+            default:
+                return store;
+        }
+    }
+    function receiveRawResources(existingStore, inputs, fetchId, source, context) {
+        if (source.latestFetchId === fetchId) {
+            var nextStore = {};
+            for (var _i = 0, inputs_1 = inputs; _i < inputs_1.length; _i++) {
+                var input = inputs_1[_i];
+                parseResource(input, '', nextStore, context);
+            }
+            return nextStore;
+        }
+        else {
+            return existingStore;
+        }
+    }
+    function addResource(existingStore, additions) {
+        // TODO: warn about duplicate IDs
+        return __assign(__assign({}, existingStore), additions);
+    }
+    function removeResource(existingStore, resourceId) {
+        var newStore = __assign({}, existingStore);
+        delete newStore[resourceId];
+        // promote children
+        for (var childResourceId in newStore) { // a child, *maybe* but probably not
+            if (newStore[childResourceId].parentId === resourceId) {
+                newStore[childResourceId] = __assign(__assign({}, newStore[childResourceId]), { parentId: '' });
+            }
+        }
+        return newStore;
+    }
+    function setResourceProp(existingStore, resourceId, name, value) {
+        var _a, _b;
+        var existingResource = existingStore[resourceId];
+        // TODO: sanitization
+        if (existingResource) {
+            return __assign(__assign({}, existingStore), (_a = {}, _a[resourceId] = __assign(__assign({}, existingResource), (_b = {}, _b[name] = value, _b)), _a));
+        }
+        else {
+            return existingStore;
+        }
+    }
+    function setResourceExtendedProp(existingStore, resourceId, name, value) {
+        var _a, _b;
+        var existingResource = existingStore[resourceId];
+        if (existingResource) {
+            return __assign(__assign({}, existingStore), (_a = {}, _a[resourceId] = __assign(__assign({}, existingResource), { extendedProps: __assign(__assign({}, existingResource.extendedProps), (_b = {}, _b[name] = value, _b)) }), _a));
+        }
+        else {
+            return existingStore;
+        }
+    }
+
+    function reduceResourceEntityExpansions(expansions, action) {
+        var _a;
+        if (!expansions || !action) {
+            return {};
+        }
+        switch (action.type) {
+            case 'SET_RESOURCE_ENTITY_EXPANDED':
+                return __assign(__assign({}, expansions), (_a = {}, _a[action.id] = action.isExpanded, _a));
+            default:
+                return expansions;
+        }
+    }
+
+    function reduceResources(state, action, context) {
+        var resourceSource = reduceResourceSource(state && state.resourceSource, action, context);
+        var resourceStore = reduceResourceStore(state && state.resourceStore, action, resourceSource, context);
+        var resourceEntityExpansions = reduceResourceEntityExpansions(state && state.resourceEntityExpansions, action);
+        return {
+            resourceSource: resourceSource,
+            resourceStore: resourceStore,
+            resourceEntityExpansions: resourceEntityExpansions,
+            loadingLevel: context.loadingLevel + ((resourceSource && resourceSource.isFetching) ? 1 : 0)
+        };
+    }
+
+    var EVENT_REFINERS$1 = {
+        resourceId: String,
+        resourceIds: identity,
+        resourceEditable: Boolean
+    };
+    function generateEventDefResourceMembers(refined) {
+        return {
+            resourceIds: ensureStringArray(refined.resourceIds)
+                .concat(refined.resourceId ? [refined.resourceId] : []),
+            resourceEditable: refined.resourceEditable
+        };
+    }
+    function ensureStringArray(items) {
+        return (items || []).map(function (item) {
+            return String(item);
+        });
+    }
+
+    function transformDateSelectionJoin(hit0, hit1) {
+        var resourceId0 = hit0.dateSpan.resourceId;
+        var resourceId1 = hit1.dateSpan.resourceId;
+        if (resourceId0 && resourceId1) {
+            if (hit0.component.allowAcrossResources === false &&
+                resourceId0 !== resourceId1) {
+                return false;
+            }
+            else {
+                return { resourceId: resourceId0 };
+            }
+        }
+    }
+
+    var ResourceApi = /** @class */ (function () {
+        function ResourceApi(_context, _resource) {
+            this._context = _context;
+            this._resource = _resource;
+        }
+        ResourceApi.prototype.setProp = function (name, value) {
+            var oldResource = this._resource;
+            this._context.dispatch({
+                type: 'SET_RESOURCE_PROP',
+                resourceId: oldResource.id,
+                propName: name,
+                propValue: value
+            });
+            this.sync(oldResource);
+        };
+        ResourceApi.prototype.setExtendedProp = function (name, value) {
+            var oldResource = this._resource;
+            this._context.dispatch({
+                type: 'SET_RESOURCE_EXTENDED_PROP',
+                resourceId: oldResource.id,
+                propName: name,
+                propValue: value
+            });
+            this.sync(oldResource);
+        };
+        ResourceApi.prototype.sync = function (oldResource) {
+            var context = this._context;
+            var resourceId = oldResource.id;
+            // TODO: what if dispatch didn't complete synchronously?
+            this._resource = context.getCurrentData().resourceStore[resourceId];
+            context.emitter.trigger('resourceChange', {
+                oldResource: new ResourceApi(context, oldResource),
+                resource: this,
+                revert: function () {
+                    var _a;
+                    context.dispatch({
+                        type: 'ADD_RESOURCE',
+                        resourceHash: (_a = {},
+                            _a[resourceId] = oldResource,
+                            _a)
+                    });
+                }
+            });
+        };
+        ResourceApi.prototype.remove = function () {
+            var context = this._context;
+            var internalResource = this._resource;
+            var resourceId = internalResource.id;
+            context.dispatch({
+                type: 'REMOVE_RESOURCE',
+                resourceId: resourceId
+            });
+            context.emitter.trigger('resourceRemove', {
+                resource: this,
+                revert: function () {
+                    var _a;
+                    context.dispatch({
+                        type: 'ADD_RESOURCE',
+                        resourceHash: (_a = {},
+                            _a[resourceId] = internalResource,
+                            _a)
+                    });
+                }
+            });
+        };
+        ResourceApi.prototype.getParent = function () {
+            var context = this._context;
+            var parentId = this._resource.parentId;
+            if (parentId) {
+                return new ResourceApi(context, context.getCurrentData().resourceSource[parentId]);
+            }
+            else {
+                return null;
+            }
+        };
+        ResourceApi.prototype.getChildren = function () {
+            var thisResourceId = this._resource.id;
+            var context = this._context;
+            var resourceStore = context.getCurrentData().resourceStore;
+            var childApis = [];
+            for (var resourceId in resourceStore) {
+                if (resourceStore[resourceId].parentId === thisResourceId) {
+                    childApis.push(new ResourceApi(context, resourceStore[resourceId]));
+                }
+            }
+            return childApis;
+        };
+        /*
+        this is really inefficient!
+        TODO: make EventApi::resourceIds a hash or keep an index in the Calendar's state
+        */
+        ResourceApi.prototype.getEvents = function () {
+            var thisResourceId = this._resource.id;
+            var context = this._context;
+            var _a = context.getCurrentData().eventStore, defs = _a.defs, instances = _a.instances;
+            var eventApis = [];
+            for (var instanceId in instances) {
+                var instance = instances[instanceId];
+                var def = defs[instance.defId];
+                if (def.resourceIds.indexOf(thisResourceId) !== -1) { // inefficient!!!
+                    eventApis.push(new EventApi(context, def, instance));
+                }
+            }
+            return eventApis;
+        };
+        Object.defineProperty(ResourceApi.prototype, "id", {
+            get: function () { return getPublicId(this._resource.id); },
+            enumerable: false,
+            configurable: true
+        });
+        Object.defineProperty(ResourceApi.prototype, "title", {
+            get: function () { return this._resource.title; },
+            enumerable: false,
+            configurable: true
+        });
+        Object.defineProperty(ResourceApi.prototype, "eventConstraint", {
+            get: function () { return this._resource.ui.constraints[0] || null; },
+            enumerable: false,
+            configurable: true
+        });
+        Object.defineProperty(ResourceApi.prototype, "eventOverlap", {
+            get: function () { return this._resource.ui.overlap; },
+            enumerable: false,
+            configurable: true
+        });
+        Object.defineProperty(ResourceApi.prototype, "eventAllow", {
+            get: function () { return this._resource.ui.allows[0] || null; },
+            enumerable: false,
+            configurable: true
+        });
+        Object.defineProperty(ResourceApi.prototype, "eventBackgroundColor", {
+            get: function () { return this._resource.ui.backgroundColor; },
+            enumerable: false,
+            configurable: true
+        });
+        Object.defineProperty(ResourceApi.prototype, "eventBorderColor", {
+            get: function () { return this._resource.ui.borderColor; },
+            enumerable: false,
+            configurable: true
+        });
+        Object.defineProperty(ResourceApi.prototype, "eventTextColor", {
+            get: function () { return this._resource.ui.textColor; },
+            enumerable: false,
+            configurable: true
+        });
+        Object.defineProperty(ResourceApi.prototype, "eventClassNames", {
+            // NOTE: user can't modify these because Object.freeze was called in event-def parsing
+            get: function () { return this._resource.ui.classNames; },
+            enumerable: false,
+            configurable: true
+        });
+        Object.defineProperty(ResourceApi.prototype, "extendedProps", {
+            get: function () { return this._resource.extendedProps; },
+            enumerable: false,
+            configurable: true
+        });
+        ResourceApi.prototype.toPlainObject = function (settings) {
+            if (settings === void 0) { settings = {}; }
+            var internal = this._resource;
+            var ui = internal.ui;
+            var publicId = this.id;
+            var res = {};
+            if (publicId) {
+                res.id = publicId;
+            }
+            if (internal.title) {
+                res.title = internal.title;
+            }
+            if (settings.collapseEventColor && ui.backgroundColor && ui.backgroundColor === ui.borderColor) {
+                res.eventColor = ui.backgroundColor;
+            }
+            else {
+                if (ui.backgroundColor) {
+                    res.eventBackgroundColor = ui.backgroundColor;
+                }
+                if (ui.borderColor) {
+                    res.eventBorderColor = ui.borderColor;
+                }
+            }
+            if (ui.textColor) {
+                res.eventTextColor = ui.textColor;
+            }
+            if (ui.classNames.length) {
+                res.eventClassNames = ui.classNames;
+            }
+            if (Object.keys(internal.extendedProps).length) {
+                if (settings.collapseExtendedProps) {
+                    __assign(res, internal.extendedProps);
+                }
+                else {
+                    res.extendedProps = internal.extendedProps;
+                }
+            }
+            return res;
+        };
+        ResourceApi.prototype.toJSON = function () {
+            return this.toPlainObject();
+        };
+        return ResourceApi;
+    }());
+    function buildResourceApis(resourceStore, context) {
+        var resourceApis = [];
+        for (var resourceId in resourceStore) {
+            resourceApis.push(new ResourceApi(context, resourceStore[resourceId]));
+        }
+        return resourceApis;
+    }
+
+    CalendarApi.prototype.addResource = function (input, scrollTo) {
+        var _a;
+        var _this = this;
+        if (scrollTo === void 0) { scrollTo = true; }
+        var currentState = this.getCurrentData();
+        var resourceHash;
+        var resource;
+        if (input instanceof ResourceApi) {
+            resource = input._resource;
+            resourceHash = (_a = {}, _a[resource.id] = resource, _a);
+        }
+        else {
+            resourceHash = {};
+            resource = parseResource(input, '', resourceHash, currentState);
+        }
+        this.dispatch({
+            type: 'ADD_RESOURCE',
+            resourceHash: resourceHash
+        });
+        if (scrollTo) {
+            // TODO: wait til dispatch completes somehow
+            this.trigger('_scrollRequest', { resourceId: resource.id });
+        }
+        var resourceApi = new ResourceApi(currentState, resource);
+        currentState.emitter.trigger('resourceAdd', {
+            resource: resourceApi,
+            revert: function () {
+                _this.dispatch({
+                    type: 'REMOVE_RESOURCE',
+                    resourceId: resource.id
+                });
+            }
+        });
+        return resourceApi;
+    };
+    CalendarApi.prototype.getResourceById = function (id) {
+        id = String(id);
+        var currentState = this.getCurrentData();
+        if (currentState.resourceStore) { // guard against calendar with no resource functionality
+            var rawResource = currentState.resourceStore[id];
+            if (rawResource) {
+                return new ResourceApi(currentState, rawResource);
+            }
+        }
+        return null;
+    };
+    CalendarApi.prototype.getResources = function () {
+        var currentState = this.getCurrentData();
+        var resourceStore = currentState.resourceStore;
+        var resourceApis = [];
+        if (resourceStore) { // guard against calendar with no resource functionality
+            for (var resourceId in resourceStore) {
+                resourceApis.push(new ResourceApi(currentState, resourceStore[resourceId]));
+            }
+        }
+        return resourceApis;
+    };
+    CalendarApi.prototype.getTopLevelResources = function () {
+        var currentState = this.getCurrentData();
+        var resourceStore = currentState.resourceStore;
+        var resourceApis = [];
+        if (resourceStore) { // guard against calendar with no resource functionality
+            for (var resourceId in resourceStore) {
+                if (!resourceStore[resourceId].parentId) {
+                    resourceApis.push(new ResourceApi(currentState, resourceStore[resourceId]));
+                }
+            }
+        }
+        return resourceApis;
+    };
+    CalendarApi.prototype.refetchResources = function () {
+        this.dispatch({
+            type: 'REFETCH_RESOURCES'
+        });
+    };
+    function transformDatePoint(dateSpan, context) {
+        return dateSpan.resourceId ?
+            { resource: context.calendarApi.getResourceById(dateSpan.resourceId) } :
+            {};
+    }
+    function transformDateSpan(dateSpan, context) {
+        return dateSpan.resourceId ?
+            { resource: context.calendarApi.getResourceById(dateSpan.resourceId) } :
+            {};
+    }
+
+    /*
+    splits things BASED OFF OF which resources they are associated with.
+    creates a '' entry which is when something has NO resource.
+    */
+    var ResourceSplitter = /** @class */ (function (_super) {
+        __extends(ResourceSplitter, _super);
+        function ResourceSplitter() {
+            return _super !== null && _super.apply(this, arguments) || this;
+        }
+        ResourceSplitter.prototype.getKeyInfo = function (props) {
+            return __assign({ '': {} }, props.resourceStore // already has `ui` and `businessHours` keys!
+            );
+        };
+        ResourceSplitter.prototype.getKeysForDateSpan = function (dateSpan) {
+            return [dateSpan.resourceId || ''];
+        };
+        ResourceSplitter.prototype.getKeysForEventDef = function (eventDef) {
+            var resourceIds = eventDef.resourceIds;
+            if (!resourceIds.length) {
+                return [''];
+            }
+            return resourceIds;
+        };
+        return ResourceSplitter;
+    }(Splitter));
+
+    function isPropsValidWithResources(props, context) {
+        var splitter = new ResourceSplitter();
+        var sets = splitter.splitProps(__assign(__assign({}, props), { resourceStore: context.getCurrentData().resourceStore }));
+        for (var resourceId in sets) {
+            var props_1 = sets[resourceId];
+            // merge in event data from the non-resource segment
+            if (resourceId && sets['']) { // current segment is not the non-resource one, and there IS a non-resource one
+                props_1 = __assign(__assign({}, props_1), { eventStore: mergeEventStores(sets[''].eventStore, props_1.eventStore), eventUiBases: __assign(__assign({}, sets[''].eventUiBases), props_1.eventUiBases) });
+            }
+            if (!isPropsValid(props_1, context, { resourceId: resourceId }, filterConfig.bind(null, resourceId))) {
+                return false;
+            }
+        }
+        return true;
+    }
+    function filterConfig(resourceId, config) {
+        return __assign(__assign({}, config), { constraints: filterConstraints(resourceId, config.constraints) });
+    }
+    function filterConstraints(resourceId, constraints) {
+        return constraints.map(function (constraint) {
+            var defs = constraint.defs;
+            if (defs) { // we are dealing with an EventStore
+                // if any of the events define constraints to resources that are NOT this resource,
+                // then this resource is unconditionally prohibited, which is what a `false` value does.
+                for (var defId in defs) {
+                    var resourceIds = defs[defId].resourceIds;
+                    if (resourceIds.length && resourceIds.indexOf(resourceId) === -1) { // TODO: use a hash?!!! (for other reasons too)
+                        return false;
+                    }
+                }
+            }
+            return constraint;
+        });
+    }
+
+    function transformExternalDef(dateSpan) {
+        return dateSpan.resourceId ?
+            { resourceId: dateSpan.resourceId } :
+            {};
+    }
+
+    function transformEventResizeJoin(hit0, hit1) {
+        var component = hit0.component;
+        if (component.allowAcrossResources === false &&
+            hit0.dateSpan.resourceId !== hit1.dateSpan.resourceId) {
+            return false;
+        }
+    }
+
+    EventApi.prototype.getResources = function () {
+        var calendarApi = this._context.calendarApi;
+        return this._def.resourceIds.map(function (resourceId) {
+            return calendarApi.getResourceById(resourceId);
+        });
+    };
+    EventApi.prototype.setResources = function (resources) {
+        var resourceIds = [];
+        // massage resources -> resourceIds
+        for (var _i = 0, resources_1 = resources; _i < resources_1.length; _i++) {
+            var resource = resources_1[_i];
+            var resourceId = null;
+            if (typeof resource === 'string') {
+                resourceId = resource;
+            }
+            else if (typeof resource === 'number') {
+                resourceId = String(resource);
+            }
+            else if (resource instanceof ResourceApi) {
+                resourceId = resource.id; // guaranteed to always have an ID. hmmm
+            }
+            else {
+                console.warn('unknown resource type: ' + resource);
+            }
+            if (resourceId) {
+                resourceIds.push(resourceId);
+            }
+        }
+        this.mutate({
+            standardProps: {
+                resourceIds: resourceIds
+            }
+        });
+    };
+
+    var optionChangeHandlers = {
+        resources: handleResources
+    };
+    function handleResources(newSourceInput, context) {
+        var oldSourceInput = context.getCurrentData().resourceSource._raw;
+        if (oldSourceInput !== newSourceInput) {
+            context.dispatch({
+                type: 'RESET_RESOURCE_SOURCE',
+                resourceSourceInput: newSourceInput
+            });
+        }
+    }
+
+    var DEFAULT_RESOURCE_ORDER = parseFieldSpecs('id,title');
+    function handleResourceStore(resourceStore, calendarData) {
+        var emitter = calendarData.emitter;
+        if (emitter.hasHandlers('resourcesSet')) {
+            emitter.trigger('resourcesSet', buildResourceApis(resourceStore, calendarData));
+        }
+    }
+
+    var OPTION_REFINERS$5 = {
+        initialResources: identity,
+        resources: identity,
+        eventResourceEditable: Boolean,
+        refetchResourcesOnNavigate: Boolean,
+        resourceOrder: parseFieldSpecs,
+        filterResourcesWithEvents: Boolean,
+        resourceGroupField: String,
+        resourceAreaWidth: identity,
+        resourceAreaColumns: identity,
+        resourcesInitiallyExpanded: Boolean,
+        datesAboveResources: Boolean,
+        needsResourceData: Boolean,
+        resourceAreaHeaderClassNames: identity,
+        resourceAreaHeaderContent: identity,
+        resourceAreaHeaderDidMount: identity,
+        resourceAreaHeaderWillUnmount: identity,
+        resourceGroupLabelClassNames: identity,
+        resourceGroupLabelContent: identity,
+        resourceGroupLabelDidMount: identity,
+        resourceGroupLabelWillUnmount: identity,
+        resourceLabelClassNames: identity,
+        resourceLabelContent: identity,
+        resourceLabelDidMount: identity,
+        resourceLabelWillUnmount: identity,
+        resourceLaneClassNames: identity,
+        resourceLaneContent: identity,
+        resourceLaneDidMount: identity,
+        resourceLaneWillUnmount: identity,
+        resourceGroupLaneClassNames: identity,
+        resourceGroupLaneContent: identity,
+        resourceGroupLaneDidMount: identity,
+        resourceGroupLaneWillUnmount: identity
+    };
+    var LISTENER_REFINERS$1 = {
+        resourcesSet: identity,
+        resourceAdd: identity,
+        resourceChange: identity,
+        resourceRemove: identity
+    };
+
+    registerResourceSourceDef({
+        ignoreRange: true,
+        parseMeta: function (refined) {
+            if (Array.isArray(refined.resources)) {
+                return refined.resources;
+            }
+            return null;
+        },
+        fetch: function (arg, successCallback) {
+            successCallback({
+                rawResources: arg.resourceSource.meta
+            });
+        }
+    });
+
+    registerResourceSourceDef({
+        parseMeta: function (refined) {
+            if (typeof refined.resources === 'function') {
+                return refined.resources;
+            }
+            return null;
+        },
+        fetch: function (arg, success, failure) {
+            var dateEnv = arg.context.dateEnv;
+            var func = arg.resourceSource.meta;
+            var publicArg = arg.range ? {
+                start: dateEnv.toDate(arg.range.start),
+                end: dateEnv.toDate(arg.range.end),
+                startStr: dateEnv.formatIso(arg.range.start),
+                endStr: dateEnv.formatIso(arg.range.end),
+                timeZone: dateEnv.timeZone
+            } : {};
+            // TODO: make more dry with EventSourceFunc
+            // TODO: accept a response?
+            unpromisify(func.bind(null, publicArg), function (rawResources) {
+                success({ rawResources: rawResources }); // needs an object response
+            }, failure // send errorObj directly to failure callback
+            );
+        }
+    });
+
+    registerResourceSourceDef({
+        parseMeta: function (refined) {
+            if (refined.url) {
+                return {
+                    url: refined.url,
+                    method: (refined.method || 'GET').toUpperCase(),
+                    extraParams: refined.extraParams
+                };
+            }
+            return null;
+        },
+        fetch: function (arg, successCallback, failureCallback) {
+            var meta = arg.resourceSource.meta;
+            var requestParams = buildRequestParams$2(meta, arg.range, arg.context);
+            requestJson(meta.method, meta.url, requestParams, function (rawResources, xhr) {
+                successCallback({ rawResources: rawResources, xhr: xhr });
+            }, function (message, xhr) {
+                failureCallback({ message: message, xhr: xhr });
+            });
+        }
+    });
+    // TODO: somehow consolidate with event json feed
+    function buildRequestParams$2(meta, range, context) {
+        var dateEnv = context.dateEnv, options = context.options;
+        var startParam;
+        var endParam;
+        var timeZoneParam;
+        var customRequestParams;
+        var params = {};
+        if (range) {
+            startParam = meta.startParam;
+            if (startParam == null) {
+                startParam = options.startParam;
+            }
+            endParam = meta.endParam;
+            if (endParam == null) {
+                endParam = options.endParam;
+            }
+            timeZoneParam = meta.timeZoneParam;
+            if (timeZoneParam == null) {
+                timeZoneParam = options.timeZoneParam;
+            }
+            params[startParam] = dateEnv.formatIso(range.start);
+            params[endParam] = dateEnv.formatIso(range.end);
+            if (dateEnv.timeZone !== 'local') {
+                params[timeZoneParam] = dateEnv.timeZone;
+            }
+        }
+        // retrieve any outbound GET/POST data from the options
+        if (typeof meta.extraParams === 'function') {
+            // supplied as a function that returns a key/value object
+            customRequestParams = meta.extraParams();
+        }
+        else {
+            // probably supplied as a straight key/value object
+            customRequestParams = meta.extraParams || {};
+        }
+        __assign(params, customRequestParams);
+        return params;
+    }
+
+    // TODO: not used for Spreadsheet. START USING. difficult because of col-specific rendering props
+    function ResourceLabelRoot(props) {
+        return (createElement(ViewContextType.Consumer, null, function (context) {
+            var options = context.options;
+            var hookProps = {
+                resource: new ResourceApi(context, props.resource),
+                date: props.date ? context.dateEnv.toDate(props.date) : null,
+                view: context.viewApi
+            };
+            var dataAttrs = {
+                'data-resource-id': props.resource.id,
+                'data-date': props.date ? formatDayString(props.date) : undefined
+            };
+            return (createElement(RenderHook, { hookProps: hookProps, classNames: options.resourceLabelClassNames, content: options.resourceLabelContent, defaultContent: renderInnerContent$6, didMount: options.resourceLabelDidMount, willUnmount: options.resourceLabelWillUnmount }, function (rootElRef, classNames, innerElRef, innerContent) { return props.children(rootElRef, classNames, // TODO: pass in 'fc-resource' ?
+            dataAttrs, innerElRef, innerContent); }));
+        }));
+    }
+    function renderInnerContent$6(props) {
+        return props.resource.title || props.resource.id;
+    }
+
+    var ResourceDayHeader = /** @class */ (function (_super) {
+        __extends(ResourceDayHeader, _super);
+        function ResourceDayHeader() {
+            var _this = _super !== null && _super.apply(this, arguments) || this;
+            _this.buildDateFormat = memoize(buildDateFormat);
+            return _this;
+        }
+        ResourceDayHeader.prototype.render = function () {
+            var _this = this;
+            var _a = this, props = _a.props, context = _a.context;
+            var dateFormat = this.buildDateFormat(context.options.dayHeaderFormat, props.datesRepDistinctDays, props.dates.length);
+            return (createElement(NowTimer, { unit: 'day' }, function (nowDate, todayRange) {
+                if (props.dates.length === 1) {
+                    return _this.renderResourceRow(props.resources, props.dates[0]);
+                }
+                else {
+                    if (context.options.datesAboveResources) {
+                        return _this.renderDayAndResourceRows(props.dates, dateFormat, todayRange, props.resources);
+                    }
+                    else {
+                        return _this.renderResourceAndDayRows(props.resources, props.dates, dateFormat, todayRange);
+                    }
+                }
+            }));
+        };
+        ResourceDayHeader.prototype.renderResourceRow = function (resources, date) {
+            var resourceCells = resources.map(function (resource) {
+                return (createElement(ResourceCell, { key: resource.id, resource: resource, colSpan: 1, date: date }));
+            });
+            return this.buildTr(resourceCells, 'resources');
+        };
+        ResourceDayHeader.prototype.renderDayAndResourceRows = function (dates, dateFormat, todayRange, resources) {
+            var dateCells = [];
+            var resourceCells = [];
+            for (var _i = 0, dates_1 = dates; _i < dates_1.length; _i++) {
+                var date = dates_1[_i];
+                dateCells.push(this.renderDateCell(date, dateFormat, todayRange, resources.length, null, true));
+                for (var _a = 0, resources_1 = resources; _a < resources_1.length; _a++) {
+                    var resource = resources_1[_a];
+                    resourceCells.push(createElement(ResourceCell, { key: resource.id + ':' + date.toISOString(), resource: resource, colSpan: 1, date: date }));
+                }
+            }
+            return (createElement(Fragment, null,
+                this.buildTr(dateCells, 'day'),
+                this.buildTr(resourceCells, 'resources')));
+        };
+        ResourceDayHeader.prototype.renderResourceAndDayRows = function (resources, dates, dateFormat, todayRange) {
+            var resourceCells = [];
+            var dateCells = [];
+            for (var _i = 0, resources_2 = resources; _i < resources_2.length; _i++) {
+                var resource = resources_2[_i];
+                resourceCells.push(createElement(ResourceCell, { key: resource.id, resource: resource, colSpan: dates.length, isSticky: true }));
+                for (var _a = 0, dates_2 = dates; _a < dates_2.length; _a++) {
+                    var date = dates_2[_a];
+                    dateCells.push(this.renderDateCell(date, dateFormat, todayRange, 1, resource));
+                }
+            }
+            return (createElement(Fragment, null,
+                this.buildTr(resourceCells, 'day'),
+                this.buildTr(dateCells, 'resources')));
+        };
+        // a cell with date text. might have a resource associated with it
+        ResourceDayHeader.prototype.renderDateCell = function (date, dateFormat, todayRange, colSpan, resource, isSticky) {
+            var props = this.props;
+            var keyPostfix = resource ? ":" + resource.id : '';
+            var extraHookProps = resource ? { resource: new ResourceApi(this.context, resource) } : {};
+            var extraDataAttrs = resource ? { 'data-resource-id': resource.id } : {};
+            return props.datesRepDistinctDays ?
+                createElement(TableDateCell, { key: date.toISOString() + keyPostfix, date: date, dateProfile: props.dateProfile, todayRange: todayRange, colCnt: props.dates.length * props.resources.length, dayHeaderFormat: dateFormat, colSpan: colSpan, isSticky: isSticky, extraHookProps: extraHookProps, extraDataAttrs: extraDataAttrs }) :
+                createElement(TableDowCell // we can't leverage the pure-componentness becausae the extra* props are new every time :(
+                , { key: date.getUTCDay() + keyPostfix, dow: date.getUTCDay(), dayHeaderFormat: dateFormat, colSpan: colSpan, isSticky: isSticky, extraHookProps: extraHookProps, extraDataAttrs: extraDataAttrs });
+        };
+        ResourceDayHeader.prototype.buildTr = function (cells, key) {
+            var renderIntro = this.props.renderIntro;
+            if (!cells.length) {
+                cells = [createElement("td", { key: 0 }, "\u00A0")];
+            }
+            return (createElement("tr", { key: key },
+                renderIntro && renderIntro(),
+                cells));
+        };
+        return ResourceDayHeader;
+    }(BaseComponent));
+    function buildDateFormat(dayHeaderFormat, datesRepDistinctDays, dayCnt) {
+        return dayHeaderFormat || computeFallbackHeaderFormat(datesRepDistinctDays, dayCnt);
+    }
+    var ResourceCell = /** @class */ (function (_super) {
+        __extends(ResourceCell, _super);
+        function ResourceCell() {
+            return _super !== null && _super.apply(this, arguments) || this;
+        }
+        ResourceCell.prototype.render = function () {
+            var props = this.props;
+            return (createElement(ResourceLabelRoot, { resource: props.resource, date: props.date }, function (elRef, customClassNames, dataAttrs, innerElRef, innerContent) { return (createElement("th", __assign({ ref: elRef, className: ['fc-col-header-cell', 'fc-resource'].concat(customClassNames).join(' '), colSpan: props.colSpan }, dataAttrs),
+                createElement("div", { className: 'fc-scrollgrid-sync-inner' },
+                    createElement("span", { className: [
+                            'fc-col-header-cell-cushion',
+                            props.isSticky ? 'fc-sticky' : ''
+                        ].join(' '), ref: innerElRef }, innerContent)))); }));
+        };
+        return ResourceCell;
+    }(BaseComponent));
+
+    var AbstractResourceDayTableModel = /** @class */ (function () {
+        function AbstractResourceDayTableModel(dayTableModel, resources, context) {
+            this.dayTableModel = dayTableModel;
+            this.resources = resources;
+            this.context = context;
+            this.resourceIndex = new ResourceIndex(resources);
+            this.rowCnt = dayTableModel.rowCnt;
+            this.colCnt = dayTableModel.colCnt * resources.length;
+            this.cells = this.buildCells();
+        }
+        AbstractResourceDayTableModel.prototype.buildCells = function () {
+            var _a = this, rowCnt = _a.rowCnt, dayTableModel = _a.dayTableModel, resources = _a.resources;
+            var rows = [];
+            for (var row = 0; row < rowCnt; row++) {
+                var rowCells = [];
+                for (var dateCol = 0; dateCol < dayTableModel.colCnt; dateCol++) {
+                    for (var resourceCol = 0; resourceCol < resources.length; resourceCol++) {
+                        var resource = resources[resourceCol];
+                        var extraHookProps = { resource: new ResourceApi(this.context, resource) };
+                        var extraDataAttrs = { 'data-resource-id': resource.id };
+                        var extraClassNames = ['fc-resource'];
+                        var date = dayTableModel.cells[row][dateCol].date;
+                        rowCells[this.computeCol(dateCol, resourceCol)] = {
+                            key: resource.id + ':' + date.toISOString(),
+                            date: date,
+                            resource: resource,
+                            extraHookProps: extraHookProps,
+                            extraDataAttrs: extraDataAttrs,
+                            extraClassNames: extraClassNames
+                        };
+                    }
+                }
+                rows.push(rowCells);
+            }
+            return rows;
+        };
+        return AbstractResourceDayTableModel;
+    }());
+    /*
+    resources over dates
+    */
+    var ResourceDayTableModel = /** @class */ (function (_super) {
+        __extends(ResourceDayTableModel, _super);
+        function ResourceDayTableModel() {
+            return _super !== null && _super.apply(this, arguments) || this;
+        }
+        ResourceDayTableModel.prototype.computeCol = function (dateI, resourceI) {
+            return resourceI * this.dayTableModel.colCnt + dateI;
+        };
+        /*
+        all date ranges are intact
+        */
+        ResourceDayTableModel.prototype.computeColRanges = function (dateStartI, dateEndI, resourceI) {
+            return [
+                {
+                    firstCol: this.computeCol(dateStartI, resourceI),
+                    lastCol: this.computeCol(dateEndI, resourceI),
+                    isStart: true,
+                    isEnd: true
+                }
+            ];
+        };
+        return ResourceDayTableModel;
+    }(AbstractResourceDayTableModel));
+    /*
+    dates over resources
+    */
+    var DayResourceTableModel = /** @class */ (function (_super) {
+        __extends(DayResourceTableModel, _super);
+        function DayResourceTableModel() {
+            return _super !== null && _super.apply(this, arguments) || this;
+        }
+        DayResourceTableModel.prototype.computeCol = function (dateI, resourceI) {
+            return dateI * this.resources.length + resourceI;
+        };
+        /*
+        every single day is broken up
+        */
+        DayResourceTableModel.prototype.computeColRanges = function (dateStartI, dateEndI, resourceI) {
+            var segs = [];
+            for (var i = dateStartI; i <= dateEndI; i++) {
+                var col = this.computeCol(i, resourceI);
+                segs.push({
+                    firstCol: col,
+                    lastCol: col,
+                    isStart: i === dateStartI,
+                    isEnd: i === dateEndI
+                });
+            }
+            return segs;
+        };
+        return DayResourceTableModel;
+    }(AbstractResourceDayTableModel));
+    var ResourceIndex = /** @class */ (function () {
+        function ResourceIndex(resources) {
+            var indicesById = {};
+            var ids = [];
+            for (var i = 0; i < resources.length; i++) {
+                var id = resources[i].id;
+                ids.push(id);
+                indicesById[id] = i;
+            }
+            this.ids = ids;
+            this.indicesById = indicesById;
+            this.length = resources.length;
+        }
+        return ResourceIndex;
+    }());
+    /*
+    TODO: just use ResourceHash somehow? could then use the generic ResourceSplitter
+    */
+    var VResourceSplitter = /** @class */ (function (_super) {
+        __extends(VResourceSplitter, _super);
+        function VResourceSplitter() {
+            return _super !== null && _super.apply(this, arguments) || this;
+        }
+        VResourceSplitter.prototype.getKeyInfo = function (props) {
+            var resourceDayTableModel = props.resourceDayTableModel;
+            var hash = mapHash(resourceDayTableModel.resourceIndex.indicesById, function (i) {
+                return resourceDayTableModel.resources[i]; // has `ui` AND `businessHours` keys!
+            }); // :(
+            hash[''] = {};
+            return hash;
+        };
+        VResourceSplitter.prototype.getKeysForDateSpan = function (dateSpan) {
+            return [dateSpan.resourceId || ''];
+        };
+        VResourceSplitter.prototype.getKeysForEventDef = function (eventDef) {
+            var resourceIds = eventDef.resourceIds;
+            if (!resourceIds.length) {
+                return [''];
+            }
+            return resourceIds;
+        };
+        return VResourceSplitter;
+    }(Splitter));
+    // joiner
+    var NO_SEGS = []; // for memoizing
+    var VResourceJoiner = /** @class */ (function () {
+        function VResourceJoiner() {
+            this.joinDateSelection = memoize(this.joinSegs);
+            this.joinBusinessHours = memoize(this.joinSegs);
+            this.joinFgEvents = memoize(this.joinSegs);
+            this.joinBgEvents = memoize(this.joinSegs);
+            this.joinEventDrags = memoize(this.joinInteractions);
+            this.joinEventResizes = memoize(this.joinInteractions);
+        }
+        /*
+        propSets also has a '' key for things with no resource
+        */
+        VResourceJoiner.prototype.joinProps = function (propSets, resourceDayTable) {
+            var dateSelectionSets = [];
+            var businessHoursSets = [];
+            var fgEventSets = [];
+            var bgEventSets = [];
+            var eventDrags = [];
+            var eventResizes = [];
+            var eventSelection = '';
+            var keys = resourceDayTable.resourceIndex.ids.concat(['']); // add in the all-resource key
+            for (var _i = 0, keys_1 = keys; _i < keys_1.length; _i++) {
+                var key = keys_1[_i];
+                var props = propSets[key];
+                dateSelectionSets.push(props.dateSelectionSegs);
+                businessHoursSets.push(key ? props.businessHourSegs : NO_SEGS); // don't include redundant all-resource businesshours
+                fgEventSets.push(key ? props.fgEventSegs : NO_SEGS); // don't include fg all-resource segs
+                bgEventSets.push(props.bgEventSegs);
+                eventDrags.push(props.eventDrag);
+                eventResizes.push(props.eventResize);
+                eventSelection = eventSelection || props.eventSelection;
+            }
+            return {
+                dateSelectionSegs: this.joinDateSelection.apply(this, __spreadArrays([resourceDayTable], dateSelectionSets)),
+                businessHourSegs: this.joinBusinessHours.apply(this, __spreadArrays([resourceDayTable], businessHoursSets)),
+                fgEventSegs: this.joinFgEvents.apply(this, __spreadArrays([resourceDayTable], fgEventSets)),
+                bgEventSegs: this.joinBgEvents.apply(this, __spreadArrays([resourceDayTable], bgEventSets)),
+                eventDrag: this.joinEventDrags.apply(this, __spreadArrays([resourceDayTable], eventDrags)),
+                eventResize: this.joinEventResizes.apply(this, __spreadArrays([resourceDayTable], eventResizes)),
+                eventSelection: eventSelection
+            };
+        };
+        VResourceJoiner.prototype.joinSegs = function (resourceDayTable) {
+            var segGroups = [];
+            for (var _i = 1; _i < arguments.length; _i++) {
+                segGroups[_i - 1] = arguments[_i];
+            }
+            var resourceCnt = resourceDayTable.resources.length;
+            var transformedSegs = [];
+            for (var i = 0; i < resourceCnt; i++) {
+                for (var _a = 0, _b = segGroups[i]; _a < _b.length; _a++) {
+                    var seg = _b[_a];
+                    transformedSegs.push.apply(transformedSegs, this.transformSeg(seg, resourceDayTable, i));
+                }
+                for (var _c = 0, _d = segGroups[resourceCnt]; _c < _d.length; _c++) { // one beyond. the all-resource
+                    var seg = _d[_c];
+                    transformedSegs.push.apply(// one beyond. the all-resource
+                    transformedSegs, this.transformSeg(seg, resourceDayTable, i));
+                }
+            }
+            return transformedSegs;
+        };
+        /*
+        for expanding non-resource segs to all resources.
+        only for public use.
+        no memoizing.
+        */
+        VResourceJoiner.prototype.expandSegs = function (resourceDayTable, segs) {
+            var resourceCnt = resourceDayTable.resources.length;
+            var transformedSegs = [];
+            for (var i = 0; i < resourceCnt; i++) {
+                for (var _i = 0, segs_1 = segs; _i < segs_1.length; _i++) {
+                    var seg = segs_1[_i];
+                    transformedSegs.push.apply(transformedSegs, this.transformSeg(seg, resourceDayTable, i));
+                }
+            }
+            return transformedSegs;
+        };
+        VResourceJoiner.prototype.joinInteractions = function (resourceDayTable) {
+            var interactions = [];
+            for (var _i = 1; _i < arguments.length; _i++) {
+                interactions[_i - 1] = arguments[_i];
+            }
+            var resourceCnt = resourceDayTable.resources.length;
+            var affectedInstances = {};
+            var transformedSegs = [];
+            var anyInteractions = false;
+            var isEvent = false;
+            for (var i = 0; i < resourceCnt; i++) {
+                var interaction = interactions[i];
+                if (interaction) {
+                    anyInteractions = true;
+                    for (var _a = 0, _b = interaction.segs; _a < _b.length; _a++) {
+                        var seg = _b[_a];
+                        transformedSegs.push.apply(transformedSegs, this.transformSeg(seg, resourceDayTable, i) // TODO: templateify Interaction::segs
+                        );
+                    }
+                    __assign(affectedInstances, interaction.affectedInstances);
+                    isEvent = isEvent || interaction.isEvent;
+                }
+                if (interactions[resourceCnt]) { // one beyond. the all-resource
+                    for (var _c = 0, _d = interactions[resourceCnt].segs; _c < _d.length; _c++) {
+                        var seg = _d[_c];
+                        transformedSegs.push.apply(transformedSegs, this.transformSeg(seg, resourceDayTable, i) // TODO: templateify Interaction::segs
+                        );
+                    }
+                }
+            }
+            if (anyInteractions) {
+                return {
+                    affectedInstances: affectedInstances,
+                    segs: transformedSegs,
+                    isEvent: isEvent
+                };
+            }
+            else {
+                return null;
+            }
+        };
+        return VResourceJoiner;
+    }());
+
+    /*
+    doesn't accept grouping
+    */
+    function flattenResources(resourceStore, orderSpecs) {
+        return buildRowNodes(resourceStore, [], orderSpecs, false, {}, true)
+            .map(function (node) {
+            return node.resource;
+        });
+    }
+    function buildRowNodes(resourceStore, groupSpecs, orderSpecs, isVGrouping, expansions, expansionDefault) {
+        var complexNodes = buildHierarchy(resourceStore, isVGrouping ? -1 : 1, groupSpecs, orderSpecs);
+        var flatNodes = [];
+        flattenNodes(complexNodes, flatNodes, isVGrouping, [], 0, expansions, expansionDefault);
+        return flatNodes;
+    }
+    function flattenNodes(complexNodes, res, isVGrouping, rowSpans, depth, expansions, expansionDefault) {
+        for (var i = 0; i < complexNodes.length; i++) {
+            var complexNode = complexNodes[i];
+            var group = complexNode.group;
+            if (group) {
+                if (isVGrouping) {
+                    var firstRowIndex = res.length;
+                    var rowSpanIndex = rowSpans.length;
+                    flattenNodes(complexNode.children, res, isVGrouping, rowSpans.concat(0), depth, expansions, expansionDefault);
+                    if (firstRowIndex < res.length) {
+                        var firstRow = res[firstRowIndex];
+                        var firstRowSpans = firstRow.rowSpans = firstRow.rowSpans.slice();
+                        firstRowSpans[rowSpanIndex] = res.length - firstRowIndex;
+                    }
+                }
+                else {
+                    var id = group.spec.field + ':' + group.value;
+                    var isExpanded = expansions[id] != null ? expansions[id] : expansionDefault;
+                    res.push({ id: id, group: group, isExpanded: isExpanded });
+                    if (isExpanded) {
+                        flattenNodes(complexNode.children, res, isVGrouping, rowSpans, depth + 1, expansions, expansionDefault);
+                    }
+                }
+            }
+            else if (complexNode.resource) {
+                var id = complexNode.resource.id;
+                var isExpanded = expansions[id] != null ? expansions[id] : expansionDefault;
+                res.push({
+                    id: id,
+                    rowSpans: rowSpans,
+                    depth: depth,
+                    isExpanded: isExpanded,
+                    hasChildren: Boolean(complexNode.children.length),
+                    resource: complexNode.resource,
+                    resourceFields: complexNode.resourceFields
+                });
+                if (isExpanded) {
+                    flattenNodes(complexNode.children, res, isVGrouping, rowSpans, depth + 1, expansions, expansionDefault);
+                }
+            }
+        }
+    }
+    function buildHierarchy(resourceStore, maxDepth, groupSpecs, orderSpecs) {
+        var resourceNodes = buildResourceNodes(resourceStore, orderSpecs);
+        var builtNodes = [];
+        for (var resourceId in resourceNodes) {
+            var resourceNode = resourceNodes[resourceId];
+            if (!resourceNode.resource.parentId) {
+                insertResourceNode(resourceNode, builtNodes, groupSpecs, 0, maxDepth, orderSpecs);
+            }
+        }
+        return builtNodes;
+    }
+    function buildResourceNodes(resourceStore, orderSpecs) {
+        var nodeHash = {};
+        for (var resourceId in resourceStore) {
+            var resource = resourceStore[resourceId];
+            nodeHash[resourceId] = {
+                resource: resource,
+                resourceFields: buildResourceFields(resource),
+                children: []
+            };
+        }
+        for (var resourceId in resourceStore) {
+            var resource = resourceStore[resourceId];
+            if (resource.parentId) {
+                var parentNode = nodeHash[resource.parentId];
+                if (parentNode) {
+                    insertResourceNodeInSiblings(nodeHash[resourceId], parentNode.children, orderSpecs);
+                }
+            }
+        }
+        return nodeHash;
+    }
+    function insertResourceNode(resourceNode, nodes, groupSpecs, depth, maxDepth, orderSpecs) {
+        if (groupSpecs.length && (maxDepth === -1 || depth <= maxDepth)) {
+            var groupNode = ensureGroupNodes(resourceNode, nodes, groupSpecs[0]);
+            insertResourceNode(resourceNode, groupNode.children, groupSpecs.slice(1), depth + 1, maxDepth, orderSpecs);
+        }
+        else {
+            insertResourceNodeInSiblings(resourceNode, nodes, orderSpecs);
+        }
+    }
+    function ensureGroupNodes(resourceNode, nodes, groupSpec) {
+        var groupValue = resourceNode.resourceFields[groupSpec.field];
+        var groupNode;
+        var newGroupIndex;
+        // find an existing group that matches, or determine the position for a new group
+        if (groupSpec.order) {
+            for (newGroupIndex = 0; newGroupIndex < nodes.length; newGroupIndex++) {
+                var node = nodes[newGroupIndex];
+                if (node.group) {
+                    var cmp = flexibleCompare(groupValue, node.group.value) * groupSpec.order;
+                    if (cmp === 0) {
+                        groupNode = node;
+                        break;
+                    }
+                    else if (cmp < 0) {
+                        break;
+                    }
+                }
+            }
+        }
+        else { // the groups are unordered
+            for (newGroupIndex = 0; newGroupIndex < nodes.length; newGroupIndex++) {
+                var node = nodes[newGroupIndex];
+                if (node.group && groupValue === node.group.value) {
+                    groupNode = node;
+                    break;
+                }
+            }
+        }
+        if (!groupNode) {
+            groupNode = {
+                group: {
+                    value: groupValue,
+                    spec: groupSpec
+                },
+                children: []
+            };
+            nodes.splice(newGroupIndex, 0, groupNode);
+        }
+        return groupNode;
+    }
+    function insertResourceNodeInSiblings(resourceNode, siblings, orderSpecs) {
+        var i;
+        for (i = 0; i < siblings.length; i++) {
+            var cmp = compareByFieldSpecs(siblings[i].resourceFields, resourceNode.resourceFields, orderSpecs); // TODO: pass in ResourceApi?
+            if (cmp > 0) { // went 1 past. insert at i
+                break;
+            }
+        }
+        siblings.splice(i, 0, resourceNode);
+    }
+    function buildResourceFields(resource) {
+        var obj = __assign(__assign(__assign({}, resource.extendedProps), resource.ui), resource);
+        delete obj.ui;
+        delete obj.extendedProps;
+        return obj;
+    }
+    function isGroupsEqual(group0, group1) {
+        return group0.spec === group1.spec && group0.value === group1.value;
+    }
+
+    var resourceCommonPlugin = createPlugin({
+        deps: [
+            premiumCommonPlugin
+        ],
+        reducers: [reduceResources],
+        eventRefiners: EVENT_REFINERS$1,
+        eventDefMemberAdders: [generateEventDefResourceMembers],
+        isDraggableTransformers: [transformIsDraggable],
+        eventDragMutationMassagers: [massageEventDragMutation],
+        eventDefMutationAppliers: [applyEventDefMutation],
+        dateSelectionTransformers: [transformDateSelectionJoin],
+        datePointTransforms: [transformDatePoint],
+        dateSpanTransforms: [transformDateSpan],
+        viewPropsTransformers: [ResourceDataAdder, ResourceEventConfigAdder],
+        isPropsValid: isPropsValidWithResources,
+        externalDefTransforms: [transformExternalDef],
+        eventResizeJoinTransforms: [transformEventResizeJoin],
+        eventDropTransformers: [transformEventDrop],
+        optionChangeHandlers: optionChangeHandlers,
+        optionRefiners: OPTION_REFINERS$5,
+        listenerRefiners: LISTENER_REFINERS$1,
+        propSetHandlers: { resourceStore: handleResourceStore }
+    });
+
+    var ResourceDayTable = /** @class */ (function (_super) {
+        __extends(ResourceDayTable, _super);
+        function ResourceDayTable() {
+            var _this = _super !== null && _super.apply(this, arguments) || this;
+            _this.allowAcrossResources = false;
+            _this.splitter = new VResourceSplitter();
+            _this.slicers = {};
+            _this.joiner = new ResourceDayTableJoiner();
+            _this.tableRef = createRef();
+            _this.handleRootEl = function (rootEl) {
+                if (rootEl) {
+                    _this.context.registerInteractiveComponent(_this, { el: rootEl });
+                }
+                else {
+                    _this.context.unregisterInteractiveComponent(_this);
+                }
+            };
+            return _this;
+        }
+        ResourceDayTable.prototype.render = function () {
+            var _this = this;
+            var _a = this, props = _a.props, context = _a.context;
+            var resourceDayTableModel = props.resourceDayTableModel, nextDayThreshold = props.nextDayThreshold, dateProfile = props.dateProfile;
+            var splitProps = this.splitter.splitProps(props);
+            this.slicers = mapHash(splitProps, function (split, resourceId) {
+                return _this.slicers[resourceId] || new DayTableSlicer();
+            });
+            var slicedProps = mapHash(this.slicers, function (slicer, resourceId) {
+                return slicer.sliceProps(splitProps[resourceId], dateProfile, nextDayThreshold, context, resourceDayTableModel.dayTableModel);
+            });
+            this.allowAcrossResources = resourceDayTableModel.dayTableModel.colCnt === 1; // hack for EventResizing
+            return (createElement(Table, __assign({ forPrint: props.forPrint, ref: this.tableRef, elRef: this.handleRootEl }, this.joiner.joinProps(slicedProps, resourceDayTableModel), { cells: resourceDayTableModel.cells, dateProfile: dateProfile, colGroupNode: props.colGroupNode, tableMinWidth: props.tableMinWidth, renderRowIntro: props.renderRowIntro, dayMaxEvents: props.dayMaxEvents, dayMaxEventRows: props.dayMaxEventRows, showWeekNumbers: props.showWeekNumbers, expandRows: props.expandRows, headerAlignElRef: props.headerAlignElRef, clientWidth: props.clientWidth, clientHeight: props.clientHeight })));
+        };
+        ResourceDayTable.prototype.prepareHits = function () {
+            this.tableRef.current.prepareHits();
+        };
+        ResourceDayTable.prototype.queryHit = function (positionLeft, positionTop) {
+            var rawHit = this.tableRef.current.positionToHit(positionLeft, positionTop);
+            if (rawHit) {
+                return {
+                    component: this,
+                    dateSpan: {
+                        range: rawHit.dateSpan.range,
+                        allDay: rawHit.dateSpan.allDay,
+                        resourceId: this.props.resourceDayTableModel.cells[rawHit.row][rawHit.col].resource.id
+                    },
+                    dayEl: rawHit.dayEl,
+                    rect: {
+                        left: rawHit.relativeRect.left,
+                        right: rawHit.relativeRect.right,
+                        top: rawHit.relativeRect.top,
+                        bottom: rawHit.relativeRect.bottom
+                    },
+                    layer: 0
+                };
+            }
+        };
+        return ResourceDayTable;
+    }(DateComponent));
+    var ResourceDayTableJoiner = /** @class */ (function (_super) {
+        __extends(ResourceDayTableJoiner, _super);
+        function ResourceDayTableJoiner() {
+            return _super !== null && _super.apply(this, arguments) || this;
+        }
+        ResourceDayTableJoiner.prototype.transformSeg = function (seg, resourceDayTableModel, resourceI) {
+            var colRanges = resourceDayTableModel.computeColRanges(seg.firstCol, seg.lastCol, resourceI);
+            return colRanges.map(function (colRange) {
+                return __assign(__assign(__assign({}, seg), colRange), { isStart: seg.isStart && colRange.isStart, isEnd: seg.isEnd && colRange.isEnd });
+            });
+        };
+        return ResourceDayTableJoiner;
+    }(VResourceJoiner));
+
+    var ResourceDayTableView = /** @class */ (function (_super) {
+        __extends(ResourceDayTableView, _super);
+        function ResourceDayTableView() {
+            var _this = _super !== null && _super.apply(this, arguments) || this;
+            _this.flattenResources = memoize(flattenResources);
+            _this.buildResourceDayTableModel = memoize(buildResourceDayTableModel);
+            _this.headerRef = createRef();
+            _this.tableRef = createRef();
+            return _this;
+        }
+        ResourceDayTableView.prototype.render = function () {
+            var _this = this;
+            var _a = this, props = _a.props, context = _a.context;
+            var options = context.options;
+            var resourceOrderSpecs = options.resourceOrder || DEFAULT_RESOURCE_ORDER;
+            var resources = this.flattenResources(props.resourceStore, resourceOrderSpecs);
+            var resourceDayTableModel = this.buildResourceDayTableModel(props.dateProfile, context.dateProfileGenerator, resources, options.datesAboveResources, context);
+            var headerContent = options.dayHeaders &&
+                createElement(ResourceDayHeader, { ref: this.headerRef, resources: resources, dateProfile: props.dateProfile, dates: resourceDayTableModel.dayTableModel.headerDates, datesRepDistinctDays: true });
+            var bodyContent = function (contentArg) { return (createElement(ResourceDayTable, { ref: _this.tableRef, dateProfile: props.dateProfile, resourceDayTableModel: resourceDayTableModel, businessHours: props.businessHours, eventStore: props.eventStore, eventUiBases: props.eventUiBases, dateSelection: props.dateSelection, eventSelection: props.eventSelection, eventDrag: props.eventDrag, eventResize: props.eventResize, nextDayThreshold: options.nextDayThreshold, tableMinWidth: contentArg.tableMinWidth, colGroupNode: contentArg.tableColGroupNode, dayMaxEvents: options.dayMaxEvents, dayMaxEventRows: options.dayMaxEventRows, showWeekNumbers: options.weekNumbers, expandRows: !props.isHeightAuto, headerAlignElRef: _this.headerElRef, clientWidth: contentArg.clientWidth, clientHeight: contentArg.clientHeight, forPrint: props.forPrint })); };
+            return options.dayMinWidth
+                ? this.renderHScrollLayout(headerContent, bodyContent, resourceDayTableModel.colCnt, options.dayMinWidth)
+                : this.renderSimpleLayout(headerContent, bodyContent);
+        };
+        return ResourceDayTableView;
+    }(TableView));
+    function buildResourceDayTableModel(dateProfile, dateProfileGenerator, resources, datesAboveResources, context) {
+        var dayTable = buildDayTableModel(dateProfile, dateProfileGenerator);
+        return datesAboveResources ?
+            new DayResourceTableModel(dayTable, resources, context) :
+            new ResourceDayTableModel(dayTable, resources, context);
+    }
+
+    var resourceDayGridPlugin = createPlugin({
+        deps: [
+            premiumCommonPlugin,
+            resourceCommonPlugin,
+            dayGridPlugin
+        ],
+        initialView: 'resourceDayGridDay',
+        views: {
+            resourceDayGrid: {
+                type: 'dayGrid',
+                component: ResourceDayTableView,
+                needsResourceData: true
+            },
+            resourceDayGridDay: {
+                type: 'resourceDayGrid',
+                duration: { days: 1 }
+            },
+            resourceDayGridWeek: {
+                type: 'resourceDayGrid',
+                duration: { weeks: 1 }
+            },
+            resourceDayGridMonth: {
+                type: 'resourceDayGrid',
+                duration: { months: 1 },
+                // TODO: wish we didn't have to C&P from dayGrid's file
+                monthMode: true,
+                fixedWeekCount: true
+            }
+        }
+    });
+
+    var ResourceDayTimeCols = /** @class */ (function (_super) {
+        __extends(ResourceDayTimeCols, _super);
+        function ResourceDayTimeCols() {
+            var _this = _super !== null && _super.apply(this, arguments) || this;
+            _this.allowAcrossResources = false;
+            _this.buildDayRanges = memoize(buildDayRanges);
+            _this.splitter = new VResourceSplitter();
+            _this.slicers = {};
+            _this.joiner = new ResourceDayTimeColsJoiner();
+            _this.timeColsRef = createRef();
+            _this.handleRootEl = function (rootEl) {
+                if (rootEl) {
+                    _this.context.registerInteractiveComponent(_this, { el: rootEl });
+                }
+                else {
+                    _this.context.unregisterInteractiveComponent(_this);
+                }
+            };
+            return _this;
+        }
+        ResourceDayTimeCols.prototype.render = function () {
+            var _this = this;
+            var _a = this, props = _a.props, context = _a.context;
+            var dateEnv = context.dateEnv, options = context.options;
+            var dateProfile = props.dateProfile, resourceDayTableModel = props.resourceDayTableModel;
+            var dayRanges = this.dayRanges = this.buildDayRanges(resourceDayTableModel.dayTableModel, dateProfile, dateEnv);
+            var splitProps = this.splitter.splitProps(props);
+            this.slicers = mapHash(splitProps, function (split, resourceId) {
+                return _this.slicers[resourceId] || new DayTimeColsSlicer();
+            });
+            var slicedProps = mapHash(this.slicers, function (slicer, resourceId) {
+                return slicer.sliceProps(splitProps[resourceId], dateProfile, null, context, dayRanges);
+            });
+            this.allowAcrossResources = dayRanges.length === 1;
+            return ( // TODO: would move this further down hierarchy, but sliceNowDate needs it
+            createElement(NowTimer, { unit: options.nowIndicator ? 'minute' : 'day' }, function (nowDate, todayRange) { return (createElement(TimeCols, __assign({ ref: _this.timeColsRef, rootElRef: _this.handleRootEl }, _this.joiner.joinProps(slicedProps, resourceDayTableModel), { dateProfile: dateProfile, axis: props.axis, slotDuration: props.slotDuration, slatMetas: props.slatMetas, cells: resourceDayTableModel.cells[0], tableColGroupNode: props.tableColGroupNode, tableMinWidth: props.tableMinWidth, clientWidth: props.clientWidth, clientHeight: props.clientHeight, expandRows: props.expandRows, nowDate: nowDate, nowIndicatorSegs: options.nowIndicator && _this.buildNowIndicatorSegs(nowDate), todayRange: todayRange, onScrollTopRequest: props.onScrollTopRequest, forPrint: props.forPrint, onSlatCoords: props.onSlatCoords }))); }));
+        };
+        ResourceDayTimeCols.prototype.buildNowIndicatorSegs = function (date) {
+            var nonResourceSegs = this.slicers[''].sliceNowDate(date, this.context, this.dayRanges);
+            return this.joiner.expandSegs(this.props.resourceDayTableModel, nonResourceSegs);
+        };
+        ResourceDayTimeCols.prototype.queryHit = function (positionLeft, positionTop) {
+            var rawHit = this.timeColsRef.current.positionToHit(positionLeft, positionTop);
+            if (rawHit) {
+                return {
+                    component: this,
+                    dateSpan: {
+                        range: rawHit.dateSpan.range,
+                        allDay: rawHit.dateSpan.allDay,
+                        resourceId: this.props.resourceDayTableModel.cells[0][rawHit.col].resource.id
+                    },
+                    dayEl: rawHit.dayEl,
+                    rect: {
+                        left: rawHit.relativeRect.left,
+                        right: rawHit.relativeRect.right,
+                        top: rawHit.relativeRect.top,
+                        bottom: rawHit.relativeRect.bottom
+                    },
+                    layer: 0
+                };
+            }
+        };
+        return ResourceDayTimeCols;
+    }(DateComponent));
+    var ResourceDayTimeColsJoiner = /** @class */ (function (_super) {
+        __extends(ResourceDayTimeColsJoiner, _super);
+        function ResourceDayTimeColsJoiner() {
+            return _super !== null && _super.apply(this, arguments) || this;
+        }
+        ResourceDayTimeColsJoiner.prototype.transformSeg = function (seg, resourceDayTable, resourceI) {
+            return [
+                __assign(__assign({}, seg), { col: resourceDayTable.computeCol(seg.col, resourceI) })
+            ];
+        };
+        return ResourceDayTimeColsJoiner;
+    }(VResourceJoiner));
+
+    var ResourceDayTimeColsView = /** @class */ (function (_super) {
+        __extends(ResourceDayTimeColsView, _super);
+        function ResourceDayTimeColsView() {
+            var _this = _super !== null && _super.apply(this, arguments) || this;
+            _this.flattenResources = memoize(flattenResources);
+            _this.buildResourceTimeColsModel = memoize(buildResourceTimeColsModel);
+            _this.buildSlatMetas = memoize(buildSlatMetas);
+            return _this;
+        }
+        ResourceDayTimeColsView.prototype.render = function () {
+            var _this = this;
+            var _a = this, props = _a.props, context = _a.context;
+            var options = context.options, dateEnv = context.dateEnv;
+            var dateProfile = props.dateProfile;
+            var splitProps = this.allDaySplitter.splitProps(props);
+            var resourceOrderSpecs = options.resourceOrder || DEFAULT_RESOURCE_ORDER;
+            var resources = this.flattenResources(props.resourceStore, resourceOrderSpecs);
+            var resourceDayTableModel = this.buildResourceTimeColsModel(dateProfile, context.dateProfileGenerator, resources, options.datesAboveResources, context);
+            var slatMetas = this.buildSlatMetas(dateProfile.slotMinTime, dateProfile.slotMaxTime, options.slotLabelInterval, options.slotDuration, dateEnv);
+            var dayMinWidth = options.dayMinWidth;
+            var hasAttachedAxis = !dayMinWidth;
+            var hasDetachedAxis = dayMinWidth;
+            var headerContent = options.dayHeaders &&
+                createElement(ResourceDayHeader, { resources: resources, dates: resourceDayTableModel.dayTableModel.headerDates, dateProfile: dateProfile, datesRepDistinctDays: true, renderIntro: hasAttachedAxis ? this.renderHeadAxis : null });
+            var allDayContent = (options.allDaySlot !== false) && (function (contentArg) { return (createElement(ResourceDayTable, __assign({}, splitProps['allDay'], { dateProfile: dateProfile, resourceDayTableModel: resourceDayTableModel, nextDayThreshold: options.nextDayThreshold, tableMinWidth: contentArg.tableMinWidth, colGroupNode: contentArg.tableColGroupNode, renderRowIntro: hasAttachedAxis ? _this.renderTableRowAxis : null, showWeekNumbers: false, expandRows: false, headerAlignElRef: _this.headerElRef, clientWidth: contentArg.clientWidth, clientHeight: contentArg.clientHeight, forPrint: props.forPrint }, _this.getAllDayMaxEventProps()))); });
+            var timeGridContent = function (contentArg) { return (createElement(ResourceDayTimeCols, __assign({}, splitProps['timed'], { dateProfile: dateProfile, axis: hasAttachedAxis, slotDuration: options.slotDuration, slatMetas: slatMetas, resourceDayTableModel: resourceDayTableModel, tableColGroupNode: contentArg.tableColGroupNode, tableMinWidth: contentArg.tableMinWidth, clientWidth: contentArg.clientWidth, clientHeight: contentArg.clientHeight, onSlatCoords: _this.handleSlatCoords, expandRows: contentArg.expandRows, forPrint: props.forPrint, onScrollTopRequest: _this.handleScrollTopRequest }))); };
+            return hasDetachedAxis
+                ? this.renderHScrollLayout(headerContent, allDayContent, timeGridContent, resourceDayTableModel.colCnt, dayMinWidth, slatMetas, this.state.slatCoords)
+                : this.renderSimpleLayout(headerContent, allDayContent, timeGridContent);
+        };
+        return ResourceDayTimeColsView;
+    }(TimeColsView));
+    function buildResourceTimeColsModel(dateProfile, dateProfileGenerator, resources, datesAboveResources, context) {
+        var dayTable = buildTimeColsModel(dateProfile, dateProfileGenerator);
+        return datesAboveResources ?
+            new DayResourceTableModel(dayTable, resources, context) :
+            new ResourceDayTableModel(dayTable, resources, context);
+    }
+
+    var resourceTimeGridPlugin = createPlugin({
+        deps: [
+            premiumCommonPlugin,
+            resourceCommonPlugin,
+            timeGridPlugin
+        ],
+        initialView: 'resourceTimeGridDay',
+        views: {
+            resourceTimeGrid: {
+                type: 'timeGrid',
+                component: ResourceDayTimeColsView,
+                needsResourceData: true
+            },
+            resourceTimeGridDay: {
+                type: 'resourceTimeGrid',
+                duration: { days: 1 }
+            },
+            resourceTimeGridWeek: {
+                type: 'resourceTimeGrid',
+                duration: { weeks: 1 }
+            }
+        }
+    });
+
+    /*
+    Renders the DOM responsible for the subrow expander area,
+    as well as the space before it (used to align expanders of similar depths)
+    */
+    function ExpanderIcon(_a) {
+        var depth = _a.depth, hasChildren = _a.hasChildren, isExpanded = _a.isExpanded, onExpanderClick = _a.onExpanderClick;
+        var nodes = [];
+        for (var i = 0; i < depth; i++) {
+            nodes.push(createElement("span", { className: 'fc-icon' }));
+        }
+        var iconClassNames = ['fc-icon'];
+        if (hasChildren) {
+            if (isExpanded) {
+                iconClassNames.push('fc-icon-minus-square');
+            }
+            else {
+                iconClassNames.push('fc-icon-plus-square');
+            }
+        }
+        nodes.push(createElement("span", { className: 'fc-datagrid-expander' + (hasChildren ? '' : ' fc-datagrid-expander-placeholder'), onClick: onExpanderClick },
+            createElement("span", { className: iconClassNames.join(' ') })));
+        return createElement.apply(void 0, __spreadArrays([Fragment, {}], nodes));
+    }
+
+    var SpreadsheetIndividualCell = /** @class */ (function (_super) {
+        __extends(SpreadsheetIndividualCell, _super);
+        function SpreadsheetIndividualCell() {
+            var _this = _super !== null && _super.apply(this, arguments) || this;
+            _this.refineHookProps = memoizeObjArg(refineHookProps$2);
+            _this.normalizeClassNames = buildClassNameNormalizer();
+            _this.onExpanderClick = function (ev) {
+                var props = _this.props;
+                if (props.hasChildren) {
+                    _this.context.dispatch({
+                        type: 'SET_RESOURCE_ENTITY_EXPANDED',
+                        id: props.resource.id,
+                        isExpanded: !props.isExpanded
+                    });
+                }
+            };
+            return _this;
+        }
+        SpreadsheetIndividualCell.prototype.render = function () {
+            var _this = this;
+            var _a = this, props = _a.props, context = _a.context;
+            var colSpec = props.colSpec;
+            var hookProps = this.refineHookProps({
+                resource: props.resource,
+                fieldValue: props.fieldValue,
+                context: context
+            });
+            var customClassNames = this.normalizeClassNames(colSpec.cellClassNames, hookProps);
+            return (createElement(MountHook, { hookProps: hookProps, didMount: colSpec.cellDidMount, willUnmount: colSpec.cellWillUnmount }, function (rootElRef) { return (createElement("td", { className: ['fc-datagrid-cell', 'fc-resource'].concat(customClassNames).join(' '), "data-resource-id": props.resource.id, ref: rootElRef },
+                createElement("div", { className: 'fc-datagrid-cell-frame', style: { height: props.innerHeight } },
+                    createElement("div", { className: 'fc-datagrid-cell-cushion fc-scrollgrid-sync-inner' },
+                        colSpec.isMain &&
+                            createElement(ExpanderIcon, { depth: props.depth, hasChildren: props.hasChildren, isExpanded: props.isExpanded, onExpanderClick: _this.onExpanderClick }),
+                        createElement(SpreadsheetIndividualCellInner, { hookProps: hookProps, colSpec: colSpec }))))); }));
+        };
+        return SpreadsheetIndividualCell;
+    }(BaseComponent));
+    var SpreadsheetIndividualCellInner = /** @class */ (function (_super) {
+        __extends(SpreadsheetIndividualCellInner, _super);
+        function SpreadsheetIndividualCellInner() {
+            return _super !== null && _super.apply(this, arguments) || this;
+        }
+        SpreadsheetIndividualCellInner.prototype.render = function () {
+            var props = this.props;
+            return (createElement(ContentHook, { hookProps: props.hookProps, content: props.colSpec.cellContent, defaultContent: renderResourceInner }, function (innerElRef, innerContent) { return (createElement("span", { className: 'fc-datagrid-cell-main', ref: innerElRef }, innerContent)); }));
+        };
+        return SpreadsheetIndividualCellInner;
+    }(BaseComponent));
+    function renderResourceInner(hookProps) {
+        return hookProps.fieldValue || createElement(Fragment, null, "\u00A0");
+    }
+    function refineHookProps$2(raw) {
+        return {
+            resource: new ResourceApi(raw.context, raw.resource),
+            fieldValue: raw.fieldValue,
+            view: raw.context.viewApi
+        };
+    }
+
+    // for VERTICAL cell grouping, in spreadsheet area
+    var SpreadsheetGroupCell = /** @class */ (function (_super) {
+        __extends(SpreadsheetGroupCell, _super);
+        function SpreadsheetGroupCell() {
+            return _super !== null && _super.apply(this, arguments) || this;
+        }
+        SpreadsheetGroupCell.prototype.render = function () {
+            var _a = this, props = _a.props, context = _a.context;
+            var colSpec = props.colSpec;
+            var hookProps = {
+                groupValue: props.fieldValue,
+                view: context.viewApi
+            };
+            // a grouped cell. no data that is specific to this specific resource
+            // `colSpec` is for the group. a GroupSpec :(
+            return (createElement(RenderHook, { hookProps: hookProps, classNames: colSpec.cellClassNames, content: colSpec.cellContent, defaultContent: renderGroupInner, didMount: colSpec.cellDidMount, willUnmount: colSpec.cellWillUnmount }, function (rootElRef, classNames, innerElRef, innerContent) { return (
+            // TODO: make data-attr with group value?
+            createElement("td", { className: ['fc-datagrid-cell', 'fc-resource-group'].concat(classNames).join(' '), rowSpan: props.rowSpan, ref: rootElRef },
+                createElement("div", { className: 'fc-datagrid-cell-frame fc-datagrid-cell-frame-liquid' },
+                    " ",
+                    createElement("div", { className: 'fc-datagrid-cell-cushion fc-sticky', ref: innerElRef }, innerContent)))); }));
+        };
+        return SpreadsheetGroupCell;
+    }(BaseComponent));
+    function renderGroupInner(hookProps) {
+        return hookProps.groupValue || createElement(Fragment, null, "\u00A0");
+    }
+
+    var SpreadsheetRow = /** @class */ (function (_super) {
+        __extends(SpreadsheetRow, _super);
+        function SpreadsheetRow() {
+            return _super !== null && _super.apply(this, arguments) || this;
+        }
+        SpreadsheetRow.prototype.render = function () {
+            var props = this.props;
+            var resource = props.resource, rowSpans = props.rowSpans, depth = props.depth;
+            var resourceFields = buildResourceFields(resource); // slightly inefficient. already done up the call stack
+            return (createElement("tr", null, props.colSpecs.map(function (colSpec, i) {
+                var rowSpan = rowSpans[i];
+                if (rowSpan === 0) { // not responsible for group-based rows. VRowGroup is
+                    return;
+                }
+                else if (rowSpan == null) {
+                    rowSpan = 1;
+                }
+                var fieldValue = colSpec.field ? resourceFields[colSpec.field] :
+                    (resource.title || getPublicId(resource.id));
+                if (rowSpan > 1) {
+                    return (createElement(SpreadsheetGroupCell, { key: i, colSpec: colSpec, fieldValue: fieldValue, rowSpan: rowSpan }));
+                }
+                else {
+                    return (createElement(SpreadsheetIndividualCell, { key: i, colSpec: colSpec, resource: resource, fieldValue: fieldValue, depth: depth, hasChildren: props.hasChildren, isExpanded: props.isExpanded, innerHeight: props.innerHeight }));
+                }
+            })));
+        };
+        return SpreadsheetRow;
+    }(BaseComponent));
+    SpreadsheetRow.addPropsEquality({
+        rowSpans: isArraysEqual
+    });
+
+    // for HORIZONTAL cell grouping, in spreadsheet area
+    var SpreadsheetGroupRow = /** @class */ (function (_super) {
+        __extends(SpreadsheetGroupRow, _super);
+        function SpreadsheetGroupRow() {
+            var _this = _super !== null && _super.apply(this, arguments) || this;
+            _this.innerInnerRef = createRef();
+            _this.onExpanderClick = function () {
+                var props = _this.props;
+                _this.context.dispatch({
+                    type: 'SET_RESOURCE_ENTITY_EXPANDED',
+                    id: props.id,
+                    isExpanded: !props.isExpanded
+                });
+            };
+            return _this;
+        }
+        SpreadsheetGroupRow.prototype.render = function () {
+            var _this = this;
+            var _a = this, props = _a.props, context = _a.context;
+            var hookProps = { groupValue: props.group.value, view: context.viewApi };
+            var spec = props.group.spec;
+            return (createElement("tr", null,
+                createElement(RenderHook, { hookProps: hookProps, classNames: spec.labelClassNames, content: spec.labelContent, defaultContent: renderCellInner, didMount: spec.labelDidMount, willUnmount: spec.labelWillUnmount }, function (rootElRef, classNames, innerElRef, innerContent) { return (createElement("td", { className: ['fc-datagrid-cell', 'fc-resource-group', context.theme.getClass('tableCellShaded')].concat(classNames).join(' '), colSpan: props.spreadsheetColCnt, ref: rootElRef },
+                    createElement("div", { className: 'fc-datagrid-cell-frame', style: { height: props.innerHeight } },
+                        createElement("div", { className: 'fc-datagrid-cell-cushion fc-scrollgrid-sync-inner', ref: _this.innerInnerRef },
+                            createElement(ExpanderIcon, { depth: 0, hasChildren: true, isExpanded: props.isExpanded, onExpanderClick: _this.onExpanderClick }),
+                            createElement("span", { className: 'fc-datagrid-cell-main', ref: innerElRef }, innerContent))))); })));
+        };
+        return SpreadsheetGroupRow;
+    }(BaseComponent));
+    SpreadsheetGroupRow.addPropsEquality({
+        group: isGroupsEqual
+    });
+    function renderCellInner(hookProps) {
+        return hookProps.groupValue || createElement(Fragment, null, "\u00A0");
+    }
+
+    var SPREADSHEET_COL_MIN_WIDTH = 20;
+    var SpreadsheetHeader = /** @class */ (function (_super) {
+        __extends(SpreadsheetHeader, _super);
+        function SpreadsheetHeader() {
+            var _this = _super !== null && _super.apply(this, arguments) || this;
+            _this.resizerElRefs = new RefMap(_this._handleColResizerEl.bind(_this));
+            _this.colDraggings = {};
+            return _this;
+        }
+        SpreadsheetHeader.prototype.render = function () {
+            var _this = this;
+            var _a = this.props, colSpecs = _a.colSpecs, superHeaderRendering = _a.superHeaderRendering, rowInnerHeights = _a.rowInnerHeights;
+            var hookProps = { view: this.context.viewApi };
+            var rowNodes = [];
+            rowInnerHeights = rowInnerHeights.slice(); // copy, because we're gonna pop
+            if (superHeaderRendering) {
+                var rowInnerHeight_1 = rowInnerHeights.shift();
+                rowNodes.push(createElement("tr", { key: 'row-super' },
+                    createElement(RenderHook, { hookProps: hookProps, classNames: superHeaderRendering.headerClassNames, content: superHeaderRendering.headerContent, didMount: superHeaderRendering.headerDidMount, willUnmount: superHeaderRendering.headerWillUnmount }, function (rootElRef, classNames, innerElRef, innerContent) { return (createElement("th", { colSpan: colSpecs.length, className: ['fc-datagrid-cell', 'fc-datagrid-cell-super'].concat(classNames).join(' '), ref: rootElRef },
+                        createElement("div", { className: 'fc-datagrid-cell-frame', style: { height: rowInnerHeight_1 } },
+                            createElement("div", { className: 'fc-datagrid-cell-cushion fc-scrollgrid-sync-inner', ref: innerElRef }, innerContent)))); })));
+            }
+            var rowInnerHeight = rowInnerHeights.shift();
+            rowNodes.push(createElement("tr", { key: 'row' }, colSpecs.map(function (colSpec, i) {
+                var isLastCol = i === (colSpecs.length - 1);
+                // need empty inner div for abs positioning for resizer
+                return (createElement(RenderHook, { key: i, hookProps: hookProps, classNames: colSpec.headerClassNames, content: colSpec.headerContent, didMount: colSpec.headerDidMount, willUnmount: colSpec.headerWillUnmount }, function (rootElRef, classNames, innerElRef, innerContent) { return (createElement("th", { ref: rootElRef, className: ['fc-datagrid-cell'].concat(classNames).join(' ') },
+                    createElement("div", { className: 'fc-datagrid-cell-frame', style: { height: rowInnerHeight } },
+                        createElement("div", { className: 'fc-datagrid-cell-cushion fc-scrollgrid-sync-inner' },
+                            colSpec.isMain &&
+                                createElement("span", { className: 'fc-datagrid-expander fc-datagrid-expander-placeholder' },
+                                    createElement("span", { className: 'fc-icon' })),
+                            createElement("span", { className: 'fc-datagrid-cell-main', ref: innerElRef }, innerContent)),
+                        !isLastCol &&
+                            createElement("div", { className: 'fc-datagrid-cell-resizer', ref: _this.resizerElRefs.createRef(i) })))); }));
+            })));
+            return (createElement(Fragment, null, rowNodes));
+        };
+        SpreadsheetHeader.prototype._handleColResizerEl = function (resizerEl, index) {
+            var colDraggings = this.colDraggings;
+            if (!resizerEl) {
+                var dragging = colDraggings[index];
+                if (dragging) {
+                    dragging.destroy();
+                    delete colDraggings[index];
+                }
+            }
+            else {
+                var dragging = this.initColResizing(resizerEl, parseInt(index, 10));
+                if (dragging) {
+                    colDraggings[index] = dragging;
+                }
+            }
+        };
+        SpreadsheetHeader.prototype.initColResizing = function (resizerEl, index) {
+            var _a = this.context, pluginHooks = _a.pluginHooks, isRtl = _a.isRtl;
+            var onColWidthChange = this.props.onColWidthChange;
+            var ElementDraggingImpl = pluginHooks.elementDraggingImpl;
+            if (ElementDraggingImpl) {
+                var dragging = new ElementDraggingImpl(resizerEl);
+                var startWidth_1; // of just the single column
+                var currentWidths_1; // of all columns
+                dragging.emitter.on('dragstart', function () {
+                    var allCells = findElements(elementClosest(resizerEl, 'tr'), 'th');
+                    currentWidths_1 = allCells.map(function (resizerEl) { return (elementClosest(resizerEl, 'th').getBoundingClientRect().width); });
+                    startWidth_1 = currentWidths_1[index];
+                });
+                dragging.emitter.on('dragmove', function (pev) {
+                    currentWidths_1[index] = Math.max(startWidth_1 + pev.deltaX * (isRtl ? -1 : 1), SPREADSHEET_COL_MIN_WIDTH);
+                    if (onColWidthChange) {
+                        onColWidthChange(currentWidths_1.slice()); // send a copy since currentWidths continues to be mutated
+                    }
+                });
+                dragging.setAutoScrollEnabled(false); // because gets weird with auto-scrolling time area
+                return dragging;
+            }
+        };
+        return SpreadsheetHeader;
+    }(BaseComponent));
+
+    var ResourceTimelineLane = /** @class */ (function (_super) {
+        __extends(ResourceTimelineLane, _super);
+        function ResourceTimelineLane() {
+            var _this = _super !== null && _super.apply(this, arguments) || this;
+            _this.refineHookProps = memoizeObjArg(refineHookProps$3);
+            _this.normalizeClassNames = buildClassNameNormalizer();
+            _this.handleHeightChange = function (innerEl, isStable) {
+                if (_this.props.onHeightChange) {
+                    _this.props.onHeightChange(elementClosest(innerEl, 'tr'), // would want to use own <tr> ref, but not guaranteed to be ready when this fires
+                    isStable);
+                }
+            };
+            return _this;
+        }
+        ResourceTimelineLane.prototype.render = function () {
+            var _this = this;
+            var _a = this, props = _a.props, context = _a.context;
+            var options = context.options;
+            var hookProps = this.refineHookProps({ resource: props.resource, context: context });
+            var customClassNames = this.normalizeClassNames(options.resourceLaneClassNames, hookProps);
+            return (createElement("tr", { ref: props.elRef },
+                createElement(MountHook, { hookProps: hookProps, didMount: options.resourceLaneDidMount, willUnmount: options.resourceLaneWillUnmount }, function (rootElRef) { return (createElement("td", { ref: rootElRef, className: ['fc-timeline-lane', 'fc-resource'].concat(customClassNames).join(' '), "data-resource-id": props.resource.id },
+                    createElement("div", { className: 'fc-timeline-lane-frame', style: { height: props.innerHeight } },
+                        createElement(ResourceTimelineLaneMisc, { resource: props.resource }),
+                        createElement(TimelineLane, { dateProfile: props.dateProfile, tDateProfile: props.tDateProfile, nowDate: props.nowDate, todayRange: props.todayRange, nextDayThreshold: props.nextDayThreshold, businessHours: props.businessHours, eventStore: props.eventStore, eventUiBases: props.eventUiBases, dateSelection: props.dateSelection, eventSelection: props.eventSelection, eventDrag: props.eventDrag, eventResize: props.eventResize, timelineCoords: props.timelineCoords, onHeightChange: _this.handleHeightChange })))); }))); // important NOT to do liquid-height. dont want to shrink height smaller than content
+        };
+        return ResourceTimelineLane;
+    }(BaseComponent));
+    var ResourceTimelineLaneMisc = /** @class */ (function (_super) {
+        __extends(ResourceTimelineLaneMisc, _super);
+        function ResourceTimelineLaneMisc() {
+            return _super !== null && _super.apply(this, arguments) || this;
+        }
+        ResourceTimelineLaneMisc.prototype.render = function () {
+            var _a = this, props = _a.props, context = _a.context;
+            var hookProps = { resource: new ResourceApi(context, props.resource) }; // just easier to make directly
+            return (createElement(ContentHook, { hookProps: hookProps, content: context.options.resourceLaneContent }, function (innerElRef, innerContent) { return (innerContent && // TODO: test how this would interfere with height
+                createElement("div", { className: 'fc-timeline-lane-misc', ref: innerElRef }, innerContent)); }));
+        };
+        return ResourceTimelineLaneMisc;
+    }(BaseComponent));
+    function refineHookProps$3(raw) {
+        return {
+            resource: new ResourceApi(raw.context, raw.resource)
+        };
+    }
+
+    /*
+    parallels the SpreadsheetGroupRow
+    */
+    var DividerRow = /** @class */ (function (_super) {
+        __extends(DividerRow, _super);
+        function DividerRow() {
+            return _super !== null && _super.apply(this, arguments) || this;
+        }
+        DividerRow.prototype.render = function () {
+            var _this = this;
+            var props = this.props;
+            var renderingHooks = this.props.renderingHooks;
+            var hookProps = { groupValue: props.groupValue, view: this.context.viewApi };
+            return (createElement("tr", { ref: props.elRef },
+                createElement(RenderHook, { hookProps: hookProps, classNames: renderingHooks.laneClassNames, content: renderingHooks.laneContent, didMount: renderingHooks.laneDidMount, willUnmount: renderingHooks.laneWillUnmount }, function (rootElRef, classNames, innerElRef, innerContent) { return (createElement("td", { className: ['fc-timeline-lane', 'fc-resource-group', _this.context.theme.getClass('tableCellShaded')].concat(classNames).join(' '), ref: rootElRef },
+                    createElement("div", { style: { height: props.innerHeight }, ref: innerElRef }, innerContent))); })));
+        };
+        return DividerRow;
+    }(BaseComponent));
+
+    var ResourceTimelineLanes = /** @class */ (function (_super) {
+        __extends(ResourceTimelineLanes, _super);
+        function ResourceTimelineLanes() {
+            var _this = _super !== null && _super.apply(this, arguments) || this;
+            _this.rootElRef = createRef();
+            _this.rowElRefs = new RefMap();
+            return _this;
+        }
+        ResourceTimelineLanes.prototype.render = function () {
+            var _a = this, props = _a.props, context = _a.context;
+            return (createElement("table", { ref: this.rootElRef, className: 'fc-scrollgrid-sync-table ' + context.theme.getClass('table'), style: {
+                    minWidth: props.tableMinWidth,
+                    width: props.clientWidth,
+                    height: props.minHeight
+                } },
+                createElement(ResourceTimelineLanesBody, { rowElRefs: this.rowElRefs, rowNodes: props.rowNodes, dateProfile: props.dateProfile, tDateProfile: props.tDateProfile, nowDate: props.nowDate, todayRange: props.todayRange, splitProps: props.splitProps, fallbackBusinessHours: props.fallbackBusinessHours, slatCoords: props.slatCoords, innerHeights: props.innerHeights, onRowHeightChange: props.onRowHeightChange })));
+        };
+        ResourceTimelineLanes.prototype.componentDidMount = function () {
+            this.updateCoords();
+        };
+        ResourceTimelineLanes.prototype.componentDidUpdate = function () {
+            this.updateCoords();
+        };
+        ResourceTimelineLanes.prototype.componentWillUnmount = function () {
+            if (this.props.onRowCoords) {
+                this.props.onRowCoords(null);
+            }
+        };
+        ResourceTimelineLanes.prototype.updateCoords = function () {
+            var props = this.props;
+            if (props.onRowCoords && props.clientWidth !== null) { // a populated clientWidth means sizing has stabilized
+                this.props.onRowCoords(new PositionCache(this.rootElRef.current, collectRowEls(this.rowElRefs.currentMap, props.rowNodes), false, true // isVertical
+                ));
+            }
+        };
+        return ResourceTimelineLanes;
+    }(BaseComponent));
+    function collectRowEls(elMap, rowNodes) {
+        return rowNodes.map(function (rowNode) { return elMap[rowNode.id]; });
+    }
+    var ResourceTimelineLanesBody = /** @class */ (function (_super) {
+        __extends(ResourceTimelineLanesBody, _super);
+        function ResourceTimelineLanesBody() {
+            return _super !== null && _super.apply(this, arguments) || this;
+        }
+        ResourceTimelineLanesBody.prototype.render = function () {
+            var _a = this, props = _a.props, context = _a.context;
+            var rowElRefs = props.rowElRefs, innerHeights = props.innerHeights;
+            return (createElement("tbody", null, props.rowNodes.map(function (node, index) {
+                if (node.group) {
+                    return (createElement(DividerRow, { key: node.id, elRef: rowElRefs.createRef(node.id), groupValue: node.group.value, renderingHooks: node.group.spec, innerHeight: innerHeights[index] || '' }));
+                }
+                else if (node.resource) {
+                    var resource = node.resource;
+                    return (createElement(ResourceTimelineLane, __assign({ key: node.id, elRef: rowElRefs.createRef(node.id) }, props.splitProps[resource.id], { resource: resource, dateProfile: props.dateProfile, tDateProfile: props.tDateProfile, nowDate: props.nowDate, todayRange: props.todayRange, nextDayThreshold: context.options.nextDayThreshold, businessHours: resource.businessHours || props.fallbackBusinessHours, innerHeight: innerHeights[index] || '', timelineCoords: props.slatCoords, onHeightChange: props.onRowHeightChange })));
+                }
+            })));
+        };
+        return ResourceTimelineLanesBody;
+    }(BaseComponent));
+
+    var ResourceTimelineGrid = /** @class */ (function (_super) {
+        __extends(ResourceTimelineGrid, _super);
+        function ResourceTimelineGrid() {
+            var _this = _super !== null && _super.apply(this, arguments) || this;
+            _this.computeHasResourceBusinessHours = memoize(computeHasResourceBusinessHours);
+            _this.resourceSplitter = new ResourceSplitter(); // doesn't let it do businessHours tho
+            _this.bgSlicer = new TimelineLaneSlicer();
+            _this.slatsRef = createRef(); // needed for Hit creation :(
+            _this.state = {
+                slatCoords: null
+            };
+            _this.handleEl = function (el) {
+                if (el) {
+                    _this.context.registerInteractiveComponent(_this, { el: el });
+                }
+                else {
+                    _this.context.unregisterInteractiveComponent(_this);
+                }
+            };
+            _this.handleSlatCoords = function (slatCoords) {
+                _this.setState({ slatCoords: slatCoords });
+                if (_this.props.onSlatCoords) {
+                    _this.props.onSlatCoords(slatCoords);
+                }
+            };
+            _this.handleRowCoords = function (rowCoords) {
+                _this.rowCoords = rowCoords;
+                if (_this.props.onRowCoords) {
+                    _this.props.onRowCoords(rowCoords);
+                }
+            };
+            return _this;
+        }
+        ResourceTimelineGrid.prototype.render = function () {
+            var _this = this;
+            var _a = this, props = _a.props, state = _a.state, context = _a.context;
+            var dateProfile = props.dateProfile, tDateProfile = props.tDateProfile;
+            var timerUnit = greatestDurationDenominator(tDateProfile.slotDuration).unit;
+            var hasResourceBusinessHours = this.computeHasResourceBusinessHours(props.rowNodes);
+            var splitProps = this.resourceSplitter.splitProps(props);
+            var bgLaneProps = splitProps[''];
+            var bgSlicedProps = this.bgSlicer.sliceProps(bgLaneProps, dateProfile, tDateProfile.isTimeScale ? null : props.nextDayThreshold, context, // wish we didn't need to pass in the rest of these args...
+            dateProfile, context.dateProfileGenerator, tDateProfile, context.dateEnv);
+            return (createElement("div", { ref: this.handleEl, className: 'fc-timeline-body', style: { minWidth: props.tableMinWidth } },
+                createElement(NowTimer, { unit: timerUnit }, function (nowDate, todayRange) { return (createElement(Fragment, null,
+                    createElement(TimelineSlats, { ref: _this.slatsRef, dateProfile: dateProfile, tDateProfile: tDateProfile, nowDate: nowDate, todayRange: todayRange, clientWidth: props.clientWidth, tableColGroupNode: props.tableColGroupNode, tableMinWidth: props.tableMinWidth, onCoords: _this.handleSlatCoords, onScrollLeftRequest: props.onScrollLeftRequest }),
+                    createElement(TimelineLaneBg, { businessHourSegs: hasResourceBusinessHours ? null : bgSlicedProps.businessHourSegs, bgEventSegs: bgSlicedProps.bgEventSegs, timelineCoords: state.slatCoords, eventResizeSegs: (bgSlicedProps.eventResize ? bgSlicedProps.eventResize.segs : []) /* empty array will result in unnecessary rerenders? */, dateSelectionSegs: bgSlicedProps.dateSelectionSegs, nowDate: nowDate, todayRange: todayRange }),
+                    createElement(ResourceTimelineLanes, { rowNodes: props.rowNodes, dateProfile: dateProfile, tDateProfile: props.tDateProfile, nowDate: nowDate, todayRange: todayRange, splitProps: splitProps, fallbackBusinessHours: hasResourceBusinessHours ? props.businessHours : null, clientWidth: props.clientWidth, minHeight: props.expandRows ? props.clientHeight : '', tableMinWidth: props.tableMinWidth, innerHeights: props.rowInnerHeights, slatCoords: state.slatCoords, onRowCoords: _this.handleRowCoords, onRowHeightChange: props.onRowHeightChange }),
+                    (context.options.nowIndicator && state.slatCoords && state.slatCoords.isDateInRange(nowDate)) &&
+                        createElement(NowIndicatorRoot, { isAxis: false, date: nowDate }, function (rootElRef, classNames, innerElRef, innerContent) { return (createElement("div", { ref: rootElRef, className: ['fc-timeline-now-indicator-line'].concat(classNames).join(' '), style: { left: state.slatCoords.dateToCoord(nowDate) } }, innerContent)); }))); })));
+        };
+        // Hit System
+        // ------------------------------------------------------------------------------------------
+        ResourceTimelineGrid.prototype.queryHit = function (positionLeft, positionTop) {
+            var rowCoords = this.rowCoords;
+            var rowIndex = rowCoords.topToIndex(positionTop);
+            if (rowIndex != null) {
+                var resource = this.props.rowNodes[rowIndex].resource;
+                if (resource) { // not a group
+                    var slatHit = this.slatsRef.current.positionToHit(positionLeft);
+                    if (slatHit) {
+                        return {
+                            component: this,
+                            dateSpan: {
+                                range: slatHit.dateSpan.range,
+                                allDay: slatHit.dateSpan.allDay,
+                                resourceId: resource.id
+                            },
+                            rect: {
+                                left: slatHit.left,
+                                right: slatHit.right,
+                                top: rowCoords.tops[rowIndex],
+                                bottom: rowCoords.bottoms[rowIndex]
+                            },
+                            dayEl: slatHit.dayEl,
+                            layer: 0
+                        };
+                    }
+                }
+            }
+        };
+        return ResourceTimelineGrid;
+    }(DateComponent));
+    function computeHasResourceBusinessHours(rowNodes) {
+        for (var _i = 0, rowNodes_1 = rowNodes; _i < rowNodes_1.length; _i++) {
+            var node = rowNodes_1[_i];
+            var resource = node.resource;
+            if (resource && resource.businessHours) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    var MIN_RESOURCE_AREA_WIDTH = 30; // definitely bigger than scrollbars
+    var ResourceTimelineViewLayout = /** @class */ (function (_super) {
+        __extends(ResourceTimelineViewLayout, _super);
+        function ResourceTimelineViewLayout() {
+            var _this = _super !== null && _super.apply(this, arguments) || this;
+            _this.scrollGridRef = createRef();
+            _this.timeBodyScrollerElRef = createRef();
+            _this.spreadsheetHeaderChunkElRef = createRef();
+            _this.rootElRef = createRef();
+            _this.state = {
+                resourceAreaWidthOverride: null
+            };
+            return _this;
+        }
+        ResourceTimelineViewLayout.prototype.render = function () {
+            var _a = this, props = _a.props, state = _a.state, context = _a.context;
+            var options = context.options;
+            var stickyHeaderDates = !props.forPrint && getStickyHeaderDates(options);
+            var stickyFooterScrollbar = !props.forPrint && getStickyFooterScrollbar(options);
+            var sections = [
+                {
+                    type: 'header',
+                    key: 'header',
+                    syncRowHeights: true,
+                    isSticky: stickyHeaderDates,
+                    chunks: [
+                        {
+                            key: 'datagrid',
+                            elRef: this.spreadsheetHeaderChunkElRef,
+                            tableClassName: 'fc-datagrid-header',
+                            rowContent: props.spreadsheetHeaderRows
+                        },
+                        {
+                            key: 'divider',
+                            outerContent: (createElement("td", { className: 'fc-resource-timeline-divider ' + context.theme.getClass('tableCellShaded') }))
+                        },
+                        {
+                            key: 'timeline',
+                            content: props.timeHeaderContent
+                        }
+                    ]
+                },
+                {
+                    type: 'body',
+                    key: 'body',
+                    syncRowHeights: true,
+                    liquid: true,
+                    expandRows: Boolean(options.expandRows),
+                    chunks: [
+                        {
+                            key: 'datagrid',
+                            tableClassName: 'fc-datagrid-body',
+                            rowContent: props.spreadsheetBodyRows
+                        },
+                        {
+                            key: 'divider',
+                            outerContent: (createElement("td", { className: 'fc-resource-timeline-divider ' + context.theme.getClass('tableCellShaded') }))
+                        },
+                        {
+                            key: 'timeline',
+                            scrollerElRef: this.timeBodyScrollerElRef,
+                            content: props.timeBodyContent
+                        }
+                    ]
+                }
+            ];
+            if (stickyFooterScrollbar) {
+                sections.push({
+                    type: 'footer',
+                    key: 'footer',
+                    isSticky: true,
+                    chunks: [
+                        {
+                            key: 'datagrid',
+                            content: renderScrollShim
+                        },
+                        {
+                            key: 'divider',
+                            outerContent: (createElement("td", { className: 'fc-resource-timeline-divider ' + context.theme.getClass('tableCellShaded') }))
+                        },
+                        {
+                            key: 'timeline',
+                            content: renderScrollShim
+                        }
+                    ]
+                });
+            }
+            var resourceAreaWidth = state.resourceAreaWidthOverride != null
+                ? state.resourceAreaWidthOverride
+                : options.resourceAreaWidth;
+            return (createElement(ScrollGrid, { ref: this.scrollGridRef, elRef: this.rootElRef, liquid: !props.isHeightAuto && !props.forPrint, colGroups: [
+                    { cols: props.spreadsheetCols, width: resourceAreaWidth },
+                    { cols: [] },
+                    { cols: props.timeCols }
+                ], sections: sections }));
+        };
+        ResourceTimelineViewLayout.prototype.forceTimeScroll = function (left) {
+            var scrollGrid = this.scrollGridRef.current;
+            scrollGrid.forceScrollLeft(2, left); // 2 = the time area
+        };
+        ResourceTimelineViewLayout.prototype.forceResourceScroll = function (top) {
+            var scrollGrid = this.scrollGridRef.current;
+            scrollGrid.forceScrollTop(1, top); // 1 = the body
+        };
+        ResourceTimelineViewLayout.prototype.getResourceScroll = function () {
+            var timeBodyScrollerEl = this.timeBodyScrollerElRef.current;
+            return timeBodyScrollerEl.scrollTop;
+        };
+        // Resource Area Resizing
+        // ------------------------------------------------------------------------------------------
+        // NOTE: a callback Ref for the resizer was firing multiple times with same elements (Preact)
+        // that's why we use spreadsheetResizerElRef instead
+        ResourceTimelineViewLayout.prototype.componentDidMount = function () {
+            this.initSpreadsheetResizing();
+        };
+        ResourceTimelineViewLayout.prototype.componentWillUnmount = function () {
+            this.destroySpreadsheetResizing();
+        };
+        ResourceTimelineViewLayout.prototype.initSpreadsheetResizing = function () {
+            var _this = this;
+            var _a = this.context, isRtl = _a.isRtl, pluginHooks = _a.pluginHooks;
+            var ElementDraggingImpl = pluginHooks.elementDraggingImpl;
+            var spreadsheetHeadEl = this.spreadsheetHeaderChunkElRef.current;
+            if (ElementDraggingImpl) {
+                var rootEl_1 = this.rootElRef.current;
+                var dragging = this.spreadsheetResizerDragging = new ElementDraggingImpl(rootEl_1, '.fc-resource-timeline-divider');
+                var dragStartWidth_1;
+                var viewWidth_1;
+                dragging.emitter.on('dragstart', function () {
+                    dragStartWidth_1 = spreadsheetHeadEl.getBoundingClientRect().width;
+                    viewWidth_1 = rootEl_1.getBoundingClientRect().width;
+                });
+                dragging.emitter.on('dragmove', function (pev) {
+                    var newWidth = dragStartWidth_1 + pev.deltaX * (isRtl ? -1 : 1);
+                    newWidth = Math.max(newWidth, MIN_RESOURCE_AREA_WIDTH);
+                    newWidth = Math.min(newWidth, viewWidth_1 - MIN_RESOURCE_AREA_WIDTH);
+                    _this.setState({
+                        resourceAreaWidthOverride: newWidth
+                    });
+                });
+                dragging.setAutoScrollEnabled(false); // because gets weird with auto-scrolling time area
+            }
+        };
+        ResourceTimelineViewLayout.prototype.destroySpreadsheetResizing = function () {
+            if (this.spreadsheetResizerDragging) {
+                this.spreadsheetResizerDragging.destroy();
+            }
+        };
+        return ResourceTimelineViewLayout;
+    }(BaseComponent));
+
+    var ResourceTimelineView = /** @class */ (function (_super) {
+        __extends(ResourceTimelineView, _super);
+        function ResourceTimelineView(props, context) {
+            var _this = _super.call(this, props, context) || this;
+            _this.processColOptions = memoize(processColOptions);
+            _this.buildTimelineDateProfile = memoize(buildTimelineDateProfile);
+            _this.hasNesting = memoize(hasNesting);
+            _this.buildRowNodes = memoize(buildRowNodes);
+            _this.layoutRef = createRef();
+            _this.rowNodes = [];
+            _this.renderedRowNodes = [];
+            _this.buildRowIndex = memoize(buildRowIndex);
+            _this.handleSlatCoords = function (slatCoords) {
+                _this.setState({ slatCoords: slatCoords });
+            };
+            _this.handleRowCoords = function (rowCoords) {
+                _this.rowCoords = rowCoords;
+                _this.scrollResponder.update(false); // TODO: could eliminate this if rowCoords lived in state
+            };
+            _this.handleMaxCushionWidth = function (slotCushionMaxWidth) {
+                _this.setState({
+                    slotCushionMaxWidth: Math.ceil(slotCushionMaxWidth) // for less rerendering TODO: DRY
+                });
+            };
+            // Scrolling
+            // ------------------------------------------------------------------------------------------------------------------
+            // this is useful for scrolling prev/next dates while resource is scrolled down
+            _this.handleScrollLeftRequest = function (scrollLeft) {
+                var layout = _this.layoutRef.current;
+                layout.forceTimeScroll(scrollLeft);
+            };
+            _this.handleScrollRequest = function (request) {
+                var rowCoords = _this.rowCoords;
+                var layout = _this.layoutRef.current;
+                var rowId = request.rowId || request.resourceId;
+                if (rowCoords) {
+                    if (rowId) {
+                        var rowIdToIndex = _this.buildRowIndex(_this.renderedRowNodes);
+                        var index = rowIdToIndex[rowId];
+                        if (index != null) {
+                            var scrollTop = (request.fromBottom != null ?
+                                rowCoords.bottoms[index] - request.fromBottom : // pixels from bottom edge
+                                rowCoords.tops[index] // just use top edge
+                            );
+                            layout.forceResourceScroll(scrollTop);
+                        }
+                    }
+                    return true;
+                }
+            };
+            // Resource INDIVIDUAL-Column Area Resizing
+            // ------------------------------------------------------------------------------------------
+            _this.handleColWidthChange = function (colWidths) {
+                _this.setState({
+                    spreadsheetColWidths: colWidths
+                });
+            };
+            _this.state = {
+                resourceAreaWidth: context.options.resourceAreaWidth,
+                spreadsheetColWidths: []
+            };
+            return _this;
+        }
+        ResourceTimelineView.prototype.render = function () {
+            var _this = this;
+            var _a = this, props = _a.props, state = _a.state, context = _a.context;
+            var options = context.options, viewSpec = context.viewSpec;
+            var _b = this.processColOptions(context.options), superHeaderRendering = _b.superHeaderRendering, groupSpecs = _b.groupSpecs, orderSpecs = _b.orderSpecs, isVGrouping = _b.isVGrouping, colSpecs = _b.colSpecs;
+            var tDateProfile = this.buildTimelineDateProfile(props.dateProfile, context.dateEnv, options, context.dateProfileGenerator);
+            var rowNodes = this.rowNodes = this.buildRowNodes(props.resourceStore, groupSpecs, orderSpecs, isVGrouping, props.resourceEntityExpansions, options.resourcesInitiallyExpanded);
+            var extraClassNames = [
+                'fc-resource-timeline',
+                this.hasNesting(rowNodes) ? '' : 'fc-resource-timeline-flat',
+                'fc-timeline',
+                options.eventOverlap === false ? 'fc-timeline-overlap-disabled' : 'fc-timeline-overlap-enabled'
+            ];
+            var slotMinWidth = options.slotMinWidth;
+            var slatCols = buildSlatCols(tDateProfile, slotMinWidth || this.computeFallbackSlotMinWidth(tDateProfile));
+            return (createElement(ViewRoot, { viewSpec: viewSpec }, function (rootElRef, classNames) { return (createElement("div", { ref: rootElRef, className: extraClassNames.concat(classNames).join(' ') },
+                createElement(ResourceTimelineViewLayout, { ref: _this.layoutRef, forPrint: props.forPrint, isHeightAuto: props.isHeightAuto, spreadsheetCols: buildSpreadsheetCols(colSpecs, state.spreadsheetColWidths, ''), spreadsheetHeaderRows: function (contentArg) { return (createElement(SpreadsheetHeader // TODO: rename to SpreadsheetHeaderRows
+                    , { superHeaderRendering: superHeaderRendering, colSpecs: colSpecs, onColWidthChange: _this.handleColWidthChange, rowInnerHeights: contentArg.rowSyncHeights })); }, spreadsheetBodyRows: function (contentArg) { return (createElement(Fragment, null, _this.renderSpreadsheetRows(rowNodes, colSpecs, contentArg.rowSyncHeights))); }, timeCols: slatCols, timeHeaderContent: function (contentArg) { return (createElement(TimelineHeader, { clientWidth: contentArg.clientWidth, clientHeight: contentArg.clientHeight, tableMinWidth: contentArg.tableMinWidth, tableColGroupNode: contentArg.tableColGroupNode, dateProfile: props.dateProfile, tDateProfile: tDateProfile, slatCoords: state.slatCoords, rowInnerHeights: contentArg.rowSyncHeights, onMaxCushionWidth: slotMinWidth ? null : _this.handleMaxCushionWidth })); }, timeBodyContent: function (contentArg) { return (createElement(ResourceTimelineGrid, { dateProfile: props.dateProfile, clientWidth: contentArg.clientWidth, clientHeight: contentArg.clientHeight, tableMinWidth: contentArg.tableMinWidth, tableColGroupNode: contentArg.tableColGroupNode, expandRows: contentArg.expandRows, tDateProfile: tDateProfile, rowNodes: rowNodes, businessHours: props.businessHours, dateSelection: props.dateSelection, eventStore: props.eventStore, eventUiBases: props.eventUiBases, eventSelection: props.eventSelection, eventDrag: props.eventDrag, eventResize: props.eventResize, resourceStore: props.resourceStore, nextDayThreshold: context.options.nextDayThreshold, rowInnerHeights: contentArg.rowSyncHeights, onSlatCoords: _this.handleSlatCoords, onRowCoords: _this.handleRowCoords, onScrollLeftRequest: _this.handleScrollLeftRequest, onRowHeightChange: contentArg.reportRowHeightChange })); } }))); }));
+        };
+        ResourceTimelineView.prototype.renderSpreadsheetRows = function (nodes, colSpecs, rowSyncHeights) {
+            return nodes.map(function (node, index) {
+                if (node.group) {
+                    return (createElement(SpreadsheetGroupRow, { key: node.id, id: node.id, spreadsheetColCnt: colSpecs.length, isExpanded: node.isExpanded, group: node.group, innerHeight: rowSyncHeights[index] || '' }));
+                }
+                else if (node.resource) {
+                    return (createElement(SpreadsheetRow, { key: node.id, colSpecs: colSpecs, rowSpans: node.rowSpans, depth: node.depth, isExpanded: node.isExpanded, hasChildren: node.hasChildren, resource: node.resource, innerHeight: rowSyncHeights[index] || '' }));
+                }
+            });
+        };
+        ResourceTimelineView.prototype.componentDidMount = function () {
+            this.renderedRowNodes = this.rowNodes;
+            this.scrollResponder = this.context.createScrollResponder(this.handleScrollRequest);
+        };
+        ResourceTimelineView.prototype.getSnapshotBeforeUpdate = function () {
+            if (!this.props.forPrint) { // because print-view is always zero?
+                return { resourceScroll: this.queryResourceScroll() };
+            }
+            else {
+                return {};
+            }
+        };
+        ResourceTimelineView.prototype.componentDidUpdate = function (prevProps, prevState, snapshot) {
+            this.renderedRowNodes = this.rowNodes;
+            this.scrollResponder.update(prevProps.dateProfile !== this.props.dateProfile);
+            if (snapshot.resourceScroll) {
+                this.handleScrollRequest(snapshot.resourceScroll); // TODO: this gets triggered too often
+            }
+        };
+        ResourceTimelineView.prototype.componentWillUnmount = function () {
+            this.scrollResponder.detach();
+        };
+        ResourceTimelineView.prototype.computeFallbackSlotMinWidth = function (tDateProfile) {
+            return Math.max(30, ((this.state.slotCushionMaxWidth || 0) / tDateProfile.slotsPerLabel));
+        };
+        ResourceTimelineView.prototype.queryResourceScroll = function () {
+            var _a = this, rowCoords = _a.rowCoords, renderedRowNodes = _a.renderedRowNodes;
+            if (rowCoords) {
+                var layout = this.layoutRef.current;
+                var trBottoms = rowCoords.bottoms;
+                var scrollTop = layout.getResourceScroll();
+                var scroll_1 = {};
+                for (var i = 0; i < trBottoms.length; i++) {
+                    var rowNode = renderedRowNodes[i];
+                    var elBottom = trBottoms[i] - scrollTop; // from the top of the scroller
+                    if (elBottom > 0) {
+                        scroll_1.rowId = rowNode.id;
+                        scroll_1.fromBottom = elBottom;
+                        break;
+                    }
+                }
+                return scroll_1;
+            }
+        };
+        return ResourceTimelineView;
+    }(BaseComponent));
+    ResourceTimelineView.addStateEquality({
+        spreadsheetColWidths: isArraysEqual
+    });
+    function buildRowIndex(rowNodes) {
+        var rowIdToIndex = {};
+        for (var i = 0; i < rowNodes.length; i++) {
+            rowIdToIndex[rowNodes[i].id] = i;
+        }
+        return rowIdToIndex;
+    }
+    function buildSpreadsheetCols(colSpecs, forcedWidths, fallbackWidth) {
+        if (fallbackWidth === void 0) { fallbackWidth = ''; }
+        return colSpecs.map(function (colSpec, i) {
+            return {
+                className: colSpec.isMain ? 'fc-main-col' : '',
+                width: forcedWidths[i] || colSpec.width || fallbackWidth
+            };
+        });
+    }
+    function hasNesting(nodes) {
+        for (var _i = 0, nodes_1 = nodes; _i < nodes_1.length; _i++) {
+            var node = nodes_1[_i];
+            if (node.group) {
+                return true;
+            }
+            else if (node.resource) {
+                if (node.hasChildren) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+    function processColOptions(options) {
+        var allColSpecs = options.resourceAreaColumns || [];
+        var superHeaderRendering = null;
+        if (!allColSpecs.length) {
+            allColSpecs.push({
+                headerClassNames: options.resourceAreaHeaderClassNames,
+                headerContent: options.resourceAreaHeaderContent || 'Resources',
+                headerDidMount: options.resourceAreaHeaderDidMount,
+                headerWillUnmount: options.resourceAreaHeaderWillUnmount
+            });
+        }
+        else if (options.resourceAreaHeaderContent) { // weird way to determine if content
+            superHeaderRendering = {
+                headerClassNames: options.resourceAreaHeaderClassNames,
+                headerContent: options.resourceAreaHeaderContent,
+                headerDidMount: options.resourceAreaHeaderDidMount,
+                headerWillUnmount: options.resourceAreaHeaderWillUnmount
+            };
+        }
+        var plainColSpecs = [];
+        var groupColSpecs = []; // part of the colSpecs, but filtered out in order to put first
+        var groupSpecs = [];
+        var isVGrouping = false;
+        for (var _i = 0, allColSpecs_1 = allColSpecs; _i < allColSpecs_1.length; _i++) {
+            var colSpec = allColSpecs_1[_i];
+            if (colSpec.group) {
+                groupColSpecs.push(__assign(__assign({}, colSpec), { cellClassNames: colSpec.cellClassNames || options.resourceGroupLabelClassNames, cellContent: colSpec.cellContent || options.resourceGroupLabelContent, cellDidMount: colSpec.cellDidMount || options.resourceGroupLabelDidMount, cellWillUnmount: colSpec.cellWillUnmount || options.resourceGroupLaneWillUnmount }));
+            }
+            else {
+                plainColSpecs.push(colSpec);
+            }
+        }
+        // BAD: mutates a user-supplied option
+        var mainColSpec = plainColSpecs[0];
+        mainColSpec.isMain = true;
+        mainColSpec.cellClassNames = mainColSpec.cellClassNames || options.resourceLabelClassNames;
+        mainColSpec.cellContent = mainColSpec.cellContent || options.resourceLabelContent;
+        mainColSpec.cellDidMount = mainColSpec.cellDidMount || options.resourceLabelDidMount;
+        mainColSpec.cellWillUnmount = mainColSpec.cellWillUnmount || options.resourceLabelWillUnmount;
+        if (groupColSpecs.length) {
+            groupSpecs = groupColSpecs;
+            isVGrouping = true;
+        }
+        else {
+            var hGroupField = options.resourceGroupField;
+            if (hGroupField) {
+                groupSpecs.push({
+                    field: hGroupField,
+                    labelClassNames: options.resourceGroupLabelClassNames,
+                    labelContent: options.resourceGroupLabelContent,
+                    labelDidMount: options.resourceGroupLabelDidMount,
+                    labelWillUnmount: options.resourceGroupLabelWillUnmount,
+                    laneClassNames: options.resourceGroupLaneClassNames,
+                    laneContent: options.resourceGroupLaneContent,
+                    laneDidMount: options.resourceGroupLaneDidMount,
+                    laneWillUnmount: options.resourceGroupLaneWillUnmount
+                });
+            }
+        }
+        var allOrderSpecs = options.resourceOrder || DEFAULT_RESOURCE_ORDER;
+        var plainOrderSpecs = [];
+        for (var _a = 0, allOrderSpecs_1 = allOrderSpecs; _a < allOrderSpecs_1.length; _a++) {
+            var orderSpec = allOrderSpecs_1[_a];
+            var isGroup = false;
+            for (var _b = 0, groupSpecs_1 = groupSpecs; _b < groupSpecs_1.length; _b++) {
+                var groupSpec = groupSpecs_1[_b];
+                if (groupSpec.field === orderSpec.field) {
+                    groupSpec.order = orderSpec.order; // -1, 0, 1
+                    isGroup = true;
+                    break;
+                }
+            }
+            if (!isGroup) {
+                plainOrderSpecs.push(orderSpec);
+            }
+        }
+        return {
+            superHeaderRendering: superHeaderRendering,
+            isVGrouping: isVGrouping,
+            groupSpecs: groupSpecs,
+            colSpecs: groupColSpecs.concat(plainColSpecs),
+            orderSpecs: plainOrderSpecs
+        };
+    }
+
+    var resourceTimelinePlugin = createPlugin({
+        deps: [
+            premiumCommonPlugin,
+            resourceCommonPlugin,
+            timelinePlugin
+        ],
+        initialView: 'resourceTimelineDay',
+        views: {
+            resourceTimeline: {
+                type: 'timeline',
+                component: ResourceTimelineView,
+                needsResourceData: true,
+                resourceAreaWidth: '30%',
+                resourcesInitiallyExpanded: true,
+                eventResizableFromStart: true // TODO: not DRY with this same setting in the main timeline config
+            },
+            resourceTimelineDay: {
+                type: 'resourceTimeline',
+                duration: { days: 1 }
+            },
+            resourceTimelineWeek: {
+                type: 'resourceTimeline',
+                duration: { weeks: 1 }
+            },
+            resourceTimelineMonth: {
+                type: 'resourceTimeline',
+                duration: { months: 1 }
+            },
+            resourceTimelineYear: {
+                type: 'resourceTimeline',
+                duration: { years: 1 }
+            }
+        }
+    });
+
+    globalPlugins.push(interactionPlugin, dayGridPlugin, timeGridPlugin, listPlugin, plugin, googleCalendarPlugin, scrollGridPlugin, adaptivePlugin, timelinePlugin, resourceCommonPlugin, resourceDayGridPlugin, resourceTimeGridPlugin, resourceTimelinePlugin);
+
+    exports.AbstractResourceDayTableModel = AbstractResourceDayTableModel;
+    exports.BASE_OPTION_DEFAULTS = BASE_OPTION_DEFAULTS;
+    exports.BASE_OPTION_REFINERS = BASE_OPTION_REFINERS;
+    exports.BaseComponent = BaseComponent;
+    exports.BgEvent = BgEvent;
+    exports.BootstrapTheme = BootstrapTheme;
+    exports.Calendar = Calendar;
+    exports.CalendarApi = CalendarApi;
+    exports.CalendarContent = CalendarContent;
+    exports.CalendarDataManager = CalendarDataManager;
+    exports.CalendarDataProvider = CalendarDataProvider;
+    exports.CalendarRoot = CalendarRoot;
+    exports.Component = Component;
+    exports.ContentHook = ContentHook;
+    exports.CustomContentRenderContext = CustomContentRenderContext;
+    exports.DEFAULT_RESOURCE_ORDER = DEFAULT_RESOURCE_ORDER;
+    exports.DateComponent = DateComponent;
+    exports.DateEnv = DateEnv;
+    exports.DateProfileGenerator = DateProfileGenerator;
+    exports.DayCellContent = DayCellContent;
+    exports.DayCellRoot = DayCellRoot;
+    exports.DayGridView = DayTableView;
+    exports.DayHeader = DayHeader;
+    exports.DayResourceTableModel = DayResourceTableModel;
+    exports.DaySeriesModel = DaySeriesModel;
+    exports.DayTable = DayTable;
+    exports.DayTableModel = DayTableModel;
+    exports.DayTableSlicer = DayTableSlicer;
+    exports.DayTimeCols = DayTimeCols;
+    exports.DayTimeColsSlicer = DayTimeColsSlicer;
+    exports.DayTimeColsView = DayTimeColsView;
+    exports.DelayedRunner = DelayedRunner;
+    exports.Draggable = ExternalDraggable;
+    exports.ElementDragging = ElementDragging;
+    exports.ElementScrollController = ElementScrollController;
+    exports.Emitter = Emitter;
+    exports.EventApi = EventApi;
+    exports.EventRoot = EventRoot;
+    exports.EventSourceApi = EventSourceApi;
+    exports.FeaturefulElementDragging = FeaturefulElementDragging;
+    exports.Fragment = Fragment;
+    exports.Interaction = Interaction;
+    exports.ListView = ListView;
+    exports.MountHook = MountHook;
+    exports.NamedTimeZoneImpl = NamedTimeZoneImpl;
+    exports.NowIndicatorRoot = NowIndicatorRoot;
+    exports.NowTimer = NowTimer;
+    exports.PointerDragging = PointerDragging;
+    exports.PositionCache = PositionCache;
+    exports.RefMap = RefMap;
+    exports.RenderHook = RenderHook;
+    exports.ResourceApi = ResourceApi;
+    exports.ResourceDayHeader = ResourceDayHeader;
+    exports.ResourceDayTable = ResourceDayTable;
+    exports.ResourceDayTableModel = ResourceDayTableModel;
+    exports.ResourceDayTableView = ResourceDayTableView;
+    exports.ResourceDayTimeCols = ResourceDayTimeCols;
+    exports.ResourceDayTimeColsView = ResourceDayTimeColsView;
+    exports.ResourceLabelRoot = ResourceLabelRoot;
+    exports.ResourceSplitter = ResourceSplitter;
+    exports.ResourceTimelineLane = ResourceTimelineLane;
+    exports.ResourceTimelineView = ResourceTimelineView;
+    exports.ScrollController = ScrollController;
+    exports.ScrollGrid = ScrollGrid;
+    exports.ScrollResponder = ScrollResponder;
+    exports.Scroller = Scroller;
+    exports.SimpleScrollGrid = SimpleScrollGrid;
+    exports.Slicer = Slicer;
+    exports.Splitter = Splitter;
+    exports.SpreadsheetRow = SpreadsheetRow;
+    exports.StandardEvent = StandardEvent;
+    exports.Table = Table;
+    exports.TableDateCell = TableDateCell;
+    exports.TableDowCell = TableDowCell;
+    exports.TableView = TableView;
+    exports.Theme = Theme;
+    exports.ThirdPartyDraggable = ThirdPartyDraggable;
+    exports.TimeCols = TimeCols;
+    exports.TimeColsSlatsCoords = TimeColsSlatsCoords;
+    exports.TimeColsView = TimeColsView;
+    exports.TimelineCoords = TimelineCoords;
+    exports.TimelineHeader = TimelineHeader;
+    exports.TimelineHeaderRows = TimelineHeaderRows;
+    exports.TimelineLane = TimelineLane;
+    exports.TimelineLaneBg = TimelineLaneBg;
+    exports.TimelineLaneSlicer = TimelineLaneSlicer;
+    exports.TimelineSlats = TimelineSlats;
+    exports.TimelineView = TimelineView;
+    exports.VResourceJoiner = VResourceJoiner;
+    exports.VResourceSplitter = VResourceSplitter;
+    exports.ViewApi = ViewApi;
+    exports.ViewContextType = ViewContextType;
+    exports.ViewRoot = ViewRoot;
+    exports.WeekNumberRoot = WeekNumberRoot;
+    exports.WindowScrollController = WindowScrollController;
+    exports.addDays = addDays;
+    exports.addDurations = addDurations;
+    exports.addMs = addMs;
+    exports.addWeeks = addWeeks;
+    exports.allowContextMenu = allowContextMenu;
+    exports.allowSelection = allowSelection;
+    exports.applyMutationToEventStore = applyMutationToEventStore;
+    exports.applyStyle = applyStyle;
+    exports.applyStyleProp = applyStyleProp;
+    exports.asRoughMinutes = asRoughMinutes;
+    exports.asRoughMs = asRoughMs;
+    exports.asRoughSeconds = asRoughSeconds;
+    exports.buildClassNameNormalizer = buildClassNameNormalizer;
+    exports.buildDayRanges = buildDayRanges;
+    exports.buildDayTableModel = buildDayTableModel;
+    exports.buildEventApis = buildEventApis;
+    exports.buildEventRangeKey = buildEventRangeKey;
+    exports.buildHashFromArray = buildHashFromArray;
+    exports.buildNavLinkData = buildNavLinkData;
+    exports.buildResourceFields = buildResourceFields;
+    exports.buildRowNodes = buildRowNodes;
+    exports.buildSegCompareObj = buildSegCompareObj;
+    exports.buildSegTimeText = buildSegTimeText;
+    exports.buildSlatCols = buildSlatCols;
+    exports.buildSlatMetas = buildSlatMetas;
+    exports.buildTimeColsModel = buildTimeColsModel;
+    exports.buildTimelineDateProfile = buildTimelineDateProfile;
+    exports.collectFromHash = collectFromHash;
+    exports.combineEventUis = combineEventUis;
+    exports.compareByFieldSpec = compareByFieldSpec;
+    exports.compareByFieldSpecs = compareByFieldSpecs;
+    exports.compareNumbers = compareNumbers;
+    exports.compareObjs = compareObjs;
+    exports.computeEdges = computeEdges;
+    exports.computeFallbackHeaderFormat = computeFallbackHeaderFormat;
+    exports.computeHeightAndMargins = computeHeightAndMargins;
+    exports.computeInnerRect = computeInnerRect;
+    exports.computeRect = computeRect;
+    exports.computeSegDraggable = computeSegDraggable;
+    exports.computeSegEndResizable = computeSegEndResizable;
+    exports.computeSegStartResizable = computeSegStartResizable;
+    exports.computeShrinkWidth = computeShrinkWidth;
+    exports.computeSmallestCellWidth = computeSmallestCellWidth;
+    exports.computeVisibleDayRange = computeVisibleDayRange;
+    exports.config = config;
+    exports.constrainPoint = constrainPoint;
+    exports.createContext = createContext$1;
+    exports.createDuration = createDuration;
+    exports.createElement = createElement;
+    exports.createEmptyEventStore = createEmptyEventStore;
+    exports.createEventInstance = createEventInstance;
+    exports.createEventUi = createEventUi;
+    exports.createFormatter = createFormatter;
+    exports.createPlugin = createPlugin;
+    exports.createRef = createRef;
+    exports.diffDates = diffDates;
+    exports.diffDayAndTime = diffDayAndTime;
+    exports.diffDays = diffDays;
+    exports.diffPoints = diffPoints;
+    exports.diffWeeks = diffWeeks;
+    exports.diffWholeDays = diffWholeDays;
+    exports.diffWholeWeeks = diffWholeWeeks;
+    exports.disableCursor = disableCursor;
+    exports.elementClosest = elementClosest;
+    exports.elementMatches = elementMatches;
+    exports.enableCursor = enableCursor;
+    exports.eventTupleToStore = eventTupleToStore;
+    exports.filterEventStoreDefs = filterEventStoreDefs;
+    exports.filterHash = filterHash;
+    exports.findDirectChildren = findDirectChildren;
+    exports.findElements = findElements;
+    exports.flattenResources = flattenResources;
+    exports.flexibleCompare = flexibleCompare;
+    exports.flushToDom = flushToDom$1;
+    exports.formatDate = formatDate;
+    exports.formatDayString = formatDayString;
+    exports.formatIsoTimeString = formatIsoTimeString;
+    exports.formatRange = formatRange;
+    exports.getAllowYScrolling = getAllowYScrolling;
+    exports.getClippingParents = getClippingParents;
+    exports.getDateMeta = getDateMeta;
+    exports.getDayClassNames = getDayClassNames;
+    exports.getDefaultEventEnd = getDefaultEventEnd;
+    exports.getElSeg = getElSeg;
+    exports.getEventClassNames = getEventClassNames;
+    exports.getIsRtlScrollbarOnLeft = getIsRtlScrollbarOnLeft;
+    exports.getPublicId = getPublicId;
+    exports.getRectCenter = getRectCenter;
+    exports.getRelevantEvents = getRelevantEvents;
+    exports.getScrollGridClassNames = getScrollGridClassNames;
+    exports.getScrollbarWidths = getScrollbarWidths;
+    exports.getSectionClassNames = getSectionClassNames;
+    exports.getSectionHasLiquidHeight = getSectionHasLiquidHeight;
+    exports.getSegMeta = getSegMeta;
+    exports.getSlotClassNames = getSlotClassNames;
+    exports.getStickyFooterScrollbar = getStickyFooterScrollbar;
+    exports.getStickyHeaderDates = getStickyHeaderDates;
+    exports.getUnequalProps = getUnequalProps;
+    exports.globalLocales = globalLocales;
+    exports.globalPlugins = globalPlugins;
+    exports.greatestDurationDenominator = greatestDurationDenominator;
+    exports.guid = guid;
+    exports.hasBgRendering = hasBgRendering;
+    exports.hasShrinkWidth = hasShrinkWidth;
+    exports.htmlToElement = htmlToElement;
+    exports.identity = identity;
+    exports.interactionSettingsStore = interactionSettingsStore;
+    exports.interactionSettingsToStore = interactionSettingsToStore;
+    exports.intersectRanges = intersectRanges;
+    exports.intersectRects = intersectRects;
+    exports.isArraysEqual = isArraysEqual;
+    exports.isColPropsEqual = isColPropsEqual;
+    exports.isDateSpansEqual = isDateSpansEqual;
+    exports.isGroupsEqual = isGroupsEqual;
+    exports.isInt = isInt;
+    exports.isInteractionValid = isInteractionValid;
+    exports.isMultiDayRange = isMultiDayRange;
+    exports.isPropsEqual = isPropsEqual;
+    exports.isPropsValid = isPropsValid;
+    exports.isSingleDay = isSingleDay;
+    exports.isValidDate = isValidDate;
+    exports.listenBySelector = listenBySelector;
+    exports.mapHash = mapHash;
+    exports.memoize = memoize;
+    exports.memoizeArraylike = memoizeArraylike;
+    exports.memoizeHashlike = memoizeHashlike;
+    exports.memoizeObjArg = memoizeObjArg;
+    exports.mergeEventStores = mergeEventStores;
+    exports.multiplyDuration = multiplyDuration;
+    exports.padStart = padStart;
+    exports.parseBusinessHours = parseBusinessHours;
+    exports.parseClassNames = parseClassNames;
+    exports.parseDragMeta = parseDragMeta;
+    exports.parseEventDef = parseEventDef;
+    exports.parseFieldSpecs = parseFieldSpecs;
+    exports.parseMarker = parse;
+    exports.pointInsideRect = pointInsideRect;
+    exports.preventContextMenu = preventContextMenu;
+    exports.preventDefault = preventDefault;
+    exports.preventSelection = preventSelection;
+    exports.rangeContainsMarker = rangeContainsMarker;
+    exports.rangeContainsRange = rangeContainsRange;
+    exports.rangesEqual = rangesEqual;
+    exports.rangesIntersect = rangesIntersect;
+    exports.refineEventDef = refineEventDef;
+    exports.refineProps = refineProps;
+    exports.removeElement = removeElement;
+    exports.removeExact = removeExact;
+    exports.render = render;
+    exports.renderChunkContent = renderChunkContent;
+    exports.renderFill = renderFill;
+    exports.renderMicroColGroup = renderMicroColGroup;
+    exports.renderScrollShim = renderScrollShim;
+    exports.requestJson = requestJson;
+    exports.sanitizeShrinkWidth = sanitizeShrinkWidth;
+    exports.setElSeg = setElSeg;
+    exports.setRef = setRef;
+    exports.setScrollFromStartingEdge = setScrollFromStartingEdge;
+    exports.sliceEventStore = sliceEventStore;
+    exports.sliceEvents = sliceEvents;
+    exports.sortEventSegs = sortEventSegs;
+    exports.startOfDay = startOfDay;
+    exports.translateRect = translateRect;
+    exports.triggerDateSelect = triggerDateSelect;
+    exports.unpromisify = unpromisify;
+    exports.version = version;
+    exports.whenTransitionDone = whenTransitionDone;
+    exports.wholeDivideDurations = wholeDivideDurations;
+
+    return exports;
+
+}({}));
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/main.min.css b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/main.min.css
new file mode 100644
index 0000000000000000000000000000000000000000..87c960e4115135ee4801bceee22290a9cf92ff5d
--- /dev/null
+++ b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/main.min.css
@@ -0,0 +1 @@
+.fc-icon,.fc-unselectable{-moz-user-select:none;-ms-user-select:none}.fc .fc-button,.fc-icon{text-transform:none;text-align:center}.fc-not-allowed,.fc-not-allowed .fc-event{cursor:not-allowed}.fc .fc-button:not(:disabled),.fc a[data-navlink],.fc-event.fc-event-draggable,.fc-event[href]{cursor:pointer}.fc-unselectable{-webkit-user-select:none;user-select:none;-webkit-touch-callout:none;-webkit-tap-highlight-color:transparent}.fc{display:flex;flex-direction:column;font-size:1em}.fc .fc-button,.fc-icon{display:inline-block;font-weight:400}.fc,.fc *,.fc :after,.fc :before{box-sizing:border-box}.fc table{border-collapse:collapse;border-spacing:0;font-size:1em}.fc th{text-align:center}.fc td,.fc th{vertical-align:top;padding:0}.fc .fc-button,.fc .fc-button .fc-icon,.fc .fc-button-group,.fc .fc-timegrid-slot-label{vertical-align:middle}.fc a[data-navlink]:hover{text-decoration:underline}.fc-direction-ltr{direction:ltr;text-align:left}.fc-direction-rtl{direction:rtl;text-align:right}.fc-theme-standard td,.fc-theme-standard th{border:1px solid #ddd;border:1px solid var(--fc-border-color,#ddd)}.fc-liquid-hack td,.fc-liquid-hack th{position:relative}@font-face{font-family:fcicons;src:url("data:application/x-font-ttf;charset=utf-8;base64,AAEAAAALAIAAAwAwT1MvMg8SBfAAAAC8AAAAYGNtYXAXVtKNAAABHAAAAFRnYXNwAAAAEAAAAXAAAAAIZ2x5ZgYydxIAAAF4AAAFNGhlYWQUJ7cIAAAGrAAAADZoaGVhB20DzAAABuQAAAAkaG10eCIABhQAAAcIAAAALGxvY2ED4AU6AAAHNAAAABhtYXhwAA8AjAAAB0wAAAAgbmFtZXsr690AAAdsAAABhnBvc3QAAwAAAAAI9AAAACAAAwPAAZAABQAAApkCzAAAAI8CmQLMAAAB6wAzAQkAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADpBgPA/8AAQAPAAEAAAAABAAAAAAAAAAAAAAAgAAAAAAADAAAAAwAAABwAAQADAAAAHAADAAEAAAAcAAQAOAAAAAoACAACAAIAAQAg6Qb//f//AAAAAAAg6QD//f//AAH/4xcEAAMAAQAAAAAAAAAAAAAAAQAB//8ADwABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAABAWIAjQKeAskAEwAAJSc3NjQnJiIHAQYUFwEWMjc2NCcCnuLiDQ0MJAz/AA0NAQAMJAwNDcni4gwjDQwM/wANIwz/AA0NDCMNAAAAAQFiAI0CngLJABMAACUBNjQnASYiBwYUHwEHBhQXFjI3AZ4BAA0N/wAMJAwNDeLiDQ0MJAyNAQAMIw0BAAwMDSMM4uINIwwNDQAAAAIA4gC3Ax4CngATACcAACUnNzY0JyYiDwEGFB8BFjI3NjQnISc3NjQnJiIPAQYUHwEWMjc2NCcB87e3DQ0MIw3VDQ3VDSMMDQ0BK7e3DQ0MJAzVDQ3VDCQMDQ3zuLcMJAwNDdUNIwzWDAwNIwy4twwkDA0N1Q0jDNYMDA0jDAAAAgDiALcDHgKeABMAJwAAJTc2NC8BJiIHBhQfAQcGFBcWMjchNzY0LwEmIgcGFB8BBwYUFxYyNwJJ1Q0N1Q0jDA0Nt7cNDQwjDf7V1Q0N1QwkDA0Nt7cNDQwkDLfWDCMN1Q0NDCQMt7gMIw0MDNYMIw3VDQ0MJAy3uAwjDQwMAAADAFUAAAOrA1UAMwBoAHcAABMiBgcOAQcOAQcOARURFBYXHgEXHgEXHgEzITI2Nz4BNz4BNz4BNRE0JicuAScuAScuASMFITIWFx4BFx4BFx4BFREUBgcOAQcOAQcOASMhIiYnLgEnLgEnLgE1ETQ2Nz4BNz4BNz4BMxMhMjY1NCYjISIGFRQWM9UNGAwLFQkJDgUFBQUFBQ4JCRULDBgNAlYNGAwLFQkJDgUFBQUFBQ4JCRULDBgN/aoCVgQIBAQHAwMFAQIBAQIBBQMDBwQECAT9qgQIBAQHAwMFAQIBAQIBBQMDBwQECASAAVYRGRkR/qoRGRkRA1UFBAUOCQkVDAsZDf2rDRkLDBUJCA4FBQUFBQUOCQgVDAsZDQJVDRkLDBUJCQ4FBAVVAgECBQMCBwQECAX9qwQJAwQHAwMFAQICAgIBBQMDBwQDCQQCVQUIBAQHAgMFAgEC/oAZEhEZGRESGQAAAAADAFUAAAOrA1UAMwBoAIkAABMiBgcOAQcOAQcOARURFBYXHgEXHgEXHgEzITI2Nz4BNz4BNz4BNRE0JicuAScuAScuASMFITIWFx4BFx4BFx4BFREUBgcOAQcOAQcOASMhIiYnLgEnLgEnLgE1ETQ2Nz4BNz4BNz4BMxMzFRQWMzI2PQEzMjY1NCYrATU0JiMiBh0BIyIGFRQWM9UNGAwLFQkJDgUFBQUFBQ4JCRULDBgNAlYNGAwLFQkJDgUFBQUFBQ4JCRULDBgN/aoCVgQIBAQHAwMFAQIBAQIBBQMDBwQECAT9qgQIBAQHAwMFAQIBAQIBBQMDBwQECASAgBkSEhmAERkZEYAZEhIZgBEZGREDVQUEBQ4JCRUMCxkN/asNGQsMFQkIDgUFBQUFBQ4JCBUMCxkNAlUNGQsMFQkJDgUEBVUCAQIFAwIHBAQIBf2rBAkDBAcDAwUBAgICAgEFAwMHBAMJBAJVBQgEBAcCAwUCAQL+gIASGRkSgBkSERmAEhkZEoAZERIZAAABAOIAjQMeAskAIAAAExcHBhQXFjI/ARcWMjc2NC8BNzY0JyYiDwEnJiIHBhQX4uLiDQ0MJAzi4gwkDA0N4uINDQwkDOLiDCQMDQ0CjeLiDSMMDQ3h4Q0NDCMN4uIMIw0MDOLiDAwNIwwAAAABAAAAAQAAa5n0y18PPPUACwQAAAAAANivOVsAAAAA2K85WwAAAAADqwNVAAAACAACAAAAAAAAAAEAAAPA/8AAAAQAAAAAAAOrAAEAAAAAAAAAAAAAAAAAAAALBAAAAAAAAAAAAAAAAgAAAAQAAWIEAAFiBAAA4gQAAOIEAABVBAAAVQQAAOIAAAAAAAoAFAAeAEQAagCqAOoBngJkApoAAQAAAAsAigADAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAA4ArgABAAAAAAABAAcAAAABAAAAAAACAAcAYAABAAAAAAADAAcANgABAAAAAAAEAAcAdQABAAAAAAAFAAsAFQABAAAAAAAGAAcASwABAAAAAAAKABoAigADAAEECQABAA4ABwADAAEECQACAA4AZwADAAEECQADAA4APQADAAEECQAEAA4AfAADAAEECQAFABYAIAADAAEECQAGAA4AUgADAAEECQAKADQApGZjaWNvbnMAZgBjAGkAYwBvAG4Ac1ZlcnNpb24gMS4wAFYAZQByAHMAaQBvAG4AIAAxAC4AMGZjaWNvbnMAZgBjAGkAYwBvAG4Ac2ZjaWNvbnMAZgBjAGkAYwBvAG4Ac1JlZ3VsYXIAUgBlAGcAdQBsAGEAcmZjaWNvbnMAZgBjAGkAYwBvAG4Ac0ZvbnQgZ2VuZXJhdGVkIGJ5IEljb01vb24uAEYAbwBuAHQAIABnAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAEkAYwBvAE0AbwBvAG4ALgAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=") format('truetype');font-weight:400;font-style:normal}.fc-icon{width:1em;height:1em;-webkit-user-select:none;user-select:none;font-family:fcicons!important;speak:none;font-style:normal;font-variant:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fc-icon-chevron-left:before{content:"\e900"}.fc-icon-chevron-right:before{content:"\e901"}.fc-icon-chevrons-left:before{content:"\e902"}.fc-icon-chevrons-right:before{content:"\e903"}.fc-icon-minus-square:before{content:"\e904"}.fc-icon-plus-square:before{content:"\e905"}.fc-icon-x:before{content:"\e906"}.fc .fc-button{overflow:visible;text-transform:none;margin:0;font-family:inherit}.fc .fc-button::-moz-focus-inner{padding:0;border-style:none}.fc .fc-button{-webkit-appearance:button;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:.4em .65em;font-size:1em;line-height:1.5;border-radius:.25em}.fc .fc-button:hover{text-decoration:none}.fc .fc-button:focus{outline:0;box-shadow:0 0 0 .2rem rgba(44,62,80,.25)}.fc .fc-button-primary:focus,.fc .fc-button-primary:not(:disabled).fc-button-active:focus,.fc .fc-button-primary:not(:disabled):active:focus{box-shadow:0 0 0 .2rem rgba(76,91,106,.5)}.fc .fc-button:disabled{opacity:.65}.fc .fc-button-primary{color:#fff;color:var(--fc-button-text-color,#fff);background-color:#2C3E50;background-color:var(--fc-button-bg-color,#2C3E50);border-color:#2C3E50;border-color:var(--fc-button-border-color,#2C3E50)}.fc .fc-button-primary:hover{color:#fff;color:var(--fc-button-text-color,#fff);background-color:#1e2b37;background-color:var(--fc-button-hover-bg-color,#1e2b37);border-color:#1a252f;border-color:var(--fc-button-hover-border-color,#1a252f)}.fc .fc-button-primary:disabled{color:#fff;color:var(--fc-button-text-color,#fff);background-color:#2C3E50;background-color:var(--fc-button-bg-color,#2C3E50);border-color:#2C3E50;border-color:var(--fc-button-border-color,#2C3E50)}.fc .fc-button-primary:not(:disabled).fc-button-active,.fc .fc-button-primary:not(:disabled):active{color:#fff;color:var(--fc-button-text-color,#fff);background-color:#1a252f;background-color:var(--fc-button-active-bg-color,#1a252f);border-color:#151e27;border-color:var(--fc-button-active-border-color,#151e27)}.fc .fc-button .fc-icon{font-size:1.5em}.fc .fc-button-group{position:relative;display:inline-flex}.fc .fc-button-group>.fc-button{position:relative;flex:1 1 auto}.fc .fc-button-group>.fc-button.fc-button-active,.fc .fc-button-group>.fc-button:active,.fc .fc-button-group>.fc-button:focus,.fc .fc-button-group>.fc-button:hover{z-index:1}.fc-direction-ltr .fc-button-group>.fc-button:not(:first-child){margin-left:-1px;border-top-left-radius:0;border-bottom-left-radius:0}.fc-direction-ltr .fc-button-group>.fc-button:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.fc-direction-rtl .fc-button-group>.fc-button:not(:first-child){margin-right:-1px;border-top-right-radius:0;border-bottom-right-radius:0}.fc-direction-rtl .fc-button-group>.fc-button:not(:last-child){border-top-left-radius:0;border-bottom-left-radius:0}.fc .fc-toolbar{display:flex;justify-content:space-between;align-items:center}.fc .fc-toolbar.fc-header-toolbar{margin-bottom:1.5em}.fc .fc-toolbar.fc-footer-toolbar{margin-top:1.5em}.fc .fc-toolbar-title{font-size:1.75em;margin:0}.fc-direction-ltr .fc-toolbar>*>:not(:first-child){margin-left:.75em}.fc-direction-rtl .fc-toolbar>*>:not(:first-child){margin-right:.75em}.fc-direction-rtl .fc-toolbar-ltr{flex-direction:row-reverse}.fc .fc-scroller{-webkit-overflow-scrolling:touch;position:relative}.fc .fc-scroller-liquid{height:100%}.fc .fc-scroller-liquid-absolute{position:absolute;top:0;right:0;left:0;bottom:0}.fc .fc-scroller-harness{position:relative;overflow:hidden;direction:ltr}.fc .fc-scroller-harness-liquid{height:100%}.fc-direction-rtl .fc-scroller-harness>.fc-scroller{direction:rtl}.fc-theme-standard .fc-scrollgrid{border:1px solid #ddd;border:1px solid var(--fc-border-color,#ddd)}.fc .fc-scrollgrid,.fc .fc-scrollgrid>tfoot>tr>*,.fc .fc-scrollgrid>thead>tr>*{border-bottom-width:0}.fc .fc-scrollgrid,.fc .fc-scrollgrid table{width:100%;table-layout:fixed}.fc .fc-scrollgrid table{border-top-style:hidden;border-left-style:hidden;border-right-style:hidden}.fc .fc-scrollgrid>tbody table,.fc .fc-scrollgrid>tfoot table{border-bottom-style:hidden}.fc .fc-scrollgrid{border-collapse:separate;border-right-width:0}.fc .fc-scrollgrid>*>tr>*{border-top-width:0;border-left-width:0}.fc .fc-scrollgrid-liquid{height:100%}.fc .fc-scrollgrid-section,.fc .fc-scrollgrid-section>td{height:0}.fc .fc-scrollgrid-section table{height:1px}.fc .fc-scrollgrid-section-liquid{height:auto}.fc .fc-scrollgrid-section-liquid>td{height:100%}.fc .fc-scrollgrid-section-sticky>*{background:var(--fc-page-bg-color,#fff);position:-webkit-sticky;position:sticky;z-index:2}.fc .fc-scrollgrid>thead>.fc-scrollgrid-section-sticky>*{top:0}.fc .fc-scrollgrid>tfoot>.fc-scrollgrid-section-sticky>*{bottom:0}.fc .fc-scrollgrid-sticky-shim{height:1px;margin-bottom:-1px}.fc .fc-sticky{position:-webkit-sticky;position:sticky}.fc .fc-view-harness{flex-grow:1;position:relative}.fc .fc-bg-event,.fc .fc-highlight,.fc .fc-non-business,.fc .fc-view-harness-active>.fc-view{position:absolute;left:0;bottom:0;top:0;right:0}.fc .fc-col-header-cell-cushion{display:inline-block;padding:2px 4px}.fc .fc-non-business{background:rgba(215,215,215,.3);background:var(--fc-non-business-color,rgba(215,215,215,.3))}.fc .fc-bg-event{background:var(--fc-bg-event-color,#8fdf82);opacity:.3;opacity:var(--fc-bg-event-opacity,.3)}.fc .fc-bg-event .fc-event-title{margin:.5em;font-size:.85em;font-size:var(--fc-small-font-size,.85em);font-style:italic}.fc .fc-highlight{background:rgba(188,232,241,.3);background:var(--fc-highlight-color,rgba(188,232,241,.3))}.fc .fc-cell-shaded,.fc .fc-day-disabled{background:rgba(208,208,208,.3);background:var(--fc-neutral-bg-color,rgba(208,208,208,.3))}a.fc-event,a.fc-event:hover{text-decoration:none}.fc-event .fc-event-main{position:relative;z-index:2}.fc-event-dragging:not(.fc-event-selected){opacity:.75}.fc-event-dragging.fc-event-selected{box-shadow:0 2px 7px rgba(0,0,0,.3)}.fc-event .fc-event-resizer{display:none;position:absolute;z-index:4}.fc-event-selected .fc-event-resizer,.fc-event:hover .fc-event-resizer,.fc-h-event{display:block}.fc-event-selected .fc-event-resizer{border-radius:4px;border-radius:calc(var(--fc-event-resizer-dot-total-width,8px)/ 2);border-width:1px;border-width:var(--fc-event-resizer-dot-border-width,1px);width:8px;width:var(--fc-event-resizer-dot-total-width,8px);height:8px;height:var(--fc-event-resizer-dot-total-width,8px);border-style:solid;border-color:inherit;background:var(--fc-page-bg-color,#fff)}.fc-event-selected .fc-event-resizer:before{content:'';position:absolute;top:-20px;left:-20px;right:-20px;bottom:-20px}.fc-event-selected{box-shadow:0 2px 5px rgba(0,0,0,.2)}.fc-event-selected:before{content:"";position:absolute;z-index:3;top:0;left:0;right:0;bottom:0}.fc-event-selected:after{content:"";background:rgba(0,0,0,.25);background:var(--fc-event-selected-overlay-color,rgba(0,0,0,.25));position:absolute;z-index:1;top:-1px;left:-1px;right:-1px;bottom:-1px}.fc-h-event{border:1px solid #3788d8;border:1px solid var(--fc-event-bg-color,#3788d8);background-color:#3788d8;background-color:var(--fc-event-border-color,#3788d8)}.fc-h-event .fc-event-main{color:#fff;color:var(--fc-event-text-color,#fff)}.fc-h-event .fc-event-main-frame{display:flex}.fc-h-event .fc-event-time{max-width:100%;overflow:hidden}.fc-h-event .fc-event-title-container{flex-grow:1;flex-shrink:1;min-width:0}.fc-h-event .fc-event-title{display:inline-block;vertical-align:top;left:0;right:0;max-width:100%;overflow:hidden}.fc-h-event.fc-event-selected:before{top:-10px;bottom:-10px}.fc-direction-ltr .fc-daygrid-block-event:not(.fc-event-start),.fc-direction-rtl .fc-daygrid-block-event:not(.fc-event-end){border-top-left-radius:0;border-bottom-left-radius:0;border-left-width:0}.fc-direction-ltr .fc-daygrid-block-event:not(.fc-event-end),.fc-direction-rtl .fc-daygrid-block-event:not(.fc-event-start){border-top-right-radius:0;border-bottom-right-radius:0;border-right-width:0}.fc-h-event:not(.fc-event-selected) .fc-event-resizer{top:0;bottom:0;width:8px;width:var(--fc-event-resizer-thickness,8px)}.fc-direction-ltr .fc-h-event:not(.fc-event-selected) .fc-event-resizer-start,.fc-direction-rtl .fc-h-event:not(.fc-event-selected) .fc-event-resizer-end{cursor:w-resize;left:-4px;left:calc(var(--fc-event-resizer-thickness,8px)/ -2)}.fc-direction-ltr .fc-h-event:not(.fc-event-selected) .fc-event-resizer-end,.fc-direction-rtl .fc-h-event:not(.fc-event-selected) .fc-event-resizer-start{cursor:e-resize;right:-4px;right:calc(var(--fc-event-resizer-thickness,8px)/ -2)}.fc-h-event.fc-event-selected .fc-event-resizer{top:50%;margin-top:-4px;margin-top:calc(var(--fc-event-resizer-dot-total-width,8px)/ -2)}.fc-direction-ltr .fc-h-event.fc-event-selected .fc-event-resizer-start,.fc-direction-rtl .fc-h-event.fc-event-selected .fc-event-resizer-end{left:-4px;left:calc(var(--fc-event-resizer-dot-total-width,8px)/ -2)}.fc-direction-ltr .fc-h-event.fc-event-selected .fc-event-resizer-end,.fc-direction-rtl .fc-h-event.fc-event-selected .fc-event-resizer-start{right:-4px;right:calc(var(--fc-event-resizer-dot-total-width,8px)/ -2)}:root{--fc-daygrid-event-dot-width:8px;--fc-list-event-dot-width:10px;--fc-list-event-hover-bg-color:#f5f5f5}.fc .fc-popover{position:fixed;top:0;box-shadow:0 2px 6px rgba(0,0,0,.15)}.fc .fc-popover-header{display:flex;flex-direction:row;justify-content:space-between;align-items:center;padding:3px 4px}.fc .fc-popover-title{margin:0 2px}.fc .fc-popover-close{cursor:pointer;opacity:.65;font-size:1.1em}.fc-theme-standard .fc-popover{border:1px solid #ddd;border:1px solid var(--fc-border-color,#ddd);background:var(--fc-page-bg-color,#fff)}.fc-theme-standard .fc-popover-header{background:rgba(208,208,208,.3);background:var(--fc-neutral-bg-color,rgba(208,208,208,.3))}.fc-daygrid-day-events:after,.fc-daygrid-day-events:before,.fc-daygrid-day-frame:after,.fc-daygrid-day-frame:before,.fc-daygrid-event-harness:after,.fc-daygrid-event-harness:before{content:"";clear:both;display:table}.fc .fc-daygrid-body{position:relative;z-index:1}.fc .fc-daygrid-day.fc-day-today{background-color:rgba(255,220,40,.15);background-color:var(--fc-today-bg-color,rgba(255,220,40,.15))}.fc .fc-daygrid-day-frame{position:relative;min-height:100%}.fc .fc-daygrid-day-top{position:relative;z-index:4;display:flex;flex-direction:row-reverse}.fc .fc-day-other .fc-daygrid-day-top{opacity:.3}.fc .fc-daygrid-day-number{padding:4px}.fc .fc-daygrid-day-events{margin-top:1px}.fc .fc-daygrid-body-balanced .fc-daygrid-day-events{position:absolute;left:0;right:0}.fc .fc-daygrid-body-unbalanced .fc-daygrid-day-events{position:relative;min-height:2em}.fc .fc-daygrid-body-natural .fc-daygrid-day-events{margin-bottom:1em}.fc .fc-daygrid-event-harness{position:relative}.fc .fc-daygrid-event-harness-abs{position:absolute;top:0;left:0;right:0}.fc .fc-daygrid-bg-harness{position:absolute;top:0;bottom:0}.fc .fc-daygrid-day-bg .fc-non-business{z-index:1}.fc .fc-daygrid-day-bg .fc-bg-event{z-index:2}.fc .fc-daygrid-day-bg .fc-highlight{z-index:3}.fc .fc-daygrid-event{z-index:6;margin-top:1px}.fc .fc-daygrid-event.fc-event-mirror{z-index:7}.fc .fc-daygrid-day-bottom{position:relative;z-index:4;font-size:.85em;margin:2px 3px 0}.fc .fc-daygrid-more-link{cursor:pointer}.fc .fc-daygrid-week-number{position:absolute;z-index:5;top:0;padding:2px;min-width:1.5em;text-align:center;background-color:rgba(208,208,208,.3);background-color:var(--fc-neutral-bg-color,rgba(208,208,208,.3));color:grey;color:var(--fc-neutral-text-color,grey)}.fc .fc-more-popover{z-index:8}.fc .fc-more-popover .fc-popover-body{min-width:220px;padding:10px}.fc-direction-ltr .fc-daygrid-event.fc-event-start,.fc-direction-rtl .fc-daygrid-event.fc-event-end{margin-left:2px}.fc-direction-ltr .fc-daygrid-event.fc-event-end,.fc-direction-rtl .fc-daygrid-event.fc-event-start{margin-right:2px}.fc-direction-ltr .fc-daygrid-week-number{left:0;border-radius:0 0 3px}.fc-direction-rtl .fc-daygrid-week-number{right:0;border-radius:0 0 0 3px}.fc-liquid-hack .fc-daygrid-day-frame{position:static}.fc-daygrid-event{position:relative;white-space:nowrap;border-radius:3px;font-size:.85em;font-size:var(--fc-small-font-size,.85em)}.fc-daygrid-block-event .fc-event-time{font-weight:700}.fc-daygrid-block-event .fc-event-time,.fc-daygrid-block-event .fc-event-title{padding:1px}.fc-daygrid-dot-event{display:block;padding:2px 0;overflow:hidden}.fc-daygrid-dot-event .fc-event-title{font-weight:700}.fc-daygrid-dot-event .fc-event-time,.fc-daygrid-dot-event .fc-event-title{display:inline-block}.fc-daygrid-dot-event.fc-event-mirror,.fc-daygrid-dot-event:hover{background:rgba(0,0,0,.1)}.fc-daygrid-event-dot{display:inline-block;margin:0 4px;box-sizing:content-box;width:0;height:0;border:4px solid #3788d8;border:calc(var(--fc-daygrid-event-dot-width,8px)/ 2) solid var(--fc-event-border-color,#3788d8);border-radius:4px;border-radius:calc(var(--fc-daygrid-event-dot-width,8px)/ 2)}.fc-direction-ltr .fc-daygrid-event .fc-event-time{margin-right:3px}.fc-direction-rtl .fc-daygrid-event .fc-event-time{margin-left:3px}.fc-v-event{display:block;border:1px solid #3788d8;border:1px solid var(--fc-event-border-color,#3788d8);background-color:#3788d8;background-color:var(--fc-event-bg-color,#3788d8)}.fc-v-event .fc-event-main{color:#fff;color:var(--fc-event-text-color,#fff);height:100%}.fc-v-event .fc-event-main-frame{height:100%;display:flex;flex-direction:column}.fc-v-event .fc-event-time{flex-grow:0;flex-shrink:0;max-height:100%;overflow:hidden}.fc-v-event .fc-event-title-container{flex-grow:1;flex-shrink:1;min-height:0}.fc-v-event .fc-event-title{top:0;bottom:0;max-height:100%;overflow:hidden}.fc-v-event:not(.fc-event-start){border-top-width:0;border-top-left-radius:0;border-top-right-radius:0}.fc-v-event:not(.fc-event-end){border-bottom-width:0;border-bottom-left-radius:0;border-bottom-right-radius:0}.fc-v-event.fc-event-selected:before{left:-10px;right:-10px}.fc-v-event .fc-event-resizer-start{cursor:n-resize}.fc-v-event .fc-event-resizer-end{cursor:s-resize}.fc-v-event:not(.fc-event-selected) .fc-event-resizer{height:8px;height:var(--fc-event-resizer-thickness,8px);left:0;right:0}.fc-v-event:not(.fc-event-selected) .fc-event-resizer-start{top:-4px;top:calc(var(--fc-event-resizer-thickness,8px)/ -2)}.fc-v-event:not(.fc-event-selected) .fc-event-resizer-end{bottom:-4px;bottom:calc(var(--fc-event-resizer-thickness,8px)/ -2)}.fc-v-event.fc-event-selected .fc-event-resizer{left:50%;margin-left:-4px;margin-left:calc(var(--fc-event-resizer-dot-total-width,8px)/ -2)}.fc-v-event.fc-event-selected .fc-event-resizer-start{top:-4px;top:calc(var(--fc-event-resizer-dot-total-width,8px)/ -2)}.fc-v-event.fc-event-selected .fc-event-resizer-end{bottom:-4px;bottom:calc(var(--fc-event-resizer-dot-total-width,8px)/ -2)}.fc .fc-timegrid .fc-daygrid-body{z-index:2}.fc .fc-timegrid-axis-chunk>table,.fc .fc-timegrid-body{z-index:1;position:relative}.fc .fc-timegrid-divider{padding:0 0 2px}.fc .fc-timegrid-body{min-height:100%}.fc .fc-timegrid-axis-chunk{position:relative}.fc .fc-timegrid-slots{position:relative;z-index:2}.fc .fc-timegrid-slot{height:1.5em;border-bottom:0}.fc .fc-timegrid-slot-minor{border-top-style:dotted}.fc .fc-timegrid-slot-label-cushion{display:inline-block;white-space:nowrap}.fc .fc-timegrid-axis-cushion,.fc .fc-timegrid-slot-label-cushion{padding:0 4px}.fc .fc-timegrid-axis-frame-liquid{height:100%}.fc .fc-timegrid-axis-frame{overflow:hidden;display:flex;align-items:center;justify-content:flex-end}.fc .fc-timegrid-axis-cushion{max-width:60px;flex-shrink:0}.fc-direction-ltr .fc-timegrid-slot-label-frame{text-align:right}.fc-direction-rtl .fc-timegrid-slot-label-frame{text-align:left}.fc-liquid-hack .fc-timegrid-axis-frame-liquid{height:auto;position:absolute;top:0;right:0;bottom:0;left:0}.fc .fc-timegrid-col.fc-day-today{background-color:rgba(255,220,40,.15);background-color:var(--fc-today-bg-color,rgba(255,220,40,.15))}.fc .fc-timegrid-col-frame{min-height:100%;position:relative}.fc-liquid-hack .fc-timegrid-col-frame{height:auto;position:absolute;top:0;right:0;bottom:0;left:0}.fc-media-screen .fc-timegrid-cols{position:absolute;top:0;left:0;right:0;bottom:0}.fc-media-screen .fc-timegrid-cols>table{height:100%}.fc-media-screen .fc-timegrid-col-bg,.fc-media-screen .fc-timegrid-col-events,.fc-media-screen .fc-timegrid-now-indicator-container{position:absolute;top:0;left:0;right:0}.fc-media-screen .fc-timegrid-event-harness{position:absolute}.fc .fc-timegrid-col-bg,.fc .fc-timegrid-col-bg .fc-non-business{z-index:1}.fc .fc-timegrid-col-bg .fc-bg-event{z-index:2}.fc .fc-timegrid-col-bg .fc-highlight,.fc .fc-timegrid-col-events{z-index:3}.fc .fc-timegrid-bg-harness{position:absolute;left:0;right:0}.fc .fc-timegrid-now-indicator-container{bottom:0;overflow:hidden}.fc-direction-ltr .fc-timegrid-col-events{margin:0 2.5% 0 2px}.fc-direction-rtl .fc-timegrid-col-events{margin:0 2px 0 2.5%}.fc-timegrid-event-harness-inset .fc-timegrid-event,.fc-timegrid-event.fc-event-mirror{box-shadow:0 0 0 1px #fff;box-shadow:0 0 0 1px var(--fc-page-bg-color,#fff)}.fc-timegrid-event{font-size:.85em;font-size:var(--fc-small-font-size,.85em);border-radius:3px}.fc-timegrid-event .fc-event-main{padding:1px 1px 0}.fc-timegrid-event .fc-event-time{white-space:nowrap;font-size:.85em;font-size:var(--fc-small-font-size,.85em);margin-bottom:1px}.fc-timegrid-event-condensed .fc-event-main-frame{flex-direction:row;overflow:hidden}.fc-timegrid-event-condensed .fc-event-time:after{content:'\00a0-\00a0'}.fc-timegrid-event-condensed .fc-event-title{font-size:.85em;font-size:var(--fc-small-font-size,.85em)}.fc-media-screen .fc-timegrid-event{position:absolute;top:0;bottom:1px;left:0;right:0}.fc .fc-timegrid-now-indicator-line{position:absolute;z-index:4;left:0;right:0;border-style:solid;border-color:red;border-color:var(--fc-now-indicator-color,red);border-width:1px 0 0}.fc .fc-timegrid-now-indicator-arrow{position:absolute;z-index:4;margin-top:-5px;border-style:solid;border-color:red;border-color:var(--fc-now-indicator-color,red)}.fc-direction-ltr .fc-timegrid-now-indicator-arrow{left:0;border-width:5px 0 5px 6px;border-top-color:transparent;border-bottom-color:transparent}.fc-direction-rtl .fc-timegrid-now-indicator-arrow{right:0;border-width:5px 6px 5px 0;border-top-color:transparent;border-bottom-color:transparent}.fc-theme-standard .fc-list{border:1px solid #ddd;border:1px solid var(--fc-border-color,#ddd)}.fc .fc-list-empty{background-color:rgba(208,208,208,.3);background-color:var(--fc-neutral-bg-color,rgba(208,208,208,.3));height:100%;display:flex;justify-content:center;align-items:center}.fc .fc-list-empty-cushion{margin:5em 0}.fc .fc-list-table{width:100%;border-style:hidden}.fc .fc-list-table tr>*{border-left:0;border-right:0}.fc .fc-list-sticky .fc-list-day>*{position:-webkit-sticky;position:sticky;top:0;background:var(--fc-page-bg-color,#fff)}.fc .fc-list-table th{padding:0}.fc .fc-list-day-cushion,.fc .fc-list-table td{padding:8px 14px}.fc .fc-list-day-cushion:after{content:"";clear:both;display:table}.fc-theme-standard .fc-list-day-cushion{background-color:rgba(208,208,208,.3);background-color:var(--fc-neutral-bg-color,rgba(208,208,208,.3))}.fc-direction-ltr .fc-list-day-text,.fc-direction-rtl .fc-list-day-side-text{float:left}.fc-direction-ltr .fc-list-day-side-text,.fc-direction-rtl .fc-list-day-text{float:right}.fc-direction-ltr .fc-list-table .fc-list-event-graphic{padding-right:0}.fc-direction-rtl .fc-list-table .fc-list-event-graphic{padding-left:0}.fc .fc-list-event.fc-event-forced-url{cursor:pointer}.fc .fc-list-event:hover td{background-color:#f5f5f5;background-color:var(--fc-list-event-hover-bg-color,#f5f5f5)}.fc .fc-list-event-graphic,.fc .fc-list-event-time{white-space:nowrap;width:1px}.fc .fc-list-event-dot{display:inline-block;box-sizing:content-box;width:0;height:0;border:5px solid #3788d8;border:calc(var(--fc-list-event-dot-width,10px)/ 2) solid var(--fc-event-border-color,#3788d8);border-radius:5px;border-radius:calc(var(--fc-list-event-dot-width,10px)/ 2)}.fc .fc-list-event-title a{color:inherit;text-decoration:none}.fc .fc-list-event.fc-event-forced-url:hover a{text-decoration:underline}.fc-theme-bootstrap a:not([href]){color:inherit}.fc .fc-event,.fc .fc-scrollgrid table tr{-moz-column-break-inside:avoid;break-inside:avoid}.fc-media-print{display:block;max-width:100%}.fc-media-print .fc-bg-event,.fc-media-print .fc-non-business,.fc-media-print .fc-timegrid-axis-chunk,.fc-media-print .fc-timegrid-slots,.fc-media-print .fc-timeline-slots{display:none}.fc-media-print .fc-h-event,.fc-media-print .fc-toolbar button,.fc-media-print .fc-v-event{color:#000!important;background:#fff!important}.fc-media-print .fc-event,.fc-media-print .fc-event-main{color:#000!important}.fc-media-print .fc-timegrid-event{margin:.5em 0}.fc .fc-timeline-body{min-height:100%;position:relative;z-index:1}.fc .fc-timeline-slots{position:absolute;z-index:1;top:0;bottom:0}.fc .fc-timeline-slots>table{height:100%}.fc .fc-timeline-slot-minor{border-style:dotted}.fc .fc-timeline-slot-frame{display:flex;align-items:center;justify-content:center}.fc .fc-timeline-header-row-chrono .fc-timeline-slot-frame{justify-content:flex-start}.fc .fc-timeline-slot-cushion{padding:4px 5px;white-space:nowrap}.fc-direction-ltr .fc-timeline-slot{border-right:0!important}.fc-direction-rtl .fc-timeline-slot{border-left:0!important}.fc .fc-timeline-now-indicator-arrow,.fc .fc-timeline-now-indicator-line{position:absolute;z-index:4;top:0;border-style:solid;border-color:red;border-color:var(--fc-now-indicator-color,red)}.fc .fc-timeline-now-indicator-arrow{margin:0 -6px;border-width:6px 5px 0;border-left-color:transparent;border-right-color:transparent}.fc .fc-timeline-now-indicator-line{margin:0 -1px;bottom:0;border-width:0 0 0 1px}.fc .fc-timeline-events{position:relative;z-index:3;width:0}.fc .fc-timeline-event-harness{position:absolute;top:0}.fc-timeline-event{z-index:1;position:relative;display:flex;align-items:center;border-radius:0;padding:2px 1px;margin-bottom:1px;font-size:.85em;font-size:var(--fc-small-font-size,.85em)}.fc .fc-timeline-bg,.fc .fc-timeline-bg-harness{position:absolute;top:0;bottom:0}.fc-timeline-event.fc-event-mirror{z-index:2}.fc-timeline-event .fc-event-main{flex-grow:1;flex-shrink:1;min-width:0}.fc-timeline-event .fc-event-time{font-weight:700}.fc-timeline-event .fc-event-time,.fc-timeline-event .fc-event-title{white-space:nowrap;padding:0 2px}.fc-direction-ltr .fc-timeline-event.fc-event-end{margin-right:1px}.fc-direction-rtl .fc-timeline-event.fc-event-end{margin-left:1px}.fc-timeline-overlap-disabled .fc-timeline-event{padding-top:5px;padding-bottom:5px;margin-bottom:0}.fc-timeline-event:not(.fc-event-end):after,.fc-timeline-event:not(.fc-event-start):before{content:"";flex-grow:0;flex-shrink:0;opacity:.5;width:0;height:0;margin:0 1px;border:5px solid #000;border-top-color:transparent;border-bottom-color:transparent}.fc-direction-ltr .fc-timeline-event:not(.fc-event-start):before,.fc-direction-rtl .fc-timeline-event:not(.fc-event-end):after{border-left:0}.fc-direction-ltr .fc-timeline-event:not(.fc-event-end):after,.fc-direction-rtl .fc-timeline-event:not(.fc-event-start):before{border-right:0}.fc .fc-timeline-bg{z-index:2;width:0;left:0;right:0}.fc .fc-timeline-bg .fc-non-business{z-index:1}.fc .fc-timeline-bg .fc-bg-event{z-index:2}.fc .fc-timeline-bg .fc-highlight{z-index:3}.fc .fc-resource-timeline-divider{width:3px;cursor:col-resize}.fc .fc-resource-timeline .fc-resource-group:not([rowspan]){background:rgba(208,208,208,.3);background:var(--fc-neutral-bg-color,rgba(208,208,208,.3))}.fc .fc-timeline-lane-frame{position:relative}.fc .fc-timeline-overlap-enabled .fc-timeline-lane-frame .fc-timeline-events{box-sizing:content-box;padding-bottom:10px}.fc-datagrid-cell-frame-liquid{height:100%}.fc-liquid-hack .fc-datagrid-cell-frame-liquid{height:auto;position:absolute;top:0;right:0;bottom:0;left:0}.fc .fc-datagrid-header .fc-datagrid-cell-frame{position:relative;display:flex;justify-content:flex-start;align-items:center}.fc .fc-datagrid-cell-resizer{position:absolute;z-index:1;top:0;bottom:0;width:5px;cursor:col-resize}.fc .fc-datagrid-cell-cushion{padding:8px;white-space:nowrap;overflow:hidden}.fc .fc-datagrid-expander{cursor:pointer;opacity:.65}.fc .fc-datagrid-expander .fc-icon{display:inline-block;width:1em}.fc .fc-datagrid-expander-placeholder{cursor:auto}.fc .fc-resource-timeline-flat .fc-datagrid-expander-placeholder{display:none}.fc-direction-ltr .fc-datagrid-cell-resizer{right:-3px}.fc-direction-rtl .fc-datagrid-cell-resizer{left:-3px}.fc-direction-ltr .fc-datagrid-expander{margin-right:3px}.fc-direction-rtl .fc-datagrid-expander{margin-left:3px}
\ No newline at end of file
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/main.min.js b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/main.min.js
new file mode 100644
index 0000000000000000000000000000000000000000..408ec46633f1984ca694723826f951a7df6d4b30
--- /dev/null
+++ b/AKPlan/static/AKPlan/vendor/fullcalendar-scheduler/main.min.js
@@ -0,0 +1,6 @@
+/*!
+FullCalendar Scheduler v5.1.0
+Docs & License: https://fullcalendar.io/scheduler
+(c) 2020 Adam Shaw
+*/
+var FullCalendar=function(e){"use strict";var t=function(e,n){return(t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])})(e,n)};function n(e,n){function r(){this.constructor=e}t(e,n),e.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}var r=function(){return(r=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var o in t=arguments[n])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e}).apply(this,arguments)};function o(){for(var e=0,t=0,n=arguments.length;t<n;t++)e+=arguments[t].length;var r=Array(e),o=0;for(t=0;t<n;t++)for(var i=arguments[t],a=0,s=i.length;a<s;a++,o++)r[o]=i[a];return r}var i,a,s,l,u,c,d,p={},f=[],h=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord/i;function g(e,t){for(var n in t)e[n]=t[n];return e}function v(e){var t=e.parentNode;t&&t.removeChild(e)}function m(e,t,n){var r,o=arguments,i={};for(r in t)"key"!==r&&"ref"!==r&&(i[r]=t[r]);if(arguments.length>3)for(n=[n],r=3;r<arguments.length;r++)n.push(o[r]);if(null!=n&&(i.children=n),"function"==typeof e&&null!=e.defaultProps)for(r in e.defaultProps)void 0===i[r]&&(i[r]=e.defaultProps[r]);return y(e,i,t&&t.key,t&&t.ref,null)}function y(e,t,n,r,o){var a={type:e,props:t,key:n,ref:r,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,constructor:void 0,__v:o};return null==o&&(a.__v=a),i.vnode&&i.vnode(a),a}function S(e){return e.children}function E(e,t){this.props=e,this.context=t}function C(e,t){if(null==t)return e.__?C(e.__,e.__.__k.indexOf(e)+1):null;for(var n;t<e.__k.length;t++)if(null!=(n=e.__k[t])&&null!=n.__e)return n.__e;return"function"==typeof e.type?C(e):null}function b(e){var t,n;if(null!=(e=e.__)&&null!=e.__c){for(e.__e=e.__c.base=null,t=0;t<e.__k.length;t++)if(null!=(n=e.__k[t])&&null!=n.__e){e.__e=e.__c.base=n.__e;break}return b(e)}}function D(e){(!e.__d&&(e.__d=!0)&&a.push(e)&&!s++||u!==i.debounceRendering)&&((u=i.debounceRendering)||l)(R)}function R(){for(var e;s=a.length;)e=a.sort((function(e,t){return e.__v.__b-t.__v.__b})),a=[],e.some((function(e){var t,n,r,o,i,a,s;e.__d&&(a=(i=(t=e).__v).__e,(s=t.__P)&&(n=[],(r=g({},i)).__v=r,o=P(s,i,r,t.__n,void 0!==s.ownerSVGElement,null,n,null==a?C(i):a),I(n,i),o!=a&&b(i)))}))}function w(e,t,n,r,o,i,a,s,l){var u,c,d,h,g,m,y,S=n&&n.__k||f,E=S.length;if(s==p&&(s=null!=i?i[0]:E?C(n,0):null),u=0,t.__k=T(t.__k,(function(n){if(null!=n){if(n.__=t,n.__b=t.__b+1,null===(d=S[u])||d&&n.key==d.key&&n.type===d.type)S[u]=void 0;else for(c=0;c<E;c++){if((d=S[c])&&n.key==d.key&&n.type===d.type){S[c]=void 0;break}d=null}if(h=P(e,n,d=d||p,r,o,i,a,s,l),(c=n.ref)&&d.ref!=c&&(y||(y=[]),d.ref&&y.push(d.ref,null,n),y.push(c,n.__c||h,n)),null!=h){var f;if(null==m&&(m=h),void 0!==n.__d)f=n.__d,n.__d=void 0;else if(i==d||h!=s||null==h.parentNode){e:if(null==s||s.parentNode!==e)e.appendChild(h),f=null;else{for(g=s,c=0;(g=g.nextSibling)&&c<E;c+=2)if(g==h)break e;e.insertBefore(h,s),f=s}"option"==t.type&&(e.value="")}s=void 0!==f?f:h.nextSibling,"function"==typeof t.type&&(t.__d=s)}else s&&d.__e==s&&s.parentNode!=e&&(s=C(d))}return u++,n})),t.__e=m,null!=i&&"function"!=typeof t.type)for(u=i.length;u--;)null!=i[u]&&v(i[u]);for(u=E;u--;)null!=S[u]&&H(S[u],S[u]);if(y)for(u=0;u<y.length;u++)_(y[u],y[++u],y[++u])}function T(e,t,n){if(null==n&&(n=[]),null==e||"boolean"==typeof e)t&&n.push(t(null));else if(Array.isArray(e))for(var r=0;r<e.length;r++)T(e[r],t,n);else n.push(t?t("string"==typeof e||"number"==typeof e?y(null,e,null,null,e):null!=e.__e||null!=e.__c?y(e.type,e.props,e.key,null,e.__v):e):e);return n}function x(e,t,n){"-"===t[0]?e.setProperty(t,n):e[t]="number"==typeof n&&!1===h.test(t)?n+"px":null==n?"":n}function k(e,t,n,r,o){var i,a,s,l,u;if(o?"className"===t&&(t="class"):"class"===t&&(t="className"),"style"===t)if(i=e.style,"string"==typeof n)i.cssText=n;else{if("string"==typeof r&&(i.cssText="",r=null),r)for(l in r)n&&l in n||x(i,l,"");if(n)for(u in n)r&&n[u]===r[u]||x(i,u,n[u])}else"o"===t[0]&&"n"===t[1]?(a=t!==(t=t.replace(/Capture$/,"")),s=t.toLowerCase(),t=(s in e?s:t).slice(2),n?(r||e.addEventListener(t,M,a),(e.l||(e.l={}))[t]=n):e.removeEventListener(t,M,a)):"list"!==t&&"tagName"!==t&&"form"!==t&&"type"!==t&&"size"!==t&&!o&&t in e?e[t]=null==n?"":n:"function"!=typeof n&&"dangerouslySetInnerHTML"!==t&&(t!==(t=t.replace(/^xlink:?/,""))?null==n||!1===n?e.removeAttributeNS("http://www.w3.org/1999/xlink",t.toLowerCase()):e.setAttributeNS("http://www.w3.org/1999/xlink",t.toLowerCase(),n):null==n||!1===n&&!/^ar/.test(t)?e.removeAttribute(t):e.setAttribute(t,n))}function M(e){this.l[e.type](i.event?i.event(e):e)}function P(e,t,n,r,o,a,s,l,u){var c,d,p,f,h,v,m,y,C,b,D=t.type;if(void 0!==t.constructor)return null;(c=i.__b)&&c(t);try{e:if("function"==typeof D){if(y=t.props,C=(c=D.contextType)&&r[c.__c],b=c?C?C.props.value:c.__:r,n.__c?m=(d=t.__c=n.__c).__=d.__E:("prototype"in D&&D.prototype.render?t.__c=d=new D(y,b):(t.__c=d=new E(y,b),d.constructor=D,d.render=O),C&&C.sub(d),d.props=y,d.state||(d.state={}),d.context=b,d.__n=r,p=d.__d=!0,d.__h=[]),null==d.__s&&(d.__s=d.state),null!=D.getDerivedStateFromProps&&(d.__s==d.state&&(d.__s=g({},d.__s)),g(d.__s,D.getDerivedStateFromProps(y,d.__s))),f=d.props,h=d.state,p)null==D.getDerivedStateFromProps&&null!=d.componentWillMount&&d.componentWillMount(),null!=d.componentDidMount&&d.__h.push(d.componentDidMount);else{if(null==D.getDerivedStateFromProps&&y!==f&&null!=d.componentWillReceiveProps&&d.componentWillReceiveProps(y,b),!d.__e&&null!=d.shouldComponentUpdate&&!1===d.shouldComponentUpdate(y,d.__s,b)||t.__v===n.__v&&!d.__){for(d.props=y,d.state=d.__s,t.__v!==n.__v&&(d.__d=!1),d.__v=t,t.__e=n.__e,t.__k=n.__k,d.__h.length&&s.push(d),c=0;c<t.__k.length;c++)t.__k[c]&&(t.__k[c].__=t);break e}null!=d.componentWillUpdate&&d.componentWillUpdate(y,d.__s,b),null!=d.componentDidUpdate&&d.__h.push((function(){d.componentDidUpdate(f,h,v)}))}d.context=b,d.props=y,d.state=d.__s,(c=i.__r)&&c(t),d.__d=!1,d.__v=t,d.__P=e,c=d.render(d.props,d.state,d.context),t.__k=null!=c&&c.type==S&&null==c.key?c.props.children:Array.isArray(c)?c:[c],null!=d.getChildContext&&(r=g(g({},r),d.getChildContext())),p||null==d.getSnapshotBeforeUpdate||(v=d.getSnapshotBeforeUpdate(f,h)),w(e,t,n,r,o,a,s,l,u),d.base=t.__e,d.__h.length&&s.push(d),m&&(d.__E=d.__=null),d.__e=!1}else null==a&&t.__v===n.__v?(t.__k=n.__k,t.__e=n.__e):t.__e=N(n.__e,t,n,r,o,a,s,u);(c=i.diffed)&&c(t)}catch(e){t.__v=null,i.__e(e,t,n)}return t.__e}function I(e,t){i.__c&&i.__c(t,e),e.some((function(t){try{e=t.__h,t.__h=[],e.some((function(e){e.call(t)}))}catch(e){i.__e(e,t.__v)}}))}function N(e,t,n,r,o,i,a,s){var l,u,c,d,h,g=n.props,v=t.props;if(o="svg"===t.type||o,null!=i)for(l=0;l<i.length;l++)if(null!=(u=i[l])&&((null===t.type?3===u.nodeType:u.localName===t.type)||e==u)){e=u,i[l]=null;break}if(null==e){if(null===t.type)return document.createTextNode(v);e=o?document.createElementNS("http://www.w3.org/2000/svg",t.type):document.createElement(t.type,v.is&&{is:v.is}),i=null,s=!1}if(null===t.type)g!==v&&e.data!=v&&(e.data=v);else{if(null!=i&&(i=f.slice.call(e.childNodes)),c=(g=n.props||p).dangerouslySetInnerHTML,d=v.dangerouslySetInnerHTML,!s){if(g===p)for(g={},h=0;h<e.attributes.length;h++)g[e.attributes[h].name]=e.attributes[h].value;(d||c)&&(d&&c&&d.__html==c.__html||(e.innerHTML=d&&d.__html||""))}(function(e,t,n,r,o){var i;for(i in n)"children"===i||"key"===i||i in t||k(e,i,null,n[i],r);for(i in t)o&&"function"!=typeof t[i]||"children"===i||"key"===i||"value"===i||"checked"===i||n[i]===t[i]||k(e,i,t[i],n[i],r)})(e,v,g,o,s),d?t.__k=[]:(t.__k=t.props.children,w(e,t,n,r,"foreignObject"!==t.type&&o,i,a,p,s)),s||("value"in v&&void 0!==(l=v.value)&&l!==e.value&&k(e,"value",l,g.value,!1),"checked"in v&&void 0!==(l=v.checked)&&l!==e.checked&&k(e,"checked",l,g.checked,!1))}return e}function _(e,t,n){try{"function"==typeof e?e(t):e.current=t}catch(e){i.__e(e,n)}}function H(e,t,n){var r,o,a;if(i.unmount&&i.unmount(e),(r=e.ref)&&(r.current&&r.current!==e.__e||_(r,null,t)),n||"function"==typeof e.type||(n=null!=(o=e.__e)),e.__e=e.__d=void 0,null!=(r=e.__c)){if(r.componentWillUnmount)try{r.componentWillUnmount()}catch(e){i.__e(e,t)}r.base=r.__P=null}if(r=e.__k)for(a=0;a<r.length;a++)r[a]&&H(r[a],t,n);null!=o&&v(o)}function O(e,t,n){return this.constructor(e,n)}function W(e,t,n){var r,o,a;i.__&&i.__(e,t),o=(r=n===c)?null:n&&n.__k||t.__k,e=m(S,null,[e]),a=[],P(t,(r?t:n||t).__k=e,o||p,p,void 0!==t.ownerSVGElement,n&&!r?[n]:o?null:f.slice.call(t.childNodes),a,n||p,r),I(a,e)}i={__e:function(e,t){for(var n,r;t=t.__;)if((n=t.__c)&&!n.__)try{if(n.constructor&&null!=n.constructor.getDerivedStateFromError&&(r=!0,n.setState(n.constructor.getDerivedStateFromError(e))),null!=n.componentDidCatch&&(r=!0,n.componentDidCatch(e)),r)return D(n.__E=n)}catch(t){e=t}throw e}},E.prototype.setState=function(e,t){var n;n=this.__s!==this.state?this.__s:this.__s=g({},this.state),"function"==typeof e&&(e=e(n,this.props)),e&&g(n,e),null!=e&&this.__v&&(t&&this.__h.push(t),D(this))},E.prototype.forceUpdate=function(e){this.__v&&(this.__e=!0,e&&this.__h.push(e),D(this))},E.prototype.render=S,a=[],s=0,l="function"==typeof Promise?Promise.prototype.then.bind(Promise.resolve()):setTimeout,c=p,d=0,window.FullCalendarVDom={Component:E,createElement:m,render:W,createRef:function(){return{}},Fragment:S,createContext:function(e){var t=function(e){var t={},n={__c:"__cC"+d++,__:e,Consumer:function(e,t){return e.children(t)},Provider:function(e){var r,o=this;return this.getChildContext||(r=[],this.getChildContext=function(){return t[n.__c]=o,t},this.shouldComponentUpdate=function(e){o.props.value!==e.value&&r.some((function(t){t.context=e.value,D(t)}))},this.sub=function(e){r.push(e);var t=e.componentWillUnmount;e.componentWillUnmount=function(){r.splice(r.indexOf(e),1),t&&t.call(e)}}),e.children}};return n.Consumer.contextType=n,n.Provider.__=n,n}(e),n=t.Provider;return t.Provider=function(){var e=this,t=!this.getChildContext,r=n.apply(this,arguments);if(t){var o=[];this.shouldComponentUpdate=function(t){e.props.value!==t.value&&o.some((function(e){e.context=t.value,e.forceUpdate()}))},this.sub=function(e){o.push(e);var t=e.componentWillUnmount;e.componentWillUnmount=function(){o.splice(o.indexOf(e),1),t&&t.call(e)}}}return r},t},flushToDom:function(){var e=i.debounceRendering,t=[];i.debounceRendering=function(e){t.push(e)},W(m(A,{}),document.createElement("div"));for(;t.length;)t.shift()();i.debounceRendering=e}};var A=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.render=function(){return m("div",{})},t.prototype.componentDidMount=function(){this.setState({})},t}(E);var L=function(){function e(e,t){this.context=e,this.internalEventSource=t}return e.prototype.remove=function(){this.context.dispatch({type:"REMOVE_EVENT_SOURCE",sourceId:this.internalEventSource.sourceId})},e.prototype.refetch=function(){this.context.dispatch({type:"FETCH_EVENT_SOURCES",sourceIds:[this.internalEventSource.sourceId]})},Object.defineProperty(e.prototype,"id",{get:function(){return this.internalEventSource.publicId},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"url",{get:function(){return this.internalEventSource.meta.url},enumerable:!1,configurable:!0}),e}();function U(e,t){for(var n=0,r=0;r<e.length;)e[r]===t?(e.splice(r,1),n++):r++;return n}function B(e,t,n){if(e===t)return!0;var r,o=e.length;if(o!==t.length)return!1;for(r=0;r<o;r++)if(!(n?n(e[r],t[r]):e[r]===t[r]))return!1;return!0}function z(e){e=e.trim();var t=document.createElement("div");return t.innerHTML=e,t.firstChild}function V(e){e.parentNode&&e.parentNode.removeChild(e)}function F(e,t){e.innerHTML=t}function j(e,t){var n=Array.prototype.slice.call(e.childNodes),r=Array.prototype.slice.call(t);if(!B(n,r)){for(var o=0,i=r;o<i.length;o++){var a=i[o];e.appendChild(a)}n.forEach(V)}}var G=Element.prototype.matches||Element.prototype.matchesSelector||Element.prototype.msMatchesSelector,q=Element.prototype.closest||function(e){var t=this;if(!document.documentElement.contains(t))return null;do{if(Z(t,e))return t;t=t.parentElement||t.parentNode}while(null!==t&&1===t.nodeType);return null};function Y(e,t){return q.call(e,t)}function Z(e,t){return G.call(e,t)}function X(e,t){for(var n=e instanceof HTMLElement?[e]:e,r=[],o=0;o<n.length;o++)for(var i=n[o].querySelectorAll(t),a=0;a<i.length;a++)r.push(i[a]);return r}function K(e,t){for(var n=e instanceof HTMLElement?[e]:e,r=[],o=0;o<n.length;o++)for(var i=n[o].children,a=0;a<i.length;a++){var s=i[a];t&&!Z(s,t)||r.push(s)}return r}var J=/(top|left|right|bottom|width|height)$/i;function $(e,t){for(var n in t)Q(e,n,t[n])}function Q(e,t,n){null==n?e.style[t]="":"number"==typeof n&&J.test(t)?e.style[t]=n+"px":e.style[t]=n}function ee(e){e.preventDefault()}function te(e,t){return function(n){var r=Y(n.target,e);r&&t.call(r,n,r)}}function ne(e,t,n,r){var o=te(n,r);return e.addEventListener(t,o),function(){e.removeEventListener(t,o)}}var re=["webkitTransitionEnd","otransitionend","oTransitionEnd","msTransitionEnd","transitionend"];function oe(e,t){var n=function(r){t(r),re.forEach((function(t){e.removeEventListener(t,n)}))};re.forEach((function(t){e.addEventListener(t,n)}))}var ie=0;function ae(){return String(ie++)}function se(){document.body.classList.add("fc-not-allowed")}function le(){document.body.classList.remove("fc-not-allowed")}function ue(e){e.classList.add("fc-unselectable"),e.addEventListener("selectstart",ee)}function ce(e){e.classList.remove("fc-unselectable"),e.removeEventListener("selectstart",ee)}function de(e){e.addEventListener("contextmenu",ee)}function pe(e){e.removeEventListener("contextmenu",ee)}function fe(e){var t,n,r=[],o=[];for("string"==typeof e?o=e.split(/\s*,\s*/):"function"==typeof e?o=[e]:Array.isArray(e)&&(o=e),t=0;t<o.length;t++)"string"==typeof(n=o[t])?r.push("-"===n.charAt(0)?{field:n.substring(1),order:-1}:{field:n,order:1}):"function"==typeof n&&r.push({func:n});return r}function he(e,t,n){var r,o;for(r=0;r<n.length;r++)if(o=ge(e,t,n[r]))return o;return 0}function ge(e,t,n){return n.func?n.func(e,t):ve(e[n.field],t[n.field])*(n.order||1)}function ve(e,t){return e||t?null==t?-1:null==e?1:"string"==typeof e||"string"==typeof t?String(e).localeCompare(String(t)):e-t:0}function me(e,t){var n=String(e);return"000".substr(0,t-n.length)+n}function ye(e,t){return e-t}function Se(e){return e%1==0}function Ee(e){var t=e.querySelector(".fc-scrollgrid-shrink-frame"),n=e.querySelector(".fc-scrollgrid-shrink-cushion");if(!t)throw new Error("needs fc-scrollgrid-shrink-frame className");if(!n)throw new Error("needs fc-scrollgrid-shrink-cushion className");return e.getBoundingClientRect().width-t.getBoundingClientRect().width+n.getBoundingClientRect().width}var Ce=["sun","mon","tue","wed","thu","fri","sat"];function be(e,t){var n=Oe(e);return n[2]+=7*t,We(n)}function De(e,t){var n=Oe(e);return n[2]+=t,We(n)}function Re(e,t){var n=Oe(e);return n[6]+=t,We(n)}function we(e,t){return Te(e,t)/7}function Te(e,t){return(t.valueOf()-e.valueOf())/864e5}function xe(e,t){var n=Pe(e),r=Pe(t);return{years:0,months:0,days:Math.round(Te(n,r)),milliseconds:t.valueOf()-r.valueOf()-(e.valueOf()-n.valueOf())}}function ke(e,t){var n=Me(e,t);return null!==n&&n%7==0?n/7:null}function Me(e,t){return Le(e)===Le(t)?Math.round(Te(e,t)):null}function Pe(e){return We([e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate()])}function Ie(e,t,n,r){var o=We([t,0,1+Ne(t,n,r)]),i=Pe(e),a=Math.round(Te(o,i));return Math.floor(a/7)+1}function Ne(e,t,n){var r=7+t-n;return-((7+We([e,0,r]).getUTCDay()-t)%7)+r-1}function _e(e){return[e.getFullYear(),e.getMonth(),e.getDate(),e.getHours(),e.getMinutes(),e.getSeconds(),e.getMilliseconds()]}function He(e){return new Date(e[0],e[1]||0,null==e[2]?1:e[2],e[3]||0,e[4]||0,e[5]||0)}function Oe(e){return[e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate(),e.getUTCHours(),e.getUTCMinutes(),e.getUTCSeconds(),e.getUTCMilliseconds()]}function We(e){return 1===e.length&&(e=e.concat([0])),new Date(Date.UTC.apply(Date,e))}function Ae(e){return!isNaN(e.valueOf())}function Le(e){return 1e3*e.getUTCHours()*60*60+1e3*e.getUTCMinutes()*60+1e3*e.getUTCSeconds()+e.getUTCMilliseconds()}function Ue(e,t,n,r){return{instanceId:ae(),defId:e,range:t,forcedStartTzo:null==n?null:n,forcedEndTzo:null==r?null:r}}var Be=Object.prototype.hasOwnProperty;function ze(e,t){var n={};if(t)for(var r in t){for(var o=[],i=e.length-1;i>=0;i--){var a=e[i][r];if("object"==typeof a&&a)o.unshift(a);else if(void 0!==a){n[r]=a;break}}o.length&&(n[r]=ze(o))}for(i=e.length-1;i>=0;i--){var s=e[i];for(var l in s)l in n||(n[l]=s[l])}return n}function Ve(e,t){var n={};for(var r in e)t(e[r],r)&&(n[r]=e[r]);return n}function Fe(e,t){var n={};for(var r in e)n[r]=t(e[r],r);return n}function je(e){for(var t={},n=0,r=e;n<r.length;n++){t[r[n]]=!0}return t}function Ge(e){var t=[];for(var n in e)t.push(e[n]);return t}function qe(e,t){if(e===t)return!0;for(var n in e)if(Be.call(e,n)&&!(n in t))return!1;for(var n in t)if(Be.call(t,n)&&e[n]!==t[n])return!1;return!0}function Ye(e,t){var n=[];for(var r in e)Be.call(e,r)&&(r in t||n.push(r));for(var r in t)Be.call(t,r)&&e[r]!==t[r]&&n.push(r);return n}function Ze(e,t,n){if(void 0===n&&(n={}),e===t)return!0;for(var r in t)if(!(r in e)||!Xe(e[r],t[r],n[r]))return!1;for(var r in e)if(!(r in t))return!1;return!0}function Xe(e,t,n){return e===t||!0===n||!!n&&n(e,t)}function Ke(e,t,n,r){void 0===t&&(t=0),void 0===r&&(r=1);var o=[];null==n&&(n=Object.keys(e).length);for(var i=t;i<n;i+=r){var a=e[i];void 0!==a&&o.push(a)}return o}function Je(e,t,n){var r=n.dateEnv,o=n.pluginHooks,i=n.options,a=e.defs,s=e.instances;for(var l in s=Ve(s,(function(e){return!a[e.defId].recurringDef})),a){var u=a[l];if(u.recurringDef){var c=u.recurringDef.duration;c||(c=u.allDay?i.defaultAllDayEventDuration:i.defaultTimedEventDuration);for(var d=0,p=$e(u,c,t,r,o.recurringTypes);d<p.length;d++){var f=p[d],h=Ue(l,{start:f,end:r.add(f,c)});s[h.instanceId]=h}}}return{defs:a,instances:s}}function $e(e,t,n,r,o){var i=o[e.recurringDef.typeId].expand(e.recurringDef.typeData,{start:r.subtract(n.start,t),end:n.end},r);return e.allDay&&(i=i.map(Pe)),i}var Qe=["years","months","days","milliseconds"],et=/^(-?)(?:(\d+)\.)?(\d+):(\d\d)(?::(\d\d)(?:\.(\d\d\d))?)?/;function tt(e,t){var n;return"string"==typeof e?function(e){var t=et.exec(e);if(t){var n=t[1]?-1:1;return{years:0,months:0,days:n*(t[2]?parseInt(t[2],10):0),milliseconds:n*(60*(t[3]?parseInt(t[3],10):0)*60*1e3+60*(t[4]?parseInt(t[4],10):0)*1e3+1e3*(t[5]?parseInt(t[5],10):0)+(t[6]?parseInt(t[6],10):0))}}return null}(e):"object"==typeof e&&e?nt(e):"number"==typeof e?nt(((n={})[t||"milliseconds"]=e,n)):null}function nt(e){var t={years:e.years||e.year||0,months:e.months||e.month||0,days:e.days||e.day||0,milliseconds:60*(e.hours||e.hour||0)*60*1e3+60*(e.minutes||e.minute||0)*1e3+1e3*(e.seconds||e.second||0)+(e.milliseconds||e.millisecond||e.ms||0)},n=e.weeks||e.week;return n&&(t.days+=7*n,t.specifiedWeeks=!0),t}function rt(e){return 0===e.years&&0===e.months&&1===e.days&&0===e.milliseconds}function ot(e,t){return{years:e.years+t.years,months:e.months+t.months,days:e.days+t.days,milliseconds:e.milliseconds+t.milliseconds}}function it(e,t){return{years:e.years*t,months:e.months*t,days:e.days*t,milliseconds:e.milliseconds*t}}function at(e){return ut(e)/864e5}function st(e){return ut(e)/6e4}function lt(e){return ut(e)/1e3}function ut(e){return 31536e6*e.years+2592e6*e.months+864e5*e.days+e.milliseconds}function ct(e,t){for(var n=null,r=0;r<Qe.length;r++){var o=Qe[r];if(t[o]){var i=e[o]/t[o];if(!Se(i)||null!==n&&n!==i)return null;n=i}else if(e[o])return null}return n}function dt(e){var t=e.milliseconds;if(t){if(t%1e3!=0)return{unit:"millisecond",value:t};if(t%6e4!=0)return{unit:"second",value:t/1e3};if(t%36e5!=0)return{unit:"minute",value:t/6e4};if(t)return{unit:"hour",value:t/36e5}}return e.days?e.specifiedWeeks&&e.days%7==0?{unit:"week",value:e.days/7}:{unit:"day",value:e.days}:e.months?{unit:"month",value:e.months}:e.years?{unit:"year",value:e.years}:{unit:"millisecond",value:0}}function pt(e){return e.toISOString().replace(/T.*$/,"")}function ft(e){return me(e.getUTCHours(),2)+":"+me(e.getUTCMinutes(),2)+":"+me(e.getUTCSeconds(),2)}function ht(e,t){void 0===t&&(t=!1);var n=e<0?"-":"+",r=Math.abs(e),o=Math.floor(r/60),i=Math.round(r%60);return t?n+me(o,2)+":"+me(i,2):"GMT"+n+o+(i?":"+me(i,2):"")}function gt(e,t,n){var r,o;return function(){for(var i=[],a=0;a<arguments.length;a++)i[a]=arguments[a];if(r){if(!B(r,i)){n&&n(o);var s=e.apply(this,i);t&&t(s,o)||(o=s)}}else o=e.apply(this,i);return r=i,o}}function vt(e,t,n){var r,o;return function(i){if(r){if(!qe(r,i)){n&&n(o);var a=e.call(this,i);t&&t(a,o)||(o=a)}}else o=e.call(this,i);return r=i,o}}function mt(e,t,n){var r=[],o=[];return function(i){for(var a=r.length,s=i.length,l=0;l<a;l++)if(i[l]){if(!B(r[l],i[l])){n&&n(o[l]);var u=e.apply(this,i[l]);t&&t(u,o[l])||(o[l]=u)}}else n&&n(o[l]);for(;l<s;l++)o[l]=e.apply(this,i[l]);return r=i,o.splice(s),o}}function yt(e,t,n){var r={},o={};return function(i){var a={};for(var s in i)if(o[s])if(B(r[s],i[s]))a[s]=o[s];else{n&&n(o[s]);var l=e.apply(this,i[s]);a[s]=t&&t(l,o[s])?o[s]:l}else a[s]=e.apply(this,i[s]);return r=i,o=a,a}}var St={week:3,separator:0,omitZeroMinute:0,meridiem:0,omitCommas:0},Et={timeZoneName:7,era:6,year:5,month:4,day:2,weekday:2,hour:1,minute:1,second:1},Ct=/\s*([ap])\.?m\.?/i,bt=/,/g,Dt=/\s+/g,Rt=/\u200e/g,wt=/UTC|GMT/,Tt=function(){function e(e){var t={},n={},r=0;for(var o in e)o in St?(n[o]=e[o],r=Math.max(St[o],r)):(t[o]=e[o],o in Et&&(r=Math.max(Et[o],r)));this.standardDateProps=t,this.extendedSettings=n,this.severity=r,this.buildFormattingFunc=gt(xt)}return e.prototype.format=function(e,t){return this.buildFormattingFunc(this.standardDateProps,this.extendedSettings,t)(e)},e.prototype.formatRange=function(e,t,n,r){var o=this.standardDateProps,i=this.extendedSettings,a=function(e,t,n){if(n.getMarkerYear(e)!==n.getMarkerYear(t))return 5;if(n.getMarkerMonth(e)!==n.getMarkerMonth(t))return 4;if(n.getMarkerDay(e)!==n.getMarkerDay(t))return 2;if(Le(e)!==Le(t))return 1;return 0}(e.marker,t.marker,n.calendarSystem);if(!a)return this.format(e,n);var s=a;!(s>1)||"numeric"!==o.year&&"2-digit"!==o.year||"numeric"!==o.month&&"2-digit"!==o.month||"numeric"!==o.day&&"2-digit"!==o.day||(s=1);var l=this.format(e,n),u=this.format(t,n);if(l===u)return l;var c=xt(function(e,t){var n={};for(var r in e)(!(r in Et)||Et[r]<=t)&&(n[r]=e[r]);return n}(o,s),i,n),d=c(e),p=c(t),f=function(e,t,n,r){var o=0;for(;o<e.length;){var i=e.indexOf(t,o);if(-1===i)break;var a=e.substr(0,i);o=i+t.length;for(var s=e.substr(o),l=0;l<n.length;){var u=n.indexOf(r,l);if(-1===u)break;var c=n.substr(0,u);l=u+r.length;var d=n.substr(l);if(a===c&&s===d)return{before:a,after:s}}}return null}(l,d,u,p),h=i.separator||r||n.defaultSeparator||"";return f?f.before+d+h+p+f.after:l+h+u},e.prototype.getLargestUnit=function(){switch(this.severity){case 7:case 6:case 5:return"year";case 4:return"month";case 3:return"week";case 2:return"day";default:return"time"}},e}();function xt(e,t,n){var o=Object.keys(e).length;return 1===o&&"short"===e.timeZoneName?function(e){return ht(e.timeZoneOffset)}:0===o&&t.week?function(e){return function(e,t,n,r){var o=[];"narrow"===r?o.push(t):"short"===r&&o.push(t," ");o.push(n.simpleNumberFormat.format(e)),"rtl"===n.options.direction&&o.reverse();return o.join("")}(n.computeWeekNumber(e.marker),n.weekText,n.locale,t.week)}:function(e,t,n){e=r({},e),t=r({},t),function(e,t){e.timeZoneName&&(e.hour||(e.hour="2-digit"),e.minute||(e.minute="2-digit"));"long"===e.timeZoneName&&(e.timeZoneName="short");t.omitZeroMinute&&(e.second||e.millisecond)&&delete t.omitZeroMinute}(e,t),e.timeZone="UTC";var o,i=new Intl.DateTimeFormat(n.locale.codes,e);if(t.omitZeroMinute){var a=r({},e);delete a.minute,o=new Intl.DateTimeFormat(n.locale.codes,a)}return function(r){var a=r.marker;return function(e,t,n,r,o){e=e.replace(Rt,""),"short"===n.timeZoneName&&(e=function(e,t){var n=!1;e=e.replace(wt,(function(){return n=!0,t})),n||(e+=" "+t);return e}(e,"UTC"===o.timeZone||null==t.timeZoneOffset?"UTC":ht(t.timeZoneOffset)));r.omitCommas&&(e=e.replace(bt,"").trim());r.omitZeroMinute&&(e=e.replace(":00",""));!1===r.meridiem?e=e.replace(Ct,"").trim():"narrow"===r.meridiem?e=e.replace(Ct,(function(e,t){return t.toLocaleLowerCase()})):"short"===r.meridiem?e=e.replace(Ct,(function(e,t){return t.toLocaleLowerCase()+"m"})):"lowercase"===r.meridiem&&(e=e.replace(Ct,(function(e){return e.toLocaleLowerCase()})));return e=(e=e.replace(Dt," ")).trim()}((o&&!a.getUTCMinutes()?o:i).format(a),r,e,t,n)}}(e,t,n)}function kt(e,t){var n=t.markerToArray(e.marker);return{marker:e.marker,timeZoneOffset:e.timeZoneOffset,array:n,year:n[0],month:n[1],day:n[2],hour:n[3],minute:n[4],second:n[5],millisecond:n[6]}}function Mt(e,t,n,r){var o=kt(e,n.calendarSystem);return{date:o,start:o,end:t?kt(t,n.calendarSystem):null,timeZone:n.timeZone,localeCodes:n.locale.codes,defaultSeparator:r||n.defaultSeparator}}var Pt=function(){function e(e){this.cmdStr=e}return e.prototype.format=function(e,t,n){return t.cmdFormatter(this.cmdStr,Mt(e,null,t,n))},e.prototype.formatRange=function(e,t,n,r){return n.cmdFormatter(this.cmdStr,Mt(e,t,n,r))},e}(),It=function(){function e(e){this.func=e}return e.prototype.format=function(e,t,n){return this.func(Mt(e,null,t,n))},e.prototype.formatRange=function(e,t,n,r){return this.func(Mt(e,t,n,r))},e}();function Nt(e){return"object"==typeof e&&e?new Tt(e):"string"==typeof e?new Pt(e):"function"==typeof e?new It(e):void 0}var _t={navLinkDayClick:Vt,navLinkWeekClick:Vt,duration:tt,bootstrapFontAwesome:Vt,buttonIcons:Vt,customButtons:Vt,defaultAllDayEventDuration:tt,defaultTimedEventDuration:tt,nextDayThreshold:tt,scrollTime:tt,slotMinTime:tt,slotMaxTime:tt,dayPopoverFormat:Nt,slotDuration:tt,snapDuration:tt,headerToolbar:Vt,footerToolbar:Vt,defaultRangeSeparator:String,titleRangeSeparator:String,forceEventDuration:Boolean,dayHeaders:Boolean,dayHeaderFormat:Nt,dayHeaderClassNames:Vt,dayHeaderContent:Vt,dayHeaderDidMount:Vt,dayHeaderWillUnmount:Vt,dayCellClassNames:Vt,dayCellContent:Vt,dayCellDidMount:Vt,dayCellWillUnmount:Vt,initialView:String,aspectRatio:Number,weekends:Boolean,weekNumberCalculation:Vt,weekNumbers:Boolean,weekNumberClassNames:Vt,weekNumberContent:Vt,weekNumberDidMount:Vt,weekNumberWillUnmount:Vt,editable:Boolean,viewClassNames:Vt,viewDidMount:Vt,viewWillUnmount:Vt,nowIndicator:Boolean,nowIndicatorClassNames:Vt,nowIndicatorContent:Vt,nowIndicatorDidMount:Vt,nowIndicatorWillUnmount:Vt,showNonCurrentDates:Boolean,lazyFetching:Boolean,startParam:String,endParam:String,timeZoneParam:String,timeZone:String,locales:Vt,locale:Vt,themeSystem:String,dragRevertDuration:Number,dragScroll:Boolean,allDayMaintainDuration:Boolean,unselectAuto:Boolean,dropAccept:Vt,eventOrder:fe,handleWindowResize:Boolean,windowResizeDelay:Number,longPressDelay:Number,eventDragMinDistance:Number,expandRows:Boolean,height:Vt,contentHeight:Vt,direction:String,weekNumberFormat:Nt,eventResizableFromStart:Boolean,displayEventTime:Boolean,displayEventEnd:Boolean,weekText:String,progressiveEventRendering:Boolean,businessHours:Vt,initialDate:Vt,now:Vt,eventDataTransform:Vt,stickyHeaderDates:Vt,stickyFooterScrollbar:Vt,viewHeight:Vt,defaultAllDay:Boolean,eventSourceFailure:Vt,eventSourceSuccess:Vt,eventDisplay:String,eventStartEditable:Boolean,eventDurationEditable:Boolean,eventOverlap:Vt,eventConstraint:Vt,eventAllow:Vt,eventBackgroundColor:String,eventBorderColor:String,eventTextColor:String,eventColor:String,eventClassNames:Vt,eventContent:Vt,eventDidMount:Vt,eventWillUnmount:Vt,selectConstraint:Vt,selectOverlap:Vt,selectAllow:Vt,droppable:Boolean,unselectCancel:String,slotLabelFormat:Vt,slotLaneClassNames:Vt,slotLaneContent:Vt,slotLaneDidMount:Vt,slotLaneWillUnmount:Vt,slotLabelClassNames:Vt,slotLabelContent:Vt,slotLabelDidMount:Vt,slotLabelWillUnmount:Vt,dayMaxEvents:Vt,dayMaxEventRows:Vt,dayMinWidth:Number,slotLabelInterval:tt,allDayText:String,allDayClassNames:Vt,allDayContent:Vt,allDayDidMount:Vt,allDayWillUnmount:Vt,slotMinWidth:Number,navLinks:Boolean,eventTimeFormat:Nt,rerenderDelay:Number,moreLinkText:Vt,selectMinDistance:Number,selectable:Boolean,selectLongPressDelay:Number,eventLongPressDelay:Number,selectMirror:Boolean,eventMinHeight:Number,slotEventOverlap:Boolean,plugins:Vt,firstDay:Number,dayCount:Number,dateAlignment:String,dateIncrement:tt,hiddenDays:Vt,monthMode:Boolean,fixedWeekCount:Boolean,validRange:Vt,visibleRange:Vt,titleFormat:Vt,noEventsText:String},Ht={eventDisplay:"auto",defaultRangeSeparator:" - ",titleRangeSeparator:" – ",defaultTimedEventDuration:"01:00:00",defaultAllDayEventDuration:{day:1},forceEventDuration:!1,nextDayThreshold:"00:00:00",dayHeaders:!0,initialView:"",aspectRatio:1.35,headerToolbar:{start:"title",center:"",end:"today prev,next"},weekends:!0,weekNumbers:!1,weekNumberCalculation:"local",editable:!1,nowIndicator:!1,scrollTime:"06:00:00",slotMinTime:"00:00:00",slotMaxTime:"24:00:00",showNonCurrentDates:!0,lazyFetching:!0,startParam:"start",endParam:"end",timeZoneParam:"timeZone",timeZone:"local",locales:[],locale:"",themeSystem:"standard",dragRevertDuration:500,dragScroll:!0,allDayMaintainDuration:!1,unselectAuto:!0,dropAccept:"*",eventOrder:"start,-duration,allDay,title",dayPopoverFormat:{month:"long",day:"numeric",year:"numeric"},handleWindowResize:!0,windowResizeDelay:100,longPressDelay:1e3,eventDragMinDistance:5,expandRows:!1,navLinks:!1,selectable:!1},Ot={datesSet:Vt,eventsSet:Vt,eventAdd:Vt,eventChange:Vt,eventRemove:Vt,windowResize:Vt,eventClick:Vt,eventMouseEnter:Vt,eventMouseLeave:Vt,select:Vt,unselect:Vt,loading:Vt,_unmount:Vt,_beforeprint:Vt,_afterprint:Vt,_noEventDrop:Vt,_noEventResize:Vt,_resize:Vt,_scrollRequest:Vt},Wt={buttonText:Vt,views:Vt,plugins:Vt,initialEvents:Vt,events:Vt,eventSources:Vt},At={headerToolbar:Lt,footerToolbar:Lt,buttonText:Lt,buttonIcons:Lt};function Lt(e,t){return"object"==typeof e&&"object"==typeof t&&e&&t?qe(e,t):e===t}var Ut={type:String,component:Vt,buttonText:String,buttonTextKey:String,dateProfileGeneratorClass:Vt,usesMinMaxTime:Boolean,classNames:Vt,content:Vt,didMount:Vt,willUnmount:Vt};function Bt(e){return ze(e,At)}function zt(e,t){var n={},r={};for(var o in t)o in e&&(n[o]=t[o](e[o]));for(var o in e)o in t||(r[o]=e[o]);return{refined:n,extra:r}}function Vt(e){return e}function Ft(e,t,n,r){for(var o={defs:{},instances:{}},i=sn(n),a=0,s=e;a<s.length;a++){var l=on(s[a],t,n,r,i);l&&jt(l,o)}return o}function jt(e,t){return void 0===t&&(t={defs:{},instances:{}}),t.defs[e.def.defId]=e.def,e.instance&&(t.instances[e.instance.instanceId]=e.instance),t}function Gt(e,t){var n=e.instances[t];if(n){var r=e.defs[n.defId],o=Zt(e,(function(e){return t=r,n=e,Boolean(t.groupId&&t.groupId===n.groupId);var t,n}));return o.defs[r.defId]=r,o.instances[n.instanceId]=n,o}return{defs:{},instances:{}}}function qt(){return{defs:{},instances:{}}}function Yt(e,t){return{defs:r(r({},e.defs),t.defs),instances:r(r({},e.instances),t.instances)}}function Zt(e,t){var n=Ve(e.defs,t),r=Ve(e.instances,(function(e){return n[e.defId]}));return{defs:n,instances:r}}function Xt(e){return Array.isArray(e)?e:"string"==typeof e?e.split(/\s+/):[]}var Kt={display:String,editable:Boolean,startEditable:Boolean,durationEditable:Boolean,constraint:Vt,overlap:Vt,allow:Vt,className:Xt,classNames:Xt,color:String,backgroundColor:String,borderColor:String,textColor:String};function Jt(e,t){var n=function(e,t){return Array.isArray(e)?Ft(e,null,t,!0):"object"==typeof e&&e?Ft([e],null,t,!0):null!=e?String(e):null}(e.constraint,t);return{display:e.display||null,startEditable:null!=e.startEditable?e.startEditable:e.editable,durationEditable:null!=e.durationEditable?e.durationEditable:e.editable,constraints:null!=n?[n]:[],overlap:null!=e.overlap?e.overlap:null,allows:null!=e.allow?[e.allow]:[],backgroundColor:e.backgroundColor||e.color||"",borderColor:e.borderColor||e.color||"",textColor:e.textColor||"",classNames:(e.className||[]).concat(e.classNames||[])}}function $t(e){return e.reduce(Qt,en)}function Qt(e,t){return{display:null!=t.display?t.display:e.display,startEditable:null!=t.startEditable?t.startEditable:e.startEditable,durationEditable:null!=t.durationEditable?t.durationEditable:e.durationEditable,constraints:e.constraints.concat(t.constraints),overlap:"boolean"==typeof t.overlap?t.overlap:e.overlap,allows:e.allows.concat(t.allows),backgroundColor:t.backgroundColor||e.backgroundColor,borderColor:t.borderColor||e.borderColor,textColor:t.textColor||e.textColor,classNames:e.classNames.concat(t.classNames)}}var en={display:null,startEditable:null,durationEditable:null,constraints:[],overlap:null,allows:[],backgroundColor:"",borderColor:"",textColor:"",classNames:[]},tn={id:String,groupId:String,title:String,url:String},nn={start:Vt,end:Vt,date:Vt,allDay:Boolean},rn=r(r(r({},tn),nn),{extendedProps:Vt});function on(e,t,n,r,o){void 0===o&&(o=sn(n));var i=an(e,n,o),a=i.refined,s=i.extra,l=function(e,t){var n=null;e&&(n=e.defaultAllDay);null==n&&(n=t.options.defaultAllDay);return n}(t,n),u=function(e,t,n,r){for(var o=0;o<r.length;o++){var i=r[o].parse(e,n);if(i){var a=e.allDay;return null==a&&null==(a=t)&&null==(a=i.allDayGuess)&&(a=!1),{allDay:a,duration:i.duration,typeData:i.typeData,typeId:o}}}return null}(a,l,n.dateEnv,n.pluginHooks.recurringTypes);if(u)return(c=ln(a,s,t?t.sourceId:"",u.allDay,Boolean(u.duration),n)).recurringDef={typeId:u.typeId,typeData:u.typeData,duration:u.duration},{def:c,instance:null};var c,d=function(e,t,n,r){var o,i,a=e.allDay,s=null,l=!1,u=null,c=null!=e.start?e.start:e.date;if(o=n.dateEnv.createMarkerMeta(c))s=o.marker;else if(!r)return null;null!=e.end&&(i=n.dateEnv.createMarkerMeta(e.end));null==a&&(a=null!=t?t:(!o||o.isTimeUnspecified)&&(!i||i.isTimeUnspecified));a&&s&&(s=Pe(s));i&&(u=i.marker,a&&(u=Pe(u)),s&&u<=s&&(u=null));u?l=!0:r||(l=n.options.forceEventDuration||!1,u=n.dateEnv.add(s,a?n.options.defaultAllDayEventDuration:n.options.defaultTimedEventDuration));return{allDay:a,hasEnd:l,range:{start:s,end:u},forcedStartTzo:o?o.forcedTzo:null,forcedEndTzo:i?i.forcedTzo:null}}(a,l,n,r);return d?{def:c=ln(a,s,t?t.sourceId:"",d.allDay,d.hasEnd,n),instance:Ue(c.defId,d.range,d.forcedStartTzo,d.forcedEndTzo)}:null}function an(e,t,n){return void 0===n&&(n=sn(t)),zt(e,n)}function sn(e){return r(r(r({},Kt),rn),e.pluginHooks.eventRefiners)}function ln(e,t,n,o,i,a){for(var s={title:e.title||"",groupId:e.groupId||"",publicId:e.id||"",url:e.url||"",recurringDef:null,defId:ae(),sourceId:n,allDay:o,hasEnd:i,ui:Jt(e,a),extendedProps:r(r({},e.extendedProps||{}),t)},l=0,u=a.pluginHooks.eventDefMemberAdders;l<u.length;l++){var c=u[l];r(s,c(e))}return Object.freeze(s.ui.classNames),Object.freeze(s.extendedProps),s}function un(e){var t=Math.floor(Te(e.start,e.end))||1,n=Pe(e.start);return{start:n,end:De(n,t)}}function cn(e,t){void 0===t&&(t=tt(0));var n=null,r=null;if(e.end){r=Pe(e.end);var o=e.end.valueOf()-r.valueOf();o&&o>=ut(t)&&(r=De(r,1))}return e.start&&(n=Pe(e.start),r&&r<=n&&(r=De(n,1))),{start:n,end:r}}function dn(e){var t=cn(e);return Te(t.start,t.end)>1}function pn(e,t,n,r){return"year"===r?tt(n.diffWholeYears(e,t),"year"):"month"===r?tt(n.diffWholeMonths(e,t),"month"):xe(e,t)}function fn(e,t){var n,r,o=[],i=t.start;for(e.sort(hn),n=0;n<e.length;n++)(r=e[n]).start>i&&o.push({start:i,end:r.start}),r.end>i&&(i=r.end);return i<t.end&&o.push({start:i,end:t.end}),o}function hn(e,t){return e.start.valueOf()-t.start.valueOf()}function gn(e,t){var n=e.start,r=e.end,o=null;return null!==t.start&&(n=null===n?t.start:new Date(Math.max(n.valueOf(),t.start.valueOf()))),null!=t.end&&(r=null===r?t.end:new Date(Math.min(r.valueOf(),t.end.valueOf()))),(null===n||null===r||n<r)&&(o={start:n,end:r}),o}function vn(e,t){return(null===e.start?null:e.start.valueOf())===(null===t.start?null:t.start.valueOf())&&(null===e.end?null:e.end.valueOf())===(null===t.end?null:t.end.valueOf())}function mn(e,t){return(null===e.end||null===t.start||e.end>t.start)&&(null===e.start||null===t.end||e.start<t.end)}function yn(e,t){return(null===e.start||null!==t.start&&t.start>=e.start)&&(null===e.end||null!==t.end&&t.end<=e.end)}function Sn(e,t){return(null===e.start||t>=e.start)&&(null===e.end||t<e.end)}function En(e,t,n,r){var o={},i={},a={},s=[],l=[],u=Rn(e.defs,t);for(var c in e.defs){"inverse-background"===(f=u[(E=e.defs[c]).defId]).display&&(E.groupId?(o[E.groupId]=[],a[E.groupId]||(a[E.groupId]=E)):i[c]=[])}for(var d in e.instances){var p=e.instances[d],f=u[(E=e.defs[p.defId]).defId],h=p.range,g=!E.allDay&&r?cn(h,r):h,v=gn(g,n);v&&("inverse-background"===f.display?E.groupId?o[E.groupId].push(v):i[p.defId].push(v):"none"!==f.display&&("background"===f.display?s:l).push({def:E,ui:f,instance:p,range:v,isStart:g.start&&g.start.valueOf()===v.start.valueOf(),isEnd:g.end&&g.end.valueOf()===v.end.valueOf()}))}for(var m in o)for(var y=0,S=fn(o[m],n);y<S.length;y++){var E,C=S[y];f=u[(E=a[m]).defId];s.push({def:E,ui:f,instance:null,range:C,isStart:!1,isEnd:!1})}for(var c in i)for(var b=0,D=fn(i[c],n);b<D.length;b++){C=D[b];s.push({def:e.defs[c],ui:u[c],instance:null,range:C,isStart:!1,isEnd:!1})}return{bg:s,fg:l}}function Cn(e){return"background"===e.ui.display||"inverse-background"===e.ui.display}function bn(e,t){e.fcSeg=t}function Dn(e){return e.fcSeg||e.parentNode.fcSeg||null}function Rn(e,t){return Fe(e,(function(e){return wn(e,t)}))}function wn(e,t){var n=[];return t[""]&&n.push(t[""]),t[e.defId]&&n.push(t[e.defId]),n.push(e.ui),$t(n)}function Tn(e,t){var n=e.map(xn);return n.sort((function(e,n){return he(e,n,t)})),n.map((function(e){return e._seg}))}function xn(e){var t=e.eventRange,n=t.def,o=t.instance?t.instance.range:t.range,i=o.start?o.start.valueOf():0,a=o.end?o.end.valueOf():0;return r(r(r({},n.extendedProps),n),{id:n.publicId,start:i,end:a,duration:a-i,allDay:Number(n.allDay),_seg:e})}function kn(e,t){for(var n=t.pluginHooks.isDraggableTransformers,r=e.eventRange,o=r.def,i=r.ui,a=i.startEditable,s=0,l=n;s<l.length;s++){a=(0,l[s])(a,o,i,t)}return a}function Mn(e,t){return e.isStart&&e.eventRange.ui.durationEditable&&t.options.eventResizableFromStart}function Pn(e,t){return e.isEnd&&e.eventRange.ui.durationEditable}function In(e,t,n,r,o,i,a){var s=n.dateEnv,l=n.options,u=l.displayEventTime,c=l.displayEventEnd,d=e.eventRange.def,p=e.eventRange.instance;if(null==u&&(u=!1!==r),null==c&&(c=!1!==o),u&&!d.allDay&&(e.isStart||e.isEnd)){var f=i||(e.isStart?p.range.start:e.start||e.eventRange.range.start),h=a||(e.isEnd?p.range.end:e.end||e.eventRange.range.end);return c&&d.hasEnd?s.formatRange(f,h,t,{forcedStartTzo:i?null:p.forcedStartTzo,forcedEndTzo:a?null:p.forcedEndTzo}):s.format(f,t,{forcedTzo:i?null:p.forcedStartTzo})}return""}function Nn(e,t,n){var r=e.eventRange.range;return{isPast:r.end<(n||t.start),isFuture:r.start>=(n||t.end),isToday:t&&Sn(t,r.start)}}function _n(e){var t=["fc-event"];return e.isMirror&&t.push("fc-event-mirror"),e.isDraggable&&t.push("fc-event-draggable"),(e.isStartResizable||e.isEndResizable)&&t.push("fc-event-resizable"),e.isDragging&&t.push("fc-event-dragging"),e.isResizing&&t.push("fc-event-resizing"),e.isSelected&&t.push("fc-event-selected"),e.isStart&&t.push("fc-event-start"),e.isEnd&&t.push("fc-event-end"),e.isPast&&t.push("fc-event-past"),e.isToday&&t.push("fc-event-today"),e.isFuture&&t.push("fc-event-future"),t}function Hn(e){return e.instance?e.instance.instanceId:e.def.defId+":"+e.range.start.toISOString()}var On={start:Vt,end:Vt,allDay:Boolean};function Wn(e,t,n){var o=function(e,t){var n=zt(e,On),o=n.refined,i=n.extra,a=o.start?t.createMarkerMeta(o.start):null,s=o.end?t.createMarkerMeta(o.end):null,l=o.allDay;null==l&&(l=a&&a.isTimeUnspecified&&(!s||s.isTimeUnspecified));return r({range:{start:a?a.marker:null,end:s?s.marker:null},allDay:l},i)}(e,t),i=o.range;if(!i.start)return null;if(!i.end){if(null==n)return null;i.end=t.add(i.start,n)}return o}function An(e,t){return vn(e.range,t.range)&&e.allDay===t.allDay&&function(e,t){for(var n in t)if("range"!==n&&"allDay"!==n&&e[n]!==t[n])return!1;for(var n in e)if(!(n in t))return!1;return!0}(e,t)}function Ln(e,t,n){return r(r({},Un(e,t,n)),{timeZone:t.timeZone})}function Un(e,t,n){return{start:t.toDate(e.start),end:t.toDate(e.end),startStr:t.formatIso(e.start,{omitTime:n}),endStr:t.formatIso(e.end,{omitTime:n})}}function Bn(e,t,n){var r=an({editable:!1},n),o=ln(r.refined,r.extra,"",e.allDay,!0,n);return{def:o,ui:wn(o,t),instance:Ue(o.defId,e.range),range:e.range,isStart:!0,isEnd:!0}}function zn(e,t,n){n.emitter.trigger("select",r(r({},Vn(e,n)),{jsEvent:t?t.origEvent:null,view:n.viewApi||n.calendarApi.view}))}function Vn(e,t){for(var n,o,i={},a=0,s=t.pluginHooks.dateSpanTransforms;a<s.length;a++){var l=s[a];r(i,l(e,t))}return r(i,(n=e,o=t.dateEnv,r(r({},Un(n.range,o,n.allDay)),{allDay:n.allDay}))),i}function Fn(e,t,n){var r=n.dateEnv,o=n.options,i=t;return e?(i=Pe(i),i=r.add(i,o.defaultAllDayEventDuration)):i=r.add(i,o.defaultTimedEventDuration),i}function jn(e,t,n,r){var o=Rn(e.defs,t),i={defs:{},instances:{}};for(var a in e.defs){var s=e.defs[a];i.defs[a]=Gn(s,o[a],n,r)}for(var l in e.instances){var u=e.instances[l];s=i.defs[u.defId];i.instances[l]=qn(u,s,o[u.defId],n,r)}return i}function Gn(e,t,n,o){var i=n.standardProps||{};null==i.hasEnd&&t.durationEditable&&(n.startDelta||n.endDelta)&&(i.hasEnd=!0);var a=r(r(r({},e),i),{ui:r(r({},e.ui),i.ui)});n.extendedProps&&(a.extendedProps=r(r({},a.extendedProps),n.extendedProps));for(var s=0,l=o.pluginHooks.eventDefMutationAppliers;s<l.length;s++){(0,l[s])(a,n,o)}return!a.hasEnd&&o.options.forceEventDuration&&(a.hasEnd=!0),a}function qn(e,t,n,o,i){var a=i.dateEnv,s=o.standardProps&&!0===o.standardProps.allDay,l=o.standardProps&&!1===o.standardProps.hasEnd,u=r({},e);return s&&(u.range=un(u.range)),o.datesDelta&&n.startEditable&&(u.range={start:a.add(u.range.start,o.datesDelta),end:a.add(u.range.end,o.datesDelta)}),o.startDelta&&n.durationEditable&&(u.range={start:a.add(u.range.start,o.startDelta),end:u.range.end}),o.endDelta&&n.durationEditable&&(u.range={start:u.range.start,end:a.add(u.range.end,o.endDelta)}),l&&(u.range={start:u.range.start,end:Fn(t.allDay,u.range.start,i)}),t.allDay&&(u.range={start:Pe(u.range.start),end:Pe(u.range.end)}),u.range.end<u.range.start&&(u.range.end=Fn(t.allDay,u.range.start,i)),u}var Yn=function(){function e(e,t,n){this.type=e,this.getCurrentData=t,this.dateEnv=n}return Object.defineProperty(e.prototype,"calendar",{get:function(){return this.getCurrentData().calendarApi},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"title",{get:function(){return this.getCurrentData().viewTitle},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"activeStart",{get:function(){return this.dateEnv.toDate(this.getCurrentData().dateProfile.activeRange.start)},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"activeEnd",{get:function(){return this.dateEnv.toDate(this.getCurrentData().dateProfile.activeRange.end)},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"currentStart",{get:function(){return this.dateEnv.toDate(this.getCurrentData().dateProfile.currentRange.start)},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"currentEnd",{get:function(){return this.dateEnv.toDate(this.getCurrentData().dateProfile.currentRange.end)},enumerable:!1,configurable:!0}),e.prototype.getOption=function(e){return this.getCurrentData().options[e]},e}(),Zn={id:String,defaultAllDay:Boolean,url:String,events:Vt,eventDataTransform:Vt,success:Vt,failure:Vt};function Xn(e,t,n){var r;if(void 0===n&&(n=Kn(t)),"string"==typeof e?r={url:e}:"function"==typeof e||Array.isArray(e)?r={events:e}:"object"==typeof e&&e&&(r=e),r){var o=zt(r,n),i=o.refined,a=o.extra,s=function(e,t){for(var n=t.pluginHooks.eventSourceDefs,r=n.length-1;r>=0;r--){var o=n[r].parseMeta(e);if(o)return{sourceDefId:r,meta:o}}return null}(i,t);if(s)return{_raw:e,isFetching:!1,latestFetchId:"",fetchRange:null,defaultAllDay:i.defaultAllDay,eventDataTransform:i.eventDataTransform,success:i.success,failure:i.failure,publicId:i.id||"",sourceId:ae(),sourceDefId:s.sourceDefId,meta:s.meta,ui:Jt(i,t),extendedProps:a}}return null}function Kn(e){return r(r(r({},Kt),Zn),e.pluginHooks.eventSourceRefiners)}function Jn(e,t){return"function"==typeof e&&(e=e()),null==e?t.createNowMarker():t.createMarker(e)}var $n=function(){function e(){}return e.prototype.getCurrentData=function(){return this.currentDataManager.getCurrentData()},e.prototype.dispatch=function(e){return this.currentDataManager.dispatch(e)},Object.defineProperty(e.prototype,"view",{get:function(){return this.getCurrentData().viewApi},enumerable:!1,configurable:!0}),e.prototype.batchRendering=function(e){e()},e.prototype.updateSize=function(){this.trigger("_resize",!0)},e.prototype.setOption=function(e,t){this.dispatch({type:"SET_OPTION",optionName:e,rawOptionValue:t})},e.prototype.getOption=function(e){return this.currentDataManager.currentCalendarOptionsInput[e]},e.prototype.getAvailableLocaleCodes=function(){return Object.keys(this.getCurrentData().availableRawLocales)},e.prototype.on=function(e,t){var n=this.currentDataManager;n.currentCalendarOptionsRefiners[e]?n.emitter.on(e,t):console.warn("Unknown listener name '"+e+"'")},e.prototype.off=function(e,t){this.currentDataManager.emitter.off(e,t)},e.prototype.trigger=function(e){for(var t,n=[],r=1;r<arguments.length;r++)n[r-1]=arguments[r];(t=this.currentDataManager.emitter).trigger.apply(t,o([e],n))},e.prototype.changeView=function(e,t){var n=this;this.batchRendering((function(){if(n.unselect(),t)if(t.start&&t.end)n.dispatch({type:"CHANGE_VIEW_TYPE",viewType:e}),n.dispatch({type:"SET_OPTION",optionName:"visibleRange",rawOptionValue:t});else{var r=n.getCurrentData().dateEnv;n.dispatch({type:"CHANGE_VIEW_TYPE",viewType:e,dateMarker:r.createMarker(t)})}else n.dispatch({type:"CHANGE_VIEW_TYPE",viewType:e})}))},e.prototype.zoomTo=function(e,t){var n;t=t||"day",n=this.getCurrentData().viewSpecs[t]||this.getUnitViewSpec(t),this.unselect(),n?this.dispatch({type:"CHANGE_VIEW_TYPE",viewType:n.type,dateMarker:e}):this.dispatch({type:"CHANGE_DATE",dateMarker:e})},e.prototype.getUnitViewSpec=function(e){var t,n,r=this.getCurrentData(),o=r.viewSpecs,i=r.toolbarConfig,a=[].concat(i.viewsWithButtons);for(var s in o)a.push(s);for(t=0;t<a.length;t++)if((n=o[a[t]])&&n.singleUnit===e)return n},e.prototype.prev=function(){this.unselect(),this.dispatch({type:"PREV"})},e.prototype.next=function(){this.unselect(),this.dispatch({type:"NEXT"})},e.prototype.prevYear=function(){var e=this.getCurrentData();this.unselect(),this.dispatch({type:"CHANGE_DATE",dateMarker:e.dateEnv.addYears(e.currentDate,-1)})},e.prototype.nextYear=function(){var e=this.getCurrentData();this.unselect(),this.dispatch({type:"CHANGE_DATE",dateMarker:e.dateEnv.addYears(e.currentDate,1)})},e.prototype.today=function(){var e=this.getCurrentData();this.unselect(),this.dispatch({type:"CHANGE_DATE",dateMarker:Jn(e.calendarOptions.now,e.dateEnv)})},e.prototype.gotoDate=function(e){var t=this.getCurrentData();this.unselect(),this.dispatch({type:"CHANGE_DATE",dateMarker:t.dateEnv.createMarker(e)})},e.prototype.incrementDate=function(e){var t=this.getCurrentData(),n=tt(e);n&&(this.unselect(),this.dispatch({type:"CHANGE_DATE",dateMarker:t.dateEnv.add(t.currentDate,n)}))},e.prototype.getDate=function(){var e=this.getCurrentData();return e.dateEnv.toDate(e.currentDate)},e.prototype.formatDate=function(e,t){var n=this.getCurrentData().dateEnv;return n.format(n.createMarker(e),Nt(t))},e.prototype.formatRange=function(e,t,n){var r=this.getCurrentData().dateEnv;return r.formatRange(r.createMarker(e),r.createMarker(t),Nt(n),n)},e.prototype.formatIso=function(e,t){var n=this.getCurrentData().dateEnv;return n.formatIso(n.createMarker(e),{omitTime:t})},e.prototype.select=function(e,t){var n;n=null==t?null!=e.start?e:{start:e,end:null}:{start:e,end:t};var r=this.getCurrentData(),o=Wn(n,r.dateEnv,tt({days:1}));o&&(this.dispatch({type:"SELECT_DATES",selection:o}),zn(o,null,r))},e.prototype.unselect=function(e){var t=this.getCurrentData();t.dateSelection&&(this.dispatch({type:"UNSELECT_DATES"}),function(e,t){t.emitter.trigger("unselect",{jsEvent:e?e.origEvent:null,view:t.viewApi||t.calendarApi.view})}(e,t))},e.prototype.addEvent=function(e,t){if(e instanceof Qn){var n=e._def,r=e._instance;return this.getCurrentData().eventStore.defs[n.defId]||(this.dispatch({type:"ADD_EVENTS",eventStore:jt({def:n,instance:r})}),this.triggerEventAdd(e)),e}var o,i=this.getCurrentData();if(t instanceof L)o=t.internalEventSource;else if("boolean"==typeof t)t&&(o=Ge(i.eventSources)[0]);else if(null!=t){var a=this.getEventSourceById(t);if(!a)return console.warn('Could not find an event source with ID "'+t+'"'),null;o=a.internalEventSource}var s=on(e,o,i,!1);if(s){var l=new Qn(i,s.def,s.def.recurringDef?null:s.instance);return this.dispatch({type:"ADD_EVENTS",eventStore:jt(s)}),this.triggerEventAdd(l),l}return null},e.prototype.triggerEventAdd=function(e){var t=this;this.getCurrentData().emitter.trigger("eventAdd",{event:e,relatedEvents:[],revert:function(){t.dispatch({type:"REMOVE_EVENTS",eventStore:er(e)})}})},e.prototype.getEventById=function(e){var t=this.getCurrentData(),n=t.eventStore,r=n.defs,o=n.instances;for(var i in e=String(e),r){var a=r[i];if(a.publicId===e){if(a.recurringDef)return new Qn(t,a,null);for(var s in o){var l=o[s];if(l.defId===a.defId)return new Qn(t,a,l)}}}return null},e.prototype.getEvents=function(){var e=this.getCurrentData();return tr(e.eventStore,e)},e.prototype.removeAllEvents=function(){this.dispatch({type:"REMOVE_ALL_EVENTS"})},e.prototype.getEventSources=function(){var e=this.getCurrentData(),t=e.eventSources,n=[];for(var r in t)n.push(new L(e,t[r]));return n},e.prototype.getEventSourceById=function(e){var t=this.getCurrentData(),n=t.eventSources;for(var r in e=String(e),n)if(n[r].publicId===e)return new L(t,n[r]);return null},e.prototype.addEventSource=function(e){var t=this.getCurrentData();if(e instanceof L)return t.eventSources[e.internalEventSource.sourceId]||this.dispatch({type:"ADD_EVENT_SOURCES",sources:[e.internalEventSource]}),e;var n=Xn(e,t);return n?(this.dispatch({type:"ADD_EVENT_SOURCES",sources:[n]}),new L(t,n)):null},e.prototype.removeAllEventSources=function(){this.dispatch({type:"REMOVE_ALL_EVENT_SOURCES"})},e.prototype.refetchEvents=function(){this.dispatch({type:"FETCH_EVENT_SOURCES"})},e.prototype.scrollToTime=function(e){var t=tt(e);t&&this.trigger("_scrollRequest",{time:t})},e}(),Qn=function(){function e(e,t,n){this._context=e,this._def=t,this._instance=n||null}return e.prototype.setProp=function(e,t){var n,r;if(e in nn)console.warn("Could not set date-related prop 'name'. Use one of the date-related methods instead.");else if(e in tn)t=tn[e](t),this.mutate({standardProps:(n={},n[e]=t,n)});else if(e in Kt){var o=Kt[e](t);"color"===e?o={backgroundColor:t,borderColor:t}:"editable"===e?o={startEditable:t,durationEditable:t}:((r={})[e]=t,o=r),this.mutate({standardProps:{ui:o}})}else console.warn("Could not set prop '"+e+"'. Use setExtendedProp instead.")},e.prototype.setExtendedProp=function(e,t){var n;this.mutate({extendedProps:(n={},n[e]=t,n)})},e.prototype.setStart=function(e,t){void 0===t&&(t={});var n=this._context.dateEnv,r=n.createMarker(e);if(r&&this._instance){var o=pn(this._instance.range.start,r,n,t.granularity);t.maintainDuration?this.mutate({datesDelta:o}):this.mutate({startDelta:o})}},e.prototype.setEnd=function(e,t){void 0===t&&(t={});var n,r=this._context.dateEnv;if((null==e||(n=r.createMarker(e)))&&this._instance)if(n){var o=pn(this._instance.range.end,n,r,t.granularity);this.mutate({endDelta:o})}else this.mutate({standardProps:{hasEnd:!1}})},e.prototype.setDates=function(e,t,n){void 0===n&&(n={});var r,o,i,a=this._context.dateEnv,s={allDay:n.allDay},l=a.createMarker(e);if(l&&((null==t||(r=a.createMarker(t)))&&this._instance)){var u=this._instance.range;!0===n.allDay&&(u=un(u));var c=pn(u.start,l,a,n.granularity);if(r){var d=pn(u.end,r,a,n.granularity);i=d,(o=c).years===i.years&&o.months===i.months&&o.days===i.days&&o.milliseconds===i.milliseconds?this.mutate({datesDelta:c,standardProps:s}):this.mutate({startDelta:c,endDelta:d,standardProps:s})}else s.hasEnd=!1,this.mutate({datesDelta:c,standardProps:s})}},e.prototype.moveStart=function(e){var t=tt(e);t&&this.mutate({startDelta:t})},e.prototype.moveEnd=function(e){var t=tt(e);t&&this.mutate({endDelta:t})},e.prototype.moveDates=function(e){var t=tt(e);t&&this.mutate({datesDelta:t})},e.prototype.setAllDay=function(e,t){void 0===t&&(t={});var n={allDay:e},r=t.maintainDuration;null==r&&(r=this._context.options.allDayMaintainDuration),this._def.allDay!==e&&(n.hasEnd=r),this.mutate({standardProps:n})},e.prototype.formatRange=function(e){var t=this._context.dateEnv,n=this._instance,r=Nt(e);return this._def.hasEnd?t.formatRange(n.range.start,n.range.end,r,{forcedStartTzo:n.forcedStartTzo,forcedEndTzo:n.forcedEndTzo}):t.format(n.range.start,r,{forcedTzo:n.forcedStartTzo})},e.prototype.mutate=function(t){var n=this._instance;if(n){var r=this._def,o=this._context,i=Gt(o.getCurrentData().eventStore,n.instanceId);i=jn(i,{"":{display:"",startEditable:!0,durationEditable:!0,constraints:[],overlap:null,allows:[],backgroundColor:"",borderColor:"",textColor:"",classNames:[]}},t,o);var a=new e(o,r,n);this._def=i.defs[r.defId],this._instance=i.instances[n.instanceId],o.dispatch({type:"MERGE_EVENTS",eventStore:i}),o.emitter.trigger("eventChange",{oldEvent:a,event:this,relatedEvents:tr(i,o,n),revert:function(){o.dispatch({type:"REMOVE_EVENTS",eventStore:i})}})}},e.prototype.remove=function(){var e=this._context,t=er(this);e.dispatch({type:"REMOVE_EVENTS",eventStore:t}),e.emitter.trigger("eventRemove",{event:this,relatedEvents:[],revert:function(){e.dispatch({type:"MERGE_EVENTS",eventStore:t})}})},Object.defineProperty(e.prototype,"source",{get:function(){var e=this._def.sourceId;return e?new L(this._context,this._context.getCurrentData().eventSources[e]):null},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"start",{get:function(){return this._instance?this._context.dateEnv.toDate(this._instance.range.start):null},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"end",{get:function(){return this._instance&&this._def.hasEnd?this._context.dateEnv.toDate(this._instance.range.end):null},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"startStr",{get:function(){var e=this._instance;return e?this._context.dateEnv.formatIso(e.range.start,{omitTime:this._def.allDay,forcedTzo:e.forcedStartTzo}):""},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"endStr",{get:function(){var e=this._instance;return e&&this._def.hasEnd?this._context.dateEnv.formatIso(e.range.end,{omitTime:this._def.allDay,forcedTzo:e.forcedEndTzo}):""},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"id",{get:function(){return this._def.publicId},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"groupId",{get:function(){return this._def.groupId},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"allDay",{get:function(){return this._def.allDay},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"title",{get:function(){return this._def.title},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"url",{get:function(){return this._def.url},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"display",{get:function(){return this._def.ui.display||"auto"},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"startEditable",{get:function(){return this._def.ui.startEditable},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"durationEditable",{get:function(){return this._def.ui.durationEditable},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"constraint",{get:function(){return this._def.ui.constraints[0]||null},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"overlap",{get:function(){return this._def.ui.overlap},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"allow",{get:function(){return this._def.ui.allows[0]||null},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"backgroundColor",{get:function(){return this._def.ui.backgroundColor},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"borderColor",{get:function(){return this._def.ui.borderColor},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"textColor",{get:function(){return this._def.ui.textColor},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"classNames",{get:function(){return this._def.ui.classNames},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"extendedProps",{get:function(){return this._def.extendedProps},enumerable:!1,configurable:!0}),e.prototype.toPlainObject=function(e){void 0===e&&(e={});var t=this._def,n=t.ui,o=this.startStr,i=this.endStr,a={};return t.title&&(a.title=t.title),o&&(a.start=o),i&&(a.end=i),t.publicId&&(a.id=t.publicId),t.groupId&&(a.groupId=t.groupId),t.url&&(a.url=t.url),n.display&&"auto"!==n.display&&(a.display=n.display),e.collapseColor&&n.backgroundColor&&n.backgroundColor===n.borderColor?a.color=n.backgroundColor:(n.backgroundColor&&(a.backgroundColor=n.backgroundColor),n.borderColor&&(a.borderColor=n.borderColor)),n.textColor&&(a.textColor=n.textColor),n.classNames.length&&(a.classNames=n.classNames),Object.keys(t.extendedProps).length&&(e.collapseExtendedProps?r(a,t.extendedProps):a.extendedProps=t.extendedProps),a},e.prototype.toJSON=function(){return this.toPlainObject()},e}();function er(e){var t,n,r=e._def,o=e._instance;return{defs:(t={},t[r.defId]=r,t),instances:o?(n={},n[o.instanceId]=o,n):{}}}function tr(e,t,n){var r=e.defs,o=e.instances,i=[],a=n?n.instanceId:"";for(var s in o){var l=o[s],u=r[l.defId];l.instanceId!==a&&i.push(new Qn(t,u,l))}return i}var nr={};var rr,or=function(){function e(){}return e.prototype.getMarkerYear=function(e){return e.getUTCFullYear()},e.prototype.getMarkerMonth=function(e){return e.getUTCMonth()},e.prototype.getMarkerDay=function(e){return e.getUTCDate()},e.prototype.arrayToMarker=function(e){return We(e)},e.prototype.markerToArray=function(e){return Oe(e)},e}();rr=or,nr["gregory"]=rr;var ir=/^\s*(\d{4})(-(\d{2})(-(\d{2})([T ](\d{2}):(\d{2})(:(\d{2})(\.(\d+))?)?(Z|(([-+])(\d{2})(:?(\d{2}))?))?)?)?)?$/;function ar(e){var t=ir.exec(e);if(t){var n=new Date(Date.UTC(Number(t[1]),t[3]?Number(t[3])-1:0,Number(t[5]||1),Number(t[7]||0),Number(t[8]||0),Number(t[10]||0),t[12]?1e3*Number("0."+t[12]):0));if(Ae(n)){var r=null;return t[13]&&(r=("-"===t[15]?-1:1)*(60*Number(t[16]||0)+Number(t[18]||0))),{marker:n,isTimeUnspecified:!t[6],timeZoneOffset:r}}}return null}var sr=function(){function e(e){var t=this.timeZone=e.timeZone,n="local"!==t&&"UTC"!==t;e.namedTimeZoneImpl&&n&&(this.namedTimeZoneImpl=new e.namedTimeZoneImpl(t)),this.canComputeOffset=Boolean(!n||this.namedTimeZoneImpl),this.calendarSystem=function(e){return new nr[e]}(e.calendarSystem),this.locale=e.locale,this.weekDow=e.locale.week.dow,this.weekDoy=e.locale.week.doy,"ISO"===e.weekNumberCalculation&&(this.weekDow=1,this.weekDoy=4),"number"==typeof e.firstDay&&(this.weekDow=e.firstDay),"function"==typeof e.weekNumberCalculation&&(this.weekNumberFunc=e.weekNumberCalculation),this.weekText=null!=e.weekText?e.weekText:e.locale.options.weekText,this.cmdFormatter=e.cmdFormatter,this.defaultSeparator=e.defaultSeparator}return e.prototype.createMarker=function(e){var t=this.createMarkerMeta(e);return null===t?null:t.marker},e.prototype.createNowMarker=function(){return this.canComputeOffset?this.timestampToMarker((new Date).valueOf()):We(_e(new Date))},e.prototype.createMarkerMeta=function(e){if("string"==typeof e)return this.parse(e);var t=null;return"number"==typeof e?t=this.timestampToMarker(e):e instanceof Date?(e=e.valueOf(),isNaN(e)||(t=this.timestampToMarker(e))):Array.isArray(e)&&(t=We(e)),null!==t&&Ae(t)?{marker:t,isTimeUnspecified:!1,forcedTzo:null}:null},e.prototype.parse=function(e){var t=ar(e);if(null===t)return null;var n=t.marker,r=null;return null!==t.timeZoneOffset&&(this.canComputeOffset?n=this.timestampToMarker(n.valueOf()-60*t.timeZoneOffset*1e3):r=t.timeZoneOffset),{marker:n,isTimeUnspecified:t.isTimeUnspecified,forcedTzo:r}},e.prototype.getYear=function(e){return this.calendarSystem.getMarkerYear(e)},e.prototype.getMonth=function(e){return this.calendarSystem.getMarkerMonth(e)},e.prototype.add=function(e,t){var n=this.calendarSystem.markerToArray(e);return n[0]+=t.years,n[1]+=t.months,n[2]+=t.days,n[6]+=t.milliseconds,this.calendarSystem.arrayToMarker(n)},e.prototype.subtract=function(e,t){var n=this.calendarSystem.markerToArray(e);return n[0]-=t.years,n[1]-=t.months,n[2]-=t.days,n[6]-=t.milliseconds,this.calendarSystem.arrayToMarker(n)},e.prototype.addYears=function(e,t){var n=this.calendarSystem.markerToArray(e);return n[0]+=t,this.calendarSystem.arrayToMarker(n)},e.prototype.addMonths=function(e,t){var n=this.calendarSystem.markerToArray(e);return n[1]+=t,this.calendarSystem.arrayToMarker(n)},e.prototype.diffWholeYears=function(e,t){var n=this.calendarSystem;return Le(e)===Le(t)&&n.getMarkerDay(e)===n.getMarkerDay(t)&&n.getMarkerMonth(e)===n.getMarkerMonth(t)?n.getMarkerYear(t)-n.getMarkerYear(e):null},e.prototype.diffWholeMonths=function(e,t){var n=this.calendarSystem;return Le(e)===Le(t)&&n.getMarkerDay(e)===n.getMarkerDay(t)?n.getMarkerMonth(t)-n.getMarkerMonth(e)+12*(n.getMarkerYear(t)-n.getMarkerYear(e)):null},e.prototype.greatestWholeUnit=function(e,t){var n=this.diffWholeYears(e,t);return null!==n?{unit:"year",value:n}:null!==(n=this.diffWholeMonths(e,t))?{unit:"month",value:n}:null!==(n=ke(e,t))?{unit:"week",value:n}:null!==(n=Me(e,t))?{unit:"day",value:n}:Se(n=function(e,t){return(t.valueOf()-e.valueOf())/36e5}(e,t))?{unit:"hour",value:n}:Se(n=function(e,t){return(t.valueOf()-e.valueOf())/6e4}(e,t))?{unit:"minute",value:n}:Se(n=function(e,t){return(t.valueOf()-e.valueOf())/1e3}(e,t))?{unit:"second",value:n}:{unit:"millisecond",value:t.valueOf()-e.valueOf()}},e.prototype.countDurationsBetween=function(e,t,n){var r;return n.years&&null!==(r=this.diffWholeYears(e,t))?r/(at(n)/365):n.months&&null!==(r=this.diffWholeMonths(e,t))?r/function(e){return at(e)/30}(n):n.days&&null!==(r=Me(e,t))?r/at(n):(t.valueOf()-e.valueOf())/ut(n)},e.prototype.startOf=function(e,t){return"year"===t?this.startOfYear(e):"month"===t?this.startOfMonth(e):"week"===t?this.startOfWeek(e):"day"===t?Pe(e):"hour"===t?function(e){return We([e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate(),e.getUTCHours()])}(e):"minute"===t?function(e){return We([e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate(),e.getUTCHours(),e.getUTCMinutes()])}(e):"second"===t?function(e){return We([e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate(),e.getUTCHours(),e.getUTCMinutes(),e.getUTCSeconds()])}(e):void 0},e.prototype.startOfYear=function(e){return this.calendarSystem.arrayToMarker([this.calendarSystem.getMarkerYear(e)])},e.prototype.startOfMonth=function(e){return this.calendarSystem.arrayToMarker([this.calendarSystem.getMarkerYear(e),this.calendarSystem.getMarkerMonth(e)])},e.prototype.startOfWeek=function(e){return this.calendarSystem.arrayToMarker([this.calendarSystem.getMarkerYear(e),this.calendarSystem.getMarkerMonth(e),e.getUTCDate()-(e.getUTCDay()-this.weekDow+7)%7])},e.prototype.computeWeekNumber=function(e){return this.weekNumberFunc?this.weekNumberFunc(this.toDate(e)):function(e,t,n){var r=e.getUTCFullYear(),o=Ie(e,r,t,n);if(o<1)return Ie(e,r-1,t,n);var i=Ie(e,r+1,t,n);return i>=1?Math.min(o,i):o}(e,this.weekDow,this.weekDoy)},e.prototype.format=function(e,t,n){return void 0===n&&(n={}),t.format({marker:e,timeZoneOffset:null!=n.forcedTzo?n.forcedTzo:this.offsetForMarker(e)},this)},e.prototype.formatRange=function(e,t,n,r){return void 0===r&&(r={}),r.isEndExclusive&&(t=Re(t,-1)),n.formatRange({marker:e,timeZoneOffset:null!=r.forcedStartTzo?r.forcedStartTzo:this.offsetForMarker(e)},{marker:t,timeZoneOffset:null!=r.forcedEndTzo?r.forcedEndTzo:this.offsetForMarker(t)},this,r.defaultSeparator)},e.prototype.formatIso=function(e,t){void 0===t&&(t={});var n=null;return t.omitTimeZoneOffset||(n=null!=t.forcedTzo?t.forcedTzo:this.offsetForMarker(e)),function(e,t,n){void 0===n&&(n=!1);var r=e.toISOString();return r=r.replace(".000",""),n&&(r=r.replace("T00:00:00Z","")),r.length>10&&(null==t?r=r.replace("Z",""):0!==t&&(r=r.replace("Z",ht(t,!0)))),r}(e,n,t.omitTime)},e.prototype.timestampToMarker=function(e){return"local"===this.timeZone?We(_e(new Date(e))):"UTC"!==this.timeZone&&this.namedTimeZoneImpl?We(this.namedTimeZoneImpl.timestampToArray(e)):new Date(e)},e.prototype.offsetForMarker=function(e){return"local"===this.timeZone?-He(Oe(e)).getTimezoneOffset():"UTC"===this.timeZone?0:this.namedTimeZoneImpl?this.namedTimeZoneImpl.offsetForArray(Oe(e)):null},e.prototype.toDate=function(e,t){return"local"===this.timeZone?He(Oe(e)):"UTC"===this.timeZone?new Date(e.valueOf()):this.namedTimeZoneImpl?new Date(e.valueOf()-1e3*this.namedTimeZoneImpl.offsetForArray(Oe(e))*60):new Date(e.valueOf()-(t||0))},e}(),lr=[],ur={code:"en",week:{dow:0,doy:4},direction:"ltr",buttonText:{prev:"prev",next:"next",prevYear:"prev year",nextYear:"next year",year:"year",today:"today",month:"month",week:"week",day:"day",list:"list"},weekText:"W",allDayText:"all-day",moreLinkText:"more",noEventsText:"No events to display"};function cr(e){for(var t=e.length>0?e[0].code:"en",n=lr.concat(e),r={en:ur},o=0,i=n;o<i.length;o++){var a=i[o];r[a.code]=a}return{map:r,defaultCode:t}}function dr(e,t){return"object"!=typeof e||Array.isArray(e)?function(e,t){var n=[].concat(e||[]),r=function(e,t){for(var n=0;n<e.length;n++)for(var r=e[n].toLocaleLowerCase().split("-"),o=r.length;o>0;o--){var i=r.slice(0,o).join("-");if(t[i])return t[i]}return null}(n,t)||ur;return pr(e,n,r)}(e,t):pr(e.code,[e.code],e)}function pr(e,t,n){var r=ze([ur,n],["buttonText"]);delete r.code;var o=r.week;return delete r.week,{codeArg:e,codes:t,week:o,simpleNumberFormat:new Intl.NumberFormat(e),options:r}}function fr(e){var t=dr(e.locale||"en",cr([]).map);return new sr(r(r({timeZone:Ht.timeZone,calendarSystem:"gregory"},e),{locale:t}))}var hr={startTime:"09:00",endTime:"17:00",daysOfWeek:[1,2,3,4,5],display:"inverse-background",classNames:"fc-non-business",groupId:"_businessHours"};function gr(e,t){return Ft(function(e){var t;t=!0===e?[{}]:Array.isArray(e)?e.filter((function(e){return e.daysOfWeek})):"object"==typeof e&&e?[e]:[];return t=t.map((function(e){return r(r({},hr),e)}))}(e),null,t)}function vr(e,t){return e.left>=t.left&&e.left<t.right&&e.top>=t.top&&e.top<t.bottom}function mr(e,t){var n={left:Math.max(e.left,t.left),right:Math.min(e.right,t.right),top:Math.max(e.top,t.top),bottom:Math.min(e.bottom,t.bottom)};return n.left<n.right&&n.top<n.bottom&&n}function yr(e,t,n){return{left:e.left+t,right:e.right+t,top:e.top+n,bottom:e.bottom+n}}function Sr(e,t){return{left:Math.min(Math.max(e.left,t.left),t.right),top:Math.min(Math.max(e.top,t.top),t.bottom)}}function Er(e){return{left:(e.left+e.right)/2,top:(e.top+e.bottom)/2}}function Cr(e,t){return{left:e.left-t.left,top:e.top-t.top}}var br={defs:{},instances:{}},Dr=function(){function e(){this.getKeysForEventDefs=gt(this._getKeysForEventDefs),this.splitDateSelection=gt(this._splitDateSpan),this.splitEventStore=gt(this._splitEventStore),this.splitIndividualUi=gt(this._splitIndividualUi),this.splitEventDrag=gt(this._splitInteraction),this.splitEventResize=gt(this._splitInteraction),this.eventUiBuilders={}}return e.prototype.splitProps=function(e){var t=this,n=this.getKeyInfo(e),r=this.getKeysForEventDefs(e.eventStore),o=this.splitDateSelection(e.dateSelection),i=this.splitIndividualUi(e.eventUiBases,r),a=this.splitEventStore(e.eventStore,r),s=this.splitEventDrag(e.eventDrag),l=this.splitEventResize(e.eventResize),u={};for(var c in this.eventUiBuilders=Fe(n,(function(e,n){return t.eventUiBuilders[n]||gt(Rr)})),n){var d=n[c],p=a[c]||br,f=this.eventUiBuilders[c];u[c]={businessHours:d.businessHours||e.businessHours,dateSelection:o[c]||null,eventStore:p,eventUiBases:f(e.eventUiBases[""],d.ui,i[c]),eventSelection:p.instances[e.eventSelection]?e.eventSelection:"",eventDrag:s[c]||null,eventResize:l[c]||null}}return u},e.prototype._splitDateSpan=function(e){var t={};if(e)for(var n=0,r=this.getKeysForDateSpan(e);n<r.length;n++){t[r[n]]=e}return t},e.prototype._getKeysForEventDefs=function(e){var t=this;return Fe(e.defs,(function(e){return t.getKeysForEventDef(e)}))},e.prototype._splitEventStore=function(e,t){var n=e.defs,r=e.instances,o={};for(var i in n)for(var a=0,s=t[i];a<s.length;a++){o[p=s[a]]||(o[p]={defs:{},instances:{}}),o[p].defs[i]=n[i]}for(var l in r)for(var u=r[l],c=0,d=t[u.defId];c<d.length;c++){var p;o[p=d[c]]&&(o[p].instances[l]=u)}return o},e.prototype._splitIndividualUi=function(e,t){var n={};for(var r in e)if(r)for(var o=0,i=t[r];o<i.length;o++){var a=i[o];n[a]||(n[a]={}),n[a][r]=e[r]}return n},e.prototype._splitInteraction=function(e){var t={};if(e){var n=this._splitEventStore(e.affectedEvents,this._getKeysForEventDefs(e.affectedEvents)),r=this._getKeysForEventDefs(e.mutatedEvents),o=this._splitEventStore(e.mutatedEvents,r),i=function(r){t[r]||(t[r]={affectedEvents:n[r]||br,mutatedEvents:o[r]||br,isEvent:e.isEvent})};for(var a in n)i(a);for(var a in o)i(a)}return t},e}();function Rr(e,t,n){var o=[];e&&o.push(e),t&&o.push(t);var i={"":$t(o)};return n&&r(i,n),i}function wr(e,t,n,r){return{dow:e.getUTCDay(),isDisabled:Boolean(r&&!Sn(r.activeRange,e)),isOther:Boolean(r&&!Sn(r.currentRange,e)),isToday:Boolean(t&&Sn(t,e)),isPast:Boolean(n?e<n:!!t&&e<t.start),isFuture:Boolean(n?e>n:!!t&&e>=t.end)}}function Tr(e,t){var n=["fc-day","fc-day-"+Ce[e.dow]];return e.isDisabled?n.push("fc-day-disabled"):(e.isToday&&(n.push("fc-day-today"),n.push(t.getClass("today"))),e.isPast&&n.push("fc-day-past"),e.isFuture&&n.push("fc-day-future"),e.isOther&&n.push("fc-day-other")),n}function xr(e,t){var n=["fc-slot","fc-slot-"+Ce[e.dow]];return e.isDisabled?n.push("fc-slot-disabled"):(e.isToday&&(n.push("fc-slot-today"),n.push(t.getClass("today"))),e.isPast&&n.push("fc-slot-past"),e.isFuture&&n.push("fc-slot-future")),n}function kr(e,t){return void 0===t&&(t="day"),JSON.stringify({date:pt(e),type:t})}var Mr,Pr=null;function Ir(){return null===Pr&&(Pr=function(){var e=document.createElement("div");$(e,{position:"absolute",top:-1e3,left:0,border:0,padding:0,overflow:"scroll",direction:"rtl"}),e.innerHTML="<div></div>",document.body.appendChild(e);var t=e.firstChild.getBoundingClientRect().left>e.getBoundingClientRect().left;return V(e),t}()),Pr}function Nr(){return Mr||(Mr=function(){var e=document.createElement("div");e.style.overflow="scroll",document.body.appendChild(e);var t=_r(e);return document.body.removeChild(e),t}()),Mr}function _r(e){return{x:e.offsetHeight-e.clientHeight,y:e.offsetWidth-e.clientWidth}}function Hr(e,t){void 0===t&&(t=!1);var n=window.getComputedStyle(e),r=parseInt(n.borderLeftWidth,10)||0,o=parseInt(n.borderRightWidth,10)||0,i=parseInt(n.borderTopWidth,10)||0,a=parseInt(n.borderBottomWidth,10)||0,s=_r(e),l=s.y-r-o,u={borderLeft:r,borderRight:o,borderTop:i,borderBottom:a,scrollbarBottom:s.x-i-a,scrollbarLeft:0,scrollbarRight:0};return Ir()&&"rtl"===n.direction?u.scrollbarLeft=l:u.scrollbarRight=l,t&&(u.paddingLeft=parseInt(n.paddingLeft,10)||0,u.paddingRight=parseInt(n.paddingRight,10)||0,u.paddingTop=parseInt(n.paddingTop,10)||0,u.paddingBottom=parseInt(n.paddingBottom,10)||0),u}function Or(e,t,n){void 0===t&&(t=!1);var r=n?e.getBoundingClientRect():Wr(e),o=Hr(e,t),i={left:r.left+o.borderLeft+o.scrollbarLeft,right:r.right-o.borderRight-o.scrollbarRight,top:r.top+o.borderTop,bottom:r.bottom-o.borderBottom-o.scrollbarBottom};return t&&(i.left+=o.paddingLeft,i.right-=o.paddingRight,i.top+=o.paddingTop,i.bottom-=o.paddingBottom),i}function Wr(e){var t=e.getBoundingClientRect();return{left:t.left+window.pageXOffset,top:t.top+window.pageYOffset,right:t.right+window.pageXOffset,bottom:t.bottom+window.pageYOffset}}function Ar(e){for(var t=[];e instanceof HTMLElement;){var n=window.getComputedStyle(e);if("fixed"===n.position)break;/(auto|scroll)/.test(n.overflow+n.overflowY+n.overflowX)&&t.push(e),e=e.parentNode}return t}function Lr(e,t,n){var r=!1,o=function(){r||(r=!0,t.apply(this,arguments))},i=function(){r||(r=!0,n&&n.apply(this,arguments))},a=e(o,i);a&&"function"==typeof a.then&&a.then(o,i)}var Ur=function(){function e(){this.handlers={},this.thisContext=null}return e.prototype.setThisContext=function(e){this.thisContext=e},e.prototype.setOptions=function(e){this.options=e},e.prototype.on=function(e,t){!function(e,t,n){(e[t]||(e[t]=[])).push(n)}(this.handlers,e,t)},e.prototype.off=function(e,t){!function(e,t,n){n?e[t]&&(e[t]=e[t].filter((function(e){return e!==n}))):delete e[t]}(this.handlers,e,t)},e.prototype.trigger=function(e){for(var t=[],n=1;n<arguments.length;n++)t[n-1]=arguments[n];for(var r=this.handlers[e]||[],o=this.options&&this.options[e],i=[].concat(o||[],r),a=0,s=i;a<s.length;a++){var l=s[a];l.apply(this.thisContext,t)}},e.prototype.hasHandlers=function(e){return this.handlers[e]&&this.handlers[e].length||this.options&&this.options[e]},e}();var Br=function(){function e(e,t,n,r){this.els=t;var o=this.originClientRect=e.getBoundingClientRect();n&&this.buildElHorizontals(o.left),r&&this.buildElVerticals(o.top)}return e.prototype.buildElHorizontals=function(e){for(var t=[],n=[],r=0,o=this.els;r<o.length;r++){var i=o[r].getBoundingClientRect();t.push(i.left-e),n.push(i.right-e)}this.lefts=t,this.rights=n},e.prototype.buildElVerticals=function(e){for(var t=[],n=[],r=0,o=this.els;r<o.length;r++){var i=o[r].getBoundingClientRect();t.push(i.top-e),n.push(i.bottom-e)}this.tops=t,this.bottoms=n},e.prototype.leftToIndex=function(e){var t,n=this.lefts,r=this.rights,o=n.length;for(t=0;t<o;t++)if(e>=n[t]&&e<r[t])return t},e.prototype.topToIndex=function(e){var t,n=this.tops,r=this.bottoms,o=n.length;for(t=0;t<o;t++)if(e>=n[t]&&e<r[t])return t},e.prototype.getWidth=function(e){return this.rights[e]-this.lefts[e]},e.prototype.getHeight=function(e){return this.bottoms[e]-this.tops[e]},e}(),zr=function(){function e(){}return e.prototype.getMaxScrollTop=function(){return this.getScrollHeight()-this.getClientHeight()},e.prototype.getMaxScrollLeft=function(){return this.getScrollWidth()-this.getClientWidth()},e.prototype.canScrollVertically=function(){return this.getMaxScrollTop()>0},e.prototype.canScrollHorizontally=function(){return this.getMaxScrollLeft()>0},e.prototype.canScrollUp=function(){return this.getScrollTop()>0},e.prototype.canScrollDown=function(){return this.getScrollTop()<this.getMaxScrollTop()},e.prototype.canScrollLeft=function(){return this.getScrollLeft()>0},e.prototype.canScrollRight=function(){return this.getScrollLeft()<this.getMaxScrollLeft()},e}(),Vr=function(e){function t(t){var n=e.call(this)||this;return n.el=t,n}return n(t,e),t.prototype.getScrollTop=function(){return this.el.scrollTop},t.prototype.getScrollLeft=function(){return this.el.scrollLeft},t.prototype.setScrollTop=function(e){this.el.scrollTop=e},t.prototype.setScrollLeft=function(e){this.el.scrollLeft=e},t.prototype.getScrollWidth=function(){return this.el.scrollWidth},t.prototype.getScrollHeight=function(){return this.el.scrollHeight},t.prototype.getClientHeight=function(){return this.el.clientHeight},t.prototype.getClientWidth=function(){return this.el.clientWidth},t}(zr),Fr=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.getScrollTop=function(){return window.pageYOffset},t.prototype.getScrollLeft=function(){return window.pageXOffset},t.prototype.setScrollTop=function(e){window.scroll(window.pageXOffset,e)},t.prototype.setScrollLeft=function(e){window.scroll(e,window.pageYOffset)},t.prototype.getScrollWidth=function(){return document.documentElement.scrollWidth},t.prototype.getScrollHeight=function(){return document.documentElement.scrollHeight},t.prototype.getClientHeight=function(){return document.documentElement.clientHeight},t.prototype.getClientWidth=function(){return document.documentElement.clientWidth},t}(zr),jr=function(){function e(e){this.iconOverrideOption&&this.setIconOverride(e[this.iconOverrideOption])}return e.prototype.setIconOverride=function(e){var t,n;if("object"==typeof e&&e){for(n in t=r({},this.iconClasses),e)t[n]=this.applyIconOverridePrefix(e[n]);this.iconClasses=t}else!1===e&&(this.iconClasses={})},e.prototype.applyIconOverridePrefix=function(e){var t=this.iconOverridePrefix;return t&&0!==e.indexOf(t)&&(e=t+e),e},e.prototype.getClass=function(e){return this.classes[e]||""},e.prototype.getIconClass=function(e,t){var n;return(n=t&&this.rtlIconClasses&&this.rtlIconClasses[e]||this.iconClasses[e])?this.baseIconClass+" "+n:""},e.prototype.getCustomButtonIconClass=function(e){var t;return this.iconOverrideCustomButtonOption&&(t=e[this.iconOverrideCustomButtonOption])?this.baseIconClass+" "+this.applyIconOverridePrefix(t):""},e}();if(jr.prototype.classes={},jr.prototype.iconClasses={},jr.prototype.baseIconClass="",jr.prototype.iconOverridePrefix="","undefined"==typeof FullCalendarVDom)throw new Error("Please import the top-level fullcalendar lib before attempting to import a plugin.");var Gr=FullCalendarVDom.Component,qr=FullCalendarVDom.createElement,Yr=FullCalendarVDom.render,Zr=FullCalendarVDom.createRef,Xr=FullCalendarVDom.Fragment,Kr=FullCalendarVDom.createContext,Jr=FullCalendarVDom.flushToDom,$r=function(){function e(e,t,n){var o=this;this.execFunc=e,this.emitter=t,this.scrollTime=n,this.handleScrollRequest=function(e){o.queuedRequest=r({},o.queuedRequest||{},e),o.drain()},t.on("_scrollRequest",this.handleScrollRequest),this.fireInitialScroll()}return e.prototype.detach=function(){this.emitter.off("_scrollRequest",this.handleScrollRequest)},e.prototype.update=function(e){e?this.fireInitialScroll():this.drain()},e.prototype.fireInitialScroll=function(){this.handleScrollRequest({time:this.scrollTime})},e.prototype.drain=function(){this.queuedRequest&&this.execFunc(this.queuedRequest)&&(this.queuedRequest=null)},e}(),Qr=Kr({});function eo(e,t,n,r,o,i,a,s,l,u,c,d,p){return{dateEnv:o,options:n,pluginHooks:a,emitter:u,dispatch:s,getCurrentData:l,calendarApi:c,viewSpec:e,viewApi:t,dateProfileGenerator:r,theme:i,isRtl:"rtl"===n.direction,addResizeHandler:function(e){u.on("_resize",e)},removeResizeHandler:function(e){u.off("_resize",e)},createScrollResponder:function(e){return new $r(e,u,tt(n.scrollTime))},registerInteractiveComponent:d,unregisterInteractiveComponent:p}}var to=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.shouldComponentUpdate=function(e,t){return this.debug&&console.log(Ye(e,this.props),Ye(t,this.state)),!Ze(this.props,e,this.propEquality)||!Ze(this.state,t,this.stateEquality)},t.addPropsEquality=ro,t.addStateEquality=oo,t.contextType=Qr,t}(Gr);to.prototype.propEquality={},to.prototype.stateEquality={};var no=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.contextType=Qr,t}(to);function ro(e){var t=Object.create(this.prototype.propEquality);r(t,e),this.prototype.propEquality=t}function oo(e){var t=Object.create(this.prototype.stateEquality);r(t,e),this.prototype.stateEquality=t}function io(e,t){"function"==typeof e?e(t):e&&(e.current=t)}function ao(e,t,n,r,o){switch(t.type){case"RECEIVE_EVENTS":return function(e,t,n,r,o,i){if(t&&n===t.latestFetchId){var a=Ft(function(e,t,n){var r=n.options.eventDataTransform,o=t?t.eventDataTransform:null;o&&(e=so(e,o));r&&(e=so(e,r));return e}(o,t,i),t,i);return r&&(a=Je(a,r,i)),Yt(lo(e,t.sourceId),a)}return e}(e,n[t.sourceId],t.fetchId,t.fetchRange,t.rawEvents,o);case"ADD_EVENTS":return function(e,t,n,r){n&&(t=Je(t,n,r));return Yt(e,t)}(e,t.eventStore,r?r.activeRange:null,o);case"MERGE_EVENTS":return Yt(e,t.eventStore);case"PREV":case"NEXT":case"CHANGE_DATE":case"CHANGE_VIEW_TYPE":return r?Je(e,r.activeRange,o):e;case"REMOVE_EVENTS":return function(e,t){var n=e.defs,r=e.instances,o={},i={};for(var a in n)t.defs[a]||(o[a]=n[a]);for(var s in r)!t.instances[s]&&o[r[s].defId]&&(i[s]=r[s]);return{defs:o,instances:i}}(e,t.eventStore);case"REMOVE_EVENT_SOURCE":return lo(e,t.sourceId);case"REMOVE_ALL_EVENT_SOURCES":return Zt(e,(function(e){return!e.sourceId}));case"REMOVE_ALL_EVENTS":return{defs:{},instances:{}};default:return e}}function so(e,t){var n;if(t){n=[];for(var r=0,o=e;r<o.length;r++){var i=o[r],a=t(i);a?n.push(a):null==a&&n.push(i)}}else n=e;return n}function lo(e,t){return Zt(e,(function(e){return e.sourceId!==t}))}function uo(e,t){return co({eventDrag:e},t)}function co(e,t){var n=t.getCurrentData(),o=r({businessHours:n.businessHours,dateSelection:"",eventStore:n.eventStore,eventUiBases:n.eventUiBases,eventSelection:"",eventDrag:null,eventResize:null},e);return(t.pluginHooks.isPropsValid||po)(o,t)}function po(e,t,n,o){return void 0===n&&(n={}),!(e.eventDrag&&!function(e,t,n,o){var i=t.getCurrentData(),a=e.eventDrag,s=a.mutatedEvents,l=s.defs,u=s.instances,c=Rn(l,a.isEvent?e.eventUiBases:{"":i.selectionConfig});o&&(c=Fe(c,o));var d=(g=e.eventStore,v=a.affectedEvents.instances,{defs:g.defs,instances:Ve(g.instances,(function(e){return!v[e.instanceId]}))}),p=d.defs,f=d.instances,h=Rn(p,e.eventUiBases);var g,v;for(var m in u){var y=u[m],S=y.range,E=c[y.defId],C=l[y.defId];if(!fo(E.constraints,S,d,e.businessHours,t))return!1;var b=t.options.eventOverlap,D="function"==typeof b?b:null;for(var R in f){var w=f[R];if(mn(S,w.range)){if(!1===h[w.defId].overlap&&a.isEvent)return!1;if(!1===E.overlap)return!1;if(D&&!D(new Qn(t,p[w.defId],w),new Qn(t,C,y)))return!1}}for(var T=i.eventStore,x=0,k=E.allows;x<k.length;x++){var M=k[x],P=r(r({},n),{range:y.range,allDay:C.allDay}),I=T.defs[C.defId],N=T.instances[m],_=void 0;if(_=I?new Qn(t,I,N):new Qn(t,C),!M(Vn(P,t),_))return!1}}return!0}(e,t,n,o))&&!(e.dateSelection&&!function(e,t,n,o){var i=e.eventStore,a=i.defs,s=i.instances,l=e.dateSelection,u=l.range,c=t.getCurrentData().selectionConfig;o&&(c=o(c));if(!fo(c.constraints,u,i,e.businessHours,t))return!1;var d=t.options.selectOverlap,p="function"==typeof d?d:null;for(var f in s){var h=s[f];if(mn(u,h.range)){if(!1===c.overlap)return!1;if(p&&!p(new Qn(t,a[h.defId],h),null))return!1}}for(var g=0,v=c.allows;g<v.length;g++){var m=v[g],y=r(r({},n),l);if(!m(Vn(y,t),null))return!1}return!0}(e,t,n,o))}function fo(e,t,n,r,o){for(var i=0,a=e;i<a.length;i++){if(!vo(ho(a[i],t,n,r,o),t))return!1}return!0}function ho(e,t,n,r,o){return"businessHours"===e?go(Je(r,t,o)):"string"==typeof e?go(Zt(n,(function(t){return t.groupId===e}))):"object"==typeof e&&e?go(Je(e,t,o)):[]}function go(e){var t=e.instances,n=[];for(var r in t)n.push(t[r].range);return n}function vo(e,t){for(var n=0,r=e;n<r.length;n++){if(yn(r[n],t))return!0}return!1}var mo=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.uid=ae(),t}return n(t,e),t.prototype.prepareHits=function(){},t.prototype.queryHit=function(e,t,n,r){return null},t.prototype.isInteractionValid=function(e){var t=this.props.dateProfile,n=e.mutatedEvents.instances;if(t)for(var r in n)if(!yn(t.validRange,n[r].range))return!1;return uo(e,this.context)},t.prototype.isDateSelectionValid=function(e){var t,n,r=this.props.dateProfile;return!(r&&!yn(r.validRange,e.range))&&(t=e,n=this.context,co({dateSelection:t},n))},t.prototype.isValidSegDownEl=function(e){return!this.props.eventDrag&&!this.props.eventResize&&!Y(e,".fc-event-mirror")&&(this.isPopover()||!this.isInPopover(e))},t.prototype.isValidDateDownEl=function(e){return!(Y(e,".fc-event:not(.fc-bg-event)")||Y(e,".fc-daygrid-more-link")||Y(e,"a[data-navlink]")||this.isInPopover(e))},t.prototype.isPopover=function(){return!1},t.prototype.isInPopover=function(e){return Boolean(Y(e,".fc-popover"))},t}(no);function yo(e){return{id:ae(),deps:e.deps||[],reducers:e.reducers||[],contextInit:[].concat(e.contextInit||[]),eventRefiners:e.eventRefiners||{},eventDefMemberAdders:e.eventDefMemberAdders||[],eventSourceRefiners:e.eventSourceRefiners||{},isDraggableTransformers:e.isDraggableTransformers||[],eventDragMutationMassagers:e.eventDragMutationMassagers||[],eventDefMutationAppliers:e.eventDefMutationAppliers||[],dateSelectionTransformers:e.dateSelectionTransformers||[],datePointTransforms:e.datePointTransforms||[],dateSpanTransforms:e.dateSpanTransforms||[],views:e.views||{},viewPropsTransformers:e.viewPropsTransformers||[],isPropsValid:e.isPropsValid||null,externalDefTransforms:e.externalDefTransforms||[],eventResizeJoinTransforms:e.eventResizeJoinTransforms||[],viewContainerAppends:e.viewContainerAppends||[],eventDropTransformers:e.eventDropTransformers||[],componentInteractions:e.componentInteractions||[],calendarInteractions:e.calendarInteractions||[],themeClasses:e.themeClasses||{},eventSourceDefs:e.eventSourceDefs||[],cmdFormatter:e.cmdFormatter,recurringTypes:e.recurringTypes||[],namedTimeZonedImpl:e.namedTimeZonedImpl,initialView:e.initialView||"",elementDraggingImpl:e.elementDraggingImpl,optionChangeHandlers:e.optionChangeHandlers||{},scrollGridImpl:e.scrollGridImpl||null,contentTypeHandlers:e.contentTypeHandlers||{},listenerRefiners:e.listenerRefiners||{},optionRefiners:e.optionRefiners||{},propSetHandlers:e.propSetHandlers||{}}}function So(){var e,t=[],n=[];return function(o,i){return e&&B(o,t)&&B(i,n)||(e=function(e,t){var n={},o={reducers:[],contextInit:[],eventRefiners:{},eventDefMemberAdders:[],eventSourceRefiners:{},isDraggableTransformers:[],eventDragMutationMassagers:[],eventDefMutationAppliers:[],dateSelectionTransformers:[],datePointTransforms:[],dateSpanTransforms:[],views:{},viewPropsTransformers:[],isPropsValid:null,externalDefTransforms:[],eventResizeJoinTransforms:[],viewContainerAppends:[],eventDropTransformers:[],componentInteractions:[],calendarInteractions:[],themeClasses:{},eventSourceDefs:[],cmdFormatter:null,recurringTypes:[],namedTimeZonedImpl:null,initialView:"",elementDraggingImpl:null,optionChangeHandlers:{},scrollGridImpl:null,contentTypeHandlers:{},listenerRefiners:{},optionRefiners:{},propSetHandlers:{}};function i(e){for(var t=0,a=e;t<a.length;t++){var s=a[t];n[s.id]||(n[s.id]=!0,i(s.deps),u=s,o={reducers:(l=o).reducers.concat(u.reducers),contextInit:l.contextInit.concat(u.contextInit),eventRefiners:r(r({},l.eventRefiners),u.eventRefiners),eventDefMemberAdders:l.eventDefMemberAdders.concat(u.eventDefMemberAdders),eventSourceRefiners:r(r({},l.eventSourceRefiners),u.eventSourceRefiners),isDraggableTransformers:l.isDraggableTransformers.concat(u.isDraggableTransformers),eventDragMutationMassagers:l.eventDragMutationMassagers.concat(u.eventDragMutationMassagers),eventDefMutationAppliers:l.eventDefMutationAppliers.concat(u.eventDefMutationAppliers),dateSelectionTransformers:l.dateSelectionTransformers.concat(u.dateSelectionTransformers),datePointTransforms:l.datePointTransforms.concat(u.datePointTransforms),dateSpanTransforms:l.dateSpanTransforms.concat(u.dateSpanTransforms),views:r(r({},l.views),u.views),viewPropsTransformers:l.viewPropsTransformers.concat(u.viewPropsTransformers),isPropsValid:u.isPropsValid||l.isPropsValid,externalDefTransforms:l.externalDefTransforms.concat(u.externalDefTransforms),eventResizeJoinTransforms:l.eventResizeJoinTransforms.concat(u.eventResizeJoinTransforms),viewContainerAppends:l.viewContainerAppends.concat(u.viewContainerAppends),eventDropTransformers:l.eventDropTransformers.concat(u.eventDropTransformers),calendarInteractions:l.calendarInteractions.concat(u.calendarInteractions),componentInteractions:l.componentInteractions.concat(u.componentInteractions),themeClasses:r(r({},l.themeClasses),u.themeClasses),eventSourceDefs:l.eventSourceDefs.concat(u.eventSourceDefs),cmdFormatter:u.cmdFormatter||l.cmdFormatter,recurringTypes:l.recurringTypes.concat(u.recurringTypes),namedTimeZonedImpl:u.namedTimeZonedImpl||l.namedTimeZonedImpl,initialView:l.initialView||u.initialView,elementDraggingImpl:l.elementDraggingImpl||u.elementDraggingImpl,optionChangeHandlers:r(r({},l.optionChangeHandlers),u.optionChangeHandlers),scrollGridImpl:u.scrollGridImpl||l.scrollGridImpl,contentTypeHandlers:r(r({},l.contentTypeHandlers),u.contentTypeHandlers),listenerRefiners:r(r({},l.listenerRefiners),u.listenerRefiners),optionRefiners:r(r({},l.optionRefiners),u.optionRefiners),propSetHandlers:r(r({},l.propSetHandlers),u.propSetHandlers)})}var l,u}return e&&i(e),i(t),o}(o,i)),t=o,n=i,e}}var Eo=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t}(jr);function Co(e,t,n,o){if(t[e])return t[e];var i=function(e,t,n,o){var i=n[e],a=o[e],s=function(e){return i&&null!==i[e]?i[e]:a&&null!==a[e]?a[e]:null},l=s("component"),u=s("superType"),c=null;if(u){if(u===e)throw new Error("Can't have a custom view type that references itself");c=Co(u,t,n,o)}!l&&c&&(l=c.component);if(!l)return null;return{type:e,component:l,defaults:r(r({},c?c.defaults:{}),i?i.rawOptions:{}),overrides:r(r({},c?c.overrides:{}),a?a.rawOptions:{})}}(e,t,n,o);return i&&(t[e]=i),i}Eo.prototype.classes={root:"fc-theme-standard",tableCellShaded:"fc-cell-shaded",buttonGroup:"fc-button-group",button:"fc-button fc-button-primary",buttonActive:"fc-button-active"},Eo.prototype.baseIconClass="fc-icon",Eo.prototype.iconClasses={close:"fc-icon-x",prev:"fc-icon-chevron-left",next:"fc-icon-chevron-right",prevYear:"fc-icon-chevrons-left",nextYear:"fc-icon-chevrons-right"},Eo.prototype.rtlIconClasses={prev:"fc-icon-chevron-right",next:"fc-icon-chevron-left",prevYear:"fc-icon-chevrons-right",nextYear:"fc-icon-chevrons-left"},Eo.prototype.iconOverrideOption="buttonIcons",Eo.prototype.iconOverrideCustomButtonOption="icon",Eo.prototype.iconOverridePrefix="fc-icon-";var bo=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.rootElRef=Zr(),t.handleRootEl=function(e){io(t.rootElRef,e),t.props.elRef&&io(t.props.elRef,e)},t}return n(t,e),t.prototype.render=function(){var e=this,t=this.props,n=t.hookProps;return qr(wo,{hookProps:n,didMount:t.didMount,willUnmount:t.willUnmount,elRef:this.handleRootEl},(function(r){return qr(Ro,{hookProps:n,content:t.content,defaultContent:t.defaultContent,backupElRef:e.rootElRef},(function(e,o){return t.children(r,xo(t.classNames,n),e,o)}))}))},t}(no),Do=Kr(0),Ro=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.innerElRef=Zr(),t}return n(t,e),t.prototype.render=function(){var e=this;return qr(Do.Consumer,null,(function(){return e.props.children(e.innerElRef,e.renderInnerContent())}))},t.prototype.componentDidMount=function(){this.updateCustomContent()},t.prototype.componentDidUpdate=function(){this.updateCustomContent()},t.prototype.renderInnerContent=function(){var e=this.context.pluginHooks.contentTypeHandlers,t=this.props,n=this.customContentInfo,r=ko(t.content,t.hookProps),o=null;if(void 0===r&&(r=ko(t.defaultContent,t.hookProps)),void 0!==r){if(n)n.contentVal=r[n.contentKey];else if("object"==typeof r)for(var i in e)if(void 0!==r[i]){n=this.customContentInfo={contentKey:i,contentVal:r[i],handler:e[i]()};break}o=n?[]:r}return o},t.prototype.updateCustomContent=function(){this.customContentInfo&&this.customContentInfo.handler(this.innerElRef.current||this.props.backupElRef.current,this.customContentInfo.contentVal)},t}(no),wo=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.handleRootEl=function(e){t.rootEl=e,t.props.elRef&&io(t.props.elRef,e)},t}return n(t,e),t.prototype.render=function(){return this.props.children(this.handleRootEl)},t.prototype.componentDidMount=function(){var e=this.props.didMount;e&&e(r(r({},this.props.hookProps),{el:this.rootEl}))},t.prototype.componentWillUnmount=function(){var e=this.props.willUnmount;e&&e(r(r({},this.props.hookProps),{el:this.rootEl}))},t}(no);function To(){var e,t,n=[];return function(r,o){return t&&qe(t,o)&&r===e||(e=r,t=o,n=xo(r,o)),n}}function xo(e,t){return"function"==typeof e&&(e=e(t)),Xt(e)}function ko(e,t){return"function"==typeof e?e(t,qr):e}var Mo=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.normalizeClassNames=To(),t}return n(t,e),t.prototype.render=function(){var e=this.props,t=this.context,n=t.options,r={view:t.viewApi},o=this.normalizeClassNames(n.viewClassNames,r);return qr(wo,{hookProps:r,didMount:n.viewDidMount,willUnmount:n.viewWillUnmount,elRef:e.elRef},(function(t){return e.children(t,["fc-"+e.viewSpec.type+"-view","fc-view"].concat(o))}))},t}(no);function Po(e){return Fe(e,Io)}function Io(e){var t,n="function"==typeof e?{component:e}:e,o=n.component;return n.content&&(t=n,o=function(e){return qr(Qr.Consumer,null,(function(n){return qr(Mo,{viewSpec:n.viewSpec},(function(o,i){var a=r(r({},e),{nextDayThreshold:n.options.nextDayThreshold});return qr(bo,{hookProps:a,classNames:t.classNames,content:t.content,didMount:t.didMount,willUnmount:t.willUnmount,elRef:o},(function(e,t,n,r){return qr("div",{className:i.concat(t).join(" "),ref:e},r)}))}))}))}),{superType:n.type,component:o,rawOptions:n}}function No(e,t,n,o){var i=Po(e),a=Po(t.views);return Fe(function(e,t){var n,r={};for(n in e)Co(n,r,e,t);for(n in t)Co(n,r,e,t);return r}(i,a),(function(e){return function(e,t,n,o,i){var a=e.overrides.duration||e.defaults.duration||o.duration||n.duration,s=null,l="",u="",c={};if(a&&(s=function(e){var t=JSON.stringify(e),n=_o[t];void 0===n&&(n=tt(e),_o[t]=n);return n}(a))){var d=dt(s);l=d.unit,1===d.value&&(u=l,c=t[l]?t[l].rawOptions:{})}var p=function(t){var n=t.buttonText||{},r=e.defaults.buttonTextKey;return null!=r&&null!=n[r]?n[r]:null!=n[e.type]?n[e.type]:null!=n[u]?n[u]:void 0};return{type:e.type,component:e.component,duration:s,durationUnit:l,singleUnit:u,optionDefaults:e.defaults,optionOverrides:r(r({},c),e.overrides),buttonTextOverride:p(o)||p(n)||e.overrides.buttonText,buttonTextDefault:p(i)||e.defaults.buttonText||p(Ht)||e.type}}(e,a,t,n,o)}))}var _o={};var Ho=function(){function e(e){this.props=e,this.nowDate=Jn(e.nowInput,e.dateEnv),this.initHiddenDays()}return e.prototype.buildPrev=function(e,t,n){var r=this.props.dateEnv,o=r.subtract(r.startOf(t,e.currentRangeUnit),e.dateIncrement);return this.build(o,-1,n)},e.prototype.buildNext=function(e,t,n){var r=this.props.dateEnv,o=r.add(r.startOf(t,e.currentRangeUnit),e.dateIncrement);return this.build(o,1,n)},e.prototype.build=function(e,t,n){void 0===n&&(n=!0);var r,o,i,a,s,l,u,c,d=this.props;return r=this.buildValidRange(),r=this.trimHiddenDays(r),n&&(u=e,e=null!=(c=r).start&&u<c.start?c.start:null!=c.end&&u>=c.end?new Date(c.end.valueOf()-1):u),o=this.buildCurrentRangeInfo(e,t),i=/^(year|month|week|day)$/.test(o.unit),a=this.buildRenderRange(this.trimHiddenDays(o.range),o.unit,i),s=a=this.trimHiddenDays(a),d.showNonCurrentDates||(s=gn(s,o.range)),s=gn(s=this.adjustActiveRange(s),r),l=mn(o.range,r),{validRange:r,currentRange:o.range,currentRangeUnit:o.unit,isRangeAllDay:i,activeRange:s,renderRange:a,slotMinTime:d.slotMinTime,slotMaxTime:d.slotMaxTime,isValid:l,dateIncrement:this.buildDateIncrement(o.duration)}},e.prototype.buildValidRange=function(){var e=this.props.validRangeInput,t="function"==typeof e?e.call(this.props.calendarApi,this.nowDate):e;return this.refineRange(t)||{start:null,end:null}},e.prototype.buildCurrentRangeInfo=function(e,t){var n,r=this.props,o=null,i=null,a=null;return r.duration?(o=r.duration,i=r.durationUnit,a=this.buildRangeFromDuration(e,t,o,i)):(n=this.props.dayCount)?(i="day",a=this.buildRangeFromDayCount(e,t,n)):(a=this.buildCustomVisibleRange(e))?i=r.dateEnv.greatestWholeUnit(a.start,a.end).unit:(i=dt(o=this.getFallbackDuration()).unit,a=this.buildRangeFromDuration(e,t,o,i)),{duration:o,unit:i,range:a}},e.prototype.getFallbackDuration=function(){return tt({day:1})},e.prototype.adjustActiveRange=function(e){var t=this.props,n=t.dateEnv,r=t.usesMinMaxTime,o=t.slotMinTime,i=t.slotMaxTime,a=e.start,s=e.end;return r&&(at(o)<0&&(a=Pe(a),a=n.add(a,o)),at(i)>1&&(s=De(s=Pe(s),-1),s=n.add(s,i))),{start:a,end:s}},e.prototype.buildRangeFromDuration=function(e,t,n,r){var o,i,a,s=this.props,l=s.dateEnv,u=s.dateAlignment;if(!u){var c=this.props.dateIncrement;u=c&&ut(c)<ut(n)?dt(c).unit:r}function d(){o=l.startOf(e,u),i=l.add(o,n),a={start:o,end:i}}return at(n)<=1&&this.isHiddenDay(o)&&(o=Pe(o=this.skipHiddenDays(o,t))),d(),this.trimHiddenDays(a)||(e=this.skipHiddenDays(e,t),d()),a},e.prototype.buildRangeFromDayCount=function(e,t,n){var r,o=this.props,i=o.dateEnv,a=o.dateAlignment,s=0,l=e;a&&(l=i.startOf(l,a)),l=Pe(l),r=l=this.skipHiddenDays(l,t);do{r=De(r,1),this.isHiddenDay(r)||s++}while(s<n);return{start:l,end:r}},e.prototype.buildCustomVisibleRange=function(e){var t=this.props,n=t.visibleRangeInput,r="function"==typeof n?n.call(t.calendarApi,t.dateEnv.toDate(e)):n,o=this.refineRange(r);return!o||null!=o.start&&null!=o.end?o:null},e.prototype.buildRenderRange=function(e,t,n){return e},e.prototype.buildDateIncrement=function(e){var t,n=this.props.dateIncrement;return n||((t=this.props.dateAlignment)?tt(1,t):e||tt({days:1}))},e.prototype.refineRange=function(e){if(e){var t=(n=e,r=this.props.dateEnv,o=null,i=null,n.start&&(o=r.createMarker(n.start)),n.end&&(i=r.createMarker(n.end)),o||i?o&&i&&i<o?null:{start:o,end:i}:null);return t&&(t=cn(t)),t}var n,r,o,i;return null},e.prototype.initHiddenDays=function(){var e,t=this.props.hiddenDays||[],n=[],r=0;for(!1===this.props.weekends&&t.push(0,6),e=0;e<7;e++)(n[e]=-1!==t.indexOf(e))||r++;if(!r)throw new Error("invalid hiddenDays");this.isHiddenDayHash=n},e.prototype.trimHiddenDays=function(e){var t=e.start,n=e.end;return t&&(t=this.skipHiddenDays(t)),n&&(n=this.skipHiddenDays(n,-1,!0)),null==t||null==n||t<n?{start:t,end:n}:null},e.prototype.isHiddenDay=function(e){return e instanceof Date&&(e=e.getUTCDay()),this.isHiddenDayHash[e]},e.prototype.skipHiddenDays=function(e,t,n){for(void 0===t&&(t=1),void 0===n&&(n=!1);this.isHiddenDayHash[(e.getUTCDay()+(n?t:0)+7)%7];)e=De(e,t);return e},e}();function Oo(e,t,n){var r=t?t.activeRange:null;return Lo({},function(e,t){var n=Kn(t),r=[].concat(e.eventSources||[]),o=[];e.initialEvents&&r.unshift(e.initialEvents);e.events&&r.unshift(e.events);for(var i=0,a=r;i<a.length;i++){var s=Xn(a[i],t,n);s&&o.push(s)}return o}(e,n),r,n)}function Wo(e,t,n,o){var i,a,s=n?n.activeRange:null;switch(t.type){case"ADD_EVENT_SOURCES":return Lo(e,t.sources,s,o);case"REMOVE_EVENT_SOURCE":return i=e,a=t.sourceId,Ve(i,(function(e){return e.sourceId!==a}));case"PREV":case"NEXT":case"CHANGE_DATE":case"CHANGE_VIEW_TYPE":return n?Uo(e,s,o):e;case"FETCH_EVENT_SOURCES":return Bo(e,t.sourceIds?je(t.sourceIds):Vo(e,o),s,o);case"RECEIVE_EVENTS":case"RECEIVE_EVENT_ERROR":return function(e,t,n,o){var i,a=e[t];if(a&&n===a.latestFetchId)return r(r({},e),((i={})[t]=r(r({},a),{isFetching:!1,fetchRange:o}),i));return e}(e,t.sourceId,t.fetchId,t.fetchRange);case"REMOVE_ALL_EVENT_SOURCES":return{};default:return e}}function Ao(e){var t=0;for(var n in e)e[n].isFetching&&t++;return t}function Lo(e,t,n,o){for(var i={},a=0,s=t;a<s.length;a++){var l=s[a];i[l.sourceId]=l}return n&&(i=Uo(i,n,o)),r(r({},e),i)}function Uo(e,t,n){return Bo(e,Ve(e,(function(e){return function(e,t,n){return Fo(e,n)?!n.options.lazyFetching||!e.fetchRange||e.isFetching||t.start<e.fetchRange.start||t.end>e.fetchRange.end:!e.latestFetchId}(e,t,n)})),t,n)}function Bo(e,t,n,r){var o={};for(var i in e){var a=e[i];t[i]?o[i]=zo(a,n,r):o[i]=a}return o}function zo(e,t,n){var o=n.options,i=n.calendarApi,a=n.pluginHooks.eventSourceDefs[e.sourceDefId],s=ae();return a.fetch({eventSource:e,range:t,context:n},(function(r){var a=r.rawEvents;o.eventSourceSuccess&&(a=o.eventSourceSuccess.call(i,a,r.xhr)||a),e.success&&(a=e.success.call(i,a,r.xhr)||a),n.dispatch({type:"RECEIVE_EVENTS",sourceId:e.sourceId,fetchId:s,fetchRange:t,rawEvents:a})}),(function(r){console.warn(r.message,r),o.eventSourceFailure&&o.eventSourceFailure.call(i,r),e.failure&&e.failure(r),n.dispatch({type:"RECEIVE_EVENT_ERROR",sourceId:e.sourceId,fetchId:s,fetchRange:t,error:r})})),r(r({},e),{isFetching:!0,latestFetchId:s})}function Vo(e,t){return Ve(e,(function(e){return Fo(e,t)}))}function Fo(e,t){return!t.pluginHooks.eventSourceDefs[e.sourceDefId].ignoreRange}function jo(e,t){switch(t.type){case"UNSELECT_DATES":return null;case"SELECT_DATES":return t.selection;default:return e}}function Go(e,t){switch(t.type){case"UNSELECT_EVENT":return"";case"SELECT_EVENT":return t.eventInstanceId;default:return e}}function qo(e,t){var n;switch(t.type){case"UNSET_EVENT_DRAG":return null;case"SET_EVENT_DRAG":return{affectedEvents:(n=t.state).affectedEvents,mutatedEvents:n.mutatedEvents,isEvent:n.isEvent};default:return e}}function Yo(e,t){var n;switch(t.type){case"UNSET_EVENT_RESIZE":return null;case"SET_EVENT_RESIZE":return{affectedEvents:(n=t.state).affectedEvents,mutatedEvents:n.mutatedEvents,isEvent:n.isEvent};default:return e}}function Zo(e,t,n,r,o){var i=[];return{headerToolbar:e.headerToolbar?Xo(e.headerToolbar,e,t,n,r,o,i):null,footerToolbar:e.footerToolbar?Xo(e.footerToolbar,e,t,n,r,o,i):null,viewsWithButtons:i}}function Xo(e,t,n,r,o,i,a){return Fe(e,(function(e){return function(e,t,n,r,o,i,a){var s="rtl"===t.direction,l=t.customButtons||{},u=n.buttonText||{},c=t.buttonText||{};return(e?e.split(" "):[]).map((function(e){return e.split(",").map((function(e){if("title"===e)return{buttonName:e};var t,n=void 0,d=void 0,p=void 0,f=void 0;return(t=l[e])?(d=function(e){t.click&&t.click.call(e.target,e)},(p=r.getCustomButtonIconClass(t))||(p=r.getIconClass(e,s))||(f=t.text)):(n=o[e])?(a.push(e),d=function(){i.changeView(e)},(f=n.buttonTextOverride)||(p=r.getIconClass(e,s))||(f=n.buttonTextDefault)):i[e]&&(d=function(){i[e]()},(f=u[e])||(p=r.getIconClass(e,s))||(f=c[e])),{buttonName:e,buttonClick:d,buttonIcon:p,buttonText:f}}))}))}(e,t,n,r,o,i,a)}))}function Ko(e,t,n,r,o){var i=null;"GET"===(e=e.toUpperCase())?t=function(e,t){return e+(-1===e.indexOf("?")?"?":"&")+Jo(t)}(t,n):i=Jo(n);var a=new XMLHttpRequest;a.open(e,t,!0),"GET"!==e&&a.setRequestHeader("Content-Type","application/x-www-form-urlencoded"),a.onload=function(){if(a.status>=200&&a.status<400){var e=!1,t=void 0;try{t=JSON.parse(a.responseText),e=!0}catch(e){}e?r(t,a):o("Failure parsing JSON",a)}else o("Request failed",a)},a.onerror=function(){o("Request failed",a)},a.send(i)}function Jo(e){var t=[];for(var n in e)t.push(encodeURIComponent(n)+"="+encodeURIComponent(e[n]));return t.join("&")}function $o(e,t){for(var n=Ge(t.getCurrentData().eventSources),r=[],o=0,i=e;o<i.length;o++){for(var a=i[o],s=!1,l=0;l<n.length;l++)if(n[l]._raw===a){n.splice(l,1),s=!0;break}s||r.push(a)}for(var u=0,c=n;u<c.length;u++){var d=c[u];t.dispatch({type:"REMOVE_EVENT_SOURCE",sourceId:d.sourceId})}for(var p=0,f=r;p<f.length;p++){var h=f[p];t.calendarApi.addEventSource(h)}}var Qo=[yo({eventSourceDefs:[{ignoreRange:!0,parseMeta:function(e){return Array.isArray(e.events)?e.events:null},fetch:function(e,t){t({rawEvents:e.eventSource.meta})}}]}),yo({eventSourceDefs:[{parseMeta:function(e){return"function"==typeof e.events?e.events:null},fetch:function(e,t,n){var r=e.context.dateEnv;Lr(e.eventSource.meta.bind(null,Ln(e.range,r)),(function(e){t({rawEvents:e})}),n)}}]}),yo({eventSourceRefiners:{method:String,extraParams:Vt,startParam:String,endParam:String,timeZoneParam:String},eventSourceDefs:[{parseMeta:function(e){return e.url?{url:e.url,method:(e.method||"GET").toUpperCase(),extraParams:e.extraParams,startParam:e.startParam,endParam:e.endParam,timeZoneParam:e.timeZoneParam}:null},fetch:function(e,t,n){var o=e.eventSource.meta,i=function(e,t,n){var o,i,a,s,l=n.dateEnv,u=n.options,c={};null==(o=e.startParam)&&(o=u.startParam);null==(i=e.endParam)&&(i=u.endParam);null==(a=e.timeZoneParam)&&(a=u.timeZoneParam);s="function"==typeof e.extraParams?e.extraParams():e.extraParams||{};r(c,s),c[o]=l.formatIso(t.start),c[i]=l.formatIso(t.end),"local"!==l.timeZone&&(c[a]=l.timeZone);return c}(o,e.range,e.context);Ko(o.method,o.url,i,(function(e,n){t({rawEvents:e,xhr:n})}),(function(e,t){n({message:e,xhr:t})}))}}]}),yo({recurringTypes:[{parse:function(e,t){if(e.daysOfWeek||e.startTime||e.endTime||e.startRecur||e.endRecur){var n={daysOfWeek:e.daysOfWeek||null,startTime:e.startTime||null,endTime:e.endTime||null,startRecur:e.startRecur?t.createMarker(e.startRecur):null,endRecur:e.endRecur?t.createMarker(e.endRecur):null},r=void 0;return e.duration&&(r=e.duration),!r&&e.startTime&&e.endTime&&(o=e.endTime,i=e.startTime,r={years:o.years-i.years,months:o.months-i.months,days:o.days-i.days,milliseconds:o.milliseconds-i.milliseconds}),{allDayGuess:Boolean(!e.startTime&&!e.endTime),duration:r,typeData:n}}var o,i;return null},expand:function(e,t,n){var r=gn(t,{start:e.startRecur,end:e.endRecur});return r?function(e,t,n,r){var o=e?je(e):null,i=Pe(n.start),a=n.end,s=[];for(;i<a;){var l=void 0;o&&!o[i.getUTCDay()]||(l=t?r.add(i,t):i,s.push(l)),i=De(i,1)}return s}(e.daysOfWeek,e.startTime,r,n):[]}}],eventRefiners:{daysOfWeek:Vt,startTime:tt,endTime:tt,duration:tt,startRecur:Vt,endRecur:Vt}}),yo({optionChangeHandlers:{events:function(e,t){$o([e],t)},eventSources:$o}}),yo({contentTypeHandlers:{html:function(){return F},domNodes:function(){return j}},propSetHandlers:{dateProfile:function(e,t){t.emitter.trigger("datesSet",r(r({},Ln(e.activeRange,t.dateEnv)),{view:t.viewApi}))},eventStore:function(e,t){var n=t.emitter;n.hasHandlers("eventsSet")&&n.trigger("eventsSet",tr(e,t))}}})],ei=function(){function e(e){this.drainedOption=e,this.isRunning=!1,this.isDirty=!1,this.pauseDepths={},this.timeoutId=0}return e.prototype.request=function(e){this.isDirty=!0,this.isPaused()||(this.clearTimeout(),null==e?this.tryDrain():this.timeoutId=setTimeout(this.tryDrain.bind(this),e))},e.prototype.pause=function(e){void 0===e&&(e="");var t=this.pauseDepths;t[e]=(t[e]||0)+1,this.clearTimeout()},e.prototype.resume=function(e,t){void 0===e&&(e="");var n=this.pauseDepths;if(e in n){if(t)delete n[e];else--n[e]<=0&&delete n[e];this.tryDrain()}},e.prototype.isPaused=function(){return Object.keys(this.pauseDepths).length},e.prototype.tryDrain=function(){if(!this.isRunning&&!this.isPaused()){for(this.isRunning=!0;this.isDirty;)this.isDirty=!1,this.drained();this.isRunning=!1}},e.prototype.clear=function(){this.clearTimeout(),this.isDirty=!1,this.pauseDepths={}},e.prototype.clearTimeout=function(){this.timeoutId&&(clearTimeout(this.timeoutId),this.timeoutId=0)},e.prototype.drained=function(){this.drainedOption&&this.drainedOption()},e}(),ti=function(){function e(e,t){this.runTaskOption=e,this.drainedOption=t,this.queue=[],this.delayedRunner=new ei(this.drain.bind(this))}return e.prototype.request=function(e,t){this.queue.push(e),this.delayedRunner.request(t)},e.prototype.pause=function(e){this.delayedRunner.pause(e)},e.prototype.resume=function(e,t){this.delayedRunner.resume(e,t)},e.prototype.drain=function(){for(var e=this.queue;e.length;){for(var t=[],n=void 0;n=e.shift();)this.runTask(n),t.push(n);this.drained(t)}},e.prototype.runTask=function(e){this.runTaskOption&&this.runTaskOption(e)},e.prototype.drained=function(e){this.drainedOption&&this.drainedOption(e)},e}();function ni(e,t,n){var r;return r=/^(year|month)$/.test(e.currentRangeUnit)?e.currentRange:e.activeRange,n.formatRange(r.start,r.end,Nt(t.titleFormat||function(e){var t=e.currentRangeUnit;if("year"===t)return{year:"numeric"};if("month"===t)return{year:"numeric",month:"long"};var n=Me(e.currentRange.start,e.currentRange.end);return null!==n&&n>1?{year:"numeric",month:"short",day:"numeric"}:{year:"numeric",month:"long",day:"numeric"}}(e)),{isEndExclusive:e.isRangeAllDay,defaultSeparator:t.titleRangeSeparator})}var ri=function(){function e(e){var t=this;this.computeOptionsData=gt(this._computeOptionsData),this.computeCurrentViewData=gt(this._computeCurrentViewData),this.organizeRawLocales=gt(cr),this.buildLocale=gt(dr),this.buildPluginHooks=So(),this.buildDateEnv=gt(oi),this.buildTheme=gt(ii),this.parseToolbars=gt(Zo),this.buildViewSpecs=gt(No),this.buildDateProfileGenerator=vt(ai),this.buildViewApi=gt(si),this.buildViewUiProps=vt(ci),this.buildEventUiBySource=gt(li,qe),this.buildEventUiBases=gt(ui),this.parseContextBusinessHours=vt(di),this.buildTitle=gt(ni),this.emitter=new Ur,this.actionRunner=new ti(this._handleAction.bind(this),this.updateData.bind(this)),this.currentCalendarOptionsInput={},this.currentCalendarOptionsRefined={},this.currentViewOptionsInput={},this.currentViewOptionsRefined={},this.currentCalendarOptionsRefiners={},this.getCurrentData=function(){return t.data},this.dispatch=function(e){t.actionRunner.request(e)},this.props=e,this.actionRunner.pause();var n={},o=this.computeOptionsData(e.optionOverrides,n,e.calendarApi),i=o.calendarOptions.initialView||o.pluginHooks.initialView,a=this.computeCurrentViewData(i,o,e.optionOverrides,n);e.calendarApi.currentDataManager=this,this.emitter.setThisContext(e.calendarApi),this.emitter.setOptions(a.options);var s,l,u,c=(s=o.calendarOptions,l=o.dateEnv,null!=(u=s.initialDate)?l.createMarker(u):Jn(s.now,l)),d=a.dateProfileGenerator.build(c);Sn(d.activeRange,c)||(c=d.currentRange.start);for(var p={dateEnv:o.dateEnv,options:o.calendarOptions,pluginHooks:o.pluginHooks,calendarApi:e.calendarApi,dispatch:this.dispatch,emitter:this.emitter,getCurrentData:this.getCurrentData},f=0,h=o.pluginHooks.contextInit;f<h.length;f++){(0,h[f])(p)}for(var g=Oo(o.calendarOptions,d,p),v={dynamicOptionOverrides:n,currentViewType:i,currentDate:c,dateProfile:d,businessHours:this.parseContextBusinessHours(p),eventSources:g,eventUiBases:{},loadingLevel:Ao(g),eventStore:{defs:{},instances:{}},renderableEventStore:{defs:{},instances:{}},dateSelection:null,eventSelection:"",eventDrag:null,eventResize:null,selectionConfig:this.buildViewUiProps(p).selectionConfig},m=r(r({},p),v),y=0,S=o.pluginHooks.reducers;y<S.length;y++){var E=S[y];r(v,E(null,null,m))}v.loadingLevel&&this.emitter.trigger("loading",!0),this.state=v,this.updateData(),this.actionRunner.resume()}return e.prototype.resetOptions=function(e,t){var n=this.props;n.optionOverrides=t?r(r({},n.optionOverrides),e):e,this.actionRunner.request({type:"NOTHING"})},e.prototype._handleAction=function(e){var t=this.props,n=this.state,o=this.emitter,i=function(e,t){var n;switch(t.type){case"SET_OPTION":return r(r({},e),((n={})[t.optionName]=t.rawOptionValue,n));default:return e}}(n.dynamicOptionOverrides,e),a=this.computeOptionsData(t.optionOverrides,i,t.calendarApi),s=function(e,t){switch(t.type){case"CHANGE_VIEW_TYPE":return t.viewType}return e}(n.currentViewType,e),l=this.computeCurrentViewData(s,a,t.optionOverrides,i);t.calendarApi.currentDataManager=this,o.setThisContext(t.calendarApi),o.setOptions(l.options);var u={dateEnv:a.dateEnv,options:a.calendarOptions,pluginHooks:a.pluginHooks,calendarApi:t.calendarApi,dispatch:this.dispatch,emitter:o,getCurrentData:this.getCurrentData},c=n.currentDate,d=n.dateProfile;this.data&&this.data.dateProfileGenerator!==l.dateProfileGenerator&&(d=l.dateProfileGenerator.build(c)),d=function(e,t,n,r){var o;switch(t.type){case"CHANGE_VIEW_TYPE":return r.build(t.dateMarker||n);case"CHANGE_DATE":if(!e.activeRange||!Sn(e.currentRange,t.dateMarker))return r.build(t.dateMarker);break;case"PREV":if((o=r.buildPrev(e,n)).isValid)return o;break;case"NEXT":if((o=r.buildNext(e,n)).isValid)return o}return e}(d,e,c=function(e,t){switch(t.type){case"CHANGE_DATE":return t.dateMarker;default:return e}}(c,e),l.dateProfileGenerator),Sn(d.currentRange,c)||(c=d.currentRange.start);for(var p=Wo(n.eventSources,e,d,u),f=Ao(p),h=ao(n.eventStore,e,p,d,u),g=f&&!l.options.progressiveEventRendering&&n.renderableEventStore||h,v=this.buildViewUiProps(u),m=v.eventUiSingleBase,y=v.selectionConfig,S=this.buildEventUiBySource(p),E=this.buildEventUiBases(g.defs,m,S),C=n.loadingLevel||0,b=f,D={dynamicOptionOverrides:i,currentViewType:s,currentDate:c,dateProfile:d,eventSources:p,eventStore:h,renderableEventStore:g,selectionConfig:y,eventUiBases:E,loadingLevel:b,businessHours:this.parseContextBusinessHours(u),dateSelection:jo(n.dateSelection,e),eventSelection:Go(n.eventSelection,e),eventDrag:qo(n.eventDrag,e),eventResize:Yo(n.eventResize,e)},R=r(r({},u),D),w=0,T=a.pluginHooks.reducers;w<T.length;w++){var x=T[w];r(D,x(n,e,R))}!C&&b?o.trigger("loading",!0):C&&!b&&o.trigger("loading",!1),this.state=D,t.onAction&&t.onAction(e)},e.prototype.updateData=function(){var e,t,n,o,i=this.props,a=this.state,s=this.data,l=this.computeOptionsData(i.optionOverrides,a.dynamicOptionOverrides,i.calendarApi),u=this.computeCurrentViewData(a.currentViewType,l,i.optionOverrides,a.dynamicOptionOverrides),c=this.data=r(r(r({viewTitle:this.buildTitle(a.dateProfile,u.options,l.dateEnv),calendarApi:i.calendarApi,dispatch:this.dispatch,emitter:this.emitter,getCurrentData:this.getCurrentData},l),u),a),d=l.pluginHooks.optionChangeHandlers,p=s&&s.calendarOptions,f=l.calendarOptions;if(p&&p!==f)for(var h in p.timeZone!==f.timeZone&&(a.eventSources=c.eventSources=(e=c.eventSources,t=a.dateProfile,n=c,o=t?t.activeRange:null,Bo(e,Vo(e,n),o,n)),a.eventStore=c.eventStore=function(e,t,n){var o=e.defs,i=Fe(e.instances,(function(e){var i=o[e.defId];return i.allDay||i.recurringDef?e:r(r({},e),{range:{start:n.createMarker(t.toDate(e.range.start,e.forcedStartTzo)),end:n.createMarker(t.toDate(e.range.end,e.forcedEndTzo))},forcedStartTzo:n.canComputeOffset?null:e.forcedStartTzo,forcedEndTzo:n.canComputeOffset?null:e.forcedEndTzo})}));return{defs:o,instances:i}}(c.eventStore,s.dateEnv,c.dateEnv)),d)p[h]!==f[h]&&d[h](f[h],c);i.onData&&i.onData(c)},e.prototype._computeOptionsData=function(e,t,n){var r=this.processRawCalendarOptions(e,t),o=r.refinedOptions,i=r.pluginHooks,a=r.localeDefaults,s=r.availableLocaleData;pi(r.extra);var l=this.buildDateEnv(o.timeZone,o.locale,o.weekNumberCalculation,o.firstDay,o.weekText,i,s,o.defaultRangeSeparator),u=this.buildViewSpecs(i.views,e,t,a),c=this.buildTheme(o,i);return{calendarOptions:o,pluginHooks:i,dateEnv:l,viewSpecs:u,theme:c,toolbarConfig:this.parseToolbars(o,e,c,u,n),localeDefaults:a,availableRawLocales:s.map}},e.prototype.processRawCalendarOptions=function(e,t){var n=Bt([Ht,e,t]),o=n.locales,i=n.locale,a=this.organizeRawLocales(o),s=a.map,l=this.buildLocale(i||a.defaultCode,s).options,u=this.buildPluginHooks(e.plugins||[],Qo),c=this.currentCalendarOptionsRefiners=r(r(r(r(r({},_t),Ot),Wt),u.listenerRefiners),u.optionRefiners),d={},p=Bt([Ht,l,e,t]),f={},h=this.currentCalendarOptionsInput,g=this.currentCalendarOptionsRefined,v=!1;for(var m in p)"plugins"!==m&&(p[m]===h[m]||At[m]&&m in h&&At[m](h[m],p[m])?f[m]=g[m]:c[m]?(f[m]=c[m](p[m]),v=!0):d[m]=h[m]);return v&&(this.currentCalendarOptionsInput=p,this.currentCalendarOptionsRefined=f),{rawOptions:this.currentCalendarOptionsInput,refinedOptions:this.currentCalendarOptionsRefined,pluginHooks:u,availableLocaleData:a,localeDefaults:l,extra:d}},e.prototype._computeCurrentViewData=function(e,t,n,r){var o=t.viewSpecs[e];if(!o)throw new Error('viewType "'+e+"\" is not available. Please make sure you've loaded all neccessary plugins");var i=this.processRawViewOptions(o,t.pluginHooks,t.localeDefaults,n,r),a=i.refinedOptions;return pi(i.extra),{viewSpec:o,options:a,dateProfileGenerator:this.buildDateProfileGenerator({dateProfileGeneratorClass:o.optionDefaults.dateProfileGeneratorClass,duration:o.duration,durationUnit:o.durationUnit,usesMinMaxTime:o.optionDefaults.usesMinMaxTime,dateEnv:t.dateEnv,calendarApi:this.props.calendarApi,slotMinTime:a.slotMinTime,slotMaxTime:a.slotMaxTime,showNonCurrentDates:a.showNonCurrentDates,dayCount:a.dayCount,dateAlignment:a.dateAlignment,dateIncrement:a.dateIncrement,hiddenDays:a.hiddenDays,weekends:a.weekends,nowInput:a.now,validRangeInput:a.validRange,visibleRangeInput:a.visibleRange,monthMode:a.monthMode,fixedWeekCount:a.fixedWeekCount}),viewApi:this.buildViewApi(e,this.getCurrentData,t.dateEnv)}},e.prototype.processRawViewOptions=function(e,t,n,o,i){var a=Bt([Ht,e.optionDefaults,n,o,e.optionOverrides,i]),s=r(r(r(r(r(r({},_t),Ot),Wt),Ut),t.listenerRefiners),t.optionRefiners),l={},u=this.currentViewOptionsInput,c=this.currentViewOptionsRefined,d=!1,p={};for(var f in a)a[f]===u[f]?l[f]=c[f]:(a[f]===this.currentCalendarOptionsInput[f]?f in this.currentCalendarOptionsRefined&&(l[f]=this.currentCalendarOptionsRefined[f]):s[f]?l[f]=s[f](a[f]):p[f]=a[f],d=!0);return d&&(this.currentViewOptionsInput=a,this.currentViewOptionsRefined=l),{rawOptions:this.currentViewOptionsInput,refinedOptions:this.currentViewOptionsRefined,extra:p}},e}();function oi(e,t,n,r,o,i,a,s){var l=dr(t||a.defaultCode,a.map);return new sr({calendarSystem:"gregory",timeZone:e,namedTimeZoneImpl:i.namedTimeZonedImpl,locale:l,weekNumberCalculation:n,firstDay:r,weekText:o,cmdFormatter:i.cmdFormatter,defaultSeparator:s})}function ii(e,t){return new(t.themeClasses[e.themeSystem]||Eo)(e)}function ai(e){return new(e.dateProfileGeneratorClass||Ho)(e)}function si(e,t,n){return new Yn(e,t,n)}function li(e){return Fe(e,(function(e){return e.ui}))}function ui(e,t,n){var r={"":t};for(var o in e){var i=e[o];i.sourceId&&n[i.sourceId]&&(r[o]=n[i.sourceId])}return r}function ci(e){var t=e.options;return{eventUiSingleBase:Jt({display:t.eventDisplay,editable:t.editable,startEditable:t.eventStartEditable,durationEditable:t.eventDurationEditable,constraint:t.eventConstraint,overlap:"boolean"==typeof t.eventOverlap?t.eventOverlap:void 0,allow:t.eventAllow,backgroundColor:t.eventBackgroundColor,borderColor:t.eventBorderColor,textColor:t.eventTextColor,color:t.eventColor},e),selectionConfig:Jt({constraint:t.selectConstraint,overlap:"boolean"==typeof t.selectOverlap?t.selectOverlap:void 0,allow:t.selectAllow},e)}}function di(e){return gr(e.options.businessHours,e)}function pi(e,t){for(var n in e)console.warn("Unknown option '"+n+"'"+(t?" for view '"+t+"'":""))}var fi=function(e){function t(t){var n=e.call(this,t)||this;return n.handleData=function(e){n.dataManager?n.setState(e):n.state=e},n.dataManager=new ri({optionOverrides:t.optionOverrides,calendarApi:t.calendarApi,onData:n.handleData}),n}return n(t,e),t.prototype.render=function(){return this.props.children(this.state)},t.prototype.componentDidUpdate=function(e){var t=this.props.optionOverrides;t!==e.optionOverrides&&this.dataManager.resetOptions(t)},t}(Gr);var hi=function(e){this.timeZoneName=e},gi=function(){function e(e){this.component=e.component}return e.prototype.destroy=function(){},e}();function vi(e,t){return{component:e,el:t.el,useEventCenter:null==t.useEventCenter||t.useEventCenter}}function mi(e){var t;return(t={})[e.component.uid]=e,t}var yi={},Si=function(){function e(e,t){this.emitter=new Ur}return e.prototype.destroy=function(){},e.prototype.setMirrorIsVisible=function(e){},e.prototype.setMirrorNeedsRevert=function(e){},e.prototype.setAutoScrollEnabled=function(e){},e}(),Ei={},Ci={startTime:tt,duration:tt,create:Boolean,sourceId:String};function bi(e){var t=zt(e,Ci),n=t.refined,r=t.extra;return{startTime:n.startTime||null,duration:n.duration||null,create:null==n.create||n.create,sourceId:n.sourceId,leftoverProps:r}}var Di,Ri=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.render=function(){var e,t,n=this.props,r=n.model,o=n.extraClassName,i=!1,a=r.center;return r.left?(i=!0,e=r.left):e=r.start,r.right?(i=!0,t=r.right):t=r.end,qr("div",{className:[o||"","fc-toolbar",i?"fc-toolbar-ltr":""].join(" ")},this.renderSection("start",e||[]),this.renderSection("center",a||[]),this.renderSection("end",t||[]))},t.prototype.renderSection=function(e,t){var n=this.props;return qr(wi,{key:e,widgetGroups:t,title:n.title,activeButton:n.activeButton,isTodayEnabled:n.isTodayEnabled,isPrevEnabled:n.isPrevEnabled,isNextEnabled:n.isNextEnabled})},t}(no),wi=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.render=function(){var e=this,t=this.props.widgetGroups.map((function(t){return e.renderWidgetGroup(t)}));return qr.apply(void 0,o(["div",{className:"fc-toolbar-chunk"}],t))},t.prototype.renderWidgetGroup=function(e){for(var t=this.props,n=this.context.theme,i=[],a=!0,s=0,l=e;s<l.length;s++){var u=l[s],c=u.buttonName,d=u.buttonClick,p=u.buttonText,f=u.buttonIcon;if("title"===c)a=!1,i.push(qr("h2",{className:"fc-toolbar-title"},t.title));else{var h=f?{"aria-label":c}:{},g=["fc-"+c+"-button",n.getClass("button")];c===t.activeButton&&g.push(n.getClass("buttonActive"));var v=!t.isTodayEnabled&&"today"===c||!t.isPrevEnabled&&"prev"===c||!t.isNextEnabled&&"next"===c;i.push(qr("button",r({disabled:v,className:g.join(" "),onClick:d,type:"button"},h),p||(f?qr("span",{className:f}):"")))}}if(i.length>1){var m=a&&n.getClass("buttonGroup")||"";return qr.apply(void 0,o(["div",{className:m}],i))}return i[0]},t}(no),Ti=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.render=function(){var e=this.props,t=e.aspectRatio,n=["fc-view-harness",t||e.liquid||e.height?"fc-view-harness-active":"fc-view-harness-passive"],r="",o="";return t?o=1/t*100+"%":r=e.height||"",qr("div",{ref:e.elRef,onClick:e.onClick,className:n.join(" "),style:{height:r,paddingBottom:o}},e.children)},t}(no),xi=function(e){function t(t){var n=e.call(this,t)||this;return n.handleSegClick=function(e,t){var r=n.component,o=r.context,i=Dn(t);if(i&&r.isValidSegDownEl(e.target)){var a=Y(e.target,".fc-event-forced-url"),s=a?a.querySelector("a[href]").href:"";o.emitter.trigger("eventClick",{el:t,event:new Qn(r.context,i.eventRange.def,i.eventRange.instance),jsEvent:e,view:o.viewApi}),s&&!e.defaultPrevented&&(window.location.href=s)}},n.destroy=ne(t.el,"click",".fc-event",n.handleSegClick),n}return n(t,e),t}(gi),ki=function(e){function t(t){var n,r,o,i,a,s=e.call(this,t)||this;return s.handleEventElRemove=function(e){e===s.currentSegEl&&s.handleSegLeave(null,s.currentSegEl)},s.handleSegEnter=function(e,t){Dn(t)&&(s.currentSegEl=t,s.triggerEvent("eventMouseEnter",e,t))},s.handleSegLeave=function(e,t){s.currentSegEl&&(s.currentSegEl=null,s.triggerEvent("eventMouseLeave",e,t))},s.removeHoverListeners=(n=t.el,r=".fc-event",o=s.handleSegEnter,i=s.handleSegLeave,ne(n,"mouseover",r,(function(e,t){if(t!==a){a=t,o(e,t);var n=function(e){a=null,i(e,t),t.removeEventListener("mouseleave",n)};t.addEventListener("mouseleave",n)}}))),s}return n(t,e),t.prototype.destroy=function(){this.removeHoverListeners()},t.prototype.triggerEvent=function(e,t,n){var r=this.component,o=r.context,i=Dn(n);t&&!r.isValidSegDownEl(t.target)||o.emitter.trigger(e,{el:n,event:new Qn(o,i.eventRange.def,i.eventRange.instance),jsEvent:t,view:o.viewApi})},t}(gi),Mi=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.buildViewContext=gt(eo),t.buildViewPropTransformers=gt(Ii),t.buildToolbarProps=gt(Pi),t.handleNavLinkClick=te("a[data-navlink]",t._handleNavLinkClick.bind(t)),t.headerRef=Zr(),t.footerRef=Zr(),t.interactionsStore={},t.registerInteractiveComponent=function(e,n){var r=vi(e,n),o=[xi,ki].concat(t.props.pluginHooks.componentInteractions).map((function(e){return new e(r)}));t.interactionsStore[e.uid]=o,yi[e.uid]=r},t.unregisterInteractiveComponent=function(e){for(var n=0,r=t.interactionsStore[e.uid];n<r.length;n++){r[n].destroy()}delete t.interactionsStore[e.uid],delete yi[e.uid]},t.resizeRunner=new ei((function(){t.props.emitter.trigger("_resize",!0),t.props.emitter.trigger("windowResize",{view:t.props.viewApi})})),t.handleWindowResize=function(e){var n=t.props.options;n.handleWindowResize&&e.target===window&&t.resizeRunner.request(n.windowResizeDelay)},t}return n(t,e),t.prototype.render=function(){var e,t=this.props,n=t.toolbarConfig,o=t.options,i=this.buildToolbarProps(t.viewSpec,t.dateProfile,t.dateProfileGenerator,t.currentDate,Jn(t.options.now,t.dateEnv),t.viewTitle),a=!1,s="";t.isHeightAuto||t.forPrint?s="":null!=o.height?a=!0:null!=o.contentHeight?s=o.contentHeight:e=Math.max(o.aspectRatio,.5);var l=this.buildViewContext(t.viewSpec,t.viewApi,t.options,t.dateProfileGenerator,t.dateEnv,t.theme,t.pluginHooks,t.dispatch,t.getCurrentData,t.emitter,t.calendarApi,this.registerInteractiveComponent,this.unregisterInteractiveComponent);return qr(Qr.Provider,{value:l},n.headerToolbar&&qr(Ri,r({ref:this.headerRef,extraClassName:"fc-header-toolbar",model:n.headerToolbar},i)),qr(Ti,{liquid:a,height:s,aspectRatio:e,onClick:this.handleNavLinkClick},this.renderView(t),this.buildAppendContent()),n.footerToolbar&&qr(Ri,r({ref:this.footerRef,extraClassName:"fc-footer-toolbar",model:n.footerToolbar},i)))},t.prototype.componentDidMount=function(){var e=this.props;this.calendarInteractions=e.pluginHooks.calendarInteractions.map((function(t){return new t(e)})),window.addEventListener("resize",this.handleWindowResize);var t=e.pluginHooks.propSetHandlers;for(var n in t)t[n](e[n],e)},t.prototype.componentDidUpdate=function(e){var t=this.props,n=t.pluginHooks.propSetHandlers;for(var r in n)t[r]!==e[r]&&n[r](t[r],t)},t.prototype.componentWillUnmount=function(){window.removeEventListener("resize",this.handleWindowResize),this.resizeRunner.clear();for(var e=0,t=this.calendarInteractions;e<t.length;e++){t[e].destroy()}this.props.emitter.trigger("_unmount")},t.prototype._handleNavLinkClick=function(e,t){var n=this.props,r=n.dateEnv,o=n.options,i=n.calendarApi,a=t.getAttribute("data-navlink");a=a?JSON.parse(a):{};var s=r.createMarker(a.date),l=a.type,u="day"===l?o.navLinkDayClick:"week"===l?o.navLinkWeekClick:null;"function"==typeof u?u.call(i,r.toDate(s),e):("string"==typeof u&&(l=u),i.zoomTo(s,l))},t.prototype.buildAppendContent=function(){var e=this.props,t=e.pluginHooks.viewContainerAppends.map((function(t){return t(e)}));return qr.apply(void 0,o([Xr,{}],t))},t.prototype.renderView=function(e){for(var t=e.pluginHooks,n=e.viewSpec,o={dateProfile:e.dateProfile,businessHours:e.businessHours,eventStore:e.renderableEventStore,eventUiBases:e.eventUiBases,dateSelection:e.dateSelection,eventSelection:e.eventSelection,eventDrag:e.eventDrag,eventResize:e.eventResize,isHeightAuto:e.isHeightAuto,forPrint:e.forPrint},i=0,a=this.buildViewPropTransformers(t.viewPropsTransformers);i<a.length;i++){var s=a[i];r(o,s.transform(o,e))}var l=n.component;return qr(l,r({},o))},t}(to);function Pi(e,t,n,r,o,i){var a=n.build(o,void 0,!1),s=n.buildPrev(t,r,!1),l=n.buildNext(t,r,!1);return{title:i,activeButton:e.type,isTodayEnabled:a.isValid&&!Sn(t.currentRange,o),isPrevEnabled:s.isValid,isNextEnabled:l.isValid}}function Ii(e){return e.map((function(e){return new e}))}function Ni(){return null==Di&&(Di=function(){var e=document.createElement("div");e.style.position="absolute",e.style.top="0",e.style.left="0",e.innerHTML='<table style="height:100px"><tr><td><div style="height:100%"></div></td></tr></table>',document.body.appendChild(e);var t=e.querySelector("div").offsetHeight>0;return document.body.removeChild(e),t}()),Di}var _i=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.state={forPrint:!1},t.handleBeforePrint=function(){t.setState({forPrint:!0})},t.handleAfterPrint=function(){t.setState({forPrint:!1})},t}return n(t,e),t.prototype.render=function(){var e=this.props,t=e.options,n=this.state.forPrint,r=n||"auto"===t.height||"auto"===t.contentHeight,o=r||null==t.height?"":t.height,i=["fc",n?"fc-media-print":"fc-media-screen","fc-direction-"+t.direction,e.theme.getClass("root")];return Ni()||i.push("fc-liquid-hack"),e.children(i,o,r,n)},t.prototype.componentDidMount=function(){var e=this.props.emitter;e.on("_beforeprint",this.handleBeforePrint),e.on("_afterprint",this.handleAfterPrint)},t.prototype.componentWillUnmount=function(){var e=this.props.emitter;e.off("_beforeprint",this.handleBeforePrint),e.off("_afterprint",this.handleAfterPrint)},t}(no);function Hi(e,t){return Nt(!e||t>10?{weekday:"short"}:t>1?{weekday:"short",month:"numeric",day:"numeric",omitCommas:!0}:{weekday:"long"})}var Oi="fc-col-header-cell",Wi=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.render=function(){var e=this.context,t=e.dateEnv,n=e.options,o=e.theme,i=e.viewApi,a=this.props,s=a.date,l=a.dateProfile,u=wr(s,a.todayRange,null,l),c=[Oi].concat(Tr(u,o)),d=t.format(s,a.dayHeaderFormat),p=n.navLinks&&!u.isDisabled&&a.colCnt>1?{"data-navlink":kr(s),tabIndex:0}:{},f=r(r(r({date:t.toDate(s),view:i},a.extraHookProps),{text:d}),u);return qr(bo,{hookProps:f,classNames:n.dayHeaderClassNames,content:n.dayHeaderContent,defaultContent:Li,didMount:n.dayHeaderDidMount,willUnmount:n.dayHeaderWillUnmount},(function(e,t,n,o){return qr("th",r({ref:e,className:c.concat(t).join(" "),"data-date":u.isDisabled?void 0:pt(s),colSpan:a.colSpan},a.extraDataAttrs),qr("div",{className:"fc-scrollgrid-sync-inner"},!u.isDisabled&&qr("a",r({ref:n,className:["fc-col-header-cell-cushion",a.isSticky?"fc-sticky":""].join(" ")},p),o)))}))},t}(no),Ai=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.render=function(){var e=this.props,t=this.context,n=t.dateEnv,o=t.theme,i=t.viewApi,a=t.options,s=De(new Date(2592e5),e.dow),l={dow:e.dow,isDisabled:!1,isFuture:!1,isPast:!1,isToday:!1,isOther:!1},u=[Oi].concat(Tr(l,o),e.extraClassNames||[]),c=n.format(s,e.dayHeaderFormat),d=r(r(r(r({date:s},l),{view:i}),e.extraHookProps),{text:c});return qr(bo,{hookProps:d,classNames:a.dayHeaderClassNames,content:a.dayHeaderContent,defaultContent:Li,didMount:a.dayHeaderDidMount,willUnmount:a.dayHeaderWillUnmount},(function(t,n,o,i){return qr("th",r({ref:t,className:u.concat(n).join(" "),colSpan:e.colSpan},e.extraDataAttrs),qr("div",{className:"fc-scrollgrid-sync-inner"},qr("a",{className:["fc-col-header-cell-cushion",e.isSticky?"fc-sticky":""].join(" "),ref:o},i)))}))},t}(no);function Li(e){return e.text}var Ui=function(e){function t(t,n){var r=e.call(this,t,n)||this;return r.initialNowDate=Jn(n.options.now,n.dateEnv),r.initialNowQueriedMs=(new Date).valueOf(),r.state=r.computeTiming().currentState,r}return n(t,e),t.prototype.render=function(){var e=this.props,t=this.state;return e.children(t.nowDate,t.todayRange)},t.prototype.componentDidMount=function(){this.setTimeout()},t.prototype.componentDidUpdate=function(e){e.unit!==this.props.unit&&(this.clearTimeout(),this.setTimeout())},t.prototype.componentWillUnmount=function(){this.clearTimeout()},t.prototype.computeTiming=function(){var e=this.props,t=this.context,n=Re(this.initialNowDate,(new Date).valueOf()-this.initialNowQueriedMs),r=t.dateEnv.startOf(n,e.unit),o=t.dateEnv.add(r,tt(1,e.unit)),i=o.valueOf()-n.valueOf();return{currentState:{nowDate:r,todayRange:Bi(r)},nextState:{nowDate:o,todayRange:Bi(o)},waitMs:i}},t.prototype.setTimeout=function(){var e=this,t=this.computeTiming(),n=t.nextState,r=t.waitMs;this.timeoutId=setTimeout((function(){e.setState(n,(function(){e.setTimeout()}))}),r)},t.prototype.clearTimeout=function(){this.timeoutId&&clearTimeout(this.timeoutId)},t.contextType=Qr,t}(Gr);function Bi(e){var t=Pe(e);return{start:t,end:De(t,1)}}var zi=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.createDayHeaderFormatter=gt(Vi),t}return n(t,e),t.prototype.render=function(){var e=this.context,t=this.props,n=t.dates,r=t.dateProfile,o=t.datesRepDistinctDays,i=t.renderIntro,a=this.createDayHeaderFormatter(e.options.dayHeaderFormat,o,n.length);return qr(Ui,{unit:"day"},(function(e,t){return qr("tr",null,i&&i(),n.map((function(e){return o?qr(Wi,{key:e.toISOString(),date:e,dateProfile:r,todayRange:t,colCnt:n.length,dayHeaderFormat:a}):qr(Ai,{key:e.getUTCDay(),dow:e.getUTCDay(),dayHeaderFormat:a})})))}))},t}(no);function Vi(e,t,n){return e||Hi(t,n)}var Fi=function(){function e(e,t){for(var n=e.start,r=e.end,o=[],i=[],a=-1;n<r;)t.isHiddenDay(n)?o.push(a+.5):(a++,o.push(a),i.push(n)),n=De(n,1);this.dates=i,this.indices=o,this.cnt=i.length}return e.prototype.sliceRange=function(e){var t=this.getDateDayIndex(e.start),n=this.getDateDayIndex(De(e.end,-1)),r=Math.max(0,t),o=Math.min(this.cnt-1,n);return(r=Math.ceil(r))<=(o=Math.floor(o))?{firstIndex:r,lastIndex:o,isStart:t===r,isEnd:n===o}:null},e.prototype.getDateDayIndex=function(e){var t=this.indices,n=Math.floor(Te(this.dates[0],e));return n<0?t[0]-1:n>=t.length?t[t.length-1]+1:t[n]},e}(),ji=function(){function e(e,t){var n,r,o,i=e.dates;if(t){for(r=i[0].getUTCDay(),n=1;n<i.length&&i[n].getUTCDay()!==r;n++);o=Math.ceil(i.length/n)}else o=1,n=i.length;this.rowCnt=o,this.colCnt=n,this.daySeries=e,this.cells=this.buildCells(),this.headerDates=this.buildHeaderDates()}return e.prototype.buildCells=function(){for(var e=[],t=0;t<this.rowCnt;t++){for(var n=[],r=0;r<this.colCnt;r++)n.push(this.buildCell(t,r));e.push(n)}return e},e.prototype.buildCell=function(e,t){var n=this.daySeries.dates[e*this.colCnt+t];return{key:n.toISOString(),date:n}},e.prototype.buildHeaderDates=function(){for(var e=[],t=0;t<this.colCnt;t++)e.push(this.cells[0][t].date);return e},e.prototype.sliceRange=function(e){var t=this.colCnt,n=this.daySeries.sliceRange(e),r=[];if(n)for(var o=n.firstIndex,i=n.lastIndex,a=o;a<=i;){var s=Math.floor(a/t),l=Math.min((s+1)*t,i+1);r.push({row:s,firstCol:a%t,lastCol:(l-1)%t,isStart:n.isStart&&a===o,isEnd:n.isEnd&&l-1===i}),a=l}return r},e}(),Gi=function(){function e(){this.sliceBusinessHours=gt(this._sliceBusinessHours),this.sliceDateSelection=gt(this._sliceDateSpan),this.sliceEventStore=gt(this._sliceEventStore),this.sliceEventDrag=gt(this._sliceInteraction),this.sliceEventResize=gt(this._sliceInteraction),this.forceDayIfListItem=!1}return e.prototype.sliceProps=function(e,t,n,r){for(var i=[],a=4;a<arguments.length;a++)i[a-4]=arguments[a];var s=e.eventUiBases,l=this.sliceEventStore.apply(this,o([e.eventStore,s,t,n],i));return{dateSelectionSegs:this.sliceDateSelection.apply(this,o([e.dateSelection,s,r],i)),businessHourSegs:this.sliceBusinessHours.apply(this,o([e.businessHours,t,n,r],i)),fgEventSegs:l.fg,bgEventSegs:l.bg,eventDrag:this.sliceEventDrag.apply(this,o([e.eventDrag,s,t,n],i)),eventResize:this.sliceEventResize.apply(this,o([e.eventResize,s,t,n],i)),eventSelection:e.eventSelection}},e.prototype.sliceNowDate=function(e,t){for(var n=[],r=2;r<arguments.length;r++)n[r-2]=arguments[r];return this._sliceDateSpan.apply(this,o([{range:{start:e,end:Re(e,1)},allDay:!1},{},t],n))},e.prototype._sliceBusinessHours=function(e,t,n,r){for(var i=[],a=4;a<arguments.length;a++)i[a-4]=arguments[a];return e?this._sliceEventStore.apply(this,o([Je(e,qi(t,Boolean(n)),r),{},t,n],i)).bg:[]},e.prototype._sliceEventStore=function(e,t,n,r){for(var o=[],i=4;i<arguments.length;i++)o[i-4]=arguments[i];if(e){var a=En(e,t,qi(n,Boolean(r)),r);return{bg:this.sliceEventRanges(a.bg,o),fg:this.sliceEventRanges(a.fg,o)}}return{bg:[],fg:[]}},e.prototype._sliceInteraction=function(e,t,n,r){for(var o=[],i=4;i<arguments.length;i++)o[i-4]=arguments[i];if(!e)return null;var a=En(e.mutatedEvents,t,qi(n,Boolean(r)),r);return{segs:this.sliceEventRanges(a.fg,o),affectedInstances:e.affectedEvents.instances,isEvent:e.isEvent}},e.prototype._sliceDateSpan=function(e,t,n){for(var r=[],i=3;i<arguments.length;i++)r[i-3]=arguments[i];if(!e)return[];for(var a=Bn(e,t,n),s=this.sliceRange.apply(this,o([e.range],r)),l=0,u=s;l<u.length;l++){var c=u[l];c.eventRange=a}return s},e.prototype.sliceEventRanges=function(e,t){for(var n=[],r=0,o=e;r<o.length;r++){var i=o[r];n.push.apply(n,this.sliceEventRange(i,t))}return n},e.prototype.sliceEventRange=function(e,t){var n=e.range;this.forceDayIfListItem&&"list-item"===e.ui.display&&(n={start:n.start,end:De(n.start,1)});for(var r=this.sliceRange.apply(this,o([n],t)),i=0,a=r;i<a.length;i++){var s=a[i];s.eventRange=e,s.isStart=e.isStart&&s.isStart,s.isEnd=e.isEnd&&s.isEnd}return r},e}();function qi(e,t){var n=e.activeRange;return t?n:{start:Re(n.start,e.slotMinTime.milliseconds),end:Re(n.end,e.slotMaxTime.milliseconds-864e5)}}var Yi=/^(visible|hidden)$/,Zi=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.handleEl=function(e){t.el=e,io(t.props.elRef,e)},t}return n(t,e),t.prototype.render=function(){var e=this.props,t=e.liquid,n=e.liquidIsAbsolute,r=t&&n,o=["fc-scroller"];return t&&(n?o.push("fc-scroller-liquid-absolute"):o.push("fc-scroller-liquid")),qr("div",{ref:this.handleEl,className:o.join(" "),style:{overflowX:e.overflowX,overflowY:e.overflowY,left:r&&-(e.overcomeLeft||0)||"",right:r&&-(e.overcomeRight||0)||"",bottom:r&&-(e.overcomeBottom||0)||"",marginLeft:!r&&-(e.overcomeLeft||0)||"",marginRight:!r&&-(e.overcomeRight||0)||"",marginBottom:!r&&-(e.overcomeBottom||0)||"",maxHeight:e.maxHeight||""}},e.children)},t.prototype.needsXScrolling=function(){if(Yi.test(this.props.overflowX))return!1;for(var e=this.el,t=this.el.getBoundingClientRect().width-this.getYScrollbarWidth(),n=e.children,r=0;r<n.length;r++){if(n[r].getBoundingClientRect().width>t)return!0}return!1},t.prototype.needsYScrolling=function(){if(Yi.test(this.props.overflowY))return!1;for(var e=this.el,t=this.el.getBoundingClientRect().height-this.getXScrollbarWidth(),n=e.children,r=0;r<n.length;r++){if(n[r].getBoundingClientRect().height>t)return!0}return!1},t.prototype.getXScrollbarWidth=function(){return Yi.test(this.props.overflowX)?0:this.el.offsetHeight-this.el.clientHeight},t.prototype.getYScrollbarWidth=function(){return Yi.test(this.props.overflowY)?0:this.el.offsetWidth-this.el.clientWidth},t}(no),Xi=function(){function e(e){var t=this;this.masterCallback=e,this.currentMap={},this.depths={},this.callbackMap={},this.handleValue=function(e,n){var r=t,o=r.depths,i=r.currentMap,a=!1,s=!1;null!==e?(a=n in i,i[n]=e,o[n]=(o[n]||0)+1,s=!0):0==--o[n]&&(delete i[n],delete t.callbackMap[n],a=!0),t.masterCallback&&(a&&t.masterCallback(null,String(n)),s&&t.masterCallback(e,String(n)))}}return e.prototype.createRef=function(e){var t=this,n=this.callbackMap[e];return n||(n=this.callbackMap[e]=function(n){t.handleValue(n,String(e))}),n},e.prototype.collect=function(e,t,n){return Ke(this.currentMap,e,t,n)},e.prototype.getAll=function(){return Ge(this.currentMap)},e}();function Ki(e){for(var t=0,n=0,r=X(e,".fc-scrollgrid-shrink");n<r.length;n++){var o=r[n];t=Math.max(t,Ee(o))}return Math.ceil(t)}function Ji(e,t){return e.liquid&&t.liquid}function $i(e,t){return null!=t.maxHeight||Ji(e,t)}function Qi(e,t,n){var r=n.expandRows;return"function"==typeof t.content?t.content(n):qr("table",{className:[t.tableClassName,e.syncRowHeights?"fc-scrollgrid-sync-table":""].join(" "),style:{minWidth:n.tableMinWidth,width:n.clientWidth,height:r?n.clientHeight:""}},n.tableColGroupNode,qr("tbody",{},"function"==typeof t.rowContent?t.rowContent(n):t.rowContent))}function ea(e,t){return B(e,t,qe)}function ta(e,t){for(var n=[],r=0,i=e;r<i.length;r++)for(var a=i[r],s=a.span||1,l=0;l<s;l++)n.push(qr("col",{style:{width:"shrink"===a.width?na(t):a.width||"",minWidth:a.minWidth||""}}));return qr.apply(void 0,o(["colgroup",{}],n))}function na(e){return null==e?4:e}function ra(e){for(var t=0,n=e;t<n.length;t++){if("shrink"===n[t].width)return!0}return!1}function oa(e,t){var n=["fc-scrollgrid",t.theme.getClass("table")];return e&&n.push("fc-scrollgrid-liquid"),n}function ia(e,t){var n=["fc-scrollgrid-section",e.className];return t&&e.liquid&&null==e.maxHeight&&n.push("fc-scrollgrid-section-liquid"),e.isSticky&&n.push("fc-scrollgrid-section-sticky"),n}function aa(e){return qr("div",{className:"fc-scrollgrid-sticky-shim",style:{width:e.clientWidth,minWidth:e.tableMinWidth}})}function sa(e){var t=e.stickyHeaderDates;return null!=t&&"auto"!==t||(t="auto"===e.height||"auto"===e.viewHeight),t}function la(e){var t=e.stickyFooterScrollbar;return null!=t&&"auto"!==t||(t="auto"===e.height||"auto"===e.viewHeight),t}var ua=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.processCols=gt((function(e){return e}),ea),t.renderMicroColGroup=gt(ta),t.scrollerRefs=new Xi,t.scrollerElRefs=new Xi(t._handleScrollerEl.bind(t)),t.state={shrinkWidth:null,forceYScrollbars:!1,scrollerClientWidths:{},scrollerClientHeights:{}},t.handleSizing=function(){t.setState(r({shrinkWidth:t.computeShrinkWidth()},t.computeScrollerDims()))},t}return n(t,e),t.prototype.render=function(){for(var e,t=this.props,n=this.state,r=this.context,i=t.sections||[],a=this.processCols(t.cols),s=this.renderMicroColGroup(a,n.shrinkWidth),l=oa(t.liquid,r),u=i.length,c=0,d=[],p=[],f=[];c<u&&"header"===(e=i[c]).type;)d.push(this.renderSection(e,c,s)),c++;for(;c<u&&"body"===(e=i[c]).type;)p.push(this.renderSection(e,c,s)),c++;for(;c<u&&"footer"===(e=i[c]).type;)f.push(this.renderSection(e,c,s)),c++;return qr("table",{className:l.join(" "),style:{height:t.height}},Boolean(d.length)&&qr.apply(void 0,o(["thead",{}],d)),Boolean(p.length)&&qr.apply(void 0,o(["tbody",{}],p)),Boolean(f.length)&&qr.apply(void 0,o(["tfoot",{}],f)))},t.prototype.renderSection=function(e,t,n){return"outerContent"in e?qr(Xr,{key:e.key},e.outerContent):qr("tr",{key:e.key,className:ia(e,this.props.liquid).join(" ")},this.renderChunkTd(e,t,n,e.chunk))},t.prototype.renderChunkTd=function(e,t,n,r){if("outerContent"in r)return r.outerContent;var o=this.props,i=this.state,a=i.forceYScrollbars,s=i.scrollerClientWidths,l=i.scrollerClientHeights,u=$i(o,e),c=Ji(o,e),d=o.liquid?a?"scroll":u?"auto":"hidden":"visible",p=Qi(e,r,{tableColGroupNode:n,tableMinWidth:"",clientWidth:void 0!==s[t]?s[t]:null,clientHeight:void 0!==l[t]?l[t]:null,expandRows:e.expandRows,syncRowHeights:!1,rowSyncHeights:[],reportRowHeightChange:function(){}});return qr("td",{ref:r.elRef},qr("div",{className:"fc-scroller-harness"+(c?" fc-scroller-harness-liquid":"")},qr(Zi,{ref:this.scrollerRefs.createRef(t),elRef:this.scrollerElRefs.createRef(t),overflowY:d,overflowX:o.liquid?"hidden":"visible",maxHeight:e.maxHeight,liquid:c,liquidIsAbsolute:!0},p)))},t.prototype._handleScrollerEl=function(e,t){var n=parseInt(t,10);io(this.props.sections[n].chunk.scrollerElRef,e)},t.prototype.componentDidMount=function(){this.handleSizing(),this.context.addResizeHandler(this.handleSizing)},t.prototype.componentDidUpdate=function(){this.handleSizing()},t.prototype.componentWillUnmount=function(){this.context.removeResizeHandler(this.handleSizing)},t.prototype.computeShrinkWidth=function(){return ra(this.props.cols)?Ki(this.scrollerElRefs.getAll()):0},t.prototype.computeScrollerDims=function(){for(var e=Nr(),t=this.props.sections.length,n=this.scrollerRefs,r=this.scrollerElRefs,o=!1,i={},a={},s=0;s<t;s++){var l=n.currentMap[s];if(l&&l.needsYScrolling()){o=!0;break}}for(s=0;s<t;s++){var u=r.currentMap[s];if(u){var c=u.parentNode;i[s]=Math.floor(c.getBoundingClientRect().width-(o?e.y:0)),a[s]=Math.floor(c.getBoundingClientRect().height)}}return{forceYScrollbars:o,scrollerClientWidths:i,scrollerClientHeights:a}},t}(no);ua.addStateEquality({scrollerClientWidths:qe,scrollerClientHeights:qe});var ca=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.elRef=Zr(),t}return n(t,e),t.prototype.render=function(){var e=this.props,t=this.context,n=t.options,r=e.seg,o=r.eventRange,i=o.ui,a={event:new Qn(t,o.def,o.instance),view:t.viewApi,timeText:e.timeText,textColor:i.textColor,backgroundColor:i.backgroundColor,borderColor:i.borderColor,isDraggable:!e.disableDragging&&kn(r,t),isStartResizable:!e.disableResizing&&Mn(r,t),isEndResizable:!e.disableResizing&&Pn(r),isMirror:Boolean(e.isDragging||e.isResizing||e.isDateSelecting),isStart:Boolean(r.isStart),isEnd:Boolean(r.isEnd),isPast:Boolean(e.isPast),isFuture:Boolean(e.isFuture),isToday:Boolean(e.isToday),isSelected:Boolean(e.isSelected),isDragging:Boolean(e.isDragging),isResizing:Boolean(e.isResizing)},s=_n(a).concat(i.classNames);return qr(bo,{hookProps:a,classNames:n.eventClassNames,content:n.eventContent,defaultContent:e.defaultContent,didMount:n.eventDidMount,willUnmount:n.eventWillUnmount,elRef:this.elRef},(function(t,n,r,o){return e.children(t,s.concat(n),r,o,a)}))},t.prototype.componentDidMount=function(){bn(this.elRef.current,this.props.seg)},t.prototype.componentDidUpdate=function(e){var t=this.props.seg;t!==e.seg&&bn(this.elRef.current,t)},t}(no),da=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.render=function(){var e=this.props,t=this.context,n=e.seg,o=t.options.eventTimeFormat||e.defaultTimeFormat,i=In(n,o,t,e.defaultDisplayEventTime,e.defaultDisplayEventEnd);return qr(ca,{seg:n,timeText:i,disableDragging:e.disableDragging,disableResizing:e.disableResizing,defaultContent:e.defaultContent||pa,isDragging:e.isDragging,isResizing:e.isResizing,isDateSelecting:e.isDateSelecting,isSelected:e.isSelected,isPast:e.isPast,isFuture:e.isFuture,isToday:e.isToday},(function(t,o,i,a,s){return qr("a",r({className:e.extraClassNames.concat(o).join(" "),style:{borderColor:s.borderColor,backgroundColor:s.backgroundColor},ref:t},function(e){var t=e.eventRange.def.url;return t?{href:t}:{}}(n)),qr("div",{className:"fc-event-main",ref:i,style:{color:s.textColor}},a),s.isStartResizable&&qr("div",{className:"fc-event-resizer fc-event-resizer-start"}),s.isEndResizable&&qr("div",{className:"fc-event-resizer fc-event-resizer-end"}))}))},t}(no);function pa(e){return qr("div",{className:"fc-event-main-frame"},e.timeText&&qr("div",{className:"fc-event-time"},e.timeText),qr("div",{className:"fc-event-title-container"},qr("div",{className:"fc-event-title fc-sticky"},e.event.title||qr(Xr,null," "))))}var fa=function(e){return qr(Qr.Consumer,null,(function(t){var n=t.options,r={isAxis:e.isAxis,date:t.dateEnv.toDate(e.date),view:t.viewApi};return qr(bo,{hookProps:r,classNames:n.nowIndicatorClassNames,content:n.nowIndicatorContent,didMount:n.nowIndicatorDidMount,willUnmount:n.nowIndicatorWillUnmount},e.children)}))},ha=Nt({day:"numeric"}),ga=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.refineHookProps=vt(ma),t.normalizeClassNames=To(),t}return n(t,e),t.prototype.render=function(){var e=this.props,t=this.context,n=t.options,r=this.refineHookProps({date:e.date,dateProfile:e.dateProfile,todayRange:e.todayRange,showDayNumber:e.showDayNumber,extraProps:e.extraHookProps,viewApi:t.viewApi,dateEnv:t.dateEnv}),o=Tr(r,t.theme).concat(r.isDisabled?[]:this.normalizeClassNames(n.dayCellClassNames,r)),i=r.isDisabled?{}:{"data-date":pt(e.date)};return qr(wo,{hookProps:r,didMount:n.dayCellDidMount,willUnmount:n.dayCellWillUnmount,elRef:e.elRef},(function(t){return e.children(t,o,i,r.isDisabled)}))},t}(no),va=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.render=function(){var e=this.props,t=this.context,n=t.options,r=ma({date:e.date,dateProfile:e.dateProfile,todayRange:e.todayRange,showDayNumber:e.showDayNumber,extraProps:e.extraHookProps,viewApi:t.viewApi,dateEnv:t.dateEnv});return qr(Ro,{hookProps:r,content:n.dayCellContent,defaultContent:e.defaultContent},e.children)},t}(no);function ma(e){var t=e.date,n=e.dateEnv,o=wr(t,e.todayRange,null,e.dateProfile);return r(r(r({date:n.toDate(t),view:e.viewApi},o),{dayNumberText:e.showDayNumber?n.format(t,ha):""}),e.extraProps)}function ya(e){return qr("div",{className:"fc-"+e})}var Sa=function(e){return qr(ca,{defaultContent:Ea,seg:e.seg,timeText:"",disableDragging:!0,disableResizing:!0,isDragging:!1,isResizing:!1,isDateSelecting:!1,isSelected:!1,isPast:e.isPast,isFuture:e.isFuture,isToday:e.isToday},(function(e,t,n,r,o){return qr("div",{ref:e,className:["fc-bg-event"].concat(t).join(" "),style:{backgroundColor:o.backgroundColor}},r)}))};function Ea(e){return e.event.title&&qr("div",{className:"fc-event-title"},e.event.title)}var Ca=function(e){return qr(Qr.Consumer,null,(function(t){var n=t.dateEnv,r=t.options,o=e.date,i=r.weekNumberFormat||e.defaultFormat,a=n.computeWeekNumber(o),s=n.format(o,i);return qr(bo,{hookProps:{num:a,text:s,date:o},classNames:r.weekNumberClassNames,content:r.weekNumberContent,defaultContent:ba,didMount:r.weekNumberDidMount,willUnmount:r.weekNumberWillUnmount},e.children)}))};function ba(e){return e.text}var Da=function(e){function t(t,n){void 0===n&&(n={});var o=e.call(this)||this;return o.isRendering=!1,o.isRendered=!1,o.currentClassNames=[],o.customContentRenderId=0,o.handleAction=function(e){switch(e.type){case"SET_EVENT_DRAG":case"SET_EVENT_RESIZE":o.renderRunner.tryDrain()}},o.handleData=function(e){o.currentData=e,o.renderRunner.request(e.calendarOptions.rerenderDelay)},o.handleRenderRequest=function(){if(o.isRendering){o.isRendered=!0;var e=o.currentData;Yr(qr(_i,{options:e.calendarOptions,theme:e.theme,emitter:e.emitter},(function(t,n,i,a){return o.setClassNames(t),o.setHeight(n),qr(Do.Provider,{value:o.customContentRenderId},qr(Mi,r({isHeightAuto:i,forPrint:a},e)))})),o.el)}else o.isRendered&&(o.isRendered=!1,Yr(null,o.el),o.setClassNames([]),o.setHeight(""));Jr()},o.el=t,o.renderRunner=new ei(o.handleRenderRequest),new ri({optionOverrides:n,calendarApi:o,onAction:o.handleAction,onData:o.handleData}),o}return n(t,e),Object.defineProperty(t.prototype,"view",{get:function(){return this.currentData.viewApi},enumerable:!1,configurable:!0}),t.prototype.render=function(){this.isRendering?this.customContentRenderId++:this.isRendering=!0,this.renderRunner.request()},t.prototype.destroy=function(){this.isRendering&&(this.isRendering=!1,this.renderRunner.request())},t.prototype.updateSize=function(){e.prototype.updateSize.call(this),Jr()},t.prototype.batchRendering=function(e){this.renderRunner.pause("batchRendering"),e(),this.renderRunner.resume("batchRendering")},t.prototype.pauseRendering=function(){this.renderRunner.pause("pauseRendering")},t.prototype.resumeRendering=function(){this.renderRunner.resume("pauseRendering",!0)},t.prototype.resetOptions=function(e,t){this.currentDataManager.resetOptions(e,t)},t.prototype.setClassNames=function(e){if(!B(e,this.currentClassNames)){for(var t=this.el.classList,n=0,r=this.currentClassNames;n<r.length;n++){var o=r[n];t.remove(o)}for(var i=0,a=e;i<a.length;i++){o=a[i];t.add(o)}this.currentClassNames=e}},t.prototype.setHeight=function(e){Q(this.el,"height",e)},t}($n);Ei.touchMouseIgnoreWait=500;var Ra=0,wa=0,Ta=!1,xa=function(){function e(e){var t=this;this.subjectEl=null,this.downEl=null,this.selector="",this.handleSelector="",this.shouldIgnoreMove=!1,this.shouldWatchScroll=!0,this.isDragging=!1,this.isTouchDragging=!1,this.wasTouchScroll=!1,this.handleMouseDown=function(e){if(!t.shouldIgnoreMouse()&&function(e){return 0===e.button&&!e.ctrlKey}(e)&&t.tryStart(e)){var n=t.createEventFromMouse(e,!0);t.emitter.trigger("pointerdown",n),t.initScrollWatch(n),t.shouldIgnoreMove||document.addEventListener("mousemove",t.handleMouseMove),document.addEventListener("mouseup",t.handleMouseUp)}},this.handleMouseMove=function(e){var n=t.createEventFromMouse(e);t.recordCoords(n),t.emitter.trigger("pointermove",n)},this.handleMouseUp=function(e){document.removeEventListener("mousemove",t.handleMouseMove),document.removeEventListener("mouseup",t.handleMouseUp),t.emitter.trigger("pointerup",t.createEventFromMouse(e)),t.cleanup()},this.handleTouchStart=function(e){if(t.tryStart(e)){t.isTouchDragging=!0;var n=t.createEventFromTouch(e,!0);t.emitter.trigger("pointerdown",n),t.initScrollWatch(n);var r=e.target;t.shouldIgnoreMove||r.addEventListener("touchmove",t.handleTouchMove),r.addEventListener("touchend",t.handleTouchEnd),r.addEventListener("touchcancel",t.handleTouchEnd),window.addEventListener("scroll",t.handleTouchScroll,!0)}},this.handleTouchMove=function(e){var n=t.createEventFromTouch(e);t.recordCoords(n),t.emitter.trigger("pointermove",n)},this.handleTouchEnd=function(e){if(t.isDragging){var n=e.target;n.removeEventListener("touchmove",t.handleTouchMove),n.removeEventListener("touchend",t.handleTouchEnd),n.removeEventListener("touchcancel",t.handleTouchEnd),window.removeEventListener("scroll",t.handleTouchScroll,!0),t.emitter.trigger("pointerup",t.createEventFromTouch(e)),t.cleanup(),t.isTouchDragging=!1,Ra++,setTimeout((function(){Ra--}),Ei.touchMouseIgnoreWait)}},this.handleTouchScroll=function(){t.wasTouchScroll=!0},this.handleScroll=function(e){if(!t.shouldIgnoreMove){var n=window.pageXOffset-t.prevScrollX+t.prevPageX,r=window.pageYOffset-t.prevScrollY+t.prevPageY;t.emitter.trigger("pointermove",{origEvent:e,isTouch:t.isTouchDragging,subjectEl:t.subjectEl,pageX:n,pageY:r,deltaX:n-t.origPageX,deltaY:r-t.origPageY})}},this.containerEl=e,this.emitter=new Ur,e.addEventListener("mousedown",this.handleMouseDown),e.addEventListener("touchstart",this.handleTouchStart,{passive:!0}),wa++||window.addEventListener("touchmove",ka,{passive:!1})}return e.prototype.destroy=function(){this.containerEl.removeEventListener("mousedown",this.handleMouseDown),this.containerEl.removeEventListener("touchstart",this.handleTouchStart,{passive:!0}),--wa||window.removeEventListener("touchmove",ka,{passive:!1})},e.prototype.tryStart=function(e){var t=this.querySubjectEl(e),n=e.target;return!(!t||this.handleSelector&&!Y(n,this.handleSelector))&&(this.subjectEl=t,this.downEl=n,this.isDragging=!0,this.wasTouchScroll=!1,!0)},e.prototype.cleanup=function(){Ta=!1,this.isDragging=!1,this.subjectEl=null,this.downEl=null,this.destroyScrollWatch()},e.prototype.querySubjectEl=function(e){return this.selector?Y(e.target,this.selector):this.containerEl},e.prototype.shouldIgnoreMouse=function(){return Ra||this.isTouchDragging},e.prototype.cancelTouchScroll=function(){this.isDragging&&(Ta=!0)},e.prototype.initScrollWatch=function(e){this.shouldWatchScroll&&(this.recordCoords(e),window.addEventListener("scroll",this.handleScroll,!0))},e.prototype.recordCoords=function(e){this.shouldWatchScroll&&(this.prevPageX=e.pageX,this.prevPageY=e.pageY,this.prevScrollX=window.pageXOffset,this.prevScrollY=window.pageYOffset)},e.prototype.destroyScrollWatch=function(){this.shouldWatchScroll&&window.removeEventListener("scroll",this.handleScroll,!0)},e.prototype.createEventFromMouse=function(e,t){var n=0,r=0;return t?(this.origPageX=e.pageX,this.origPageY=e.pageY):(n=e.pageX-this.origPageX,r=e.pageY-this.origPageY),{origEvent:e,isTouch:!1,subjectEl:this.subjectEl,pageX:e.pageX,pageY:e.pageY,deltaX:n,deltaY:r}},e.prototype.createEventFromTouch=function(e,t){var n,r,o=e.touches,i=0,a=0;return o&&o.length?(n=o[0].pageX,r=o[0].pageY):(n=e.pageX,r=e.pageY),t?(this.origPageX=n,this.origPageY=r):(i=n-this.origPageX,a=r-this.origPageY),{origEvent:e,isTouch:!0,subjectEl:this.subjectEl,pageX:n,pageY:r,deltaX:i,deltaY:a}},e}();function ka(e){Ta&&e.preventDefault()}var Ma=function(){function e(){this.isVisible=!1,this.sourceEl=null,this.mirrorEl=null,this.sourceElRect=null,this.parentNode=document.body,this.zIndex=9999,this.revertDuration=0}return e.prototype.start=function(e,t,n){this.sourceEl=e,this.sourceElRect=this.sourceEl.getBoundingClientRect(),this.origScreenX=t-window.pageXOffset,this.origScreenY=n-window.pageYOffset,this.deltaX=0,this.deltaY=0,this.updateElPosition()},e.prototype.handleMove=function(e,t){this.deltaX=e-window.pageXOffset-this.origScreenX,this.deltaY=t-window.pageYOffset-this.origScreenY,this.updateElPosition()},e.prototype.setIsVisible=function(e){e?this.isVisible||(this.mirrorEl&&(this.mirrorEl.style.display=""),this.isVisible=e,this.updateElPosition()):this.isVisible&&(this.mirrorEl&&(this.mirrorEl.style.display="none"),this.isVisible=e)},e.prototype.stop=function(e,t){var n=this,r=function(){n.cleanup(),t()};e&&this.mirrorEl&&this.isVisible&&this.revertDuration&&(this.deltaX||this.deltaY)?this.doRevertAnimation(r,this.revertDuration):setTimeout(r,0)},e.prototype.doRevertAnimation=function(e,t){var n=this.mirrorEl,r=this.sourceEl.getBoundingClientRect();n.style.transition="top "+t+"ms,left "+t+"ms",$(n,{left:r.left,top:r.top}),oe(n,(function(){n.style.transition="",e()}))},e.prototype.cleanup=function(){this.mirrorEl&&(V(this.mirrorEl),this.mirrorEl=null),this.sourceEl=null},e.prototype.updateElPosition=function(){this.sourceEl&&this.isVisible&&$(this.getMirrorEl(),{left:this.sourceElRect.left+this.deltaX,top:this.sourceElRect.top+this.deltaY})},e.prototype.getMirrorEl=function(){var e=this.sourceElRect,t=this.mirrorEl;return t||((t=this.mirrorEl=this.sourceEl.cloneNode(!0)).classList.add("fc-unselectable"),t.classList.add("fc-event-dragging"),$(t,{position:"fixed",zIndex:this.zIndex,visibility:"",boxSizing:"border-box",width:e.right-e.left,height:e.bottom-e.top,right:"auto",bottom:"auto",margin:0}),this.parentNode.appendChild(t)),t},e}(),Pa=function(e){function t(t,n){var r=e.call(this)||this;return r.handleScroll=function(){r.scrollTop=r.scrollController.getScrollTop(),r.scrollLeft=r.scrollController.getScrollLeft(),r.handleScrollChange()},r.scrollController=t,r.doesListening=n,r.scrollTop=r.origScrollTop=t.getScrollTop(),r.scrollLeft=r.origScrollLeft=t.getScrollLeft(),r.scrollWidth=t.getScrollWidth(),r.scrollHeight=t.getScrollHeight(),r.clientWidth=t.getClientWidth(),r.clientHeight=t.getClientHeight(),r.clientRect=r.computeClientRect(),r.doesListening&&r.getEventTarget().addEventListener("scroll",r.handleScroll),r}return n(t,e),t.prototype.destroy=function(){this.doesListening&&this.getEventTarget().removeEventListener("scroll",this.handleScroll)},t.prototype.getScrollTop=function(){return this.scrollTop},t.prototype.getScrollLeft=function(){return this.scrollLeft},t.prototype.setScrollTop=function(e){this.scrollController.setScrollTop(e),this.doesListening||(this.scrollTop=Math.max(Math.min(e,this.getMaxScrollTop()),0),this.handleScrollChange())},t.prototype.setScrollLeft=function(e){this.scrollController.setScrollLeft(e),this.doesListening||(this.scrollLeft=Math.max(Math.min(e,this.getMaxScrollLeft()),0),this.handleScrollChange())},t.prototype.getClientWidth=function(){return this.clientWidth},t.prototype.getClientHeight=function(){return this.clientHeight},t.prototype.getScrollWidth=function(){return this.scrollWidth},t.prototype.getScrollHeight=function(){return this.scrollHeight},t.prototype.handleScrollChange=function(){},t}(zr),Ia=function(e){function t(t,n){return e.call(this,new Vr(t),n)||this}return n(t,e),t.prototype.getEventTarget=function(){return this.scrollController.el},t.prototype.computeClientRect=function(){return Or(this.scrollController.el)},t}(Pa),Na=function(e){function t(t){return e.call(this,new Fr,t)||this}return n(t,e),t.prototype.getEventTarget=function(){return window},t.prototype.computeClientRect=function(){return{left:this.scrollLeft,right:this.scrollLeft+this.clientWidth,top:this.scrollTop,bottom:this.scrollTop+this.clientHeight}},t.prototype.handleScrollChange=function(){this.clientRect=this.computeClientRect()},t}(Pa),_a="function"==typeof performance?performance.now:Date.now,Ha=function(){function e(){var e=this;this.isEnabled=!0,this.scrollQuery=[window,".fc-scroller"],this.edgeThreshold=50,this.maxVelocity=300,this.pointerScreenX=null,this.pointerScreenY=null,this.isAnimating=!1,this.scrollCaches=null,this.everMovedUp=!1,this.everMovedDown=!1,this.everMovedLeft=!1,this.everMovedRight=!1,this.animate=function(){if(e.isAnimating){var t=e.computeBestEdge(e.pointerScreenX+window.pageXOffset,e.pointerScreenY+window.pageYOffset);if(t){var n=_a();e.handleSide(t,(n-e.msSinceRequest)/1e3),e.requestAnimation(n)}else e.isAnimating=!1}}}return e.prototype.start=function(e,t){this.isEnabled&&(this.scrollCaches=this.buildCaches(),this.pointerScreenX=null,this.pointerScreenY=null,this.everMovedUp=!1,this.everMovedDown=!1,this.everMovedLeft=!1,this.everMovedRight=!1,this.handleMove(e,t))},e.prototype.handleMove=function(e,t){if(this.isEnabled){var n=e-window.pageXOffset,r=t-window.pageYOffset,o=null===this.pointerScreenY?0:r-this.pointerScreenY,i=null===this.pointerScreenX?0:n-this.pointerScreenX;o<0?this.everMovedUp=!0:o>0&&(this.everMovedDown=!0),i<0?this.everMovedLeft=!0:i>0&&(this.everMovedRight=!0),this.pointerScreenX=n,this.pointerScreenY=r,this.isAnimating||(this.isAnimating=!0,this.requestAnimation(_a()))}},e.prototype.stop=function(){if(this.isEnabled){this.isAnimating=!1;for(var e=0,t=this.scrollCaches;e<t.length;e++){t[e].destroy()}this.scrollCaches=null}},e.prototype.requestAnimation=function(e){this.msSinceRequest=e,requestAnimationFrame(this.animate)},e.prototype.handleSide=function(e,t){var n=e.scrollCache,r=this.edgeThreshold,o=r-e.distance,i=o*o/(r*r)*this.maxVelocity*t,a=1;switch(e.name){case"left":a=-1;case"right":n.setScrollLeft(n.getScrollLeft()+i*a);break;case"top":a=-1;case"bottom":n.setScrollTop(n.getScrollTop()+i*a)}},e.prototype.computeBestEdge=function(e,t){for(var n=this.edgeThreshold,r=null,o=0,i=this.scrollCaches;o<i.length;o++){var a=i[o],s=a.clientRect,l=e-s.left,u=s.right-e,c=t-s.top,d=s.bottom-t;l>=0&&u>=0&&c>=0&&d>=0&&(c<=n&&this.everMovedUp&&a.canScrollUp()&&(!r||r.distance>c)&&(r={scrollCache:a,name:"top",distance:c}),d<=n&&this.everMovedDown&&a.canScrollDown()&&(!r||r.distance>d)&&(r={scrollCache:a,name:"bottom",distance:d}),l<=n&&this.everMovedLeft&&a.canScrollLeft()&&(!r||r.distance>l)&&(r={scrollCache:a,name:"left",distance:l}),u<=n&&this.everMovedRight&&a.canScrollRight()&&(!r||r.distance>u)&&(r={scrollCache:a,name:"right",distance:u}))}return r},e.prototype.buildCaches=function(){return this.queryScrollEls().map((function(e){return e===window?new Na(!1):new Ia(e,!1)}))},e.prototype.queryScrollEls=function(){for(var e=[],t=0,n=this.scrollQuery;t<n.length;t++){var r=n[t];"object"==typeof r?e.push(r):e.push.apply(e,Array.prototype.slice.call(document.querySelectorAll(r)))}return e},e}(),Oa=function(e){function t(t,n){var r=e.call(this,t)||this;r.delay=null,r.minDistance=0,r.touchScrollAllowed=!0,r.mirrorNeedsRevert=!1,r.isInteracting=!1,r.isDragging=!1,r.isDelayEnded=!1,r.isDistanceSurpassed=!1,r.delayTimeoutId=null,r.onPointerDown=function(e){r.isDragging||(r.isInteracting=!0,r.isDelayEnded=!1,r.isDistanceSurpassed=!1,ue(document.body),de(document.body),e.isTouch||e.origEvent.preventDefault(),r.emitter.trigger("pointerdown",e),r.isInteracting&&!r.pointer.shouldIgnoreMove&&(r.mirror.setIsVisible(!1),r.mirror.start(e.subjectEl,e.pageX,e.pageY),r.startDelay(e),r.minDistance||r.handleDistanceSurpassed(e)))},r.onPointerMove=function(e){if(r.isInteracting){if(r.emitter.trigger("pointermove",e),!r.isDistanceSurpassed){var t=r.minDistance,n=e.deltaX,o=e.deltaY;n*n+o*o>=t*t&&r.handleDistanceSurpassed(e)}r.isDragging&&("scroll"!==e.origEvent.type&&(r.mirror.handleMove(e.pageX,e.pageY),r.autoScroller.handleMove(e.pageX,e.pageY)),r.emitter.trigger("dragmove",e))}},r.onPointerUp=function(e){r.isInteracting&&(r.isInteracting=!1,ce(document.body),pe(document.body),r.emitter.trigger("pointerup",e),r.isDragging&&(r.autoScroller.stop(),r.tryStopDrag(e)),r.delayTimeoutId&&(clearTimeout(r.delayTimeoutId),r.delayTimeoutId=null))};var o=r.pointer=new xa(t);return o.emitter.on("pointerdown",r.onPointerDown),o.emitter.on("pointermove",r.onPointerMove),o.emitter.on("pointerup",r.onPointerUp),n&&(o.selector=n),r.mirror=new Ma,r.autoScroller=new Ha,r}return n(t,e),t.prototype.destroy=function(){this.pointer.destroy(),this.onPointerUp({})},t.prototype.startDelay=function(e){var t=this;"number"==typeof this.delay?this.delayTimeoutId=setTimeout((function(){t.delayTimeoutId=null,t.handleDelayEnd(e)}),this.delay):this.handleDelayEnd(e)},t.prototype.handleDelayEnd=function(e){this.isDelayEnded=!0,this.tryStartDrag(e)},t.prototype.handleDistanceSurpassed=function(e){this.isDistanceSurpassed=!0,this.tryStartDrag(e)},t.prototype.tryStartDrag=function(e){this.isDelayEnded&&this.isDistanceSurpassed&&(this.pointer.wasTouchScroll&&!this.touchScrollAllowed||(this.isDragging=!0,this.mirrorNeedsRevert=!1,this.autoScroller.start(e.pageX,e.pageY),this.emitter.trigger("dragstart",e),!1===this.touchScrollAllowed&&this.pointer.cancelTouchScroll()))},t.prototype.tryStopDrag=function(e){this.mirror.stop(this.mirrorNeedsRevert,this.stopDrag.bind(this,e))},t.prototype.stopDrag=function(e){this.isDragging=!1,this.emitter.trigger("dragend",e)},t.prototype.setIgnoreMove=function(e){this.pointer.shouldIgnoreMove=e},t.prototype.setMirrorIsVisible=function(e){this.mirror.setIsVisible(e)},t.prototype.setMirrorNeedsRevert=function(e){this.mirrorNeedsRevert=e},t.prototype.setAutoScrollEnabled=function(e){this.autoScroller.isEnabled=e},t}(Si),Wa=function(){function e(e){this.origRect=Wr(e),this.scrollCaches=Ar(e).map((function(e){return new Ia(e,!0)}))}return e.prototype.destroy=function(){for(var e=0,t=this.scrollCaches;e<t.length;e++){t[e].destroy()}},e.prototype.computeLeft=function(){for(var e=this.origRect.left,t=0,n=this.scrollCaches;t<n.length;t++){var r=n[t];e+=r.origScrollLeft-r.getScrollLeft()}return e},e.prototype.computeTop=function(){for(var e=this.origRect.top,t=0,n=this.scrollCaches;t<n.length;t++){var r=n[t];e+=r.origScrollTop-r.getScrollTop()}return e},e.prototype.isWithinClipping=function(e,t){for(var n,r,o={left:e,top:t},i=0,a=this.scrollCaches;i<a.length;i++){var s=a[i];if(n=s.getEventTarget(),r=void 0,"HTML"!==(r=n.tagName)&&"BODY"!==r&&!vr(o,s.clientRect))return!1}return!0},e}();var Aa=function(){function e(e,t){var n=this;this.useSubjectCenter=!1,this.requireInitial=!0,this.initialHit=null,this.movingHit=null,this.finalHit=null,this.handlePointerDown=function(e){var t=n.dragging;n.initialHit=null,n.movingHit=null,n.finalHit=null,n.prepareHits(),n.processFirstCoord(e),n.initialHit||!n.requireInitial?(t.setIgnoreMove(!1),n.emitter.trigger("pointerdown",e)):t.setIgnoreMove(!0)},this.handleDragStart=function(e){n.emitter.trigger("dragstart",e),n.handleMove(e,!0)},this.handleDragMove=function(e){n.emitter.trigger("dragmove",e),n.handleMove(e)},this.handlePointerUp=function(e){n.releaseHits(),n.emitter.trigger("pointerup",e)},this.handleDragEnd=function(e){n.movingHit&&n.emitter.trigger("hitupdate",null,!0,e),n.finalHit=n.movingHit,n.movingHit=null,n.emitter.trigger("dragend",e)},this.droppableStore=t,e.emitter.on("pointerdown",this.handlePointerDown),e.emitter.on("dragstart",this.handleDragStart),e.emitter.on("dragmove",this.handleDragMove),e.emitter.on("pointerup",this.handlePointerUp),e.emitter.on("dragend",this.handleDragEnd),this.dragging=e,this.emitter=new Ur}return e.prototype.processFirstCoord=function(e){var t,n={left:e.pageX,top:e.pageY},r=n,o=e.subjectEl;o!==document&&(r=Sr(r,t=Wr(o)));var i=this.initialHit=this.queryHitForOffset(r.left,r.top);if(i){if(this.useSubjectCenter&&t){var a=mr(t,i.rect);a&&(r=Er(a))}this.coordAdjust=Cr(r,n)}else this.coordAdjust={left:0,top:0}},e.prototype.handleMove=function(e,t){var n=this.queryHitForOffset(e.pageX+this.coordAdjust.left,e.pageY+this.coordAdjust.top);!t&&La(this.movingHit,n)||(this.movingHit=n,this.emitter.trigger("hitupdate",n,!1,e))},e.prototype.prepareHits=function(){this.offsetTrackers=Fe(this.droppableStore,(function(e){return e.component.prepareHits(),new Wa(e.el)}))},e.prototype.releaseHits=function(){var e=this.offsetTrackers;for(var t in e)e[t].destroy();this.offsetTrackers={}},e.prototype.queryHitForOffset=function(e,t){var n=this.droppableStore,r=this.offsetTrackers,o=null;for(var i in n){var a=n[i].component,s=r[i];if(s&&s.isWithinClipping(e,t)){var l=s.computeLeft(),u=s.computeTop(),c=e-l,d=t-u,p=s.origRect,f=p.right-p.left,h=p.bottom-p.top;if(c>=0&&c<f&&d>=0&&d<h){var g=a.queryHit(c,d,f,h),v=a.context.getCurrentData().dateProfile;g&&yn(v.activeRange,g.dateSpan.range)&&(!o||g.layer>o.layer)&&(g.rect.left+=l,g.rect.right+=l,g.rect.top+=u,g.rect.bottom+=u,o=g)}}}return o},e}();function La(e,t){return!e&&!t||Boolean(e)===Boolean(t)&&An(e.dateSpan,t.dateSpan)}function Ua(e,t){for(var n,o,i={},a=0,s=t.pluginHooks.datePointTransforms;a<s.length;a++){var l=s[a];r(i,l(e,t))}return r(i,(n=e,{date:(o=t.dateEnv).toDate(n.range.start),dateStr:o.formatIso(n.range.start,{omitTime:n.allDay}),allDay:n.allDay})),i}var Ba=function(e){function t(t){var n=e.call(this,t)||this;n.handlePointerDown=function(e){var t=n.dragging;t.setIgnoreMove(!n.component.isValidDateDownEl(t.pointer.downEl))},n.handleDragEnd=function(e){var t=n.component;if(!n.dragging.pointer.wasTouchScroll){var o=n.hitDragging,i=o.initialHit,a=o.finalHit;if(i&&a&&La(i,a)){var s=t.context,l=r(r({},Ua(i.dateSpan,s)),{dayEl:i.dayEl,jsEvent:e.origEvent,view:s.viewApi||s.calendarApi.view});s.emitter.trigger("dateClick",l)}}},n.dragging=new Oa(t.el),n.dragging.autoScroller.isEnabled=!1;var o=n.hitDragging=new Aa(n.dragging,mi(t));return o.emitter.on("pointerdown",n.handlePointerDown),o.emitter.on("dragend",n.handleDragEnd),n}return n(t,e),t.prototype.destroy=function(){this.dragging.destroy()},t}(gi),za=function(e){function t(t){var n=e.call(this,t)||this;n.dragSelection=null,n.handlePointerDown=function(e){var t=n,r=t.component,o=t.dragging,i=r.context.options.selectable&&r.isValidDateDownEl(e.origEvent.target);o.setIgnoreMove(!i),o.delay=e.isTouch?function(e){var t=e.context.options,n=t.selectLongPressDelay;null==n&&(n=t.longPressDelay);return n}(r):null},n.handleDragStart=function(e){n.component.context.calendarApi.unselect(e)},n.handleHitUpdate=function(e,t){var o=n.component.context,i=null,a=!1;e&&((i=function(e,t,n){var o=e.dateSpan,i=t.dateSpan,a=[o.range.start,o.range.end,i.range.start,i.range.end];a.sort(ye);for(var s={},l=0,u=n;l<u.length;l++){var c=(0,u[l])(e,t);if(!1===c)return null;c&&r(s,c)}return s.range={start:a[0],end:a[3]},s.allDay=o.allDay,s}(n.hitDragging.initialHit,e,o.pluginHooks.dateSelectionTransformers))&&n.component.isDateSelectionValid(i)||(a=!0,i=null)),i?o.dispatch({type:"SELECT_DATES",selection:i}):t||o.dispatch({type:"UNSELECT_DATES"}),a?se():le(),t||(n.dragSelection=i)},n.handlePointerUp=function(e){n.dragSelection&&(zn(n.dragSelection,e,n.component.context),n.dragSelection=null)};var o=t.component.context.options,i=n.dragging=new Oa(t.el);i.touchScrollAllowed=!1,i.minDistance=o.selectMinDistance||0,i.autoScroller.isEnabled=o.dragScroll;var a=n.hitDragging=new Aa(n.dragging,mi(t));return a.emitter.on("pointerdown",n.handlePointerDown),a.emitter.on("dragstart",n.handleDragStart),a.emitter.on("hitupdate",n.handleHitUpdate),a.emitter.on("pointerup",n.handlePointerUp),n}return n(t,e),t.prototype.destroy=function(){this.dragging.destroy()},t}(gi);var Va=function(e){function t(n){var o=e.call(this,n)||this;o.subjectEl=null,o.subjectSeg=null,o.isDragging=!1,o.eventRange=null,o.relevantEvents=null,o.receivingContext=null,o.validMutation=null,o.mutatedRelevantEvents=null,o.handlePointerDown=function(e){var t=e.origEvent.target,n=o,r=n.component,i=n.dragging,a=i.mirror,s=r.context.options,l=r.context;o.subjectEl=e.subjectEl;var u=o.subjectSeg=Dn(e.subjectEl),c=(o.eventRange=u.eventRange).instance.instanceId;o.relevantEvents=Gt(l.getCurrentData().eventStore,c),i.minDistance=e.isTouch?0:s.eventDragMinDistance,i.delay=e.isTouch&&c!==r.props.eventSelection?function(e){var t=e.context.options,n=t.eventLongPressDelay;null==n&&(n=t.longPressDelay);return n}(r):null,a.parentNode=Y(t,".fc"),a.revertDuration=s.dragRevertDuration;var d=r.isValidSegDownEl(t)&&!Y(t,".fc-event-resizer");i.setIgnoreMove(!d),o.isDragging=d&&e.subjectEl.classList.contains("fc-event-draggable")},o.handleDragStart=function(e){var t=o.component.context,n=o.eventRange,r=n.instance.instanceId;e.isTouch?r!==o.component.props.eventSelection&&t.dispatch({type:"SELECT_EVENT",eventInstanceId:r}):t.dispatch({type:"UNSELECT_EVENT"}),o.isDragging&&(t.calendarApi.unselect(e),t.emitter.trigger("eventDragStart",{el:o.subjectEl,event:new Qn(t,n.def,n.instance),jsEvent:e.origEvent,view:t.viewApi}))},o.handleHitUpdate=function(e,t){if(o.isDragging){var n=o.relevantEvents,r=o.hitDragging.initialHit,i=o.component.context,a=null,s=null,l=null,u=!1,c={affectedEvents:n,mutatedEvents:{defs:{},instances:{}},isEvent:!0};if(e){var d=e.component,p=(a=d.context).options;i===a||p.editable&&p.droppable?(s=function(e,t,n){var r=e.dateSpan,o=t.dateSpan,i=r.range.start,a=o.range.start,s={};r.allDay!==o.allDay&&(s.allDay=o.allDay,s.hasEnd=t.component.context.options.allDayMaintainDuration,o.allDay&&(i=Pe(i)));var l=pn(i,a,e.component.context.dateEnv,e.component===t.component?e.component.largeUnit:null);l.milliseconds&&(s.allDay=!1);for(var u={datesDelta:l,standardProps:s},c=0,d=n;c<d.length;c++){(0,d[c])(u,e,t)}return u}(r,e,a.getCurrentData().pluginHooks.eventDragMutationMassagers))&&(l=jn(n,a.getCurrentData().eventUiBases,s,a),c.mutatedEvents=l,d.isInteractionValid(c)||(u=!0,s=null,l=null,c.mutatedEvents={defs:{},instances:{}})):a=null}o.displayDrag(a,c),u?se():le(),t||(i===a&&La(r,e)&&(s=null),o.dragging.setMirrorNeedsRevert(!s),o.dragging.setMirrorIsVisible(!e||!document.querySelector(".fc-event-mirror")),o.receivingContext=a,o.validMutation=s,o.mutatedRelevantEvents=l)}},o.handlePointerUp=function(){o.isDragging||o.cleanup()},o.handleDragEnd=function(e){if(o.isDragging){var t=o.component.context,n=t.viewApi,i=o,a=i.receivingContext,s=i.validMutation,l=o.eventRange.def,u=o.eventRange.instance,c=new Qn(t,l,u),d=o.relevantEvents,p=o.mutatedRelevantEvents,f=o.hitDragging.finalHit;if(o.clearDrag(),t.emitter.trigger("eventDragStop",{el:o.subjectEl,event:c,jsEvent:e.origEvent,view:n}),s){if(a===t){var h=new Qn(t,p.defs[l.defId],u?p.instances[u.instanceId]:null);t.dispatch({type:"MERGE_EVENTS",eventStore:p});for(var g={oldEvent:c,event:h,relatedEvents:tr(p,t,u),revert:function(){t.dispatch({type:"MERGE_EVENTS",eventStore:d})}},v={},m=0,y=t.getCurrentData().pluginHooks.eventDropTransformers;m<y.length;m++){var S=y[m];r(v,S(s,t))}t.emitter.trigger("eventDrop",r(r(r({},g),v),{el:e.subjectEl,delta:s.datesDelta,jsEvent:e.origEvent,view:n})),t.emitter.trigger("eventChange",g)}else if(a){t.emitter.trigger("eventLeave",{draggedEl:e.subjectEl,event:c,view:n}),t.dispatch({type:"REMOVE_EVENTS",eventStore:d}),t.emitter.trigger("eventRemove",{event:c,relatedEvents:tr(d,t,u),revert:function(){t.dispatch({type:"MERGE_EVENTS",eventStore:d})}});var E=p.defs[l.defId],C=p.instances[u.instanceId],b=new Qn(a,E,C);a.dispatch({type:"MERGE_EVENTS",eventStore:p}),a.emitter.trigger("eventAdd",{event:b,relatedEvents:tr(p,a,C),revert:function(){a.dispatch({type:"REMOVE_EVENTS",eventStore:p})}}),e.isTouch&&a.dispatch({type:"SELECT_EVENT",eventInstanceId:u.instanceId}),a.emitter.trigger("drop",r(r({},Ua(f.dateSpan,a)),{draggedEl:e.subjectEl,jsEvent:e.origEvent,view:f.component.context.viewApi})),a.emitter.trigger("eventReceive",{draggedEl:e.subjectEl,event:b,view:f.component.context.viewApi})}}else t.emitter.trigger("_noEventDrop")}o.cleanup()};var i=o.component.context.options,a=o.dragging=new Oa(n.el);a.pointer.selector=t.SELECTOR,a.touchScrollAllowed=!1,a.autoScroller.isEnabled=i.dragScroll;var s=o.hitDragging=new Aa(o.dragging,yi);return s.useSubjectCenter=n.useEventCenter,s.emitter.on("pointerdown",o.handlePointerDown),s.emitter.on("dragstart",o.handleDragStart),s.emitter.on("hitupdate",o.handleHitUpdate),s.emitter.on("pointerup",o.handlePointerUp),s.emitter.on("dragend",o.handleDragEnd),o}return n(t,e),t.prototype.destroy=function(){this.dragging.destroy()},t.prototype.displayDrag=function(e,t){var n=this.component.context,r=this.receivingContext;r&&r!==e&&(r===n?r.dispatch({type:"SET_EVENT_DRAG",state:{affectedEvents:t.affectedEvents,mutatedEvents:{defs:{},instances:{}},isEvent:!0}}):r.dispatch({type:"UNSET_EVENT_DRAG"})),e&&e.dispatch({type:"SET_EVENT_DRAG",state:t})},t.prototype.clearDrag=function(){var e=this.component.context,t=this.receivingContext;t&&t.dispatch({type:"UNSET_EVENT_DRAG"}),e!==t&&e.dispatch({type:"UNSET_EVENT_DRAG"})},t.prototype.cleanup=function(){this.subjectSeg=null,this.isDragging=!1,this.eventRange=null,this.relevantEvents=null,this.receivingContext=null,this.validMutation=null,this.mutatedRelevantEvents=null},t.SELECTOR=".fc-event-draggable, .fc-event-resizable",t}(gi);var Fa=function(e){function t(t){var n=e.call(this,t)||this;n.draggingSegEl=null,n.draggingSeg=null,n.eventRange=null,n.relevantEvents=null,n.validMutation=null,n.mutatedRelevantEvents=null,n.handlePointerDown=function(e){var t=n.component,r=Dn(n.querySegEl(e)),o=n.eventRange=r.eventRange;n.dragging.minDistance=t.context.options.eventDragMinDistance,n.dragging.setIgnoreMove(!n.component.isValidSegDownEl(e.origEvent.target)||e.isTouch&&n.component.props.eventSelection!==o.instance.instanceId)},n.handleDragStart=function(e){var t=n.component.context,r=n.eventRange;n.relevantEvents=Gt(t.getCurrentData().eventStore,n.eventRange.instance.instanceId);var o=n.querySegEl(e);n.draggingSegEl=o,n.draggingSeg=Dn(o),t.calendarApi.unselect(),t.emitter.trigger("eventResizeStart",{el:o,event:new Qn(t,r.def,r.instance),jsEvent:e.origEvent,view:t.viewApi})},n.handleHitUpdate=function(e,t,o){var i=n.component.context,a=n.relevantEvents,s=n.hitDragging.initialHit,l=n.eventRange.instance,u=null,c=null,d=!1,p={affectedEvents:a,mutatedEvents:{defs:{},instances:{}},isEvent:!0};e&&(u=function(e,t,n,o,i){for(var a=e.component.context.dateEnv,s=e.dateSpan.range.start,l=t.dateSpan.range.start,u=pn(s,l,a,e.component.largeUnit),c={},d=0,p=i;d<p.length;d++){var f=(0,p[d])(e,t);if(!1===f)return null;f&&r(c,f)}if(n){if(a.add(o.start,u)<o.end)return c.startDelta=u,c}else if(a.add(o.end,u)>o.start)return c.endDelta=u,c;return null}(s,e,o.subjectEl.classList.contains("fc-event-resizer-start"),l.range,i.pluginHooks.eventResizeJoinTransforms)),u&&(c=jn(a,i.getCurrentData().eventUiBases,u,i),p.mutatedEvents=c,n.component.isInteractionValid(p)||(d=!0,u=null,c=null,p.mutatedEvents=null)),c?i.dispatch({type:"SET_EVENT_RESIZE",state:p}):i.dispatch({type:"UNSET_EVENT_RESIZE"}),d?se():le(),t||(u&&La(s,e)&&(u=null),n.validMutation=u,n.mutatedRelevantEvents=c)},n.handleDragEnd=function(e){var t=n.component.context,o=n.eventRange.def,i=n.eventRange.instance,a=new Qn(t,o,i),s=n.relevantEvents,l=n.mutatedRelevantEvents;if(t.emitter.trigger("eventResizeStop",{el:n.draggingSegEl,event:a,jsEvent:e.origEvent,view:t.viewApi}),n.validMutation){var u=new Qn(t,l.defs[o.defId],i?l.instances[i.instanceId]:null);t.dispatch({type:"MERGE_EVENTS",eventStore:l});var c={oldEvent:a,event:u,relatedEvents:tr(l,t,i),revert:function(){t.dispatch({type:"MERGE_EVENTS",eventStore:s})}};t.emitter.trigger("eventResize",r(r({},c),{el:n.draggingSegEl,startDelta:n.validMutation.startDelta||tt(0),endDelta:n.validMutation.endDelta||tt(0),jsEvent:e.origEvent,view:t.viewApi})),t.emitter.trigger("eventChange",c)}else t.emitter.trigger("_noEventResize");n.draggingSeg=null,n.relevantEvents=null,n.validMutation=null};var o=t.component,i=n.dragging=new Oa(t.el);i.pointer.selector=".fc-event-resizer",i.touchScrollAllowed=!1,i.autoScroller.isEnabled=o.context.options.dragScroll;var a=n.hitDragging=new Aa(n.dragging,mi(t));return a.emitter.on("pointerdown",n.handlePointerDown),a.emitter.on("dragstart",n.handleDragStart),a.emitter.on("hitupdate",n.handleHitUpdate),a.emitter.on("dragend",n.handleDragEnd),n}return n(t,e),t.prototype.destroy=function(){this.dragging.destroy()},t.prototype.querySegEl=function(e){return Y(e.subjectEl,".fc-event")},t}(gi);var ja=function(){function e(e){var t=this;this.context=e,this.isRecentPointerDateSelect=!1,this.onSelect=function(e){e.jsEvent&&(t.isRecentPointerDateSelect=!0)},this.onDocumentPointerUp=function(e){var n=t.context,r=t.documentPointer,o=n.getCurrentData();if(!r.wasTouchScroll){if(o.dateSelection&&!t.isRecentPointerDateSelect){var i=n.options.unselectAuto,a=n.options.unselectCancel;!i||i&&Y(r.downEl,a)||n.calendarApi.unselect(e)}o.eventSelection&&!Y(r.downEl,Va.SELECTOR)&&n.dispatch({type:"UNSELECT_EVENT"})}t.isRecentPointerDateSelect=!1};var n=this.documentPointer=new xa(document);n.shouldIgnoreMove=!0,n.shouldWatchScroll=!1,n.emitter.on("pointerup",this.onDocumentPointerUp),e.emitter.on("select",this.onSelect)}return e.prototype.destroy=function(){this.context.emitter.off("select",this.onSelect),this.documentPointer.destroy()},e}(),Ga={dateClick:Vt,eventDragStart:Vt,eventDragStop:Vt,eventDrop:Vt,eventResizeStart:Vt,eventResizeStop:Vt,eventResize:Vt,drop:Vt,eventReceive:Vt,eventLeave:Vt},qa=function(){function e(e,t){var n=this;this.receivingContext=null,this.droppableEvent=null,this.suppliedDragMeta=null,this.dragMeta=null,this.handleDragStart=function(e){n.dragMeta=n.buildDragMeta(e.subjectEl)},this.handleHitUpdate=function(e,t,o){var i=n.hitDragging.dragging,a=null,s=null,l=!1,u={affectedEvents:{defs:{},instances:{}},mutatedEvents:{defs:{},instances:{}},isEvent:n.dragMeta.create};e&&(a=e.component.context,n.canDropElOnCalendar(o.subjectEl,a)&&(s=function(e,t,n){for(var o=r({},t.leftoverProps),i=0,a=n.pluginHooks.externalDefTransforms;i<a.length;i++){var s=a[i];r(o,s(e,t))}var l=an(o,n),u=l.refined,c=l.extra,d=ln(u,c,t.sourceId,e.allDay,n.options.forceEventDuration||Boolean(t.duration),n),p=e.range.start;e.allDay&&t.startTime&&(p=n.dateEnv.add(p,t.startTime));var f=t.duration?n.dateEnv.add(p,t.duration):Fn(e.allDay,p,n),h=Ue(d.defId,{start:p,end:f});return{def:d,instance:h}}(e.dateSpan,n.dragMeta,a),u.mutatedEvents=jt(s),(l=!uo(u,a))&&(u.mutatedEvents={defs:{},instances:{}},s=null))),n.displayDrag(a,u),i.setMirrorIsVisible(t||!s||!document.querySelector(".fc-event-mirror")),l?se():le(),t||(i.setMirrorNeedsRevert(!s),n.receivingContext=a,n.droppableEvent=s)},this.handleDragEnd=function(e){var t=n,o=t.receivingContext,i=t.droppableEvent;if(n.clearDrag(),o&&i){var a=n.hitDragging.finalHit,s=a.component.context.viewApi,l=n.dragMeta;o.emitter.trigger("drop",r(r({},Ua(a.dateSpan,o)),{draggedEl:e.subjectEl,jsEvent:e.origEvent,view:s})),l.create&&(o.dispatch({type:"MERGE_EVENTS",eventStore:jt(i)}),e.isTouch&&o.dispatch({type:"SELECT_EVENT",eventInstanceId:i.instance.instanceId}),o.emitter.trigger("eventReceive",{draggedEl:e.subjectEl,event:new Qn(o,i.def,i.instance),view:s}))}n.receivingContext=null,n.droppableEvent=null};var o=this.hitDragging=new Aa(e,yi);o.requireInitial=!1,o.emitter.on("dragstart",this.handleDragStart),o.emitter.on("hitupdate",this.handleHitUpdate),o.emitter.on("dragend",this.handleDragEnd),this.suppliedDragMeta=t}return e.prototype.buildDragMeta=function(e){return"object"==typeof this.suppliedDragMeta?bi(this.suppliedDragMeta):"function"==typeof this.suppliedDragMeta?bi(this.suppliedDragMeta(e)):bi((t=function(e,t){var n=Ei.dataAttrPrefix,r=(n?n+"-":"")+t;return e.getAttribute("data-"+r)||""}(e,"event"))?JSON.parse(t):{create:!1});var t},e.prototype.displayDrag=function(e,t){var n=this.receivingContext;n&&n!==e&&n.dispatch({type:"UNSET_EVENT_DRAG"}),e&&e.dispatch({type:"SET_EVENT_DRAG",state:t})},e.prototype.clearDrag=function(){this.receivingContext&&this.receivingContext.dispatch({type:"UNSET_EVENT_DRAG"})},e.prototype.canDropElOnCalendar=function(e,t){var n=t.options.dropAccept;return"function"==typeof n?n.call(t.calendarApi,e):"string"!=typeof n||!n||Boolean(Z(e,n))},e}();Ei.dataAttrPrefix="";var Ya=function(){function e(e,t){var n=this;void 0===t&&(t={}),this.handlePointerDown=function(e){var t=n.dragging,r=n.settings,o=r.minDistance,i=r.longPressDelay;t.minDistance=null!=o?o:e.isTouch?0:Ht.eventDragMinDistance,t.delay=e.isTouch?null!=i?i:Ht.longPressDelay:0},this.handleDragStart=function(e){e.isTouch&&n.dragging.delay&&e.subjectEl.classList.contains("fc-event")&&n.dragging.mirror.getMirrorEl().classList.add("fc-event-selected")},this.settings=t;var r=this.dragging=new Oa(e);r.touchScrollAllowed=!1,null!=t.itemSelector&&(r.pointer.selector=t.itemSelector),null!=t.appendTo&&(r.mirror.parentNode=t.appendTo),r.emitter.on("pointerdown",this.handlePointerDown),r.emitter.on("dragstart",this.handleDragStart),new qa(r,t.eventData)}return e.prototype.destroy=function(){this.dragging.destroy()},e}(),Za=function(e){function t(t){var n=e.call(this,t)||this;n.shouldIgnoreMove=!1,n.mirrorSelector="",n.currentMirrorEl=null,n.handlePointerDown=function(e){n.emitter.trigger("pointerdown",e),n.shouldIgnoreMove||n.emitter.trigger("dragstart",e)},n.handlePointerMove=function(e){n.shouldIgnoreMove||n.emitter.trigger("dragmove",e)},n.handlePointerUp=function(e){n.emitter.trigger("pointerup",e),n.shouldIgnoreMove||n.emitter.trigger("dragend",e)};var r=n.pointer=new xa(t);return r.emitter.on("pointerdown",n.handlePointerDown),r.emitter.on("pointermove",n.handlePointerMove),r.emitter.on("pointerup",n.handlePointerUp),n}return n(t,e),t.prototype.destroy=function(){this.pointer.destroy()},t.prototype.setIgnoreMove=function(e){this.shouldIgnoreMove=e},t.prototype.setMirrorIsVisible=function(e){if(e)this.currentMirrorEl&&(this.currentMirrorEl.style.visibility="",this.currentMirrorEl=null);else{var t=this.mirrorSelector?document.querySelector(this.mirrorSelector):null;t&&(this.currentMirrorEl=t,t.style.visibility="hidden")}},t}(Si),Xa=function(){function e(e,t){var n=document;e===document||e instanceof Element?(n=e,t=t||{}):t=e||{};var r=this.dragging=new Za(n);"string"==typeof t.itemSelector?r.pointer.selector=t.itemSelector:n===document&&(r.pointer.selector="[data-event]"),"string"==typeof t.mirrorSelector&&(r.mirrorSelector=t.mirrorSelector),new qa(r,t.eventData)}return e.prototype.destroy=function(){this.dragging.destroy()},e}(),Ka=yo({componentInteractions:[Ba,za,Va,Fa],calendarInteractions:[ja],elementDraggingImpl:Oa,listenerRefiners:Ga}),Ja=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.headerElRef=Zr(),t}return n(t,e),t.prototype.renderSimpleLayout=function(e,t){var n=this.props,r=this.context,o=[],i=sa(r.options);return e&&o.push({type:"header",key:"header",isSticky:i,chunk:{elRef:this.headerElRef,tableClassName:"fc-col-header",rowContent:e}}),o.push({type:"body",key:"body",liquid:!0,chunk:{content:t}}),qr(Mo,{viewSpec:r.viewSpec},(function(e,t){return qr("div",{ref:e,className:["fc-daygrid"].concat(t).join(" ")},qr(ua,{liquid:!n.isHeightAuto&&!n.forPrint,cols:[],sections:o}))}))},t.prototype.renderHScrollLayout=function(e,t,n,r){var o=this.context.pluginHooks.scrollGridImpl;if(!o)throw new Error("No ScrollGrid implementation");var i=this.props,a=this.context,s=!i.forPrint&&sa(a.options),l=!i.forPrint&&la(a.options),u=[];return e&&u.push({type:"header",key:"header",isSticky:s,chunks:[{key:"main",elRef:this.headerElRef,tableClassName:"fc-col-header",rowContent:e}]}),u.push({type:"body",key:"body",liquid:!0,chunks:[{key:"main",content:t}]}),l&&u.push({type:"footer",key:"footer",isSticky:!0,chunks:[{key:"main",content:aa}]}),qr(Mo,{viewSpec:a.viewSpec},(function(e,t){return qr("div",{ref:e,className:["fc-daygrid"].concat(t).join(" ")},qr(o,{liquid:!i.isHeightAuto&&!i.forPrint,colGroups:[{cols:[{span:n,minWidth:r}]}],sections:u}))}))},t}(mo);function $a(e,t){for(var n=[],r=0;r<t;r++)n[r]=[];for(var o=0,i=e;o<i.length;o++){var a=i[o];n[a.row].push(a)}return n}function Qa(e,t){for(var n=[],r=0;r<t;r++)n[r]=[];for(var o=0,i=e;o<i.length;o++){var a=i[o];n[a.firstCol].push(a)}return n}function es(e,t){var n=[];if(e){for(a=0;a<t;a++)n[a]={affectedInstances:e.affectedInstances,isEvent:e.isEvent,segs:[]};for(var r=0,o=e.segs;r<o.length;r++){var i=o[r];n[i.row].segs.push(i)}}else for(var a=0;a<t;a++)n[a]=null;return n}var ts=Nt({week:"narrow"}),ns=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.handleRootEl=function(e){t.rootEl=e,io(t.props.elRef,e)},t.handleMoreLinkClick=function(e){var n=t.props;if(n.onMoreClick){var r=n.segsByEachCol,o=r.filter((function(e){return n.segIsHidden[e.eventRange.instance.instanceId]}));n.onMoreClick({date:n.date,allSegs:r,hiddenSegs:o,moreCnt:n.moreCnt,dayEl:t.rootEl,ev:e})}},t}return n(t,e),t.prototype.render=function(){var e=this,t=this.context,n=t.options,o=t.viewApi,i=this.props,a=i.date,s=i.dateProfile,l={num:i.moreCnt,text:i.buildMoreLinkText(i.moreCnt),view:o},u=n.navLinks?{"data-navlink":kr(a,"week"),tabIndex:0}:{};return qr(ga,{date:a,dateProfile:s,todayRange:i.todayRange,showDayNumber:i.showDayNumber,extraHookProps:i.extraHookProps,elRef:this.handleRootEl},(function(t,o,c,d){return qr("td",r({ref:t,className:["fc-daygrid-day"].concat(o,i.extraClassNames||[]).join(" ")},c,i.extraDataAttrs),qr("div",{className:"fc-daygrid-day-frame fc-scrollgrid-sync-inner",ref:i.innerElRef},i.showWeekNumber&&qr(Ca,{date:a,defaultFormat:ts},(function(e,t,n,o){return qr("a",r({ref:e,className:["fc-daygrid-week-number"].concat(t).join(" ")},u),o)})),!d&&qr(is,{date:a,dateProfile:s,showDayNumber:i.showDayNumber,todayRange:i.todayRange,extraHookProps:i.extraHookProps}),qr("div",{className:"fc-daygrid-day-events",ref:i.fgContentElRef,style:{paddingBottom:i.fgPaddingBottom}},i.fgContent,Boolean(i.moreCnt)&&qr("div",{className:"fc-daygrid-day-bottom",style:{marginTop:i.moreMarginTop}},qr(bo,{hookProps:l,classNames:n.moreLinkClassNames,content:n.moreLinkContent,defaultContent:os,didMount:n.moreLinkDidMount,willUnmount:n.moreLinkWillUnmount},(function(t,n,r,o){return qr("a",{onClick:e.handleMoreLinkClick,ref:t,className:["fc-daygrid-more-link"].concat(n).join(" ")},o)})))),qr("div",{className:"fc-daygrid-day-bg"},i.bgContent)))}))},t}(mo);function rs(e){return e.dayNumberText}function os(e){return e.text}var is=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.render=function(){var e=this.props,t=this.context.options.navLinks?{"data-navlink":kr(e.date),tabIndex:0}:{};return qr(va,{date:e.date,dateProfile:e.dateProfile,todayRange:e.todayRange,showDayNumber:e.showDayNumber,extraHookProps:e.extraHookProps,defaultContent:rs},(function(e,n){return n&&qr("div",{className:"fc-daygrid-day-top",ref:e},qr("a",r({className:"fc-daygrid-day-number"},t),n))}))},t}(no),as=Nt({hour:"numeric",minute:"2-digit",omitZeroMinute:!0,meridiem:"narrow"});function ss(e){var t=e.eventRange.ui.display;return"list-item"===t||"auto"===t&&!e.eventRange.def.allDay&&e.firstCol===e.lastCol}var ls=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.render=function(){var e=this.props,t=this.context,n=t.options.eventTimeFormat||as,o=In(e.seg,n,t,!0,e.defaultDisplayEventEnd);return qr(ca,{seg:e.seg,timeText:o,defaultContent:us,isDragging:e.isDragging,isResizing:!1,isDateSelecting:!1,isSelected:e.isSelected,isPast:e.isPast,isFuture:e.isFuture,isToday:e.isToday},(function(t,n,o,i){return qr("a",r({className:["fc-daygrid-event","fc-daygrid-dot-event"].concat(n).join(" "),ref:t},(a=e.seg,(s=a.eventRange.def.url)?{href:s}:{})),i);var a,s}))},t}(no);function us(e){return qr(Xr,null,qr("div",{className:"fc-daygrid-event-dot",style:{borderColor:e.borderColor||e.backgroundColor}}),e.timeText&&qr("div",{className:"fc-event-time"},e.timeText),qr("div",{className:"fc-event-title"},e.event.title||qr(Xr,null," ")))}var cs=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.render=function(){var e=this.props;return qr(da,r({},e,{extraClassNames:["fc-daygrid-event","fc-daygrid-block-event","fc-h-event"],defaultTimeFormat:as,defaultDisplayEventEnd:e.defaultDisplayEventEnd,disableResizing:!e.seg.eventRange.def.allDay}))},t}(no);function ds(e,t,n,o,i,a,s,l){for(var u=[],c=[],d={},p={},f={},h={},g={},v=0;v<s;v++)u.push([]),c.push(0);for(var m=0,y=t=Tn(t,l);m<y.length;m++){T(R=y[m],i[R.eventRange.instance.instanceId+":"+R.firstCol]||0)}!0===n||!0===o?function(e,t,n,r){fs(e,t,n,!0,(function(e){return e.bottom<=r}))}(c,d,u,a):"number"==typeof n?function(e,t,n,r){fs(e,t,n,!1,(function(e,t){return t<r}))}(c,d,u,n):"number"==typeof o&&function(e,t,n,r){fs(e,t,n,!0,(function(e,t){return t<r}))}(c,d,u,o);for(var S=0;S<s;S++){for(var E=0,C=0,b=0,D=u[S];b<D.length;b++){var R,w=D[b];d[(R=w.seg).eventRange.instance.instanceId]||(p[R.eventRange.instance.instanceId]=w.top,R.firstCol===R.lastCol&&R.isStart&&R.isEnd?(f[R.eventRange.instance.instanceId]=w.top-E,C=0,E=w.bottom):C+=w.bottom-w.top)}C&&(c[S]?h[S]=C:g[S]=C)}function T(e,t){if(!x(e,t,0))for(var n=e.firstCol;n<=e.lastCol;n++)for(var r=0,o=u[n];r<o.length;r++){if(x(e,t,o[r].bottom))return}}function x(e,t,n){if(function(e,t,n){for(var r=e.firstCol;r<=e.lastCol;r++)for(var o=0,i=u[r];o<i.length;o++){var a=i[o];if(n<a.bottom&&n+t>a.top)return!1}return!0}(e,t,n)){for(var r=e.firstCol;r<=e.lastCol;r++){for(var o=u[r],i=0;i<o.length&&n>=o[i].top;)i++;o.splice(i,0,{seg:e,top:n,bottom:n+t})}return!0}return!1}for(var k in i)i[k]||(d[k.split(":")[0]]=!0);return{segsByFirstCol:u.map(ps),segsByEachCol:u.map((function(t,n){var o=function(e){for(var t=[],n=0,r=e;n<r.length;n++){var o=r[n];t.push(o.seg)}return t}(t);return o=function(e,t,n){for(var o=t,i=De(o,1),a={start:o,end:i},s=[],l=0,u=e;l<u.length;l++){var c=u[l],d=c.eventRange,p=d.range,f=gn(p,a);f&&s.push(r(r({},c),{firstCol:n,lastCol:n,eventRange:{def:d.def,ui:r(r({},d.ui),{durationEditable:!1}),instance:d.instance,range:f},isStart:c.isStart&&f.start.valueOf()===p.start.valueOf(),isEnd:c.isEnd&&f.end.valueOf()===p.end.valueOf()}))}return s}(o,e[n].date,n)})),segIsHidden:d,segTops:p,segMarginTops:f,moreCnts:c,moreTops:h,paddingBottoms:g}}function ps(e,t){for(var n=[],r=0,o=e;r<o.length;r++){var i=o[r];i.seg.firstCol===t&&n.push(i.seg)}return n}function fs(e,t,n,r,o){for(var i=e.length,a={},s=[],l=0;l<i;l++)s.push([]);for(l=0;l<i;l++)for(var u=0,c=0,d=n[l];c<d.length;c++){var p=d[c];o(p,u)?f(p):h(p),p.top!==p.bottom&&u++}function f(e){var t=e.seg,n=t.eventRange.instance.instanceId;if(!a[n]){a[n]=!0;for(var r=t.firstCol;r<=t.lastCol;r++)s[r].push(e)}}function h(n){var o=n.seg,i=o.eventRange.instance.instanceId;if(!t[i]){t[i]=!0;for(var a=o.firstCol;a<=o.lastCol;a++){var l=++e[a];if(r&&1===l){var u=s[a].pop();u&&h(u)}}}}}var hs=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.cellElRefs=new Xi,t.frameElRefs=new Xi,t.fgElRefs=new Xi,t.segHarnessRefs=new Xi,t.rootElRef=Zr(),t.state={framePositions:null,maxContentHeight:null,segHeights:{}},t}return n(t,e),t.prototype.render=function(){var e=this,t=this.props,n=this.state,r=this.context,o=t.cells.length,i=Qa(t.businessHourSegs,o),a=Qa(t.bgEventSegs,o),s=Qa(this.getHighlightSegs(),o),l=Qa(this.getMirrorSegs(),o),u=ds(t.cells,t.fgEventSegs,t.dayMaxEvents,t.dayMaxEventRows,n.segHeights,n.maxContentHeight,o,r.options.eventOrder),c=u.paddingBottoms,d=u.segsByFirstCol,p=u.segsByEachCol,f=u.segIsHidden,h=u.segTops,g=u.segMarginTops,v=u.moreCnts,m=u.moreTops,y=t.eventDrag&&t.eventDrag.affectedInstances||t.eventResize&&t.eventResize.affectedInstances||{};return qr("tr",{ref:this.rootElRef},t.renderIntro&&t.renderIntro(),t.cells.map((function(n,r){var o=e.renderFgSegs(d[r],f,h,g,y,t.todayRange),u=e.renderFgSegs(l[r],{},h,{},{},t.todayRange,Boolean(t.eventDrag),Boolean(t.eventResize),!1),S=t.showWeekNumbers&&0===r;return qr(ns,{key:n.key,elRef:e.cellElRefs.createRef(n.key),innerElRef:e.frameElRefs.createRef(n.key),dateProfile:t.dateProfile,date:n.date,showDayNumber:t.showDayNumbers||S,showWeekNumber:S,todayRange:t.todayRange,extraHookProps:n.extraHookProps,extraDataAttrs:n.extraDataAttrs,extraClassNames:n.extraClassNames,moreCnt:v[r],buildMoreLinkText:t.buildMoreLinkText,onMoreClick:t.onMoreClick,segIsHidden:f,moreMarginTop:m[r],segsByEachCol:p[r],fgPaddingBottom:c[r],fgContentElRef:e.fgElRefs.createRef(n.key),fgContent:qr(Xr,null,qr(Xr,null,o),qr(Xr,null,u)),bgContent:qr(Xr,null,e.renderFillSegs(s[r],"highlight"),e.renderFillSegs(i[r],"non-business"),e.renderFillSegs(a[r],"bg-event"))})})))},t.prototype.componentDidMount=function(){this.updateSizing(!0)},t.prototype.componentDidUpdate=function(e,t){var n=this.props;this.updateSizing(!qe(e,n))},t.prototype.getHighlightSegs=function(){var e=this.props;return e.eventDrag&&e.eventDrag.segs.length?e.eventDrag.segs:e.eventResize&&e.eventResize.segs.length?e.eventResize.segs:e.dateSelectionSegs},t.prototype.getMirrorSegs=function(){var e=this.props;return e.eventResize&&e.eventResize.segs.length?e.eventResize.segs:[]},t.prototype.renderFgSegs=function(e,t,n,o,i,a,s,l,u){var c=this.context,d=this.props.eventSelection,p=this.state.framePositions,f=1===this.props.cells.length,h=[];if(p)for(var g=0,v=e;g<v.length;g++){var m=v[g],y=m.eventRange.instance.instanceId,S=s||l||u,E=i[y],C=t[y]||E,b=t[y]||S||m.firstCol!==m.lastCol||!m.isStart||!m.isEnd,D=void 0,R=void 0,w=void 0,T=void 0;b?(R=n[y],c.isRtl?(T=0,w=p.lefts[m.lastCol]-p.lefts[m.firstCol]):(w=0,T=p.rights[m.firstCol]-p.rights[m.lastCol])):D=o[y],h.push(qr("div",{className:"fc-daygrid-event-harness"+(b?" fc-daygrid-event-harness-abs":""),key:y,ref:S?null:this.segHarnessRefs.createRef(y+":"+m.firstCol),style:{visibility:C?"hidden":"",marginTop:D||"",top:R||"",left:w||"",right:T||""}},ss(m)?qr(ls,r({seg:m,isDragging:s,isSelected:y===d,defaultDisplayEventEnd:f},Nn(m,a))):qr(cs,r({seg:m,isDragging:s,isResizing:l,isDateSelecting:u,isSelected:y===d,defaultDisplayEventEnd:f},Nn(m,a)))))}return h},t.prototype.renderFillSegs=function(e,t){var n=this.context.isRtl,i=this.props.todayRange,a=this.state.framePositions,s=[];if(a)for(var l=0,u=e;l<u.length;l++){var c=u[l],d=n?{right:0,left:a.lefts[c.lastCol]-a.lefts[c.firstCol]}:{left:0,right:a.rights[c.firstCol]-a.rights[c.lastCol]};s.push(qr("div",{key:Hn(c.eventRange),className:"fc-daygrid-bg-harness",style:d},"bg-event"===t?qr(Sa,r({seg:c},Nn(c,i))):ya(t)))}return qr.apply(void 0,o([Xr,{}],s))},t.prototype.updateSizing=function(e){var t=this.props,n=this.frameElRefs;if(null!==t.clientWidth){if(e){var r=t.cells.map((function(e){return n.currentMap[e.key]}));if(r.length){var o=this.rootElRef.current;this.setState({framePositions:new Br(o,r,!0,!1)})}}var i=!0===t.dayMaxEvents||!0===t.dayMaxEventRows;this.setState({segHeights:this.computeSegHeights(),maxContentHeight:i?this.computeMaxContentHeight():null})}},t.prototype.computeSegHeights=function(){return Fe(this.segHarnessRefs.currentMap,(function(e){return e.getBoundingClientRect().height}))},t.prototype.computeMaxContentHeight=function(){var e=this.props.cells[0].key,t=this.cellElRefs.currentMap[e],n=this.fgElRefs.currentMap[e];return t.getBoundingClientRect().bottom-n.getBoundingClientRect().top},t.prototype.getCellEls=function(){var e=this.cellElRefs.currentMap;return this.props.cells.map((function(t){return e[t.key]}))},t}(mo);hs.addStateEquality({segHeights:qe});var gs=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.repositioner=new ei(t.updateSize.bind(t)),t.handleRootEl=function(e){t.rootEl=e,t.props.elRef&&io(t.props.elRef,e)},t.handleDocumentMousedown=function(e){var n=t.props.onClose;n&&!t.rootEl.contains(e.target)&&n()},t.handleDocumentScroll=function(){t.repositioner.request(10)},t.handleCloseClick=function(){var e=t.props.onClose;e&&e()},t}return n(t,e),t.prototype.render=function(){var e=this.context.theme,t=this.props,n=["fc-popover",e.getClass("popover")].concat(t.extraClassNames||[]);return qr("div",r({className:n.join(" ")},t.extraAttrs,{ref:this.handleRootEl}),qr("div",{className:"fc-popover-header "+e.getClass("popoverHeader")},qr("span",{className:"fc-popover-title"},t.title),qr("span",{className:"fc-popover-close "+e.getIconClass("close"),onClick:this.handleCloseClick})),qr("div",{className:"fc-popover-body "+e.getClass("popoverContent")},t.children))},t.prototype.componentDidMount=function(){document.addEventListener("mousedown",this.handleDocumentMousedown),document.addEventListener("scroll",this.handleDocumentScroll),this.updateSize()},t.prototype.componentWillUnmount=function(){document.removeEventListener("mousedown",this.handleDocumentMousedown),document.removeEventListener("scroll",this.handleDocumentScroll)},t.prototype.updateSize=function(){var e=this.props,t=e.alignmentEl,n=e.topAlignmentEl,r=this.rootEl;if(r){var o,i=r.getBoundingClientRect(),a=t.getBoundingClientRect(),s=n?n.getBoundingClientRect().top:a.top;s=Math.min(s,window.innerHeight-i.height-10),s=Math.max(s,10),o=this.context.isRtl?a.right-i.width:a.left,o=Math.min(o,window.innerWidth-i.width-10),$(r,{top:s,left:o=Math.max(o,10)})}},t}(no),vs=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.handlePopoverEl=function(e){t.popoverEl=e,e?t.context.registerInteractiveComponent(t,{el:e,useEventCenter:!1}):t.context.unregisterInteractiveComponent(t)},t}return n(t,e),t.prototype.render=function(){var e=this.context,t=e.options,n=e.dateEnv,o=this.props,i=o.date,a=o.hiddenInstances,s=o.todayRange,l=o.dateProfile,u=o.selectedInstanceId,c=n.format(i,t.dayPopoverFormat);return qr(ga,{date:i,dateProfile:l,todayRange:s,elRef:this.handlePopoverEl},(function(e,t,n){return qr(gs,{elRef:e,title:c,extraClassNames:["fc-more-popover"].concat(t),extraAttrs:n,onClose:o.onCloseClick,alignmentEl:o.alignmentEl,topAlignmentEl:o.topAlignmentEl},qr(va,{date:i,dateProfile:l,todayRange:s},(function(e,t){return t&&qr("div",{className:"fc-more-popover-misc",ref:e},t)})),o.segs.map((function(e){var t=e.eventRange.instance.instanceId;return qr("div",{className:"fc-daygrid-event-harness",key:t,style:{visibility:a[t]?"hidden":""}},ss(e)?qr(ls,r({seg:e,isDragging:!1,isSelected:t===u,defaultDisplayEventEnd:!1},Nn(e,s))):qr(cs,r({seg:e,isDragging:!1,isResizing:!1,isDateSelecting:!1,isSelected:t===u,defaultDisplayEventEnd:!1},Nn(e,s))))})))}))},t.prototype.queryHit=function(e,t,n,r){var o=this.props.date;if(e<n&&t<r)return{component:this,dateSpan:{allDay:!0,range:{start:o,end:De(o,1)}},dayEl:this.popoverEl,rect:{left:0,top:0,right:n,bottom:r},layer:1}},t.prototype.isPopover=function(){return!0},t}(mo),ms=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.splitBusinessHourSegs=gt($a),t.splitBgEventSegs=gt($a),t.splitFgEventSegs=gt($a),t.splitDateSelectionSegs=gt($a),t.splitEventDrag=gt(es),t.splitEventResize=gt(es),t.buildBuildMoreLinkText=gt(ys),t.rowRefs=new Xi,t.state={morePopoverState:null},t.handleRootEl=function(e){t.rootEl=e,io(t.props.elRef,e)},t.handleMoreLinkClick=function(e){var n=t.context,o=n.dateEnv,i=n.options.moreLinkClick;function a(e){var t=e.eventRange,r=t.def,i=t.instance,a=t.range;return{event:new Qn(n,r,i),start:o.toDate(a.start),end:o.toDate(a.end),isStart:e.isStart,isEnd:e.isEnd}}"function"==typeof i&&(i=i({date:o.toDate(e.date),allDay:!0,allSegs:e.allSegs.map(a),hiddenSegs:e.hiddenSegs.map(a),jsEvent:e.ev,view:n.viewApi})),i&&"popover"!==i?"string"==typeof i&&n.calendarApi.zoomTo(e.date,i):t.setState({morePopoverState:r(r({},e),{currentFgEventSegs:t.props.fgEventSegs})})},t.handleMorePopoverClose=function(){t.setState({morePopoverState:null})},t}return n(t,e),t.prototype.render=function(){var e=this,t=this.props,n=t.dateProfile,r=t.dayMaxEventRows,o=t.dayMaxEvents,i=t.expandRows,a=this.state.morePopoverState,s=t.cells.length,l=this.splitBusinessHourSegs(t.businessHourSegs,s),u=this.splitBgEventSegs(t.bgEventSegs,s),c=this.splitFgEventSegs(t.fgEventSegs,s),d=this.splitDateSelectionSegs(t.dateSelectionSegs,s),p=this.splitEventDrag(t.eventDrag,s),f=this.splitEventResize(t.eventResize,s),h=this.buildBuildMoreLinkText(this.context.options.moreLinkText),g=!0===o||!0===r;return g&&!i&&(g=!1,r=null,o=null),qr("div",{className:["fc-daygrid-body",g?"fc-daygrid-body-balanced":"fc-daygrid-body-unbalanced",i?"":"fc-daygrid-body-natural"].join(" "),ref:this.handleRootEl,style:{width:t.clientWidth,minWidth:t.tableMinWidth}},qr(Ui,{unit:"day"},(function(g,v){return qr(Xr,null,qr("table",{className:"fc-scrollgrid-sync-table",style:{width:t.clientWidth,minWidth:t.tableMinWidth,height:i?t.clientHeight:""}},t.colGroupNode,qr("tbody",null,t.cells.map((function(i,a){return qr(hs,{ref:e.rowRefs.createRef(a),key:i.length?i[0].date.toISOString():a,showDayNumbers:s>1,showWeekNumbers:t.showWeekNumbers,todayRange:v,dateProfile:n,cells:i,renderIntro:t.renderRowIntro,businessHourSegs:l[a],eventSelection:t.eventSelection,bgEventSegs:u[a].filter(Ss),fgEventSegs:c[a],dateSelectionSegs:d[a],eventDrag:p[a],eventResize:f[a],dayMaxEvents:o,dayMaxEventRows:r,clientWidth:t.clientWidth,clientHeight:t.clientHeight,buildMoreLinkText:h,onMoreClick:e.handleMoreLinkClick})})))),!t.forPrint&&a&&a.currentFgEventSegs===t.fgEventSegs&&qr(vs,{date:a.date,dateProfile:n,segs:a.allSegs,alignmentEl:a.dayEl,topAlignmentEl:1===s?t.headerAlignElRef.current:null,onCloseClick:e.handleMorePopoverClose,selectedInstanceId:t.eventSelection,hiddenInstances:(t.eventDrag?t.eventDrag.affectedInstances:null)||(t.eventResize?t.eventResize.affectedInstances:null)||{},todayRange:v}))})))},t.prototype.prepareHits=function(){this.rowPositions=new Br(this.rootEl,this.rowRefs.collect().map((function(e){return e.getCellEls()[0]})),!1,!0),this.colPositions=new Br(this.rootEl,this.rowRefs.currentMap[0].getCellEls(),!0,!1)},t.prototype.positionToHit=function(e,t){var n=this.colPositions,r=this.rowPositions,o=n.leftToIndex(e),i=r.topToIndex(t);if(null!=i&&null!=o)return{row:i,col:o,dateSpan:{range:this.getCellRange(i,o),allDay:!0},dayEl:this.getCellEl(i,o),relativeRect:{left:n.lefts[o],right:n.rights[o],top:r.tops[i],bottom:r.bottoms[i]}}},t.prototype.getCellEl=function(e,t){return this.rowRefs.currentMap[e].getCellEls()[t]},t.prototype.getCellRange=function(e,t){var n=this.props.cells[e][t].date;return{start:n,end:De(n,1)}},t}(mo);function ys(e){return"function"==typeof e?e:function(t){return"+"+t+" "+e}}function Ss(e){return e.eventRange.def.allDay}var Es=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.slicer=new Cs,t.tableRef=Zr(),t.handleRootEl=function(e){e?t.context.registerInteractiveComponent(t,{el:e}):t.context.unregisterInteractiveComponent(t)},t}return n(t,e),t.prototype.render=function(){var e=this.props,t=this.context;return qr(ms,r({ref:this.tableRef,elRef:this.handleRootEl},this.slicer.sliceProps(e,e.dateProfile,e.nextDayThreshold,t,e.dayTableModel),{dateProfile:e.dateProfile,cells:e.dayTableModel.cells,colGroupNode:e.colGroupNode,tableMinWidth:e.tableMinWidth,renderRowIntro:e.renderRowIntro,dayMaxEvents:e.dayMaxEvents,dayMaxEventRows:e.dayMaxEventRows,showWeekNumbers:e.showWeekNumbers,expandRows:e.expandRows,headerAlignElRef:e.headerAlignElRef,clientWidth:e.clientWidth,clientHeight:e.clientHeight,forPrint:e.forPrint}))},t.prototype.prepareHits=function(){this.tableRef.current.prepareHits()},t.prototype.queryHit=function(e,t){var n=this.tableRef.current.positionToHit(e,t);if(n)return{component:this,dateSpan:n.dateSpan,dayEl:n.dayEl,rect:{left:n.relativeRect.left,right:n.relativeRect.right,top:n.relativeRect.top,bottom:n.relativeRect.bottom},layer:0}},t}(mo),Cs=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.forceDayIfListItem=!0,t}return n(t,e),t.prototype.sliceRange=function(e,t){return t.sliceRange(e)},t}(Gi),bs=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.buildDayTableModel=gt(Ds),t.headerRef=Zr(),t.tableRef=Zr(),t}return n(t,e),t.prototype.render=function(){var e=this,t=this.context,n=t.options,r=t.dateProfileGenerator,o=this.props,i=this.buildDayTableModel(o.dateProfile,r),a=n.dayHeaders&&qr(zi,{ref:this.headerRef,dateProfile:o.dateProfile,dates:i.headerDates,datesRepDistinctDays:1===i.rowCnt}),s=function(t){return qr(Es,{ref:e.tableRef,dateProfile:o.dateProfile,dayTableModel:i,businessHours:o.businessHours,dateSelection:o.dateSelection,eventStore:o.eventStore,eventUiBases:o.eventUiBases,eventSelection:o.eventSelection,eventDrag:o.eventDrag,eventResize:o.eventResize,nextDayThreshold:n.nextDayThreshold,colGroupNode:t.tableColGroupNode,tableMinWidth:t.tableMinWidth,dayMaxEvents:n.dayMaxEvents,dayMaxEventRows:n.dayMaxEventRows,showWeekNumbers:n.weekNumbers,expandRows:!o.isHeightAuto,headerAlignElRef:e.headerElRef,clientWidth:t.clientWidth,clientHeight:t.clientHeight,forPrint:o.forPrint})};return n.dayMinWidth?this.renderHScrollLayout(a,s,i.colCnt,n.dayMinWidth):this.renderSimpleLayout(a,s)},t}(Ja);function Ds(e,t){var n=new Fi(e.renderRange,t);return new ji(n,/year|month|week/.test(e.currentRangeUnit))}var Rs=yo({initialView:"dayGridMonth",optionRefiners:{moreLinkClick:Vt,moreLinkClassNames:Vt,moreLinkContent:Vt,moreLinkDidMount:Vt,moreLinkWillUnmount:Vt},views:{dayGrid:{component:bs,dateProfileGeneratorClass:function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.buildRenderRange=function(t,n,r){var o,i=this.props.dateEnv,a=e.prototype.buildRenderRange.call(this,t,n,r),s=a.start,l=a.end;(/^(year|month)$/.test(n)&&(s=i.startOfWeek(s),(o=i.startOfWeek(l)).valueOf()!==l.valueOf()&&(l=be(o,1))),this.props.monthMode&&this.props.fixedWeekCount)&&(l=be(l,6-Math.ceil(we(s,l))));return{start:s,end:l}},t}(Ho)},dayGridDay:{type:"dayGrid",duration:{days:1}},dayGridWeek:{type:"dayGrid",duration:{weeks:1}},dayGridMonth:{type:"dayGrid",duration:{months:1},monthMode:!0,fixedWeekCount:!0}}}),ws=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.getKeyInfo=function(){return{allDay:{},timed:{}}},t.prototype.getKeysForDateSpan=function(e){return e.allDay?["allDay"]:["timed"]},t.prototype.getKeysForEventDef=function(e){return e.allDay?Cn(e)?["timed","allDay"]:["allDay"]:["timed"]},t}(Dr),Ts=function(){function e(e,t,n){this.positions=e,this.dateProfile=t,this.slatMetas=n}return e.prototype.safeComputeTop=function(e){var t=this.dateProfile;if(Sn(t.currentRange,e)){var n=Pe(e),r=e.valueOf()-n.valueOf();if(r>=ut(t.slotMinTime)&&r<ut(t.slotMaxTime))return this.computeTimeTop(tt(r))}},e.prototype.computeDateTop=function(e,t){return t||(t=Pe(e)),this.computeTimeTop(tt(e.valueOf()-t.valueOf()))},e.prototype.computeTimeTop=function(e){var t,n,r=this.positions,o=this.dateProfile,i=this.slatMetas,a=r.els.length,s=i[1].date.valueOf()-i[0].date.valueOf(),l=(e.milliseconds-ut(o.slotMinTime))/s;return l=Math.max(0,l),l=Math.min(a,l),t=Math.floor(l),n=l-(t=Math.min(t,a-1)),r.tops[t]+r.getHeight(t)*n},e}(),xs=[{hours:1},{minutes:30},{minutes:15},{seconds:30},{seconds:15}],ks=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.rootElRef=Zr(),t.slatElRefs=new Xi,t}return n(t,e),t.prototype.render=function(){var e=this.props,t=this.context;return qr("div",{className:"fc-timegrid-slots",ref:this.rootElRef},qr("table",{className:t.theme.getClass("table"),style:{minWidth:e.tableMinWidth,width:e.clientWidth,height:e.minHeight}},e.tableColGroupNode,qr(Ms,{slatElRefs:this.slatElRefs,axis:e.axis,slatMetas:e.slatMetas})))},t.prototype.componentDidMount=function(){this.updateSizing()},t.prototype.componentDidUpdate=function(){this.updateSizing()},t.prototype.componentWillUnmount=function(){this.props.onCoords&&this.props.onCoords(null)},t.prototype.updateSizing=function(){var e,t=this.props;t.onCoords&&null!==t.clientWidth&&(this.rootElRef.current.offsetHeight&&t.onCoords(new Ts(new Br(this.rootElRef.current,(e=this.slatElRefs.currentMap,t.slatMetas.map((function(t){return e[t.key]}))),!1,!0),this.props.dateProfile,t.slatMetas)))},t}(no);var Ms=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.render=function(){var e=this.props,t=this.context,n=t.options,o=e.slatElRefs;return qr("tbody",null,e.slatMetas.map((function(i,a){var s={time:i.time,date:t.dateEnv.toDate(i.date),view:t.viewApi},l=["fc-timegrid-slot","fc-timegrid-slot-lane",i.isLabeled?"":"fc-timegrid-slot-minor"];return qr("tr",{key:i.key,ref:o.createRef(i.key)},e.axis&&qr(Is,r({},i)),qr(bo,{hookProps:s,classNames:n.slotLaneClassNames,content:n.slotLaneContent,didMount:n.slotLaneDidMount,willUnmount:n.slotLaneWillUnmount},(function(e,t,n,r){return qr("td",{ref:e,className:l.concat(t).join(" "),"data-time":i.isoTimeStr},r)})))})))},t}(no),Ps=Nt({hour:"numeric",minute:"2-digit",omitZeroMinute:!0,meridiem:"short"});function Is(e){var t=["fc-timegrid-slot","fc-timegrid-slot-label",e.isLabeled?"fc-scrollgrid-shrink":"fc-timegrid-slot-minor"];return qr(Qr.Consumer,null,(function(n){if(e.isLabeled){var r=n.dateEnv,o=n.options,i=n.viewApi,a=null==o.slotLabelFormat?Ps:Array.isArray(o.slotLabelFormat)?Nt(o.slotLabelFormat[0]):Nt(o.slotLabelFormat),s={time:e.time,date:r.toDate(e.date),view:i,text:r.format(e.date,a)};return qr(bo,{hookProps:s,classNames:o.slotLabelClassNames,content:o.slotLabelContent,defaultContent:Ns,didMount:o.slotLabelDidMount,willUnmount:o.slotLabelWillUnmount},(function(n,r,o,i){return qr("td",{ref:n,className:t.concat(r).join(" "),"data-time":e.isoTimeStr},qr("div",{className:"fc-timegrid-slot-label-frame fc-scrollgrid-shrink-frame"},qr("div",{className:"fc-timegrid-slot-label-cushion fc-scrollgrid-shrink-cushion",ref:o},i)))}))}return qr("td",{className:t.join(" "),"data-time":e.isoTimeStr})}))}function Ns(e){return e.text}function _s(e,t,n,r,o){for(var i=new Date(0),a=e,s=tt(0),l=n||function(e){var t,n,r;for(t=xs.length-1;t>=0;t--)if(n=tt(xs[t]),null!==(r=ct(n,e))&&r>1)return n;return e}(r),u=[];ut(a)<ut(t);){var c=o.add(i,a),d=null!==ct(s,l);u.push({date:c,time:a,key:c.toISOString(),isoTimeStr:ft(c),isLabeled:d}),a=ot(a,r),s=ot(s,r)}return u}var Hs=Nt({week:"short"}),Os=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.allDaySplitter=new ws,t.headerElRef=Zr(),t.rootElRef=Zr(),t.scrollerElRef=Zr(),t.state={slatCoords:null},t.handleScrollTopRequest=function(e){var n=t.scrollerElRef.current;n&&(n.scrollTop=e)},t.renderHeadAxis=function(e){void 0===e&&(e="");var n=t.context.options,o=t.props.dateProfile.renderRange,i=Te(o.start,o.end),a=n.navLinks&&1===i?{"data-navlink":kr(o.start,"week"),tabIndex:0}:{};return n.weekNumbers?qr(Ca,{date:o.start,defaultFormat:Hs},(function(t,n,o,i){return qr("th",{ref:t,className:["fc-timegrid-axis","fc-scrollgrid-shrink"].concat(n).join(" ")},qr("div",{className:"fc-timegrid-axis-frame fc-scrollgrid-shrink-frame fc-timegrid-axis-frame-liquid",style:{height:e}},qr("a",r({ref:o,className:"fc-timegrid-axis-cushion fc-scrollgrid-shrink-cushion"},a),i)))})):qr("th",{className:"fc-timegrid-axis"},qr("div",{className:"fc-timegrid-axis-frame",style:{height:e}}))},t.renderTableRowAxis=function(e){var n=t.context,r=n.options,o=n.viewApi,i={text:r.allDayText,view:o};return qr(bo,{hookProps:i,classNames:r.allDayClassNames,content:r.allDayContent,defaultContent:Ws,didMount:r.allDayDidMount,willUnmount:r.allDayWillUnmount},(function(t,n,r,o){return qr("td",{ref:t,className:["fc-timegrid-axis","fc-scrollgrid-shrink"].concat(n).join(" ")},qr("div",{className:"fc-timegrid-axis-frame fc-scrollgrid-shrink-frame"+(null==e?" fc-timegrid-axis-frame-liquid":""),style:{height:e}},qr("span",{className:"fc-timegrid-axis-cushion fc-scrollgrid-shrink-cushion",ref:r},o)))}))},t.handleSlatCoords=function(e){t.setState({slatCoords:e})},t}return n(t,e),t.prototype.renderSimpleLayout=function(e,t,n){var r=this.context,o=this.props,i=[],a=sa(r.options);return e&&i.push({type:"header",key:"header",isSticky:a,chunk:{elRef:this.headerElRef,tableClassName:"fc-col-header",rowContent:e}}),t&&(i.push({type:"body",key:"all-day",chunk:{content:t}}),i.push({type:"body",key:"all-day-divider",outerContent:qr("tr",{className:"fc-scrollgrid-section"},qr("td",{className:"fc-timegrid-divider "+r.theme.getClass("tableCellShaded")}))})),i.push({type:"body",key:"body",liquid:!0,expandRows:Boolean(r.options.expandRows),chunk:{scrollerElRef:this.scrollerElRef,content:n}}),qr(Mo,{viewSpec:r.viewSpec,elRef:this.rootElRef},(function(e,t){return qr("div",{className:["fc-timegrid"].concat(t).join(" "),ref:e},qr(ua,{liquid:!o.isHeightAuto&&!o.forPrint,cols:[{width:"shrink"}],sections:i}))}))},t.prototype.renderHScrollLayout=function(e,t,n,r,o,i,a){var s=this,l=this.context.pluginHooks.scrollGridImpl;if(!l)throw new Error("No ScrollGrid implementation");var u=this.context,c=this.props,d=!c.forPrint&&sa(u.options),p=!c.forPrint&&la(u.options),f=[];e&&f.push({type:"header",key:"header",isSticky:d,syncRowHeights:!0,chunks:[{key:"axis",rowContent:function(e){return qr("tr",null,s.renderHeadAxis(e.rowSyncHeights[0]))}},{key:"cols",elRef:this.headerElRef,tableClassName:"fc-col-header",rowContent:e}]}),t&&(f.push({type:"body",key:"all-day",syncRowHeights:!0,chunks:[{key:"axis",rowContent:function(e){return qr("tr",null,s.renderTableRowAxis(e.rowSyncHeights[0]))}},{key:"cols",content:t}]}),f.push({key:"all-day-divider",type:"body",outerContent:qr("tr",{className:"fc-scrollgrid-section"},qr("td",{colSpan:2,className:"fc-timegrid-divider "+u.theme.getClass("tableCellShaded")}))}));var h=u.options.nowIndicator;return f.push({type:"body",key:"body",liquid:!0,expandRows:Boolean(u.options.expandRows),chunks:[{key:"axis",content:function(e){return qr("div",{className:"fc-timegrid-axis-chunk"},qr("table",null,e.tableColGroupNode,qr("tbody",null,qr(As,{slatMetas:i}))),qr("div",{className:"fc-timegrid-now-indicator-container"},qr(Ui,{unit:h?"minute":"day"},(function(e){var t=h&&a&&a.safeComputeTop(e);if("number"==typeof t)return qr(fa,{isAxis:!0,date:e},(function(e,n,r,o){return qr("div",{ref:e,className:["fc-timegrid-now-indicator-arrow"].concat(n).join(" "),style:{top:t}},o)}))}))))}},{key:"cols",scrollerElRef:this.scrollerElRef,content:n}]}),p&&f.push({key:"footer",type:"footer",isSticky:!0,chunks:[{key:"axis",content:aa},{key:"cols",content:aa}]}),qr(Mo,{viewSpec:u.viewSpec,elRef:this.rootElRef},(function(e,t){return qr("div",{className:["fc-timegrid"].concat(t).join(" "),ref:e},qr(l,{liquid:!c.isHeightAuto&&!c.forPrint,colGroups:[{width:"shrink",cols:[{width:"shrink"}]},{cols:[{span:r,minWidth:o}]}],sections:f}))}))},t.prototype.getAllDayMaxEventProps=function(){var e=this.context.options,t=e.dayMaxEvents,n=e.dayMaxEventRows;return!0!==t&&!0!==n||(t=void 0,n=5),{dayMaxEvents:t,dayMaxEventRows:n}},t}(mo);function Ws(e){return e.text}var As=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.render=function(){return this.props.slatMetas.map((function(e){return qr("tr",{key:e.key},qr(Is,r({},e)))}))},t}(no);function Ls(e,t){var n,r=[];for(n=0;n<t;n++)r.push([]);if(e)for(n=0;n<e.length;n++)r[e[n].col].push(e[n]);return r}function Us(e,t){var n=[];if(e){for(a=0;a<t;a++)n[a]={affectedInstances:e.affectedInstances,isEvent:e.isEvent,segs:[]};for(var r=0,o=e.segs;r<o.length;r++){var i=o[r];n[i.col].segs.push(i)}}else for(var a=0;a<t;a++)n[a]=null;return n}function Bs(e,t,n,r,o){return zs(e,t,n,r),function(e,t){for(var n=0,r=e;n<r.length;n++){(c=r[n]).level=null,c.forwardCoord=null,c.backwardCoord=null,c.forwardPressure=null}var o,i=function(e){var t,n,r,o=[];for(t=0;t<e.length;t++){for(n=e[t],r=0;r<o.length&&Vs(n,o[r]).length;r++);n.level=r,(o[r]||(o[r]=[])).push(n)}return o}(e=Tn(e,t));if(function(e){var t,n,r,o,i;for(t=0;t<e.length;t++)for(n=e[t],r=0;r<n.length;r++)for((o=n[r]).forwardSegs=[],i=t+1;i<e.length;i++)Vs(o,e[i],o.forwardSegs)}(i),o=i[0]){for(var a=0,s=o;a<s.length;a++){Fs(c=s[a])}for(var l=0,u=o;l<u.length;l++){var c;js(c=u[l],0,0,t)}}return e}(e,o)}function zs(e,t,n,r){for(var o=0,i=e;o<i.length;o++){var a=i[o];a.top=n.computeDateTop(a.start,t),a.bottom=Math.max(a.top+(r||0),n.computeDateTop(a.end,t))}}function Vs(e,t,n){void 0===n&&(n=[]);for(var r=0;r<t.length;r++)o=e,i=t[r],o.bottom>i.top&&o.top<i.bottom&&n.push(t[r]);var o,i;return n}function Fs(e){var t,n,r=e.forwardSegs,o=0;if(null==e.forwardPressure){for(t=0;t<r.length;t++)Fs(n=r[t]),o=Math.max(o,1+n.forwardPressure);e.forwardPressure=o}}function js(e,t,n,r){var o,i=e.forwardSegs;if(null==e.forwardCoord)for(i.length?(!function(e,t){var n=e.map(Gs),r=[{field:"forwardPressure",order:-1},{field:"backwardCoord",order:1}].concat(t);n.sort((function(e,t){return he(e,t,r)})),n.map((function(e){return e._seg}))}(i,r),js(i[0],t+1,n,r),e.forwardCoord=i[0].backwardCoord):e.forwardCoord=1,e.backwardCoord=e.forwardCoord-(e.forwardCoord-n)/(t+1),o=0;o<i.length;o++)js(i[o],0,e.forwardCoord,r)}function Gs(e){var t=xn(e);return t.forwardPressure=e.forwardPressure,t.backwardCoord=e.backwardCoord,t}var qs=Nt({hour:"numeric",minute:"2-digit",meridiem:!1}),Ys=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.render=function(){var e=["fc-timegrid-event","fc-v-event"];return this.props.isCondensed&&e.push("fc-timegrid-event-condensed"),qr(da,r({},this.props,{defaultTimeFormat:qs,extraClassNames:e}))},t}(no);Ei.timeGridEventCondensedHeight=30;var Zs=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.render=function(){var e=this,t=this.props,n=this.context.options.selectMirror,o=t.eventDrag&&t.eventDrag.segs||t.eventResize&&t.eventResize.segs||n&&t.dateSelectionSegs||[],i=t.eventDrag&&t.eventDrag.affectedInstances||t.eventResize&&t.eventResize.affectedInstances||{};return qr(ga,{elRef:t.elRef,date:t.date,dateProfile:t.dateProfile,todayRange:t.todayRange,extraHookProps:t.extraHookProps},(function(a,s,l){return qr("td",r({ref:a,className:["fc-timegrid-col"].concat(s,t.extraClassNames||[]).join(" ")},l,t.extraDataAttrs),qr("div",{className:"fc-timegrid-col-frame"},qr("div",{className:"fc-timegrid-col-bg"},e.renderFillSegs(t.businessHourSegs,"non-business"),e.renderFillSegs(t.bgEventSegs,"bg-event"),e.renderFillSegs(t.dateSelectionSegs,"highlight")),qr("div",{className:"fc-timegrid-col-events"},e.renderFgSegs(t.fgEventSegs,i)),qr("div",{className:"fc-timegrid-col-events"},e.renderFgSegs(o,{},Boolean(t.eventDrag),Boolean(t.eventResize),Boolean(n))),qr("div",{className:"fc-timegrid-now-indicator-container"},e.renderNowIndicator(t.nowIndicatorSegs)),qr(Xs,{date:t.date,dateProfile:t.dateProfile,todayRange:t.todayRange,extraHookProps:t.extraHookProps})))}))},t.prototype.renderFgSegs=function(e,t,n,r,o){var i=this.props;return i.forPrint?this.renderPrintFgSegs(e):i.slatCoords?this.renderPositionedFgSegs(e,t,n,r,o):void 0},t.prototype.renderPrintFgSegs=function(e){var t=this.props;return e.map((function(e){return qr("div",{className:"fc-timegrid-event-harness",key:e.eventRange.instance.instanceId},qr(Ys,r({seg:e,isDragging:!1,isResizing:!1,isDateSelecting:!1,isSelected:!1,isCondensed:!1},Nn(e,t.todayRange,t.nowDate))))}))},t.prototype.renderPositionedFgSegs=function(e,t,n,o,i){var a=this,s=this.context,l=this.props;return(e=Bs(e,l.date,l.slatCoords,s.options.eventMinHeight,s.options.eventOrder)).map((function(e){var s=e.eventRange.instance.instanceId,u=n||o||i?r({left:0,right:0},a.computeSegTopBottomCss(e)):a.computeFgSegPositionCss(e);return qr("div",{className:"fc-timegrid-event-harness"+(e.level>0?" fc-timegrid-event-harness-inset":""),key:s,style:r({visibility:t[s]?"hidden":""},u)},qr(Ys,r({seg:e,isDragging:n,isResizing:o,isDateSelecting:i,isSelected:s===l.eventSelection,isCondensed:e.bottom-e.top<Ei.timeGridEventCondensedHeight},Nn(e,l.todayRange,l.nowDate))))}))},t.prototype.renderFillSegs=function(e,t){var n=this,o=this.context,i=this.props;if(i.slatCoords){zs(e,i.date,i.slatCoords,o.options.eventMinHeight);var a=e.map((function(e){return qr("div",{key:Hn(e.eventRange),className:"fc-timegrid-bg-harness",style:n.computeSegTopBottomCss(e)},"bg-event"===t?qr(Sa,r({seg:e},Nn(e,i.todayRange,i.nowDate))):ya(t))}));return qr(Xr,null,a)}},t.prototype.renderNowIndicator=function(e){var t=this.props,n=t.slatCoords,r=t.date;if(n)return e.map((function(e,t){return qr(fa,{isAxis:!1,date:r,key:t},(function(t,o,i,a){return qr("div",{ref:t,className:["fc-timegrid-now-indicator-line"].concat(o).join(" "),style:{top:n.computeDateTop(e.start,r)}},a)}))}))},t.prototype.computeFgSegPositionCss=function(e){var t,n,o=this.context,i=o.isRtl,a=o.options.slotEventOverlap,s=e.backwardCoord,l=e.forwardCoord;a&&(l=Math.min(1,s+2*(l-s))),i?(t=1-l,n=s):(t=s,n=1-l);var u={zIndex:e.level+1,left:100*t+"%",right:100*n+"%"};return a&&e.forwardPressure&&(u[i?"marginLeft":"marginRight"]=20),r(r({},u),this.computeSegTopBottomCss(e))},t.prototype.computeSegTopBottomCss=function(e){return{top:e.top,bottom:-e.bottom}},t}(no),Xs=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.render=function(){var e=this.props;return qr(va,{date:e.date,dateProfile:e.dateProfile,todayRange:e.todayRange,extraHookProps:e.extraHookProps},(function(e,t){return t&&qr("div",{className:"fc-timegrid-col-misc",ref:e},t)}))},t}(no),Ks=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.splitFgEventSegs=gt(Ls),t.splitBgEventSegs=gt(Ls),t.splitBusinessHourSegs=gt(Ls),t.splitNowIndicatorSegs=gt(Ls),t.splitDateSelectionSegs=gt(Ls),t.splitEventDrag=gt(Us),t.splitEventResize=gt(Us),t.rootElRef=Zr(),t.cellElRefs=new Xi,t}return n(t,e),t.prototype.render=function(){var e=this,t=this.props,n=this.context.options.nowIndicator&&t.slatCoords&&t.slatCoords.safeComputeTop(t.nowDate),r=t.cells.length,o=this.splitFgEventSegs(t.fgEventSegs,r),i=this.splitBgEventSegs(t.bgEventSegs,r),a=this.splitBusinessHourSegs(t.businessHourSegs,r),s=this.splitNowIndicatorSegs(t.nowIndicatorSegs,r),l=this.splitDateSelectionSegs(t.dateSelectionSegs,r),u=this.splitEventDrag(t.eventDrag,r),c=this.splitEventResize(t.eventResize,r);return qr("div",{className:"fc-timegrid-cols",ref:this.rootElRef},qr("table",{style:{minWidth:t.tableMinWidth,width:t.clientWidth}},t.tableColGroupNode,qr("tbody",null,qr("tr",null,t.axis&&qr("td",{className:"fc-timegrid-col fc-timegrid-axis"},qr("div",{className:"fc-timegrid-col-frame"},qr("div",{className:"fc-timegrid-now-indicator-container"},"number"==typeof n&&qr(fa,{isAxis:!0,date:t.nowDate},(function(e,t,r,o){return qr("div",{ref:e,className:["fc-timegrid-now-indicator-arrow"].concat(t).join(" "),style:{top:n}},o)}))))),t.cells.map((function(n,r){return qr(Zs,{key:n.key,elRef:e.cellElRefs.createRef(n.key),dateProfile:t.dateProfile,date:n.date,nowDate:t.nowDate,todayRange:t.todayRange,extraHookProps:n.extraHookProps,extraDataAttrs:n.extraDataAttrs,extraClassNames:n.extraClassNames,fgEventSegs:o[r],bgEventSegs:i[r],businessHourSegs:a[r],nowIndicatorSegs:s[r],dateSelectionSegs:l[r],eventDrag:u[r],eventResize:c[r],slatCoords:t.slatCoords,eventSelection:t.eventSelection,forPrint:t.forPrint})}))))))},t.prototype.componentDidMount=function(){this.updateCoords()},t.prototype.componentDidUpdate=function(){this.updateCoords()},t.prototype.updateCoords=function(){var e,t=this.props;t.onColCoords&&null!==t.clientWidth&&t.onColCoords(new Br(this.rootElRef.current,(e=this.cellElRefs.currentMap,t.cells.map((function(t){return e[t.key]}))),!0,!1))},t}(no);var Js=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.processSlotOptions=gt($s),t.state={slatCoords:null},t.handleScrollRequest=function(e){var n=t.props.onScrollTopRequest,r=t.state.slatCoords;if(n&&r){if(e.time){var o=r.computeTimeTop(e.time);(o=Math.ceil(o))&&o++,n(o)}return!0}},t.handleColCoords=function(e){t.colCoords=e},t.handleSlatCoords=function(e){t.setState({slatCoords:e}),t.props.onSlatCoords&&t.props.onSlatCoords(e)},t}return n(t,e),t.prototype.render=function(){var e=this.props,t=this.state;return qr("div",{className:"fc-timegrid-body",ref:e.rootElRef,style:{width:e.clientWidth,minWidth:e.tableMinWidth}},qr(ks,{axis:e.axis,dateProfile:e.dateProfile,slatMetas:e.slatMetas,clientWidth:e.clientWidth,minHeight:e.expandRows?e.clientHeight:"",tableMinWidth:e.tableMinWidth,tableColGroupNode:e.axis?e.tableColGroupNode:null,onCoords:this.handleSlatCoords}),qr(Ks,{cells:e.cells,axis:e.axis,dateProfile:e.dateProfile,businessHourSegs:e.businessHourSegs,bgEventSegs:e.bgEventSegs,fgEventSegs:e.fgEventSegs,dateSelectionSegs:e.dateSelectionSegs,eventSelection:e.eventSelection,eventDrag:e.eventDrag,eventResize:e.eventResize,todayRange:e.todayRange,nowDate:e.nowDate,nowIndicatorSegs:e.nowIndicatorSegs,clientWidth:e.clientWidth,tableMinWidth:e.tableMinWidth,tableColGroupNode:e.tableColGroupNode,slatCoords:t.slatCoords,onColCoords:this.handleColCoords,forPrint:e.forPrint}))},t.prototype.componentDidMount=function(){this.scrollResponder=this.context.createScrollResponder(this.handleScrollRequest)},t.prototype.componentDidUpdate=function(e){this.scrollResponder.update(e.dateProfile!==this.props.dateProfile)},t.prototype.componentWillUnmount=function(){this.scrollResponder.detach()},t.prototype.positionToHit=function(e,t){var n=this.context,r=n.dateEnv,o=n.options,i=this.colCoords,a=this.props.dateProfile,s=this.state.slatCoords,l=this.processSlotOptions(this.props.slotDuration,o.snapDuration),u=l.snapDuration,c=l.snapsPerSlot,d=i.leftToIndex(e),p=s.positions.topToIndex(t);if(null!=d&&null!=p){var f=s.positions.tops[p],h=s.positions.getHeight(p),g=(t-f)/h,v=p*c+Math.floor(g*c),m=this.props.cells[d].date,y=ot(a.slotMinTime,it(u,v)),S=r.add(m,y);return{col:d,dateSpan:{range:{start:S,end:r.add(S,u)},allDay:!1},dayEl:i.els[d],relativeRect:{left:i.lefts[d],right:i.rights[d],top:f,bottom:f+h}}}},t}(no);function $s(e,t){var n=t||e,r=ct(e,n);return null===r&&(n=e,r=1),{snapDuration:n,snapsPerSlot:r}}var Qs=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.buildDayRanges=gt(el),t.slicer=new tl,t.timeColsRef=Zr(),t.handleRootEl=function(e){e?t.context.registerInteractiveComponent(t,{el:e}):t.context.unregisterInteractiveComponent(t)},t}return n(t,e),t.prototype.render=function(){var e=this,t=this.props,n=this.context,o=t.dateProfile,i=t.dayTableModel,a=n.options.nowIndicator,s=this.buildDayRanges(i,o,n.dateEnv);return qr(Ui,{unit:a?"minute":"day"},(function(l,u){return qr(Js,r({ref:e.timeColsRef,rootElRef:e.handleRootEl},e.slicer.sliceProps(t,o,null,n,s),{forPrint:t.forPrint,axis:t.axis,dateProfile:o,slatMetas:t.slatMetas,slotDuration:t.slotDuration,cells:i.cells[0],tableColGroupNode:t.tableColGroupNode,tableMinWidth:t.tableMinWidth,clientWidth:t.clientWidth,clientHeight:t.clientHeight,expandRows:t.expandRows,nowDate:l,nowIndicatorSegs:a&&e.slicer.sliceNowDate(l,n,s),todayRange:u,onScrollTopRequest:t.onScrollTopRequest,onSlatCoords:t.onSlatCoords}))}))},t.prototype.queryHit=function(e,t){var n=this.timeColsRef.current.positionToHit(e,t);if(n)return{component:this,dateSpan:n.dateSpan,dayEl:n.dayEl,rect:{left:n.relativeRect.left,right:n.relativeRect.right,top:n.relativeRect.top,bottom:n.relativeRect.bottom},layer:0}},t}(mo);function el(e,t,n){for(var r=[],o=0,i=e.headerDates;o<i.length;o++){var a=i[o];r.push({start:n.add(a,t.slotMinTime),end:n.add(a,t.slotMaxTime)})}return r}var tl=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.sliceRange=function(e,t){for(var n=[],r=0;r<t.length;r++){var o=gn(e,t[r]);o&&n.push({start:o.start,end:o.end,isStart:o.start.valueOf()===e.start.valueOf(),isEnd:o.end.valueOf()===e.end.valueOf(),col:r})}return n},t}(Gi),nl=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.buildTimeColsModel=gt(rl),t.buildSlatMetas=gt(_s),t}return n(t,e),t.prototype.render=function(){var e=this,t=this.context,n=t.options,o=t.dateEnv,i=t.dateProfileGenerator,a=this.props,s=a.dateProfile,l=this.buildTimeColsModel(s,i),u=this.allDaySplitter.splitProps(a),c=this.buildSlatMetas(s.slotMinTime,s.slotMaxTime,n.slotLabelInterval,n.slotDuration,o),d=n.dayMinWidth,p=!d,f=d,h=n.dayHeaders&&qr(zi,{dates:l.headerDates,dateProfile:s,datesRepDistinctDays:!0,renderIntro:p?this.renderHeadAxis:null}),g=!1!==n.allDaySlot&&function(t){return qr(Es,r({},u.allDay,{dateProfile:s,dayTableModel:l,nextDayThreshold:n.nextDayThreshold,tableMinWidth:t.tableMinWidth,colGroupNode:t.tableColGroupNode,renderRowIntro:p?e.renderTableRowAxis:null,showWeekNumbers:!1,expandRows:!1,headerAlignElRef:e.headerElRef,clientWidth:t.clientWidth,clientHeight:t.clientHeight,forPrint:a.forPrint},e.getAllDayMaxEventProps()))},v=function(t){return qr(Qs,r({},u.timed,{dayTableModel:l,dateProfile:s,axis:p,slotDuration:n.slotDuration,slatMetas:c,forPrint:a.forPrint,tableColGroupNode:t.tableColGroupNode,tableMinWidth:t.tableMinWidth,clientWidth:t.clientWidth,clientHeight:t.clientHeight,onSlatCoords:e.handleSlatCoords,expandRows:t.expandRows,onScrollTopRequest:e.handleScrollTopRequest}))};return f?this.renderHScrollLayout(h,g,v,l.colCnt,d,c,this.state.slatCoords):this.renderSimpleLayout(h,g,v)},t}(Os);function rl(e,t){var n=new Fi(e.renderRange,t);return new ji(n,!1)}var ol=yo({initialView:"timeGridWeek",optionRefiners:{allDaySlot:Boolean},views:{timeGrid:{component:nl,usesMinMaxTime:!0,allDaySlot:!0,slotDuration:"00:30:00",slotEventOverlap:!0},timeGridDay:{type:"timeGrid",duration:{days:1}},timeGridWeek:{type:"timeGrid",duration:{weeks:1}}}}),il=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.render=function(){var e=this.props,t=e.dayDate,n=e.todayRange,o=this.context,i=o.theme,a=o.dateEnv,s=o.options,l=o.viewApi,u=wr(t,n),c=s.listDayFormat?a.format(t,s.listDayFormat):"",d=s.listDaySideFormat?a.format(t,s.listDaySideFormat):"",p=s.navLinks?kr(t):null,f=r({date:a.toDate(t),view:l,text:c,sideText:d,navLinkData:p},u),h=["fc-list-day"].concat(Tr(u,i));return qr(bo,{hookProps:f,classNames:s.dayHeaderClassNames,content:s.dayHeaderContent,defaultContent:al,didMount:s.dayHeaderDidMount,willUnmount:s.dayHeaderWillUnmount},(function(e,n,r,o){return qr("tr",{ref:e,className:h.concat(n).join(" "),"data-date":pt(t)},qr("th",{colSpan:3},qr("div",{className:"fc-list-day-cushion "+i.getClass("tableCellShaded"),ref:r},o)))}))},t}(no);function al(e){var t=e.navLinkData?{"data-navlink":e.navLinkData,tabIndex:0}:{};return qr(Xr,null,e.text&&qr("a",r({className:"fc-list-day-text"},t),e.text),e.sideText&&qr("a",r({className:"fc-list-day-side-text"},t),e.sideText))}var sl=Nt({hour:"numeric",minute:"2-digit",meridiem:"short"}),ll=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.render=function(){var e=this.props,t=this.context,n=e.seg,r=t.options.eventTimeFormat||sl;return qr(ca,{seg:n,timeText:"",disableDragging:!0,disableResizing:!0,defaultContent:ul,isPast:e.isPast,isFuture:e.isFuture,isToday:e.isToday,isSelected:e.isSelected,isDragging:e.isDragging,isResizing:e.isResizing,isDateSelecting:e.isDateSelecting},(function(e,o,i,a,s){return qr("tr",{className:["fc-list-event",s.event.url?"fc-event-forced-url":""].concat(o).join(" "),ref:e},function(e,t,n){var r=n.options;if(!1!==r.displayEventTime){var o=e.eventRange.def,i=e.eventRange.instance,a=!1,s=void 0;if(o.allDay?a=!0:dn(e.eventRange.range)?e.isStart?s=In(e,t,n,null,null,i.range.start,e.end):e.isEnd?s=In(e,t,n,null,null,e.start,i.range.end):a=!0:s=In(e,t,n),a){var l={text:n.options.allDayText,view:n.viewApi};return qr(bo,{hookProps:l,classNames:r.allDayClassNames,content:r.allDayContent,defaultContent:cl,didMount:r.allDayDidMount,willUnmount:r.allDayWillUnmount},(function(e,t,n,r){return qr("td",{className:["fc-list-event-time"].concat(t).join(" "),ref:e},r)}))}return qr("td",{className:"fc-list-event-time"},s)}return null}(n,r,t),qr("td",{className:"fc-list-event-graphic"},qr("span",{className:"fc-list-event-dot",style:{borderColor:s.borderColor||s.backgroundColor}})),qr("td",{className:"fc-list-event-title",ref:i},a))}))},t}(no);function ul(e){var t=e.event,n=t.url;return qr("a",r({},n?{href:n}:{}),t.title)}function cl(e){return e.text}var dl=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.computeDateVars=gt(fl),t.eventStoreToSegs=gt(t._eventStoreToSegs),t.setRootEl=function(e){e?t.context.registerInteractiveComponent(t,{el:e}):t.context.unregisterInteractiveComponent(t)},t}return n(t,e),t.prototype.render=function(){var e=this,t=this.props,n=this.context,r=["fc-list",n.theme.getClass("table"),!1!==n.options.stickyHeaderDates?"fc-list-sticky":""],o=this.computeDateVars(t.dateProfile),i=o.dayDates,a=o.dayRanges,s=this.eventStoreToSegs(t.eventStore,t.eventUiBases,a);return qr(Mo,{viewSpec:n.viewSpec,elRef:this.setRootEl},(function(n,o){return qr("div",{ref:n,className:r.concat(o).join(" ")},qr(Zi,{liquid:!t.isHeightAuto,overflowX:t.isHeightAuto?"visible":"hidden",overflowY:t.isHeightAuto?"visible":"auto"},s.length>0?e.renderSegList(s,i):e.renderEmptyMessage()))}))},t.prototype.renderEmptyMessage=function(){var e=this.context,t=e.options,n=e.viewApi,r={text:t.noEventsText,view:n};return qr(bo,{hookProps:r,classNames:t.noEventsClassNames,content:t.noEventsContent,defaultContent:pl,didMount:t.noEventsDidMount,willUnmount:t.noEventsWillUnmount},(function(e,t,n,r){return qr("div",{className:["fc-list-empty"].concat(t).join(" "),ref:e},qr("div",{className:"fc-list-empty-cushion",ref:n},r))}))},t.prototype.renderSegList=function(e,t){var n=this.context,o=n.theme,i=n.options,a=function(e){var t,n,r=[];for(t=0;t<e.length;t++)n=e[t],(r[n.dayIndex]||(r[n.dayIndex]=[])).push(n);return r}(e);return qr(Ui,{unit:"day"},(function(e,n){for(var s=[],l=0;l<a.length;l++){var u=a[l];if(u){var c=t[l].toISOString();s.push(qr(il,{key:c,dayDate:t[l],todayRange:n}));for(var d=0,p=u=Tn(u,i.eventOrder);d<p.length;d++){var f=p[d];s.push(qr(ll,r({key:c+":"+f.eventRange.instance.instanceId,seg:f,isDragging:!1,isResizing:!1,isDateSelecting:!1,isSelected:!1},Nn(f,n,e))))}}}return qr("table",{className:"fc-list-table "+o.getClass("table")},qr("tbody",null,s))}))},t.prototype._eventStoreToSegs=function(e,t,n){return this.eventRangesToSegs(En(e,t,this.props.dateProfile.activeRange,this.context.options.nextDayThreshold).fg,n)},t.prototype.eventRangesToSegs=function(e,t){for(var n=[],r=0,o=e;r<o.length;r++){var i=o[r];n.push.apply(n,this.eventRangeToSegs(i,t))}return n},t.prototype.eventRangeToSegs=function(e,t){var n,r,o,i=this.context.dateEnv,a=this.context.options.nextDayThreshold,s=e.range,l=e.def.allDay,u=[];for(n=0;n<t.length;n++)if((r=gn(s,t[n]))&&(o={component:this,eventRange:e,start:r.start,end:r.end,isStart:e.isStart&&r.start.valueOf()===s.start.valueOf(),isEnd:e.isEnd&&r.end.valueOf()===s.end.valueOf(),dayIndex:n},u.push(o),!o.isEnd&&!l&&n+1<t.length&&s.end<i.add(t[n+1].start,a))){o.end=s.end,o.isEnd=!0;break}return u},t}(mo);function pl(e){return e.text}function fl(e){for(var t=Pe(e.renderRange.start),n=e.renderRange.end,r=[],o=[];t<n;)r.push(t),o.push({start:t,end:De(t,1)}),t=De(t,1);return{dayDates:r,dayRanges:o}}function hl(e){return!1===e?null:Nt(e)}var gl=yo({optionRefiners:{listDayFormat:hl,listDaySideFormat:hl,noEventsClassNames:Vt,noEventsContent:Vt,noEventsDidMount:Vt,noEventsWillUnmount:Vt},views:{list:{component:dl,buttonTextKey:"list",listDayFormat:{month:"long",day:"numeric",year:"numeric"}},listDay:{type:"list",duration:{days:1},listDayFormat:{weekday:"long"}},listWeek:{type:"list",duration:{weeks:1},listDayFormat:{weekday:"long"},listDaySideFormat:{month:"long",day:"numeric",year:"numeric"}},listMonth:{type:"list",duration:{month:1},listDaySideFormat:{weekday:"long"}},listYear:{type:"list",duration:{year:1},listDaySideFormat:{weekday:"long"}}}}),vl=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t}(jr);vl.prototype.classes={root:"fc-theme-bootstrap",table:"table-bordered",tableCellShaded:"table-active",buttonGroup:"btn-group",button:"btn btn-primary",buttonActive:"active",popover:"popover",popoverHeader:"popover-header",popoverContent:"popover-body"},vl.prototype.baseIconClass="fa",vl.prototype.iconClasses={close:"fa-times",prev:"fa-chevron-left",next:"fa-chevron-right",prevYear:"fa-angle-double-left",nextYear:"fa-angle-double-right"},vl.prototype.rtlIconClasses={prev:"fa-chevron-right",next:"fa-chevron-left",prevYear:"fa-angle-double-right",nextYear:"fa-angle-double-left"},vl.prototype.iconOverrideOption="bootstrapFontAwesome",vl.prototype.iconOverrideCustomButtonOption="bootstrapFontAwesome",vl.prototype.iconOverridePrefix="fa-";var ml=yo({themeClasses:{bootstrap:vl}});var yl=yo({eventSourceDefs:[{parseMeta:function(e){var t=e.googleCalendarId;return!t&&e.url&&(t=function(e){var t;if(/^[^/]+@([^/.]+\.)*(google|googlemail|gmail)\.com$/.test(e))return e;if((t=/^https:\/\/www.googleapis.com\/calendar\/v3\/calendars\/([^/]*)/.exec(e))||(t=/^https?:\/\/www.google.com\/calendar\/feeds\/([^/]*)/.exec(e)))return decodeURIComponent(t[1])}(e.url)),t?{googleCalendarId:t,googleCalendarApiKey:e.googleCalendarApiKey,googleCalendarApiBase:e.googleCalendarApiBase,extraParams:e.extraParams}:null},fetch:function(e,t,n){var o=e.context,i=o.dateEnv,a=o.options,s=e.eventSource.meta,l=s.googleCalendarApiKey||a.googleCalendarApiKey;if(l){var u=function(e){var t=e.googleCalendarApiBase;t||(t="https://www.googleapis.com/calendar/v3/calendars");return t+"/"+encodeURIComponent(e.googleCalendarId)+"/events"}(s),c=s.extraParams,d="function"==typeof c?c():c,p=function(e,t,n,o){var i,a,s;o.canComputeOffset?(a=o.formatIso(e.start),s=o.formatIso(e.end)):(a=De(e.start,-1).toISOString(),s=De(e.end,1).toISOString());i=r(r({},n||{}),{key:t,timeMin:a,timeMax:s,singleEvents:!0,maxResults:9999}),"local"!==o.timeZone&&(i.timeZone=o.timeZone);return i}(e.range,l,d,i);Ko("GET",u,p,(function(e,r){var o,i;e.error?n({message:"Google Calendar API: "+e.error.message,errors:e.error.errors,xhr:r}):t({rawEvents:(o=e.items,i=p.timeZone,o.map((function(e){return function(e,t){var n=e.htmlLink||null;n&&t&&(n=function(e,t){return e.replace(/(\?.*?)?(#|$)/,(function(e,n,r){return(n?n+"&":"?")+t+r}))}(n,"ctz="+t));return{id:e.id,title:e.summary,start:e.start.dateTime||e.start.date,end:e.end.dateTime||e.end.date,url:n,location:e.location,description:e.description}}(e,i)}))),xhr:r})}),(function(e,t){n({message:e,xhr:t})}))}else n({message:"Specify a googleCalendarApiKey. See http://fullcalendar.io/docs/google_calendar/"})}}],optionRefiners:{googleCalendarApiKey:String},eventSourceRefiners:{googleCalendarApiKey:String,googleCalendarId:String,googleCalendarApiBase:String,extraParams:Vt}}),Sl=["GPL-My-Project-Is-Open-Source","CC-Attribution-NonCommercial-NoDerivatives"],El={position:"absolute",zIndex:99999,bottom:"1px",left:"1px",background:"#eee",borderColor:"#ddd",borderStyle:"solid",borderWidth:"1px 1px 0 0",padding:"2px 4px",fontSize:"12px",borderTopRightRadius:"3px"};var Cl,bl=yo({optionRefiners:{schedulerLicenseKey:String},viewContainerAppends:[function(e){var t,n=e.options.schedulerLicenseKey;if(!(t=window.location.href,/\w+:\/\/fullcalendar\.io\/|\/examples\/[\w-]+\.html$/.test(t)||function(e){if(-1!==Sl.indexOf(e))return!0;var t=(e||"").match(/^(\d+)-fcs-(\d+)$/);if(t&&10===t[1].length){var n=new Date(1e3*parseInt(t[2],10)),r=new Date(Ei.mockSchedulerReleaseDate||"2020-06-29");if(Ae(r))if(De(r,-372)<n)return!0}return!1}(n)))return qr("div",{className:"fc-license-message",style:El},"Please use a valid license key. ",qr("a",{href:"http://fullcalendar.io/scheduler/license/"},"More Info"))}]}),Dl="wheel mousewheel DomMouseScroll MozMousePixelScroll".split(" "),Rl=function(){function e(e){var t=this;this.el=e,this.emitter=new Ur,this.isScrolling=!1,this.isTouching=!1,this.isRecentlyWheeled=!1,this.isRecentlyScrolled=!1,this.wheelWaiter=new ei(this._handleWheelWaited.bind(this)),this.scrollWaiter=new ei(this._handleScrollWaited.bind(this)),this.handleScroll=function(){t.startScroll(),t.emitter.trigger("scroll",t.isRecentlyWheeled,t.isTouching),t.isRecentlyScrolled=!0,t.scrollWaiter.request(500)},this.handleWheel=function(){t.isRecentlyWheeled=!0,t.wheelWaiter.request(500)},this.handleTouchStart=function(){t.isTouching=!0},this.handleTouchEnd=function(){t.isTouching=!1,t.isRecentlyScrolled||t.endScroll()},e.addEventListener("scroll",this.handleScroll),e.addEventListener("touchstart",this.handleTouchStart,{passive:!0}),e.addEventListener("touchend",this.handleTouchEnd);for(var n=0,r=Dl;n<r.length;n++){var o=r[n];e.addEventListener(o,this.handleWheel)}}return e.prototype.destroy=function(){var e=this.el;e.removeEventListener("scroll",this.handleScroll),e.removeEventListener("touchstart",this.handleTouchStart,{passive:!0}),e.removeEventListener("touchend",this.handleTouchEnd);for(var t=0,n=Dl;t<n.length;t++){var r=n[t];e.removeEventListener(r,this.handleWheel)}},e.prototype.startScroll=function(){this.isScrolling||(this.isScrolling=!0,this.emitter.trigger("scrollStart",this.isRecentlyWheeled,this.isTouching))},e.prototype.endScroll=function(){this.isScrolling&&(this.emitter.trigger("scrollEnd"),this.isScrolling=!1,this.isRecentlyScrolled=!0,this.isRecentlyWheeled=!1,this.scrollWaiter.clear(),this.wheelWaiter.clear())},e.prototype._handleScrollWaited=function(){this.isRecentlyScrolled=!1,this.isTouching||this.endScroll()},e.prototype._handleWheelWaited=function(){this.isRecentlyWheeled=!1},e}();function wl(e){var t=e.scrollLeft;if("rtl"===window.getComputedStyle(e).direction)switch(xl()){case"negative":t=e.scrollWidth-e.clientWidth+t;break;case"reverse":t=e.scrollWidth-e.clientWidth-t}return t}function Tl(e,t){if("rtl"===window.getComputedStyle(e).direction)switch(xl()){case"positive":t=e.scrollWidth-e.clientWidth+t;break;case"reverse":t=-t}e.scrollLeft=t}function xl(){return Cl||(Cl=function(){var e,t=z('<div style=" position: absolute; top: -1000px; width: 1px; height: 1px; overflow: scroll; direction: rtl; font-size: 100px; ">A</div>');document.body.appendChild(t),t.scrollLeft>0?e="positive":(t.scrollLeft=1,e=t.scrollLeft>0?"reverse":"negative");return V(t),e}())}var kl,Ml=-1!==(kl=z('<div style="position:-webkit-sticky;position:sticky"></div>').style.position).indexOf("sticky")?kl:null,Pl=/Edge/.test(navigator.userAgent),Il=function(){function e(e,t){var n=this;this.scrollEl=e,this.isRtl=t,this.usingRelative=null,this.updateSize=function(){var e=n.scrollEl,t=X(e,".fc-sticky"),r=n.queryElGeoms(t),o=e.clientWidth,i=e.clientHeight;n.usingRelative?function(e,t,n,r,o){e.forEach((function(e,i){var a,s,l=t[i],u=l.naturalBound,c=l.parentBound,d=c.right-c.left,p=c.bottom-c.bottom;d>r||p>o?(a=n[i].left-u.left,s=n[i].top-u.top):(a="",s=""),$(e,{position:"relative",left:a,right:-a,top:s})}))}(t,r,n.computeElDestinations(r,o),o,i):function(e,t,n){e.forEach((function(e,r){var o,i=t[r],a=i.textAlign,s=i.elWidth,l=i.parentBound,u=l.right-l.left;$(e,{left:o="center"===a&&u>n?(n-s)/2:"",right:o,top:0})}))}(t,r,o)},this.usingRelative=!Ml||Pl&&t,this.usingRelative&&(this.listener=new Rl(e),this.listener.emitter.on("scrollEnd",this.updateSize))}return e.prototype.destroy=function(){this.listener&&this.listener.destroy()},e.prototype.queryElGeoms=function(e){for(var t=this.scrollEl,n=this.isRtl,r=function(e){var t=e.getBoundingClientRect(),n=Hr(e);return{left:t.left+n.borderLeft+n.scrollbarLeft-wl(e),top:t.top+n.borderTop-e.scrollTop}}(t),o=[],i=0,a=e;i<a.length;i++){var s=a[i],l=yr(Or(s.parentNode,!0,!0),-r.left,-r.top),u=s.getBoundingClientRect(),c=window.getComputedStyle(s),d=window.getComputedStyle(s.parentNode).textAlign,p=null;"start"===d?d=n?"right":"left":"end"===d&&(d=n?"left":"right"),"sticky"!==c.position&&(p=yr(u,-r.left-(parseFloat(c.left)||0),-r.top-(parseFloat(c.top)||0))),o.push({parentBound:l,naturalBound:p,elWidth:u.width,elHeight:u.height,textAlign:d})}return o},e.prototype.computeElDestinations=function(e,t){var n=this.scrollEl,r=n.scrollTop,o=wl(n),i=o+t;return e.map((function(e){var t,n,a=e.elWidth,s=e.elHeight,l=e.parentBound,u=e.naturalBound;switch(e.textAlign){case"left":t=o;break;case"right":t=i-a;break;case"center":t=(o+i)/2-a/2}return t=Math.min(t,l.right-a),t=Math.max(t,l.left),n=r,n=Math.min(n,l.bottom-s),{left:t,top:n=Math.max(n,u.top)}}))},e}();var Nl=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.elRef=Zr(),t.state={xScrollbarWidth:Nr().x,yScrollbarWidth:Nr().y},t.handleScroller=function(e){t.scroller=e,io(t.props.scrollerRef,e)},t.handleSizing=function(){var e=t.props;"scroll-hidden"===e.overflowY&&t.setState({yScrollbarWidth:t.scroller.getYScrollbarWidth()}),"scroll-hidden"===e.overflowX&&t.setState({xScrollbarWidth:t.scroller.getXScrollbarWidth()})},t}return n(t,e),t.prototype.render=function(){var e=this.props,t=this.state,n=this.context.isRtl&&Ir(),r=0,o=0,i=0;return"scroll-hidden"===e.overflowX&&(i=t.xScrollbarWidth),"scroll-hidden"===e.overflowY&&null!=t.yScrollbarWidth&&(n?r=t.yScrollbarWidth:o=t.yScrollbarWidth),qr("div",{ref:this.elRef,className:"fc-scroller-harness"+(e.liquid?" fc-scroller-harness-liquid":"")},qr(Zi,{ref:this.handleScroller,elRef:this.props.scrollerElRef,overflowX:"scroll-hidden"===e.overflowX?"scroll":e.overflowX,overflowY:"scroll-hidden"===e.overflowY?"scroll":e.overflowY,overcomeLeft:r,overcomeRight:o,overcomeBottom:i,maxHeight:"number"==typeof e.maxHeight?e.maxHeight+("scroll-hidden"===e.overflowX?t.xScrollbarWidth:0):"",liquid:e.liquid,liquidIsAbsolute:!0},e.children))},t.prototype.componentDidMount=function(){this.handleSizing(),this.context.addResizeHandler(this.handleSizing)},t.prototype.componentDidUpdate=function(e){qe(e,this.props)||this.handleSizing()},t.prototype.componentWillUnmount=function(){this.context.removeResizeHandler(this.handleSizing)},t.prototype.needsXScrolling=function(){return this.scroller.needsXScrolling()},t.prototype.needsYScrolling=function(){return this.scroller.needsYScrolling()},t}(no),_l=function(){function e(e,t){var n=this;this.isVertical=e,this.scrollEls=t,this.isPaused=!1,this.scrollListeners=t.map((function(e){return n.bindScroller(e)}))}return e.prototype.destroy=function(){for(var e=0,t=this.scrollListeners;e<t.length;e++){t[e].destroy()}},e.prototype.bindScroller=function(e){var t=this,n=this.scrollEls,r=this.isVertical,o=new Rl(e);return o.emitter.on("scroll",(function(o,i){if(!t.isPaused&&((!t.masterEl||t.masterEl!==e&&(o||i))&&t.assignMaster(e),t.masterEl===e))for(var a=0,s=n;a<s.length;a++){var l=s[a];l!==e&&(r?l.scrollTop=e.scrollTop:l.scrollLeft=e.scrollLeft)}})),o.emitter.on("scrollEnd",(function(){t.masterEl===e&&(t.masterEl=null)})),o},e.prototype.assignMaster=function(e){this.masterEl=e;for(var t=0,n=this.scrollListeners;t<n.length;t++){var r=n[t];r.el!==e&&r.endScroll()}},e.prototype.forceScrollLeft=function(e){this.isPaused=!0;for(var t=0,n=this.scrollListeners;t<n.length;t++){Tl(n[t].el,e)}this.isPaused=!1},e.prototype.forceScrollTop=function(e){this.isPaused=!0;for(var t=0,n=this.scrollListeners;t<n.length;t++){n[t].el.scrollTop=e}this.isPaused=!1},e}(),Hl=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.compileColGroupStats=mt(Ll,zl),t.renderMicroColGroups=mt(ta),t.clippedScrollerRefs=new Xi,t.scrollerElRefs=new Xi(t._handleScrollerEl.bind(t)),t.chunkElRefs=new Xi(t._handleChunkEl.bind(t)),t.getStickyScrolling=mt(jl,null,Gl),t.getScrollSyncersBySection=yt(Vl.bind(t,!0),null,Fl),t.getScrollSyncersByColumn=yt(Vl.bind(t,!1),null,Fl),t.stickyScrollings=[],t.scrollSyncersBySection={},t.scrollSyncersByColumn={},t.rowUnstableMap=new Map,t.rowInnerMaxHeightMap=new Map,t.anyRowHeightsChanged=!1,t.state={shrinkWidths:[],forceYScrollbars:!1,forceXScrollbars:!1,scrollerClientWidths:{},scrollerClientHeights:{},sectionRowMaxHeights:[]},t.handleSizing=function(e){e||(t.anyRowHeightsChanged=!0);var n={};e||t.rowUnstableMap.size||(n.sectionRowMaxHeights=t.computeSectionRowMaxHeights()),t.setState(r(r({shrinkWidths:t.computeShrinkWidths()},t.computeScrollerDims()),n),(function(){t.rowUnstableMap.size||t.updateStickyScrolling()}))},t.handleRowHeightChange=function(e,n){var r=t,o=r.rowUnstableMap,i=r.rowInnerMaxHeightMap;if(n){o.delete(e);var a=Wl(e);i.has(e)&&i.get(e)===a||(i.set(e,a),t.anyRowHeightsChanged=!0),!o.size&&t.anyRowHeightsChanged&&(t.anyRowHeightsChanged=!1,t.setState({sectionRowMaxHeights:t.computeSectionRowMaxHeights()}))}else o.set(e,!0)},t}return n(t,e),t.prototype.render=function(){for(var e,t=this.props,n=this.state,r=this.context,i=n.shrinkWidths,a=this.compileColGroupStats(t.colGroups.map((function(e){return[e]}))),s=this.renderMicroColGroups(a.map((function(e,t){return[e.cols,i[t]]}))),l=oa(t.liquid,r),u=this.getDims(),c=(u[0],u[1],t.sections),d=c.length,p=0,f=[],h=[],g=[];p<d&&"header"===(e=c[p]).type;)f.push(this.renderSection(e,p,a,s,n.sectionRowMaxHeights)),p++;for(;p<d&&"body"===(e=c[p]).type;)h.push(this.renderSection(e,p,a,s,n.sectionRowMaxHeights)),p++;for(;p<d&&"footer"===(e=c[p]).type;)g.push(this.renderSection(e,p,a,s,n.sectionRowMaxHeights)),p++;return qr(Xr,null,qr("table",{ref:t.elRef,className:l.join(" ")},function(e,t){var n=e.map((function(e,n){var r=e.width;return"shrink"===r&&(r=e.totalColWidth+na(t[n])+1),qr("col",{style:{width:r}})}));return qr.apply(void 0,o(["colgroup",{}],n))}(a,i),Boolean(f.length)&&qr.apply(void 0,o(["thead",{}],f)),Boolean(h.length)&&qr.apply(void 0,o(["tbody",{}],h)),Boolean(g.length)&&qr.apply(void 0,o(["tfoot",{}],g))))},t.prototype.renderSection=function(e,t,n,r,o){var i=this;return"outerContent"in e?qr(Xr,{key:e.key},e.outerContent):qr("tr",{key:e.key,className:ia(e,this.props.liquid).join(" ")},e.chunks.map((function(a,s){return i.renderChunk(e,t,n[s],r[s],a,s,(o[t]||[])[s]||[])})))},t.prototype.renderChunk=function(e,t,n,r,o,i,a){if("outerContent"in o)return qr(Xr,{key:o.key},o.outerContent);var s=this.state,l=s.scrollerClientWidths,u=s.scrollerClientHeights,c=this.getDims(),d=c[0],p=c[1],f=t*p+i,h=i===(!this.context.isRtl||Ir()?p-1:0),g=t===d-1,v=g&&s.forceXScrollbars,m=h&&s.forceYScrollbars,y=n&&n.allowXScrolling,S=$i(this.props,e),E=Ji(this.props,e),C=e.expandRows&&E,b=Qi(e,o,{tableColGroupNode:r,tableMinWidth:n&&n.totalColMinWidth||"",clientWidth:void 0!==l[f]?l[f]:null,clientHeight:void 0!==u[f]?u[f]:null,expandRows:C,syncRowHeights:Boolean(e.syncRowHeights),rowSyncHeights:a,reportRowHeightChange:this.handleRowHeightChange}),D=v?g?"scroll":"scroll-hidden":y?g?"auto":"scroll-hidden":"hidden",R=m?h?"scroll":"scroll-hidden":S?h?"auto":"scroll-hidden":"hidden";return b=qr(Nl,{ref:this.clippedScrollerRefs.createRef(f),scrollerElRef:this.scrollerElRefs.createRef(f),overflowX:D,overflowY:R,liquid:E,maxHeight:e.maxHeight},b),qr("td",{key:o.key,ref:this.chunkElRefs.createRef(f)},b)},t.prototype.componentDidMount=function(){this.updateScrollSyncers(),this.handleSizing(),this.context.addResizeHandler(this.handleSizing)},t.prototype.componentDidUpdate=function(e,t){this.updateScrollSyncers(),this.handleSizing(t.sectionRowMaxHeights!==this.state.sectionRowMaxHeights)},t.prototype.componentWillUnmount=function(){this.context.removeResizeHandler(this.handleSizing),this.destroyStickyScrolling(),this.destroyScrollSyncers()},t.prototype.computeShrinkWidths=function(){var e=this,t=this.compileColGroupStats(this.props.colGroups.map((function(e){return[e]}))),n=this.getDims(),r=n[0],o=n[1],i=r*o,a=[];return t.forEach((function(t,n){if(t.hasShrinkCol){var r=e.chunkElRefs.collect(n,i,o);a[n]=Ki(r)}})),a},t.prototype.computeSectionRowMaxHeights=function(){for(var e=this.rowInnerMaxHeightMap,t=new Map,n=this.getDims(),r=n[0],o=n[1],i=[],a=0;a<r;a++){var s=this.props.sections[a],l=[];if(s&&s.syncRowHeights){for(var u=[],c=0;c<o;c++){var d=a*o+c,p=[],f=this.chunkElRefs.currentMap[d];p=f?X(f,".fc-scrollgrid-sync-table tr").map((function(n){var r=e.get(n);return null==r&&(r=Wl(n)),t.set(n,r),r})):[],u.push(p)}var h=u[0].length,g=!0;for(c=1;c<o;c++){if(!(s.chunks[c]&&void 0!==s.chunks[c].outerContent)&&u[c].length!==h){g=!1;break}}if(g){for(c=0;c<o;c++)l.push([]);for(C=0;C<h;C++){var v=[];for(c=0;c<o;c++){var m=u[c][C];null!=m&&v.push(m)}var y=Math.max.apply(Math,v);for(c=0;c<o;c++)l[c].push(y)}}else{for(var S=[],c=0;c<o;c++)S.push(Ol(u[c])+u[c].length);for(var E=Math.max.apply(Math,S),c=0;c<o;c++){var C,b=u[c].length,D=E-b,R=Math.floor(D/b),w=D-R*(b-1),T=[];for((C=0)<b&&(T.push(w),C++);C<b;)T.push(R),C++;l.push(T)}}}i.push(l)}return this.rowInnerMaxHeightMap=t,i},t.prototype.computeScrollerDims=function(){for(var e=Nr(),t=this.getDims(),n=t[0],r=t[1],o=!this.context.isRtl||Ir()?r-1:0,i=n-1,a=this.clippedScrollerRefs.currentMap,s=this.scrollerElRefs.currentMap,l=!1,u=!1,c={},d={},p=0;p<n;p++){if((h=a[g=p*r+o])&&h.needsYScrolling()){l=!0;break}}for(var f=0;f<r;f++){var h;if((h=a[g=i*r+f])&&h.needsXScrolling()){u=!0;break}}for(p=0;p<n;p++)for(f=0;f<r;f++){var g,v=s[g=p*r+f];if(v){var m=v.parentNode;c[g]=Math.floor(m.getBoundingClientRect().width-(f===o&&l?e.y:0)),d[g]=Math.floor(m.getBoundingClientRect().height-(p===i&&u?e.x:0))}}return{forceYScrollbars:l,forceXScrollbars:u,scrollerClientWidths:c,scrollerClientHeights:d}},t.prototype.updateStickyScrolling=function(){var e=this.context.isRtl,t=this.scrollerElRefs.getAll().map((function(t){return[t,e]})),n=this.getStickyScrolling(t);for(var r in n)n[r].updateSize();this.stickyScrollings=n},t.prototype.destroyStickyScrolling=function(){this.stickyScrollings.forEach(Gl)},t.prototype.updateScrollSyncers=function(){for(var e=this.getDims(),t=e[0],n=e[1],r=t*n,o={},i={},a=this.scrollerElRefs.currentMap,s=0;s<t;s++){var l=s*n,u=l+n;o[s]=Ke(a,l,u,1)}for(var c=0;c<n;c++)i[c]=this.scrollerElRefs.collect(c,r,n);this.scrollSyncersBySection=this.getScrollSyncersBySection(o),this.scrollSyncersByColumn=this.getScrollSyncersByColumn(i)},t.prototype.destroyScrollSyncers=function(){Fe(this.scrollSyncersBySection,Fl),Fe(this.scrollSyncersByColumn,Fl)},t.prototype.getChunkConfigByIndex=function(e){var t=this.getDims()[1],n=Math.floor(e/t),r=e%t,o=this.props.sections[n];return o&&o.chunks[r]},t.prototype.forceScrollLeft=function(e,t){var n=this.scrollSyncersByColumn[e];n&&n.forceScrollLeft(t)},t.prototype.forceScrollTop=function(e,t){var n=this.scrollSyncersBySection[e];n&&n.forceScrollTop(t)},t.prototype._handleChunkEl=function(e,t){var n=this.getChunkConfigByIndex(parseInt(t,10));n&&io(n.elRef,e)},t.prototype._handleScrollerEl=function(e,t){var n=this.getChunkConfigByIndex(parseInt(t,10));n&&io(n.scrollerElRef,e)},t.prototype.getDims=function(){var e=this.props.sections.length;return[e,e?this.props.sections[0].chunks.length:0]},t}(no);function Ol(e){for(var t=0,n=0,r=e;n<r.length;n++){t+=r[n]}return t}function Wl(e){var t=X(e,".fc-scrollgrid-sync-inner").map(Al);return t.length?Math.max.apply(Math,t):0}function Al(e){return e.offsetHeight}function Ll(e){var t=Ul(e.cols,"width"),n=Ul(e.cols,"minWidth"),r=ra(e.cols);return{hasShrinkCol:r,totalColWidth:t,totalColMinWidth:n,allowXScrolling:"shrink"!==e.width&&Boolean(t||n||r),cols:e.cols,width:e.width}}function Ul(e,t){for(var n=0,r=0,o=e;r<o.length;r++){var i=o[r],a=i[t];"number"==typeof a&&(n+=a*(i.span||1))}return n}Hl.addStateEquality({shrinkWidths:B,scrollerClientWidths:qe,scrollerClientHeights:qe});var Bl={cols:ea};function zl(e,t){return Ze(e,t,Bl)}function Vl(e){for(var t=[],n=1;n<arguments.length;n++)t[n-1]=arguments[n];return new _l(e,t)}function Fl(e){e.destroy()}function jl(e,t){return new Il(e,t)}function Gl(e){e.destroy()}var ql=yo({deps:[bl],scrollGridImpl:Hl}),Yl=[],Zl=[],Xl=yo({deps:[bl],contextInit:function(e){Yl.length||(window.addEventListener("beforeprint",Kl),window.addEventListener("afterprint",Jl)),Yl.push(e),e.calendarApi.on("_unmount",(function(){U(Yl,e),Yl.length||(window.removeEventListener("beforeprint",Kl),window.removeEventListener("afterprint",Jl))}))}});function Kl(){for(var e=X(document.body,".fc-scroller-harness > .fc-scroller"),t=e.map((function(e){var t=window.getComputedStyle(e);return{scrollLeft:e.scrollLeft,scrollTop:e.scrollTop,overflowX:t.overflowX,overflowY:t.overflowY,marginBottom:t.marginBottom}})),n=0,r=Yl;n<r.length;n++){r[n].emitter.trigger("_beforeprint")}Jr(),function(e,t){e.forEach((function(e,n){e.style.overflowX="visible",e.style.overflowY="visible",e.style.marginBottom="",e.style.left=-t[n].scrollLeft+"px"}))}(e,t),Zl.push((function(){return function(e,t){e.forEach((function(e,n){var r=t[n];e.style.overflowX=r.overflowX,e.style.overflowY=r.overflowY,e.style.marginBottom=r.marginBottom,e.style.left="",e.scrollLeft=r.scrollLeft,e.scrollTop=r.scrollTop}))}(e,t)})),Zl.push(function(){var e=X(document.body,".fc-scrollgrid");return e.forEach($l),function(){return e.forEach(Ql)}}())}function Jl(){for(var e=0,t=Yl;e<t.length;e++){t[e].emitter.trigger("_afterprint")}for(Jr();Zl.length;)Zl.shift()()}function $l(e){e.style.width=e.getBoundingClientRect().width+"px"}function Ql(e){e.style.width=""}Ei.MAX_TIMELINE_SLOTS=1e3;var eu=[{years:1},{months:1},{days:1},{hours:1},{minutes:30},{minutes:15},{minutes:10},{minutes:5},{minutes:1},{seconds:30},{seconds:15},{seconds:10},{seconds:5},{seconds:1},{milliseconds:500},{milliseconds:100},{milliseconds:10},{milliseconds:1}];function tu(e,t,n,r){var o={labelInterval:n.slotLabelInterval,slotDuration:n.slotDuration};!function(e,t,n){var r=t.currentRange;if(e.labelInterval){n.countDurationsBetween(r.start,r.end,e.labelInterval)>Ei.MAX_TIMELINE_SLOTS&&(console.warn("slotLabelInterval results in too many cells"),e.labelInterval=null)}if(e.slotDuration){n.countDurationsBetween(r.start,r.end,e.slotDuration)>Ei.MAX_TIMELINE_SLOTS&&(console.warn("slotDuration results in too many cells"),e.slotDuration=null)}if(e.labelInterval&&e.slotDuration){var o=ct(e.labelInterval,e.slotDuration);(null===o||o<1)&&(console.warn("slotLabelInterval must be a multiple of slotDuration"),e.slotDuration=null)}}(o,e,t),ou(o,e,t),function(e,t,n){var r=t.currentRange,o=e.slotDuration;if(!o){for(var i=ou(e,t,n),a=0,s=eu;a<s.length;a++){var l=tt(s[a]),u=ct(i,l);if(null!==u&&u>1&&u<=6){o=l;break}}if(o)n.countDurationsBetween(r.start,r.end,o)>200&&(o=null);o||(o=i),e.slotDuration=o}}(o,e,t);var i=n.slotLabelFormat,a=Array.isArray(i)?i:null!=i?[i]:function(e,t,n,r){var o,i,a=e.labelInterval,s=dt(a).unit,l=r.weekNumbers,u=o=i=null;"week"!==s||l||(s="day");switch(s){case"year":u={year:"numeric"};break;case"month":iu("years",t,n)>1&&(u={year:"numeric"}),o={month:"short"};break;case"week":iu("years",t,n)>1&&(u={year:"numeric"}),o={week:"narrow"};break;case"day":iu("years",t,n)>1?u={year:"numeric",month:"long"}:iu("months",t,n)>1&&(u={month:"long"}),l&&(o={week:"short"}),i={weekday:"narrow",day:"numeric"};break;case"hour":l&&(u={week:"short"}),iu("days",t,n)>1&&(o={weekday:"short",day:"numeric",month:"numeric",omitCommas:!0}),i={hour:"numeric",minute:"2-digit",omitZeroMinute:!0,meridiem:"short"};break;case"minute":st(a)/60>=6?(u={hour:"numeric",meridiem:"short"},o=function(e){return":"+me(e.date.minute,2)}):u={hour:"numeric",minute:"numeric",meridiem:"short"};break;case"second":lt(a)/60>=6?(u={hour:"numeric",minute:"2-digit",meridiem:"lowercase"},o=function(e){return":"+me(e.date.second,2)}):u={hour:"numeric",minute:"2-digit",second:"2-digit",meridiem:"lowercase"};break;case"millisecond":u={hour:"numeric",minute:"2-digit",second:"2-digit",meridiem:"lowercase"},o=function(e){return"."+me(e.millisecond,3)}}return[].concat(u||[],o||[],i||[])}(o,e,t,n);o.headerFormats=a.map((function(e){return Nt(e)})),o.isTimeScale=Boolean(o.slotDuration.milliseconds);var s=null;if(!o.isTimeScale){var l=dt(o.slotDuration).unit;/year|month|week/.test(l)&&(s=l)}o.largeUnit=s,o.emphasizeWeeks=rt(o.slotDuration)&&iu("weeks",e,t)>=2&&!n.businessHours;var u,c,d=n.snapDuration;d&&(u=tt(d),c=ct(o.slotDuration,u)),null==c&&(u=o.slotDuration,c=1),o.snapDuration=u,o.snapsPerSlot=c;var p=ut(e.slotMaxTime)-ut(e.slotMinTime),f=nu(e.renderRange.start,o,t),h=nu(e.renderRange.end,o,t);o.isTimeScale&&(f=t.add(f,e.slotMinTime),h=t.add(De(h,-1),e.slotMaxTime)),o.timeWindowMs=p,o.normalizedRange={start:f,end:h};for(var g=[],v=f;v<h;)ru(v,o,e,r)&&g.push(v),v=t.add(v,o.slotDuration);o.slotDates=g;var m=-1,y=0,S=[],E=[];for(v=f;v<h;)ru(v,o,e,r)?(m++,S.push(m),E.push(y)):S.push(m+.5),v=t.add(v,o.snapDuration),y++;return o.snapDiffToIndex=S,o.snapIndexToDiff=E,o.snapCnt=m+1,o.slotCnt=o.snapCnt/o.snapsPerSlot,o.isWeekStarts=function(e,t){for(var n=e.slotDates,r=e.emphasizeWeeks,o=null,i=[],a=0,s=n;a<s.length;a++){var l=s[a],u=t.computeWeekNumber(l),c=r&&null!==o&&o!==u;o=u,i.push(c)}return i}(o,t),o.cellRows=function(e,t){for(var n=e.slotDates,r=e.headerFormats,o=r.map((function(e){return[]})),i=r.map((function(e){return e.getLargestUnit?e.getLargestUnit():null})),a=0;a<n.length;a++)for(var s=n[a],l=e.isWeekStarts[a],u=0;u<r.length;u++){var c=r[u],d=o[u],p=d[d.length-1],f=r.length>1&&u<r.length-1,h=null;if(f){var g=t.format(s,c);p&&p.text===g?p.colspan+=1:h=au(s,g,i[u])}else if(!p||Se(t.countDurationsBetween(e.normalizedRange.start,s,e.labelInterval))){g=t.format(s,c);h=au(s,g,i[u])}else p.colspan+=1;h&&(h.weekStart=l,d.push(h))}return o}(o,t),o.slotsPerLabel=ct(o.labelInterval,o.slotDuration),o}function nu(e,t,n){var r=e;return t.isTimeScale||(r=Pe(r),t.largeUnit&&(r=n.startOf(r,t.largeUnit))),r}function ru(e,t,n,r){if(r.isHiddenDay(e))return!1;if(t.isTimeScale){var o=Pe(e),i=e.valueOf()-o.valueOf()-ut(n.slotMinTime);return(i=(i%864e5+864e5)%864e5)<t.timeWindowMs}return!0}function ou(e,t,n){var r=t.currentRange,o=e.labelInterval;if(!o){if(e.slotDuration){for(var i=0,a=eu;i<a.length;i++){var s=tt(a[i]),l=ct(s,e.slotDuration);if(null!==l&&l<=6){o=s;break}}o||(o=e.slotDuration)}else for(var u=0,c=eu;u<c.length;u++){if(o=tt(c[u]),n.countDurationsBetween(r.start,r.end,o)>=18)break}e.labelInterval=o}return o}function iu(e,t,n){var r=t.currentRange,o=null;return"years"===e?o=n.diffWholeYears(r.start,r.end):"months"===e||"weeks"===e?o=n.diffWholeMonths(r.start,r.end):"days"===e&&(o=Me(r.start,r.end)),o||0}function au(e,t,n){return{date:e,text:t,rowUnit:n,colspan:1,isWeekStart:!1}}var su=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.refineHookProps=vt(cu),t.normalizeClassNames=To(),t}return n(t,e),t.prototype.render=function(){var e=this.props,t=this.context,n=t.dateEnv,r=t.options,o=e.cell,i=e.dateProfile,a=e.tDateProfile,s=wr(o.date,e.todayRange,e.nowDate,i),l=["fc-timeline-slot","fc-timeline-slot-label"].concat("time"===o.rowUnit?xr(s,t.theme):Tr(s,t.theme));o.isWeekStart&&l.push("fc-timeline-slot-em");var u=r.navLinks&&o.rowUnit&&"time"!==o.rowUnit?kr(o.date,o.rowUnit):null,c=this.refineHookProps({dateMarker:o.date,text:o.text,dateEnv:t.dateEnv,viewApi:t.viewApi}),d=this.normalizeClassNames(r.slotLabelClassNames,c);return qr(wo,{hookProps:c,didMount:r.slotLabelDidMount,willUnmount:r.slotLabelWillUnmount},(function(t){return qr("th",{ref:t,className:l.concat(d).join(" "),"data-date":n.formatIso(o.date,{omitTime:!a.isTimeScale,omitTimeZoneOffset:!0}),colSpan:o.colspan},qr("div",{className:"fc-timeline-slot-frame",style:{height:e.rowInnerHeight}},qr(lu,{hookProps:c,isSticky:e.isSticky,navLinkData:u})))}))},t}(no),lu=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.render=function(){var e=this.props,t=this.context,n=e.navLinkData?{"data-navlink":e.navLinkData,tabIndex:0}:{};return qr(Ro,{hookProps:e.hookProps,content:t.options.slotLabelContent,defaultContent:uu},(function(t,o){return qr("a",r({ref:t,className:"fc-timeline-slot-cushion fc-scrollgrid-sync-inner"+(e.isSticky?" fc-sticky":"")},n),o)}))},t}(no);function uu(e){return e.text}function cu(e){return{date:e.dateEnv.toDate(e.dateMarker),view:e.viewApi,text:e.text}}var du=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.render=function(){var e=this.props,t=e.dateProfile,n=e.tDateProfile,r=e.rowInnerHeights,o=e.todayRange,i=e.nowDate,a=n.cellRows;return qr(Xr,null,a.map((function(e,s){var l=s===a.length-1,u=n.isTimeScale&&l;return qr("tr",{key:s,className:["fc-timeline-header-row",u?"fc-timeline-header-row-chrono":""].join(" ")},e.map((function(e){return qr(su,{key:e.date.toISOString(),cell:e,dateProfile:t,tDateProfile:n,todayRange:o,nowDate:i,rowInnerHeight:r&&r[s],isSticky:!l})})))})))},t}(no),pu=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.rootElRef=Zr(),t}return n(t,e),t.prototype.render=function(){var e=this,t=this.props,n=this.context,r=dt(t.tDateProfile.slotDuration).unit;return qr(Ui,{unit:r},(function(r,o){return qr("div",{className:"fc-timeline-header",ref:e.rootElRef},qr("table",{className:"fc-scrollgrid-sync-table",style:{minWidth:t.tableMinWidth,width:t.clientWidth}},t.tableColGroupNode,qr("tbody",null,qr(du,{dateProfile:t.dateProfile,tDateProfile:t.tDateProfile,nowDate:r,todayRange:o,rowInnerHeights:t.rowInnerHeights}))),n.options.nowIndicator&&t.slatCoords&&t.slatCoords.isDateInRange(r)&&qr(fa,{isAxis:!0,date:r},(function(e,n,o,i){return qr("div",{ref:e,className:["fc-timeline-now-indicator-arrow"].concat(n).join(" "),style:{left:t.slatCoords.dateToCoord(r)}},i)})))}))},t.prototype.componentDidMount=function(){this.updateSize()},t.prototype.componentDidUpdate=function(){this.updateSize()},t.prototype.updateSize=function(){this.props.onMaxCushionWidth&&this.props.onMaxCushionWidth(this.computeMaxCushionWidth())},t.prototype.computeMaxCushionWidth=function(){return Math.max.apply(Math,X(this.rootElRef.current,".fc-timeline-header-row:last-child .fc-timeline-slot-cushion").map((function(e){return e.getBoundingClientRect().width})))},t}(no),fu=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.render=function(){var e=this.props,t=this.context,n=t.dateEnv,o=t.options,i=t.theme,a=e.date,s=e.tDateProfile,l=e.isEm,u=wr(e.date,e.todayRange,e.nowDate,e.dateProfile),c=["fc-timeline-slot","fc-timeline-slot-lane"],d={"data-date":n.formatIso(a,{omitTimeZoneOffset:!0,omitTime:!s.isTimeScale})},p=r(r({date:n.toDate(e.date)},u),{view:t.viewApi});return l&&c.push("fc-timeline-slot-em"),s.isTimeScale&&c.push(Se(n.countDurationsBetween(s.normalizedRange.start,e.date,s.labelInterval))?"fc-timeline-slot-major":"fc-timeline-slot-minor"),c.push.apply(c,e.isDay?Tr(u,i):xr(u,i)),qr(bo,{hookProps:p,classNames:o.slotLaneClassNames,content:o.slotLaneContent,didMount:o.slotLaneDidMount,willUnmount:o.slotLaneWillUnmount,elRef:e.elRef},(function(e,t,n,o){return qr("td",r({ref:e,className:c.concat(t).join(" ")},d),qr("div",{ref:n},o))}))},t}(no),hu=function(){function e(e,t,n,r,o,i){this.slatRootEl=e,this.dateProfile=n,this.tDateProfile=r,this.dateEnv=o,this.isRtl=i,this.outerCoordCache=new Br(e,t,!0,!1),this.innerCoordCache=new Br(e,K(t,"div"),!0,!1)}return e.prototype.rangeToCoords=function(e){return this.isRtl?{right:this.dateToCoord(e.start),left:this.dateToCoord(e.end)}:{left:this.dateToCoord(e.start),right:this.dateToCoord(e.end)}},e.prototype.isDateInRange=function(e){return Sn(this.dateProfile.currentRange,e)},e.prototype.dateToCoord=function(e){var t=this.tDateProfile,n=this.computeDateSnapCoverage(e)/t.snapsPerSlot,r=Math.floor(n),o=n-(r=Math.min(r,t.slotCnt-1)),i=this.innerCoordCache,a=this.outerCoordCache;return this.isRtl?a.rights[r]-i.getWidth(r)*o-a.originClientRect.width:a.lefts[r]+i.getWidth(r)*o},e.prototype.computeDateSnapCoverage=function(e){return gu(e,this.tDateProfile,this.dateEnv)},e.prototype.computeDurationLeft=function(e){var t=this.dateProfile,n=this.dateEnv,r=this.isRtl,o=0;return t&&(o=this.dateToCoord(n.add(Pe(t.activeRange.start),e)),!r&&o&&(o+=1)),o},e}();function gu(e,t,n){var r=n.countDurationsBetween(t.normalizedRange.start,e,t.snapDuration);if(r<0)return 0;if(r>=t.snapDiffToIndex.length)return t.snapCnt;var o=Math.floor(r),i=t.snapDiffToIndex[o];return Se(i)?i+=r-o:i=Math.ceil(i),i}var vu=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.rootElRef=Zr(),t.cellElRefs=new Xi,t.handleScrollRequest=function(e){var n=t.props.onScrollLeftRequest,r=t.coords;if(n&&r){if(e.time)n(r.computeDurationLeft(e.time));return!0}},t}return n(t,e),t.prototype.render=function(){var e=this.props,t=this.context;return qr("div",{className:"fc-timeline-slots",ref:this.rootElRef},qr("table",{className:t.theme.getClass("table"),style:{minWidth:e.tableMinWidth,width:e.clientWidth}},e.tableColGroupNode,qr(mu,{cellElRefs:this.cellElRefs,dateProfile:e.dateProfile,tDateProfile:e.tDateProfile,nowDate:e.nowDate,todayRange:e.todayRange})))},t.prototype.componentDidMount=function(){this.updateSizing(),this.scrollResponder=this.context.createScrollResponder(this.handleScrollRequest)},t.prototype.componentDidUpdate=function(e){this.updateSizing(),this.scrollResponder.update(e.dateProfile!==this.props.dateProfile)},t.prototype.componentWillUnmount=function(){this.scrollResponder.detach(),this.props.onCoords&&this.props.onCoords(null)},t.prototype.updateSizing=function(){var e,t=this.props,n=this.context;null!==t.clientWidth&&this.scrollResponder&&(this.rootElRef.current.offsetWidth&&(this.coords=new hu(this.rootElRef.current,(e=this.cellElRefs.currentMap,t.tDateProfile.slotDates.map((function(t){var n=t.toISOString();return e[n]}))),t.dateProfile,t.tDateProfile,n.dateEnv,n.isRtl),t.onCoords&&t.onCoords(this.coords),this.scrollResponder.update(!1)))},t.prototype.positionToHit=function(e){var t=this.coords.outerCoordCache,n=this.context,r=n.dateEnv,o=n.isRtl,i=this.props.tDateProfile,a=t.leftToIndex(e);if(null!=a){var s=t.getWidth(a),l=o?(t.rights[a]-e)/s:(e-t.lefts[a])/s,u=Math.floor(l*i.snapsPerSlot),c=r.add(i.slotDates[a],it(i.snapDuration,u));return{dateSpan:{range:{start:c,end:r.add(c,i.snapDuration)},allDay:!this.props.tDateProfile.isTimeScale},dayEl:this.cellElRefs.currentMap[a],left:t.lefts[a],right:t.rights[a]}}return null},t}(no),mu=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.render=function(){var e=this.props,t=e.tDateProfile,n=e.cellElRefs,r=t.slotDates,o=t.isWeekStarts,i=!t.isTimeScale&&!t.largeUnit;return qr("tbody",null,qr("tr",null,r.map((function(r,a){var s=r.toISOString();return qr(fu,{key:s,elRef:n.createRef(s),date:r,dateProfile:e.dateProfile,tDateProfile:t,nowDate:e.nowDate,todayRange:e.todayRange,isEm:o[a],isDay:i})}))))},t}(no);var yu=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.render=function(){var e=this.props,t=[].concat(e.eventResizeSegs,e.dateSelectionSegs);return e.timelineCoords&&qr("div",{className:"fc-timeline-bg"},this.renderSegs(e.businessHourSegs||[],e.timelineCoords,"non-business"),this.renderSegs(e.bgEventSegs||[],e.timelineCoords,"bg-event"),this.renderSegs(t,e.timelineCoords,"highlight"))},t.prototype.renderSegs=function(e,t,n){var o=this.props,i=o.todayRange,a=o.nowDate,s=e.map((function(e){var o=t.rangeToCoords(e);return qr("div",{key:Hn(e.eventRange),className:"fc-timeline-bg-harness",style:{left:o.left,right:-o.right}},"bg-event"===n?qr(Sa,r({seg:e},Nn(e,i,a))):ya(n))}));return qr(Xr,null,s)},t}(no),Su=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.sliceRange=function(e,t,n,r,o){var i=function(e,t,n){if(!t.isTimeScale&&(e=cn(e),t.largeUnit)){var r=e;((e={start:n.startOf(e.start,t.largeUnit),end:n.startOf(e.end,t.largeUnit)}).end.valueOf()!==r.end.valueOf()||e.end<=e.start)&&(e={start:e.start,end:n.add(e.end,t.slotDuration)})}return e}(e,r,o),a=[];if(gu(i.start,r,o)<gu(i.end,r,o)){var s=gn(i,r.normalizedRange);s&&a.push({start:s.start,end:s.end,isStart:s.start.valueOf()===i.start.valueOf()&&ru(s.start,r,t,n),isEnd:s.end.valueOf()===i.end.valueOf()&&ru(Re(s.end,-1),r,t,n)})}return a},t}(Gi),Eu=Nt({hour:"numeric",minute:"2-digit",omitZeroMinute:!0,meridiem:"narrow"}),Cu=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.render=function(){var e=this.props;return qr(da,r({},e,{extraClassNames:["fc-timeline-event","fc-h-event"],defaultTimeFormat:Eu,defaultDisplayEventTime:!e.isTimeScale}))},t}(no);function bu(e,t){var n={};if(t)for(var r=0,o=e;r<o.length;r++){var i=o[r];n[i.eventRange.instance.instanceId]=t.rangeToCoords(i)}return n}function Du(e,t,n){var r,o,i,a,s=[],l=0;if(n)for(var u=0,c=e=Tn(e,t);u<c.length;u++){var d=c[u].eventRange.instance.instanceId,p=n[d];if(p){for(var f=0,h=0,g=0;g<s.length;g++){var v=s[g];r=p,o=f,i=v.dims,a=v.top,r.right>i.left&&r.left<i.right&&o+r.height>a&&o<a+i.height&&(f=v.top+v.dims.height,h=g)}for(;h<s.length&&f>=s[h].top;)h++;s.splice(h,0,{key:d,dims:p,top:f}),l=Math.max(l,f+p.height)}}for(var m={},y=0,S=s;y<S.length;y++){m[(v=S[y]).key]=v.top}return{segTops:m,height:l}}var Ru=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.slicer=new Su,t.computeFgSegHorizontals=gt(bu),t.computeSegVerticals=gt(Du),t.harnessElRefs=new Xi,t.innerElRef=Zr(),t.state={segDims:null},t}return n(t,e),t.prototype.render=function(){var e=this.props,t=this.state,n=this.context,r=e.dateProfile,o=e.tDateProfile,i=this.slicer.sliceProps(e,r,o.isTimeScale?null:e.nextDayThreshold,n,r,n.dateProfileGenerator,o,n.dateEnv),a=(i.eventDrag?i.eventDrag.segs:null)||(i.eventResize?i.eventResize.segs:null)||[],s=this.computeFgSegHorizontals(i.fgEventSegs,e.timelineCoords),l=this.computeSegVerticals(i.fgEventSegs,n.options.eventOrder,t.segDims),u=l.segTops,c=l.height,d=(i.eventDrag?i.eventDrag.affectedInstances:null)||(i.eventResize?i.eventResize.affectedInstances:null)||{};return qr(Xr,null,qr(yu,{businessHourSegs:i.businessHourSegs,bgEventSegs:i.bgEventSegs,timelineCoords:e.timelineCoords,eventResizeSegs:i.eventResize?i.eventResize.segs:[],dateSelectionSegs:i.dateSelectionSegs,nowDate:e.nowDate,todayRange:e.todayRange}),qr("div",{className:"fc-timeline-events fc-scrollgrid-sync-inner",ref:this.innerElRef,style:{height:c}},this.renderFgSegs(i.fgEventSegs,s,u,d,!1,!1,!1),this.renderFgSegs(a,bu(a,e.timelineCoords),u,{},Boolean(i.eventDrag),Boolean(i.eventResize),!1)))},t.prototype.componentDidMount=function(){this.updateSize()},t.prototype.componentDidUpdate=function(e,t){e.eventStore===this.props.eventStore&&e.timelineCoords===this.props.timelineCoords||this.updateSize()},t.prototype.updateSize=function(){var e=this,t=this.props,n=t.timelineCoords;if(t.onHeightChange&&t.onHeightChange(this.innerElRef.current,!1),n){var r=n.slatRootEl.getBoundingClientRect();this.setState({segDims:Fe(this.harnessElRefs.currentMap,(function(e){var t=e.getBoundingClientRect();return{left:Math.round(t.left-r.left),right:Math.round(t.right-r.left),height:Math.round(t.height)}}))},(function(){t.onHeightChange&&t.onHeightChange(e.innerElRef.current,!0)}))}},t.prototype.renderFgSegs=function(e,t,n,o,i,a,s){var l=this,u=this.harnessElRefs,c=this.props,d=i||a||s;return qr(Xr,null,e.map((function(e){var p=e.eventRange.instance.instanceId,f=t[p],h=n[p];return qr("div",{key:p,ref:d?null:u.createRef(p),className:"fc-timeline-event-harness",style:{left:f?f.left:"",right:f?-f.right:"",top:null!=h?h:"",visibility:o[p]?"hidden":""}},qr(Cu,r({isTimeScale:l.props.tDateProfile.isTimeScale,seg:e,isDragging:i,isResizing:a,isDateSelecting:s,isSelected:p===l.props.eventSelection},Nn(e,c.todayRange,c.nowDate))))})))},t}(no),wu=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.slatsRef=Zr(),t.state={coords:null},t.handeEl=function(e){e?t.context.registerInteractiveComponent(t,{el:e}):t.context.unregisterInteractiveComponent(t)},t.handleCoords=function(e){t.setState({coords:e}),t.props.onSlatCoords&&t.props.onSlatCoords(e)},t}return n(t,e),t.prototype.render=function(){var e=this,t=this.props,n=this.state,r=this.context.options,o=t.dateProfile,i=t.tDateProfile,a=dt(i.slotDuration).unit;return qr("div",{className:"fc-timeline-body",ref:this.handeEl,style:{minWidth:t.tableMinWidth,height:t.clientHeight,width:t.clientWidth}},qr(Ui,{unit:a},(function(a,s){return qr(Xr,null,qr(vu,{ref:e.slatsRef,dateProfile:o,tDateProfile:i,nowDate:a,todayRange:s,clientWidth:t.clientWidth,tableColGroupNode:t.tableColGroupNode,tableMinWidth:t.tableMinWidth,onCoords:e.handleCoords,onScrollLeftRequest:t.onScrollLeftRequest}),qr(Ru,{dateProfile:o,tDateProfile:t.tDateProfile,nowDate:a,todayRange:s,nextDayThreshold:r.nextDayThreshold,businessHours:t.businessHours,eventStore:t.eventStore,eventUiBases:t.eventUiBases,dateSelection:t.dateSelection,eventSelection:t.eventSelection,eventDrag:t.eventDrag,eventResize:t.eventResize,timelineCoords:n.coords}),r.nowIndicator&&n.coords&&n.coords.isDateInRange(a)&&qr(fa,{isAxis:!1,date:a},(function(e,t,r,o){return qr("div",{ref:e,className:["fc-timeline-now-indicator-line"].concat(t).join(" "),style:{left:n.coords.dateToCoord(a)}},o)})))})))},t.prototype.queryHit=function(e,t,n,r){var o=this.slatsRef.current.positionToHit(e);if(o)return{component:this,dateSpan:o.dateSpan,rect:{left:o.left,right:o.right,top:0,bottom:r},dayEl:o.dayEl,layer:0}},t}(mo),Tu=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.buildTimelineDateProfile=gt(tu),t.scrollGridRef=Zr(),t.state={slatCoords:null,slotCushionMaxWidth:null},t.handleSlatCoords=function(e){t.setState({slatCoords:e})},t.handleScrollLeftRequest=function(e){t.scrollGridRef.current.forceScrollLeft(0,e)},t.handleMaxCushionWidth=function(e){t.setState({slotCushionMaxWidth:Math.ceil(e)})},t}return n(t,e),t.prototype.render=function(){var e=this,t=this.props,n=this.state,o=this.context,i=o.options,a=!t.forPrint&&sa(i),s=!t.forPrint&&la(i),l=this.buildTimelineDateProfile(t.dateProfile,o.dateEnv,i,o.dateProfileGenerator),u=["fc-timeline",!1===i.eventOverlap?"fc-timeline-overlap-disabled":""],c=i.slotMinWidth,d=xu(l,c||this.computeFallbackSlotMinWidth(l)),p=[{type:"header",key:"header",isSticky:a,chunks:[{key:"timeline",content:function(r){return qr(pu,{dateProfile:t.dateProfile,clientWidth:r.clientWidth,clientHeight:r.clientHeight,tableMinWidth:r.tableMinWidth,tableColGroupNode:r.tableColGroupNode,tDateProfile:l,slatCoords:n.slatCoords,onMaxCushionWidth:c?null:e.handleMaxCushionWidth})}}]},{type:"body",key:"body",liquid:!0,chunks:[{key:"timeline",content:function(n){return qr(wu,r({},t,{clientWidth:n.clientWidth,clientHeight:n.clientHeight,tableMinWidth:n.tableMinWidth,tableColGroupNode:n.tableColGroupNode,tDateProfile:l,onSlatCoords:e.handleSlatCoords,onScrollLeftRequest:e.handleScrollLeftRequest}))}}]}];return s&&p.push({type:"footer",key:"footer",isSticky:!0,chunks:[{key:"timeline",content:aa}]}),qr(Mo,{viewSpec:o.viewSpec},(function(n,r){return qr("div",{ref:n,className:u.concat(r).join(" ")},qr(Hl,{ref:e.scrollGridRef,liquid:!t.isHeightAuto&&!t.forPrint,colGroups:[{cols:d}],sections:p}))}))},t.prototype.computeFallbackSlotMinWidth=function(e){return Math.max(30,(this.state.slotCushionMaxWidth||0)/e.slotsPerLabel)},t}(mo);function xu(e,t){return[{span:e.slotCnt,minWidth:t||1}]}var ku=yo({deps:[bl],initialView:"timelineDay",views:{timeline:{component:Tu,eventResizableFromStart:!0},timelineDay:{type:"timeline",duration:{days:1}},timelineWeek:{type:"timeline",duration:{weeks:1}},timelineMonth:{type:"timeline",duration:{months:1}},timelineYear:{type:"timeline",duration:{years:1}}}});function Mu(e,t){var n=e.resourceEditable;if(null==n){var r=e.sourceId&&t.getCurrentData().eventSources[e.sourceId];r&&(n=r.extendedProps.resourceEditable),null==n&&null==(n=t.options.eventResourceEditable)&&(n=t.options.editable)}return n}var Pu=function(){function e(){this.filterResources=gt(Iu)}return e.prototype.transform=function(e,t){if(t.viewSpec.optionDefaults.needsResourceData)return{resourceStore:this.filterResources(t.resourceStore,t.options.filterResourcesWithEvents,t.eventStore,t.dateProfile.activeRange),resourceEntityExpansions:t.resourceEntityExpansions}},e}();function Iu(e,t,n,o){if(t){var i=function(e,t){var n={};for(var r in e)for(var o=e[r],i=0,a=t[o.defId].resourceIds;i<a.length;i++){var s=a[i];n[s]=!0}return n}(function(e,t){return Ve(e,(function(e){return mn(e.range,t)}))}(n.instances,o),n.defs);return r(i,function(e,t){var n={};for(var r in e)for(var o=void 0;(o=t[r])&&(r=o.parentId);)n[r]=!0;return n}(i,e)),Ve(e,(function(e,t){return i[t]}))}return e}var Nu=function(){function e(){this.buildResourceEventUis=gt(_u,qe),this.injectResourceEventUis=gt(Hu)}return e.prototype.transform=function(e,t){if(!t.viewSpec.optionDefaults.needsResourceData)return{eventUiBases:this.injectResourceEventUis(e.eventUiBases,e.eventStore.defs,this.buildResourceEventUis(t.resourceStore))}},e}();function _u(e){return Fe(e,(function(e){return e.ui}))}function Hu(e,t,n){return Fe(e,(function(e,r){return r?function(e,t,n){for(var r=[],o=0,i=t.resourceIds;o<i.length;o++){var a=i[o];n[a]&&r.unshift(n[a])}return r.unshift(e),$t(r)}(e,t[r],n):e}))}var Ou=[];function Wu(e){Ou.push(e)}function Au(e){return Ou[e]}function Lu(){return Ou}var Uu={id:String,resources:Vt,url:String,method:String,startParam:String,endParam:String,timeZoneParam:String,extraParams:Vt};function Bu(e){var t;if("string"==typeof e?t={url:e}:"function"==typeof e||Array.isArray(e)?t={resources:e}:"object"==typeof e&&e&&(t=e),t){var n=zt(t,Uu),r=n.refined;!function(e){for(var t in e)console.warn("Unknown resource prop '"+t+"'")}(n.extra);var o=function(e){for(var t=Lu(),n=t.length-1;n>=0;n--){var r=t[n].parseMeta(e);if(r)return{meta:r,sourceDefId:n}}}(r);if(o)return{_raw:e,sourceId:ae(),sourceDefId:o.sourceDefId,meta:o.meta,publicId:r.id||"",isFetching:!1,latestFetchId:"",fetchRange:null}}return null}function zu(e,t,n){var o=n.options,i=n.dateProfile;if(!e||!t)return Vu(o.initialResources||o.resources,i.activeRange,o.refetchResourcesOnNavigate,n);switch(t.type){case"RESET_RESOURCE_SOURCE":return Vu(t.resourceSourceInput,i.activeRange,o.refetchResourcesOnNavigate,n);case"PREV":case"NEXT":case"CHANGE_DATE":case"CHANGE_VIEW_TYPE":return function(e,t,n,r){return!n||function(e){return Boolean(Au(e.sourceDefId).ignoreRange)}(e)||e.fetchRange&&vn(e.fetchRange,t)?e:Fu(e,t,r)}(e,i.activeRange,o.refetchResourcesOnNavigate,n);case"RECEIVE_RESOURCES":case"RECEIVE_RESOURCE_ERROR":return function(e,t,n){if(t===e.latestFetchId)return r(r({},e),{isFetching:!1,fetchRange:n});return e}(e,t.fetchId,t.fetchRange);case"REFETCH_RESOURCES":return Fu(e,i.activeRange,n);default:return e}}function Vu(e,t,n,r){if(e){var o=Bu(e);return o=Fu(o,n?t:null,r)}return null}function Fu(e,t,n){var o=Au(e.sourceDefId),i=ae();return o.fetch({resourceSource:e,range:t,context:n},(function(e){n.dispatch({type:"RECEIVE_RESOURCES",fetchId:i,fetchRange:t,rawResources:e.rawResources})}),(function(e){n.dispatch({type:"RECEIVE_RESOURCE_ERROR",fetchId:i,fetchRange:t,error:e})})),r(r({},e),{isFetching:!0,latestFetchId:i})}var ju={id:String,parentId:String,children:Vt,title:String,businessHours:Vt,extendedProps:Vt,eventEditable:Boolean,eventStartEditable:Boolean,eventDurationEditable:Boolean,eventConstraint:Vt,eventOverlap:Boolean,eventAllow:Vt,eventClassNames:Xt,eventBackgroundColor:String,eventBorderColor:String,eventTextColor:String,eventColor:String};function Gu(e,t,n,o){void 0===t&&(t="");var i=zt(e,ju),a=i.refined,s=i.extra,l={id:a.id||"_fc:"+ae(),parentId:a.parentId||t,title:a.title||"",businessHours:a.businessHours?gr(a.businessHours,o):null,ui:Jt({editable:a.eventEditable,startEditable:a.eventStartEditable,durationEditable:a.eventDurationEditable,constraint:a.eventConstraint,overlap:a.eventOverlap,allow:a.eventAllow,classNames:a.eventClassNames,backgroundColor:a.eventBackgroundColor,borderColor:a.eventBorderColor,textColor:a.eventTextColor,color:a.eventColor},o),extendedProps:r(r({},s),a.extendedProps)};if(Object.freeze(l.ui.classNames),Object.freeze(l.extendedProps),n[l.id]);else if(n[l.id]=l,a.children)for(var u=0,c=a.children;u<c.length;u++){Gu(c[u],l.id,n,o)}return l}function qu(e){return 0===e.indexOf("_fc:")?"":e}function Yu(e,t,n,o){if(!e||!t)return{};switch(t.type){case"RECEIVE_RESOURCES":return function(e,t,n,r,o){if(r.latestFetchId===n){for(var i={},a=0,s=t;a<s.length;a++){Gu(s[a],"",i,o)}return i}return e}(e,t.rawResources,t.fetchId,n,o);case"ADD_RESOURCE":return i=e,a=t.resourceHash,r(r({},i),a);case"REMOVE_RESOURCE":return function(e,t){var n=r({},e);for(var o in delete n[t],n)n[o].parentId===t&&(n[o]=r(r({},n[o]),{parentId:""}));return n}(e,t.resourceId);case"SET_RESOURCE_PROP":return function(e,t,n,o){var i,a,s=e[t];return s?r(r({},e),((i={})[t]=r(r({},s),((a={})[n]=o,a)),i)):e}(e,t.resourceId,t.propName,t.propValue);case"SET_RESOURCE_EXTENDED_PROP":return function(e,t,n,o){var i,a,s=e[t];return s?r(r({},e),((i={})[t]=r(r({},s),{extendedProps:r(r({},s.extendedProps),(a={},a[n]=o,a))}),i)):e}(e,t.resourceId,t.propName,t.propValue);default:return e}var i,a}var Zu={resourceId:String,resourceIds:Vt,resourceEditable:Boolean};var Xu=function(){function e(e,t){this._context=e,this._resource=t}return e.prototype.setProp=function(e,t){var n=this._resource;this._context.dispatch({type:"SET_RESOURCE_PROP",resourceId:n.id,propName:e,propValue:t}),this.sync(n)},e.prototype.setExtendedProp=function(e,t){var n=this._resource;this._context.dispatch({type:"SET_RESOURCE_EXTENDED_PROP",resourceId:n.id,propName:e,propValue:t}),this.sync(n)},e.prototype.sync=function(t){var n=this._context,r=t.id;this._resource=n.getCurrentData().resourceStore[r],n.emitter.trigger("resourceChange",{oldResource:new e(n,t),resource:this,revert:function(){var e;n.dispatch({type:"ADD_RESOURCE",resourceHash:(e={},e[r]=t,e)})}})},e.prototype.remove=function(){var e=this._context,t=this._resource,n=t.id;e.dispatch({type:"REMOVE_RESOURCE",resourceId:n}),e.emitter.trigger("resourceRemove",{resource:this,revert:function(){var r;e.dispatch({type:"ADD_RESOURCE",resourceHash:(r={},r[n]=t,r)})}})},e.prototype.getParent=function(){var t=this._context,n=this._resource.parentId;return n?new e(t,t.getCurrentData().resourceSource[n]):null},e.prototype.getChildren=function(){var t=this._resource.id,n=this._context,r=n.getCurrentData().resourceStore,o=[];for(var i in r)r[i].parentId===t&&o.push(new e(n,r[i]));return o},e.prototype.getEvents=function(){var e=this._resource.id,t=this._context,n=t.getCurrentData().eventStore,r=n.defs,o=n.instances,i=[];for(var a in o){var s=o[a],l=r[s.defId];-1!==l.resourceIds.indexOf(e)&&i.push(new Qn(t,l,s))}return i},Object.defineProperty(e.prototype,"id",{get:function(){return qu(this._resource.id)},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"title",{get:function(){return this._resource.title},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"eventConstraint",{get:function(){return this._resource.ui.constraints[0]||null},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"eventOverlap",{get:function(){return this._resource.ui.overlap},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"eventAllow",{get:function(){return this._resource.ui.allows[0]||null},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"eventBackgroundColor",{get:function(){return this._resource.ui.backgroundColor},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"eventBorderColor",{get:function(){return this._resource.ui.borderColor},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"eventTextColor",{get:function(){return this._resource.ui.textColor},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"eventClassNames",{get:function(){return this._resource.ui.classNames},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"extendedProps",{get:function(){return this._resource.extendedProps},enumerable:!1,configurable:!0}),e.prototype.toPlainObject=function(e){void 0===e&&(e={});var t=this._resource,n=t.ui,o=this.id,i={};return o&&(i.id=o),t.title&&(i.title=t.title),e.collapseEventColor&&n.backgroundColor&&n.backgroundColor===n.borderColor?i.eventColor=n.backgroundColor:(n.backgroundColor&&(i.eventBackgroundColor=n.backgroundColor),n.borderColor&&(i.eventBorderColor=n.borderColor)),n.textColor&&(i.eventTextColor=n.textColor),n.classNames.length&&(i.eventClassNames=n.classNames),Object.keys(t.extendedProps).length&&(e.collapseExtendedProps?r(i,t.extendedProps):i.extendedProps=t.extendedProps),i},e.prototype.toJSON=function(){return this.toPlainObject()},e}();$n.prototype.addResource=function(e,t){var n,r=this;void 0===t&&(t=!0);var o,i,a=this.getCurrentData();e instanceof Xu?((n={})[(i=e._resource).id]=i,o=n):i=Gu(e,"",o={},a),this.dispatch({type:"ADD_RESOURCE",resourceHash:o}),t&&this.trigger("_scrollRequest",{resourceId:i.id});var s=new Xu(a,i);return a.emitter.trigger("resourceAdd",{resource:s,revert:function(){r.dispatch({type:"REMOVE_RESOURCE",resourceId:i.id})}}),s},$n.prototype.getResourceById=function(e){e=String(e);var t=this.getCurrentData();if(t.resourceStore){var n=t.resourceStore[e];if(n)return new Xu(t,n)}return null},$n.prototype.getResources=function(){var e=this.getCurrentData(),t=e.resourceStore,n=[];if(t)for(var r in t)n.push(new Xu(e,t[r]));return n},$n.prototype.getTopLevelResources=function(){var e=this.getCurrentData(),t=e.resourceStore,n=[];if(t)for(var r in t)t[r].parentId||n.push(new Xu(e,t[r]));return n},$n.prototype.refetchResources=function(){this.dispatch({type:"REFETCH_RESOURCES"})};var Ku=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.getKeyInfo=function(e){return r({"":{}},e.resourceStore)},t.prototype.getKeysForDateSpan=function(e){return[e.resourceId||""]},t.prototype.getKeysForEventDef=function(e){var t=e.resourceIds;return t.length?t:[""]},t}(Dr);function Ju(e,t){return r(r({},t),{constraints:$u(e,t.constraints)})}function $u(e,t){return t.map((function(t){var n=t.defs;if(n)for(var r in n){var o=n[r].resourceIds;if(o.length&&-1===o.indexOf(e))return!1}return t}))}Qn.prototype.getResources=function(){var e=this._context.calendarApi;return this._def.resourceIds.map((function(t){return e.getResourceById(t)}))},Qn.prototype.setResources=function(e){for(var t=[],n=0,r=e;n<r.length;n++){var o=r[n],i=null;"string"==typeof o?i=o:"number"==typeof o?i=String(o):o instanceof Xu?i=o.id:console.warn("unknown resource type: "+o),i&&t.push(i)}this.mutate({standardProps:{resourceIds:t}})};var Qu={resources:function(e,t){t.getCurrentData().resourceSource._raw!==e&&t.dispatch({type:"RESET_RESOURCE_SOURCE",resourceSourceInput:e})}};var ec=fe("id,title");var tc={initialResources:Vt,resources:Vt,eventResourceEditable:Boolean,refetchResourcesOnNavigate:Boolean,resourceOrder:fe,filterResourcesWithEvents:Boolean,resourceGroupField:String,resourceAreaWidth:Vt,resourceAreaColumns:Vt,resourcesInitiallyExpanded:Boolean,datesAboveResources:Boolean,needsResourceData:Boolean,resourceAreaHeaderClassNames:Vt,resourceAreaHeaderContent:Vt,resourceAreaHeaderDidMount:Vt,resourceAreaHeaderWillUnmount:Vt,resourceGroupLabelClassNames:Vt,resourceGroupLabelContent:Vt,resourceGroupLabelDidMount:Vt,resourceGroupLabelWillUnmount:Vt,resourceLabelClassNames:Vt,resourceLabelContent:Vt,resourceLabelDidMount:Vt,resourceLabelWillUnmount:Vt,resourceLaneClassNames:Vt,resourceLaneContent:Vt,resourceLaneDidMount:Vt,resourceLaneWillUnmount:Vt,resourceGroupLaneClassNames:Vt,resourceGroupLaneContent:Vt,resourceGroupLaneDidMount:Vt,resourceGroupLaneWillUnmount:Vt},nc={resourcesSet:Vt,resourceAdd:Vt,resourceChange:Vt,resourceRemove:Vt};function rc(e){return qr(Qr.Consumer,null,(function(t){var n=t.options,r={resource:new Xu(t,e.resource),date:e.date?t.dateEnv.toDate(e.date):null,view:t.viewApi},o={"data-resource-id":e.resource.id,"data-date":e.date?pt(e.date):void 0};return qr(bo,{hookProps:r,classNames:n.resourceLabelClassNames,content:n.resourceLabelContent,defaultContent:oc,didMount:n.resourceLabelDidMount,willUnmount:n.resourceLabelWillUnmount},(function(t,n,r,i){return e.children(t,n,o,r,i)}))}))}function oc(e){return e.resource.title||e.resource.id}Wu({ignoreRange:!0,parseMeta:function(e){return Array.isArray(e.resources)?e.resources:null},fetch:function(e,t){t({rawResources:e.resourceSource.meta})}}),Wu({parseMeta:function(e){return"function"==typeof e.resources?e.resources:null},fetch:function(e,t,n){var r=e.context.dateEnv,o=e.resourceSource.meta,i=e.range?{start:r.toDate(e.range.start),end:r.toDate(e.range.end),startStr:r.formatIso(e.range.start),endStr:r.formatIso(e.range.end),timeZone:r.timeZone}:{};Lr(o.bind(null,i),(function(e){t({rawResources:e})}),n)}}),Wu({parseMeta:function(e){return e.url?{url:e.url,method:(e.method||"GET").toUpperCase(),extraParams:e.extraParams}:null},fetch:function(e,t,n){var o=e.resourceSource.meta,i=function(e,t,n){var o,i,a,s,l=n.dateEnv,u=n.options,c={};t&&(null==(o=e.startParam)&&(o=u.startParam),null==(i=e.endParam)&&(i=u.endParam),null==(a=e.timeZoneParam)&&(a=u.timeZoneParam),c[o]=l.formatIso(t.start),c[i]=l.formatIso(t.end),"local"!==l.timeZone&&(c[a]=l.timeZone));s="function"==typeof e.extraParams?e.extraParams():e.extraParams||{};return r(c,s),c}(o,e.range,e.context);Ko(o.method,o.url,i,(function(e,n){t({rawResources:e,xhr:n})}),(function(e,t){n({message:e,xhr:t})}))}});var ic=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.buildDateFormat=gt(ac),t}return n(t,e),t.prototype.render=function(){var e=this,t=this.props,n=this.context,r=this.buildDateFormat(n.options.dayHeaderFormat,t.datesRepDistinctDays,t.dates.length);return qr(Ui,{unit:"day"},(function(o,i){return 1===t.dates.length?e.renderResourceRow(t.resources,t.dates[0]):n.options.datesAboveResources?e.renderDayAndResourceRows(t.dates,r,i,t.resources):e.renderResourceAndDayRows(t.resources,t.dates,r,i)}))},t.prototype.renderResourceRow=function(e,t){var n=e.map((function(e){return qr(sc,{key:e.id,resource:e,colSpan:1,date:t})}));return this.buildTr(n,"resources")},t.prototype.renderDayAndResourceRows=function(e,t,n,r){for(var o=[],i=[],a=0,s=e;a<s.length;a++){var l=s[a];o.push(this.renderDateCell(l,t,n,r.length,null,!0));for(var u=0,c=r;u<c.length;u++){var d=c[u];i.push(qr(sc,{key:d.id+":"+l.toISOString(),resource:d,colSpan:1,date:l}))}}return qr(Xr,null,this.buildTr(o,"day"),this.buildTr(i,"resources"))},t.prototype.renderResourceAndDayRows=function(e,t,n,r){for(var o=[],i=[],a=0,s=e;a<s.length;a++){var l=s[a];o.push(qr(sc,{key:l.id,resource:l,colSpan:t.length,isSticky:!0}));for(var u=0,c=t;u<c.length;u++){var d=c[u];i.push(this.renderDateCell(d,n,r,1,l))}}return qr(Xr,null,this.buildTr(o,"day"),this.buildTr(i,"resources"))},t.prototype.renderDateCell=function(e,t,n,r,o,i){var a=this.props,s=o?":"+o.id:"",l=o?{resource:new Xu(this.context,o)}:{},u=o?{"data-resource-id":o.id}:{};return a.datesRepDistinctDays?qr(Wi,{key:e.toISOString()+s,date:e,dateProfile:a.dateProfile,todayRange:n,colCnt:a.dates.length*a.resources.length,dayHeaderFormat:t,colSpan:r,isSticky:i,extraHookProps:l,extraDataAttrs:u}):qr(Ai,{key:e.getUTCDay()+s,dow:e.getUTCDay(),dayHeaderFormat:t,colSpan:r,isSticky:i,extraHookProps:l,extraDataAttrs:u})},t.prototype.buildTr=function(e,t){var n=this.props.renderIntro;return e.length||(e=[qr("td",{key:0}," ")]),qr("tr",{key:t},n&&n(),e)},t}(no);function ac(e,t,n){return e||Hi(t,n)}var sc=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.render=function(){var e=this.props;return qr(rc,{resource:e.resource,date:e.date},(function(t,n,o,i,a){return qr("th",r({ref:t,className:["fc-col-header-cell","fc-resource"].concat(n).join(" "),colSpan:e.colSpan},o),qr("div",{className:"fc-scrollgrid-sync-inner"},qr("span",{className:["fc-col-header-cell-cushion",e.isSticky?"fc-sticky":""].join(" "),ref:i},a)))}))},t}(no),lc=function(){function e(e,t,n){this.dayTableModel=e,this.resources=t,this.context=n,this.resourceIndex=new dc(t),this.rowCnt=e.rowCnt,this.colCnt=e.colCnt*t.length,this.cells=this.buildCells()}return e.prototype.buildCells=function(){for(var e=this.rowCnt,t=this.dayTableModel,n=this.resources,r=[],o=0;o<e;o++){for(var i=[],a=0;a<t.colCnt;a++)for(var s=0;s<n.length;s++){var l=n[s],u={resource:new Xu(this.context,l)},c={"data-resource-id":l.id},d=t.cells[o][a].date;i[this.computeCol(a,s)]={key:l.id+":"+d.toISOString(),date:d,resource:l,extraHookProps:u,extraDataAttrs:c,extraClassNames:["fc-resource"]}}r.push(i)}return r},e}(),uc=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.computeCol=function(e,t){return t*this.dayTableModel.colCnt+e},t.prototype.computeColRanges=function(e,t,n){return[{firstCol:this.computeCol(e,n),lastCol:this.computeCol(t,n),isStart:!0,isEnd:!0}]},t}(lc),cc=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.computeCol=function(e,t){return e*this.resources.length+t},t.prototype.computeColRanges=function(e,t,n){for(var r=[],o=e;o<=t;o++){var i=this.computeCol(o,n);r.push({firstCol:i,lastCol:i,isStart:o===e,isEnd:o===t})}return r},t}(lc),dc=function(e){for(var t={},n=[],r=0;r<e.length;r++){var o=e[r].id;n.push(o),t[o]=r}this.ids=n,this.indicesById=t,this.length=e.length},pc=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.getKeyInfo=function(e){var t=e.resourceDayTableModel,n=Fe(t.resourceIndex.indicesById,(function(e){return t.resources[e]}));return n[""]={},n},t.prototype.getKeysForDateSpan=function(e){return[e.resourceId||""]},t.prototype.getKeysForEventDef=function(e){var t=e.resourceIds;return t.length?t:[""]},t}(Dr),fc=[],hc=function(){function e(){this.joinDateSelection=gt(this.joinSegs),this.joinBusinessHours=gt(this.joinSegs),this.joinFgEvents=gt(this.joinSegs),this.joinBgEvents=gt(this.joinSegs),this.joinEventDrags=gt(this.joinInteractions),this.joinEventResizes=gt(this.joinInteractions)}return e.prototype.joinProps=function(e,t){for(var n=[],r=[],i=[],a=[],s=[],l=[],u="",c=0,d=t.resourceIndex.ids.concat([""]);c<d.length;c++){var p=d[c],f=e[p];n.push(f.dateSelectionSegs),r.push(p?f.businessHourSegs:fc),i.push(p?f.fgEventSegs:fc),a.push(f.bgEventSegs),s.push(f.eventDrag),l.push(f.eventResize),u=u||f.eventSelection}return{dateSelectionSegs:this.joinDateSelection.apply(this,o([t],n)),businessHourSegs:this.joinBusinessHours.apply(this,o([t],r)),fgEventSegs:this.joinFgEvents.apply(this,o([t],i)),bgEventSegs:this.joinBgEvents.apply(this,o([t],a)),eventDrag:this.joinEventDrags.apply(this,o([t],s)),eventResize:this.joinEventResizes.apply(this,o([t],l)),eventSelection:u}},e.prototype.joinSegs=function(e){for(var t=[],n=1;n<arguments.length;n++)t[n-1]=arguments[n];for(var r=e.resources.length,o=[],i=0;i<r;i++){for(var a=0,s=t[i];a<s.length;a++){var l=s[a];o.push.apply(o,this.transformSeg(l,e,i))}for(var u=0,c=t[r];u<c.length;u++){l=c[u];o.push.apply(o,this.transformSeg(l,e,i))}}return o},e.prototype.expandSegs=function(e,t){for(var n=e.resources.length,r=[],o=0;o<n;o++)for(var i=0,a=t;i<a.length;i++){var s=a[i];r.push.apply(r,this.transformSeg(s,e,o))}return r},e.prototype.joinInteractions=function(e){for(var t=[],n=1;n<arguments.length;n++)t[n-1]=arguments[n];for(var o=e.resources.length,i={},a=[],s=!1,l=!1,u=0;u<o;u++){var c=t[u];if(c){s=!0;for(var d=0,p=c.segs;d<p.length;d++){var f=p[d];a.push.apply(a,this.transformSeg(f,e,u))}r(i,c.affectedInstances),l=l||c.isEvent}if(t[o])for(var h=0,g=t[o].segs;h<g.length;h++){f=g[h];a.push.apply(a,this.transformSeg(f,e,u))}}return s?{affectedInstances:i,segs:a,isEvent:l}:null},e}();function gc(e,t){return vc(e,[],t,!1,{},!0).map((function(e){return e.resource}))}function vc(e,t,n,r,o,i){var a=[];return function e(t,n,r,o,i,a,s){for(var l=0;l<t.length;l++){var u=t[l],c=u.group;if(c)if(r){var d=n.length,p=o.length;if(e(u.children,n,r,o.concat(0),i,a,s),d<n.length){var f=n[d];(f.rowSpans=f.rowSpans.slice())[p]=n.length-d}}else{var h=c.spec.field+":"+c.value,g=null!=a[h]?a[h]:s;n.push({id:h,group:c,isExpanded:g}),g&&e(u.children,n,r,o,i+1,a,s)}else if(u.resource){h=u.resource.id,g=null!=a[h]?a[h]:s;n.push({id:h,rowSpans:o,depth:i,isExpanded:g,hasChildren:Boolean(u.children.length),resource:u.resource,resourceFields:u.resourceFields}),g&&e(u.children,n,r,o,i+1,a,s)}}}(function(e,t,n,r){var o=function(e,t){var n={};for(var r in e){var o=e[r];n[r]={resource:o,resourceFields:Sc(o),children:[]}}for(var r in e){if((o=e[r]).parentId){var i=n[o.parentId];i&&yc(n[r],i.children,t)}}return n}(e,r),i=[];for(var a in o){var s=o[a];s.resource.parentId||mc(s,i,n,0,t,r)}return i}(e,r?-1:1,t,n),a,r,[],0,o,i),a}function mc(e,t,n,r,o,i){n.length&&(-1===o||r<=o)?mc(e,function(e,t,n){var r,o,i=e.resourceFields[n.field];if(n.order)for(o=0;o<t.length;o++){if((s=t[o]).group){var a=ve(i,s.group.value)*n.order;if(0===a){r=s;break}if(a<0)break}}else for(o=0;o<t.length;o++){var s;if((s=t[o]).group&&i===s.group.value){r=s;break}}r||(r={group:{value:i,spec:n},children:[]},t.splice(o,0,r));return r}(e,t,n[0]).children,n.slice(1),r+1,o,i):yc(e,t,i)}function yc(e,t,n){var r;for(r=0;r<t.length;r++){if(he(t[r].resourceFields,e.resourceFields,n)>0)break}t.splice(r,0,e)}function Sc(e){var t=r(r(r({},e.extendedProps),e.ui),e);return delete t.ui,delete t.extendedProps,t}function Ec(e,t){return e.spec===t.spec&&e.value===t.value}var Cc=yo({deps:[bl],reducers:[function(e,t,n){var o=zu(e&&e.resourceSource,t,n);return{resourceSource:o,resourceStore:Yu(e&&e.resourceStore,t,o,n),resourceEntityExpansions:function(e,t){var n;if(!e||!t)return{};switch(t.type){case"SET_RESOURCE_ENTITY_EXPANDED":return r(r({},e),((n={})[t.id]=t.isExpanded,n));default:return e}}(e&&e.resourceEntityExpansions,t),loadingLevel:n.loadingLevel+(o&&o.isFetching?1:0)}}],eventRefiners:Zu,eventDefMemberAdders:[function(e){return{resourceIds:(t=e.resourceIds,(t||[]).map((function(e){return String(e)}))).concat(e.resourceId?[e.resourceId]:[]),resourceEditable:e.resourceEditable};var t}],isDraggableTransformers:[function(e,t,n,r){if(!e){var o=r.getCurrentData();if(o.viewSpecs[o.currentViewType].optionDefaults.needsResourceData&&Mu(t,r))return!0}return e}],eventDragMutationMassagers:[function(e,t,n){var r=t.dateSpan.resourceId,o=n.dateSpan.resourceId;r&&o&&r!==o&&(e.resourceMutation={matchResourceId:r,setResourceId:o})}],eventDefMutationAppliers:[function(e,t,n){var r=t.resourceMutation;if(r&&Mu(e,n)){var o=e.resourceIds.indexOf(r.matchResourceId);if(-1!==o){var i=e.resourceIds.slice();i.splice(o,1),-1===i.indexOf(r.setResourceId)&&i.push(r.setResourceId),e.resourceIds=i}}}],dateSelectionTransformers:[function(e,t){var n=e.dateSpan.resourceId,r=t.dateSpan.resourceId;if(n&&r)return(!1!==e.component.allowAcrossResources||n===r)&&{resourceId:n}}],datePointTransforms:[function(e,t){return e.resourceId?{resource:t.calendarApi.getResourceById(e.resourceId)}:{}}],dateSpanTransforms:[function(e,t){return e.resourceId?{resource:t.calendarApi.getResourceById(e.resourceId)}:{}}],viewPropsTransformers:[Pu,Nu],isPropsValid:function(e,t){var n=(new Ku).splitProps(r(r({},e),{resourceStore:t.getCurrentData().resourceStore}));for(var o in n){var i=n[o];if(o&&n[""]&&(i=r(r({},i),{eventStore:Yt(n[""].eventStore,i.eventStore),eventUiBases:r(r({},n[""].eventUiBases),i.eventUiBases)})),!po(i,t,{resourceId:o},Ju.bind(null,o)))return!1}return!0},externalDefTransforms:[function(e){return e.resourceId?{resourceId:e.resourceId}:{}}],eventResizeJoinTransforms:[function(e,t){if(!1===e.component.allowAcrossResources&&e.dateSpan.resourceId!==t.dateSpan.resourceId)return!1}],eventDropTransformers:[function(e,t){var n=e.resourceMutation;if(n){var r=t.calendarApi;return{oldResource:r.getResourceById(n.matchResourceId),newResource:r.getResourceById(n.setResourceId)}}return{oldResource:null,newResource:null}}],optionChangeHandlers:Qu,optionRefiners:tc,listenerRefiners:nc,propSetHandlers:{resourceStore:function(e,t){var n=t.emitter;n.hasHandlers("resourcesSet")&&n.trigger("resourcesSet",function(e,t){var n=[];for(var r in e)n.push(new Xu(t,e[r]));return n}(e,t))}}}),bc=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.allowAcrossResources=!1,t.splitter=new pc,t.slicers={},t.joiner=new Dc,t.tableRef=Zr(),t.handleRootEl=function(e){e?t.context.registerInteractiveComponent(t,{el:e}):t.context.unregisterInteractiveComponent(t)},t}return n(t,e),t.prototype.render=function(){var e=this,t=this.props,n=this.context,o=t.resourceDayTableModel,i=t.nextDayThreshold,a=t.dateProfile,s=this.splitter.splitProps(t);this.slicers=Fe(s,(function(t,n){return e.slicers[n]||new Cs}));var l=Fe(this.slicers,(function(e,t){return e.sliceProps(s[t],a,i,n,o.dayTableModel)}));return this.allowAcrossResources=1===o.dayTableModel.colCnt,qr(ms,r({forPrint:t.forPrint,ref:this.tableRef,elRef:this.handleRootEl},this.joiner.joinProps(l,o),{cells:o.cells,dateProfile:a,colGroupNode:t.colGroupNode,tableMinWidth:t.tableMinWidth,renderRowIntro:t.renderRowIntro,dayMaxEvents:t.dayMaxEvents,dayMaxEventRows:t.dayMaxEventRows,showWeekNumbers:t.showWeekNumbers,expandRows:t.expandRows,headerAlignElRef:t.headerAlignElRef,clientWidth:t.clientWidth,clientHeight:t.clientHeight}))},t.prototype.prepareHits=function(){this.tableRef.current.prepareHits()},t.prototype.queryHit=function(e,t){var n=this.tableRef.current.positionToHit(e,t);if(n)return{component:this,dateSpan:{range:n.dateSpan.range,allDay:n.dateSpan.allDay,resourceId:this.props.resourceDayTableModel.cells[n.row][n.col].resource.id},dayEl:n.dayEl,rect:{left:n.relativeRect.left,right:n.relativeRect.right,top:n.relativeRect.top,bottom:n.relativeRect.bottom},layer:0}},t}(mo),Dc=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.transformSeg=function(e,t,n){return t.computeColRanges(e.firstCol,e.lastCol,n).map((function(t){return r(r(r({},e),t),{isStart:e.isStart&&t.isStart,isEnd:e.isEnd&&t.isEnd})}))},t}(hc),Rc=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.flattenResources=gt(gc),t.buildResourceDayTableModel=gt(wc),t.headerRef=Zr(),t.tableRef=Zr(),t}return n(t,e),t.prototype.render=function(){var e=this,t=this.props,n=this.context,r=n.options,o=r.resourceOrder||ec,i=this.flattenResources(t.resourceStore,o),a=this.buildResourceDayTableModel(t.dateProfile,n.dateProfileGenerator,i,r.datesAboveResources,n),s=r.dayHeaders&&qr(ic,{ref:this.headerRef,resources:i,dateProfile:t.dateProfile,dates:a.dayTableModel.headerDates,datesRepDistinctDays:!0}),l=function(n){return qr(bc,{ref:e.tableRef,dateProfile:t.dateProfile,resourceDayTableModel:a,businessHours:t.businessHours,eventStore:t.eventStore,eventUiBases:t.eventUiBases,dateSelection:t.dateSelection,eventSelection:t.eventSelection,eventDrag:t.eventDrag,eventResize:t.eventResize,nextDayThreshold:r.nextDayThreshold,tableMinWidth:n.tableMinWidth,colGroupNode:n.tableColGroupNode,dayMaxEvents:r.dayMaxEvents,dayMaxEventRows:r.dayMaxEventRows,showWeekNumbers:r.weekNumbers,expandRows:!t.isHeightAuto,headerAlignElRef:e.headerElRef,clientWidth:n.clientWidth,clientHeight:n.clientHeight,forPrint:t.forPrint})};return r.dayMinWidth?this.renderHScrollLayout(s,l,a.colCnt,r.dayMinWidth):this.renderSimpleLayout(s,l)},t}(Ja);function wc(e,t,n,r,o){var i=Ds(e,t);return r?new cc(i,n,o):new uc(i,n,o)}var Tc=yo({deps:[bl,Cc,Rs],initialView:"resourceDayGridDay",views:{resourceDayGrid:{type:"dayGrid",component:Rc,needsResourceData:!0},resourceDayGridDay:{type:"resourceDayGrid",duration:{days:1}},resourceDayGridWeek:{type:"resourceDayGrid",duration:{weeks:1}},resourceDayGridMonth:{type:"resourceDayGrid",duration:{months:1},monthMode:!0,fixedWeekCount:!0}}}),xc=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.allowAcrossResources=!1,t.buildDayRanges=gt(el),t.splitter=new pc,t.slicers={},t.joiner=new kc,t.timeColsRef=Zr(),t.handleRootEl=function(e){e?t.context.registerInteractiveComponent(t,{el:e}):t.context.unregisterInteractiveComponent(t)},t}return n(t,e),t.prototype.render=function(){var e=this,t=this.props,n=this.context,o=n.dateEnv,i=n.options,a=t.dateProfile,s=t.resourceDayTableModel,l=this.dayRanges=this.buildDayRanges(s.dayTableModel,a,o),u=this.splitter.splitProps(t);this.slicers=Fe(u,(function(t,n){return e.slicers[n]||new tl}));var c=Fe(this.slicers,(function(e,t){return e.sliceProps(u[t],a,null,n,l)}));return this.allowAcrossResources=1===l.length,qr(Ui,{unit:i.nowIndicator?"minute":"day"},(function(n,o){return qr(Js,r({ref:e.timeColsRef,rootElRef:e.handleRootEl},e.joiner.joinProps(c,s),{dateProfile:a,axis:t.axis,slotDuration:t.slotDuration,slatMetas:t.slatMetas,cells:s.cells[0],tableColGroupNode:t.tableColGroupNode,tableMinWidth:t.tableMinWidth,clientWidth:t.clientWidth,clientHeight:t.clientHeight,expandRows:t.expandRows,nowDate:n,nowIndicatorSegs:i.nowIndicator&&e.buildNowIndicatorSegs(n),todayRange:o,onScrollTopRequest:t.onScrollTopRequest,forPrint:t.forPrint,onSlatCoords:t.onSlatCoords}))}))},t.prototype.buildNowIndicatorSegs=function(e){var t=this.slicers[""].sliceNowDate(e,this.context,this.dayRanges);return this.joiner.expandSegs(this.props.resourceDayTableModel,t)},t.prototype.queryHit=function(e,t){var n=this.timeColsRef.current.positionToHit(e,t);if(n)return{component:this,dateSpan:{range:n.dateSpan.range,allDay:n.dateSpan.allDay,resourceId:this.props.resourceDayTableModel.cells[0][n.col].resource.id},dayEl:n.dayEl,rect:{left:n.relativeRect.left,right:n.relativeRect.right,top:n.relativeRect.top,bottom:n.relativeRect.bottom},layer:0}},t}(mo),kc=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.transformSeg=function(e,t,n){return[r(r({},e),{col:t.computeCol(e.col,n)})]},t}(hc),Mc=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.flattenResources=gt(gc),t.buildResourceTimeColsModel=gt(Pc),t.buildSlatMetas=gt(_s),t}return n(t,e),t.prototype.render=function(){var e=this,t=this.props,n=this.context,o=n.options,i=n.dateEnv,a=t.dateProfile,s=this.allDaySplitter.splitProps(t),l=o.resourceOrder||ec,u=this.flattenResources(t.resourceStore,l),c=this.buildResourceTimeColsModel(a,n.dateProfileGenerator,u,o.datesAboveResources,n),d=this.buildSlatMetas(a.slotMinTime,a.slotMaxTime,o.slotLabelInterval,o.slotDuration,i),p=o.dayMinWidth,f=!p,h=p,g=o.dayHeaders&&qr(ic,{resources:u,dates:c.dayTableModel.headerDates,dateProfile:a,datesRepDistinctDays:!0,renderIntro:f?this.renderHeadAxis:null}),v=!1!==o.allDaySlot&&function(n){return qr(bc,r({},s.allDay,{dateProfile:a,resourceDayTableModel:c,nextDayThreshold:o.nextDayThreshold,tableMinWidth:n.tableMinWidth,colGroupNode:n.tableColGroupNode,renderRowIntro:f?e.renderTableRowAxis:null,showWeekNumbers:!1,expandRows:!1,headerAlignElRef:e.headerElRef,clientWidth:n.clientWidth,clientHeight:n.clientHeight,forPrint:t.forPrint},e.getAllDayMaxEventProps()))},m=function(n){return qr(xc,r({},s.timed,{dateProfile:a,axis:f,slotDuration:o.slotDuration,slatMetas:d,resourceDayTableModel:c,tableColGroupNode:n.tableColGroupNode,tableMinWidth:n.tableMinWidth,clientWidth:n.clientWidth,clientHeight:n.clientHeight,onSlatCoords:e.handleSlatCoords,expandRows:n.expandRows,forPrint:t.forPrint,onScrollTopRequest:e.handleScrollTopRequest}))};return h?this.renderHScrollLayout(g,v,m,c.colCnt,p,d,this.state.slatCoords):this.renderSimpleLayout(g,v,m)},t}(Os);function Pc(e,t,n,r,o){var i=rl(e,t);return r?new cc(i,n,o):new uc(i,n,o)}var Ic=yo({deps:[bl,Cc,ol],initialView:"resourceTimeGridDay",views:{resourceTimeGrid:{type:"timeGrid",component:Mc,needsResourceData:!0},resourceTimeGridDay:{type:"resourceTimeGrid",duration:{days:1}},resourceTimeGridWeek:{type:"resourceTimeGrid",duration:{weeks:1}}}});function Nc(e){for(var t=e.depth,n=e.hasChildren,r=e.isExpanded,i=e.onExpanderClick,a=[],s=0;s<t;s++)a.push(qr("span",{className:"fc-icon"}));var l=["fc-icon"];return n&&(r?l.push("fc-icon-minus-square"):l.push("fc-icon-plus-square")),a.push(qr("span",{className:"fc-datagrid-expander"+(n?"":" fc-datagrid-expander-placeholder"),onClick:i},qr("span",{className:l.join(" ")}))),qr.apply(void 0,o([Xr,{}],a))}var _c=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.refineHookProps=vt(Wc),t.normalizeClassNames=To(),t.onExpanderClick=function(e){var n=t.props;n.hasChildren&&t.context.dispatch({type:"SET_RESOURCE_ENTITY_EXPANDED",id:n.resource.id,isExpanded:!n.isExpanded})},t}return n(t,e),t.prototype.render=function(){var e=this,t=this.props,n=this.context,r=t.colSpec,o=this.refineHookProps({resource:t.resource,fieldValue:t.fieldValue,context:n}),i=this.normalizeClassNames(r.cellClassNames,o);return qr(wo,{hookProps:o,didMount:r.cellDidMount,willUnmount:r.cellWillUnmount},(function(n){return qr("td",{className:["fc-datagrid-cell","fc-resource"].concat(i).join(" "),"data-resource-id":t.resource.id,ref:n},qr("div",{className:"fc-datagrid-cell-frame",style:{height:t.innerHeight}},qr("div",{className:"fc-datagrid-cell-cushion fc-scrollgrid-sync-inner"},r.isMain&&qr(Nc,{depth:t.depth,hasChildren:t.hasChildren,isExpanded:t.isExpanded,onExpanderClick:e.onExpanderClick}),qr(Hc,{hookProps:o,colSpec:r}))))}))},t}(no),Hc=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.render=function(){var e=this.props;return qr(Ro,{hookProps:e.hookProps,content:e.colSpec.cellContent,defaultContent:Oc},(function(e,t){return qr("span",{className:"fc-datagrid-cell-main",ref:e},t)}))},t}(no);function Oc(e){return e.fieldValue||qr(Xr,null," ")}function Wc(e){return{resource:new Xu(e.context,e.resource),fieldValue:e.fieldValue,view:e.context.viewApi}}var Ac=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.render=function(){var e=this.props,t=this.context,n=e.colSpec,r={groupValue:e.fieldValue,view:t.viewApi};return qr(bo,{hookProps:r,classNames:n.cellClassNames,content:n.cellContent,defaultContent:Lc,didMount:n.cellDidMount,willUnmount:n.cellWillUnmount},(function(t,n,r,o){return qr("td",{className:["fc-datagrid-cell","fc-resource-group"].concat(n).join(" "),rowSpan:e.rowSpan,ref:t},qr("div",{className:"fc-datagrid-cell-frame fc-datagrid-cell-frame-liquid"}," ",qr("div",{className:"fc-datagrid-cell-cushion fc-sticky",ref:r},o)))}))},t}(no);function Lc(e){return e.groupValue||qr(Xr,null," ")}var Uc=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.render=function(){var e=this.props,t=e.resource,n=e.rowSpans,r=e.depth,o=Sc(t);return qr("tr",null,e.colSpecs.map((function(i,a){var s=n[a];if(0!==s){null==s&&(s=1);var l=i.field?o[i.field]:t.title||qu(t.id);return s>1?qr(Ac,{key:a,colSpec:i,fieldValue:l,rowSpan:s}):qr(_c,{key:a,colSpec:i,resource:t,fieldValue:l,depth:r,hasChildren:e.hasChildren,isExpanded:e.isExpanded,innerHeight:e.innerHeight})}})))},t}(no);Uc.addPropsEquality({rowSpans:B});var Bc=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.innerInnerRef=Zr(),t.onExpanderClick=function(){var e=t.props;t.context.dispatch({type:"SET_RESOURCE_ENTITY_EXPANDED",id:e.id,isExpanded:!e.isExpanded})},t}return n(t,e),t.prototype.render=function(){var e=this,t=this.props,n=this.context,r={groupValue:t.group.value,view:n.viewApi},o=t.group.spec;return qr("tr",null,qr(bo,{hookProps:r,classNames:o.labelClassNames,content:o.labelContent,defaultContent:zc,didMount:o.labelDidMount,willUnmount:o.labelWillUnmount},(function(r,o,i,a){return qr("td",{className:["fc-datagrid-cell","fc-resource-group",n.theme.getClass("tableCellShaded")].concat(o).join(" "),colSpan:t.spreadsheetColCnt,ref:r},qr("div",{className:"fc-datagrid-cell-frame",style:{height:t.innerHeight}},qr("div",{className:"fc-datagrid-cell-cushion fc-scrollgrid-sync-inner",ref:e.innerInnerRef},qr(Nc,{depth:0,hasChildren:!0,isExpanded:t.isExpanded,onExpanderClick:e.onExpanderClick}),qr("span",{className:"fc-datagrid-cell-main",ref:i},a))))})))},t}(no);function zc(e){return e.groupValue||qr(Xr,null," ")}Bc.addPropsEquality({group:Ec});var Vc=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.resizerElRefs=new Xi(t._handleColResizerEl.bind(t)),t.colDraggings={},t}return n(t,e),t.prototype.render=function(){var e=this,t=this.props,n=t.colSpecs,r=t.superHeaderRendering,o=t.rowInnerHeights,i={view:this.context.viewApi},a=[];if(o=o.slice(),r){var s=o.shift();a.push(qr("tr",{key:"row-super"},qr(bo,{hookProps:i,classNames:r.headerClassNames,content:r.headerContent,didMount:r.headerDidMount,willUnmount:r.headerWillUnmount},(function(e,t,r,o){return qr("th",{colSpan:n.length,className:["fc-datagrid-cell","fc-datagrid-cell-super"].concat(t).join(" "),ref:e},qr("div",{className:"fc-datagrid-cell-frame",style:{height:s}},qr("div",{className:"fc-datagrid-cell-cushion fc-scrollgrid-sync-inner",ref:r},o)))}))))}var l=o.shift();return a.push(qr("tr",{key:"row"},n.map((function(t,r){var o=r===n.length-1;return qr(bo,{key:r,hookProps:i,classNames:t.headerClassNames,content:t.headerContent,didMount:t.headerDidMount,willUnmount:t.headerWillUnmount},(function(n,i,a,s){return qr("th",{ref:n,className:["fc-datagrid-cell"].concat(i).join(" ")},qr("div",{className:"fc-datagrid-cell-frame",style:{height:l}},qr("div",{className:"fc-datagrid-cell-cushion fc-scrollgrid-sync-inner"},t.isMain&&qr("span",{className:"fc-datagrid-expander fc-datagrid-expander-placeholder"},qr("span",{className:"fc-icon"})),qr("span",{className:"fc-datagrid-cell-main",ref:a},s)),!o&&qr("div",{className:"fc-datagrid-cell-resizer",ref:e.resizerElRefs.createRef(r)})))}))})))),qr(Xr,null,a)},t.prototype._handleColResizerEl=function(e,t){var n,r=this.colDraggings;e?(n=this.initColResizing(e,parseInt(t,10)))&&(r[t]=n):(n=r[t])&&(n.destroy(),delete r[t])},t.prototype.initColResizing=function(e,t){var n=this.context,r=n.pluginHooks,o=n.isRtl,i=this.props.onColWidthChange,a=r.elementDraggingImpl;if(a){var s,l,u=new a(e);return u.emitter.on("dragstart",(function(){var n=X(Y(e,"tr"),"th");l=n.map((function(e){return Y(e,"th").getBoundingClientRect().width})),s=l[t]})),u.emitter.on("dragmove",(function(e){l[t]=Math.max(s+e.deltaX*(o?-1:1),20),i&&i(l.slice())})),u.setAutoScrollEnabled(!1),u}},t}(no),Fc=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.refineHookProps=vt(Gc),t.normalizeClassNames=To(),t.handleHeightChange=function(e,n){t.props.onHeightChange&&t.props.onHeightChange(Y(e,"tr"),n)},t}return n(t,e),t.prototype.render=function(){var e=this,t=this.props,n=this.context,r=n.options,o=this.refineHookProps({resource:t.resource,context:n}),i=this.normalizeClassNames(r.resourceLaneClassNames,o);return qr("tr",{ref:t.elRef},qr(wo,{hookProps:o,didMount:r.resourceLaneDidMount,willUnmount:r.resourceLaneWillUnmount},(function(n){return qr("td",{ref:n,className:["fc-timeline-lane","fc-resource"].concat(i).join(" "),"data-resource-id":t.resource.id},qr("div",{className:"fc-timeline-lane-frame",style:{height:t.innerHeight}},qr(jc,{resource:t.resource}),qr(Ru,{dateProfile:t.dateProfile,tDateProfile:t.tDateProfile,nowDate:t.nowDate,todayRange:t.todayRange,nextDayThreshold:t.nextDayThreshold,businessHours:t.businessHours,eventStore:t.eventStore,eventUiBases:t.eventUiBases,dateSelection:t.dateSelection,eventSelection:t.eventSelection,eventDrag:t.eventDrag,eventResize:t.eventResize,timelineCoords:t.timelineCoords,onHeightChange:e.handleHeightChange})))})))},t}(no),jc=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.render=function(){var e=this.props,t=this.context,n={resource:new Xu(t,e.resource)};return qr(Ro,{hookProps:n,content:t.options.resourceLaneContent},(function(e,t){return t&&qr("div",{className:"fc-timeline-lane-misc",ref:e},t)}))},t}(no);function Gc(e){return{resource:new Xu(e.context,e.resource)}}var qc=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.render=function(){var e=this,t=this.props,n=this.props.renderingHooks,r={groupValue:t.groupValue,view:this.context.viewApi};return qr("tr",{ref:t.elRef},qr(bo,{hookProps:r,classNames:n.laneClassNames,content:n.laneContent,didMount:n.laneDidMount,willUnmount:n.laneWillUnmount},(function(n,r,o,i){return qr("td",{className:["fc-timeline-lane","fc-resource-group",e.context.theme.getClass("tableCellShaded")].concat(r).join(" "),ref:n},qr("div",{style:{height:t.innerHeight},ref:o},i))})))},t}(no),Yc=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.rootElRef=Zr(),t.rowElRefs=new Xi,t}return n(t,e),t.prototype.render=function(){var e=this.props,t=this.context;return qr("table",{ref:this.rootElRef,className:"fc-scrollgrid-sync-table "+t.theme.getClass("table"),style:{minWidth:e.tableMinWidth,width:e.clientWidth,height:e.minHeight}},qr(Zc,{rowElRefs:this.rowElRefs,rowNodes:e.rowNodes,dateProfile:e.dateProfile,tDateProfile:e.tDateProfile,nowDate:e.nowDate,todayRange:e.todayRange,splitProps:e.splitProps,fallbackBusinessHours:e.fallbackBusinessHours,slatCoords:e.slatCoords,innerHeights:e.innerHeights,onRowHeightChange:e.onRowHeightChange}))},t.prototype.componentDidMount=function(){this.updateCoords()},t.prototype.componentDidUpdate=function(){this.updateCoords()},t.prototype.componentWillUnmount=function(){this.props.onRowCoords&&this.props.onRowCoords(null)},t.prototype.updateCoords=function(){var e,t=this.props;t.onRowCoords&&null!==t.clientWidth&&this.props.onRowCoords(new Br(this.rootElRef.current,(e=this.rowElRefs.currentMap,t.rowNodes.map((function(t){return e[t.id]}))),!1,!0))},t}(no);var Zc=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.render=function(){var e=this.props,t=this.context,n=e.rowElRefs,o=e.innerHeights;return qr("tbody",null,e.rowNodes.map((function(i,a){if(i.group)return qr(qc,{key:i.id,elRef:n.createRef(i.id),groupValue:i.group.value,renderingHooks:i.group.spec,innerHeight:o[a]||""});if(i.resource){var s=i.resource;return qr(Fc,r({key:i.id,elRef:n.createRef(i.id)},e.splitProps[s.id],{resource:s,dateProfile:e.dateProfile,tDateProfile:e.tDateProfile,nowDate:e.nowDate,todayRange:e.todayRange,nextDayThreshold:t.options.nextDayThreshold,businessHours:s.businessHours||e.fallbackBusinessHours,innerHeight:o[a]||"",timelineCoords:e.slatCoords,onHeightChange:e.onRowHeightChange}))}})))},t}(no),Xc=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.computeHasResourceBusinessHours=gt(Kc),t.resourceSplitter=new Ku,t.bgSlicer=new Su,t.slatsRef=Zr(),t.state={slatCoords:null},t.handleEl=function(e){e?t.context.registerInteractiveComponent(t,{el:e}):t.context.unregisterInteractiveComponent(t)},t.handleSlatCoords=function(e){t.setState({slatCoords:e}),t.props.onSlatCoords&&t.props.onSlatCoords(e)},t.handleRowCoords=function(e){t.rowCoords=e,t.props.onRowCoords&&t.props.onRowCoords(e)},t}return n(t,e),t.prototype.render=function(){var e=this,t=this.props,n=this.state,r=this.context,o=t.dateProfile,i=t.tDateProfile,a=dt(i.slotDuration).unit,s=this.computeHasResourceBusinessHours(t.rowNodes),l=this.resourceSplitter.splitProps(t),u=l[""],c=this.bgSlicer.sliceProps(u,o,i.isTimeScale?null:t.nextDayThreshold,r,o,r.dateProfileGenerator,i,r.dateEnv);return qr("div",{ref:this.handleEl,className:"fc-timeline-body",style:{minWidth:t.tableMinWidth}},qr(Ui,{unit:a},(function(a,u){return qr(Xr,null,qr(vu,{ref:e.slatsRef,dateProfile:o,tDateProfile:i,nowDate:a,todayRange:u,clientWidth:t.clientWidth,tableColGroupNode:t.tableColGroupNode,tableMinWidth:t.tableMinWidth,onCoords:e.handleSlatCoords,onScrollLeftRequest:t.onScrollLeftRequest}),qr(yu,{businessHourSegs:s?null:c.businessHourSegs,bgEventSegs:c.bgEventSegs,timelineCoords:n.slatCoords,eventResizeSegs:c.eventResize?c.eventResize.segs:[],dateSelectionSegs:c.dateSelectionSegs,nowDate:a,todayRange:u}),qr(Yc,{rowNodes:t.rowNodes,dateProfile:o,tDateProfile:t.tDateProfile,nowDate:a,todayRange:u,splitProps:l,fallbackBusinessHours:s?t.businessHours:null,clientWidth:t.clientWidth,minHeight:t.expandRows?t.clientHeight:"",tableMinWidth:t.tableMinWidth,innerHeights:t.rowInnerHeights,slatCoords:n.slatCoords,onRowCoords:e.handleRowCoords,onRowHeightChange:t.onRowHeightChange}),r.options.nowIndicator&&n.slatCoords&&n.slatCoords.isDateInRange(a)&&qr(fa,{isAxis:!1,date:a},(function(e,t,r,o){return qr("div",{ref:e,className:["fc-timeline-now-indicator-line"].concat(t).join(" "),style:{left:n.slatCoords.dateToCoord(a)}},o)})))})))},t.prototype.queryHit=function(e,t){var n=this.rowCoords,r=n.topToIndex(t);if(null!=r){var o=this.props.rowNodes[r].resource;if(o){var i=this.slatsRef.current.positionToHit(e);if(i)return{component:this,dateSpan:{range:i.dateSpan.range,allDay:i.dateSpan.allDay,resourceId:o.id},rect:{left:i.left,right:i.right,top:n.tops[r],bottom:n.bottoms[r]},dayEl:i.dayEl,layer:0}}}},t}(mo);function Kc(e){for(var t=0,n=e;t<n.length;t++){var r=n[t].resource;if(r&&r.businessHours)return!0}return!1}var Jc=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.scrollGridRef=Zr(),t.timeBodyScrollerElRef=Zr(),t.spreadsheetHeaderChunkElRef=Zr(),t.rootElRef=Zr(),t.state={resourceAreaWidthOverride:null},t}return n(t,e),t.prototype.render=function(){var e=this.props,t=this.state,n=this.context,r=n.options,o=!e.forPrint&&sa(r),i=!e.forPrint&&la(r),a=[{type:"header",key:"header",syncRowHeights:!0,isSticky:o,chunks:[{key:"datagrid",elRef:this.spreadsheetHeaderChunkElRef,tableClassName:"fc-datagrid-header",rowContent:e.spreadsheetHeaderRows},{key:"divider",outerContent:qr("td",{className:"fc-resource-timeline-divider "+n.theme.getClass("tableCellShaded")})},{key:"timeline",content:e.timeHeaderContent}]},{type:"body",key:"body",syncRowHeights:!0,liquid:!0,expandRows:Boolean(r.expandRows),chunks:[{key:"datagrid",tableClassName:"fc-datagrid-body",rowContent:e.spreadsheetBodyRows},{key:"divider",outerContent:qr("td",{className:"fc-resource-timeline-divider "+n.theme.getClass("tableCellShaded")})},{key:"timeline",scrollerElRef:this.timeBodyScrollerElRef,content:e.timeBodyContent}]}];i&&a.push({type:"footer",key:"footer",isSticky:!0,chunks:[{key:"datagrid",content:aa},{key:"divider",outerContent:qr("td",{className:"fc-resource-timeline-divider "+n.theme.getClass("tableCellShaded")})},{key:"timeline",content:aa}]});var s=null!=t.resourceAreaWidthOverride?t.resourceAreaWidthOverride:r.resourceAreaWidth;return qr(Hl,{ref:this.scrollGridRef,elRef:this.rootElRef,liquid:!e.isHeightAuto&&!e.forPrint,colGroups:[{cols:e.spreadsheetCols,width:s},{cols:[]},{cols:e.timeCols}],sections:a})},t.prototype.forceTimeScroll=function(e){this.scrollGridRef.current.forceScrollLeft(2,e)},t.prototype.forceResourceScroll=function(e){this.scrollGridRef.current.forceScrollTop(1,e)},t.prototype.getResourceScroll=function(){return this.timeBodyScrollerElRef.current.scrollTop},t.prototype.componentDidMount=function(){this.initSpreadsheetResizing()},t.prototype.componentWillUnmount=function(){this.destroySpreadsheetResizing()},t.prototype.initSpreadsheetResizing=function(){var e=this,t=this.context,n=t.isRtl,r=t.pluginHooks.elementDraggingImpl,o=this.spreadsheetHeaderChunkElRef.current;if(r){var i,a,s=this.rootElRef.current,l=this.spreadsheetResizerDragging=new r(s,".fc-resource-timeline-divider");l.emitter.on("dragstart",(function(){i=o.getBoundingClientRect().width,a=s.getBoundingClientRect().width})),l.emitter.on("dragmove",(function(t){var r=i+t.deltaX*(n?-1:1);r=Math.max(r,30),r=Math.min(r,a-30),e.setState({resourceAreaWidthOverride:r})})),l.setAutoScrollEnabled(!1)}},t.prototype.destroySpreadsheetResizing=function(){this.spreadsheetResizerDragging&&this.spreadsheetResizerDragging.destroy()},t}(no),$c=function(e){function t(t,n){var r=e.call(this,t,n)||this;return r.processColOptions=gt(nd),r.buildTimelineDateProfile=gt(tu),r.hasNesting=gt(td),r.buildRowNodes=gt(vc),r.layoutRef=Zr(),r.rowNodes=[],r.renderedRowNodes=[],r.buildRowIndex=gt(Qc),r.handleSlatCoords=function(e){r.setState({slatCoords:e})},r.handleRowCoords=function(e){r.rowCoords=e,r.scrollResponder.update(!1)},r.handleMaxCushionWidth=function(e){r.setState({slotCushionMaxWidth:Math.ceil(e)})},r.handleScrollLeftRequest=function(e){r.layoutRef.current.forceTimeScroll(e)},r.handleScrollRequest=function(e){var t=r.rowCoords,n=r.layoutRef.current,o=e.rowId||e.resourceId;if(t){if(o){var i=r.buildRowIndex(r.renderedRowNodes)[o];if(null!=i){var a=null!=e.fromBottom?t.bottoms[i]-e.fromBottom:t.tops[i];n.forceResourceScroll(a)}}return!0}},r.handleColWidthChange=function(e){r.setState({spreadsheetColWidths:e})},r.state={resourceAreaWidth:n.options.resourceAreaWidth,spreadsheetColWidths:[]},r}return n(t,e),t.prototype.render=function(){var e=this,t=this.props,n=this.state,r=this.context,o=r.options,i=r.viewSpec,a=this.processColOptions(r.options),s=a.superHeaderRendering,l=a.groupSpecs,u=a.orderSpecs,c=a.isVGrouping,d=a.colSpecs,p=this.buildTimelineDateProfile(t.dateProfile,r.dateEnv,o,r.dateProfileGenerator),f=this.rowNodes=this.buildRowNodes(t.resourceStore,l,u,c,t.resourceEntityExpansions,o.resourcesInitiallyExpanded),h=["fc-resource-timeline",this.hasNesting(f)?"":"fc-resource-timeline-flat","fc-timeline",!1===o.eventOverlap?"fc-timeline-overlap-disabled":"fc-timeline-overlap-enabled"],g=o.slotMinWidth,v=xu(p,g||this.computeFallbackSlotMinWidth(p));return qr(Mo,{viewSpec:i},(function(o,i){return qr("div",{ref:o,className:h.concat(i).join(" ")},qr(Jc,{ref:e.layoutRef,forPrint:t.forPrint,isHeightAuto:t.isHeightAuto,spreadsheetCols:ed(d,n.spreadsheetColWidths,""),spreadsheetHeaderRows:function(t){return qr(Vc,{superHeaderRendering:s,colSpecs:d,onColWidthChange:e.handleColWidthChange,rowInnerHeights:t.rowSyncHeights})},spreadsheetBodyRows:function(t){return qr(Xr,null,e.renderSpreadsheetRows(f,d,t.rowSyncHeights))},timeCols:v,timeHeaderContent:function(r){return qr(pu,{clientWidth:r.clientWidth,clientHeight:r.clientHeight,tableMinWidth:r.tableMinWidth,tableColGroupNode:r.tableColGroupNode,dateProfile:t.dateProfile,tDateProfile:p,slatCoords:n.slatCoords,rowInnerHeights:r.rowSyncHeights,onMaxCushionWidth:g?null:e.handleMaxCushionWidth})},timeBodyContent:function(n){return qr(Xc,{dateProfile:t.dateProfile,clientWidth:n.clientWidth,clientHeight:n.clientHeight,tableMinWidth:n.tableMinWidth,tableColGroupNode:n.tableColGroupNode,expandRows:n.expandRows,tDateProfile:p,rowNodes:f,businessHours:t.businessHours,dateSelection:t.dateSelection,eventStore:t.eventStore,eventUiBases:t.eventUiBases,eventSelection:t.eventSelection,eventDrag:t.eventDrag,eventResize:t.eventResize,resourceStore:t.resourceStore,nextDayThreshold:r.options.nextDayThreshold,rowInnerHeights:n.rowSyncHeights,onSlatCoords:e.handleSlatCoords,onRowCoords:e.handleRowCoords,onScrollLeftRequest:e.handleScrollLeftRequest,onRowHeightChange:n.reportRowHeightChange})}}))}))},t.prototype.renderSpreadsheetRows=function(e,t,n){return e.map((function(e,r){return e.group?qr(Bc,{key:e.id,id:e.id,spreadsheetColCnt:t.length,isExpanded:e.isExpanded,group:e.group,innerHeight:n[r]||""}):e.resource?qr(Uc,{key:e.id,colSpecs:t,rowSpans:e.rowSpans,depth:e.depth,isExpanded:e.isExpanded,hasChildren:e.hasChildren,resource:e.resource,innerHeight:n[r]||""}):void 0}))},t.prototype.componentDidMount=function(){this.renderedRowNodes=this.rowNodes,this.scrollResponder=this.context.createScrollResponder(this.handleScrollRequest)},t.prototype.getSnapshotBeforeUpdate=function(){return this.props.forPrint?{}:{resourceScroll:this.queryResourceScroll()}},t.prototype.componentDidUpdate=function(e,t,n){this.renderedRowNodes=this.rowNodes,this.scrollResponder.update(e.dateProfile!==this.props.dateProfile),n.resourceScroll&&this.handleScrollRequest(n.resourceScroll)},t.prototype.componentWillUnmount=function(){this.scrollResponder.detach()},t.prototype.computeFallbackSlotMinWidth=function(e){return Math.max(30,(this.state.slotCushionMaxWidth||0)/e.slotsPerLabel)},t.prototype.queryResourceScroll=function(){var e=this.rowCoords,t=this.renderedRowNodes;if(e){for(var n=this.layoutRef.current,r=e.bottoms,o=n.getResourceScroll(),i={},a=0;a<r.length;a++){var s=t[a],l=r[a]-o;if(l>0){i.rowId=s.id,i.fromBottom=l;break}}return i}},t}(no);function Qc(e){for(var t={},n=0;n<e.length;n++)t[e[n].id]=n;return t}function ed(e,t,n){return void 0===n&&(n=""),e.map((function(e,r){return{className:e.isMain?"fc-main-col":"",width:t[r]||e.width||n}}))}function td(e){for(var t=0,n=e;t<n.length;t++){var r=n[t];if(r.group)return!0;if(r.resource&&r.hasChildren)return!0}return!1}function nd(e){var t=e.resourceAreaColumns||[],n=null;t.length?e.resourceAreaHeaderContent&&(n={headerClassNames:e.resourceAreaHeaderClassNames,headerContent:e.resourceAreaHeaderContent,headerDidMount:e.resourceAreaHeaderDidMount,headerWillUnmount:e.resourceAreaHeaderWillUnmount}):t.push({headerClassNames:e.resourceAreaHeaderClassNames,headerContent:e.resourceAreaHeaderContent||"Resources",headerDidMount:e.resourceAreaHeaderDidMount,headerWillUnmount:e.resourceAreaHeaderWillUnmount});for(var o=[],i=[],a=[],s=!1,l=0,u=t;l<u.length;l++){var c=u[l];c.group?i.push(r(r({},c),{cellClassNames:c.cellClassNames||e.resourceGroupLabelClassNames,cellContent:c.cellContent||e.resourceGroupLabelContent,cellDidMount:c.cellDidMount||e.resourceGroupLabelDidMount,cellWillUnmount:c.cellWillUnmount||e.resourceGroupLaneWillUnmount})):o.push(c)}var d=o[0];if(d.isMain=!0,d.cellClassNames=d.cellClassNames||e.resourceLabelClassNames,d.cellContent=d.cellContent||e.resourceLabelContent,d.cellDidMount=d.cellDidMount||e.resourceLabelDidMount,d.cellWillUnmount=d.cellWillUnmount||e.resourceLabelWillUnmount,i.length)a=i,s=!0;else{var p=e.resourceGroupField;p&&a.push({field:p,labelClassNames:e.resourceGroupLabelClassNames,labelContent:e.resourceGroupLabelContent,labelDidMount:e.resourceGroupLabelDidMount,labelWillUnmount:e.resourceGroupLabelWillUnmount,laneClassNames:e.resourceGroupLaneClassNames,laneContent:e.resourceGroupLaneContent,laneDidMount:e.resourceGroupLaneDidMount,laneWillUnmount:e.resourceGroupLaneWillUnmount})}for(var f=[],h=0,g=e.resourceOrder||ec;h<g.length;h++){for(var v=g[h],m=!1,y=0,S=a;y<S.length;y++){var E=S[y];if(E.field===v.field){E.order=v.order,m=!0;break}}m||f.push(v)}return{superHeaderRendering:n,isVGrouping:s,groupSpecs:a,colSpecs:i.concat(o),orderSpecs:f}}$c.addStateEquality({spreadsheetColWidths:B});var rd=yo({deps:[bl,Cc,ku],initialView:"resourceTimelineDay",views:{resourceTimeline:{type:"timeline",component:$c,needsResourceData:!0,resourceAreaWidth:"30%",resourcesInitiallyExpanded:!0,eventResizableFromStart:!0},resourceTimelineDay:{type:"resourceTimeline",duration:{days:1}},resourceTimelineWeek:{type:"resourceTimeline",duration:{weeks:1}},resourceTimelineMonth:{type:"resourceTimeline",duration:{months:1}},resourceTimelineYear:{type:"resourceTimeline",duration:{years:1}}}});return Qo.push(Ka,Rs,ol,gl,ml,yl,ql,Xl,ku,Cc,Tc,Ic,rd),e.AbstractResourceDayTableModel=lc,e.BASE_OPTION_DEFAULTS=Ht,e.BASE_OPTION_REFINERS=_t,e.BaseComponent=no,e.BgEvent=Sa,e.BootstrapTheme=vl,e.Calendar=Da,e.CalendarApi=$n,e.CalendarContent=Mi,e.CalendarDataManager=ri,e.CalendarDataProvider=fi,e.CalendarRoot=_i,e.Component=Gr,e.ContentHook=Ro,e.CustomContentRenderContext=Do,e.DEFAULT_RESOURCE_ORDER=ec,e.DateComponent=mo,e.DateEnv=sr,e.DateProfileGenerator=Ho,e.DayCellContent=va,e.DayCellRoot=ga,e.DayGridView=bs,e.DayHeader=zi,e.DayResourceTableModel=cc,e.DaySeriesModel=Fi,e.DayTable=Es,e.DayTableModel=ji,e.DayTableSlicer=Cs,e.DayTimeCols=Qs,e.DayTimeColsSlicer=tl,e.DayTimeColsView=nl,e.DelayedRunner=ei,e.Draggable=Ya,e.ElementDragging=Si,e.ElementScrollController=Vr,e.Emitter=Ur,e.EventApi=Qn,e.EventRoot=ca,e.EventSourceApi=L,e.FeaturefulElementDragging=Oa,e.Fragment=Xr,e.Interaction=gi,e.ListView=dl,e.MountHook=wo,e.NamedTimeZoneImpl=hi,e.NowIndicatorRoot=fa,e.NowTimer=Ui,e.PointerDragging=xa,e.PositionCache=Br,e.RefMap=Xi,e.RenderHook=bo,e.ResourceApi=Xu,e.ResourceDayHeader=ic,e.ResourceDayTable=bc,e.ResourceDayTableModel=uc,e.ResourceDayTableView=Rc,e.ResourceDayTimeCols=xc,e.ResourceDayTimeColsView=Mc,e.ResourceLabelRoot=rc,e.ResourceSplitter=Ku,e.ResourceTimelineLane=Fc,e.ResourceTimelineView=$c,e.ScrollController=zr,e.ScrollGrid=Hl,e.ScrollResponder=$r,e.Scroller=Zi,e.SimpleScrollGrid=ua,e.Slicer=Gi,e.Splitter=Dr,e.SpreadsheetRow=Uc,e.StandardEvent=da,e.Table=ms,e.TableDateCell=Wi,e.TableDowCell=Ai,e.TableView=Ja,e.Theme=jr,e.ThirdPartyDraggable=Xa,e.TimeCols=Js,e.TimeColsSlatsCoords=Ts,e.TimeColsView=Os,e.TimelineCoords=hu,e.TimelineHeader=pu,e.TimelineHeaderRows=du,e.TimelineLane=Ru,e.TimelineLaneBg=yu,e.TimelineLaneSlicer=Su,e.TimelineSlats=vu,e.TimelineView=Tu,e.VResourceJoiner=hc,e.VResourceSplitter=pc,e.ViewApi=Yn,e.ViewContextType=Qr,e.ViewRoot=Mo,e.WeekNumberRoot=Ca,e.WindowScrollController=Fr,e.addDays=De,e.addDurations=ot,e.addMs=Re,e.addWeeks=be,e.allowContextMenu=pe,e.allowSelection=ce,e.applyMutationToEventStore=jn,e.applyStyle=$,e.applyStyleProp=Q,e.asRoughMinutes=st,e.asRoughMs=ut,e.asRoughSeconds=lt,e.buildClassNameNormalizer=To,e.buildDayRanges=el,e.buildDayTableModel=Ds,e.buildEventApis=tr,e.buildEventRangeKey=Hn,e.buildHashFromArray=function(e,t){for(var n={},r=0;r<e.length;r++){var o=t(e[r],r);n[o[0]]=o[1]}return n},e.buildNavLinkData=kr,e.buildResourceFields=Sc,e.buildRowNodes=vc,e.buildSegCompareObj=xn,e.buildSegTimeText=In,e.buildSlatCols=xu,e.buildSlatMetas=_s,e.buildTimeColsModel=rl,e.buildTimelineDateProfile=tu,e.collectFromHash=Ke,e.combineEventUis=$t,e.compareByFieldSpec=ge,e.compareByFieldSpecs=he,e.compareNumbers=ye,e.compareObjs=Ze,e.computeEdges=Hr,e.computeFallbackHeaderFormat=Hi,e.computeHeightAndMargins=function(e){return e.getBoundingClientRect().height+function(e){var t=window.getComputedStyle(e);return parseInt(t.marginTop,10)+parseInt(t.marginBottom,10)}(e)},e.computeInnerRect=Or,e.computeRect=Wr,e.computeSegDraggable=kn,e.computeSegEndResizable=Pn,e.computeSegStartResizable=Mn,e.computeShrinkWidth=Ki,e.computeSmallestCellWidth=Ee,e.computeVisibleDayRange=cn,e.config=Ei,e.constrainPoint=Sr,e.createContext=Kr,e.createDuration=tt,e.createElement=qr,e.createEmptyEventStore=qt,e.createEventInstance=Ue,e.createEventUi=Jt,e.createFormatter=Nt,e.createPlugin=yo,e.createRef=Zr,e.diffDates=pn,e.diffDayAndTime=xe,e.diffDays=Te,e.diffPoints=Cr,e.diffWeeks=we,e.diffWholeDays=Me,e.diffWholeWeeks=ke,e.disableCursor=se,e.elementClosest=Y,e.elementMatches=Z,e.enableCursor=le,e.eventTupleToStore=jt,e.filterEventStoreDefs=Zt,e.filterHash=Ve,e.findDirectChildren=K,e.findElements=X,e.flattenResources=gc,e.flexibleCompare=ve,e.flushToDom=Jr,e.formatDate=function(e,t){void 0===t&&(t={});var n=fr(t),r=Nt(t),o=n.createMarkerMeta(e);return o?n.format(o.marker,r,{forcedTzo:o.forcedTzo}):""},e.formatDayString=pt,e.formatIsoTimeString=ft,e.formatRange=function(e,t,n){var r=fr("object"==typeof n&&n?n:{}),o=Nt(n),i=r.createMarkerMeta(e),a=r.createMarkerMeta(t);return i&&a?r.formatRange(i.marker,a.marker,o,{forcedStartTzo:i.forcedTzo,forcedEndTzo:a.forcedTzo,isEndExclusive:n.isEndExclusive,defaultSeparator:Ht.defaultRangeSeparator}):""},e.getAllowYScrolling=$i,e.getClippingParents=Ar,e.getDateMeta=wr,e.getDayClassNames=Tr,e.getDefaultEventEnd=Fn,e.getElSeg=Dn,e.getEventClassNames=_n,e.getIsRtlScrollbarOnLeft=Ir,e.getPublicId=qu,e.getRectCenter=Er,e.getRelevantEvents=Gt,e.getScrollGridClassNames=oa,e.getScrollbarWidths=Nr,e.getSectionClassNames=ia,e.getSectionHasLiquidHeight=Ji,e.getSegMeta=Nn,e.getSlotClassNames=xr,e.getStickyFooterScrollbar=la,e.getStickyHeaderDates=sa,e.getUnequalProps=Ye,e.globalLocales=lr,e.globalPlugins=Qo,e.greatestDurationDenominator=dt,e.guid=ae,e.hasBgRendering=Cn,e.hasShrinkWidth=ra,e.htmlToElement=z,e.identity=Vt,e.interactionSettingsStore=yi,e.interactionSettingsToStore=mi,e.intersectRanges=gn,e.intersectRects=mr,e.isArraysEqual=B,e.isColPropsEqual=ea,e.isDateSpansEqual=An,e.isGroupsEqual=Ec,e.isInt=Se,e.isInteractionValid=uo,e.isMultiDayRange=dn,e.isPropsEqual=qe,e.isPropsValid=po,e.isSingleDay=rt,e.isValidDate=Ae,e.listenBySelector=ne,e.mapHash=Fe,e.memoize=gt,e.memoizeArraylike=mt,e.memoizeHashlike=yt,e.memoizeObjArg=vt,e.mergeEventStores=Yt,e.multiplyDuration=it,e.padStart=me,e.parseBusinessHours=gr,e.parseClassNames=Xt,e.parseDragMeta=bi,e.parseEventDef=ln,e.parseFieldSpecs=fe,e.parseMarker=ar,e.pointInsideRect=vr,e.preventContextMenu=de,e.preventDefault=ee,e.preventSelection=ue,e.rangeContainsMarker=Sn,e.rangeContainsRange=yn,e.rangesEqual=vn,e.rangesIntersect=mn,e.refineEventDef=an,e.refineProps=zt,e.removeElement=V,e.removeExact=U,e.render=Yr,e.renderChunkContent=Qi,e.renderFill=ya,e.renderMicroColGroup=ta,e.renderScrollShim=aa,e.requestJson=Ko,e.sanitizeShrinkWidth=na,e.setElSeg=bn,e.setRef=io,e.setScrollFromStartingEdge=Tl,e.sliceEventStore=En,e.sliceEvents=function(e,t){return En(e.eventStore,e.eventUiBases,e.dateProfile.activeRange,t?e.nextDayThreshold:null).fg},e.sortEventSegs=Tn,e.startOfDay=Pe,e.translateRect=yr,e.triggerDateSelect=zn,e.unpromisify=Lr,e.version="<%= version %>",e.whenTransitionDone=oe,e.wholeDivideDurations=ct,e}({});
\ No newline at end of file
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/bootstrap/LICENSE.txt b/AKPlan/static/AKPlan/vendor/fullcalendar/bootstrap/LICENSE.txt
deleted file mode 100644
index 2149cfbeff4f2e3649bc950982aa72b894f7e521..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/bootstrap/LICENSE.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-Copyright (c) 2019 Adam Shaw
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/bootstrap/README.md b/AKPlan/static/AKPlan/vendor/fullcalendar/bootstrap/README.md
deleted file mode 100644
index 1da7990c19c607faebe472c57f8a4f0f051a71cd..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/bootstrap/README.md
+++ /dev/null
@@ -1,8 +0,0 @@
-
-# FullCalendar Bootstrap Plugin
-
-Bootstrap 4 theming for your calendar
-
-[View the docs &raquo;](https://fullcalendar.io/docs/bootstrap-theme)
-
-This package was created from the [FullCalendar monorepo &raquo;](https://github.com/fullcalendar/fullcalendar)
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/bootstrap/main.css b/AKPlan/static/AKPlan/vendor/fullcalendar/bootstrap/main.css
deleted file mode 100644
index 3dc71f583170af3673c27e6006dab2e0cec55963..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/bootstrap/main.css
+++ /dev/null
@@ -1,36 +0,0 @@
-.fc.fc-bootstrap a {
-  text-decoration: none;
-}
-
-.fc.fc-bootstrap a[data-goto]:hover {
-  text-decoration: underline;
-}
-
-.fc-bootstrap hr.fc-divider {
-  border-color: inherit;
-}
-
-.fc-bootstrap .fc-today.alert {
-  border-radius: 0;
-}
-
-.fc-bootstrap a.fc-event:not([href]):not([tabindex]) {
-  color: #fff;
-}
-
-.fc-bootstrap .fc-popover.card {
-  position: absolute;
-}
-
-/* Popover
---------------------------------------------------------------------------------------------------*/
-.fc-bootstrap .fc-popover .card-body {
-  padding: 0;
-}
-
-/* TimeGrid Slats (lines that run horizontally)
---------------------------------------------------------------------------------------------------*/
-.fc-bootstrap .fc-time-grid .fc-slats table {
-  /* some themes have background color. see through to slats */
-  background: none;
-}
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/bootstrap/main.d.ts b/AKPlan/static/AKPlan/vendor/fullcalendar/bootstrap/main.d.ts
deleted file mode 100644
index 5312c7d46b596b017ed150d7668065323c76fce6..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/bootstrap/main.d.ts
+++ /dev/null
@@ -1,14 +0,0 @@
-// Generated by dts-bundle v0.7.3-fork.1
-// Dependencies for this module:
-//   ../../../../../@fullcalendar/core
-
-declare module '@fullcalendar/bootstrap' {
-    import {Theme} from '@fullcalendar/core';
-
-    export class BootstrapTheme extends Theme {
-    }
-
-    const _default: import("@fullcalendar/core").PluginDef;
-    export default _default;
-}
-
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/bootstrap/main.esm.js b/AKPlan/static/AKPlan/vendor/fullcalendar/bootstrap/main.esm.js
deleted file mode 100644
index cc6c393054d4dd1f2199299e91402d9d6b7b2342..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/bootstrap/main.esm.js
+++ /dev/null
@@ -1,83 +0,0 @@
-/*!
-FullCalendar Bootstrap Plugin v4.3.0
-Docs & License: https://fullcalendar.io/
-(c) 2019 Adam Shaw
-*/
-
-import {createPlugin, Theme} from '@fullcalendar/core';
-
-/*! *****************************************************************************
-Copyright (c) Microsoft Corporation. All rights reserved.
-Licensed under the Apache License, Version 2.0 (the "License"); you may not use
-this file except in compliance with the License. You may obtain a copy of the
-License at http://www.apache.org/licenses/LICENSE-2.0
-
-THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
-WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
-MERCHANTABLITY OR NON-INFRINGEMENT.
-
-See the Apache Version 2.0 License for specific language governing permissions
-and limitations under the License.
-***************************************************************************** */
-/* global Reflect, Promise */
-
-var extendStatics = function(d, b) {
-    extendStatics = Object.setPrototypeOf ||
-        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-    return extendStatics(d, b);
-};
-
-function __extends(d, b) {
-    extendStatics(d, b);
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-}
-
-var BootstrapTheme = /** @class */ (function (_super) {
-    __extends(BootstrapTheme, _super);
-    function BootstrapTheme() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    return BootstrapTheme;
-}(Theme));
-BootstrapTheme.prototype.classes = {
-    widget: 'fc-bootstrap',
-    tableGrid: 'table-bordered',
-    tableList: 'table',
-    tableListHeading: 'table-active',
-    buttonGroup: 'btn-group',
-    button: 'btn btn-primary',
-    buttonActive: 'active',
-    today: 'alert alert-info',
-    popover: 'card card-primary',
-    popoverHeader: 'card-header',
-    popoverContent: 'card-body',
-    // day grid
-    // for left/right border color when border is inset from edges (all-day in timeGrid view)
-    // avoid `table` class b/c don't want margins/padding/structure. only border color.
-    headerRow: 'table-bordered',
-    dayRow: 'table-bordered',
-    // list view
-    listView: 'card card-primary'
-};
-BootstrapTheme.prototype.baseIconClass = 'fa';
-BootstrapTheme.prototype.iconClasses = {
-    close: 'fa-times',
-    prev: 'fa-chevron-left',
-    next: 'fa-chevron-right',
-    prevYear: 'fa-angle-double-left',
-    nextYear: 'fa-angle-double-right'
-};
-BootstrapTheme.prototype.iconOverrideOption = 'bootstrapFontAwesome';
-BootstrapTheme.prototype.iconOverrideCustomButtonOption = 'bootstrapFontAwesome';
-BootstrapTheme.prototype.iconOverridePrefix = 'fa-';
-var main = createPlugin({
-    themeClasses: {
-        bootstrap: BootstrapTheme
-    }
-});
-
-export default main;
-export { BootstrapTheme };
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/bootstrap/main.js b/AKPlan/static/AKPlan/vendor/fullcalendar/bootstrap/main.js
deleted file mode 100644
index b063deb8a683348e66f69528e57f19dfce439976..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/bootstrap/main.js
+++ /dev/null
@@ -1,91 +0,0 @@
-/*!
-FullCalendar Bootstrap Plugin v4.3.0
-Docs & License: https://fullcalendar.io/
-(c) 2019 Adam Shaw
-*/
-
-(function (global, factory) {
-    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@fullcalendar/core')) :
-    typeof define === 'function' && define.amd ? define(['exports', '@fullcalendar/core'], factory) :
-    (global = global || self, factory(global.FullCalendarBootstrap = {}, global.FullCalendar));
-}(this, function (exports, core) { 'use strict';
-
-    /*! *****************************************************************************
-    Copyright (c) Microsoft Corporation. All rights reserved.
-    Licensed under the Apache License, Version 2.0 (the "License"); you may not use
-    this file except in compliance with the License. You may obtain a copy of the
-    License at http://www.apache.org/licenses/LICENSE-2.0
-
-    THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-    KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
-    WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
-    MERCHANTABLITY OR NON-INFRINGEMENT.
-
-    See the Apache Version 2.0 License for specific language governing permissions
-    and limitations under the License.
-    ***************************************************************************** */
-    /* global Reflect, Promise */
-
-    var extendStatics = function(d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-
-    function __extends(d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    }
-
-    var BootstrapTheme = /** @class */ (function (_super) {
-        __extends(BootstrapTheme, _super);
-        function BootstrapTheme() {
-            return _super !== null && _super.apply(this, arguments) || this;
-        }
-        return BootstrapTheme;
-    }(core.Theme));
-    BootstrapTheme.prototype.classes = {
-        widget: 'fc-bootstrap',
-        tableGrid: 'table-bordered',
-        tableList: 'table',
-        tableListHeading: 'table-active',
-        buttonGroup: 'btn-group',
-        button: 'btn btn-primary',
-        buttonActive: 'active',
-        today: 'alert alert-info',
-        popover: 'card card-primary',
-        popoverHeader: 'card-header',
-        popoverContent: 'card-body',
-        // day grid
-        // for left/right border color when border is inset from edges (all-day in timeGrid view)
-        // avoid `table` class b/c don't want margins/padding/structure. only border color.
-        headerRow: 'table-bordered',
-        dayRow: 'table-bordered',
-        // list view
-        listView: 'card card-primary'
-    };
-    BootstrapTheme.prototype.baseIconClass = 'fa';
-    BootstrapTheme.prototype.iconClasses = {
-        close: 'fa-times',
-        prev: 'fa-chevron-left',
-        next: 'fa-chevron-right',
-        prevYear: 'fa-angle-double-left',
-        nextYear: 'fa-angle-double-right'
-    };
-    BootstrapTheme.prototype.iconOverrideOption = 'bootstrapFontAwesome';
-    BootstrapTheme.prototype.iconOverrideCustomButtonOption = 'bootstrapFontAwesome';
-    BootstrapTheme.prototype.iconOverridePrefix = 'fa-';
-    var main = core.createPlugin({
-        themeClasses: {
-            bootstrap: BootstrapTheme
-        }
-    });
-
-    exports.BootstrapTheme = BootstrapTheme;
-    exports.default = main;
-
-    Object.defineProperty(exports, '__esModule', { value: true });
-
-}));
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/bootstrap/main.min.css b/AKPlan/static/AKPlan/vendor/fullcalendar/bootstrap/main.min.css
deleted file mode 100644
index e9249b56801a3b8961b3ef78e557a31625177dc6..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/bootstrap/main.min.css
+++ /dev/null
@@ -1 +0,0 @@
-.fc.fc-bootstrap a{text-decoration:none}.fc.fc-bootstrap a[data-goto]:hover{text-decoration:underline}.fc-bootstrap hr.fc-divider{border-color:inherit}.fc-bootstrap .fc-today.alert{border-radius:0}.fc-bootstrap a.fc-event:not([href]):not([tabindex]){color:#fff}.fc-bootstrap .fc-popover.card{position:absolute}.fc-bootstrap .fc-popover .card-body{padding:0}.fc-bootstrap .fc-time-grid .fc-slats table{background:0 0}
\ No newline at end of file
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/bootstrap/main.min.js b/AKPlan/static/AKPlan/vendor/fullcalendar/bootstrap/main.min.js
deleted file mode 100644
index 107ed48b1d66ed6fbbeef697548eaac8466a0289..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/bootstrap/main.min.js
+++ /dev/null
@@ -1,6 +0,0 @@
-/*!
-FullCalendar Bootstrap Plugin v4.3.0
-Docs & License: https://fullcalendar.io/
-(c) 2019 Adam Shaw
-*/
-!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("@fullcalendar/core")):"function"==typeof define&&define.amd?define(["exports","@fullcalendar/core"],t):t((e=e||self).FullCalendarBootstrap={},e.FullCalendar)}(this,function(e,t){"use strict";var o=function(e,t){return(o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var o in t)t.hasOwnProperty(o)&&(e[o]=t[o])})(e,t)};var r=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return function(e,t){function r(){this.constructor=e}o(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}(t,e),t}(t.Theme);r.prototype.classes={widget:"fc-bootstrap",tableGrid:"table-bordered",tableList:"table",tableListHeading:"table-active",buttonGroup:"btn-group",button:"btn btn-primary",buttonActive:"active",today:"alert alert-info",popover:"card card-primary",popoverHeader:"card-header",popoverContent:"card-body",headerRow:"table-bordered",dayRow:"table-bordered",listView:"card card-primary"},r.prototype.baseIconClass="fa",r.prototype.iconClasses={close:"fa-times",prev:"fa-chevron-left",next:"fa-chevron-right",prevYear:"fa-angle-double-left",nextYear:"fa-angle-double-right"},r.prototype.iconOverrideOption="bootstrapFontAwesome",r.prototype.iconOverrideCustomButtonOption="bootstrapFontAwesome",r.prototype.iconOverridePrefix="fa-";var a=t.createPlugin({themeClasses:{bootstrap:r}});e.BootstrapTheme=r,e.default=a,Object.defineProperty(e,"__esModule",{value:!0})});
\ No newline at end of file
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/bootstrap/package.json b/AKPlan/static/AKPlan/vendor/fullcalendar/bootstrap/package.json
deleted file mode 100644
index 3f1845b573b2ed2996cdf2588676f7eb7bc733a7..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/bootstrap/package.json
+++ /dev/null
@@ -1,33 +0,0 @@
-{
-  "name": "@fullcalendar/bootstrap",
-  "version": "4.3.0",
-  "title": "FullCalendar Bootstrap Plugin",
-  "description": "Bootstrap 4 theming for your calendar",
-  "keywords": [
-    "calendar",
-    "event",
-    "full-sized"
-  ],
-  "homepage": "https://fullcalendar.io/",
-  "docs": "https://fullcalendar.io/docs/bootstrap-theme",
-  "bugs": "https://fullcalendar.io/reporting-bugs",
-  "repository": {
-    "type": "git",
-    "url": "https://github.com/fullcalendar/fullcalendar.git",
-    "homepage": "https://github.com/fullcalendar/fullcalendar"
-  },
-  "license": "MIT",
-  "author": {
-    "name": "Adam Shaw",
-    "email": "arshaw@arshaw.com",
-    "url": "http://arshaw.com/"
-  },
-  "copyright": "2019 Adam Shaw",
-  "peerDependencies": {
-    "@fullcalendar/core": "~4.3.0"
-  },
-  "main": "main.js",
-  "module": "main.esm.js",
-  "unpkg": "main.min.js",
-  "types": "main.d.ts"
-}
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/core/LICENSE.txt b/AKPlan/static/AKPlan/vendor/fullcalendar/core/LICENSE.txt
deleted file mode 100644
index 2149cfbeff4f2e3649bc950982aa72b894f7e521..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/core/LICENSE.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-Copyright (c) 2019 Adam Shaw
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/core/README.md b/AKPlan/static/AKPlan/vendor/fullcalendar/core/README.md
deleted file mode 100644
index 7ed36f442bafc3d4c46eef9e4d21a0e9e86f82c5..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/core/README.md
+++ /dev/null
@@ -1,8 +0,0 @@
-
-# FullCalendar Core Package
-
-Provides core functionality, including the Calendar class
-
-[View the docs &raquo;](https://fullcalendar.io/docs/initialize-es6)
-
-This package was created from the [FullCalendar monorepo &raquo;](https://github.com/fullcalendar/fullcalendar)
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales-all.js b/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales-all.js
deleted file mode 100644
index 5c7c9fa9380aaf3a29f87cb455bd46f8e81e6a7c..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales-all.js
+++ /dev/null
@@ -1,1348 +0,0 @@
-(function (global, factory) {
-    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
-    typeof define === 'function' && define.amd ? define(factory) :
-    (global = global || self, global.FullCalendarLocalesAll = factory());
-}(this, function () { 'use strict';
-
-    var _m0 = {
-        code: "af",
-        week: {
-            dow: 1,
-            doy: 4 // Die week wat die 4de Januarie bevat is die eerste week van die jaar.
-        },
-        buttonText: {
-            prev: "Vorige",
-            next: "Volgende",
-            today: "Vandag",
-            year: "Jaar",
-            month: "Maand",
-            week: "Week",
-            day: "Dag",
-            list: "Agenda"
-        },
-        allDayHtml: "Heeldag",
-        eventLimitText: "Addisionele",
-        noEventsMessage: "Daar is geen gebeurtenisse nie"
-    };
-
-    var _m1 = {
-        code: "ar-dz",
-        week: {
-            dow: 0,
-            doy: 4 // The week that contains Jan 1st is the first week of the year.
-        },
-        dir: 'rtl',
-        buttonText: {
-            prev: "السابق",
-            next: "التالي",
-            today: "اليوم",
-            month: "شهر",
-            week: "أسبوع",
-            day: "يوم",
-            list: "أجندة"
-        },
-        weekLabel: "أسبوع",
-        allDayText: "اليوم كله",
-        eventLimitText: "أخرى",
-        noEventsMessage: "أي أحداث لعرض"
-    };
-
-    var _m2 = {
-        code: "ar-kw",
-        week: {
-            dow: 0,
-            doy: 12 // The week that contains Jan 1st is the first week of the year.
-        },
-        dir: 'rtl',
-        buttonText: {
-            prev: "السابق",
-            next: "التالي",
-            today: "اليوم",
-            month: "شهر",
-            week: "أسبوع",
-            day: "يوم",
-            list: "أجندة"
-        },
-        weekLabel: "أسبوع",
-        allDayText: "اليوم كله",
-        eventLimitText: "أخرى",
-        noEventsMessage: "أي أحداث لعرض"
-    };
-
-    var _m3 = {
-        code: "ar-ly",
-        week: {
-            dow: 6,
-            doy: 12 // The week that contains Jan 1st is the first week of the year.
-        },
-        dir: 'rtl',
-        buttonText: {
-            prev: "السابق",
-            next: "التالي",
-            today: "اليوم",
-            month: "شهر",
-            week: "أسبوع",
-            day: "يوم",
-            list: "أجندة"
-        },
-        weekLabel: "أسبوع",
-        allDayText: "اليوم كله",
-        eventLimitText: "أخرى",
-        noEventsMessage: "أي أحداث لعرض"
-    };
-
-    var _m4 = {
-        code: "ar-ma",
-        week: {
-            dow: 6,
-            doy: 12 // The week that contains Jan 1st is the first week of the year.
-        },
-        dir: 'rtl',
-        buttonText: {
-            prev: "السابق",
-            next: "التالي",
-            today: "اليوم",
-            month: "شهر",
-            week: "أسبوع",
-            day: "يوم",
-            list: "أجندة"
-        },
-        weekLabel: "أسبوع",
-        allDayText: "اليوم كله",
-        eventLimitText: "أخرى",
-        noEventsMessage: "أي أحداث لعرض"
-    };
-
-    var _m5 = {
-        code: "ar-sa",
-        week: {
-            dow: 0,
-            doy: 6 // The week that contains Jan 1st is the first week of the year.
-        },
-        dir: 'rtl',
-        buttonText: {
-            prev: "السابق",
-            next: "التالي",
-            today: "اليوم",
-            month: "شهر",
-            week: "أسبوع",
-            day: "يوم",
-            list: "أجندة"
-        },
-        weekLabel: "أسبوع",
-        allDayText: "اليوم كله",
-        eventLimitText: "أخرى",
-        noEventsMessage: "أي أحداث لعرض"
-    };
-
-    var _m6 = {
-        code: "ar-tn",
-        week: {
-            dow: 1,
-            doy: 4 // The week that contains Jan 4th is the first week of the year.
-        },
-        dir: 'rtl',
-        buttonText: {
-            prev: "السابق",
-            next: "التالي",
-            today: "اليوم",
-            month: "شهر",
-            week: "أسبوع",
-            day: "يوم",
-            list: "أجندة"
-        },
-        weekLabel: "أسبوع",
-        allDayText: "اليوم كله",
-        eventLimitText: "أخرى",
-        noEventsMessage: "أي أحداث لعرض"
-    };
-
-    var _m7 = {
-        code: "ar",
-        week: {
-            dow: 6,
-            doy: 12 // The week that contains Jan 1st is the first week of the year.
-        },
-        dir: 'rtl',
-        buttonText: {
-            prev: "السابق",
-            next: "التالي",
-            today: "اليوم",
-            month: "شهر",
-            week: "أسبوع",
-            day: "يوم",
-            list: "أجندة"
-        },
-        weekLabel: "أسبوع",
-        allDayText: "اليوم كله",
-        eventLimitText: "أخرى",
-        noEventsMessage: "أي أحداث لعرض"
-    };
-
-    var _m8 = {
-        code: "bg",
-        week: {
-            dow: 1,
-            doy: 7 // The week that contains Jan 1st is the first week of the year.
-        },
-        buttonText: {
-            prev: "назад",
-            next: "напред",
-            today: "днес",
-            month: "Месец",
-            week: "Седмица",
-            day: "Ден",
-            list: "График"
-        },
-        allDayText: "Цял ден",
-        eventLimitText: function (n) {
-            return "+още " + n;
-        },
-        noEventsMessage: "Няма събития за показване"
-    };
-
-    var _m9 = {
-        code: "bs",
-        week: {
-            dow: 1,
-            doy: 7 // The week that contains Jan 1st is the first week of the year.
-        },
-        buttonText: {
-            prev: "Prošli",
-            next: "Sljedeći",
-            today: "Danas",
-            month: "Mjesec",
-            week: "Sedmica",
-            day: "Dan",
-            list: "Raspored"
-        },
-        weekLabel: "Sed",
-        allDayText: "Cijeli dan",
-        eventLimitText: function (n) {
-            return "+ još " + n;
-        },
-        noEventsMessage: "Nema događaja za prikazivanje"
-    };
-
-    var _m10 = {
-        code: "ca",
-        week: {
-            dow: 1,
-            doy: 4 // The week that contains Jan 4th is the first week of the year.
-        },
-        buttonText: {
-            prev: "Anterior",
-            next: "Següent",
-            today: "Avui",
-            month: "Mes",
-            week: "Setmana",
-            day: "Dia",
-            list: "Agenda"
-        },
-        weekLabel: "Set",
-        allDayText: "Tot el dia",
-        eventLimitText: "més",
-        noEventsMessage: "No hi ha esdeveniments per mostrar"
-    };
-
-    var _m11 = {
-        code: "cs",
-        week: {
-            dow: 1,
-            doy: 4 // The week that contains Jan 4th is the first week of the year.
-        },
-        buttonText: {
-            prev: "Dříve",
-            next: "Později",
-            today: "Nyní",
-            month: "Měsíc",
-            week: "Týden",
-            day: "Den",
-            list: "Agenda"
-        },
-        weekLabel: "Týd",
-        allDayText: "Celý den",
-        eventLimitText: function (n) {
-            return "+další: " + n;
-        },
-        noEventsMessage: "Žádné akce k zobrazení"
-    };
-
-    var _m12 = {
-        code: "da",
-        week: {
-            dow: 1,
-            doy: 4 // The week that contains Jan 4th is the first week of the year.
-        },
-        buttonText: {
-            prev: "Forrige",
-            next: "Næste",
-            today: "I dag",
-            month: "MÃ¥ned",
-            week: "Uge",
-            day: "Dag",
-            list: "Agenda"
-        },
-        weekLabel: "Uge",
-        allDayText: "Hele dagen",
-        eventLimitText: "flere",
-        noEventsMessage: "Ingen arrangementer at vise"
-    };
-
-    var _m13 = {
-        code: "de",
-        week: {
-            dow: 1,
-            doy: 4 // The week that contains Jan 4th is the first week of the year.
-        },
-        buttonText: {
-            prev: "Zurück",
-            next: "Vor",
-            today: "Heute",
-            year: "Jahr",
-            month: "Monat",
-            week: "Woche",
-            day: "Tag",
-            list: "Terminübersicht"
-        },
-        weekLabel: "KW",
-        allDayText: "Ganztägig",
-        eventLimitText: function (n) {
-            return "+ weitere " + n;
-        },
-        noEventsMessage: "Keine Ereignisse anzuzeigen"
-    };
-
-    var _m14 = {
-        code: "el",
-        week: {
-            dow: 1,
-            doy: 4 // The week that contains Jan 4st is the first week of the year.
-        },
-        buttonText: {
-            prev: "Προηγούμενος",
-            next: "Επόμενος",
-            today: "Σήμερα",
-            month: "Μήνας",
-            week: "Εβδομάδα",
-            day: "Ημέρα",
-            list: "Ατζέντα"
-        },
-        weekLabel: "Εβδ",
-        allDayText: "Ολοήμερο",
-        eventLimitText: "περισσότερα",
-        noEventsMessage: "Δεν υπάρχουν γεγονότα για να εμφανιστεί"
-    };
-
-    var _m15 = {
-        code: "en-au",
-        week: {
-            dow: 1,
-            doy: 4 // The week that contains Jan 4th is the first week of the year.
-        }
-    };
-
-    var _m16 = {
-        code: "en-gb",
-        week: {
-            dow: 1,
-            doy: 4 // The week that contains Jan 4th is the first week of the year.
-        }
-    };
-
-    var _m17 = {
-        code: "en-nz",
-        week: {
-            dow: 1,
-            doy: 4 // The week that contains Jan 4th is the first week of the year.
-        }
-    };
-
-    var _m18 = {
-        code: "es",
-        week: {
-            dow: 0,
-            doy: 6 // The week that contains Jan 1st is the first week of the year.
-        },
-        buttonText: {
-            prev: "Ant",
-            next: "Sig",
-            today: "Hoy",
-            month: "Mes",
-            week: "Semana",
-            day: "Día",
-            list: "Agenda"
-        },
-        weekLabel: "Sm",
-        allDayHtml: "Todo<br/>el día",
-        eventLimitText: "más",
-        noEventsMessage: "No hay eventos para mostrar"
-    };
-
-    var _m19 = {
-        code: "es",
-        week: {
-            dow: 1,
-            doy: 4 // The week that contains Jan 4th is the first week of the year.
-        },
-        buttonText: {
-            prev: "Ant",
-            next: "Sig",
-            today: "Hoy",
-            month: "Mes",
-            week: "Semana",
-            day: "Día",
-            list: "Agenda"
-        },
-        weekLabel: "Sm",
-        allDayHtml: "Todo<br/>el día",
-        eventLimitText: "más",
-        noEventsMessage: "No hay eventos para mostrar"
-    };
-
-    var _m20 = {
-        code: "et",
-        week: {
-            dow: 1,
-            doy: 4 // The week that contains Jan 4th is the first week of the year.
-        },
-        buttonText: {
-            prev: "Eelnev",
-            next: "Järgnev",
-            today: "Täna",
-            month: "Kuu",
-            week: "Nädal",
-            day: "Päev",
-            list: "Päevakord"
-        },
-        weekLabel: "näd",
-        allDayText: "Kogu päev",
-        eventLimitText: function (n) {
-            return "+ veel " + n;
-        },
-        noEventsMessage: "Kuvamiseks puuduvad sündmused"
-    };
-
-    var _m21 = {
-        code: "eu",
-        week: {
-            dow: 1,
-            doy: 7 // The week that contains Jan 1st is the first week of the year.
-        },
-        buttonText: {
-            prev: "Aur",
-            next: "Hur",
-            today: "Gaur",
-            month: "Hilabetea",
-            week: "Astea",
-            day: "Eguna",
-            list: "Agenda"
-        },
-        weekLabel: "As",
-        allDayHtml: "Egun<br/>osoa",
-        eventLimitText: "gehiago",
-        noEventsMessage: "Ez dago ekitaldirik erakusteko"
-    };
-
-    var _m22 = {
-        code: "fa",
-        week: {
-            dow: 6,
-            doy: 12 // The week that contains Jan 1st is the first week of the year.
-        },
-        dir: 'rtl',
-        buttonText: {
-            prev: "قبلی",
-            next: "بعدی",
-            today: "امروز",
-            month: "ماه",
-            week: "هفته",
-            day: "روز",
-            list: "برنامه"
-        },
-        weekLabel: "هف",
-        allDayText: "تمام روز",
-        eventLimitText: function (n) {
-            return "بیش از " + n;
-        },
-        noEventsMessage: "هیچ رویدادی به نمایش"
-    };
-
-    var _m23 = {
-        code: "fi",
-        week: {
-            dow: 1,
-            doy: 4 // The week that contains Jan 4th is the first week of the year.
-        },
-        buttonText: {
-            prev: "Edellinen",
-            next: "Seuraava",
-            today: "Tänään",
-            month: "Kuukausi",
-            week: "Viikko",
-            day: "Päivä",
-            list: "Tapahtumat"
-        },
-        weekLabel: "Vk",
-        allDayText: "Koko päivä",
-        eventLimitText: "lisää",
-        noEventsMessage: "Ei näytettäviä tapahtumia"
-    };
-
-    var _m24 = {
-        code: "fr",
-        buttonText: {
-            prev: "Précédent",
-            next: "Suivant",
-            today: "Aujourd'hui",
-            year: "Année",
-            month: "Mois",
-            week: "Semaine",
-            day: "Jour",
-            list: "Mon planning"
-        },
-        weekLabel: "Sem.",
-        allDayHtml: "Toute la<br/>journée",
-        eventLimitText: "en plus",
-        noEventsMessage: "Aucun événement à afficher"
-    };
-
-    var _m25 = {
-        code: "fr-ch",
-        week: {
-            dow: 1,
-            doy: 4 // The week that contains Jan 4th is the first week of the year.
-        },
-        buttonText: {
-            prev: "Précédent",
-            next: "Suivant",
-            today: "Courant",
-            year: "Année",
-            month: "Mois",
-            week: "Semaine",
-            day: "Jour",
-            list: "Mon planning"
-        },
-        weekLabel: "Sm",
-        allDayHtml: "Toute la<br/>journée",
-        eventLimitText: "en plus",
-        noEventsMessage: "Aucun événement à afficher"
-    };
-
-    var _m26 = {
-        code: "fr",
-        week: {
-            dow: 1,
-            doy: 4 // The week that contains Jan 4th is the first week of the year.
-        },
-        buttonText: {
-            prev: "Précédent",
-            next: "Suivant",
-            today: "Aujourd'hui",
-            year: "Année",
-            month: "Mois",
-            week: "Semaine",
-            day: "Jour",
-            list: "Mon planning"
-        },
-        weekLabel: "Sem.",
-        allDayHtml: "Toute la<br/>journée",
-        eventLimitText: "en plus",
-        noEventsMessage: "Aucun événement à afficher"
-    };
-
-    var _m27 = {
-        code: "gl",
-        week: {
-            dow: 1,
-            doy: 4 // The week that contains Jan 4th is the first week of the year.
-        },
-        buttonText: {
-            prev: "Ant",
-            next: "Seg",
-            today: "Hoxe",
-            month: "Mes",
-            week: "Semana",
-            day: "Día",
-            list: "Axenda"
-        },
-        weekLabel: "Sm",
-        allDayHtml: "Todo<br/>o día",
-        eventLimitText: "máis",
-        noEventsMessage: "Non hai eventos para amosar"
-    };
-
-    var _m28 = {
-        code: "he",
-        dir: 'rtl',
-        buttonText: {
-            prev: "הקודם",
-            next: "הבא",
-            today: "היום",
-            month: "חודש",
-            week: "שבוע",
-            day: "יום",
-            list: "סדר יום"
-        },
-        allDayText: "כל היום",
-        eventLimitText: "אחר",
-        noEventsMessage: "אין אירועים להצגה",
-        weekLabel: "שבוע"
-    };
-
-    var _m29 = {
-        code: "hi",
-        week: {
-            dow: 0,
-            doy: 6 // The week that contains Jan 1st is the first week of the year.
-        },
-        buttonText: {
-            prev: "पिछला",
-            next: "अगला",
-            today: "आज",
-            month: "महीना",
-            week: "सप्ताह",
-            day: "दिन",
-            list: "कार्यसूची"
-        },
-        weekLabel: "हफ्ता",
-        allDayText: "सभी दिन",
-        eventLimitText: function (n) {
-            return "+अधिक " + n;
-        },
-        noEventsMessage: "कोई घटनाओं को प्रदर्शित करने के लिए"
-    };
-
-    var _m30 = {
-        code: "hr",
-        week: {
-            dow: 1,
-            doy: 7 // The week that contains Jan 1st is the first week of the year.
-        },
-        buttonText: {
-            prev: "Prijašnji",
-            next: "Sljedeći",
-            today: "Danas",
-            month: "Mjesec",
-            week: "Tjedan",
-            day: "Dan",
-            list: "Raspored"
-        },
-        weekLabel: "Tje",
-        allDayText: "Cijeli dan",
-        eventLimitText: function (n) {
-            return "+ još " + n;
-        },
-        noEventsMessage: "Nema događaja za prikaz"
-    };
-
-    var _m31 = {
-        code: "hu",
-        week: {
-            dow: 1,
-            doy: 4 // The week that contains Jan 4th is the first week of the year.
-        },
-        buttonText: {
-            prev: "vissza",
-            next: "előre",
-            today: "ma",
-            month: "Hónap",
-            week: "Hét",
-            day: "Nap",
-            list: "Napló"
-        },
-        weekLabel: "Hét",
-        allDayText: "Egész nap",
-        eventLimitText: "további",
-        noEventsMessage: "Nincs megjeleníthető esemény"
-    };
-
-    var _m32 = {
-        code: "id",
-        week: {
-            dow: 1,
-            doy: 7 // The week that contains Jan 1st is the first week of the year.
-        },
-        buttonText: {
-            prev: "mundur",
-            next: "maju",
-            today: "hari ini",
-            month: "Bulan",
-            week: "Minggu",
-            day: "Hari",
-            list: "Agenda"
-        },
-        weekLabel: "Mg",
-        allDayHtml: "Sehari<br/>penuh",
-        eventLimitText: "lebih",
-        noEventsMessage: "Tidak ada acara untuk ditampilkan"
-    };
-
-    var _m33 = {
-        code: "is",
-        week: {
-            dow: 1,
-            doy: 4 // The week that contains Jan 4th is the first week of the year.
-        },
-        buttonText: {
-            prev: "Fyrri",
-            next: "Næsti",
-            today: "Í dag",
-            month: "Mánuður",
-            week: "Vika",
-            day: "Dagur",
-            list: "Dagskrá"
-        },
-        weekLabel: "Vika",
-        allDayHtml: "Allan<br/>daginn",
-        eventLimitText: "meira",
-        noEventsMessage: "Engir viðburðir til að sýna"
-    };
-
-    var _m34 = {
-        code: "it",
-        week: {
-            dow: 1,
-            doy: 4 // The week that contains Jan 4th is the first week of the year.
-        },
-        buttonText: {
-            prev: "Prec",
-            next: "Succ",
-            today: "Oggi",
-            month: "Mese",
-            week: "Settimana",
-            day: "Giorno",
-            list: "Agenda"
-        },
-        weekLabel: "Sm",
-        allDayHtml: "Tutto il<br/>giorno",
-        eventLimitText: function (n) {
-            return "+altri " + n;
-        },
-        noEventsMessage: "Non ci sono eventi da visualizzare"
-    };
-
-    var _m35 = {
-        code: "ja",
-        buttonText: {
-            prev: "前",
-            next: "次",
-            today: "今日",
-            month: "月",
-            week: "週",
-            day: "æ—¥",
-            list: "予定リスト"
-        },
-        weekLabel: "週",
-        allDayText: "終日",
-        eventLimitText: function (n) {
-            return "他 " + n + " 件";
-        },
-        noEventsMessage: "表示する予定はありません"
-    };
-
-    var _m36 = {
-        code: "ka",
-        week: {
-            dow: 1,
-            doy: 7
-        },
-        buttonText: {
-            prev: "წინა",
-            next: "შემდეგი",
-            today: "დღეს",
-            month: "თვე",
-            week: "კვირა",
-            day: "დღე",
-            list: "დღის წესრიგი"
-        },
-        weekLabel: "კვ",
-        allDayText: "მთელი დღე",
-        eventLimitText: function (n) {
-            return "+ კიდევ " + n;
-        },
-        noEventsMessage: "ღონისძიებები არ არის"
-    };
-
-    var _m37 = {
-        code: "kk",
-        week: {
-            dow: 1,
-            doy: 7 // The week that contains Jan 1st is the first week of the year.
-        },
-        buttonText: {
-            prev: "Алдыңғы",
-            next: "Келесі",
-            today: "Бүгін",
-            month: "Ай",
-            week: "Апта",
-            day: "Күн",
-            list: "Күн тәртібі"
-        },
-        weekLabel: "Не",
-        allDayText: "Күні бойы",
-        eventLimitText: function (n) {
-            return "+ тағы " + n;
-        },
-        noEventsMessage: "Көрсету үшін оқиғалар жоқ"
-    };
-
-    var _m38 = {
-        code: "ko",
-        buttonText: {
-            prev: "이전달",
-            next: "다음달",
-            today: "오늘",
-            month: "ì›”",
-            week: "주",
-            day: "일",
-            list: "일정목록"
-        },
-        weekLabel: "주",
-        allDayText: "종일",
-        eventLimitText: "개",
-        noEventsMessage: "일정이 없습니다"
-    };
-
-    var _m39 = {
-        code: "lb",
-        week: {
-            dow: 1,
-            doy: 4 // The week that contains Jan 4th is the first week of the year.
-        },
-        buttonText: {
-            prev: "Zréck",
-            next: "Weider",
-            today: "Haut",
-            month: "Mount",
-            week: "Woch",
-            day: "Dag",
-            list: "Terminiwwersiicht"
-        },
-        weekLabel: "W",
-        allDayText: "Ganzen Dag",
-        eventLimitText: "méi",
-        noEventsMessage: "Nee Evenementer ze affichéieren"
-    };
-
-    var _m40 = {
-        code: "lt",
-        week: {
-            dow: 1,
-            doy: 4 // The week that contains Jan 4th is the first week of the year.
-        },
-        buttonText: {
-            prev: "Atgal",
-            next: "Pirmyn",
-            today: "Å iandien",
-            month: "MÄ—nuo",
-            week: "SavaitÄ—",
-            day: "Diena",
-            list: "DarbotvarkÄ—"
-        },
-        weekLabel: "SAV",
-        allDayText: "VisÄ… dienÄ…",
-        eventLimitText: "daugiau",
-        noEventsMessage: "Nėra įvykių rodyti"
-    };
-
-    var _m41 = {
-        code: "lv",
-        week: {
-            dow: 1,
-            doy: 4 // The week that contains Jan 4th is the first week of the year.
-        },
-        buttonText: {
-            prev: "Iepr.",
-            next: "Nāk.",
-            today: "Å odien",
-            month: "MÄ“nesis",
-            week: "Nedēļa",
-            day: "Diena",
-            list: "Dienas kārtība"
-        },
-        weekLabel: "Ned.",
-        allDayText: "Visu dienu",
-        eventLimitText: function (n) {
-            return "+vēl " + n;
-        },
-        noEventsMessage: "Nav notikumu"
-    };
-
-    var _m42 = {
-        code: "mk",
-        buttonText: {
-            prev: "претходно",
-            next: "следно",
-            today: "Денес",
-            month: "Месец",
-            week: "Недела",
-            day: "Ден",
-            list: "График"
-        },
-        weekLabel: "Сед",
-        allDayText: "Цел ден",
-        eventLimitText: function (n) {
-            return "+повеќе " + n;
-        },
-        noEventsMessage: "Нема настани за прикажување"
-    };
-
-    var _m43 = {
-        code: "ms",
-        week: {
-            dow: 1,
-            doy: 7 // The week that contains Jan 1st is the first week of the year.
-        },
-        buttonText: {
-            prev: "Sebelum",
-            next: "Selepas",
-            today: "hari ini",
-            month: "Bulan",
-            week: "Minggu",
-            day: "Hari",
-            list: "Agenda"
-        },
-        weekLabel: "Mg",
-        allDayText: "Sepanjang hari",
-        eventLimitText: function (n) {
-            return "masih ada " + n + " acara";
-        },
-        noEventsMessage: "Tiada peristiwa untuk dipaparkan"
-    };
-
-    var _m44 = {
-        code: "nb",
-        week: {
-            dow: 1,
-            doy: 4 // The week that contains Jan 4th is the first week of the year.
-        },
-        buttonText: {
-            prev: "Forrige",
-            next: "Neste",
-            today: "I dag",
-            month: "MÃ¥ned",
-            week: "Uke",
-            day: "Dag",
-            list: "Agenda"
-        },
-        weekLabel: "Uke",
-        allDayText: "Hele dagen",
-        eventLimitText: "til",
-        noEventsMessage: "Ingen hendelser å vise"
-    };
-
-    var _m45 = {
-        code: "nl",
-        week: {
-            dow: 1,
-            doy: 4 // The week that contains Jan 4th is the first week of the year.
-        },
-        buttonText: {
-            prev: "Voorgaand",
-            next: "Volgende",
-            today: "Vandaag",
-            year: "Jaar",
-            month: "Maand",
-            week: "Week",
-            day: "Dag",
-            list: "Agenda"
-        },
-        allDayText: "Hele dag",
-        eventLimitText: "extra",
-        noEventsMessage: "Geen evenementen om te laten zien"
-    };
-
-    var _m46 = {
-        code: "nn",
-        week: {
-            dow: 1,
-            doy: 4 // The week that contains Jan 4th is the first week of the year.
-        },
-        buttonText: {
-            prev: "Førre",
-            next: "Neste",
-            today: "I dag",
-            month: "MÃ¥nad",
-            week: "Veke",
-            day: "Dag",
-            list: "Agenda"
-        },
-        weekLabel: "Veke",
-        allDayText: "Heile dagen",
-        eventLimitText: "til",
-        noEventsMessage: "Ingen hendelser å vise"
-    };
-
-    var _m47 = {
-        code: "pl",
-        week: {
-            dow: 1,
-            doy: 4 // The week that contains Jan 4th is the first week of the year.
-        },
-        buttonText: {
-            prev: "Poprzedni",
-            next: "Następny",
-            today: "DziÅ›",
-            month: "MiesiÄ…c",
-            week: "Tydzień",
-            day: "Dzień",
-            list: "Plan dnia"
-        },
-        weekLabel: "Tydz",
-        allDayText: "Cały dzień",
-        eventLimitText: "więcej",
-        noEventsMessage: "Brak wydarzeń do wyświetlenia"
-    };
-
-    var _m48 = {
-        code: "pt-br",
-        buttonText: {
-            prev: "Anterior",
-            next: "Próximo",
-            today: "Hoje",
-            month: "Mês",
-            week: "Semana",
-            day: "Dia",
-            list: "Compromissos"
-        },
-        weekLabel: "Sm",
-        allDayText: "dia inteiro",
-        eventLimitText: function (n) {
-            return "mais +" + n;
-        },
-        noEventsMessage: "Não há eventos para mostrar"
-    };
-
-    var _m49 = {
-        code: "pt",
-        week: {
-            dow: 1,
-            doy: 4 // The week that contains Jan 4th is the first week of the year.
-        },
-        buttonText: {
-            prev: "Anterior",
-            next: "Seguinte",
-            today: "Hoje",
-            month: "Mês",
-            week: "Semana",
-            day: "Dia",
-            list: "Agenda"
-        },
-        weekLabel: "Sem",
-        allDayText: "Todo o dia",
-        eventLimitText: "mais",
-        noEventsMessage: "Não há eventos para mostrar"
-    };
-
-    var _m50 = {
-        code: "ro",
-        week: {
-            dow: 1,
-            doy: 7 // The week that contains Jan 1st is the first week of the year.
-        },
-        buttonText: {
-            prev: "precedentă",
-            next: "următoare",
-            today: "Azi",
-            month: "Lună",
-            week: "Săptămână",
-            day: "Zi",
-            list: "Agendă"
-        },
-        weekLabel: "Săpt",
-        allDayText: "Toată ziua",
-        eventLimitText: function (n) {
-            return "+alte " + n;
-        },
-        noEventsMessage: "Nu există evenimente de afișat"
-    };
-
-    var _m51 = {
-        code: "ru",
-        week: {
-            dow: 1,
-            doy: 4 // The week that contains Jan 4th is the first week of the year.
-        },
-        buttonText: {
-            prev: "Пред",
-            next: "След",
-            today: "Сегодня",
-            month: "Месяц",
-            week: "Неделя",
-            day: "День",
-            list: "Повестка дня"
-        },
-        weekLabel: "Нед",
-        allDayText: "Весь день",
-        eventLimitText: function (n) {
-            return "+ ещё " + n;
-        },
-        noEventsMessage: "Нет событий для отображения"
-    };
-
-    var _m52 = {
-        code: "sk",
-        week: {
-            dow: 1,
-            doy: 4 // The week that contains Jan 4th is the first week of the year.
-        },
-        buttonText: {
-            prev: "Predchádzajúci",
-            next: "Nasledujúci",
-            today: "Dnes",
-            month: "Mesiac",
-            week: "Týždeň",
-            day: "Deň",
-            list: "Rozvrh"
-        },
-        weekLabel: "Ty",
-        allDayText: "Celý deň",
-        eventLimitText: function (n) {
-            return "+ďalšie: " + n;
-        },
-        noEventsMessage: "Žiadne akcie na zobrazenie"
-    };
-
-    var _m53 = {
-        code: "sl",
-        week: {
-            dow: 1,
-            doy: 7 // The week that contains Jan 1st is the first week of the year.
-        },
-        buttonText: {
-            prev: "Prejšnji",
-            next: "Naslednji",
-            today: "Trenutni",
-            month: "Mesec",
-            week: "Teden",
-            day: "Dan",
-            list: "Dnevni red"
-        },
-        weekLabel: "Teden",
-        allDayText: "Ves dan",
-        eventLimitText: "več",
-        noEventsMessage: "Ni dogodkov za prikaz"
-    };
-
-    var _m54 = {
-        code: "sq",
-        week: {
-            dow: 1,
-            doy: 4 // The week that contains Jan 4th is the first week of the year.
-        },
-        buttonText: {
-            prev: "mbrapa",
-            next: "Përpara",
-            today: "sot",
-            month: "Muaj",
-            week: "Javë",
-            day: "Ditë",
-            list: "Listë"
-        },
-        weekLabel: "Ja",
-        allDayHtml: "Gjithë<br/>ditën",
-        eventLimitText: function (n) {
-            return "+më tepër " + n;
-        },
-        noEventsMessage: "Nuk ka evente për të shfaqur"
-    };
-
-    var _m55 = {
-        code: "sr-cyrl",
-        week: {
-            dow: 1,
-            doy: 7 // The week that contains Jan 1st is the first week of the year.
-        },
-        buttonText: {
-            prev: "Претходна",
-            next: "следећи",
-            today: "Данас",
-            month: "Месец",
-            week: "Недеља",
-            day: "Дан",
-            list: "Планер"
-        },
-        weekLabel: "Сед",
-        allDayText: "Цео дан",
-        eventLimitText: function (n) {
-            return "+ још " + n;
-        },
-        noEventsMessage: "Нема догађаја за приказ"
-    };
-
-    var _m56 = {
-        code: "sr",
-        week: {
-            dow: 1,
-            doy: 7 // The week that contains Jan 1st is the first week of the year.
-        },
-        buttonText: {
-            prev: "Prethodna",
-            next: "Sledeći",
-            today: "Danas",
-            month: "Mеsеc",
-            week: "Nеdеlja",
-            day: "Dan",
-            list: "Planеr"
-        },
-        weekLabel: "Sed",
-        allDayText: "Cеo dan",
-        eventLimitText: function (n) {
-            return "+ još " + n;
-        },
-        noEventsMessage: "Nеma događaja za prikaz"
-    };
-
-    var _m57 = {
-        code: "sv",
-        week: {
-            dow: 1,
-            doy: 4 // The week that contains Jan 4th is the first week of the year.
-        },
-        buttonText: {
-            prev: "Förra",
-            next: "Nästa",
-            today: "Idag",
-            month: "MÃ¥nad",
-            week: "Vecka",
-            day: "Dag",
-            list: "Program"
-        },
-        weekLabel: "v.",
-        allDayText: "Heldag",
-        eventLimitText: "till",
-        noEventsMessage: "Inga händelser att visa"
-    };
-
-    var _m58 = {
-        code: "th",
-        buttonText: {
-            prev: "ย้อน",
-            next: "ถัดไป",
-            today: "วันนี้",
-            month: "เดือน",
-            week: "สัปดาห์",
-            day: "วัน",
-            list: "แผนงาน"
-        },
-        allDayText: "ตลอดวัน",
-        eventLimitText: "เพิ่มเติม",
-        noEventsMessage: "ไม่มีกิจกรรมที่จะแสดง"
-    };
-
-    var _m59 = {
-        code: "tr",
-        week: {
-            dow: 1,
-            doy: 7 // The week that contains Jan 1st is the first week of the year.
-        },
-        buttonText: {
-            prev: "geri",
-            next: "ileri",
-            today: "bugün",
-            month: "Ay",
-            week: "Hafta",
-            day: "Gün",
-            list: "Ajanda"
-        },
-        weekLabel: "Hf",
-        allDayText: "Tüm gün",
-        eventLimitText: "daha fazla",
-        noEventsMessage: "Gösterilecek etkinlik yok"
-    };
-
-    var _m60 = {
-        code: "uk",
-        week: {
-            dow: 1,
-            doy: 7 // The week that contains Jan 1st is the first week of the year.
-        },
-        buttonText: {
-            prev: "Попередній",
-            next: "далі",
-            today: "Сьогодні",
-            month: "Місяць",
-            week: "Тиждень",
-            day: "День",
-            list: "Порядок денний"
-        },
-        weekLabel: "Тиж",
-        allDayText: "Увесь день",
-        eventLimitText: function (n) {
-            return "+ще " + n + "...";
-        },
-        noEventsMessage: "Немає подій для відображення"
-    };
-
-    var _m61 = {
-        code: "vi",
-        week: {
-            dow: 1,
-            doy: 4 // The week that contains Jan 4th is the first week of the year.
-        },
-        buttonText: {
-            prev: "TrÆ°á»›c",
-            next: "Tiếp",
-            today: "Hôm nay",
-            month: "Tháng",
-            week: "Tuần",
-            day: "Ngày",
-            list: "Lịch biểu"
-        },
-        weekLabel: "Tu",
-        allDayText: "Cả ngày",
-        eventLimitText: function (n) {
-            return "+ thêm " + n;
-        },
-        noEventsMessage: "Không có sự kiện để hiển thị"
-    };
-
-    var _m62 = {
-        code: "zh-cn",
-        week: {
-            // GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效
-            dow: 1,
-            doy: 4 // The week that contains Jan 4th is the first week of the year.
-        },
-        buttonText: {
-            prev: "上月",
-            next: "下月",
-            today: "今天",
-            month: "月",
-            week: "周",
-            day: "æ—¥",
-            list: "日程"
-        },
-        weekLabel: "周",
-        allDayText: "全天",
-        eventLimitText: function (n) {
-            return "另外 " + n + " 个";
-        },
-        noEventsMessage: "没有事件显示"
-    };
-
-    var _m63 = {
-        code: "zh-tw",
-        buttonText: {
-            prev: "上月",
-            next: "下月",
-            today: "今天",
-            month: "月",
-            week: "週",
-            day: "天",
-            list: "活動列表"
-        },
-        weekLabel: "周",
-        allDayText: "整天",
-        eventLimitText: '顯示更多',
-        noEventsMessage: "没有任何活動"
-    };
-
-    var _rollupPluginMultiEntry_entryPoint = [
-    _m0, _m1, _m2, _m3, _m4, _m5, _m6, _m7, _m8, _m9, _m10, _m11, _m12, _m13, _m14, _m15, _m16, _m17, _m18, _m19, _m20, _m21, _m22, _m23, _m24, _m25, _m26, _m27, _m28, _m29, _m30, _m31, _m32, _m33, _m34, _m35, _m36, _m37, _m38, _m39, _m40, _m41, _m42, _m43, _m44, _m45, _m46, _m47, _m48, _m49, _m50, _m51, _m52, _m53, _m54, _m55, _m56, _m57, _m58, _m59, _m60, _m61, _m62, _m63
-    ];
-
-    return _rollupPluginMultiEntry_entryPoint;
-
-}));
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales-all.min.js b/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales-all.min.js
deleted file mode 100644
index 810d6deaf97c70c0f721ee254c67407b43c0aaf8..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales-all.min.js
+++ /dev/null
@@ -1 +0,0 @@
-!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e=e||self).FullCalendarLocalesAll=t()}(this,function(){"use strict";return[{code:"af",week:{dow:1,doy:4},buttonText:{prev:"Vorige",next:"Volgende",today:"Vandag",year:"Jaar",month:"Maand",week:"Week",day:"Dag",list:"Agenda"},allDayHtml:"Heeldag",eventLimitText:"Addisionele",noEventsMessage:"Daar is geen gebeurtenisse nie"},{code:"ar-dz",week:{dow:0,doy:4},dir:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekLabel:"أسبوع",allDayText:"اليوم كله",eventLimitText:"أخرى",noEventsMessage:"أي أحداث لعرض"},{code:"ar-kw",week:{dow:0,doy:12},dir:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekLabel:"أسبوع",allDayText:"اليوم كله",eventLimitText:"أخرى",noEventsMessage:"أي أحداث لعرض"},{code:"ar-ly",week:{dow:6,doy:12},dir:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekLabel:"أسبوع",allDayText:"اليوم كله",eventLimitText:"أخرى",noEventsMessage:"أي أحداث لعرض"},{code:"ar-ma",week:{dow:6,doy:12},dir:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekLabel:"أسبوع",allDayText:"اليوم كله",eventLimitText:"أخرى",noEventsMessage:"أي أحداث لعرض"},{code:"ar-sa",week:{dow:0,doy:6},dir:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekLabel:"أسبوع",allDayText:"اليوم كله",eventLimitText:"أخرى",noEventsMessage:"أي أحداث لعرض"},{code:"ar-tn",week:{dow:1,doy:4},dir:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekLabel:"أسبوع",allDayText:"اليوم كله",eventLimitText:"أخرى",noEventsMessage:"أي أحداث لعرض"},{code:"ar",week:{dow:6,doy:12},dir:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekLabel:"أسبوع",allDayText:"اليوم كله",eventLimitText:"أخرى",noEventsMessage:"أي أحداث لعرض"},{code:"bg",week:{dow:1,doy:7},buttonText:{prev:"назад",next:"напред",today:"днес",month:"Месец",week:"Седмица",day:"Ден",list:"График"},allDayText:"Цял ден",eventLimitText:function(e){return"+още "+e},noEventsMessage:"Няма събития за показване"},{code:"bs",week:{dow:1,doy:7},buttonText:{prev:"Prošli",next:"Sljedeći",today:"Danas",month:"Mjesec",week:"Sedmica",day:"Dan",list:"Raspored"},weekLabel:"Sed",allDayText:"Cijeli dan",eventLimitText:function(e){return"+ još "+e},noEventsMessage:"Nema događaja za prikazivanje"},{code:"ca",week:{dow:1,doy:4},buttonText:{prev:"Anterior",next:"Següent",today:"Avui",month:"Mes",week:"Setmana",day:"Dia",list:"Agenda"},weekLabel:"Set",allDayText:"Tot el dia",eventLimitText:"més",noEventsMessage:"No hi ha esdeveniments per mostrar"},{code:"cs",week:{dow:1,doy:4},buttonText:{prev:"Dříve",next:"Později",today:"Nyní",month:"Měsíc",week:"Týden",day:"Den",list:"Agenda"},weekLabel:"Týd",allDayText:"Celý den",eventLimitText:function(e){return"+další: "+e},noEventsMessage:"Žádné akce k zobrazení"},{code:"da",week:{dow:1,doy:4},buttonText:{prev:"Forrige",next:"Næste",today:"I dag",month:"Måned",week:"Uge",day:"Dag",list:"Agenda"},weekLabel:"Uge",allDayText:"Hele dagen",eventLimitText:"flere",noEventsMessage:"Ingen arrangementer at vise"},{code:"de",week:{dow:1,doy:4},buttonText:{prev:"Zurück",next:"Vor",today:"Heute",year:"Jahr",month:"Monat",week:"Woche",day:"Tag",list:"Terminübersicht"},weekLabel:"KW",allDayText:"Ganztägig",eventLimitText:function(e){return"+ weitere "+e},noEventsMessage:"Keine Ereignisse anzuzeigen"},{code:"el",week:{dow:1,doy:4},buttonText:{prev:"Προηγούμενος",next:"Επόμενος",today:"Σήμερα",month:"Μήνας",week:"Εβδομάδα",day:"Ημέρα",list:"Ατζέντα"},weekLabel:"Εβδ",allDayText:"Ολοήμερο",eventLimitText:"περισσότερα",noEventsMessage:"Δεν υπάρχουν γεγονότα για να εμφανιστεί"},{code:"en-au",week:{dow:1,doy:4}},{code:"en-gb",week:{dow:1,doy:4}},{code:"en-nz",week:{dow:1,doy:4}},{code:"es",week:{dow:0,doy:6},buttonText:{prev:"Ant",next:"Sig",today:"Hoy",month:"Mes",week:"Semana",day:"Día",list:"Agenda"},weekLabel:"Sm",allDayHtml:"Todo<br/>el día",eventLimitText:"más",noEventsMessage:"No hay eventos para mostrar"},{code:"es",week:{dow:1,doy:4},buttonText:{prev:"Ant",next:"Sig",today:"Hoy",month:"Mes",week:"Semana",day:"Día",list:"Agenda"},weekLabel:"Sm",allDayHtml:"Todo<br/>el día",eventLimitText:"más",noEventsMessage:"No hay eventos para mostrar"},{code:"et",week:{dow:1,doy:4},buttonText:{prev:"Eelnev",next:"Järgnev",today:"Täna",month:"Kuu",week:"Nädal",day:"Päev",list:"Päevakord"},weekLabel:"näd",allDayText:"Kogu päev",eventLimitText:function(e){return"+ veel "+e},noEventsMessage:"Kuvamiseks puuduvad sündmused"},{code:"eu",week:{dow:1,doy:7},buttonText:{prev:"Aur",next:"Hur",today:"Gaur",month:"Hilabetea",week:"Astea",day:"Eguna",list:"Agenda"},weekLabel:"As",allDayHtml:"Egun<br/>osoa",eventLimitText:"gehiago",noEventsMessage:"Ez dago ekitaldirik erakusteko"},{code:"fa",week:{dow:6,doy:12},dir:"rtl",buttonText:{prev:"قبلی",next:"بعدی",today:"امروز",month:"ماه",week:"هفته",day:"روز",list:"برنامه"},weekLabel:"هف",allDayText:"تمام روز",eventLimitText:function(e){return"بیش از "+e},noEventsMessage:"هیچ رویدادی به نمایش"},{code:"fi",week:{dow:1,doy:4},buttonText:{prev:"Edellinen",next:"Seuraava",today:"Tänään",month:"Kuukausi",week:"Viikko",day:"Päivä",list:"Tapahtumat"},weekLabel:"Vk",allDayText:"Koko päivä",eventLimitText:"lisää",noEventsMessage:"Ei näytettäviä tapahtumia"},{code:"fr",buttonText:{prev:"Précédent",next:"Suivant",today:"Aujourd'hui",year:"Année",month:"Mois",week:"Semaine",day:"Jour",list:"Mon planning"},weekLabel:"Sem.",allDayHtml:"Toute la<br/>journée",eventLimitText:"en plus",noEventsMessage:"Aucun événement à afficher"},{code:"fr-ch",week:{dow:1,doy:4},buttonText:{prev:"Précédent",next:"Suivant",today:"Courant",year:"Année",month:"Mois",week:"Semaine",day:"Jour",list:"Mon planning"},weekLabel:"Sm",allDayHtml:"Toute la<br/>journée",eventLimitText:"en plus",noEventsMessage:"Aucun événement à afficher"},{code:"fr",week:{dow:1,doy:4},buttonText:{prev:"Précédent",next:"Suivant",today:"Aujourd'hui",year:"Année",month:"Mois",week:"Semaine",day:"Jour",list:"Mon planning"},weekLabel:"Sem.",allDayHtml:"Toute la<br/>journée",eventLimitText:"en plus",noEventsMessage:"Aucun événement à afficher"},{code:"gl",week:{dow:1,doy:4},buttonText:{prev:"Ant",next:"Seg",today:"Hoxe",month:"Mes",week:"Semana",day:"Día",list:"Axenda"},weekLabel:"Sm",allDayHtml:"Todo<br/>o día",eventLimitText:"máis",noEventsMessage:"Non hai eventos para amosar"},{code:"he",dir:"rtl",buttonText:{prev:"הקודם",next:"הבא",today:"היום",month:"חודש",week:"שבוע",day:"יום",list:"סדר יום"},allDayText:"כל היום",eventLimitText:"אחר",noEventsMessage:"אין אירועים להצגה",weekLabel:"שבוע"},{code:"hi",week:{dow:0,doy:6},buttonText:{prev:"पिछला",next:"अगला",today:"आज",month:"महीना",week:"सप्ताह",day:"दिन",list:"कार्यसूची"},weekLabel:"हफ्ता",allDayText:"सभी दिन",eventLimitText:function(e){return"+अधिक "+e},noEventsMessage:"कोई घटनाओं को प्रदर्शित करने के लिए"},{code:"hr",week:{dow:1,doy:7},buttonText:{prev:"Prijašnji",next:"Sljedeći",today:"Danas",month:"Mjesec",week:"Tjedan",day:"Dan",list:"Raspored"},weekLabel:"Tje",allDayText:"Cijeli dan",eventLimitText:function(e){return"+ još "+e},noEventsMessage:"Nema događaja za prikaz"},{code:"hu",week:{dow:1,doy:4},buttonText:{prev:"vissza",next:"előre",today:"ma",month:"Hónap",week:"Hét",day:"Nap",list:"Napló"},weekLabel:"Hét",allDayText:"Egész nap",eventLimitText:"további",noEventsMessage:"Nincs megjeleníthető esemény"},{code:"id",week:{dow:1,doy:7},buttonText:{prev:"mundur",next:"maju",today:"hari ini",month:"Bulan",week:"Minggu",day:"Hari",list:"Agenda"},weekLabel:"Mg",allDayHtml:"Sehari<br/>penuh",eventLimitText:"lebih",noEventsMessage:"Tidak ada acara untuk ditampilkan"},{code:"is",week:{dow:1,doy:4},buttonText:{prev:"Fyrri",next:"Næsti",today:"Í dag",month:"Mánuður",week:"Vika",day:"Dagur",list:"Dagskrá"},weekLabel:"Vika",allDayHtml:"Allan<br/>daginn",eventLimitText:"meira",noEventsMessage:"Engir viðburðir til að sýna"},{code:"it",week:{dow:1,doy:4},buttonText:{prev:"Prec",next:"Succ",today:"Oggi",month:"Mese",week:"Settimana",day:"Giorno",list:"Agenda"},weekLabel:"Sm",allDayHtml:"Tutto il<br/>giorno",eventLimitText:function(e){return"+altri "+e},noEventsMessage:"Non ci sono eventi da visualizzare"},{code:"ja",buttonText:{prev:"前",next:"次",today:"今日",month:"月",week:"週",day:"日",list:"予定リスト"},weekLabel:"週",allDayText:"終日",eventLimitText:function(e){return"他 "+e+" 件"},noEventsMessage:"表示する予定はありません"},{code:"ka",week:{dow:1,doy:7},buttonText:{prev:"წინა",next:"შემდეგი",today:"დღეს",month:"თვე",week:"კვირა",day:"დღე",list:"დღის წესრიგი"},weekLabel:"კვ",allDayText:"მთელი დღე",eventLimitText:function(e){return"+ კიდევ "+e},noEventsMessage:"ღონისძიებები არ არის"},{code:"kk",week:{dow:1,doy:7},buttonText:{prev:"Алдыңғы",next:"Келесі",today:"Бүгін",month:"Ай",week:"Апта",day:"Күн",list:"Күн тәртібі"},weekLabel:"Не",allDayText:"Күні бойы",eventLimitText:function(e){return"+ тағы "+e},noEventsMessage:"Көрсету үшін оқиғалар жоқ"},{code:"ko",buttonText:{prev:"이전달",next:"다음달",today:"오늘",month:"월",week:"주",day:"일",list:"일정목록"},weekLabel:"주",allDayText:"종일",eventLimitText:"개",noEventsMessage:"일정이 없습니다"},{code:"lb",week:{dow:1,doy:4},buttonText:{prev:"Zréck",next:"Weider",today:"Haut",month:"Mount",week:"Woch",day:"Dag",list:"Terminiwwersiicht"},weekLabel:"W",allDayText:"Ganzen Dag",eventLimitText:"méi",noEventsMessage:"Nee Evenementer ze affichéieren"},{code:"lt",week:{dow:1,doy:4},buttonText:{prev:"Atgal",next:"Pirmyn",today:"Šiandien",month:"Mėnuo",week:"Savaitė",day:"Diena",list:"Darbotvarkė"},weekLabel:"SAV",allDayText:"Visą dieną",eventLimitText:"daugiau",noEventsMessage:"Nėra įvykių rodyti"},{code:"lv",week:{dow:1,doy:4},buttonText:{prev:"Iepr.",next:"Nāk.",today:"Šodien",month:"Mēnesis",week:"Nedēļa",day:"Diena",list:"Dienas kārtība"},weekLabel:"Ned.",allDayText:"Visu dienu",eventLimitText:function(e){return"+vēl "+e},noEventsMessage:"Nav notikumu"},{code:"mk",buttonText:{prev:"претходно",next:"следно",today:"Денес",month:"Месец",week:"Недела",day:"Ден",list:"График"},weekLabel:"Сед",allDayText:"Цел ден",eventLimitText:function(e){return"+повеќе "+e},noEventsMessage:"Нема настани за прикажување"},{code:"ms",week:{dow:1,doy:7},buttonText:{prev:"Sebelum",next:"Selepas",today:"hari ini",month:"Bulan",week:"Minggu",day:"Hari",list:"Agenda"},weekLabel:"Mg",allDayText:"Sepanjang hari",eventLimitText:function(e){return"masih ada "+e+" acara"},noEventsMessage:"Tiada peristiwa untuk dipaparkan"},{code:"nb",week:{dow:1,doy:4},buttonText:{prev:"Forrige",next:"Neste",today:"I dag",month:"Måned",week:"Uke",day:"Dag",list:"Agenda"},weekLabel:"Uke",allDayText:"Hele dagen",eventLimitText:"til",noEventsMessage:"Ingen hendelser å vise"},{code:"nl",week:{dow:1,doy:4},buttonText:{prev:"Voorgaand",next:"Volgende",today:"Vandaag",year:"Jaar",month:"Maand",week:"Week",day:"Dag",list:"Agenda"},allDayText:"Hele dag",eventLimitText:"extra",noEventsMessage:"Geen evenementen om te laten zien"},{code:"nn",week:{dow:1,doy:4},buttonText:{prev:"Førre",next:"Neste",today:"I dag",month:"Månad",week:"Veke",day:"Dag",list:"Agenda"},weekLabel:"Veke",allDayText:"Heile dagen",eventLimitText:"til",noEventsMessage:"Ingen hendelser å vise"},{code:"pl",week:{dow:1,doy:4},buttonText:{prev:"Poprzedni",next:"Następny",today:"Dziś",month:"Miesiąc",week:"Tydzień",day:"Dzień",list:"Plan dnia"},weekLabel:"Tydz",allDayText:"Cały dzień",eventLimitText:"więcej",noEventsMessage:"Brak wydarzeń do wyświetlenia"},{code:"pt-br",buttonText:{prev:"Anterior",next:"Próximo",today:"Hoje",month:"Mês",week:"Semana",day:"Dia",list:"Compromissos"},weekLabel:"Sm",allDayText:"dia inteiro",eventLimitText:function(e){return"mais +"+e},noEventsMessage:"Não há eventos para mostrar"},{code:"pt",week:{dow:1,doy:4},buttonText:{prev:"Anterior",next:"Seguinte",today:"Hoje",month:"Mês",week:"Semana",day:"Dia",list:"Agenda"},weekLabel:"Sem",allDayText:"Todo o dia",eventLimitText:"mais",noEventsMessage:"Não há eventos para mostrar"},{code:"ro",week:{dow:1,doy:7},buttonText:{prev:"precedentă",next:"următoare",today:"Azi",month:"Lună",week:"Săptămână",day:"Zi",list:"Agendă"},weekLabel:"Săpt",allDayText:"Toată ziua",eventLimitText:function(e){return"+alte "+e},noEventsMessage:"Nu există evenimente de afișat"},{code:"ru",week:{dow:1,doy:4},buttonText:{prev:"Пред",next:"След",today:"Сегодня",month:"Месяц",week:"Неделя",day:"День",list:"Повестка дня"},weekLabel:"Нед",allDayText:"Весь день",eventLimitText:function(e){return"+ ещё "+e},noEventsMessage:"Нет событий для отображения"},{code:"sk",week:{dow:1,doy:4},buttonText:{prev:"Predchádzajúci",next:"Nasledujúci",today:"Dnes",month:"Mesiac",week:"Týždeň",day:"Deň",list:"Rozvrh"},weekLabel:"Ty",allDayText:"Celý deň",eventLimitText:function(e){return"+ďalšie: "+e},noEventsMessage:"Žiadne akcie na zobrazenie"},{code:"sl",week:{dow:1,doy:7},buttonText:{prev:"Prejšnji",next:"Naslednji",today:"Trenutni",month:"Mesec",week:"Teden",day:"Dan",list:"Dnevni red"},weekLabel:"Teden",allDayText:"Ves dan",eventLimitText:"več",noEventsMessage:"Ni dogodkov za prikaz"},{code:"sq",week:{dow:1,doy:4},buttonText:{prev:"mbrapa",next:"Përpara",today:"sot",month:"Muaj",week:"Javë",day:"Ditë",list:"Listë"},weekLabel:"Ja",allDayHtml:"Gjithë<br/>ditën",eventLimitText:function(e){return"+më tepër "+e},noEventsMessage:"Nuk ka evente për të shfaqur"},{code:"sr-cyrl",week:{dow:1,doy:7},buttonText:{prev:"Претходна",next:"следећи",today:"Данас",month:"Месец",week:"Недеља",day:"Дан",list:"Планер"},weekLabel:"Сед",allDayText:"Цео дан",eventLimitText:function(e){return"+ још "+e},noEventsMessage:"Нема догађаја за приказ"},{code:"sr",week:{dow:1,doy:7},buttonText:{prev:"Prethodna",next:"Sledeći",today:"Danas",month:"Mеsеc",week:"Nеdеlja",day:"Dan",list:"Planеr"},weekLabel:"Sed",allDayText:"Cеo dan",eventLimitText:function(e){return"+ još "+e},noEventsMessage:"Nеma događaja za prikaz"},{code:"sv",week:{dow:1,doy:4},buttonText:{prev:"Förra",next:"Nästa",today:"Idag",month:"Månad",week:"Vecka",day:"Dag",list:"Program"},weekLabel:"v.",allDayText:"Heldag",eventLimitText:"till",noEventsMessage:"Inga händelser att visa"},{code:"th",buttonText:{prev:"ย้อน",next:"ถัดไป",today:"วันนี้",month:"เดือน",week:"สัปดาห์",day:"วัน",list:"แผนงาน"},allDayText:"ตลอดวัน",eventLimitText:"เพิ่มเติม",noEventsMessage:"ไม่มีกิจกรรมที่จะแสดง"},{code:"tr",week:{dow:1,doy:7},buttonText:{prev:"geri",next:"ileri",today:"bugün",month:"Ay",week:"Hafta",day:"Gün",list:"Ajanda"},weekLabel:"Hf",allDayText:"Tüm gün",eventLimitText:"daha fazla",noEventsMessage:"Gösterilecek etkinlik yok"},{code:"uk",week:{dow:1,doy:7},buttonText:{prev:"Попередній",next:"далі",today:"Сьогодні",month:"Місяць",week:"Тиждень",day:"День",list:"Порядок денний"},weekLabel:"Тиж",allDayText:"Увесь день",eventLimitText:function(e){return"+ще "+e+"..."},noEventsMessage:"Немає подій для відображення"},{code:"vi",week:{dow:1,doy:4},buttonText:{prev:"Trước",next:"Tiếp",today:"Hôm nay",month:"Tháng",week:"Tuần",day:"Ngày",list:"Lịch biểu"},weekLabel:"Tu",allDayText:"Cả ngày",eventLimitText:function(e){return"+ thêm "+e},noEventsMessage:"Không có sự kiện để hiển thị"},{code:"zh-cn",week:{dow:1,doy:4},buttonText:{prev:"上月",next:"下月",today:"今天",month:"月",week:"周",day:"日",list:"日程"},weekLabel:"周",allDayText:"全天",eventLimitText:function(e){return"另外 "+e+" 个"},noEventsMessage:"没有事件显示"},{code:"zh-tw",buttonText:{prev:"上月",next:"下月",today:"今天",month:"月",week:"週",day:"天",list:"活動列表"},weekLabel:"周",allDayText:"整天",eventLimitText:"顯示更多",noEventsMessage:"没有任何活動"}]});
\ No newline at end of file
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/af.js b/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/af.js
deleted file mode 100644
index ee9f9f747565c255303f52e9dccfc9289ef3ca28..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/af.js
+++ /dev/null
@@ -1,30 +0,0 @@
-(function (global, factory) {
-    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
-    typeof define === 'function' && define.amd ? define(factory) :
-    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.af = factory()));
-}(this, function () { 'use strict';
-
-    var af = {
-        code: "af",
-        week: {
-            dow: 1,
-            doy: 4 // Die week wat die 4de Januarie bevat is die eerste week van die jaar.
-        },
-        buttonText: {
-            prev: "Vorige",
-            next: "Volgende",
-            today: "Vandag",
-            year: "Jaar",
-            month: "Maand",
-            week: "Week",
-            day: "Dag",
-            list: "Agenda"
-        },
-        allDayHtml: "Heeldag",
-        eventLimitText: "Addisionele",
-        noEventsMessage: "Daar is geen gebeurtenisse nie"
-    };
-
-    return af;
-
-}));
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/ar-dz.js b/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/ar-dz.js
deleted file mode 100644
index 201eb171ae6e5389fe8b7346b27772d6aa8a206d..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/ar-dz.js
+++ /dev/null
@@ -1,31 +0,0 @@
-(function (global, factory) {
-    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
-    typeof define === 'function' && define.amd ? define(factory) :
-    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['ar-dz'] = factory()));
-}(this, function () { 'use strict';
-
-    var arDz = {
-        code: "ar-dz",
-        week: {
-            dow: 0,
-            doy: 4 // The week that contains Jan 1st is the first week of the year.
-        },
-        dir: 'rtl',
-        buttonText: {
-            prev: "السابق",
-            next: "التالي",
-            today: "اليوم",
-            month: "شهر",
-            week: "أسبوع",
-            day: "يوم",
-            list: "أجندة"
-        },
-        weekLabel: "أسبوع",
-        allDayText: "اليوم كله",
-        eventLimitText: "أخرى",
-        noEventsMessage: "أي أحداث لعرض"
-    };
-
-    return arDz;
-
-}));
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/ar-kw.js b/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/ar-kw.js
deleted file mode 100644
index 94c69001466ed1ab9015465bb6e321081e469c1b..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/ar-kw.js
+++ /dev/null
@@ -1,31 +0,0 @@
-(function (global, factory) {
-    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
-    typeof define === 'function' && define.amd ? define(factory) :
-    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['ar-kw'] = factory()));
-}(this, function () { 'use strict';
-
-    var arKw = {
-        code: "ar-kw",
-        week: {
-            dow: 0,
-            doy: 12 // The week that contains Jan 1st is the first week of the year.
-        },
-        dir: 'rtl',
-        buttonText: {
-            prev: "السابق",
-            next: "التالي",
-            today: "اليوم",
-            month: "شهر",
-            week: "أسبوع",
-            day: "يوم",
-            list: "أجندة"
-        },
-        weekLabel: "أسبوع",
-        allDayText: "اليوم كله",
-        eventLimitText: "أخرى",
-        noEventsMessage: "أي أحداث لعرض"
-    };
-
-    return arKw;
-
-}));
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/ar-ly.js b/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/ar-ly.js
deleted file mode 100644
index e1c8aeb07bc9f33e677b5c13b1635cdc4171e310..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/ar-ly.js
+++ /dev/null
@@ -1,31 +0,0 @@
-(function (global, factory) {
-    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
-    typeof define === 'function' && define.amd ? define(factory) :
-    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['ar-ly'] = factory()));
-}(this, function () { 'use strict';
-
-    var arLy = {
-        code: "ar-ly",
-        week: {
-            dow: 6,
-            doy: 12 // The week that contains Jan 1st is the first week of the year.
-        },
-        dir: 'rtl',
-        buttonText: {
-            prev: "السابق",
-            next: "التالي",
-            today: "اليوم",
-            month: "شهر",
-            week: "أسبوع",
-            day: "يوم",
-            list: "أجندة"
-        },
-        weekLabel: "أسبوع",
-        allDayText: "اليوم كله",
-        eventLimitText: "أخرى",
-        noEventsMessage: "أي أحداث لعرض"
-    };
-
-    return arLy;
-
-}));
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/ar-ma.js b/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/ar-ma.js
deleted file mode 100644
index 00cc7c6790623c99ae60112d6916b3139fa81833..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/ar-ma.js
+++ /dev/null
@@ -1,31 +0,0 @@
-(function (global, factory) {
-    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
-    typeof define === 'function' && define.amd ? define(factory) :
-    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['ar-ma'] = factory()));
-}(this, function () { 'use strict';
-
-    var arMa = {
-        code: "ar-ma",
-        week: {
-            dow: 6,
-            doy: 12 // The week that contains Jan 1st is the first week of the year.
-        },
-        dir: 'rtl',
-        buttonText: {
-            prev: "السابق",
-            next: "التالي",
-            today: "اليوم",
-            month: "شهر",
-            week: "أسبوع",
-            day: "يوم",
-            list: "أجندة"
-        },
-        weekLabel: "أسبوع",
-        allDayText: "اليوم كله",
-        eventLimitText: "أخرى",
-        noEventsMessage: "أي أحداث لعرض"
-    };
-
-    return arMa;
-
-}));
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/ar-sa.js b/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/ar-sa.js
deleted file mode 100644
index 0361f6d87019a7e70570ff915c8195440ed3b904..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/ar-sa.js
+++ /dev/null
@@ -1,31 +0,0 @@
-(function (global, factory) {
-    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
-    typeof define === 'function' && define.amd ? define(factory) :
-    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['ar-sa'] = factory()));
-}(this, function () { 'use strict';
-
-    var arSa = {
-        code: "ar-sa",
-        week: {
-            dow: 0,
-            doy: 6 // The week that contains Jan 1st is the first week of the year.
-        },
-        dir: 'rtl',
-        buttonText: {
-            prev: "السابق",
-            next: "التالي",
-            today: "اليوم",
-            month: "شهر",
-            week: "أسبوع",
-            day: "يوم",
-            list: "أجندة"
-        },
-        weekLabel: "أسبوع",
-        allDayText: "اليوم كله",
-        eventLimitText: "أخرى",
-        noEventsMessage: "أي أحداث لعرض"
-    };
-
-    return arSa;
-
-}));
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/ar-tn.js b/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/ar-tn.js
deleted file mode 100644
index 57a07f8f5141d4b52d1dcfb3a543b5f6b652706c..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/ar-tn.js
+++ /dev/null
@@ -1,31 +0,0 @@
-(function (global, factory) {
-    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
-    typeof define === 'function' && define.amd ? define(factory) :
-    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['ar-tn'] = factory()));
-}(this, function () { 'use strict';
-
-    var arTn = {
-        code: "ar-tn",
-        week: {
-            dow: 1,
-            doy: 4 // The week that contains Jan 4th is the first week of the year.
-        },
-        dir: 'rtl',
-        buttonText: {
-            prev: "السابق",
-            next: "التالي",
-            today: "اليوم",
-            month: "شهر",
-            week: "أسبوع",
-            day: "يوم",
-            list: "أجندة"
-        },
-        weekLabel: "أسبوع",
-        allDayText: "اليوم كله",
-        eventLimitText: "أخرى",
-        noEventsMessage: "أي أحداث لعرض"
-    };
-
-    return arTn;
-
-}));
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/ar.js b/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/ar.js
deleted file mode 100644
index f789afd151e9ef50c4ec1ca04237011a1b0cab56..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/ar.js
+++ /dev/null
@@ -1,31 +0,0 @@
-(function (global, factory) {
-    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
-    typeof define === 'function' && define.amd ? define(factory) :
-    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.ar = factory()));
-}(this, function () { 'use strict';
-
-    var ar = {
-        code: "ar",
-        week: {
-            dow: 6,
-            doy: 12 // The week that contains Jan 1st is the first week of the year.
-        },
-        dir: 'rtl',
-        buttonText: {
-            prev: "السابق",
-            next: "التالي",
-            today: "اليوم",
-            month: "شهر",
-            week: "أسبوع",
-            day: "يوم",
-            list: "أجندة"
-        },
-        weekLabel: "أسبوع",
-        allDayText: "اليوم كله",
-        eventLimitText: "أخرى",
-        noEventsMessage: "أي أحداث لعرض"
-    };
-
-    return ar;
-
-}));
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/bg.js b/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/bg.js
deleted file mode 100644
index e7343a6c5ab768bf9b51e52e8244bb9a6b5c79b2..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/bg.js
+++ /dev/null
@@ -1,31 +0,0 @@
-(function (global, factory) {
-    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
-    typeof define === 'function' && define.amd ? define(factory) :
-    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.bg = factory()));
-}(this, function () { 'use strict';
-
-    var bg = {
-        code: "bg",
-        week: {
-            dow: 1,
-            doy: 7 // The week that contains Jan 1st is the first week of the year.
-        },
-        buttonText: {
-            prev: "назад",
-            next: "напред",
-            today: "днес",
-            month: "Месец",
-            week: "Седмица",
-            day: "Ден",
-            list: "График"
-        },
-        allDayText: "Цял ден",
-        eventLimitText: function (n) {
-            return "+още " + n;
-        },
-        noEventsMessage: "Няма събития за показване"
-    };
-
-    return bg;
-
-}));
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/bs.js b/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/bs.js
deleted file mode 100644
index d96b8adb3d968a1d96ebf5f57a5c6feac3d066f1..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/bs.js
+++ /dev/null
@@ -1,32 +0,0 @@
-(function (global, factory) {
-    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
-    typeof define === 'function' && define.amd ? define(factory) :
-    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.bs = factory()));
-}(this, function () { 'use strict';
-
-    var bs = {
-        code: "bs",
-        week: {
-            dow: 1,
-            doy: 7 // The week that contains Jan 1st is the first week of the year.
-        },
-        buttonText: {
-            prev: "Prošli",
-            next: "Sljedeći",
-            today: "Danas",
-            month: "Mjesec",
-            week: "Sedmica",
-            day: "Dan",
-            list: "Raspored"
-        },
-        weekLabel: "Sed",
-        allDayText: "Cijeli dan",
-        eventLimitText: function (n) {
-            return "+ još " + n;
-        },
-        noEventsMessage: "Nema događaja za prikazivanje"
-    };
-
-    return bs;
-
-}));
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/ca.js b/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/ca.js
deleted file mode 100644
index d2d3e2aa770888d3cb4cff6720c406459f24430f..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/ca.js
+++ /dev/null
@@ -1,30 +0,0 @@
-(function (global, factory) {
-    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
-    typeof define === 'function' && define.amd ? define(factory) :
-    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.ca = factory()));
-}(this, function () { 'use strict';
-
-    var ca = {
-        code: "ca",
-        week: {
-            dow: 1,
-            doy: 4 // The week that contains Jan 4th is the first week of the year.
-        },
-        buttonText: {
-            prev: "Anterior",
-            next: "Següent",
-            today: "Avui",
-            month: "Mes",
-            week: "Setmana",
-            day: "Dia",
-            list: "Agenda"
-        },
-        weekLabel: "Set",
-        allDayText: "Tot el dia",
-        eventLimitText: "més",
-        noEventsMessage: "No hi ha esdeveniments per mostrar"
-    };
-
-    return ca;
-
-}));
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/cs.js b/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/cs.js
deleted file mode 100644
index 2624e3607df8084c022c63728427d984af24efa6..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/cs.js
+++ /dev/null
@@ -1,32 +0,0 @@
-(function (global, factory) {
-    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
-    typeof define === 'function' && define.amd ? define(factory) :
-    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.cs = factory()));
-}(this, function () { 'use strict';
-
-    var cs = {
-        code: "cs",
-        week: {
-            dow: 1,
-            doy: 4 // The week that contains Jan 4th is the first week of the year.
-        },
-        buttonText: {
-            prev: "Dříve",
-            next: "Později",
-            today: "Nyní",
-            month: "Měsíc",
-            week: "Týden",
-            day: "Den",
-            list: "Agenda"
-        },
-        weekLabel: "Týd",
-        allDayText: "Celý den",
-        eventLimitText: function (n) {
-            return "+další: " + n;
-        },
-        noEventsMessage: "Žádné akce k zobrazení"
-    };
-
-    return cs;
-
-}));
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/da.js b/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/da.js
deleted file mode 100644
index 73d15592990f86bb6ad876930269878a7b9d1ac4..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/da.js
+++ /dev/null
@@ -1,30 +0,0 @@
-(function (global, factory) {
-    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
-    typeof define === 'function' && define.amd ? define(factory) :
-    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.da = factory()));
-}(this, function () { 'use strict';
-
-    var da = {
-        code: "da",
-        week: {
-            dow: 1,
-            doy: 4 // The week that contains Jan 4th is the first week of the year.
-        },
-        buttonText: {
-            prev: "Forrige",
-            next: "Næste",
-            today: "I dag",
-            month: "MÃ¥ned",
-            week: "Uge",
-            day: "Dag",
-            list: "Agenda"
-        },
-        weekLabel: "Uge",
-        allDayText: "Hele dagen",
-        eventLimitText: "flere",
-        noEventsMessage: "Ingen arrangementer at vise"
-    };
-
-    return da;
-
-}));
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/de.js b/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/de.js
deleted file mode 100644
index ab5a815a0cc563a14aa42f8418226e747afb391c..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/de.js
+++ /dev/null
@@ -1,33 +0,0 @@
-(function (global, factory) {
-    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
-    typeof define === 'function' && define.amd ? define(factory) :
-    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.de = factory()));
-}(this, function () { 'use strict';
-
-    var de = {
-        code: "de",
-        week: {
-            dow: 1,
-            doy: 4 // The week that contains Jan 4th is the first week of the year.
-        },
-        buttonText: {
-            prev: "Zurück",
-            next: "Vor",
-            today: "Heute",
-            year: "Jahr",
-            month: "Monat",
-            week: "Woche",
-            day: "Tag",
-            list: "Terminübersicht"
-        },
-        weekLabel: "KW",
-        allDayText: "Ganztägig",
-        eventLimitText: function (n) {
-            return "+ weitere " + n;
-        },
-        noEventsMessage: "Keine Ereignisse anzuzeigen"
-    };
-
-    return de;
-
-}));
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/el.js b/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/el.js
deleted file mode 100644
index 9f59e365710e411cf2504b91bbd207fecfe2037f..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/el.js
+++ /dev/null
@@ -1,30 +0,0 @@
-(function (global, factory) {
-    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
-    typeof define === 'function' && define.amd ? define(factory) :
-    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.el = factory()));
-}(this, function () { 'use strict';
-
-    var el = {
-        code: "el",
-        week: {
-            dow: 1,
-            doy: 4 // The week that contains Jan 4st is the first week of the year.
-        },
-        buttonText: {
-            prev: "Προηγούμενος",
-            next: "Επόμενος",
-            today: "Σήμερα",
-            month: "Μήνας",
-            week: "Εβδομάδα",
-            day: "Ημέρα",
-            list: "Ατζέντα"
-        },
-        weekLabel: "Εβδ",
-        allDayText: "Ολοήμερο",
-        eventLimitText: "περισσότερα",
-        noEventsMessage: "Δεν υπάρχουν γεγονότα για να εμφανιστεί"
-    };
-
-    return el;
-
-}));
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/en-au.js b/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/en-au.js
deleted file mode 100644
index be10bfb66eaa30b3cbcf29cda459e5208615e87d..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/en-au.js
+++ /dev/null
@@ -1,17 +0,0 @@
-(function (global, factory) {
-    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
-    typeof define === 'function' && define.amd ? define(factory) :
-    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['en-au'] = factory()));
-}(this, function () { 'use strict';
-
-    var enAu = {
-        code: "en-au",
-        week: {
-            dow: 1,
-            doy: 4 // The week that contains Jan 4th is the first week of the year.
-        }
-    };
-
-    return enAu;
-
-}));
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/en-gb.js b/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/en-gb.js
deleted file mode 100644
index 8a4a84e6b427a53aad4bd6e1561c8532df49aa4e..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/en-gb.js
+++ /dev/null
@@ -1,17 +0,0 @@
-(function (global, factory) {
-    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
-    typeof define === 'function' && define.amd ? define(factory) :
-    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['en-gb'] = factory()));
-}(this, function () { 'use strict';
-
-    var enGb = {
-        code: "en-gb",
-        week: {
-            dow: 1,
-            doy: 4 // The week that contains Jan 4th is the first week of the year.
-        }
-    };
-
-    return enGb;
-
-}));
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/en-nz.js b/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/en-nz.js
deleted file mode 100644
index df56c14550693aae4c3c71cae266741fd0196ce1..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/en-nz.js
+++ /dev/null
@@ -1,17 +0,0 @@
-(function (global, factory) {
-    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
-    typeof define === 'function' && define.amd ? define(factory) :
-    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['en-nz'] = factory()));
-}(this, function () { 'use strict';
-
-    var enNz = {
-        code: "en-nz",
-        week: {
-            dow: 1,
-            doy: 4 // The week that contains Jan 4th is the first week of the year.
-        }
-    };
-
-    return enNz;
-
-}));
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/es-us.js b/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/es-us.js
deleted file mode 100644
index 1efa89a4d1869a71c71f58cdadc746ed9dc6c8d2..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/es-us.js
+++ /dev/null
@@ -1,30 +0,0 @@
-(function (global, factory) {
-    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
-    typeof define === 'function' && define.amd ? define(factory) :
-    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['es-us'] = factory()));
-}(this, function () { 'use strict';
-
-    var esUs = {
-        code: "es",
-        week: {
-            dow: 0,
-            doy: 6 // The week that contains Jan 1st is the first week of the year.
-        },
-        buttonText: {
-            prev: "Ant",
-            next: "Sig",
-            today: "Hoy",
-            month: "Mes",
-            week: "Semana",
-            day: "Día",
-            list: "Agenda"
-        },
-        weekLabel: "Sm",
-        allDayHtml: "Todo<br/>el día",
-        eventLimitText: "más",
-        noEventsMessage: "No hay eventos para mostrar"
-    };
-
-    return esUs;
-
-}));
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/es.js b/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/es.js
deleted file mode 100644
index bfd9af4c626fc8f7ef5a9bd1305c36da42ac6e4e..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/es.js
+++ /dev/null
@@ -1,30 +0,0 @@
-(function (global, factory) {
-    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
-    typeof define === 'function' && define.amd ? define(factory) :
-    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.es = factory()));
-}(this, function () { 'use strict';
-
-    var es = {
-        code: "es",
-        week: {
-            dow: 1,
-            doy: 4 // The week that contains Jan 4th is the first week of the year.
-        },
-        buttonText: {
-            prev: "Ant",
-            next: "Sig",
-            today: "Hoy",
-            month: "Mes",
-            week: "Semana",
-            day: "Día",
-            list: "Agenda"
-        },
-        weekLabel: "Sm",
-        allDayHtml: "Todo<br/>el día",
-        eventLimitText: "más",
-        noEventsMessage: "No hay eventos para mostrar"
-    };
-
-    return es;
-
-}));
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/et.js b/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/et.js
deleted file mode 100644
index c44fcaec9e5f84d26b92279eca746b67898fa420..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/et.js
+++ /dev/null
@@ -1,32 +0,0 @@
-(function (global, factory) {
-    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
-    typeof define === 'function' && define.amd ? define(factory) :
-    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.et = factory()));
-}(this, function () { 'use strict';
-
-    var et = {
-        code: "et",
-        week: {
-            dow: 1,
-            doy: 4 // The week that contains Jan 4th is the first week of the year.
-        },
-        buttonText: {
-            prev: "Eelnev",
-            next: "Järgnev",
-            today: "Täna",
-            month: "Kuu",
-            week: "Nädal",
-            day: "Päev",
-            list: "Päevakord"
-        },
-        weekLabel: "näd",
-        allDayText: "Kogu päev",
-        eventLimitText: function (n) {
-            return "+ veel " + n;
-        },
-        noEventsMessage: "Kuvamiseks puuduvad sündmused"
-    };
-
-    return et;
-
-}));
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/eu.js b/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/eu.js
deleted file mode 100644
index 91903aaaf172765aeea87daca1d9b78c49173613..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/eu.js
+++ /dev/null
@@ -1,30 +0,0 @@
-(function (global, factory) {
-    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
-    typeof define === 'function' && define.amd ? define(factory) :
-    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.eu = factory()));
-}(this, function () { 'use strict';
-
-    var eu = {
-        code: "eu",
-        week: {
-            dow: 1,
-            doy: 7 // The week that contains Jan 1st is the first week of the year.
-        },
-        buttonText: {
-            prev: "Aur",
-            next: "Hur",
-            today: "Gaur",
-            month: "Hilabetea",
-            week: "Astea",
-            day: "Eguna",
-            list: "Agenda"
-        },
-        weekLabel: "As",
-        allDayHtml: "Egun<br/>osoa",
-        eventLimitText: "gehiago",
-        noEventsMessage: "Ez dago ekitaldirik erakusteko"
-    };
-
-    return eu;
-
-}));
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/fa.js b/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/fa.js
deleted file mode 100644
index 031fc7b304f8aaf6809fe3111a56af55d7d92cad..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/fa.js
+++ /dev/null
@@ -1,33 +0,0 @@
-(function (global, factory) {
-    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
-    typeof define === 'function' && define.amd ? define(factory) :
-    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.fa = factory()));
-}(this, function () { 'use strict';
-
-    var fa = {
-        code: "fa",
-        week: {
-            dow: 6,
-            doy: 12 // The week that contains Jan 1st is the first week of the year.
-        },
-        dir: 'rtl',
-        buttonText: {
-            prev: "قبلی",
-            next: "بعدی",
-            today: "امروز",
-            month: "ماه",
-            week: "هفته",
-            day: "روز",
-            list: "برنامه"
-        },
-        weekLabel: "هف",
-        allDayText: "تمام روز",
-        eventLimitText: function (n) {
-            return "بیش از " + n;
-        },
-        noEventsMessage: "هیچ رویدادی به نمایش"
-    };
-
-    return fa;
-
-}));
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/fi.js b/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/fi.js
deleted file mode 100644
index 3912845cf75a152bbe7e8f55b8fc474ef9c60207..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/fi.js
+++ /dev/null
@@ -1,30 +0,0 @@
-(function (global, factory) {
-    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
-    typeof define === 'function' && define.amd ? define(factory) :
-    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.fi = factory()));
-}(this, function () { 'use strict';
-
-    var fi = {
-        code: "fi",
-        week: {
-            dow: 1,
-            doy: 4 // The week that contains Jan 4th is the first week of the year.
-        },
-        buttonText: {
-            prev: "Edellinen",
-            next: "Seuraava",
-            today: "Tänään",
-            month: "Kuukausi",
-            week: "Viikko",
-            day: "Päivä",
-            list: "Tapahtumat"
-        },
-        weekLabel: "Vk",
-        allDayText: "Koko päivä",
-        eventLimitText: "lisää",
-        noEventsMessage: "Ei näytettäviä tapahtumia"
-    };
-
-    return fi;
-
-}));
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/fr-ca.js b/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/fr-ca.js
deleted file mode 100644
index d554c1408f831109daf5ed42cb5d9b1ba3eb3cbf..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/fr-ca.js
+++ /dev/null
@@ -1,27 +0,0 @@
-(function (global, factory) {
-    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
-    typeof define === 'function' && define.amd ? define(factory) :
-    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['fr-ca'] = factory()));
-}(this, function () { 'use strict';
-
-    var frCa = {
-        code: "fr",
-        buttonText: {
-            prev: "Précédent",
-            next: "Suivant",
-            today: "Aujourd'hui",
-            year: "Année",
-            month: "Mois",
-            week: "Semaine",
-            day: "Jour",
-            list: "Mon planning"
-        },
-        weekLabel: "Sem.",
-        allDayHtml: "Toute la<br/>journée",
-        eventLimitText: "en plus",
-        noEventsMessage: "Aucun événement à afficher"
-    };
-
-    return frCa;
-
-}));
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/fr-ch.js b/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/fr-ch.js
deleted file mode 100644
index 358b8bf311a15e7909bc8e91e5a28d577a0c2970..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/fr-ch.js
+++ /dev/null
@@ -1,31 +0,0 @@
-(function (global, factory) {
-    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
-    typeof define === 'function' && define.amd ? define(factory) :
-    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['fr-ch'] = factory()));
-}(this, function () { 'use strict';
-
-    var frCh = {
-        code: "fr-ch",
-        week: {
-            dow: 1,
-            doy: 4 // The week that contains Jan 4th is the first week of the year.
-        },
-        buttonText: {
-            prev: "Précédent",
-            next: "Suivant",
-            today: "Courant",
-            year: "Année",
-            month: "Mois",
-            week: "Semaine",
-            day: "Jour",
-            list: "Mon planning"
-        },
-        weekLabel: "Sm",
-        allDayHtml: "Toute la<br/>journée",
-        eventLimitText: "en plus",
-        noEventsMessage: "Aucun événement à afficher"
-    };
-
-    return frCh;
-
-}));
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/fr.js b/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/fr.js
deleted file mode 100644
index b679ceffde6d7762c44833a10a92e6cf3e8ca0c7..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/fr.js
+++ /dev/null
@@ -1,31 +0,0 @@
-(function (global, factory) {
-    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
-    typeof define === 'function' && define.amd ? define(factory) :
-    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.fr = factory()));
-}(this, function () { 'use strict';
-
-    var fr = {
-        code: "fr",
-        week: {
-            dow: 1,
-            doy: 4 // The week that contains Jan 4th is the first week of the year.
-        },
-        buttonText: {
-            prev: "Précédent",
-            next: "Suivant",
-            today: "Aujourd'hui",
-            year: "Année",
-            month: "Mois",
-            week: "Semaine",
-            day: "Jour",
-            list: "Mon planning"
-        },
-        weekLabel: "Sem.",
-        allDayHtml: "Toute la<br/>journée",
-        eventLimitText: "en plus",
-        noEventsMessage: "Aucun événement à afficher"
-    };
-
-    return fr;
-
-}));
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/gl.js b/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/gl.js
deleted file mode 100644
index 721a6a89b255be548592ece3c3bf8575280fbe1a..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/gl.js
+++ /dev/null
@@ -1,30 +0,0 @@
-(function (global, factory) {
-    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
-    typeof define === 'function' && define.amd ? define(factory) :
-    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.gl = factory()));
-}(this, function () { 'use strict';
-
-    var gl = {
-        code: "gl",
-        week: {
-            dow: 1,
-            doy: 4 // The week that contains Jan 4th is the first week of the year.
-        },
-        buttonText: {
-            prev: "Ant",
-            next: "Seg",
-            today: "Hoxe",
-            month: "Mes",
-            week: "Semana",
-            day: "Día",
-            list: "Axenda"
-        },
-        weekLabel: "Sm",
-        allDayHtml: "Todo<br/>o día",
-        eventLimitText: "máis",
-        noEventsMessage: "Non hai eventos para amosar"
-    };
-
-    return gl;
-
-}));
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/he.js b/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/he.js
deleted file mode 100644
index 3521d9e335b054c12aa7e0e01818d9198df04385..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/he.js
+++ /dev/null
@@ -1,27 +0,0 @@
-(function (global, factory) {
-    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
-    typeof define === 'function' && define.amd ? define(factory) :
-    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.he = factory()));
-}(this, function () { 'use strict';
-
-    var he = {
-        code: "he",
-        dir: 'rtl',
-        buttonText: {
-            prev: "הקודם",
-            next: "הבא",
-            today: "היום",
-            month: "חודש",
-            week: "שבוע",
-            day: "יום",
-            list: "סדר יום"
-        },
-        allDayText: "כל היום",
-        eventLimitText: "אחר",
-        noEventsMessage: "אין אירועים להצגה",
-        weekLabel: "שבוע"
-    };
-
-    return he;
-
-}));
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/hi.js b/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/hi.js
deleted file mode 100644
index 15348e697f75cb9a253b7f4c7c81dc965dcf12f2..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/hi.js
+++ /dev/null
@@ -1,32 +0,0 @@
-(function (global, factory) {
-    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
-    typeof define === 'function' && define.amd ? define(factory) :
-    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.hi = factory()));
-}(this, function () { 'use strict';
-
-    var hi = {
-        code: "hi",
-        week: {
-            dow: 0,
-            doy: 6 // The week that contains Jan 1st is the first week of the year.
-        },
-        buttonText: {
-            prev: "पिछला",
-            next: "अगला",
-            today: "आज",
-            month: "महीना",
-            week: "सप्ताह",
-            day: "दिन",
-            list: "कार्यसूची"
-        },
-        weekLabel: "हफ्ता",
-        allDayText: "सभी दिन",
-        eventLimitText: function (n) {
-            return "+अधिक " + n;
-        },
-        noEventsMessage: "कोई घटनाओं को प्रदर्शित करने के लिए"
-    };
-
-    return hi;
-
-}));
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/hr.js b/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/hr.js
deleted file mode 100644
index 295b4856634c26ec097b1c3035cedccc10ae9b2d..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/hr.js
+++ /dev/null
@@ -1,32 +0,0 @@
-(function (global, factory) {
-    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
-    typeof define === 'function' && define.amd ? define(factory) :
-    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.hr = factory()));
-}(this, function () { 'use strict';
-
-    var hr = {
-        code: "hr",
-        week: {
-            dow: 1,
-            doy: 7 // The week that contains Jan 1st is the first week of the year.
-        },
-        buttonText: {
-            prev: "Prijašnji",
-            next: "Sljedeći",
-            today: "Danas",
-            month: "Mjesec",
-            week: "Tjedan",
-            day: "Dan",
-            list: "Raspored"
-        },
-        weekLabel: "Tje",
-        allDayText: "Cijeli dan",
-        eventLimitText: function (n) {
-            return "+ još " + n;
-        },
-        noEventsMessage: "Nema događaja za prikaz"
-    };
-
-    return hr;
-
-}));
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/hu.js b/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/hu.js
deleted file mode 100644
index 2f0fe8acb6b9c700cac825790844ccb4898dd2ec..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/hu.js
+++ /dev/null
@@ -1,30 +0,0 @@
-(function (global, factory) {
-    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
-    typeof define === 'function' && define.amd ? define(factory) :
-    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.hu = factory()));
-}(this, function () { 'use strict';
-
-    var hu = {
-        code: "hu",
-        week: {
-            dow: 1,
-            doy: 4 // The week that contains Jan 4th is the first week of the year.
-        },
-        buttonText: {
-            prev: "vissza",
-            next: "előre",
-            today: "ma",
-            month: "Hónap",
-            week: "Hét",
-            day: "Nap",
-            list: "Napló"
-        },
-        weekLabel: "Hét",
-        allDayText: "Egész nap",
-        eventLimitText: "további",
-        noEventsMessage: "Nincs megjeleníthető esemény"
-    };
-
-    return hu;
-
-}));
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/id.js b/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/id.js
deleted file mode 100644
index b742e80dda7d6c2b80b2e75de4806edb4beeb53f..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/id.js
+++ /dev/null
@@ -1,30 +0,0 @@
-(function (global, factory) {
-    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
-    typeof define === 'function' && define.amd ? define(factory) :
-    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.id = factory()));
-}(this, function () { 'use strict';
-
-    var id = {
-        code: "id",
-        week: {
-            dow: 1,
-            doy: 7 // The week that contains Jan 1st is the first week of the year.
-        },
-        buttonText: {
-            prev: "mundur",
-            next: "maju",
-            today: "hari ini",
-            month: "Bulan",
-            week: "Minggu",
-            day: "Hari",
-            list: "Agenda"
-        },
-        weekLabel: "Mg",
-        allDayHtml: "Sehari<br/>penuh",
-        eventLimitText: "lebih",
-        noEventsMessage: "Tidak ada acara untuk ditampilkan"
-    };
-
-    return id;
-
-}));
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/is.js b/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/is.js
deleted file mode 100644
index dd569bce72f55bd97ee39860a758ef549206af6e..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/is.js
+++ /dev/null
@@ -1,30 +0,0 @@
-(function (global, factory) {
-    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
-    typeof define === 'function' && define.amd ? define(factory) :
-    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.is = factory()));
-}(this, function () { 'use strict';
-
-    var is = {
-        code: "is",
-        week: {
-            dow: 1,
-            doy: 4 // The week that contains Jan 4th is the first week of the year.
-        },
-        buttonText: {
-            prev: "Fyrri",
-            next: "Næsti",
-            today: "Í dag",
-            month: "Mánuður",
-            week: "Vika",
-            day: "Dagur",
-            list: "Dagskrá"
-        },
-        weekLabel: "Vika",
-        allDayHtml: "Allan<br/>daginn",
-        eventLimitText: "meira",
-        noEventsMessage: "Engir viðburðir til að sýna"
-    };
-
-    return is;
-
-}));
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/it.js b/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/it.js
deleted file mode 100644
index 39a2829e5221a84a912d2e617111f36348475d0b..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/it.js
+++ /dev/null
@@ -1,32 +0,0 @@
-(function (global, factory) {
-    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
-    typeof define === 'function' && define.amd ? define(factory) :
-    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.it = factory()));
-}(this, function () { 'use strict';
-
-    var it = {
-        code: "it",
-        week: {
-            dow: 1,
-            doy: 4 // The week that contains Jan 4th is the first week of the year.
-        },
-        buttonText: {
-            prev: "Prec",
-            next: "Succ",
-            today: "Oggi",
-            month: "Mese",
-            week: "Settimana",
-            day: "Giorno",
-            list: "Agenda"
-        },
-        weekLabel: "Sm",
-        allDayHtml: "Tutto il<br/>giorno",
-        eventLimitText: function (n) {
-            return "+altri " + n;
-        },
-        noEventsMessage: "Non ci sono eventi da visualizzare"
-    };
-
-    return it;
-
-}));
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/ja.js b/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/ja.js
deleted file mode 100644
index eb4245b2a076e378d2461c6c5d6496d254091f2a..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/ja.js
+++ /dev/null
@@ -1,28 +0,0 @@
-(function (global, factory) {
-    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
-    typeof define === 'function' && define.amd ? define(factory) :
-    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.ja = factory()));
-}(this, function () { 'use strict';
-
-    var ja = {
-        code: "ja",
-        buttonText: {
-            prev: "前",
-            next: "次",
-            today: "今日",
-            month: "月",
-            week: "週",
-            day: "æ—¥",
-            list: "予定リスト"
-        },
-        weekLabel: "週",
-        allDayText: "終日",
-        eventLimitText: function (n) {
-            return "他 " + n + " 件";
-        },
-        noEventsMessage: "表示する予定はありません"
-    };
-
-    return ja;
-
-}));
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/ka.js b/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/ka.js
deleted file mode 100644
index b971c033f811feacd41ab29f4a4bafa704d0a50b..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/ka.js
+++ /dev/null
@@ -1,32 +0,0 @@
-(function (global, factory) {
-    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
-    typeof define === 'function' && define.amd ? define(factory) :
-    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.ka = factory()));
-}(this, function () { 'use strict';
-
-    var ka = {
-        code: "ka",
-        week: {
-            dow: 1,
-            doy: 7
-        },
-        buttonText: {
-            prev: "წინა",
-            next: "შემდეგი",
-            today: "დღეს",
-            month: "თვე",
-            week: "კვირა",
-            day: "დღე",
-            list: "დღის წესრიგი"
-        },
-        weekLabel: "კვ",
-        allDayText: "მთელი დღე",
-        eventLimitText: function (n) {
-            return "+ კიდევ " + n;
-        },
-        noEventsMessage: "ღონისძიებები არ არის"
-    };
-
-    return ka;
-
-}));
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/kk.js b/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/kk.js
deleted file mode 100644
index 5b19b99d51054f26b05ac53733835b0bc8597bc4..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/kk.js
+++ /dev/null
@@ -1,32 +0,0 @@
-(function (global, factory) {
-    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
-    typeof define === 'function' && define.amd ? define(factory) :
-    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.kk = factory()));
-}(this, function () { 'use strict';
-
-    var kk = {
-        code: "kk",
-        week: {
-            dow: 1,
-            doy: 7 // The week that contains Jan 1st is the first week of the year.
-        },
-        buttonText: {
-            prev: "Алдыңғы",
-            next: "Келесі",
-            today: "Бүгін",
-            month: "Ай",
-            week: "Апта",
-            day: "Күн",
-            list: "Күн тәртібі"
-        },
-        weekLabel: "Не",
-        allDayText: "Күні бойы",
-        eventLimitText: function (n) {
-            return "+ тағы " + n;
-        },
-        noEventsMessage: "Көрсету үшін оқиғалар жоқ"
-    };
-
-    return kk;
-
-}));
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/ko.js b/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/ko.js
deleted file mode 100644
index ffe985d6c5d33c0a3708497f9c5fa969a6e6ca6e..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/ko.js
+++ /dev/null
@@ -1,26 +0,0 @@
-(function (global, factory) {
-    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
-    typeof define === 'function' && define.amd ? define(factory) :
-    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.ko = factory()));
-}(this, function () { 'use strict';
-
-    var ko = {
-        code: "ko",
-        buttonText: {
-            prev: "이전달",
-            next: "다음달",
-            today: "오늘",
-            month: "ì›”",
-            week: "주",
-            day: "일",
-            list: "일정목록"
-        },
-        weekLabel: "주",
-        allDayText: "종일",
-        eventLimitText: "개",
-        noEventsMessage: "일정이 없습니다"
-    };
-
-    return ko;
-
-}));
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/lb.js b/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/lb.js
deleted file mode 100644
index b9b17e3ec1f7f6bfd5bed7bf409cd5109c0b5a8e..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/lb.js
+++ /dev/null
@@ -1,30 +0,0 @@
-(function (global, factory) {
-    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
-    typeof define === 'function' && define.amd ? define(factory) :
-    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.lb = factory()));
-}(this, function () { 'use strict';
-
-    var lb = {
-        code: "lb",
-        week: {
-            dow: 1,
-            doy: 4 // The week that contains Jan 4th is the first week of the year.
-        },
-        buttonText: {
-            prev: "Zréck",
-            next: "Weider",
-            today: "Haut",
-            month: "Mount",
-            week: "Woch",
-            day: "Dag",
-            list: "Terminiwwersiicht"
-        },
-        weekLabel: "W",
-        allDayText: "Ganzen Dag",
-        eventLimitText: "méi",
-        noEventsMessage: "Nee Evenementer ze affichéieren"
-    };
-
-    return lb;
-
-}));
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/lt.js b/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/lt.js
deleted file mode 100644
index ec641b7500e5af7b2e46e4253b4ee9d8c2fa3c12..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/lt.js
+++ /dev/null
@@ -1,30 +0,0 @@
-(function (global, factory) {
-    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
-    typeof define === 'function' && define.amd ? define(factory) :
-    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.lt = factory()));
-}(this, function () { 'use strict';
-
-    var lt = {
-        code: "lt",
-        week: {
-            dow: 1,
-            doy: 4 // The week that contains Jan 4th is the first week of the year.
-        },
-        buttonText: {
-            prev: "Atgal",
-            next: "Pirmyn",
-            today: "Å iandien",
-            month: "MÄ—nuo",
-            week: "SavaitÄ—",
-            day: "Diena",
-            list: "DarbotvarkÄ—"
-        },
-        weekLabel: "SAV",
-        allDayText: "VisÄ… dienÄ…",
-        eventLimitText: "daugiau",
-        noEventsMessage: "Nėra įvykių rodyti"
-    };
-
-    return lt;
-
-}));
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/lv.js b/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/lv.js
deleted file mode 100644
index 5453630df116f6e1edd47c1fdf2d2f311fe183cc..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/lv.js
+++ /dev/null
@@ -1,32 +0,0 @@
-(function (global, factory) {
-    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
-    typeof define === 'function' && define.amd ? define(factory) :
-    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.lv = factory()));
-}(this, function () { 'use strict';
-
-    var lv = {
-        code: "lv",
-        week: {
-            dow: 1,
-            doy: 4 // The week that contains Jan 4th is the first week of the year.
-        },
-        buttonText: {
-            prev: "Iepr.",
-            next: "Nāk.",
-            today: "Å odien",
-            month: "MÄ“nesis",
-            week: "Nedēļa",
-            day: "Diena",
-            list: "Dienas kārtība"
-        },
-        weekLabel: "Ned.",
-        allDayText: "Visu dienu",
-        eventLimitText: function (n) {
-            return "+vēl " + n;
-        },
-        noEventsMessage: "Nav notikumu"
-    };
-
-    return lv;
-
-}));
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/mk.js b/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/mk.js
deleted file mode 100644
index 6729fa63d39a23840f433054acd3c88bc97e1db5..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/mk.js
+++ /dev/null
@@ -1,28 +0,0 @@
-(function (global, factory) {
-    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
-    typeof define === 'function' && define.amd ? define(factory) :
-    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.mk = factory()));
-}(this, function () { 'use strict';
-
-    var mk = {
-        code: "mk",
-        buttonText: {
-            prev: "претходно",
-            next: "следно",
-            today: "Денес",
-            month: "Месец",
-            week: "Недела",
-            day: "Ден",
-            list: "График"
-        },
-        weekLabel: "Сед",
-        allDayText: "Цел ден",
-        eventLimitText: function (n) {
-            return "+повеќе " + n;
-        },
-        noEventsMessage: "Нема настани за прикажување"
-    };
-
-    return mk;
-
-}));
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/ms.js b/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/ms.js
deleted file mode 100644
index 7205ecc72755fb6885a4f73f177c40817bff80c6..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/ms.js
+++ /dev/null
@@ -1,32 +0,0 @@
-(function (global, factory) {
-    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
-    typeof define === 'function' && define.amd ? define(factory) :
-    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.ms = factory()));
-}(this, function () { 'use strict';
-
-    var ms = {
-        code: "ms",
-        week: {
-            dow: 1,
-            doy: 7 // The week that contains Jan 1st is the first week of the year.
-        },
-        buttonText: {
-            prev: "Sebelum",
-            next: "Selepas",
-            today: "hari ini",
-            month: "Bulan",
-            week: "Minggu",
-            day: "Hari",
-            list: "Agenda"
-        },
-        weekLabel: "Mg",
-        allDayText: "Sepanjang hari",
-        eventLimitText: function (n) {
-            return "masih ada " + n + " acara";
-        },
-        noEventsMessage: "Tiada peristiwa untuk dipaparkan"
-    };
-
-    return ms;
-
-}));
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/nb.js b/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/nb.js
deleted file mode 100644
index 6464461c648494308b9f9e5935e811d7bda67199..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/nb.js
+++ /dev/null
@@ -1,30 +0,0 @@
-(function (global, factory) {
-    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
-    typeof define === 'function' && define.amd ? define(factory) :
-    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.nb = factory()));
-}(this, function () { 'use strict';
-
-    var nb = {
-        code: "nb",
-        week: {
-            dow: 1,
-            doy: 4 // The week that contains Jan 4th is the first week of the year.
-        },
-        buttonText: {
-            prev: "Forrige",
-            next: "Neste",
-            today: "I dag",
-            month: "MÃ¥ned",
-            week: "Uke",
-            day: "Dag",
-            list: "Agenda"
-        },
-        weekLabel: "Uke",
-        allDayText: "Hele dagen",
-        eventLimitText: "til",
-        noEventsMessage: "Ingen hendelser å vise"
-    };
-
-    return nb;
-
-}));
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/nl.js b/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/nl.js
deleted file mode 100644
index c91b5e55fdd9c7df8fa98e1b66a06e4f1d10e299..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/nl.js
+++ /dev/null
@@ -1,30 +0,0 @@
-(function (global, factory) {
-    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
-    typeof define === 'function' && define.amd ? define(factory) :
-    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.nl = factory()));
-}(this, function () { 'use strict';
-
-    var nl = {
-        code: "nl",
-        week: {
-            dow: 1,
-            doy: 4 // The week that contains Jan 4th is the first week of the year.
-        },
-        buttonText: {
-            prev: "Voorgaand",
-            next: "Volgende",
-            today: "Vandaag",
-            year: "Jaar",
-            month: "Maand",
-            week: "Week",
-            day: "Dag",
-            list: "Agenda"
-        },
-        allDayText: "Hele dag",
-        eventLimitText: "extra",
-        noEventsMessage: "Geen evenementen om te laten zien"
-    };
-
-    return nl;
-
-}));
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/nn.js b/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/nn.js
deleted file mode 100644
index a5cdd16268ecd602156ba68725666233ee852655..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/nn.js
+++ /dev/null
@@ -1,30 +0,0 @@
-(function (global, factory) {
-    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
-    typeof define === 'function' && define.amd ? define(factory) :
-    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.nn = factory()));
-}(this, function () { 'use strict';
-
-    var nn = {
-        code: "nn",
-        week: {
-            dow: 1,
-            doy: 4 // The week that contains Jan 4th is the first week of the year.
-        },
-        buttonText: {
-            prev: "Førre",
-            next: "Neste",
-            today: "I dag",
-            month: "MÃ¥nad",
-            week: "Veke",
-            day: "Dag",
-            list: "Agenda"
-        },
-        weekLabel: "Veke",
-        allDayText: "Heile dagen",
-        eventLimitText: "til",
-        noEventsMessage: "Ingen hendelser å vise"
-    };
-
-    return nn;
-
-}));
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/pl.js b/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/pl.js
deleted file mode 100644
index 0a22e69c436423ec990a1eef85623e2829666320..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/pl.js
+++ /dev/null
@@ -1,30 +0,0 @@
-(function (global, factory) {
-    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
-    typeof define === 'function' && define.amd ? define(factory) :
-    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.pl = factory()));
-}(this, function () { 'use strict';
-
-    var pl = {
-        code: "pl",
-        week: {
-            dow: 1,
-            doy: 4 // The week that contains Jan 4th is the first week of the year.
-        },
-        buttonText: {
-            prev: "Poprzedni",
-            next: "Następny",
-            today: "DziÅ›",
-            month: "MiesiÄ…c",
-            week: "Tydzień",
-            day: "Dzień",
-            list: "Plan dnia"
-        },
-        weekLabel: "Tydz",
-        allDayText: "Cały dzień",
-        eventLimitText: "więcej",
-        noEventsMessage: "Brak wydarzeń do wyświetlenia"
-    };
-
-    return pl;
-
-}));
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/pt-br.js b/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/pt-br.js
deleted file mode 100644
index 0133cd6b176b730aae09f6fc0f7a99eb36e7ad87..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/pt-br.js
+++ /dev/null
@@ -1,28 +0,0 @@
-(function (global, factory) {
-    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
-    typeof define === 'function' && define.amd ? define(factory) :
-    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['pt-br'] = factory()));
-}(this, function () { 'use strict';
-
-    var ptBr = {
-        code: "pt-br",
-        buttonText: {
-            prev: "Anterior",
-            next: "Próximo",
-            today: "Hoje",
-            month: "Mês",
-            week: "Semana",
-            day: "Dia",
-            list: "Compromissos"
-        },
-        weekLabel: "Sm",
-        allDayText: "dia inteiro",
-        eventLimitText: function (n) {
-            return "mais +" + n;
-        },
-        noEventsMessage: "Não há eventos para mostrar"
-    };
-
-    return ptBr;
-
-}));
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/pt.js b/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/pt.js
deleted file mode 100644
index 5c54d8d401e315e701797aa5afd9d57f90172872..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/pt.js
+++ /dev/null
@@ -1,30 +0,0 @@
-(function (global, factory) {
-    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
-    typeof define === 'function' && define.amd ? define(factory) :
-    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.pt = factory()));
-}(this, function () { 'use strict';
-
-    var pt = {
-        code: "pt",
-        week: {
-            dow: 1,
-            doy: 4 // The week that contains Jan 4th is the first week of the year.
-        },
-        buttonText: {
-            prev: "Anterior",
-            next: "Seguinte",
-            today: "Hoje",
-            month: "Mês",
-            week: "Semana",
-            day: "Dia",
-            list: "Agenda"
-        },
-        weekLabel: "Sem",
-        allDayText: "Todo o dia",
-        eventLimitText: "mais",
-        noEventsMessage: "Não há eventos para mostrar"
-    };
-
-    return pt;
-
-}));
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/ro.js b/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/ro.js
deleted file mode 100644
index e8992f27628a6a408eba0ea65a32f6d3329d8930..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/ro.js
+++ /dev/null
@@ -1,32 +0,0 @@
-(function (global, factory) {
-    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
-    typeof define === 'function' && define.amd ? define(factory) :
-    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.ro = factory()));
-}(this, function () { 'use strict';
-
-    var ro = {
-        code: "ro",
-        week: {
-            dow: 1,
-            doy: 7 // The week that contains Jan 1st is the first week of the year.
-        },
-        buttonText: {
-            prev: "precedentă",
-            next: "următoare",
-            today: "Azi",
-            month: "Lună",
-            week: "Săptămână",
-            day: "Zi",
-            list: "Agendă"
-        },
-        weekLabel: "Săpt",
-        allDayText: "Toată ziua",
-        eventLimitText: function (n) {
-            return "+alte " + n;
-        },
-        noEventsMessage: "Nu există evenimente de afișat"
-    };
-
-    return ro;
-
-}));
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/ru.js b/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/ru.js
deleted file mode 100644
index 77e0308e2c4c1d13ba7345c9cb1001d297025ec4..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/ru.js
+++ /dev/null
@@ -1,32 +0,0 @@
-(function (global, factory) {
-    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
-    typeof define === 'function' && define.amd ? define(factory) :
-    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.ru = factory()));
-}(this, function () { 'use strict';
-
-    var ru = {
-        code: "ru",
-        week: {
-            dow: 1,
-            doy: 4 // The week that contains Jan 4th is the first week of the year.
-        },
-        buttonText: {
-            prev: "Пред",
-            next: "След",
-            today: "Сегодня",
-            month: "Месяц",
-            week: "Неделя",
-            day: "День",
-            list: "Повестка дня"
-        },
-        weekLabel: "Нед",
-        allDayText: "Весь день",
-        eventLimitText: function (n) {
-            return "+ ещё " + n;
-        },
-        noEventsMessage: "Нет событий для отображения"
-    };
-
-    return ru;
-
-}));
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/sk.js b/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/sk.js
deleted file mode 100644
index 3513a64ad3b389f1423f5b2a31755663165420c5..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/sk.js
+++ /dev/null
@@ -1,32 +0,0 @@
-(function (global, factory) {
-    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
-    typeof define === 'function' && define.amd ? define(factory) :
-    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.sk = factory()));
-}(this, function () { 'use strict';
-
-    var sk = {
-        code: "sk",
-        week: {
-            dow: 1,
-            doy: 4 // The week that contains Jan 4th is the first week of the year.
-        },
-        buttonText: {
-            prev: "Predchádzajúci",
-            next: "Nasledujúci",
-            today: "Dnes",
-            month: "Mesiac",
-            week: "Týždeň",
-            day: "Deň",
-            list: "Rozvrh"
-        },
-        weekLabel: "Ty",
-        allDayText: "Celý deň",
-        eventLimitText: function (n) {
-            return "+ďalšie: " + n;
-        },
-        noEventsMessage: "Žiadne akcie na zobrazenie"
-    };
-
-    return sk;
-
-}));
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/sl.js b/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/sl.js
deleted file mode 100644
index 323355359ed3b87a96b60da70028299d2db3f9cf..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/sl.js
+++ /dev/null
@@ -1,30 +0,0 @@
-(function (global, factory) {
-    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
-    typeof define === 'function' && define.amd ? define(factory) :
-    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.sl = factory()));
-}(this, function () { 'use strict';
-
-    var sl = {
-        code: "sl",
-        week: {
-            dow: 1,
-            doy: 7 // The week that contains Jan 1st is the first week of the year.
-        },
-        buttonText: {
-            prev: "Prejšnji",
-            next: "Naslednji",
-            today: "Trenutni",
-            month: "Mesec",
-            week: "Teden",
-            day: "Dan",
-            list: "Dnevni red"
-        },
-        weekLabel: "Teden",
-        allDayText: "Ves dan",
-        eventLimitText: "več",
-        noEventsMessage: "Ni dogodkov za prikaz"
-    };
-
-    return sl;
-
-}));
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/sq.js b/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/sq.js
deleted file mode 100644
index 0d43a522094ab6e166e159f8f3d2b84c8b9565c1..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/sq.js
+++ /dev/null
@@ -1,32 +0,0 @@
-(function (global, factory) {
-    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
-    typeof define === 'function' && define.amd ? define(factory) :
-    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.sq = factory()));
-}(this, function () { 'use strict';
-
-    var sq = {
-        code: "sq",
-        week: {
-            dow: 1,
-            doy: 4 // The week that contains Jan 4th is the first week of the year.
-        },
-        buttonText: {
-            prev: "mbrapa",
-            next: "Përpara",
-            today: "sot",
-            month: "Muaj",
-            week: "Javë",
-            day: "Ditë",
-            list: "Listë"
-        },
-        weekLabel: "Ja",
-        allDayHtml: "Gjithë<br/>ditën",
-        eventLimitText: function (n) {
-            return "+më tepër " + n;
-        },
-        noEventsMessage: "Nuk ka evente për të shfaqur"
-    };
-
-    return sq;
-
-}));
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/sr-cyrl.js b/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/sr-cyrl.js
deleted file mode 100644
index ba0d0dfa31ed6289a6a2e769ecc205afccf2106b..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/sr-cyrl.js
+++ /dev/null
@@ -1,32 +0,0 @@
-(function (global, factory) {
-    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
-    typeof define === 'function' && define.amd ? define(factory) :
-    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['sr-cyrl'] = factory()));
-}(this, function () { 'use strict';
-
-    var srCyrl = {
-        code: "sr-cyrl",
-        week: {
-            dow: 1,
-            doy: 7 // The week that contains Jan 1st is the first week of the year.
-        },
-        buttonText: {
-            prev: "Претходна",
-            next: "следећи",
-            today: "Данас",
-            month: "Месец",
-            week: "Недеља",
-            day: "Дан",
-            list: "Планер"
-        },
-        weekLabel: "Сед",
-        allDayText: "Цео дан",
-        eventLimitText: function (n) {
-            return "+ још " + n;
-        },
-        noEventsMessage: "Нема догађаја за приказ"
-    };
-
-    return srCyrl;
-
-}));
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/sr.js b/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/sr.js
deleted file mode 100644
index 23e5c9b23fe19dd188f0287c31cd0fe253f17757..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/sr.js
+++ /dev/null
@@ -1,32 +0,0 @@
-(function (global, factory) {
-    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
-    typeof define === 'function' && define.amd ? define(factory) :
-    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.sr = factory()));
-}(this, function () { 'use strict';
-
-    var sr = {
-        code: "sr",
-        week: {
-            dow: 1,
-            doy: 7 // The week that contains Jan 1st is the first week of the year.
-        },
-        buttonText: {
-            prev: "Prethodna",
-            next: "Sledeći",
-            today: "Danas",
-            month: "Mеsеc",
-            week: "Nеdеlja",
-            day: "Dan",
-            list: "Planеr"
-        },
-        weekLabel: "Sed",
-        allDayText: "Cеo dan",
-        eventLimitText: function (n) {
-            return "+ još " + n;
-        },
-        noEventsMessage: "Nеma događaja za prikaz"
-    };
-
-    return sr;
-
-}));
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/sv.js b/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/sv.js
deleted file mode 100644
index a887060ba4e3f25a6f185339f6a8ffc38837e81a..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/sv.js
+++ /dev/null
@@ -1,30 +0,0 @@
-(function (global, factory) {
-    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
-    typeof define === 'function' && define.amd ? define(factory) :
-    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.sv = factory()));
-}(this, function () { 'use strict';
-
-    var sv = {
-        code: "sv",
-        week: {
-            dow: 1,
-            doy: 4 // The week that contains Jan 4th is the first week of the year.
-        },
-        buttonText: {
-            prev: "Förra",
-            next: "Nästa",
-            today: "Idag",
-            month: "MÃ¥nad",
-            week: "Vecka",
-            day: "Dag",
-            list: "Program"
-        },
-        weekLabel: "v.",
-        allDayText: "Heldag",
-        eventLimitText: "till",
-        noEventsMessage: "Inga händelser att visa"
-    };
-
-    return sv;
-
-}));
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/th.js b/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/th.js
deleted file mode 100644
index caa3fe9a67a6ea983bf19ae9ddc91a91520a53e8..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/th.js
+++ /dev/null
@@ -1,25 +0,0 @@
-(function (global, factory) {
-    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
-    typeof define === 'function' && define.amd ? define(factory) :
-    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.th = factory()));
-}(this, function () { 'use strict';
-
-    var th = {
-        code: "th",
-        buttonText: {
-            prev: "ย้อน",
-            next: "ถัดไป",
-            today: "วันนี้",
-            month: "เดือน",
-            week: "สัปดาห์",
-            day: "วัน",
-            list: "แผนงาน"
-        },
-        allDayText: "ตลอดวัน",
-        eventLimitText: "เพิ่มเติม",
-        noEventsMessage: "ไม่มีกิจกรรมที่จะแสดง"
-    };
-
-    return th;
-
-}));
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/tr.js b/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/tr.js
deleted file mode 100644
index 48458982fb666057a7f745f195e24def15fb98cb..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/tr.js
+++ /dev/null
@@ -1,30 +0,0 @@
-(function (global, factory) {
-    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
-    typeof define === 'function' && define.amd ? define(factory) :
-    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.tr = factory()));
-}(this, function () { 'use strict';
-
-    var tr = {
-        code: "tr",
-        week: {
-            dow: 1,
-            doy: 7 // The week that contains Jan 1st is the first week of the year.
-        },
-        buttonText: {
-            prev: "geri",
-            next: "ileri",
-            today: "bugün",
-            month: "Ay",
-            week: "Hafta",
-            day: "Gün",
-            list: "Ajanda"
-        },
-        weekLabel: "Hf",
-        allDayText: "Tüm gün",
-        eventLimitText: "daha fazla",
-        noEventsMessage: "Gösterilecek etkinlik yok"
-    };
-
-    return tr;
-
-}));
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/uk.js b/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/uk.js
deleted file mode 100644
index de33f250c3e3facbacd9deebb08603f931e1a086..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/uk.js
+++ /dev/null
@@ -1,32 +0,0 @@
-(function (global, factory) {
-    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
-    typeof define === 'function' && define.amd ? define(factory) :
-    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.uk = factory()));
-}(this, function () { 'use strict';
-
-    var uk = {
-        code: "uk",
-        week: {
-            dow: 1,
-            doy: 7 // The week that contains Jan 1st is the first week of the year.
-        },
-        buttonText: {
-            prev: "Попередній",
-            next: "далі",
-            today: "Сьогодні",
-            month: "Місяць",
-            week: "Тиждень",
-            day: "День",
-            list: "Порядок денний"
-        },
-        weekLabel: "Тиж",
-        allDayText: "Увесь день",
-        eventLimitText: function (n) {
-            return "+ще " + n + "...";
-        },
-        noEventsMessage: "Немає подій для відображення"
-    };
-
-    return uk;
-
-}));
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/vi.js b/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/vi.js
deleted file mode 100644
index 167ce11d74b63cf9ad4e58a258f79133609dafa8..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/vi.js
+++ /dev/null
@@ -1,32 +0,0 @@
-(function (global, factory) {
-    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
-    typeof define === 'function' && define.amd ? define(factory) :
-    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.vi = factory()));
-}(this, function () { 'use strict';
-
-    var vi = {
-        code: "vi",
-        week: {
-            dow: 1,
-            doy: 4 // The week that contains Jan 4th is the first week of the year.
-        },
-        buttonText: {
-            prev: "TrÆ°á»›c",
-            next: "Tiếp",
-            today: "Hôm nay",
-            month: "Tháng",
-            week: "Tuần",
-            day: "Ngày",
-            list: "Lịch biểu"
-        },
-        weekLabel: "Tu",
-        allDayText: "Cả ngày",
-        eventLimitText: function (n) {
-            return "+ thêm " + n;
-        },
-        noEventsMessage: "Không có sự kiện để hiển thị"
-    };
-
-    return vi;
-
-}));
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/zh-cn.js b/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/zh-cn.js
deleted file mode 100644
index 4debbb9e60ee21e27ec14606c300ebd50a0e9bea..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/zh-cn.js
+++ /dev/null
@@ -1,33 +0,0 @@
-(function (global, factory) {
-    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
-    typeof define === 'function' && define.amd ? define(factory) :
-    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['zh-cn'] = factory()));
-}(this, function () { 'use strict';
-
-    var zhCn = {
-        code: "zh-cn",
-        week: {
-            // GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效
-            dow: 1,
-            doy: 4 // The week that contains Jan 4th is the first week of the year.
-        },
-        buttonText: {
-            prev: "上月",
-            next: "下月",
-            today: "今天",
-            month: "月",
-            week: "周",
-            day: "æ—¥",
-            list: "日程"
-        },
-        weekLabel: "周",
-        allDayText: "全天",
-        eventLimitText: function (n) {
-            return "另外 " + n + " 个";
-        },
-        noEventsMessage: "没有事件显示"
-    };
-
-    return zhCn;
-
-}));
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/zh-tw.js b/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/zh-tw.js
deleted file mode 100644
index bc14dcd4bcaba47772cb45938fdbdb139c21156a..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/core/locales/zh-tw.js
+++ /dev/null
@@ -1,26 +0,0 @@
-(function (global, factory) {
-    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
-    typeof define === 'function' && define.amd ? define(factory) :
-    (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['zh-tw'] = factory()));
-}(this, function () { 'use strict';
-
-    var zhTw = {
-        code: "zh-tw",
-        buttonText: {
-            prev: "上月",
-            next: "下月",
-            today: "今天",
-            month: "月",
-            week: "週",
-            day: "天",
-            list: "活動列表"
-        },
-        weekLabel: "周",
-        allDayText: "整天",
-        eventLimitText: '顯示更多',
-        noEventsMessage: "没有任何活動"
-    };
-
-    return zhTw;
-
-}));
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/core/main.css b/AKPlan/static/AKPlan/vendor/fullcalendar/core/main.css
deleted file mode 100644
index 4412a18580caf6aadf35e042bf6eb53fe3184bc0..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/core/main.css
+++ /dev/null
@@ -1,1052 +0,0 @@
-@charset "UTF-8";
-.fc {
-  direction: ltr;
-  text-align: left;
-}
-
-.fc-rtl {
-  text-align: right;
-}
-
-body .fc {
-  /* extra precedence to overcome jqui */
-  font-size: 1em;
-}
-
-/* Colors
---------------------------------------------------------------------------------------------------*/
-.fc-highlight {
-  /* when user is selecting cells */
-  background: #bce8f1;
-  opacity: 0.3;
-}
-
-.fc-bgevent {
-  /* default look for background events */
-  background: #8fdf82;
-  opacity: 0.3;
-}
-
-.fc-nonbusiness {
-  /* default look for non-business-hours areas */
-  /* will inherit .fc-bgevent's styles */
-  background: #d7d7d7;
-}
-
-/* Popover
---------------------------------------------------------------------------------------------------*/
-.fc-popover {
-  position: absolute;
-  box-shadow: 0 2px 6px rgba(0, 0, 0, 0.15);
-}
-
-.fc-popover .fc-header {
-  /* TODO: be more consistent with fc-head/fc-body */
-  display: flex;
-  flex-direction: row;
-  justify-content: space-between;
-  align-items: center;
-  padding: 2px 4px;
-}
-
-.fc-rtl .fc-popover .fc-header {
-  flex-direction: row-reverse;
-}
-
-.fc-popover .fc-header .fc-title {
-  margin: 0 2px;
-}
-
-.fc-popover .fc-header .fc-close {
-  cursor: pointer;
-  opacity: 0.65;
-  font-size: 1.1em;
-}
-
-/* Misc Reusable Components
---------------------------------------------------------------------------------------------------*/
-.fc-divider {
-  border-style: solid;
-  border-width: 1px;
-}
-
-hr.fc-divider {
-  height: 0;
-  margin: 0;
-  padding: 0 0 2px;
-  /* height is unreliable across browsers, so use padding */
-  border-width: 1px 0;
-}
-
-.fc-bg,
-.fc-bgevent-skeleton,
-.fc-highlight-skeleton,
-.fc-mirror-skeleton {
-  /* these element should always cling to top-left/right corners */
-  position: absolute;
-  top: 0;
-  left: 0;
-  right: 0;
-}
-
-.fc-bg {
-  bottom: 0;
-  /* strech bg to bottom edge */
-}
-
-.fc-bg table {
-  height: 100%;
-  /* strech bg to bottom edge */
-}
-
-/* Tables
---------------------------------------------------------------------------------------------------*/
-.fc table {
-  width: 100%;
-  box-sizing: border-box;
-  /* fix scrollbar issue in firefox */
-  table-layout: fixed;
-  border-collapse: collapse;
-  border-spacing: 0;
-  font-size: 1em;
-  /* normalize cross-browser */
-}
-
-.fc th {
-  text-align: center;
-}
-
-.fc th,
-.fc td {
-  border-style: solid;
-  border-width: 1px;
-  padding: 0;
-  vertical-align: top;
-}
-
-.fc td.fc-today {
-  border-style: double;
-  /* overcome neighboring borders */
-}
-
-/* Internal Nav Links
---------------------------------------------------------------------------------------------------*/
-a[data-goto] {
-  cursor: pointer;
-}
-
-a[data-goto]:hover {
-  text-decoration: underline;
-}
-
-/* Fake Table Rows
---------------------------------------------------------------------------------------------------*/
-.fc .fc-row {
-  /* extra precedence to overcome themes forcing a 1px border */
-  /* no visible border by default. but make available if need be (scrollbar width compensation) */
-  border-style: solid;
-  border-width: 0;
-}
-
-.fc-row table {
-  /* don't put left/right border on anything within a fake row.
-     the outer tbody will worry about this */
-  border-left: 0 hidden transparent;
-  border-right: 0 hidden transparent;
-  /* no bottom borders on rows */
-  border-bottom: 0 hidden transparent;
-}
-
-.fc-row:first-child table {
-  border-top: 0 hidden transparent;
-  /* no top border on first row */
-}
-
-/* Day Row (used within the header and the DayGrid)
---------------------------------------------------------------------------------------------------*/
-.fc-row {
-  position: relative;
-}
-
-.fc-row .fc-bg {
-  z-index: 1;
-}
-
-/* highlighting cells & background event skeleton */
-.fc-row .fc-bgevent-skeleton,
-.fc-row .fc-highlight-skeleton {
-  bottom: 0;
-  /* stretch skeleton to bottom of row */
-}
-
-.fc-row .fc-bgevent-skeleton table,
-.fc-row .fc-highlight-skeleton table {
-  height: 100%;
-  /* stretch skeleton to bottom of row */
-}
-
-.fc-row .fc-highlight-skeleton td,
-.fc-row .fc-bgevent-skeleton td {
-  border-color: transparent;
-}
-
-.fc-row .fc-bgevent-skeleton {
-  z-index: 2;
-}
-
-.fc-row .fc-highlight-skeleton {
-  z-index: 3;
-}
-
-/*
-row content (which contains day/week numbers and events) as well as "mirror" (which contains
-temporary rendered events).
-*/
-.fc-row .fc-content-skeleton {
-  position: relative;
-  z-index: 4;
-  padding-bottom: 2px;
-  /* matches the space above the events */
-}
-
-.fc-row .fc-mirror-skeleton {
-  z-index: 5;
-}
-
-.fc .fc-row .fc-content-skeleton table,
-.fc .fc-row .fc-content-skeleton td,
-.fc .fc-row .fc-mirror-skeleton td {
-  /* see-through to the background below */
-  /* extra precedence to prevent theme-provided backgrounds */
-  background: none;
-  /* in case <td>s are globally styled */
-  border-color: transparent;
-}
-
-.fc-row .fc-content-skeleton td,
-.fc-row .fc-mirror-skeleton td {
-  /* don't put a border between events and/or the day number */
-  border-bottom: 0;
-}
-
-.fc-row .fc-content-skeleton tbody td,
-.fc-row .fc-mirror-skeleton tbody td {
-  /* don't put a border between event cells */
-  border-top: 0;
-}
-
-/* Scrolling Container
---------------------------------------------------------------------------------------------------*/
-.fc-scroller {
-  -webkit-overflow-scrolling: touch;
-}
-
-/* TODO: move to timegrid/daygrid */
-.fc-scroller > .fc-day-grid,
-.fc-scroller > .fc-time-grid {
-  position: relative;
-  /* re-scope all positions */
-  width: 100%;
-  /* hack to force re-sizing this inner element when scrollbars appear/disappear */
-}
-
-/* Global Event Styles
---------------------------------------------------------------------------------------------------*/
-.fc-event {
-  position: relative;
-  /* for resize handle and other inner positioning */
-  display: block;
-  /* make the <a> tag block */
-  font-size: 0.85em;
-  line-height: 1.4;
-  border-radius: 3px;
-  border: 1px solid #3788d8;
-}
-
-.fc-event,
-.fc-event-dot {
-  background-color: #3788d8;
-  /* default BACKGROUND color */
-}
-
-.fc-event,
-.fc-event:hover {
-  color: #fff;
-  /* default TEXT color */
-  text-decoration: none;
-  /* if <a> has an href */
-}
-
-.fc-event[href],
-.fc-event.fc-draggable {
-  cursor: pointer;
-  /* give events with links and draggable events a hand mouse pointer */
-}
-
-.fc-not-allowed,
-.fc-not-allowed .fc-event {
-  /* to override an event's custom cursor */
-  cursor: not-allowed;
-}
-
-.fc-event .fc-content {
-  position: relative;
-  z-index: 2;
-}
-
-/* resizer (cursor AND touch devices) */
-.fc-event .fc-resizer {
-  position: absolute;
-  z-index: 4;
-}
-
-/* resizer (touch devices) */
-.fc-event .fc-resizer {
-  display: none;
-}
-
-.fc-event.fc-allow-mouse-resize .fc-resizer,
-.fc-event.fc-selected .fc-resizer {
-  /* only show when hovering or selected (with touch) */
-  display: block;
-}
-
-/* hit area */
-.fc-event.fc-selected .fc-resizer:before {
-  /* 40x40 touch area */
-  content: "";
-  position: absolute;
-  z-index: 9999;
-  /* user of this util can scope within a lower z-index */
-  top: 50%;
-  left: 50%;
-  width: 40px;
-  height: 40px;
-  margin-left: -20px;
-  margin-top: -20px;
-}
-
-/* Event Selection (only for touch devices)
---------------------------------------------------------------------------------------------------*/
-.fc-event.fc-selected {
-  z-index: 9999 !important;
-  /* overcomes inline z-index */
-  box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2);
-}
-
-.fc-event.fc-selected:after {
-  content: "";
-  position: absolute;
-  z-index: 1;
-  /* same z-index as fc-bg, behind text */
-  /* overcome the borders */
-  top: -1px;
-  right: -1px;
-  bottom: -1px;
-  left: -1px;
-  /* darkening effect */
-  background: #000;
-  opacity: 0.25;
-}
-
-/* Event Dragging
---------------------------------------------------------------------------------------------------*/
-.fc-event.fc-dragging.fc-selected {
-  box-shadow: 0 2px 7px rgba(0, 0, 0, 0.3);
-}
-
-.fc-event.fc-dragging:not(.fc-selected) {
-  opacity: 0.75;
-}
-
-/* Horizontal Events
---------------------------------------------------------------------------------------------------*/
-/* bigger touch area when selected */
-.fc-h-event.fc-selected:before {
-  content: "";
-  position: absolute;
-  z-index: 3;
-  /* below resizers */
-  top: -10px;
-  bottom: -10px;
-  left: 0;
-  right: 0;
-}
-
-/* events that are continuing to/from another week. kill rounded corners and butt up against edge */
-.fc-ltr .fc-h-event.fc-not-start,
-.fc-rtl .fc-h-event.fc-not-end {
-  margin-left: 0;
-  border-left-width: 0;
-  padding-left: 1px;
-  /* replace the border with padding */
-  border-top-left-radius: 0;
-  border-bottom-left-radius: 0;
-}
-
-.fc-ltr .fc-h-event.fc-not-end,
-.fc-rtl .fc-h-event.fc-not-start {
-  margin-right: 0;
-  border-right-width: 0;
-  padding-right: 1px;
-  /* replace the border with padding */
-  border-top-right-radius: 0;
-  border-bottom-right-radius: 0;
-}
-
-/* resizer (cursor AND touch devices) */
-/* left resizer  */
-.fc-ltr .fc-h-event .fc-start-resizer,
-.fc-rtl .fc-h-event .fc-end-resizer {
-  cursor: w-resize;
-  left: -1px;
-  /* overcome border */
-}
-
-/* right resizer */
-.fc-ltr .fc-h-event .fc-end-resizer,
-.fc-rtl .fc-h-event .fc-start-resizer {
-  cursor: e-resize;
-  right: -1px;
-  /* overcome border */
-}
-
-/* resizer (mouse devices) */
-.fc-h-event.fc-allow-mouse-resize .fc-resizer {
-  width: 7px;
-  top: -1px;
-  /* overcome top border */
-  bottom: -1px;
-  /* overcome bottom border */
-}
-
-/* resizer (touch devices) */
-.fc-h-event.fc-selected .fc-resizer {
-  /* 8x8 little dot */
-  border-radius: 4px;
-  border-width: 1px;
-  width: 6px;
-  height: 6px;
-  border-style: solid;
-  border-color: inherit;
-  background: #fff;
-  /* vertically center */
-  top: 50%;
-  margin-top: -4px;
-}
-
-/* left resizer  */
-.fc-ltr .fc-h-event.fc-selected .fc-start-resizer,
-.fc-rtl .fc-h-event.fc-selected .fc-end-resizer {
-  margin-left: -4px;
-  /* centers the 8x8 dot on the left edge */
-}
-
-/* right resizer */
-.fc-ltr .fc-h-event.fc-selected .fc-end-resizer,
-.fc-rtl .fc-h-event.fc-selected .fc-start-resizer {
-  margin-right: -4px;
-  /* centers the 8x8 dot on the right edge */
-}
-
-/* DayGrid events
-----------------------------------------------------------------------------------------------------
-We use the full "fc-day-grid-event" class instead of using descendants because the event won't
-be a descendant of the grid when it is being dragged.
-*/
-.fc-day-grid-event {
-  margin: 1px 2px 0;
-  /* spacing between events and edges */
-  padding: 0 1px;
-}
-
-tr:first-child > td > .fc-day-grid-event {
-  margin-top: 2px;
-  /* a little bit more space before the first event */
-}
-
-.fc-mirror-skeleton tr:first-child > td > .fc-day-grid-event {
-  margin-top: 0;
-  /* except for mirror skeleton */
-}
-
-.fc-day-grid-event .fc-content {
-  /* force events to be one-line tall */
-  white-space: nowrap;
-  overflow: hidden;
-}
-
-.fc-day-grid-event .fc-time {
-  font-weight: bold;
-}
-
-/* resizer (cursor devices) */
-/* left resizer  */
-.fc-ltr .fc-day-grid-event.fc-allow-mouse-resize .fc-start-resizer,
-.fc-rtl .fc-day-grid-event.fc-allow-mouse-resize .fc-end-resizer {
-  margin-left: -2px;
-  /* to the day cell's edge */
-}
-
-/* right resizer */
-.fc-ltr .fc-day-grid-event.fc-allow-mouse-resize .fc-end-resizer,
-.fc-rtl .fc-day-grid-event.fc-allow-mouse-resize .fc-start-resizer {
-  margin-right: -2px;
-  /* to the day cell's edge */
-}
-
-/* Event Limiting
---------------------------------------------------------------------------------------------------*/
-/* "more" link that represents hidden events */
-a.fc-more {
-  margin: 1px 3px;
-  font-size: 0.85em;
-  cursor: pointer;
-  text-decoration: none;
-}
-
-a.fc-more:hover {
-  text-decoration: underline;
-}
-
-.fc-limited {
-  /* rows and cells that are hidden because of a "more" link */
-  display: none;
-}
-
-/* popover that appears when "more" link is clicked */
-.fc-day-grid .fc-row {
-  z-index: 1;
-  /* make the "more" popover one higher than this */
-}
-
-.fc-more-popover {
-  z-index: 2;
-  width: 220px;
-}
-
-.fc-more-popover .fc-event-container {
-  padding: 10px;
-}
-
-/* Now Indicator
---------------------------------------------------------------------------------------------------*/
-.fc-now-indicator {
-  position: absolute;
-  border: 0 solid red;
-}
-
-/* Utilities
---------------------------------------------------------------------------------------------------*/
-.fc-unselectable {
-  -webkit-user-select: none;
-  -khtml-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none;
-  -webkit-touch-callout: none;
-  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
-}
-
-/*
-TODO: more distinction between this file and common.css
-*/
-/* Colors
---------------------------------------------------------------------------------------------------*/
-.fc-unthemed th,
-.fc-unthemed td,
-.fc-unthemed thead,
-.fc-unthemed tbody,
-.fc-unthemed .fc-divider,
-.fc-unthemed .fc-row,
-.fc-unthemed .fc-content,
-.fc-unthemed .fc-popover,
-.fc-unthemed .fc-list-view,
-.fc-unthemed .fc-list-heading td {
-  border-color: #ddd;
-}
-
-.fc-unthemed .fc-popover {
-  background-color: #fff;
-}
-
-.fc-unthemed .fc-divider,
-.fc-unthemed .fc-popover .fc-header,
-.fc-unthemed .fc-list-heading td {
-  background: #eee;
-}
-
-.fc-unthemed td.fc-today {
-  background: #fcf8e3;
-}
-
-.fc-unthemed .fc-disabled-day {
-  background: #d7d7d7;
-  opacity: 0.3;
-}
-
-/* Icons
---------------------------------------------------------------------------------------------------
-from https://feathericons.com/ and built with IcoMoon
-*/
-@font-face {
-  font-family: "fcicons";
-  src: url("data:application/x-font-ttf;charset=utf-8;base64,AAEAAAALAIAAAwAwT1MvMg8SBfAAAAC8AAAAYGNtYXAXVtKNAAABHAAAAFRnYXNwAAAAEAAAAXAAAAAIZ2x5ZgYydxIAAAF4AAAFNGhlYWQUJ7cIAAAGrAAAADZoaGVhB20DzAAABuQAAAAkaG10eCIABhQAAAcIAAAALGxvY2ED4AU6AAAHNAAAABhtYXhwAA8AjAAAB0wAAAAgbmFtZXsr690AAAdsAAABhnBvc3QAAwAAAAAI9AAAACAAAwPAAZAABQAAApkCzAAAAI8CmQLMAAAB6wAzAQkAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADpBgPA/8AAQAPAAEAAAAABAAAAAAAAAAAAAAAgAAAAAAADAAAAAwAAABwAAQADAAAAHAADAAEAAAAcAAQAOAAAAAoACAACAAIAAQAg6Qb//f//AAAAAAAg6QD//f//AAH/4xcEAAMAAQAAAAAAAAAAAAAAAQAB//8ADwABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAABAWIAjQKeAskAEwAAJSc3NjQnJiIHAQYUFwEWMjc2NCcCnuLiDQ0MJAz/AA0NAQAMJAwNDcni4gwjDQwM/wANIwz/AA0NDCMNAAAAAQFiAI0CngLJABMAACUBNjQnASYiBwYUHwEHBhQXFjI3AZ4BAA0N/wAMJAwNDeLiDQ0MJAyNAQAMIw0BAAwMDSMM4uINIwwNDQAAAAIA4gC3Ax4CngATACcAACUnNzY0JyYiDwEGFB8BFjI3NjQnISc3NjQnJiIPAQYUHwEWMjc2NCcB87e3DQ0MIw3VDQ3VDSMMDQ0BK7e3DQ0MJAzVDQ3VDCQMDQ3zuLcMJAwNDdUNIwzWDAwNIwy4twwkDA0N1Q0jDNYMDA0jDAAAAgDiALcDHgKeABMAJwAAJTc2NC8BJiIHBhQfAQcGFBcWMjchNzY0LwEmIgcGFB8BBwYUFxYyNwJJ1Q0N1Q0jDA0Nt7cNDQwjDf7V1Q0N1QwkDA0Nt7cNDQwkDLfWDCMN1Q0NDCQMt7gMIw0MDNYMIw3VDQ0MJAy3uAwjDQwMAAADAFUAAAOrA1UAMwBoAHcAABMiBgcOAQcOAQcOARURFBYXHgEXHgEXHgEzITI2Nz4BNz4BNz4BNRE0JicuAScuAScuASMFITIWFx4BFx4BFx4BFREUBgcOAQcOAQcOASMhIiYnLgEnLgEnLgE1ETQ2Nz4BNz4BNz4BMxMhMjY1NCYjISIGFRQWM9UNGAwLFQkJDgUFBQUFBQ4JCRULDBgNAlYNGAwLFQkJDgUFBQUFBQ4JCRULDBgN/aoCVgQIBAQHAwMFAQIBAQIBBQMDBwQECAT9qgQIBAQHAwMFAQIBAQIBBQMDBwQECASAAVYRGRkR/qoRGRkRA1UFBAUOCQkVDAsZDf2rDRkLDBUJCA4FBQUFBQUOCQgVDAsZDQJVDRkLDBUJCQ4FBAVVAgECBQMCBwQECAX9qwQJAwQHAwMFAQICAgIBBQMDBwQDCQQCVQUIBAQHAgMFAgEC/oAZEhEZGRESGQAAAAADAFUAAAOrA1UAMwBoAIkAABMiBgcOAQcOAQcOARURFBYXHgEXHgEXHgEzITI2Nz4BNz4BNz4BNRE0JicuAScuAScuASMFITIWFx4BFx4BFx4BFREUBgcOAQcOAQcOASMhIiYnLgEnLgEnLgE1ETQ2Nz4BNz4BNz4BMxMzFRQWMzI2PQEzMjY1NCYrATU0JiMiBh0BIyIGFRQWM9UNGAwLFQkJDgUFBQUFBQ4JCRULDBgNAlYNGAwLFQkJDgUFBQUFBQ4JCRULDBgN/aoCVgQIBAQHAwMFAQIBAQIBBQMDBwQECAT9qgQIBAQHAwMFAQIBAQIBBQMDBwQECASAgBkSEhmAERkZEYAZEhIZgBEZGREDVQUEBQ4JCRUMCxkN/asNGQsMFQkIDgUFBQUFBQ4JCBUMCxkNAlUNGQsMFQkJDgUEBVUCAQIFAwIHBAQIBf2rBAkDBAcDAwUBAgICAgEFAwMHBAMJBAJVBQgEBAcCAwUCAQL+gIASGRkSgBkSERmAEhkZEoAZERIZAAABAOIAjQMeAskAIAAAExcHBhQXFjI/ARcWMjc2NC8BNzY0JyYiDwEnJiIHBhQX4uLiDQ0MJAzi4gwkDA0N4uINDQwkDOLiDCQMDQ0CjeLiDSMMDQ3h4Q0NDCMN4uIMIw0MDOLiDAwNIwwAAAABAAAAAQAAa5n0y18PPPUACwQAAAAAANivOVsAAAAA2K85WwAAAAADqwNVAAAACAACAAAAAAAAAAEAAAPA/8AAAAQAAAAAAAOrAAEAAAAAAAAAAAAAAAAAAAALBAAAAAAAAAAAAAAAAgAAAAQAAWIEAAFiBAAA4gQAAOIEAABVBAAAVQQAAOIAAAAAAAoAFAAeAEQAagCqAOoBngJkApoAAQAAAAsAigADAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAA4ArgABAAAAAAABAAcAAAABAAAAAAACAAcAYAABAAAAAAADAAcANgABAAAAAAAEAAcAdQABAAAAAAAFAAsAFQABAAAAAAAGAAcASwABAAAAAAAKABoAigADAAEECQABAA4ABwADAAEECQACAA4AZwADAAEECQADAA4APQADAAEECQAEAA4AfAADAAEECQAFABYAIAADAAEECQAGAA4AUgADAAEECQAKADQApGZjaWNvbnMAZgBjAGkAYwBvAG4Ac1ZlcnNpb24gMS4wAFYAZQByAHMAaQBvAG4AIAAxAC4AMGZjaWNvbnMAZgBjAGkAYwBvAG4Ac2ZjaWNvbnMAZgBjAGkAYwBvAG4Ac1JlZ3VsYXIAUgBlAGcAdQBsAGEAcmZjaWNvbnMAZgBjAGkAYwBvAG4Ac0ZvbnQgZ2VuZXJhdGVkIGJ5IEljb01vb24uAEYAbwBuAHQAIABnAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAEkAYwBvAE0AbwBvAG4ALgAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=") format("truetype");
-  font-weight: normal;
-  font-style: normal;
-}
-.fc-icon {
-  /* use !important to prevent issues with browser extensions that change fonts */
-  font-family: "fcicons" !important;
-  speak: none;
-  font-style: normal;
-  font-weight: normal;
-  font-variant: normal;
-  text-transform: none;
-  line-height: 1;
-  /* Better Font Rendering =========== */
-  -webkit-font-smoothing: antialiased;
-  -moz-osx-font-smoothing: grayscale;
-}
-
-.fc-icon-chevron-left:before {
-  content: "";
-}
-
-.fc-icon-chevron-right:before {
-  content: "";
-}
-
-.fc-icon-chevrons-left:before {
-  content: "";
-}
-
-.fc-icon-chevrons-right:before {
-  content: "";
-}
-
-.fc-icon-minus-square:before {
-  content: "";
-}
-
-.fc-icon-plus-square:before {
-  content: "";
-}
-
-.fc-icon-x:before {
-  content: "";
-}
-
-.fc-icon {
-  display: inline-block;
-  width: 1em;
-  height: 1em;
-  text-align: center;
-}
-
-/* Buttons
---------------------------------------------------------------------------------------------------
-Lots taken from Flatly (MIT): https://bootswatch.com/4/flatly/bootstrap.css
-*/
-/* reset */
-.fc-button {
-  border-radius: 0;
-  overflow: visible;
-  text-transform: none;
-  margin: 0;
-  font-family: inherit;
-  font-size: inherit;
-  line-height: inherit;
-}
-
-.fc-button:focus {
-  outline: 1px dotted;
-  outline: 5px auto -webkit-focus-ring-color;
-}
-
-.fc-button {
-  -webkit-appearance: button;
-}
-
-.fc-button:not(:disabled) {
-  cursor: pointer;
-}
-
-.fc-button::-moz-focus-inner {
-  padding: 0;
-  border-style: none;
-}
-
-/* theme */
-.fc-button {
-  display: inline-block;
-  font-weight: 400;
-  color: #212529;
-  text-align: center;
-  vertical-align: middle;
-  -webkit-user-select: none;
-  -moz-user-select: none;
-  -ms-user-select: none;
-  user-select: none;
-  background-color: transparent;
-  border: 1px solid transparent;
-  padding: 0.4em 0.65em;
-  font-size: 1em;
-  line-height: 1.5;
-  border-radius: 0.25em;
-}
-
-.fc-button:hover {
-  color: #212529;
-  text-decoration: none;
-}
-
-.fc-button:focus {
-  outline: 0;
-  -webkit-box-shadow: 0 0 0 0.2rem rgba(44, 62, 80, 0.25);
-  box-shadow: 0 0 0 0.2rem rgba(44, 62, 80, 0.25);
-}
-
-.fc-button:disabled {
-  opacity: 0.65;
-}
-
-/* "primary" coloring */
-.fc-button-primary {
-  color: #fff;
-  background-color: #2C3E50;
-  border-color: #2C3E50;
-}
-
-.fc-button-primary:hover {
-  color: #fff;
-  background-color: #1e2b37;
-  border-color: #1a252f;
-}
-
-.fc-button-primary:focus {
-  -webkit-box-shadow: 0 0 0 0.2rem rgba(76, 91, 106, 0.5);
-  box-shadow: 0 0 0 0.2rem rgba(76, 91, 106, 0.5);
-}
-
-.fc-button-primary:disabled {
-  color: #fff;
-  background-color: #2C3E50;
-  border-color: #2C3E50;
-}
-
-.fc-button-primary:not(:disabled):active,
-.fc-button-primary:not(:disabled).fc-button-active {
-  color: #fff;
-  background-color: #1a252f;
-  border-color: #151e27;
-}
-
-.fc-button-primary:not(:disabled):active:focus,
-.fc-button-primary:not(:disabled).fc-button-active:focus {
-  -webkit-box-shadow: 0 0 0 0.2rem rgba(76, 91, 106, 0.5);
-  box-shadow: 0 0 0 0.2rem rgba(76, 91, 106, 0.5);
-}
-
-/* icons within buttons */
-.fc-button .fc-icon {
-  vertical-align: middle;
-  font-size: 1.5em;
-}
-
-/* Buttons Groups
---------------------------------------------------------------------------------------------------*/
-.fc-button-group {
-  position: relative;
-  display: -webkit-inline-box;
-  display: -ms-inline-flexbox;
-  display: inline-flex;
-  vertical-align: middle;
-}
-
-.fc-button-group > .fc-button {
-  position: relative;
-  -webkit-box-flex: 1;
-  -ms-flex: 1 1 auto;
-  flex: 1 1 auto;
-}
-
-.fc-button-group > .fc-button:hover {
-  z-index: 1;
-}
-
-.fc-button-group > .fc-button:focus,
-.fc-button-group > .fc-button:active,
-.fc-button-group > .fc-button.fc-button-active {
-  z-index: 1;
-}
-
-.fc-button-group > .fc-button:not(:first-child) {
-  margin-left: -1px;
-}
-
-.fc-button-group > .fc-button:not(:last-child) {
-  border-top-right-radius: 0;
-  border-bottom-right-radius: 0;
-}
-
-.fc-button-group > .fc-button:not(:first-child) {
-  border-top-left-radius: 0;
-  border-bottom-left-radius: 0;
-}
-
-/* Popover
---------------------------------------------------------------------------------------------------*/
-.fc-unthemed .fc-popover {
-  border-width: 1px;
-  border-style: solid;
-}
-
-/* List View
---------------------------------------------------------------------------------------------------*/
-.fc-unthemed .fc-list-item:hover td {
-  background-color: #f5f5f5;
-}
-
-/* Toolbar
---------------------------------------------------------------------------------------------------*/
-.fc-toolbar {
-  display: flex;
-  justify-content: space-between;
-  align-items: center;
-}
-
-.fc-toolbar.fc-header-toolbar {
-  margin-bottom: 1.5em;
-}
-
-.fc-toolbar.fc-footer-toolbar {
-  margin-top: 1.5em;
-}
-
-/* inner content */
-.fc-toolbar > * > :not(:first-child) {
-  margin-left: 0.75em;
-}
-
-.fc-toolbar h2 {
-  font-size: 1.75em;
-  margin: 0;
-}
-
-/* View Structure
---------------------------------------------------------------------------------------------------*/
-.fc-view-container {
-  position: relative;
-}
-
-/* undo twitter bootstrap's box-sizing rules. normalizes positioning techniques */
-/* don't do this for the toolbar because we'll want bootstrap to style those buttons as some pt */
-.fc-view-container *,
-.fc-view-container *:before,
-.fc-view-container *:after {
-  -webkit-box-sizing: content-box;
-  -moz-box-sizing: content-box;
-  box-sizing: content-box;
-}
-
-.fc-view,
-.fc-view > table {
-  /* so dragged elements can be above the view's main element */
-  position: relative;
-  z-index: 1;
-}
-
-@media print {
-  .fc {
-    max-width: 100% !important;
-  }
-
-  /* Global Event Restyling
-  --------------------------------------------------------------------------------------------------*/
-  .fc-event {
-    background: #fff !important;
-    color: #000 !important;
-    page-break-inside: avoid;
-  }
-
-  .fc-event .fc-resizer {
-    display: none;
-  }
-
-  /* Table & Day-Row Restyling
-  --------------------------------------------------------------------------------------------------*/
-  .fc th,
-.fc td,
-.fc hr,
-.fc thead,
-.fc tbody,
-.fc-row {
-    border-color: #ccc !important;
-    background: #fff !important;
-  }
-
-  /* kill the overlaid, absolutely-positioned components */
-  /* common... */
-  .fc-bg,
-.fc-bgevent-skeleton,
-.fc-highlight-skeleton,
-.fc-mirror-skeleton,
-.fc-bgevent-container,
-.fc-business-container,
-.fc-highlight-container,
-.fc-mirror-container {
-    display: none;
-  }
-
-  /* don't force a min-height on rows (for DayGrid) */
-  .fc tbody .fc-row {
-    height: auto !important;
-    /* undo height that JS set in distributeHeight */
-    min-height: 0 !important;
-    /* undo the min-height from each view's specific stylesheet */
-  }
-
-  .fc tbody .fc-row .fc-content-skeleton {
-    position: static;
-    /* undo .fc-rigid */
-    padding-bottom: 0 !important;
-    /* use a more border-friendly method for this... */
-  }
-
-  .fc tbody .fc-row .fc-content-skeleton tbody tr:last-child td {
-    /* only works in newer browsers */
-    padding-bottom: 1em;
-    /* ...gives space within the skeleton. also ensures min height in a way */
-  }
-
-  .fc tbody .fc-row .fc-content-skeleton table {
-    /* provides a min-height for the row, but only effective for IE, which exaggerates this value,
-       making it look more like 3em. for other browers, it will already be this tall */
-    height: 1em;
-  }
-
-  /* Undo month-view event limiting. Display all events and hide the "more" links
-  --------------------------------------------------------------------------------------------------*/
-  .fc-more-cell,
-.fc-more {
-    display: none !important;
-  }
-
-  .fc tr.fc-limited {
-    display: table-row !important;
-  }
-
-  .fc td.fc-limited {
-    display: table-cell !important;
-  }
-
-  .fc-popover {
-    display: none;
-    /* never display the "more.." popover in print mode */
-  }
-
-  /* TimeGrid Restyling
-  --------------------------------------------------------------------------------------------------*/
-  /* undo the min-height 100% trick used to fill the container's height */
-  .fc-time-grid {
-    min-height: 0 !important;
-  }
-
-  /* don't display the side axis at all ("all-day" and time cells) */
-  .fc-timeGrid-view .fc-axis {
-    display: none;
-  }
-
-  /* don't display the horizontal lines */
-  .fc-slats,
-.fc-time-grid hr {
-    /* this hr is used when height is underused and needs to be filled */
-    display: none !important;
-    /* important overrides inline declaration */
-  }
-
-  /* let the container that holds the events be naturally positioned and create real height */
-  .fc-time-grid .fc-content-skeleton {
-    position: static;
-  }
-
-  /* in case there are no events, we still want some height */
-  .fc-time-grid .fc-content-skeleton table {
-    height: 4em;
-  }
-
-  /* kill the horizontal spacing made by the event container. event margins will be done below */
-  .fc-time-grid .fc-event-container {
-    margin: 0 !important;
-  }
-
-  /* TimeGrid *Event* Restyling
-  --------------------------------------------------------------------------------------------------*/
-  /* naturally position events, vertically stacking them */
-  .fc-time-grid .fc-event {
-    position: static !important;
-    margin: 3px 2px !important;
-  }
-
-  /* for events that continue to a future day, give the bottom border back */
-  .fc-time-grid .fc-event.fc-not-end {
-    border-bottom-width: 1px !important;
-  }
-
-  /* indicate the event continues via "..." text */
-  .fc-time-grid .fc-event.fc-not-end:after {
-    content: "...";
-  }
-
-  /* for events that are continuations from previous days, give the top border back */
-  .fc-time-grid .fc-event.fc-not-start {
-    border-top-width: 1px !important;
-  }
-
-  /* indicate the event is a continuation via "..." text */
-  .fc-time-grid .fc-event.fc-not-start:before {
-    content: "...";
-  }
-
-  /* time */
-  /* undo a previous declaration and let the time text span to a second line */
-  .fc-time-grid .fc-event .fc-time {
-    white-space: normal !important;
-  }
-
-  /* hide the the time that is normally displayed... */
-  .fc-time-grid .fc-event .fc-time span {
-    display: none;
-  }
-
-  /* ...replace it with a more verbose version (includes AM/PM) stored in an html attribute */
-  .fc-time-grid .fc-event .fc-time:after {
-    content: attr(data-full);
-  }
-
-  /* Vertical Scroller & Containers
-  --------------------------------------------------------------------------------------------------*/
-  /* kill the scrollbars and allow natural height */
-  .fc-scroller,
-.fc-day-grid-container,
-.fc-time-grid-container {
-    /* */
-    overflow: visible !important;
-    height: auto !important;
-  }
-
-  /* kill the horizontal border/padding used to compensate for scrollbars */
-  .fc-row {
-    border: 0 !important;
-    margin: 0 !important;
-  }
-
-  /* Button Controls
-  --------------------------------------------------------------------------------------------------*/
-  .fc-button-group,
-.fc button {
-    display: none;
-    /* don't display any button-related controls */
-  }
-}
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/core/main.d.ts b/AKPlan/static/AKPlan/vendor/fullcalendar/core/main.d.ts
deleted file mode 100644
index 4fa13554787b6c22b3a96305e87d61f50b6cec30..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/core/main.d.ts
+++ /dev/null
@@ -1,2865 +0,0 @@
-// Generated by dts-bundle v0.7.3-fork.1
-// Dependencies for this module:
-//   ../../../../../@fullcalendar/core
-
-declare module '@fullcalendar/core' {
-    export const version = "<%= version %>";
-    export { OptionsInput } from '@fullcalendar/core/types/input-types';
-    export { EventInput, EventDef, EventDefHash, EventInstance, EventInstanceHash, parseEventDef, createEventInstance, EventTuple } from '@fullcalendar/core/structs/event';
-    export { BusinessHoursInput, parseBusinessHours } from '@fullcalendar/core/structs/business-hours';
-    export { applyAll, debounce, padStart, isInt, capitaliseFirstLetter, parseFieldSpecs, compareByFieldSpecs, compareByFieldSpec, flexibleCompare, computeVisibleDayRange, refineProps, matchCellWidths, uncompensateScroll, compensateScroll, subtractInnerElHeight, isMultiDayRange, distributeHeight, undistributeHeight, preventSelection, allowSelection, preventContextMenu, allowContextMenu, compareNumbers, enableCursor, disableCursor, diffDates } from '@fullcalendar/core/util/misc';
-    export { htmlEscape, cssToStr } from '@fullcalendar/core/util/html';
-    export { removeExact, isArraysEqual } from '@fullcalendar/core/util/array';
-    export { memoize, memoizeOutput } from '@fullcalendar/core/util/memoize';
-    export { memoizeRendering, MemoizedRendering } from '@fullcalendar/core/component/memoized-rendering';
-    export { intersectRects, Rect, pointInsideRect, constrainPoint, getRectCenter, diffPoints, Point, translateRect } from '@fullcalendar/core/util/geom';
-    export { mapHash, filterHash, isPropsEqual } from '@fullcalendar/core/util/object';
-    export { findElements, findChildren, htmlToElement, createElement, insertAfterElement, prependToElement, removeElement, appendToElement, applyStyle, applyStyleProp, elementMatches, elementClosest, forceClassName } from '@fullcalendar/core/util/dom-manip';
-    export { EventStore, filterEventStoreDefs, createEmptyEventStore, mergeEventStores, getRelevantEvents, eventTupleToStore } from '@fullcalendar/core/structs/event-store';
-    export { EventUiHash, EventUi, processScopedUiProps, combineEventUis } from '@fullcalendar/core/component/event-ui';
-    export { default as Splitter, SplittableProps } from '@fullcalendar/core/component/event-splitting';
-    export { buildGotoAnchorHtml, getAllDayHtml, getDayClasses } from '@fullcalendar/core/component/date-rendering';
-    export { preventDefault, listenBySelector, whenTransitionDone } from '@fullcalendar/core/util/dom-event';
-    export { computeInnerRect, computeEdges, computeHeightAndMargins, getClippingParents, computeClippingRect, computeRect } from '@fullcalendar/core/util/dom-geom';
-    export { unpromisify } from '@fullcalendar/core/util/promise';
-    export { default as EmitterMixin, EmitterInterface } from '@fullcalendar/core/common/EmitterMixin';
-    export { DateRange, rangeContainsMarker, intersectRanges, rangesEqual, rangesIntersect, rangeContainsRange } from '@fullcalendar/core/datelib/date-range';
-    export { default as Mixin } from '@fullcalendar/core/common/Mixin';
-    export { default as PositionCache } from '@fullcalendar/core/common/PositionCache';
-    export { default as ScrollComponent, ScrollbarWidths } from '@fullcalendar/core/common/ScrollComponent';
-    export { ScrollController, ElementScrollController, WindowScrollController } from '@fullcalendar/core/common/scroll-controller';
-    export { default as Theme } from '@fullcalendar/core/theme/Theme';
-    export { default as Component, ComponentContext } from '@fullcalendar/core/component/Component';
-    export { default as DateComponent, Seg, EventSegUiInteractionState } from '@fullcalendar/core/component/DateComponent';
-    export { default as Calendar, DatePointTransform, DateSpanTransform, DateSelectionApi } from '@fullcalendar/core/Calendar';
-    export { default as View, ViewProps } from '@fullcalendar/core/View';
-    export { default as FgEventRenderer, buildSegCompareObj } from '@fullcalendar/core/component/renderers/FgEventRenderer';
-    export { default as FillRenderer } from '@fullcalendar/core/component/renderers/FillRenderer';
-    export { default as DateProfileGenerator, DateProfile } from '@fullcalendar/core/DateProfileGenerator';
-    export { ViewDef } from '@fullcalendar/core/structs/view-def';
-    export { ViewSpec } from '@fullcalendar/core/structs/view-spec';
-    export { DateSpan, DateSpanApi, DatePointApi, isDateSpansEqual } from '@fullcalendar/core/structs/date-span';
-    export { DateMarker, addDays, startOfDay, addMs, addWeeks, diffWeeks, diffWholeWeeks, diffWholeDays, diffDayAndTime, diffDays, isValidDate } from '@fullcalendar/core/datelib/marker';
-    export { Duration, createDuration, isSingleDay, multiplyDuration, addDurations, asRoughMinutes, asRoughSeconds, asRoughMs, wholeDivideDurations, greatestDurationDenominator } from '@fullcalendar/core/datelib/duration';
-    export { DateEnv, DateMarkerMeta } from '@fullcalendar/core/datelib/env';
-    export { DateFormatter, createFormatter, VerboseFormattingArg, formatIsoTimeString } from '@fullcalendar/core/datelib/formatting';
-    export { NamedTimeZoneImpl } from '@fullcalendar/core/datelib/timezone';
-    export { parse as parseMarker } from '@fullcalendar/core/datelib/parsing';
-    export { EventSourceDef, EventSource, EventSourceHash } from '@fullcalendar/core/structs/event-source';
-    export { Interaction, InteractionSettings, interactionSettingsToStore, interactionSettingsStore, InteractionSettingsStore } from '@fullcalendar/core/interactions/interaction';
-    export { PointerDragEvent } from '@fullcalendar/core/interactions/pointer';
-    export { Hit } from '@fullcalendar/core/interactions/hit';
-    export { dateSelectionJoinTransformer } from '@fullcalendar/core/interactions/date-selecting';
-    export { eventDragMutationMassager, EventDropTransformers } from '@fullcalendar/core/interactions/event-dragging';
-    export { EventResizeJoinTransforms } from '@fullcalendar/core/interactions/event-resizing';
-    export { default as ElementDragging } from '@fullcalendar/core/interactions/ElementDragging';
-    export { formatDate, formatRange } from '@fullcalendar/core/formatting-api';
-    export { globalDefaults, config } from '@fullcalendar/core/options';
-    export { RecurringType, ParsedRecurring } from '@fullcalendar/core/structs/recurring-event';
-    export { DragMetaInput, DragMeta, parseDragMeta } from '@fullcalendar/core/structs/drag-meta';
-    export { createPlugin, PluginDef, PluginDefInput, ViewPropsTransformer, ViewContainerModifier } from '@fullcalendar/core/plugin-system';
-    export { reducerFunc, Action, CalendarState } from '@fullcalendar/core/reducers/types';
-    export { CalendarComponentProps } from '@fullcalendar/core/CalendarComponent';
-    export { default as DayHeader } from '@fullcalendar/core/common/DayHeader';
-    export { computeFallbackHeaderFormat, renderDateCell } from '@fullcalendar/core/common/table-utils';
-    export { default as DaySeries } from '@fullcalendar/core/common/DaySeries';
-    export { EventInteractionState } from '@fullcalendar/core/interactions/event-interaction-state';
-    export { EventRenderRange, sliceEventStore, hasBgRendering, getElSeg } from '@fullcalendar/core/component/event-rendering';
-    export { default as DayTable, DayTableSeg, DayTableCell } from '@fullcalendar/core/common/DayTable';
-    export { default as Slicer, SlicedProps } from '@fullcalendar/core/common/slicing-utils';
-    export { EventMutation, applyMutationToEventStore } from '@fullcalendar/core/structs/event-mutation';
-    export { Constraint, ConstraintInput, AllowFunc, isPropsValid, isInteractionValid } from '@fullcalendar/core/validation';
-    export { default as EventApi } from '@fullcalendar/core/api/EventApi';
-    export { default as requestJson } from '@fullcalendar/core/util/requestJson';
-}
-
-declare module '@fullcalendar/core/types/input-types' {
-    import View from '@fullcalendar/core/View';
-    import {EventInputTransformer, EventSourceInput} from '@fullcalendar/core/structs/event-source';
-    import {Duration, DurationInput} from '@fullcalendar/core/datelib/duration';
-    import {DateInput} from '@fullcalendar/core/datelib/env';
-    import {FormatterInput} from '@fullcalendar/core/datelib/formatting';
-    import {DateRangeInput} from '@fullcalendar/core/datelib/date-range';
-    import {BusinessHoursInput} from '@fullcalendar/core/structs/business-hours';
-    import EventApi from '@fullcalendar/core/api/EventApi';
-    import {AllowFunc, ConstraintInput, OverlapFunc} from '@fullcalendar/core/validation';
-    import {PluginDef} from '@fullcalendar/core/plugin-system';
-    import {LocaleSingularArg, RawLocale} from '@fullcalendar/core/datelib/locale';
-
-    export interface ToolbarInput {
-        left?: string;
-        center?: string;
-        right?: string;
-    }
-
-    export interface CustomButtonInput {
-        text: string;
-        icon?: string;
-        themeIcon?: string;
-        bootstrapFontAwesome?: string;
-        click(element: HTMLElement): void;
-    }
-    export interface ButtonIconsInput {
-        prev?: string;
-        next?: string;
-        prevYear?: string;
-        nextYear?: string;
-    }
-    export interface ButtonTextCompoundInput {
-        prev?: string;
-        next?: string;
-        prevYear?: string;
-        nextYear?: string;
-        today?: string;
-        month?: string;
-        week?: string;
-        day?: string;
-        [viewId: string]: string | undefined;
-    }
-    export interface EventSegment {
-        event: EventApi;
-        start: Date;
-        end: Date;
-        isStart: boolean;
-        isEnd: boolean;
-    }
-    export interface CellInfo {
-        date: Date;
-        dayEl: HTMLElement;
-        moreEl: HTMLElement;
-        segs: EventSegment[];
-        hiddenSegs: EventSegment[];
-    }
-    export interface DropInfo {
-        start: Date;
-        end: Date;
-    }
-    export type EventHandlerName = '_init' | 'selectAllow' | 'eventAllow' | 'eventDataTransform' | 'datesRender' | 'datesDestroy' | 'dayRender' | 'windowResize' | 'dateClick' | 'eventClick' | 'eventMouseEnter' | 'eventMouseLeave' | 'select' | 'unselect' | 'loading' | 'eventRender' | 'eventPositioned' | '_eventsPositioned' | 'eventDestroy' | 'eventDragStart' | 'eventDragStop' | 'eventDrop' | '_destroyed' | 'drop' | 'eventResizeStart' | 'eventResizeStop' | 'eventResize' | 'eventReceive' | 'eventLeave' | 'viewSkeletonRender' | 'viewSkeletonDestroy' | '_noEventDrop' | '_noEventResize' | 'eventLimitClick' | 'resourceRender';
-    export type EventHandlerArgs<T extends EventHandlerName> = Parameters<Extract<OptionsInput[T], (...args: any[]) => any>>;
-    export type EventHandlerArg<T extends EventHandlerName> = EventHandlerArgs<T>[0];
-    export interface OptionsInputBase {
-        header?: boolean | ToolbarInput;
-        footer?: boolean | ToolbarInput;
-        customButtons?: {
-            [name: string]: CustomButtonInput;
-        };
-        buttonIcons?: boolean | ButtonIconsInput;
-        themeSystem?: 'standard' | string;
-        bootstrapFontAwesome?: boolean | ButtonIconsInput;
-        firstDay?: number;
-        dir?: 'ltr' | 'rtl' | 'auto';
-        weekends?: boolean;
-        hiddenDays?: number[];
-        fixedWeekCount?: boolean;
-        weekNumbers?: boolean;
-        weekNumbersWithinDays?: boolean;
-        weekNumberCalculation?: 'local' | 'ISO' | ((m: Date) => number);
-        businessHours?: BusinessHoursInput;
-        showNonCurrentDates?: boolean;
-        height?: number | 'auto' | 'parent' | (() => number);
-        contentHeight?: number | 'auto' | (() => number);
-        aspectRatio?: number;
-        handleWindowResize?: boolean;
-        windowResizeDelay?: number;
-        eventLimit?: boolean | number;
-        eventLimitClick?: 'popover' | 'week' | 'day' | 'timeGridWeek' | 'timeGridDay' | string | ((arg: {
-            date: Date;
-            allDay: boolean;
-            dayEl: HTMLElement;
-            moreEl: HTMLElement;
-            segs: any[];
-            hiddenSegs: any[];
-            jsEvent: MouseEvent;
-            view: View;
-        }) => void);
-        timeZone?: string | boolean;
-        now?: DateInput | (() => DateInput);
-        defaultView?: string;
-        allDaySlot?: boolean;
-        allDayText?: string;
-        slotDuration?: DurationInput;
-        slotLabelFormat?: FormatterInput;
-        slotLabelInterval?: DurationInput;
-        snapDuration?: DurationInput;
-        scrollTime?: DurationInput;
-        minTime?: DurationInput;
-        maxTime?: DurationInput;
-        slotEventOverlap?: boolean;
-        listDayFormat?: FormatterInput | boolean;
-        listDayAltFormat?: FormatterInput | boolean;
-        noEventsMessage?: string;
-        defaultDate?: DateInput;
-        nowIndicator?: boolean;
-        visibleRange?: ((currentDate: Date) => DateRangeInput) | DateRangeInput;
-        validRange?: DateRangeInput;
-        dateIncrement?: DurationInput;
-        dateAlignment?: string;
-        duration?: DurationInput;
-        dayCount?: number;
-        locales?: RawLocale[];
-        locale?: LocaleSingularArg;
-        eventTimeFormat?: FormatterInput;
-        columnHeader?: boolean;
-        columnHeaderFormat?: FormatterInput;
-        columnHeaderText?: string | ((date: DateInput) => string);
-        columnHeaderHtml?: string | ((date: DateInput) => string);
-        titleFormat?: FormatterInput;
-        weekLabel?: string;
-        displayEventTime?: boolean;
-        displayEventEnd?: boolean;
-        eventLimitText?: string | ((eventCnt: number) => string);
-        dayPopoverFormat?: FormatterInput;
-        navLinks?: boolean;
-        navLinkDayClick?: string | ((date: Date, jsEvent: Event) => void);
-        navLinkWeekClick?: string | ((weekStart: any, jsEvent: Event) => void);
-        selectable?: boolean;
-        selectMirror?: boolean;
-        unselectAuto?: boolean;
-        unselectCancel?: string;
-        defaultAllDayEventDuration?: DurationInput;
-        defaultTimedEventDuration?: DurationInput;
-        cmdFormatter?: string;
-        defaultRangeSeparator?: string;
-        selectConstraint?: ConstraintInput;
-        selectOverlap?: boolean | OverlapFunc;
-        selectAllow?: AllowFunc;
-        editable?: boolean;
-        eventStartEditable?: boolean;
-        eventDurationEditable?: boolean;
-        eventConstraint?: ConstraintInput;
-        eventOverlap?: boolean | OverlapFunc;
-        eventAllow?: AllowFunc;
-        eventClassName?: string[] | string;
-        eventClassNames?: string[] | string;
-        eventBackgroundColor?: string;
-        eventBorderColor?: string;
-        eventTextColor?: string;
-        eventColor?: string;
-        events?: EventSourceInput;
-        eventSources?: EventSourceInput[];
-        allDayDefault?: boolean;
-        startParam?: string;
-        endParam?: string;
-        lazyFetching?: boolean;
-        nextDayThreshold?: DurationInput;
-        eventOrder?: string | Array<((a: EventApi, b: EventApi) => number) | (string | ((a: EventApi, b: EventApi) => number))>;
-        rerenderDelay?: number | null;
-        dragRevertDuration?: number;
-        dragScroll?: boolean;
-        longPressDelay?: number;
-        eventLongPressDelay?: number;
-        droppable?: boolean;
-        dropAccept?: string | ((draggable: any) => boolean);
-        eventDataTransform?: EventInputTransformer;
-        allDayMaintainDuration?: boolean;
-        eventResizableFromStart?: boolean;
-        timeGridEventMinHeight?: number;
-        allDayHtml?: string;
-        eventDragMinDistance?: number;
-        eventSourceFailure?: any;
-        eventSourceSuccess?: any;
-        forceEventDuration?: boolean;
-        progressiveEventRendering?: boolean;
-        selectLongPressDelay?: number;
-        selectMinDistance?: number;
-        timeZoneParam?: string;
-        titleRangeSeparator?: string;
-        datesRender?(arg: {
-            view: View;
-            el: HTMLElement;
-        }): void;
-        datesDestroy?(arg: {
-            view: View;
-            el: HTMLElement;
-        }): void;
-        dayRender?(arg: {
-            view: View;
-            date: Date;
-            allDay?: boolean;
-            el: HTMLElement;
-        }): void;
-        windowResize?(view: View): void;
-        dateClick?(arg: {
-            date: Date;
-            dateStr: string;
-            allDay: boolean;
-            resource?: any;
-            dayEl: HTMLElement;
-            jsEvent: MouseEvent;
-            view: View;
-        }): void;
-        eventClick?(arg: {
-            el: HTMLElement;
-            event: EventApi;
-            jsEvent: MouseEvent;
-            view: View;
-        }): boolean | void;
-        eventMouseEnter?(arg: {
-            el: HTMLElement;
-            event: EventApi;
-            jsEvent: MouseEvent;
-            view: View;
-        }): void;
-        eventMouseLeave?(arg: {
-            el: HTMLElement;
-            event: EventApi;
-            jsEvent: MouseEvent;
-            view: View;
-        }): void;
-        select?(arg: {
-            start: Date;
-            end: Date;
-            startStr: string;
-            endStr: string;
-            allDay: boolean;
-            resource?: any;
-            jsEvent: MouseEvent;
-            view: View;
-        }): void;
-        unselect?(arg: {
-            view: View;
-            jsEvent: Event;
-        }): void;
-        loading?(isLoading: boolean): void;
-        eventRender?(arg: {
-            isMirror: boolean;
-            isStart: boolean;
-            isEnd: boolean;
-            event: EventApi;
-            el: HTMLElement;
-            view: View;
-        }): void;
-        eventPositioned?(arg: {
-            isMirror: boolean;
-            isStart: boolean;
-            isEnd: boolean;
-            event: EventApi;
-            el: HTMLElement;
-            view: View;
-        }): void;
-        _eventsPositioned?(arg: {
-            view: View;
-        }): void;
-        eventDestroy?(arg: {
-            isMirror: boolean;
-            event: EventApi;
-            el: HTMLElement;
-            view: View;
-        }): void;
-        eventDragStart?(arg: {
-            event: EventApi;
-            el: HTMLElement;
-            jsEvent: MouseEvent;
-            view: View;
-        }): void;
-        eventDragStop?(arg: {
-            event: EventApi;
-            el: HTMLElement;
-            jsEvent: MouseEvent;
-            view: View;
-        }): void;
-        eventDrop?(arg: {
-            el: HTMLElement;
-            event: EventApi;
-            oldEvent: EventApi;
-            delta: Duration;
-            revert: () => void;
-            jsEvent: Event;
-            view: View;
-        }): void;
-        eventResizeStart?(arg: {
-            el: HTMLElement;
-            event: EventApi;
-            jsEvent: MouseEvent;
-            view: View;
-        }): void;
-        eventResizeStop?(arg: {
-            el: HTMLElement;
-            event: EventApi;
-            jsEvent: MouseEvent;
-            view: View;
-        }): void;
-        eventResize?(arg: {
-            el: HTMLElement;
-            startDelta: Duration;
-            endDelta: Duration;
-            prevEvent: EventApi;
-            event: EventApi;
-            revert: () => void;
-            jsEvent: Event;
-            view: View;
-        }): void;
-        drop?(arg: {
-            date: Date;
-            dateStr: string;
-            allDay: boolean;
-            draggedEl: HTMLElement;
-            jsEvent: MouseEvent;
-            view: View;
-        }): void;
-        eventReceive?(arg: {
-            event: EventApi;
-            draggedEl: HTMLElement;
-            view: View;
-        }): void;
-        eventLeave?(arg: {
-            draggedEl: HTMLElement;
-            event: EventApi;
-            view: View;
-        }): void;
-        viewSkeletonRender?(arg: {
-            el: HTMLElement;
-            view: View;
-        }): void;
-        viewSkeletonDestroy?(arg: {
-            el: HTMLElement;
-            view: View;
-        }): void;
-        _destroyed?(): void;
-        _init?(): void;
-        _noEventDrop?(): void;
-        _noEventResize?(): void;
-        resourceRender?(arg: {
-            resource: any;
-            el: HTMLElement;
-            view: View;
-        }): void;
-    }
-    export interface ViewOptionsInput extends OptionsInputBase {
-        type?: string;
-        buttonText?: string;
-    }
-    export interface OptionsInput extends OptionsInputBase {
-        buttonText?: ButtonTextCompoundInput;
-        views?: {
-            [viewId: string]: ViewOptionsInput;
-        };
-        plugins?: (PluginDef | string)[];
-    }
-}
-
-declare module '@fullcalendar/core/structs/event' {
-    import {DateInput} from '@fullcalendar/core/datelib/env';
-    import Calendar from '@fullcalendar/core/Calendar';
-    import {DateRange} from '@fullcalendar/core/datelib/date-range';
-    import {Duration} from '@fullcalendar/core/datelib/duration';
-    import {EventUi, UnscopedEventUiInput} from '@fullcalendar/core/component/event-ui';
-    export type EventRenderingChoice = '' | 'background' | 'inverse-background' | 'none';
-
-    export interface EventNonDateInput extends UnscopedEventUiInput {
-        id?: string | number;
-        groupId?: string | number;
-        title?: string;
-        url?: string;
-        rendering?: EventRenderingChoice;
-        extendedProps?: object;
-
-        [extendedProp: string]: any;
-    }
-    export interface EventDateInput {
-        start?: DateInput;
-        end?: DateInput;
-        date?: DateInput;
-        allDay?: boolean;
-    }
-    export type EventInput = EventNonDateInput & EventDateInput;
-    export interface EventDef {
-        defId: string;
-        sourceId: string;
-        publicId: string;
-        groupId: string;
-        allDay: boolean;
-        hasEnd: boolean;
-        recurringDef: {
-            typeId: number;
-            typeData: any;
-            duration: Duration | null;
-        } | null;
-        title: string;
-        url: string;
-        rendering: EventRenderingChoice;
-        ui: EventUi;
-        extendedProps: any;
-    }
-    export interface EventInstance {
-        instanceId: string;
-        defId: string;
-        range: DateRange;
-        forcedStartTzo: number | null;
-        forcedEndTzo: number | null;
-    }
-    export interface EventTuple {
-        def: EventDef;
-        instance: EventInstance | null;
-    }
-    export type EventInstanceHash = {
-        [instanceId: string]: EventInstance;
-    };
-    export type EventDefHash = {
-        [defId: string]: EventDef;
-    };
-    export const NON_DATE_PROPS: {
-        id: StringConstructor;
-        groupId: StringConstructor;
-        title: StringConstructor;
-        url: StringConstructor;
-        rendering: StringConstructor;
-        extendedProps: any;
-    };
-    export const DATE_PROPS: {
-        start: any;
-        date: any;
-        end: any;
-        allDay: any;
-    };
-    export function parseEvent(raw: EventInput, sourceId: string, calendar: Calendar, allowOpenRange?: boolean): EventTuple | null;
-    export function parseEventDef(raw: EventNonDateInput, sourceId: string, allDay: boolean, hasEnd: boolean, calendar: Calendar): EventDef;
-    export type eventDefParserFunc = (def: EventDef, props: any, leftovers: any) => void;
-    export function createEventInstance(defId: string, range: DateRange, forcedStartTzo?: number, forcedEndTzo?: number): EventInstance;
-}
-
-declare module '@fullcalendar/core/structs/business-hours' {
-    import Calendar from '@fullcalendar/core/Calendar';
-    import {EventInput} from '@fullcalendar/core/structs/event';
-    import {EventStore} from '@fullcalendar/core/structs/event-store';
-    export type BusinessHoursInput = boolean | EventInput | EventInput[];
-
-    export function parseBusinessHours(input: BusinessHoursInput, calendar: Calendar): EventStore;
-}
-
-declare module '@fullcalendar/core/util/misc' {
-    import {DateMarker} from '@fullcalendar/core/datelib/marker';
-    import {Duration} from '@fullcalendar/core/datelib/duration';
-    import {DateEnv} from '@fullcalendar/core/datelib/env';
-    import {DateRange, OpenDateRange} from '@fullcalendar/core/datelib/date-range';
-
-    export function compensateScroll(rowEl: HTMLElement, scrollbarWidths: any): void;
-
-    export function uncompensateScroll(rowEl: HTMLElement): void;
-
-    export function disableCursor(): void;
-
-    export function enableCursor(): void;
-
-    export function distributeHeight(els: HTMLElement[], availableHeight: any, shouldRedistribute: any): void;
-
-    export function undistributeHeight(els: HTMLElement[]): void;
-
-    export function matchCellWidths(els: HTMLElement[]): number;
-
-    export function subtractInnerElHeight(outerEl: HTMLElement, innerEl: HTMLElement): number;
-
-    export function preventSelection(el: HTMLElement): void;
-    export function allowSelection(el: HTMLElement): void;
-    export function preventContextMenu(el: HTMLElement): void;
-    export function allowContextMenu(el: HTMLElement): void;
-    export function parseFieldSpecs(input: any): any[];
-    export function compareByFieldSpecs(obj0: any, obj1: any, fieldSpecs: any): any;
-    export function compareByFieldSpec(obj0: any, obj1: any, fieldSpec: any): any;
-    export function flexibleCompare(a: any, b: any): number;
-    export function capitaliseFirstLetter(str: any): any;
-    export function padStart(val: any, len: any): string;
-    export function compareNumbers(a: any, b: any): number;
-    export function isInt(n: any): boolean;
-    export function applyAll(functions: any, thisObj: any, args: any): any;
-    export function firstDefined(...args: any[]): any;
-    export function debounce(func: any, wait: any): () => any;
-    export type GenericHash = {
-        [key: string]: any;
-    };
-    export function refineProps(rawProps: GenericHash, processors: GenericHash, defaults?: GenericHash, leftoverProps?: GenericHash): GenericHash;
-    export function computeAlignedDayRange(timedRange: DateRange): DateRange;
-    export function computeVisibleDayRange(timedRange: OpenDateRange, nextDayThreshold?: Duration): OpenDateRange;
-    export function isMultiDayRange(range: DateRange): boolean;
-    export function diffDates(date0: DateMarker, date1: DateMarker, dateEnv: DateEnv, largeUnit?: string): Duration;
-}
-
-declare module '@fullcalendar/core/util/html' {
-    export function htmlEscape(s: any): string;
-    export function cssToStr(cssProps: any): string;
-    export function attrsToStr(attrs: any): string;
-    export type ClassNameInput = string | string[];
-    export function parseClassName(raw: ClassNameInput): string[];
-}
-
-declare module '@fullcalendar/core/util/array' {
-    export function removeMatching(array: any, testFunc: any): number;
-    export function removeExact(array: any, exactVal: any): number;
-    export function isArraysEqual(a0: any, a1: any): boolean;
-}
-
-declare module '@fullcalendar/core/util/memoize' {
-    export function memoize<T>(workerFunc: T): T;
-    export function memoizeOutput<T>(workerFunc: T, equalityFunc: (output0: any, output1: any) => boolean): T;
-}
-
-declare module '@fullcalendar/core/component/memoized-rendering' {
-    export interface MemoizedRendering<ArgsType extends any[]> {
-        (...args: ArgsType): void;
-        unrender: () => void;
-        dependents: MemoizedRendering<any>[];
-    }
-    export function memoizeRendering<ArgsType extends any[]>(renderFunc: (...args: ArgsType) => void, unrenderFunc?: (...args: ArgsType) => void, dependencies?: MemoizedRendering<any>[]): MemoizedRendering<ArgsType>;
-}
-
-declare module '@fullcalendar/core/util/geom' {
-    export interface Point {
-        left: number;
-        top: number;
-    }
-    export interface Rect {
-        left: number;
-        right: number;
-        top: number;
-        bottom: number;
-    }
-    export function pointInsideRect(point: Point, rect: Rect): boolean;
-    export function intersectRects(rect1: Rect, rect2: Rect): Rect | false;
-    export function translateRect(rect: Rect, deltaX: number, deltaY: number): Rect;
-    export function constrainPoint(point: Point, rect: Rect): Point;
-    export function getRectCenter(rect: Rect): Point;
-    export function diffPoints(point1: Point, point2: Point): Point;
-}
-
-declare module '@fullcalendar/core/util/object' {
-    export function mergeProps(propObjs: any, complexProps?: any): any;
-    export function filterHash(hash: any, func: any): {};
-    export function mapHash<InputItem, OutputItem>(hash: {
-        [key: string]: InputItem;
-    }, func: (input: InputItem, key: string) => OutputItem): {
-        [key: string]: OutputItem;
-    };
-    export function arrayToHash(a: any): {
-        [key: string]: true;
-    };
-    export function hashValuesToArray(obj: any): any[];
-    export function isPropsEqual(obj0: any, obj1: any): boolean;
-}
-
-declare module '@fullcalendar/core/util/dom-manip' {
-    export function createElement(tagName: string, attrs: object | null, content?: ElementContent): HTMLElement;
-    export function htmlToElement(html: string): HTMLElement;
-    export function htmlToElements(html: string): HTMLElement[];
-    export type ElementContent = string | Node | Node[] | NodeList;
-    export function appendToElement(el: HTMLElement, content: ElementContent): void;
-    export function prependToElement(parent: HTMLElement, content: ElementContent): void;
-    export function insertAfterElement(refEl: HTMLElement, content: ElementContent): void;
-    export function removeElement(el: HTMLElement): void;
-    export function elementClosest(el: HTMLElement, selector: string): HTMLElement;
-    export function elementMatches(el: HTMLElement, selector: string): HTMLElement;
-    export function findElements(container: HTMLElement[] | HTMLElement | NodeListOf<HTMLElement>, selector: string): HTMLElement[];
-    export function findChildren(parent: HTMLElement[] | HTMLElement, selector?: string): HTMLElement[];
-    export function forceClassName(el: HTMLElement, className: string, bool: any): void;
-    export function applyStyle(el: HTMLElement, props: object): void;
-    export function applyStyleProp(el: HTMLElement, name: string, val: any): void;
-}
-
-declare module '@fullcalendar/core/structs/event-store' {
-    import {EventDef, EventDefHash, EventInput, EventInstanceHash, EventTuple} from '@fullcalendar/core/structs/event';
-    import {EventSource} from '@fullcalendar/core/structs/event-source';
-    import Calendar from '@fullcalendar/core/Calendar';
-    import {DateRange} from '@fullcalendar/core/datelib/date-range';
-
-    export interface EventStore {
-        defs: EventDefHash;
-        instances: EventInstanceHash;
-    }
-
-    export function parseEvents(rawEvents: EventInput[], sourceId: string, calendar: Calendar, allowOpenRange?: boolean): EventStore;
-
-    export function eventTupleToStore(tuple: EventTuple, eventStore?: EventStore): EventStore;
-
-    export function expandRecurring(eventStore: EventStore, framingRange: DateRange, calendar: Calendar): EventStore;
-
-    export function getRelevantEvents(eventStore: EventStore, instanceId: string): EventStore;
-
-    export function transformRawEvents(rawEvents: any, eventSource: EventSource, calendar: Calendar): any;
-    export function createEmptyEventStore(): EventStore;
-    export function mergeEventStores(store0: EventStore, store1: EventStore): EventStore;
-    export function filterEventStoreDefs(eventStore: EventStore, filterFunc: (eventDef: EventDef) => boolean): EventStore;
-}
-
-declare module '@fullcalendar/core/component/event-ui' {
-    import {AllowFunc, Constraint, ConstraintInput} from '@fullcalendar/core/validation';
-    import {parseClassName} from '@fullcalendar/core/util/html';
-    import Calendar from '@fullcalendar/core/Calendar';
-
-    export interface UnscopedEventUiInput {
-        editable?: boolean;
-        startEditable?: boolean;
-        durationEditable?: boolean;
-        constraint?: ConstraintInput;
-        overlap?: boolean;
-        allow?: AllowFunc;
-        className?: string[] | string;
-        classNames?: string[] | string;
-        backgroundColor?: string;
-        borderColor?: string;
-        textColor?: string;
-        color?: string;
-    }
-    export interface EventUi {
-        startEditable: boolean | null;
-        durationEditable: boolean | null;
-        constraints: Constraint[];
-        overlap: boolean | null;
-        allows: AllowFunc[];
-        backgroundColor: string;
-        borderColor: string;
-        textColor: string;
-        classNames: string[];
-    }
-    export type EventUiHash = {
-        [defId: string]: EventUi;
-    };
-    export const UNSCOPED_EVENT_UI_PROPS: {
-        editable: BooleanConstructor;
-        startEditable: BooleanConstructor;
-        durationEditable: BooleanConstructor;
-        constraint: any;
-        overlap: any;
-        allow: any;
-        className: typeof parseClassName;
-        classNames: typeof parseClassName;
-        color: StringConstructor;
-        backgroundColor: StringConstructor;
-        borderColor: StringConstructor;
-        textColor: StringConstructor;
-    };
-    export function processUnscopedUiProps(rawProps: UnscopedEventUiInput, calendar: Calendar, leftovers?: any): EventUi;
-    export function processScopedUiProps(prefix: string, rawScoped: any, calendar: Calendar, leftovers?: any): EventUi;
-    export function combineEventUis(uis: EventUi[]): EventUi;
-}
-
-declare module '@fullcalendar/core/component/event-splitting' {
-    import {EventStore} from '@fullcalendar/core/structs/event-store';
-    import {EventDef} from '@fullcalendar/core/structs/event';
-    import {EventInteractionState} from '@fullcalendar/core/interactions/event-interaction-state';
-    import {EventUi, EventUiHash} from '@fullcalendar/core/component/event-ui';
-    import {DateSpan} from '@fullcalendar/core/structs/date-span';
-
-    export interface SplittableProps {
-        businessHours: EventStore | null;
-        dateSelection: DateSpan | null;
-        eventStore: EventStore;
-        eventUiBases: EventUiHash;
-        eventSelection: string;
-        eventDrag: EventInteractionState | null;
-        eventResize: EventInteractionState | null;
-    }
-    export { Splitter as default, Splitter };
-    abstract class Splitter<PropsType extends SplittableProps = SplittableProps> {
-        abstract getKeyInfo(props: PropsType): {
-            [key: string]: {
-                ui?: EventUi;
-                businessHours?: EventStore;
-            };
-        };
-        abstract getKeysForDateSpan(dateSpan: DateSpan): string[];
-        abstract getKeysForEventDef(eventDef: EventDef): string[];
-        splitProps(props: PropsType): {
-            [key: string]: SplittableProps;
-        };
-    }
-}
-
-declare module '@fullcalendar/core/component/date-rendering' {
-    import {DateMarker} from '@fullcalendar/core/datelib/marker';
-    import Component, {ComponentContext} from '@fullcalendar/core/component/Component';
-    import {DateProfile} from '@fullcalendar/core/DateProfileGenerator';
-
-    export function buildGotoAnchorHtml(component: Component<any>, gotoOptions: any, attrs: any, innerHtml?: any): string;
-
-    export function getAllDayHtml(component: Component<any>): any;
-
-    export function getDayClasses(date: DateMarker, dateProfile: DateProfile, context: ComponentContext, noThemeHighlight?: any): any[];
-}
-
-declare module '@fullcalendar/core/util/dom-event' {
-    export function preventDefault(ev: any): void;
-    export function listenBySelector(container: HTMLElement, eventType: string, selector: string, handler: (ev: Event, matchedTarget: HTMLElement) => void): () => void;
-    export function listenToHoverBySelector(container: HTMLElement, selector: string, onMouseEnter: (ev: Event, matchedTarget: HTMLElement) => void, onMouseLeave: (ev: Event, matchedTarget: HTMLElement) => void): () => void;
-    export function whenTransitionDone(el: HTMLElement, callback: (ev: Event) => void): void;
-}
-
-declare module '@fullcalendar/core/util/dom-geom' {
-    import {Rect} from '@fullcalendar/core/util/geom';
-
-    export interface EdgeInfo {
-        borderLeft: number;
-        borderRight: number;
-        borderTop: number;
-        borderBottom: number;
-        scrollbarLeft: number;
-        scrollbarRight: number;
-        scrollbarBottom: number;
-        paddingLeft?: number;
-        paddingRight?: number;
-        paddingTop?: number;
-        paddingBottom?: number;
-    }
-    export function computeEdges(el: any, getPadding?: boolean): EdgeInfo;
-    export function computeInnerRect(el: any, goWithinPadding?: boolean): {
-        left: number;
-        right: number;
-        top: number;
-        bottom: number;
-    };
-    export function computeRect(el: any): Rect;
-    export function computeHeightAndMargins(el: HTMLElement): number;
-    export function computeVMargins(el: HTMLElement): number;
-    export function getClippingParents(el: HTMLElement): HTMLElement[];
-    export function computeClippingRect(el: HTMLElement): Rect;
-}
-
-declare module '@fullcalendar/core/util/promise' {
-    export function unpromisify(func: any, success: any, failure?: any): void;
-}
-
-declare module '@fullcalendar/core/common/EmitterMixin' {
-    import Mixin from '@fullcalendar/core/common/Mixin';
-
-    export interface EmitterInterface {
-        on(types: any, handler: any): any;
-        one(types: any, handler: any): any;
-        off(types: any, handler: any): any;
-        trigger(type: any, ...args: any[]): any;
-        triggerWith(type: any, context: any, args: any): any;
-        hasHandlers(type: any): any;
-    }
-    export { EmitterMixin as default, EmitterMixin };
-    class EmitterMixin extends Mixin implements EmitterInterface {
-        _handlers: any;
-        _oneHandlers: any;
-        on(type: any, handler: any): this;
-        one(type: any, handler: any): this;
-        off(type: any, handler?: any): this;
-        trigger(type: any, ...args: any[]): this;
-        triggerWith(type: any, context: any, args: any): this;
-        hasHandlers(type: any): any;
-    }
-}
-
-declare module '@fullcalendar/core/datelib/date-range' {
-    import {DateMarker} from '@fullcalendar/core/datelib/marker';
-    import {DateEnv, DateInput} from '@fullcalendar/core/datelib/env';
-
-    export interface DateRangeInput {
-        start?: DateInput;
-        end?: DateInput;
-    }
-
-    export interface OpenDateRange {
-        start: DateMarker | null;
-        end: DateMarker | null;
-    }
-
-    export interface DateRange {
-        start: DateMarker;
-        end: DateMarker;
-    }
-    export function parseRange(input: DateRangeInput, dateEnv: DateEnv): OpenDateRange;
-    export function invertRanges(ranges: DateRange[], constraintRange: DateRange): DateRange[];
-    export function intersectRanges(range0: OpenDateRange, range1: OpenDateRange): OpenDateRange;
-    export function rangesEqual(range0: OpenDateRange, range1: OpenDateRange): boolean;
-    export function rangesIntersect(range0: OpenDateRange, range1: OpenDateRange): boolean;
-    export function rangeContainsRange(outerRange: OpenDateRange, innerRange: OpenDateRange): boolean;
-    export function rangeContainsMarker(range: OpenDateRange, date: DateMarker | number): boolean;
-    export function constrainMarkerToRange(date: DateMarker, range: DateRange): DateMarker;
-}
-
-declare module '@fullcalendar/core/common/Mixin' {
-    export { Mixin as default, Mixin };
-    class Mixin {
-        static mixInto(destClass: any): void;
-        static mixIntoObj(destObj: any): void;
-        static mixOver(destClass: any): void;
-    }
-}
-
-declare module '@fullcalendar/core/common/PositionCache' {
-    export { PositionCache as default, PositionCache };
-    class PositionCache {
-        originClientRect: ClientRect;
-        els: HTMLElement[];
-        originEl: HTMLElement;
-        isHorizontal: boolean;
-        isVertical: boolean;
-        lefts: any;
-        rights: any;
-        tops: any;
-        bottoms: any;
-        constructor(originEl: HTMLElement, els: HTMLElement[], isHorizontal: boolean, isVertical: boolean);
-        build(): void;
-        buildElHorizontals(originClientLeft: number): void;
-        buildElVerticals(originClientTop: number): void;
-        leftToIndex(leftPosition: number): any;
-        topToIndex(topPosition: number): any;
-        getWidth(leftIndex: number): number;
-        getHeight(topIndex: number): number;
-    }
-}
-
-declare module '@fullcalendar/core/common/ScrollComponent' {
-    import {ElementScrollController} from '@fullcalendar/core/common/scroll-controller';
-
-    export interface ScrollbarWidths {
-        left: number;
-        right: number;
-        bottom: number;
-    }
-
-    export {ScrollComponent as default, ScrollComponent};
-
-    class ScrollComponent extends ElementScrollController {
-        overflowX: string;
-        overflowY: string;
-        constructor(overflowX: string, overflowY: string);
-        clear(): void;
-        destroy(): void;
-        applyOverflow(): void;
-        lockOverflow(scrollbarWidths: ScrollbarWidths): void;
-        setHeight(height: number | string): void;
-        getScrollbarWidths(): ScrollbarWidths;
-    }
-}
-
-declare module '@fullcalendar/core/common/scroll-controller' {
-    export abstract class ScrollController {
-        abstract getScrollTop(): number;
-        abstract getScrollLeft(): number;
-        abstract setScrollTop(top: number): void;
-        abstract setScrollLeft(left: number): void;
-        abstract getClientWidth(): number;
-        abstract getClientHeight(): number;
-        abstract getScrollWidth(): number;
-        abstract getScrollHeight(): number;
-        getMaxScrollTop(): number;
-        getMaxScrollLeft(): number;
-        canScrollVertically(): boolean;
-        canScrollHorizontally(): boolean;
-        canScrollUp(): boolean;
-        canScrollDown(): boolean;
-        canScrollLeft(): boolean;
-        canScrollRight(): boolean;
-    }
-    export class ElementScrollController extends ScrollController {
-        el: HTMLElement;
-        constructor(el: HTMLElement);
-        getScrollTop(): number;
-        getScrollLeft(): number;
-        setScrollTop(top: number): void;
-        setScrollLeft(left: number): void;
-        getScrollWidth(): number;
-        getScrollHeight(): number;
-        getClientHeight(): number;
-        getClientWidth(): number;
-    }
-    export class WindowScrollController extends ScrollController {
-        getScrollTop(): number;
-        getScrollLeft(): number;
-        setScrollTop(n: number): void;
-        setScrollLeft(n: number): void;
-        getScrollWidth(): number;
-        getScrollHeight(): number;
-        getClientHeight(): number;
-        getClientWidth(): number;
-    }
-}
-
-declare module '@fullcalendar/core/theme/Theme' {
-    export { Theme as default, Theme };
-    class Theme {
-        calendarOptions: any;
-        classes: any;
-        iconClasses: any;
-        baseIconClass: string;
-        iconOverrideOption: any;
-        iconOverrideCustomButtonOption: any;
-        iconOverridePrefix: string;
-        constructor(calendarOptions: any);
-        processIconOverride(): void;
-        setIconOverride(iconOverrideHash: any): void;
-        applyIconOverridePrefix(className: any): any;
-        getClass(key: any): any;
-        getIconClass(buttonName: any): string;
-        getCustomButtonIconClass(customButtonProps: any): string;
-    }
-    export type ThemeClass = {
-        new (calendarOptions: any): Theme;
-    };
-}
-
-declare module '@fullcalendar/core/component/Component' {
-    import Calendar from '@fullcalendar/core/Calendar';
-    import View from '@fullcalendar/core/View';
-    import Theme from '@fullcalendar/core/theme/Theme';
-    import {DateEnv} from '@fullcalendar/core/datelib/env';
-
-    export interface ComponentContext {
-        options: any;
-        dateEnv: DateEnv;
-        theme: Theme;
-        calendar: Calendar;
-        view: View;
-    }
-
-    export type EqualityFuncHash = {
-        [propName: string]: (obj0: any, obj1: any) => boolean;
-    };
-    export { Component as default, Component };
-    class Component<PropsType> {
-        equalityFuncs: EqualityFuncHash;
-        uid: string;
-        props: PropsType | null;
-        context: ComponentContext;
-        dateEnv: DateEnv;
-        theme: Theme;
-        view: View;
-        calendar: Calendar;
-        isRtl: boolean;
-        constructor(context: ComponentContext, isView?: boolean);
-        static addEqualityFuncs(newFuncs: EqualityFuncHash): void;
-        opt(name: any): any;
-        receiveProps(props: PropsType): void;
-        protected render(props: PropsType): void;
-        destroy(): void;
-    }
-}
-
-declare module '@fullcalendar/core/component/DateComponent' {
-    import Component, {ComponentContext} from '@fullcalendar/core/component/Component';
-    import {EventRenderRange} from '@fullcalendar/core/component/event-rendering';
-    import {DateSpan} from '@fullcalendar/core/structs/date-span';
-    import {EventInstanceHash} from '@fullcalendar/core/structs/event';
-    import {Hit} from '@fullcalendar/core/interactions/hit';
-    import FgEventRenderer from '@fullcalendar/core/component/renderers/FgEventRenderer';
-    import FillRenderer from '@fullcalendar/core/component/renderers/FillRenderer';
-    import {EventInteractionState} from '@fullcalendar/core/interactions/event-interaction-state';
-    import {EventHandlerArgs, EventHandlerName} from '@fullcalendar/core/types/input-types';
-    export type DateComponentHash = {
-        [uid: string]: DateComponent<any>;
-    };
-
-    export interface Seg {
-        component?: DateComponent<any>;
-        isStart: boolean;
-        isEnd: boolean;
-        eventRange?: EventRenderRange;
-        el?: HTMLElement;
-
-        [otherProp: string]: any;
-    }
-    export interface EventSegUiInteractionState {
-        affectedInstances: EventInstanceHash;
-        segs: Seg[];
-        isEvent: boolean;
-        sourceSeg: any;
-    }
-    export { DateComponent as default, DateComponent };
-    class DateComponent<PropsType> extends Component<PropsType> {
-        fgSegSelector: string;
-        bgSegSelector: string;
-        largeUnit: any;
-        eventRenderer: FgEventRenderer;
-        mirrorRenderer: FgEventRenderer;
-        fillRenderer: FillRenderer;
-        el: HTMLElement;
-        constructor(context: ComponentContext, el: HTMLElement, isView?: boolean);
-        destroy(): void;
-        buildPositionCaches(): void;
-        queryHit(positionLeft: number, positionTop: number, elWidth: number, elHeight: number): Hit | null;
-        isInteractionValid(interaction: EventInteractionState): boolean;
-        isDateSelectionValid(selection: DateSpan): boolean;
-        publiclyTrigger<T extends EventHandlerName>(name: T, args?: EventHandlerArgs<T>): any;
-        publiclyTriggerAfterSizing<T extends EventHandlerName>(name: T, args: EventHandlerArgs<T>): void;
-        hasPublicHandlers<T extends EventHandlerName>(name: T): boolean;
-        triggerRenderedSegs(segs: Seg[], isMirrors: boolean): void;
-        triggerWillRemoveSegs(segs: Seg[], isMirrors: boolean): void;
-        isValidSegDownEl(el: HTMLElement): boolean;
-        isValidDateDownEl(el: HTMLElement): boolean;
-        isPopover(): boolean;
-        isInPopover(el: HTMLElement): boolean;
-    }
-}
-
-declare module '@fullcalendar/core/Calendar' {
-    import {EmitterInterface} from '@fullcalendar/core/common/EmitterMixin';
-    import OptionsManager from '@fullcalendar/core/OptionsManager';
-    import View from '@fullcalendar/core/View';
-    import Theme from '@fullcalendar/core/theme/Theme';
-    import {EventHandlerArgs, EventHandlerName, OptionsInput} from '@fullcalendar/core/types/input-types';
-    import {RawLocaleMap} from '@fullcalendar/core/datelib/locale';
-    import {DateEnv, DateInput} from '@fullcalendar/core/datelib/env';
-    import {DateMarker} from '@fullcalendar/core/datelib/marker';
-    import {Duration, DurationInput} from '@fullcalendar/core/datelib/duration';
-    import {DatePointApi, DateSpan, DateSpanApi} from '@fullcalendar/core/structs/date-span';
-    import {DateRangeInput} from '@fullcalendar/core/datelib/date-range';
-    import DateProfileGenerator from '@fullcalendar/core/DateProfileGenerator';
-    import {EventSourceInput} from '@fullcalendar/core/structs/event-source';
-    import {EventInput} from '@fullcalendar/core/structs/event';
-    import {Action, CalendarState} from '@fullcalendar/core/reducers/types';
-    import EventSourceApi from '@fullcalendar/core/api/EventSourceApi';
-    import EventApi from '@fullcalendar/core/api/EventApi';
-    import {EventStore} from '@fullcalendar/core/structs/event-store';
-    import {EventUi, EventUiHash} from '@fullcalendar/core/component/event-ui';
-    import {ViewSpec, ViewSpecHash} from '@fullcalendar/core/structs/view-spec';
-    import {PluginSystem} from '@fullcalendar/core/plugin-system';
-    import CalendarComponent from '@fullcalendar/core/CalendarComponent';
-    import DateComponent from '@fullcalendar/core/component/DateComponent';
-    import {PointerDragEvent} from '@fullcalendar/core/interactions/pointer';
-    import {Interaction, InteractionSettingsInput} from '@fullcalendar/core/interactions/interaction';
-
-    export interface DateClickApi extends DatePointApi {
-        dayEl: HTMLElement;
-        jsEvent: UIEvent;
-        view: View;
-    }
-
-    export interface DateSelectionApi extends DateSpanApi {
-        jsEvent: UIEvent;
-        view: View;
-    }
-    export type DatePointTransform = (dateSpan: DateSpan, calendar: Calendar) => any;
-    export type DateSpanTransform = (dateSpan: DateSpan, calendar: Calendar) => any;
-    export type CalendarInteraction = {
-        destroy(): any;
-    };
-    export type CalendarInteractionClass = {
-        new (calendar: Calendar): CalendarInteraction;
-    };
-    export type OptionChangeHandler = (propValue: any, calendar: Calendar, deepEqual: any) => void;
-    export type OptionChangeHandlerMap = {
-        [propName: string]: OptionChangeHandler;
-    };
-    export { Calendar as default, Calendar };
-    class Calendar {
-        static on: EmitterInterface['on'];
-        static off: EmitterInterface['off'];
-        static trigger: EmitterInterface['trigger'];
-        on: EmitterInterface['on'];
-        one: EmitterInterface['one'];
-        off: EmitterInterface['off'];
-        trigger: EmitterInterface['trigger'];
-        triggerWith: EmitterInterface['triggerWith'];
-        hasHandlers: EmitterInterface['hasHandlers'];
-        eventUiBases: EventUiHash;
-        selectionConfig: EventUi;
-        optionsManager: OptionsManager;
-        viewSpecs: ViewSpecHash;
-        dateProfileGenerators: {
-            [viewName: string]: DateProfileGenerator;
-        };
-        theme: Theme;
-        dateEnv: DateEnv;
-        availableRawLocales: RawLocaleMap;
-        pluginSystem: PluginSystem;
-        defaultAllDayEventDuration: Duration;
-        defaultTimedEventDuration: Duration;
-        calendarInteractions: CalendarInteraction[];
-        interactionsStore: {
-            [componentUid: string]: Interaction[];
-        };
-        removeNavLinkListener: any;
-        windowResizeProxy: any;
-        isHandlingWindowResize: boolean;
-        state: CalendarState;
-        actionQueue: any[];
-        isReducing: boolean;
-        needsRerender: boolean;
-        needsFullRerender: boolean;
-        isRendering: boolean;
-        renderingPauseDepth: number;
-        renderableEventStore: EventStore;
-        buildDelayedRerender: typeof buildDelayedRerender;
-        delayedRerender: any;
-        afterSizingTriggers: any;
-        isViewUpdated: boolean;
-        isDatesUpdated: boolean;
-        isEventsUpdated: boolean;
-        el: HTMLElement;
-        component: CalendarComponent;
-        constructor(el: HTMLElement, overrides?: OptionsInput);
-        addPluginInputs(pluginInputs: any): void;
-        readonly view: View;
-        render(): void;
-        destroy(): void;
-        bindHandlers(): void;
-        unbindHandlers(): void;
-        hydrate(): void;
-        buildInitialState(): CalendarState;
-        reduce(state: CalendarState, action: Action, calendar: Calendar): CalendarState;
-        requestRerender(needsFull?: boolean): void;
-        tryRerender(): void;
-        batchRendering(func: any): void;
-        executeRender(): void;
-        renderComponent(needsFull: any): void;
-        setOption(name: string, val: any): void;
-        getOption(name: string): any;
-        opt(name: string): any;
-        viewOpt(name: string): any;
-        viewOpts(): any;
-        mutateOptions(updates: any, removals: string[], isDynamic?: boolean, deepEqual?: any): void;
-        handleOptions(options: any): void;
-        getAvailableLocaleCodes(): string[];
-        _buildSelectionConfig(rawOpts: any): EventUi;
-        _buildEventUiSingleBase(rawOpts: any): EventUi;
-        hasPublicHandlers<T extends EventHandlerName>(name: T): boolean;
-        publiclyTrigger<T extends EventHandlerName>(name: T, args?: EventHandlerArgs<T>): any;
-        publiclyTriggerAfterSizing<T extends EventHandlerName>(name: T, args: EventHandlerArgs<T>): void;
-        releaseAfterSizingTriggers(): void;
-        isValidViewType(viewType: string): boolean;
-        changeView(viewType: string, dateOrRange?: DateRangeInput | DateInput): void;
-        zoomTo(dateMarker: DateMarker, viewType?: string): void;
-        getUnitViewSpec(unit: string): ViewSpec | null;
-        getInitialDate(): Date;
-        prev(): void;
-        next(): void;
-        prevYear(): void;
-        nextYear(): void;
-        today(): void;
-        gotoDate(zonedDateInput: any): void;
-        incrementDate(deltaInput: any): void;
-        getDate(): Date;
-        formatDate(d: DateInput, formatter: any): string;
-        formatRange(d0: DateInput, d1: DateInput, settings: any): any;
-        formatIso(d: DateInput, omitTime?: boolean): string;
-        windowResize(ev: Event): void;
-        updateSize(): void;
-        registerInteractiveComponent(component: DateComponent<any>, settingsInput: InteractionSettingsInput): void;
-        unregisterInteractiveComponent(component: DateComponent<any>): void;
-        select(dateOrObj: DateInput | any, endDate?: DateInput): void;
-        unselect(pev?: PointerDragEvent): void;
-        triggerDateSelect(selection: DateSpan, pev?: PointerDragEvent): void;
-        triggerDateUnselect(pev?: PointerDragEvent): void;
-        triggerDateClick(dateSpan: DateSpan, dayEl: HTMLElement, view: View, ev: UIEvent): void;
-        buildDatePointApi(dateSpan: DateSpan): import("@fullcalendar/core/structs/date-span").DatePointApi;
-        buildDateSpanApi(dateSpan: DateSpan): import("@fullcalendar/core/structs/date-span").DateSpanApi;
-        getNow(): DateMarker;
-        getDefaultEventEnd(allDay: boolean, marker: DateMarker): DateMarker;
-        addEvent(eventInput: EventInput, sourceInput?: EventSourceApi | string | number): EventApi | null;
-        getEventById(id: string): EventApi | null;
-        getEvents(): EventApi[];
-        removeAllEvents(): void;
-        rerenderEvents(): void;
-        getEventSources(): EventSourceApi[];
-        getEventSourceById(id: string | number): EventSourceApi | null;
-        addEventSource(sourceInput: EventSourceInput): EventSourceApi;
-        removeAllEventSources(): void;
-        refetchEvents(): void;
-        scrollToTime(timeInput: DurationInput): void;
-    }
-    function buildDelayedRerender(this: Calendar, wait: any): any;
-    export {};
-}
-
-declare module '@fullcalendar/core/View' {
-    import DateProfileGenerator, {DateProfile} from '@fullcalendar/core/DateProfileGenerator';
-    import {DateMarker} from '@fullcalendar/core/datelib/marker';
-    import {Duration} from '@fullcalendar/core/datelib/duration';
-    import {EmitterInterface} from '@fullcalendar/core/common/EmitterMixin';
-    import {ViewSpec} from '@fullcalendar/core/structs/view-spec';
-    import {ComponentContext} from '@fullcalendar/core/component/Component';
-    import DateComponent from '@fullcalendar/core/component/DateComponent';
-    import {EventStore} from '@fullcalendar/core/structs/event-store';
-    import {EventUi, EventUiHash} from '@fullcalendar/core/component/event-ui';
-    import {EventRenderRange} from '@fullcalendar/core/component/event-rendering';
-    import {DateSpan} from '@fullcalendar/core/structs/date-span';
-    import {EventInteractionState} from '@fullcalendar/core/interactions/event-interaction-state';
-    import {EventDef} from '@fullcalendar/core/structs/event';
-
-    export interface ViewProps {
-        dateProfile: DateProfile;
-        businessHours: EventStore;
-        eventStore: EventStore;
-        eventUiBases: EventUiHash;
-        dateSelection: DateSpan | null;
-        eventSelection: string;
-        eventDrag: EventInteractionState | null;
-        eventResize: EventInteractionState | null;
-    }
-    export { View as default, View };
-    abstract class View extends DateComponent<ViewProps> {
-        usesMinMaxTime: boolean;
-        dateProfileGeneratorClass: any;
-        on: EmitterInterface['on'];
-        one: EmitterInterface['one'];
-        off: EmitterInterface['off'];
-        trigger: EmitterInterface['trigger'];
-        triggerWith: EmitterInterface['triggerWith'];
-        hasHandlers: EmitterInterface['hasHandlers'];
-        viewSpec: ViewSpec;
-        dateProfileGenerator: DateProfileGenerator;
-        type: string;
-        title: string;
-        queuedScroll: any;
-        eventOrderSpecs: any;
-        nextDayThreshold: Duration;
-        isNowIndicatorRendered: boolean;
-        initialNowDate: DateMarker;
-        initialNowQueriedMs: number;
-        nowIndicatorTimeoutID: any;
-        nowIndicatorIntervalID: any;
-        constructor(context: ComponentContext, viewSpec: ViewSpec, dateProfileGenerator: DateProfileGenerator, parentEl: HTMLElement);
-        initialize(): void;
-        readonly activeStart: Date;
-        readonly activeEnd: Date;
-        readonly currentStart: Date;
-        readonly currentEnd: Date;
-        render(props: ViewProps): void;
-        destroy(): void;
-        updateSize(isResize: boolean, viewHeight: number, isAuto: boolean): void;
-        updateBaseSize(isResize: boolean, viewHeight: number, isAuto: boolean): void;
-        renderDatesWrap(dateProfile: DateProfile): void;
-        unrenderDatesWrap(): void;
-        renderDates(dateProfile: DateProfile): void;
-        unrenderDates(): void;
-        renderBusinessHours(businessHours: EventStore): void;
-        unrenderBusinessHours(): void;
-        renderDateSelectionWrap(selection: DateSpan): void;
-        unrenderDateSelectionWrap(selection: DateSpan): void;
-        renderDateSelection(selection: DateSpan): void;
-        unrenderDateSelection(selection: DateSpan): void;
-        renderEvents(eventStore: EventStore): void;
-        unrenderEvents(): void;
-        sliceEvents(eventStore: EventStore, allDay: boolean): EventRenderRange[];
-        computeEventDraggable(eventDef: EventDef, eventUi: EventUi): boolean;
-        computeEventStartResizable(eventDef: EventDef, eventUi: EventUi): any;
-        computeEventEndResizable(eventDef: EventDef, eventUi: EventUi): boolean;
-        renderEventSelectionWrap(instanceId: string): void;
-        unrenderEventSelectionWrap(instanceId: string): void;
-        renderEventSelection(instanceId: string): void;
-        unrenderEventSelection(instanceId: string): void;
-        renderEventDragWrap(state: EventInteractionState): void;
-        unrenderEventDragWrap(state: EventInteractionState): void;
-        renderEventDrag(state: EventInteractionState): void;
-        unrenderEventDrag(state: EventInteractionState): void;
-        renderEventResizeWrap(state: EventInteractionState): void;
-        unrenderEventResizeWrap(state: EventInteractionState): void;
-        renderEventResize(state: EventInteractionState): void;
-        unrenderEventResize(state: EventInteractionState): void;
-        startNowIndicator(dateProfile: DateProfile): void;
-        updateNowIndicator(): void;
-        stopNowIndicator(): void;
-        getNowIndicatorUnit(dateProfile: DateProfile): void;
-        renderNowIndicator(date: any): void;
-        unrenderNowIndicator(): void;
-        addScroll(scroll: any): void;
-        popScroll(isResize: boolean): void;
-        applyQueuedScroll(isResize: boolean): void;
-        queryScroll(): any;
-        applyScroll(scroll: any, isResize: boolean): void;
-        computeDateScroll(duration: Duration): {};
-        queryDateScroll(): {};
-        applyDateScroll(scroll: any): void;
-        scrollToDuration(duration: Duration): void;
-    }
-}
-
-declare module '@fullcalendar/core/component/renderers/FgEventRenderer' {
-    import {DateMarker} from '@fullcalendar/core/datelib/marker';
-    import {DateFormatter} from '@fullcalendar/core/datelib/formatting';
-    import {EventUi} from '@fullcalendar/core/component/event-ui';
-    import {EventRenderRange} from '@fullcalendar/core/component/event-rendering';
-    import {Seg} from '@fullcalendar/core/component/DateComponent';
-    import {ComponentContext} from '@fullcalendar/core/component/Component';
-    export {FgEventRenderer as default, FgEventRenderer};
-
-    abstract class FgEventRenderer {
-        context: ComponentContext;
-        eventTimeFormat: DateFormatter;
-        displayEventTime: boolean;
-        displayEventEnd: boolean;
-        segs: Seg[];
-        isSizeDirty: boolean;
-
-        constructor(context: ComponentContext);
-
-        renderSegs(segs: Seg[], mirrorInfo?: any): void;
-        unrender(_segs: Seg[], mirrorInfo?: any): void;
-        abstract renderSegHtml(seg: Seg, mirrorInfo: any): string;
-        abstract attachSegs(segs: Seg[], mirrorInfo: any): any;
-        abstract detachSegs(segs: Seg[]): any;
-        rangeUpdated(): void;
-        renderSegEls(segs: Seg[], mirrorInfo: any): Seg[];
-        getSegClasses(seg: Seg, isDraggable: any, isResizable: any, mirrorInfo: any): string[];
-        getTimeText(eventRange: EventRenderRange, formatter?: any, displayEnd?: any): any;
-        _getTimeText(start: DateMarker, end: DateMarker, allDay: any, formatter?: any, displayEnd?: any, forcedStartTzo?: number, forcedEndTzo?: number): any;
-        computeEventTimeFormat(): any;
-        computeDisplayEventTime(): boolean;
-        computeDisplayEventEnd(): boolean;
-        getSkinCss(ui: EventUi): {
-            'background-color': string;
-            'border-color': string;
-            color: string;
-        };
-        sortEventSegs(segs: any): Seg[];
-        computeSizes(force: boolean): void;
-        assignSizes(force: boolean): void;
-        computeSegSizes(segs: Seg[]): void;
-        assignSegSizes(segs: Seg[]): void;
-        hideByHash(hash: any): void;
-        showByHash(hash: any): void;
-        selectByInstanceId(instanceId: string): void;
-        unselectByInstanceId(instanceId: string): void;
-    }
-    export function buildSegCompareObj(seg: Seg): any;
-}
-
-declare module '@fullcalendar/core/component/renderers/FillRenderer' {
-    import {Seg} from '@fullcalendar/core/component/DateComponent';
-    import {ComponentContext} from '@fullcalendar/core/component/Component';
-    export {FillRenderer as default, FillRenderer};
-
-    abstract class FillRenderer {
-        context: ComponentContext;
-        fillSegTag: string;
-        containerElsByType: any;
-        segsByType: any;
-        dirtySizeFlags: any;
-
-        constructor(context: ComponentContext);
-
-        getSegsByType(type: string): any;
-
-        renderSegs(type: any, segs: Seg[]): void;
-        unrender(type: any): void;
-        renderSegEls(type: any, segs: Seg[]): Seg[];
-        renderSegHtml(type: any, seg: Seg): string;
-        abstract attachSegs(type: any, segs: Seg[]): HTMLElement[] | void;
-        detachSegs(type: any, segs: Seg[]): void;
-        computeSizes(force: boolean): void;
-        assignSizes(force: boolean): void;
-        computeSegSizes(segs: Seg[]): void;
-        assignSegSizes(segs: Seg[]): void;
-    }
-}
-
-declare module '@fullcalendar/core/DateProfileGenerator' {
-    import {DateMarker} from '@fullcalendar/core/datelib/marker';
-    import {Duration} from '@fullcalendar/core/datelib/duration';
-    import {DateRange, OpenDateRange} from '@fullcalendar/core/datelib/date-range';
-    import {ViewSpec} from '@fullcalendar/core/structs/view-spec';
-    import {DateEnv} from '@fullcalendar/core/datelib/env';
-    import Calendar from '@fullcalendar/core/Calendar';
-
-    export interface DateProfile {
-        currentRange: DateRange;
-        currentRangeUnit: string;
-        isRangeAllDay: boolean;
-        validRange: OpenDateRange;
-        activeRange: DateRange;
-        renderRange: DateRange;
-        minTime: Duration;
-        maxTime: Duration;
-        isValid: boolean;
-        dateIncrement: Duration;
-    }
-    export { DateProfileGenerator as default, DateProfileGenerator };
-    class DateProfileGenerator {
-        viewSpec: ViewSpec;
-        options: any;
-        dateEnv: DateEnv;
-        calendar: Calendar;
-        isHiddenDayHash: boolean[];
-        constructor(viewSpec: ViewSpec, calendar: Calendar);
-        buildPrev(currentDateProfile: DateProfile, currentDate: DateMarker): DateProfile;
-        buildNext(currentDateProfile: DateProfile, currentDate: DateMarker): DateProfile;
-        build(currentDate: DateMarker, direction?: any, forceToValid?: boolean): DateProfile;
-        buildValidRange(): OpenDateRange;
-        buildCurrentRangeInfo(date: DateMarker, direction: any): {
-            duration: any;
-            unit: any;
-            range: any;
-        };
-        getFallbackDuration(): Duration;
-        adjustActiveRange(range: DateRange, minTime: Duration, maxTime: Duration): {
-            start: Date;
-            end: Date;
-        };
-        buildRangeFromDuration(date: DateMarker, direction: any, duration: Duration, unit: any): any;
-        buildRangeFromDayCount(date: DateMarker, direction: any, dayCount: any): {
-            start: Date;
-            end: Date;
-        };
-        buildCustomVisibleRange(date: DateMarker): OpenDateRange;
-        buildRenderRange(currentRange: DateRange, currentRangeUnit: any, isRangeAllDay: any): DateRange;
-        buildDateIncrement(fallback: any): Duration;
-        getRangeOption(name: any, ...otherArgs: any[]): OpenDateRange;
-        initHiddenDays(): void;
-        trimHiddenDays(range: DateRange): DateRange | null;
-        isHiddenDay(day: any): boolean;
-        skipHiddenDays(date: DateMarker, inc?: number, isExclusive?: boolean): Date;
-    }
-    export function isDateProfilesEqual(p0: DateProfile, p1: DateProfile): boolean;
-}
-
-declare module '@fullcalendar/core/structs/view-def' {
-    import {ViewClass, ViewConfigHash} from '@fullcalendar/core/structs/view-config';
-
-    export interface ViewDef {
-        type: string;
-        class: ViewClass;
-        overrides: any;
-        defaults: any;
-    }
-
-    export type ViewDefHash = {
-        [viewType: string]: ViewDef;
-    };
-    export function compileViewDefs(defaultConfigs: ViewConfigHash, overrideConfigs: ViewConfigHash): ViewDefHash;
-}
-
-declare module '@fullcalendar/core/structs/view-spec' {
-    import {Duration} from '@fullcalendar/core/datelib/duration';
-    import OptionsManager from '@fullcalendar/core/OptionsManager';
-    import {ViewClass, ViewConfigInputHash} from '@fullcalendar/core/structs/view-config';
-
-    export interface ViewSpec {
-        type: string;
-        class: ViewClass;
-        duration: Duration;
-        durationUnit: string;
-        singleUnit: string;
-        options: any;
-        buttonTextOverride: string;
-        buttonTextDefault: string;
-    }
-    export type ViewSpecHash = {
-        [viewType: string]: ViewSpec;
-    };
-    export function buildViewSpecs(defaultInputs: ViewConfigInputHash, optionsManager: OptionsManager): ViewSpecHash;
-}
-
-declare module '@fullcalendar/core/structs/date-span' {
-    import {DateRange, OpenDateRange} from '@fullcalendar/core/datelib/date-range';
-    import {DateEnv, DateInput} from '@fullcalendar/core/datelib/env';
-    import {Duration} from '@fullcalendar/core/datelib/duration';
-    import {EventRenderRange} from '@fullcalendar/core/component/event-rendering';
-    import {EventUiHash} from '@fullcalendar/core/component/event-ui';
-    import Calendar from '@fullcalendar/core/Calendar';
-
-    export interface OpenDateSpanInput {
-        start?: DateInput;
-        end?: DateInput;
-        allDay?: boolean;
-
-        [otherProp: string]: any;
-    }
-
-    export interface DateSpanInput extends OpenDateSpanInput {
-        start: DateInput;
-        end: DateInput;
-    }
-    export interface OpenDateSpan {
-        range: OpenDateRange;
-        allDay: boolean;
-        [otherProp: string]: any;
-    }
-    export interface DateSpan extends OpenDateSpan {
-        range: DateRange;
-    }
-    export interface DateSpanApi {
-        start: Date;
-        end: Date;
-        startStr: string;
-        endStr: string;
-        allDay: boolean;
-    }
-    export interface DatePointApi {
-        date: Date;
-        dateStr: string;
-        allDay: boolean;
-    }
-    export function parseDateSpan(raw: DateSpanInput, dateEnv: DateEnv, defaultDuration?: Duration): DateSpan | null;
-    export function parseOpenDateSpan(raw: OpenDateSpanInput, dateEnv: DateEnv): OpenDateSpan | null;
-    export function isDateSpansEqual(span0: DateSpan, span1: DateSpan): boolean;
-    export function buildDateSpanApi(span: DateSpan, dateEnv: DateEnv): DateSpanApi;
-    export function buildDatePointApi(span: DateSpan, dateEnv: DateEnv): DatePointApi;
-    export function fabricateEventRange(dateSpan: DateSpan, eventUiBases: EventUiHash, calendar: Calendar): EventRenderRange;
-}
-
-declare module '@fullcalendar/core/datelib/marker' {
-    import {Duration} from '@fullcalendar/core/datelib/duration';
-    export type DateMarker = Date;
-    export const DAY_IDS: string[];
-    export function addWeeks(m: DateMarker, n: number): Date;
-    export function addDays(m: DateMarker, n: number): Date;
-    export function addMs(m: DateMarker, n: number): Date;
-    export function diffWeeks(m0: any, m1: any): number;
-    export function diffDays(m0: any, m1: any): number;
-    export function diffHours(m0: any, m1: any): number;
-    export function diffMinutes(m0: any, m1: any): number;
-    export function diffSeconds(m0: any, m1: any): number;
-    export function diffDayAndTime(m0: DateMarker, m1: DateMarker): Duration;
-    export function diffWholeWeeks(m0: DateMarker, m1: DateMarker): number;
-    export function diffWholeDays(m0: DateMarker, m1: DateMarker): number;
-    export function startOfDay(m: DateMarker): DateMarker;
-    export function startOfHour(m: DateMarker): Date;
-    export function startOfMinute(m: DateMarker): Date;
-    export function startOfSecond(m: DateMarker): Date;
-    export function weekOfYear(marker: any, dow: any, doy: any): number;
-    export function dateToLocalArray(date: any): any[];
-    export function arrayToLocalDate(a: any): Date;
-    export function dateToUtcArray(date: any): any[];
-    export function arrayToUtcDate(a: any): Date;
-    export function isValidDate(m: DateMarker): boolean;
-    export function timeAsMs(m: DateMarker): number;
-}
-
-declare module '@fullcalendar/core/datelib/duration' {
-    export type DurationInput = DurationObjectInput | string | number;
-    export interface DurationObjectInput {
-        years?: number;
-        year?: number;
-        months?: number;
-        month?: number;
-        weeks?: number;
-        week?: number;
-        days?: number;
-        day?: number;
-        hours?: number;
-        hour?: number;
-        minutes?: number;
-        minute?: number;
-        seconds?: number;
-        second?: number;
-        milliseconds?: number;
-        millisecond?: number;
-        ms?: number;
-    }
-    export interface Duration {
-        years: number;
-        months: number;
-        days: number;
-        milliseconds: number;
-    }
-    export function createDuration(input: DurationInput, unit?: string): Duration | null;
-    export function getWeeksFromInput(obj: DurationObjectInput): number;
-    export function durationsEqual(d0: Duration, d1: Duration): boolean;
-    export function isSingleDay(dur: Duration): boolean;
-    export function addDurations(d0: Duration, d1: Duration): {
-        years: number;
-        months: number;
-        days: number;
-        milliseconds: number;
-    };
-    export function subtractDurations(d1: Duration, d0: Duration): Duration;
-    export function multiplyDuration(d: Duration, n: number): {
-        years: number;
-        months: number;
-        days: number;
-        milliseconds: number;
-    };
-    export function asRoughYears(dur: Duration): number;
-    export function asRoughMonths(dur: Duration): number;
-    export function asRoughDays(dur: Duration): number;
-    export function asRoughHours(dur: Duration): number;
-    export function asRoughMinutes(dur: Duration): number;
-    export function asRoughSeconds(dur: Duration): number;
-    export function asRoughMs(dur: Duration): number;
-    export function wholeDivideDurations(numerator: Duration, denominator: Duration): number;
-    export function greatestDurationDenominator(dur: Duration, dontReturnWeeks?: boolean): {
-        unit: string;
-        value: number;
-    };
-}
-
-declare module '@fullcalendar/core/datelib/env' {
-    import {DateMarker} from '@fullcalendar/core/datelib/marker';
-    import {CalendarSystem} from '@fullcalendar/core/datelib/calendar-system';
-    import {Locale} from '@fullcalendar/core/datelib/locale';
-    import {NamedTimeZoneImpl, NamedTimeZoneImplClass} from '@fullcalendar/core/datelib/timezone';
-    import {Duration} from '@fullcalendar/core/datelib/duration';
-    import {DateFormatter} from '@fullcalendar/core/datelib/formatting';
-    import {CmdFormatterFunc} from '@fullcalendar/core/datelib/formatting-cmd';
-
-    export interface DateEnvSettings {
-        timeZone: string;
-        namedTimeZoneImpl?: NamedTimeZoneImplClass;
-        calendarSystem: string;
-        locale: Locale;
-        weekNumberCalculation?: any;
-        firstDay?: any;
-        weekLabel?: string;
-        cmdFormatter?: CmdFormatterFunc;
-    }
-    export type DateInput = Date | string | number | number[];
-    export interface DateMarkerMeta {
-        marker: DateMarker;
-        isTimeUnspecified: boolean;
-        forcedTzo: number | null;
-    }
-    export class DateEnv {
-        timeZone: string;
-        namedTimeZoneImpl: NamedTimeZoneImpl;
-        canComputeOffset: boolean;
-        calendarSystem: CalendarSystem;
-        locale: Locale;
-        weekDow: number;
-        weekDoy: number;
-        weekNumberFunc: any;
-        weekLabel: string;
-        cmdFormatter?: CmdFormatterFunc;
-        constructor(settings: DateEnvSettings);
-        createMarker(input: DateInput): DateMarker;
-        createNowMarker(): DateMarker;
-        createMarkerMeta(input: DateInput): DateMarkerMeta;
-        parse(s: string): {
-            marker: Date;
-            isTimeUnspecified: boolean;
-            forcedTzo: any;
-        };
-        getYear(marker: DateMarker): number;
-        getMonth(marker: DateMarker): number;
-        add(marker: DateMarker, dur: Duration): DateMarker;
-        subtract(marker: DateMarker, dur: Duration): DateMarker;
-        addYears(marker: DateMarker, n: number): Date;
-        addMonths(marker: DateMarker, n: number): Date;
-        diffWholeYears(m0: DateMarker, m1: DateMarker): number;
-        diffWholeMonths(m0: DateMarker, m1: DateMarker): number;
-        greatestWholeUnit(m0: DateMarker, m1: DateMarker): {
-            unit: string;
-            value: number;
-        };
-        countDurationsBetween(m0: DateMarker, m1: DateMarker, d: Duration): number;
-        startOf(m: DateMarker, unit: string): Date;
-        startOfYear(m: DateMarker): DateMarker;
-        startOfMonth(m: DateMarker): DateMarker;
-        startOfWeek(m: DateMarker): DateMarker;
-        computeWeekNumber(marker: DateMarker): number;
-        format(marker: DateMarker, formatter: DateFormatter, dateOptions?: {
-            forcedTzo?: number;
-        }): any;
-        formatRange(start: DateMarker, end: DateMarker, formatter: DateFormatter, dateOptions?: {
-            forcedStartTzo?: number;
-            forcedEndTzo?: number;
-            isEndExclusive?: boolean;
-        }): any;
-        formatIso(marker: DateMarker, extraOptions?: any): string;
-        timestampToMarker(ms: number): Date;
-        offsetForMarker(m: DateMarker): number;
-        toDate(m: DateMarker, forcedTzo?: number): Date;
-    }
-}
-
-declare module '@fullcalendar/core/datelib/formatting' {
-    import {DateMarker} from '@fullcalendar/core/datelib/marker';
-    import {CalendarSystem} from '@fullcalendar/core/datelib/calendar-system';
-    import {Locale} from '@fullcalendar/core/datelib/locale';
-    import {CmdFormatterFunc} from '@fullcalendar/core/datelib/formatting-cmd';
-    import {FuncFormatterFunc} from '@fullcalendar/core/datelib/formatting-func';
-
-    export interface ZonedMarker {
-        marker: DateMarker;
-        timeZoneOffset: number;
-    }
-
-    export interface ExpandedZonedMarker extends ZonedMarker {
-        array: number[];
-        year: number;
-        month: number;
-        day: number;
-        hour: number;
-        minute: number;
-        second: number;
-        millisecond: number;
-    }
-    export interface VerboseFormattingArg {
-        date: ExpandedZonedMarker;
-        start: ExpandedZonedMarker;
-        end?: ExpandedZonedMarker;
-        timeZone: string;
-        localeCodes: string[];
-        separator: string;
-    }
-    export interface DateFormattingContext {
-        timeZone: string;
-        locale: Locale;
-        calendarSystem: CalendarSystem;
-        computeWeekNumber: (d: DateMarker) => number;
-        weekLabel: string;
-        cmdFormatter?: CmdFormatterFunc;
-    }
-    export interface DateFormatter {
-        format(date: ZonedMarker, context: DateFormattingContext): any;
-        formatRange(start: ZonedMarker, end: ZonedMarker, context: DateFormattingContext): any;
-    }
-    export type FormatterInput = object | string | FuncFormatterFunc;
-    export function createFormatter(input: FormatterInput, defaultSeparator?: string): DateFormatter;
-    export function buildIsoString(marker: DateMarker, timeZoneOffset?: number, stripZeroTime?: boolean): string;
-    export function formatIsoTimeString(marker: DateMarker): string;
-    export function formatTimeZoneOffset(minutes: number, doIso?: boolean): string;
-    export function createVerboseFormattingArg(start: ZonedMarker, end: ZonedMarker, context: DateFormattingContext, separator?: string): VerboseFormattingArg;
-}
-
-declare module '@fullcalendar/core/datelib/timezone' {
-    export abstract class NamedTimeZoneImpl {
-        timeZoneName: string;
-        constructor(timeZoneName: string);
-        abstract offsetForArray(a: number[]): number;
-        abstract timestampToArray(ms: number): number[];
-    }
-    export type NamedTimeZoneImplClass = {
-        new (timeZoneName: string): NamedTimeZoneImpl;
-    };
-}
-
-declare module '@fullcalendar/core/datelib/parsing' {
-    export function parse(str: any): {
-        marker: Date;
-        isTimeUnspecified: boolean;
-        timeZoneOffset: any;
-    };
-}
-
-declare module '@fullcalendar/core/structs/event-source' {
-    import {EventInput} from '@fullcalendar/core/structs/event';
-    import Calendar from '@fullcalendar/core/Calendar';
-    import {DateRange} from '@fullcalendar/core/datelib/date-range';
-    import {EventSourceFunc} from '@fullcalendar/core/event-sources/func-event-source';
-    import {EventUi} from '@fullcalendar/core/component/event-ui';
-    import {AllowFunc, ConstraintInput} from '@fullcalendar/core/validation';
-    export type EventSourceError = {
-        message: string;
-        response?: any;
-        [otherProp: string]: any;
-    };
-    export type EventInputTransformer = (eventInput: EventInput) => EventInput | null;
-    export type EventSourceSuccessResponseHandler = (rawData: any, response: any) => EventInput[] | void;
-    export type EventSourceErrorResponseHandler = (error: EventSourceError) => void;
-
-    export interface ExtendedEventSourceInput {
-        id?: string | number;
-        allDayDefault?: boolean;
-        eventDataTransform?: EventInputTransformer;
-        events?: EventInput[] | EventSourceFunc;
-        url?: string;
-        method?: string;
-        extraParams?: object | (() => object);
-        startParam?: string;
-        endParam?: string;
-        timeZoneParam?: string;
-        success?: EventSourceSuccessResponseHandler;
-        failure?: EventSourceErrorResponseHandler;
-        editable?: boolean;
-        startEditable?: boolean;
-        durationEditable?: boolean;
-        constraint?: ConstraintInput;
-        overlap?: boolean;
-        allow?: AllowFunc;
-        className?: string[] | string;
-        classNames?: string[] | string;
-        backgroundColor?: string;
-        borderColor?: string;
-        textColor?: string;
-        color?: string;
-        [otherProp: string]: any;
-    }
-    export type EventSourceInput = ExtendedEventSourceInput | // object in extended form
-    EventSourceFunc | // just a function
-    string;
-    export interface EventSource {
-        _raw: any;
-        sourceId: string;
-        sourceDefId: number;
-        meta: any;
-        publicId: string;
-        isFetching: boolean;
-        latestFetchId: string;
-        fetchRange: DateRange | null;
-        allDayDefault: boolean | null;
-        eventDataTransform: EventInputTransformer;
-        ui: EventUi;
-        success: EventSourceSuccessResponseHandler | null;
-        failure: EventSourceErrorResponseHandler | null;
-        extendedProps: any;
-    }
-    export type EventSourceHash = {
-        [sourceId: string]: EventSource;
-    };
-    export type EventSourceFetcher = (arg: {
-        eventSource: EventSource;
-        calendar: Calendar;
-        range: DateRange;
-    }, success: (res: {
-        rawEvents: EventInput[];
-        xhr?: XMLHttpRequest;
-    }) => void, failure: (error: EventSourceError) => void) => (void | PromiseLike<EventInput[]>);
-    export interface EventSourceDef {
-        ignoreRange?: boolean;
-        parseMeta: (raw: EventSourceInput) => object | null;
-        fetch: EventSourceFetcher;
-    }
-    export function doesSourceNeedRange(eventSource: EventSource, calendar: Calendar): boolean;
-    export function parseEventSource(raw: EventSourceInput, calendar: Calendar): EventSource | null;
-}
-
-declare module '@fullcalendar/core/interactions/interaction' {
-    import DateComponent from '@fullcalendar/core/component/DateComponent';
-
-    export abstract class Interaction {
-        component: DateComponent<any>;
-        constructor(settings: InteractionSettings);
-        destroy(): void;
-    }
-    export type InteractionClass = {
-        new (settings: InteractionSettings): Interaction;
-    };
-    export interface InteractionSettingsInput {
-        el: HTMLElement;
-        useEventCenter?: boolean;
-    }
-    export interface InteractionSettings {
-        component: DateComponent<any>;
-        el: HTMLElement;
-        useEventCenter: boolean;
-    }
-    export type InteractionSettingsStore = {
-        [componenUid: string]: InteractionSettings;
-    };
-    export function parseInteractionSettings(component: DateComponent<any>, input: InteractionSettingsInput): InteractionSettings;
-    export function interactionSettingsToStore(settings: InteractionSettings): {
-        [x: string]: InteractionSettings;
-    };
-    export let interactionSettingsStore: InteractionSettingsStore;
-}
-
-declare module '@fullcalendar/core/interactions/pointer' {
-    export interface PointerDragEvent {
-        origEvent: UIEvent;
-        isTouch: boolean;
-        subjectEl: EventTarget;
-        pageX: number;
-        pageY: number;
-        deltaX: number;
-        deltaY: number;
-    }
-}
-
-declare module '@fullcalendar/core/interactions/hit' {
-    import DateComponent from '@fullcalendar/core/component/DateComponent';
-    import {DateSpan} from '@fullcalendar/core/structs/date-span';
-    import {Rect} from '@fullcalendar/core/util/geom';
-
-    export interface Hit {
-        component: DateComponent<any>;
-        dateSpan: DateSpan;
-        dayEl: HTMLElement;
-        rect: Rect;
-        layer: number;
-    }
-}
-
-declare module '@fullcalendar/core/interactions/date-selecting' {
-    import {Hit} from '@fullcalendar/core/interactions/hit';
-    export type dateSelectionJoinTransformer = (hit0: Hit, hit1: Hit) => any;
-}
-
-declare module '@fullcalendar/core/interactions/event-dragging' {
-    import Calendar from '@fullcalendar/core/Calendar';
-    import {EventMutation} from '@fullcalendar/core/structs/event-mutation';
-    import {Hit} from '@fullcalendar/core/interactions/hit';
-    import {EventDef} from '@fullcalendar/core/structs/event';
-    import {EventUi} from '@fullcalendar/core/component/event-ui';
-    import {View} from '@fullcalendar/core';
-    export type eventDragMutationMassager = (mutation: EventMutation, hit0: Hit, hit1: Hit) => void;
-    export type EventDropTransformers = (mutation: EventMutation, calendar: Calendar) => any;
-    export type eventIsDraggableTransformer = (val: boolean, eventDef: EventDef, eventUi: EventUi, view: View) => boolean;
-}
-
-declare module '@fullcalendar/core/interactions/event-resizing' {
-    import {Hit} from '@fullcalendar/core/interactions/hit';
-    export type EventResizeJoinTransforms = (hit0: Hit, hit1: Hit) => false | object;
-}
-
-declare module '@fullcalendar/core/interactions/ElementDragging' {
-    import EmitterMixin from '@fullcalendar/core/common/EmitterMixin';
-    export { ElementDragging as default, ElementDragging };
-    abstract class ElementDragging {
-        emitter: EmitterMixin;
-        constructor(el: HTMLElement);
-        destroy(): void;
-        abstract setIgnoreMove(bool: boolean): void;
-        setMirrorIsVisible(bool: boolean): void;
-        setMirrorNeedsRevert(bool: boolean): void;
-        setAutoScrollEnabled(bool: boolean): void;
-    }
-    export type ElementDraggingClass = {
-        new (el: HTMLElement): ElementDragging;
-    };
-}
-
-declare module '@fullcalendar/core/formatting-api' {
-    import {DateInput} from '@fullcalendar/core/datelib/env';
-
-    export function formatDate(dateInput: DateInput, settings?: {}): any;
-
-    export function formatRange(startInput: DateInput, endInput: DateInput, settings: any): any;
-}
-
-declare module '@fullcalendar/core/options' {
-    import {PluginDef} from '@fullcalendar/core/plugin-system';
-    export const config: any;
-    export const globalDefaults: {
-        defaultRangeSeparator: string;
-        titleRangeSeparator: string;
-        defaultTimedEventDuration: string;
-        defaultAllDayEventDuration: {
-            day: number;
-        };
-        forceEventDuration: boolean;
-        nextDayThreshold: string;
-        columnHeader: boolean;
-        defaultView: string;
-        aspectRatio: number;
-        header: {
-            left: string;
-            center: string;
-            right: string;
-        };
-        weekends: boolean;
-        weekNumbers: boolean;
-        weekNumberCalculation: string;
-        editable: boolean;
-        scrollTime: string;
-        minTime: string;
-        maxTime: string;
-        showNonCurrentDates: boolean;
-        lazyFetching: boolean;
-        startParam: string;
-        endParam: string;
-        timeZoneParam: string;
-        timeZone: string;
-        locales: any[];
-        locale: string;
-        timeGridEventMinHeight: number;
-        themeSystem: string;
-        dragRevertDuration: number;
-        dragScroll: boolean;
-        allDayMaintainDuration: boolean;
-        unselectAuto: boolean;
-        dropAccept: string;
-        eventOrder: string;
-        eventLimit: boolean;
-        eventLimitClick: string;
-        dayPopoverFormat: {
-            month: string;
-            day: string;
-            year: string;
-        };
-        handleWindowResize: boolean;
-        windowResizeDelay: number;
-        longPressDelay: number;
-        eventDragMinDistance: number;
-    };
-    export const rtlDefaults: {
-        header: {
-            left: string;
-            center: string;
-            right: string;
-        };
-        buttonIcons: {
-            prev: string;
-            next: string;
-            prevYear: string;
-            nextYear: string;
-        };
-    };
-    export function mergeOptions(optionObjs: any): any;
-    export function refinePluginDefs(pluginInputs: any[]): PluginDef[];
-}
-
-declare module '@fullcalendar/core/structs/recurring-event' {
-    import {EventDef, EventInput} from '@fullcalendar/core/structs/event';
-    import {DateRange} from '@fullcalendar/core/datelib/date-range';
-    import {DateEnv} from '@fullcalendar/core/datelib/env';
-    import {Duration} from '@fullcalendar/core/datelib/duration';
-    import {DateMarker} from '@fullcalendar/core/datelib/marker';
-
-    export interface ParsedRecurring {
-        typeData: any;
-        allDayGuess: boolean | null;
-        duration: Duration | null;
-    }
-
-    export interface RecurringType {
-        parse: (rawEvent: EventInput, leftoverProps: any, dateEnv: DateEnv) => ParsedRecurring | null;
-        expand: (typeData: any, framingRange: DateRange, dateEnv: DateEnv) => DateMarker[];
-    }
-    export function parseRecurring(eventInput: EventInput, allDayDefault: boolean | null, dateEnv: DateEnv, recurringTypes: RecurringType[], leftovers: any): {
-        allDay: any;
-        duration: Duration;
-        typeData: any;
-        typeId: number;
-    };
-    export function expandRecurringRanges(eventDef: EventDef, duration: Duration, framingRange: DateRange, dateEnv: DateEnv, recurringTypes: RecurringType[]): DateMarker[];
-}
-
-declare module '@fullcalendar/core/structs/drag-meta' {
-    import {Duration, DurationInput} from '@fullcalendar/core/datelib/duration';
-    import {EventNonDateInput} from '@fullcalendar/core/structs/event';
-
-    export interface DragMetaInput extends EventNonDateInput {
-        startTime?: DurationInput;
-        duration?: DurationInput;
-        create?: boolean;
-        sourceId?: string;
-    }
-
-    export interface DragMeta {
-        startTime: Duration | null;
-        duration: Duration | null;
-        create: boolean;
-        sourceId: string;
-        leftoverProps: object;
-    }
-    export function parseDragMeta(raw: DragMetaInput): DragMeta;
-}
-
-declare module '@fullcalendar/core/plugin-system' {
-    import {reducerFunc} from '@fullcalendar/core/reducers/types';
-    import {eventDefParserFunc} from '@fullcalendar/core/structs/event';
-    import {eventDefMutationApplier} from '@fullcalendar/core/structs/event-mutation';
-    import Calendar, {
-        CalendarInteractionClass,
-        DatePointTransform,
-        DateSpanTransform,
-        OptionChangeHandlerMap
-    } from '@fullcalendar/core/Calendar';
-    import {ViewConfigInputHash} from '@fullcalendar/core/structs/view-config';
-    import {ViewSpec} from '@fullcalendar/core/structs/view-spec';
-    import View, {ViewProps} from '@fullcalendar/core/View';
-    import {CalendarComponentProps} from '@fullcalendar/core/CalendarComponent';
-    import {isPropsValidTester} from '@fullcalendar/core/validation';
-    import {
-        eventDragMutationMassager,
-        EventDropTransformers,
-        eventIsDraggableTransformer
-    } from '@fullcalendar/core/interactions/event-dragging';
-    import {dateSelectionJoinTransformer} from '@fullcalendar/core/interactions/date-selecting';
-    import {EventResizeJoinTransforms} from '@fullcalendar/core/interactions/event-resizing';
-    import {ExternalDefTransform} from '@fullcalendar/core/interactions/external-element-dragging';
-    import {InteractionClass} from '@fullcalendar/core/interactions/interaction';
-    import {ThemeClass} from '@fullcalendar/core/theme/Theme';
-    import {EventSourceDef} from '@fullcalendar/core/structs/event-source';
-    import {CmdFormatterFunc} from '@fullcalendar/core/datelib/formatting-cmd';
-    import {RecurringType} from '@fullcalendar/core/structs/recurring-event';
-    import {NamedTimeZoneImplClass} from '@fullcalendar/core/datelib/timezone';
-    import {ElementDraggingClass} from '@fullcalendar/core/interactions/ElementDragging';
-
-    export interface PluginDefInput {
-        deps?: PluginDef[];
-        reducers?: reducerFunc[];
-        eventDefParsers?: eventDefParserFunc[];
-        isDraggableTransformers?: eventIsDraggableTransformer[];
-        eventDragMutationMassagers?: eventDragMutationMassager[];
-        eventDefMutationAppliers?: eventDefMutationApplier[];
-        dateSelectionTransformers?: dateSelectionJoinTransformer[];
-        datePointTransforms?: DatePointTransform[];
-        dateSpanTransforms?: DateSpanTransform[];
-        views?: ViewConfigInputHash;
-        viewPropsTransformers?: ViewPropsTransformerClass[];
-        isPropsValid?: isPropsValidTester;
-        externalDefTransforms?: ExternalDefTransform[];
-        eventResizeJoinTransforms?: EventResizeJoinTransforms[];
-        viewContainerModifiers?: ViewContainerModifier[];
-        eventDropTransformers?: EventDropTransformers[];
-        componentInteractions?: InteractionClass[];
-        calendarInteractions?: CalendarInteractionClass[];
-        themeClasses?: {
-            [themeSystemName: string]: ThemeClass;
-        };
-        eventSourceDefs?: EventSourceDef[];
-        cmdFormatter?: CmdFormatterFunc;
-        recurringTypes?: RecurringType[];
-        namedTimeZonedImpl?: NamedTimeZoneImplClass;
-        defaultView?: string;
-        elementDraggingImpl?: ElementDraggingClass;
-        optionChangeHandlers?: OptionChangeHandlerMap;
-    }
-    export interface PluginHooks {
-        reducers: reducerFunc[];
-        eventDefParsers: eventDefParserFunc[];
-        isDraggableTransformers: eventIsDraggableTransformer[];
-        eventDragMutationMassagers: eventDragMutationMassager[];
-        eventDefMutationAppliers: eventDefMutationApplier[];
-        dateSelectionTransformers: dateSelectionJoinTransformer[];
-        datePointTransforms: DatePointTransform[];
-        dateSpanTransforms: DateSpanTransform[];
-        views: ViewConfigInputHash;
-        viewPropsTransformers: ViewPropsTransformerClass[];
-        isPropsValid: isPropsValidTester | null;
-        externalDefTransforms: ExternalDefTransform[];
-        eventResizeJoinTransforms: EventResizeJoinTransforms[];
-        viewContainerModifiers: ViewContainerModifier[];
-        eventDropTransformers: EventDropTransformers[];
-        componentInteractions: InteractionClass[];
-        calendarInteractions: CalendarInteractionClass[];
-        themeClasses: {
-            [themeSystemName: string]: ThemeClass;
-        };
-        eventSourceDefs: EventSourceDef[];
-        cmdFormatter?: CmdFormatterFunc;
-        recurringTypes: RecurringType[];
-        namedTimeZonedImpl?: NamedTimeZoneImplClass;
-        defaultView: string;
-        elementDraggingImpl?: ElementDraggingClass;
-        optionChangeHandlers: OptionChangeHandlerMap;
-    }
-    export interface PluginDef extends PluginHooks {
-        id: string;
-        deps: PluginDef[];
-    }
-    export type ViewPropsTransformerClass = new () => ViewPropsTransformer;
-    export interface ViewPropsTransformer {
-        transform(viewProps: ViewProps, viewSpec: ViewSpec, calendarProps: CalendarComponentProps, view: View): any;
-    }
-    export type ViewContainerModifier = (contentEl: HTMLElement, calendar: Calendar) => void;
-    export function createPlugin(input: PluginDefInput): PluginDef;
-    export class PluginSystem {
-        hooks: PluginHooks;
-        addedHash: {
-            [pluginId: string]: true;
-        };
-        constructor();
-        add(plugin: PluginDef): void;
-    }
-}
-
-declare module '@fullcalendar/core/reducers/types' {
-    import {EventInput, EventInstanceHash} from '@fullcalendar/core/structs/event';
-    import {DateRange} from '@fullcalendar/core/datelib/date-range';
-    import {EventStore} from '@fullcalendar/core/structs/event-store';
-    import {EventMutation} from '@fullcalendar/core/structs/event-mutation';
-    import {EventSource, EventSourceError, EventSourceHash} from '@fullcalendar/core/structs/event-source';
-    import {DateProfile} from '@fullcalendar/core/DateProfileGenerator';
-    import {EventInteractionState} from '@fullcalendar/core/interactions/event-interaction-state';
-    import {DateSpan} from '@fullcalendar/core/structs/date-span';
-    import {DateEnv} from '@fullcalendar/core/datelib/env';
-    import Calendar from '@fullcalendar/core/Calendar';
-    import {DateMarker} from '@fullcalendar/core/datelib/marker';
-
-    export interface CalendarState {
-        eventSources: EventSourceHash;
-        eventSourceLoadingLevel: number;
-        loadingLevel: number;
-        viewType: string;
-        currentDate: DateMarker;
-        dateProfile: DateProfile | null;
-        eventStore: EventStore;
-        dateSelection: DateSpan | null;
-        eventSelection: string;
-        eventDrag: EventInteractionState | null;
-        eventResize: EventInteractionState | null;
-    }
-    export type reducerFunc = (state: CalendarState, action: Action, calendar: Calendar) => CalendarState;
-    export type Action = {
-        type: 'INIT';
-    } | // wont it create another rerender?
-    {
-        type: 'PREV';
-    } | {
-        type: 'NEXT';
-    } | {
-        type: 'SET_DATE';
-        dateMarker: DateMarker;
-    } | {
-        type: 'SET_VIEW_TYPE';
-        viewType: string;
-        dateMarker?: DateMarker;
-    } | {
-        type: 'SELECT_DATES';
-        selection: DateSpan;
-    } | {
-        type: 'UNSELECT_DATES';
-    } | {
-        type: 'SELECT_EVENT';
-        eventInstanceId: string;
-    } | {
-        type: 'UNSELECT_EVENT';
-    } | {
-        type: 'SET_EVENT_DRAG';
-        state: EventInteractionState;
-    } | {
-        type: 'UNSET_EVENT_DRAG';
-    } | {
-        type: 'SET_EVENT_RESIZE';
-        state: EventInteractionState;
-    } | {
-        type: 'UNSET_EVENT_RESIZE';
-    } | {
-        type: 'ADD_EVENT_SOURCES';
-        sources: EventSource[];
-    } | {
-        type: 'REMOVE_EVENT_SOURCE';
-        sourceId: string;
-    } | {
-        type: 'REMOVE_ALL_EVENT_SOURCES';
-    } | {
-        type: 'FETCH_EVENT_SOURCES';
-        sourceIds?: string[];
-    } | // if no sourceIds, fetch all
-    {
-        type: 'CHANGE_TIMEZONE';
-        oldDateEnv: DateEnv;
-    } | {
-        type: 'RECEIVE_EVENTS';
-        sourceId: string;
-        fetchId: string;
-        fetchRange: DateRange | null;
-        rawEvents: EventInput[];
-    } | {
-        type: 'RECEIVE_EVENT_ERROR';
-        sourceId: string;
-        fetchId: string;
-        fetchRange: DateRange | null;
-        error: EventSourceError;
-    } | // need all these?
-    {
-        type: 'ADD_EVENTS';
-        eventStore: EventStore;
-    } | {
-        type: 'MERGE_EVENTS';
-        eventStore: EventStore;
-    } | {
-        type: 'MUTATE_EVENTS';
-        instanceId: string;
-        mutation: EventMutation;
-        fromApi?: boolean;
-    } | {
-        type: 'REMOVE_EVENT_DEF';
-        defId: string;
-    } | {
-        type: 'REMOVE_EVENT_INSTANCES';
-        instances: EventInstanceHash;
-    } | {
-        type: 'REMOVE_ALL_EVENTS';
-    } | {
-        type: 'RESET_EVENTS';
-    };
-}
-
-declare module '@fullcalendar/core/CalendarComponent' {
-    import Component, {ComponentContext} from '@fullcalendar/core/component/Component';
-    import {ViewSpec} from '@fullcalendar/core/structs/view-spec';
-    import View from '@fullcalendar/core/View';
-    import Toolbar from '@fullcalendar/core/Toolbar';
-    import DateProfileGenerator, {DateProfile} from '@fullcalendar/core/DateProfileGenerator';
-    import {EventStore} from '@fullcalendar/core/structs/event-store';
-    import {EventUiHash} from '@fullcalendar/core/component/event-ui';
-    import {BusinessHoursInput} from '@fullcalendar/core/structs/business-hours';
-    import {DateMarker} from '@fullcalendar/core/datelib/marker';
-    import {CalendarState} from '@fullcalendar/core/reducers/types';
-
-    export interface CalendarComponentProps extends CalendarState {
-        viewSpec: ViewSpec;
-        dateProfileGenerator: DateProfileGenerator;
-        eventUiBases: EventUiHash;
-    }
-
-    export {CalendarComponent as default, CalendarComponent};
-
-    class CalendarComponent extends Component<CalendarComponentProps> {
-        view: View;
-        header: Toolbar;
-        footer: Toolbar;
-        computeTitle: (dateProfile: any, viewOptions: any) => string;
-        parseBusinessHours: (input: BusinessHoursInput) => EventStore;
-        el: HTMLElement;
-        contentEl: HTMLElement;
-        isHeightAuto: boolean;
-        viewHeight: number;
-        constructor(context: ComponentContext, el: HTMLElement);
-        destroy(): void;
-        toggleElClassNames(bool: boolean): void;
-        render(props: CalendarComponentProps): void;
-        renderToolbars(viewSpec: ViewSpec, dateProfile: DateProfile, currentDate: DateMarker, dateProfileGenerator: DateProfileGenerator, title: string): void;
-        renderView(props: CalendarComponentProps, title: string): void;
-        updateSize(isResize?: boolean): void;
-        computeHeightVars(): void;
-        queryToolbarsHeight(): number;
-        freezeHeight(): void;
-        thawHeight(): void;
-    }
-}
-
-declare module '@fullcalendar/core/common/DayHeader' {
-    import Component, {ComponentContext} from '@fullcalendar/core/component/Component';
-    import {DateMarker} from '@fullcalendar/core/datelib/marker';
-    import {DateProfile} from '@fullcalendar/core/DateProfileGenerator';
-
-    export interface DayTableHeaderProps {
-        dates: DateMarker[];
-        dateProfile: DateProfile;
-        datesRepDistinctDays: boolean;
-        renderIntroHtml?: () => string;
-    }
-
-    export {DayHeader as default, DayHeader};
-
-    class DayHeader extends Component<DayTableHeaderProps> {
-        el: HTMLElement;
-        thead: HTMLElement;
-        constructor(context: ComponentContext, parentEl: HTMLElement);
-        destroy(): void;
-        render(props: DayTableHeaderProps): void;
-    }
-}
-
-declare module '@fullcalendar/core/common/table-utils' {
-    import {DateMarker} from '@fullcalendar/core/datelib/marker';
-    import {DateProfile} from '@fullcalendar/core/DateProfileGenerator';
-    import {ComponentContext} from '@fullcalendar/core/component/Component';
-
-    export function computeFallbackHeaderFormat(datesRepDistinctDays: boolean, dayCnt: number): {
-        weekday: string;
-        month?: undefined;
-        day?: undefined;
-        omitCommas?: undefined;
-    } | {
-        weekday: string;
-        month: string;
-        day: string;
-        omitCommas: boolean;
-    };
-    export function renderDateCell(dateMarker: DateMarker, dateProfile: DateProfile, datesRepDistinctDays: any, colCnt: any, colHeadFormat: any, context: ComponentContext, colspan?: any, otherAttrs?: any): string;
-}
-
-declare module '@fullcalendar/core/common/DaySeries' {
-    import DateProfileGenerator from '@fullcalendar/core/DateProfileGenerator';
-    import {DateMarker} from '@fullcalendar/core/datelib/marker';
-    import {DateRange} from '@fullcalendar/core/datelib/date-range';
-
-    export interface DaySeriesSeg {
-        firstIndex: number;
-        lastIndex: number;
-        isStart: boolean;
-        isEnd: boolean;
-    }
-
-    export {DaySeries as default, DaySeries};
-
-    class DaySeries {
-        cnt: number;
-        dates: DateMarker[];
-        indices: number[];
-        constructor(range: DateRange, dateProfileGenerator: DateProfileGenerator);
-        sliceRange(range: DateRange): DaySeriesSeg | null;
-    }
-}
-
-declare module '@fullcalendar/core/interactions/event-interaction-state' {
-    import {EventStore} from '@fullcalendar/core/structs/event-store';
-    import {Seg} from '@fullcalendar/core/component/DateComponent';
-
-    export interface EventInteractionState {
-        affectedEvents: EventStore;
-        mutatedEvents: EventStore;
-        isEvent: boolean;
-        origSeg: Seg | null;
-    }
-}
-
-declare module '@fullcalendar/core/component/event-rendering' {
-    import {EventDef, EventDefHash, EventTuple} from '@fullcalendar/core/structs/event';
-    import {EventStore} from '@fullcalendar/core/structs/event-store';
-    import {DateRange} from '@fullcalendar/core/datelib/date-range';
-    import {Duration} from '@fullcalendar/core/datelib/duration';
-    import {Seg} from '@fullcalendar/core/component/DateComponent';
-    import View from '@fullcalendar/core/View';
-    import {EventUi, EventUiHash} from '@fullcalendar/core/component/event-ui';
-
-    export interface EventRenderRange extends EventTuple {
-        ui: EventUi;
-        range: DateRange;
-        isStart: boolean;
-        isEnd: boolean;
-    }
-
-    export function sliceEventStore(eventStore: EventStore, eventUiBases: EventUiHash, framingRange: DateRange, nextDayThreshold?: Duration): {
-        bg: EventRenderRange[];
-        fg: EventRenderRange[];
-    };
-    export function hasBgRendering(def: EventDef): boolean;
-    export function filterSegsViaEls(view: View, segs: Seg[], isMirror: boolean): Seg[];
-    export function getElSeg(el: HTMLElement): Seg | null;
-    export function compileEventUis(eventDefs: EventDefHash, eventUiBases: EventUiHash): {
-        [key: string]: EventUi;
-    };
-    export function compileEventUi(eventDef: EventDef, eventUiBases: EventUiHash): EventUi;
-}
-
-declare module '@fullcalendar/core/common/DayTable' {
-    import DaySeries from '@fullcalendar/core/common/DaySeries';
-    import {DateRange} from '@fullcalendar/core/datelib/date-range';
-    import {DateMarker} from '@fullcalendar/core/datelib/marker';
-    import {Seg} from '@fullcalendar/core/component/DateComponent';
-
-    export interface DayTableSeg extends Seg {
-        row: number;
-        firstCol: number;
-        lastCol: number;
-    }
-
-    export interface DayTableCell {
-        date: DateMarker;
-        htmlAttrs?: string;
-    }
-    export { DayTable as default, DayTable };
-    class DayTable {
-        rowCnt: number;
-        colCnt: number;
-        cells: DayTableCell[][];
-        headerDates: DateMarker[];
-        constructor(daySeries: DaySeries, breakOnWeeks: boolean);
-        sliceRange(range: DateRange): DayTableSeg[];
-    }
-}
-
-declare module '@fullcalendar/core/common/slicing-utils' {
-    import {DateRange} from '@fullcalendar/core/datelib/date-range';
-    import {EventStore} from '@fullcalendar/core/structs/event-store';
-    import {EventUiHash} from '@fullcalendar/core/component/event-ui';
-    import {DateProfile} from '@fullcalendar/core/DateProfileGenerator';
-    import DateComponent, {EventSegUiInteractionState, Seg} from '@fullcalendar/core/component/DateComponent';
-    import {DateSpan} from '@fullcalendar/core/structs/date-span';
-    import {EventInteractionState} from '@fullcalendar/core/interactions/event-interaction-state';
-    import {Duration} from '@fullcalendar/core/datelib/duration';
-    import {DateMarker} from '@fullcalendar/core/datelib/marker';
-
-    export interface SliceableProps {
-        dateSelection: DateSpan;
-        businessHours: EventStore;
-        eventStore: EventStore;
-        eventDrag: EventInteractionState | null;
-        eventResize: EventInteractionState | null;
-        eventSelection: string;
-        eventUiBases: EventUiHash;
-    }
-    export interface SlicedProps<SegType extends Seg> {
-        dateSelectionSegs: SegType[];
-        businessHourSegs: SegType[];
-        fgEventSegs: SegType[];
-        bgEventSegs: SegType[];
-        eventDrag: EventSegUiInteractionState | null;
-        eventResize: EventSegUiInteractionState | null;
-        eventSelection: string;
-    }
-    export { Slicer as default, Slicer };
-    abstract class Slicer<SegType extends Seg, ExtraArgs extends any[] = []> {
-        abstract sliceRange(dateRange: DateRange, ...extraArgs: ExtraArgs): SegType[];
-        sliceProps(props: SliceableProps, dateProfile: DateProfile, nextDayThreshold: Duration | null, component: DateComponent<any>, // TODO: kill
-        ...extraArgs: ExtraArgs): SlicedProps<SegType>;
-        sliceNowDate(// does not memoize
-        date: DateMarker, component: DateComponent<any>, // TODO: kill
-        ...extraArgs: ExtraArgs): SegType[];
-    }
-}
-
-declare module '@fullcalendar/core/structs/event-mutation' {
-    import {Duration} from '@fullcalendar/core/datelib/duration';
-    import {EventStore} from '@fullcalendar/core/structs/event-store';
-    import {EventDef} from '@fullcalendar/core/structs/event';
-    import Calendar from '@fullcalendar/core/Calendar';
-    import {EventUiHash} from '@fullcalendar/core/component/event-ui';
-
-    export interface EventMutation {
-        datesDelta?: Duration;
-        startDelta?: Duration;
-        endDelta?: Duration;
-        standardProps?: any;
-        extendedProps?: any;
-    }
-
-    export function applyMutationToEventStore(eventStore: EventStore, eventConfigBase: EventUiHash, mutation: EventMutation, calendar: Calendar): EventStore;
-
-    export type eventDefMutationApplier = (eventDef: EventDef, mutation: EventMutation, calendar: Calendar) => void;
-}
-
-declare module '@fullcalendar/core/validation' {
-    import {EventStore} from '@fullcalendar/core/structs/event-store';
-    import Calendar from '@fullcalendar/core/Calendar';
-    import {DateSpan, DateSpanApi} from '@fullcalendar/core/structs/date-span';
-    import EventApi from '@fullcalendar/core/api/EventApi';
-    import {EventInput} from '@fullcalendar/core/structs/event';
-    import {EventInteractionState} from '@fullcalendar/core/interactions/event-interaction-state';
-    import {SplittableProps} from '@fullcalendar/core/component/event-splitting';
-    export type ConstraintInput = 'businessHours' | string | EventInput | EventInput[];
-    export type Constraint = 'businessHours' | string | EventStore | false;
-    export type OverlapFunc = ((stillEvent: EventApi, movingEvent: EventApi | null) => boolean);
-    export type AllowFunc = (span: DateSpanApi, movingEvent: EventApi | null) => boolean;
-    export type isPropsValidTester = (props: SplittableProps, calendar: Calendar) => boolean;
-
-    export function isInteractionValid(interaction: EventInteractionState, calendar: Calendar): boolean;
-
-    export function isDateSelectionValid(dateSelection: DateSpan, calendar: Calendar): boolean;
-
-    export function isPropsValid(state: SplittableProps, calendar: Calendar, dateSpanMeta?: {}, filterConfig?: any): boolean;
-
-    export function normalizeConstraint(input: ConstraintInput, calendar: Calendar): Constraint | null;
-}
-
-declare module '@fullcalendar/core/api/EventApi' {
-    import Calendar from '@fullcalendar/core/Calendar';
-    import {EventDef, EventInstance} from '@fullcalendar/core/structs/event';
-    import {EventMutation} from '@fullcalendar/core/structs/event-mutation';
-    import {DateInput} from '@fullcalendar/core/datelib/env';
-    import {DurationInput} from '@fullcalendar/core/datelib/duration';
-    import {FormatterInput} from '@fullcalendar/core/datelib/formatting';
-    import EventSourceApi from '@fullcalendar/core/api/EventSourceApi';
-    export {EventApi as default, EventApi};
-
-    class EventApi {
-        _calendar: Calendar;
-        _def: EventDef;
-        _instance: EventInstance | null;
-
-        constructor(calendar: Calendar, def: EventDef, instance?: EventInstance);
-
-        setProp(name: string, val: string): void;
-
-        setExtendedProp(name: string, val: any): void;
-
-        setStart(startInput: DateInput, options?: {
-            granularity?: string;
-            maintainDuration?: boolean;
-        }): void;
-        setEnd(endInput: DateInput | null, options?: {
-            granularity?: string;
-        }): void;
-        setDates(startInput: DateInput, endInput: DateInput | null, options?: {
-            allDay?: boolean;
-            granularity?: string;
-        }): void;
-        moveStart(deltaInput: DurationInput): void;
-        moveEnd(deltaInput: DurationInput): void;
-        moveDates(deltaInput: DurationInput): void;
-        setAllDay(allDay: boolean, options?: {
-            maintainDuration?: boolean;
-        }): void;
-        formatRange(formatInput: FormatterInput): any;
-        mutate(mutation: EventMutation): void;
-        remove(): void;
-        readonly source: EventSourceApi | null;
-        readonly start: Date | null;
-        readonly end: Date | null;
-        readonly id: string;
-        readonly groupId: string;
-        readonly allDay: boolean;
-        readonly title: string;
-        readonly url: string;
-        readonly rendering: string;
-        readonly startEditable: boolean;
-        readonly durationEditable: boolean;
-        readonly constraint: any;
-        readonly overlap: any;
-        readonly allow: any;
-        readonly backgroundColor: string;
-        readonly borderColor: string;
-        readonly textColor: string;
-        readonly classNames: string[];
-        readonly extendedProps: any;
-    }
-}
-
-declare module '@fullcalendar/core/util/requestJson' {
-    export default function requestJson(method: string, url: string, params: object, successCallback: any, failureCallback: any): void;
-}
-
-declare module '@fullcalendar/core/datelib/locale' {
-    export type LocaleCodeArg = string | string[];
-    export type LocaleSingularArg = LocaleCodeArg | RawLocale;
-    export interface Locale {
-        codeArg: LocaleCodeArg;
-        codes: string[];
-        week: {
-            dow: number;
-            doy: number;
-        };
-        simpleNumberFormat: Intl.NumberFormat;
-        options: any;
-    }
-    export interface RawLocale {
-        code: string;
-        [otherProp: string]: any;
-    }
-    export type RawLocaleMap = {
-        [code: string]: RawLocale;
-    };
-    export interface RawLocaleInfo {
-        map: RawLocaleMap;
-        defaultCode: string;
-    }
-    export function parseRawLocales(explicitRawLocales: RawLocale[]): RawLocaleInfo;
-    export function buildLocale(inputSingular: LocaleSingularArg, available: RawLocaleMap): Locale;
-}
-
-declare module '@fullcalendar/core/OptionsManager' {
-    export { OptionsManager as default, OptionsManager };
-    class OptionsManager {
-        dirDefaults: any;
-        localeDefaults: any;
-        overrides: any;
-        dynamicOverrides: any;
-        computed: any;
-        constructor(overrides: any);
-        mutate(updates: any, removals: string[], isDynamic?: boolean): void;
-        compute(): void;
-    }
-}
-
-declare module '@fullcalendar/core/api/EventSourceApi' {
-    import Calendar from '@fullcalendar/core/Calendar';
-    import {EventSource} from '@fullcalendar/core/structs/event-source';
-    export { EventSourceApi as default, EventSourceApi };
-    class EventSourceApi {
-        calendar: Calendar;
-        internalEventSource: EventSource;
-        constructor(calendar: Calendar, internalEventSource: EventSource);
-        remove(): void;
-        refetch(): void;
-        readonly id: string;
-        readonly url: string;
-    }
-}
-
-declare module '@fullcalendar/core/structs/view-config' {
-    import View from '@fullcalendar/core/View';
-    import {ViewSpec} from '@fullcalendar/core/structs/view-spec';
-    import {ComponentContext} from '@fullcalendar/core/component/Component';
-    import DateProfileGenerator from '@fullcalendar/core/DateProfileGenerator';
-    export type ViewClass = new (context: ComponentContext, viewSpec: ViewSpec, dateProfileGenerator: DateProfileGenerator, parentEl: HTMLElement) => View;
-
-    export interface ViewConfigObjectInput {
-        type?: string;
-        class?: ViewClass;
-
-        [optionName: string]: any;
-    }
-
-    export type ViewConfigInput = ViewClass | ViewConfigObjectInput;
-    export type ViewConfigInputHash = {
-        [viewType: string]: ViewConfigInput;
-    };
-    export interface ViewConfig {
-        superType: string;
-        class: ViewClass | null;
-        options: any;
-    }
-    export type ViewConfigHash = {
-        [viewType: string]: ViewConfig;
-    };
-    export function parseViewConfigs(inputs: ViewConfigInputHash): ViewConfigHash;
-}
-
-declare module '@fullcalendar/core/datelib/calendar-system' {
-    import {DateMarker} from '@fullcalendar/core/datelib/marker';
-
-    export interface CalendarSystem {
-        getMarkerYear(d: DateMarker): number;
-
-        getMarkerMonth(d: DateMarker): number;
-
-        getMarkerDay(d: DateMarker): number;
-
-        arrayToMarker(arr: number[]): DateMarker;
-
-        markerToArray(d: DateMarker): number[];
-    }
-
-    export function registerCalendarSystem(name: any, theClass: any): void;
-
-    export function createCalendarSystem(name: any): any;
-}
-
-declare module '@fullcalendar/core/datelib/formatting-cmd' {
-    import {
-        DateFormatter,
-        DateFormattingContext,
-        VerboseFormattingArg,
-        ZonedMarker
-    } from '@fullcalendar/core/datelib/formatting';
-    export type CmdFormatterFunc = (cmd: string, arg: VerboseFormattingArg) => string;
-
-    export class CmdFormatter implements DateFormatter {
-        cmdStr: string;
-        separator: string;
-
-        constructor(cmdStr: string, separator?: string);
-
-        format(date: ZonedMarker, context: DateFormattingContext): string;
-
-        formatRange(start: ZonedMarker, end: ZonedMarker, context: DateFormattingContext): string;
-    }
-}
-
-declare module '@fullcalendar/core/datelib/formatting-func' {
-    import {
-        DateFormatter,
-        DateFormattingContext,
-        VerboseFormattingArg,
-        ZonedMarker
-    } from '@fullcalendar/core/datelib/formatting';
-    export type FuncFormatterFunc = (arg: VerboseFormattingArg) => string;
-
-    export class FuncFormatter implements DateFormatter {
-        func: FuncFormatterFunc;
-
-        constructor(func: FuncFormatterFunc);
-
-        format(date: ZonedMarker, context: DateFormattingContext): string;
-
-        formatRange(start: ZonedMarker, end: ZonedMarker, context: DateFormattingContext): string;
-    }
-}
-
-declare module '@fullcalendar/core/event-sources/func-event-source' {
-    import {EventSourceError} from '@fullcalendar/core/structs/event-source';
-    import {EventInput} from '@fullcalendar/core/structs/event';
-    export type EventSourceFunc = (arg: {
-        start: Date;
-        end: Date;
-        timeZone: string;
-    }, successCallback: (events: EventInput[]) => void, failureCallback: (error: EventSourceError) => void) => (void | PromiseLike<EventInput[]>);
-    const _default: import("@fullcalendar/core/plugin-system").PluginDef;
-    export default _default;
-}
-
-declare module '@fullcalendar/core/interactions/external-element-dragging' {
-    import {DateSpan} from '@fullcalendar/core/structs/date-span';
-    import {DragMeta} from '@fullcalendar/core/structs/drag-meta';
-    export type ExternalDefTransform = (dateSpan: DateSpan, dragMeta: DragMeta) => any;
-}
-
-declare module '@fullcalendar/core/Toolbar' {
-    import Component, {ComponentContext} from '@fullcalendar/core/component/Component';
-
-    export interface ToolbarRenderProps {
-        layout: any;
-        title: string;
-        activeButton: string;
-        isTodayEnabled: boolean;
-        isPrevEnabled: boolean;
-        isNextEnabled: boolean;
-    }
-
-    export {Toolbar as default, Toolbar};
-    class Toolbar extends Component<ToolbarRenderProps> {
-        el: HTMLElement;
-        viewsWithButtons: any;
-        constructor(context: ComponentContext, extraClassName: any);
-        destroy(): void;
-        render(props: ToolbarRenderProps): void;
-        renderLayout(layout: any): void;
-        unrenderLayout(): void;
-        renderSection(position: any, buttonStr: any): HTMLElement;
-        updateToday(isTodayEnabled: any): void;
-        updatePrev(isPrevEnabled: any): void;
-        updateNext(isNextEnabled: any): void;
-        updateTitle(text: any): void;
-        updateActiveButton(buttonName?: any): void;
-        toggleButtonEnabled(buttonName: any, bool: any): void;
-    }
-}
-
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/core/main.esm.js b/AKPlan/static/AKPlan/vendor/fullcalendar/core/main.esm.js
deleted file mode 100644
index b3d27d75214f1e2ba49dfb371ad9e479afc4c4e4..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/core/main.esm.js
+++ /dev/null
@@ -1,8558 +0,0 @@
-/*!
-FullCalendar Core Package v4.3.1
-Docs & License: https://fullcalendar.io/
-(c) 2019 Adam Shaw
-*/
-
-// Creating
-// ----------------------------------------------------------------------------------------------------------------
-var elementPropHash = {
-    className: true,
-    colSpan: true,
-    rowSpan: true
-};
-var containerTagHash = {
-    '<tr': 'tbody',
-    '<td': 'tr'
-};
-function createElement(tagName, attrs, content) {
-    var el = document.createElement(tagName);
-    if (attrs) {
-        for (var attrName in attrs) {
-            if (attrName === 'style') {
-                applyStyle(el, attrs[attrName]);
-            }
-            else if (elementPropHash[attrName]) {
-                el[attrName] = attrs[attrName];
-            }
-            else {
-                el.setAttribute(attrName, attrs[attrName]);
-            }
-        }
-    }
-    if (typeof content === 'string') {
-        el.innerHTML = content; // shortcut. no need to process HTML in any way
-    }
-    else if (content != null) {
-        appendToElement(el, content);
-    }
-    return el;
-}
-function htmlToElement(html) {
-    html = html.trim();
-    var container = document.createElement(computeContainerTag(html));
-    container.innerHTML = html;
-    return container.firstChild;
-}
-function htmlToElements(html) {
-    return Array.prototype.slice.call(htmlToNodeList(html));
-}
-function htmlToNodeList(html) {
-    html = html.trim();
-    var container = document.createElement(computeContainerTag(html));
-    container.innerHTML = html;
-    return container.childNodes;
-}
-// assumes html already trimmed and tag names are lowercase
-function computeContainerTag(html) {
-    return containerTagHash[html.substr(0, 3) // faster than using regex
-    ] || 'div';
-}
-function appendToElement(el, content) {
-    var childNodes = normalizeContent(content);
-    for (var i = 0; i < childNodes.length; i++) {
-        el.appendChild(childNodes[i]);
-    }
-}
-function prependToElement(parent, content) {
-    var newEls = normalizeContent(content);
-    var afterEl = parent.firstChild || null; // if no firstChild, will append to end, but that's okay, b/c there were no children
-    for (var i = 0; i < newEls.length; i++) {
-        parent.insertBefore(newEls[i], afterEl);
-    }
-}
-function insertAfterElement(refEl, content) {
-    var newEls = normalizeContent(content);
-    var afterEl = refEl.nextSibling || null;
-    for (var i = 0; i < newEls.length; i++) {
-        refEl.parentNode.insertBefore(newEls[i], afterEl);
-    }
-}
-function normalizeContent(content) {
-    var els;
-    if (typeof content === 'string') {
-        els = htmlToElements(content);
-    }
-    else if (content instanceof Node) {
-        els = [content];
-    }
-    else { // Node[] or NodeList
-        els = Array.prototype.slice.call(content);
-    }
-    return els;
-}
-function removeElement(el) {
-    if (el.parentNode) {
-        el.parentNode.removeChild(el);
-    }
-}
-// Querying
-// ----------------------------------------------------------------------------------------------------------------
-// from https://developer.mozilla.org/en-US/docs/Web/API/Element/closest
-var matchesMethod = Element.prototype.matches ||
-    Element.prototype.matchesSelector ||
-    Element.prototype.msMatchesSelector;
-var closestMethod = Element.prototype.closest || function (selector) {
-    // polyfill
-    var el = this;
-    if (!document.documentElement.contains(el)) {
-        return null;
-    }
-    do {
-        if (elementMatches(el, selector)) {
-            return el;
-        }
-        el = el.parentElement || el.parentNode;
-    } while (el !== null && el.nodeType === 1);
-    return null;
-};
-function elementClosest(el, selector) {
-    return closestMethod.call(el, selector);
-}
-function elementMatches(el, selector) {
-    return matchesMethod.call(el, selector);
-}
-// accepts multiple subject els
-// returns a real array. good for methods like forEach
-function findElements(container, selector) {
-    var containers = container instanceof HTMLElement ? [container] : container;
-    var allMatches = [];
-    for (var i = 0; i < containers.length; i++) {
-        var matches = containers[i].querySelectorAll(selector);
-        for (var j = 0; j < matches.length; j++) {
-            allMatches.push(matches[j]);
-        }
-    }
-    return allMatches;
-}
-// accepts multiple subject els
-// only queries direct child elements
-function findChildren(parent, selector) {
-    var parents = parent instanceof HTMLElement ? [parent] : parent;
-    var allMatches = [];
-    for (var i = 0; i < parents.length; i++) {
-        var childNodes = parents[i].children; // only ever elements
-        for (var j = 0; j < childNodes.length; j++) {
-            var childNode = childNodes[j];
-            if (!selector || elementMatches(childNode, selector)) {
-                allMatches.push(childNode);
-            }
-        }
-    }
-    return allMatches;
-}
-// Attributes
-// ----------------------------------------------------------------------------------------------------------------
-function forceClassName(el, className, bool) {
-    if (bool) {
-        el.classList.add(className);
-    }
-    else {
-        el.classList.remove(className);
-    }
-}
-// Style
-// ----------------------------------------------------------------------------------------------------------------
-var PIXEL_PROP_RE = /(top|left|right|bottom|width|height)$/i;
-function applyStyle(el, props) {
-    for (var propName in props) {
-        applyStyleProp(el, propName, props[propName]);
-    }
-}
-function applyStyleProp(el, name, val) {
-    if (val == null) {
-        el.style[name] = '';
-    }
-    else if (typeof val === 'number' && PIXEL_PROP_RE.test(name)) {
-        el.style[name] = val + 'px';
-    }
-    else {
-        el.style[name] = val;
-    }
-}
-
-function pointInsideRect(point, rect) {
-    return point.left >= rect.left &&
-        point.left < rect.right &&
-        point.top >= rect.top &&
-        point.top < rect.bottom;
-}
-// Returns a new rectangle that is the intersection of the two rectangles. If they don't intersect, returns false
-function intersectRects(rect1, rect2) {
-    var res = {
-        left: Math.max(rect1.left, rect2.left),
-        right: Math.min(rect1.right, rect2.right),
-        top: Math.max(rect1.top, rect2.top),
-        bottom: Math.min(rect1.bottom, rect2.bottom)
-    };
-    if (res.left < res.right && res.top < res.bottom) {
-        return res;
-    }
-    return false;
-}
-function translateRect(rect, deltaX, deltaY) {
-    return {
-        left: rect.left + deltaX,
-        right: rect.right + deltaX,
-        top: rect.top + deltaY,
-        bottom: rect.bottom + deltaY
-    };
-}
-// Returns a new point that will have been moved to reside within the given rectangle
-function constrainPoint(point, rect) {
-    return {
-        left: Math.min(Math.max(point.left, rect.left), rect.right),
-        top: Math.min(Math.max(point.top, rect.top), rect.bottom)
-    };
-}
-// Returns a point that is the center of the given rectangle
-function getRectCenter(rect) {
-    return {
-        left: (rect.left + rect.right) / 2,
-        top: (rect.top + rect.bottom) / 2
-    };
-}
-// Subtracts point2's coordinates from point1's coordinates, returning a delta
-function diffPoints(point1, point2) {
-    return {
-        left: point1.left - point2.left,
-        top: point1.top - point2.top
-    };
-}
-
-// Logic for determining if, when the element is right-to-left, the scrollbar appears on the left side
-var isRtlScrollbarOnLeft = null;
-function getIsRtlScrollbarOnLeft() {
-    if (isRtlScrollbarOnLeft === null) {
-        isRtlScrollbarOnLeft = computeIsRtlScrollbarOnLeft();
-    }
-    return isRtlScrollbarOnLeft;
-}
-function computeIsRtlScrollbarOnLeft() {
-    var outerEl = createElement('div', {
-        style: {
-            position: 'absolute',
-            top: -1000,
-            left: 0,
-            border: 0,
-            padding: 0,
-            overflow: 'scroll',
-            direction: 'rtl'
-        }
-    }, '<div></div>');
-    document.body.appendChild(outerEl);
-    var innerEl = outerEl.firstChild;
-    var res = innerEl.getBoundingClientRect().left > outerEl.getBoundingClientRect().left;
-    removeElement(outerEl);
-    return res;
-}
-// The scrollbar width computations in computeEdges are sometimes flawed when it comes to
-// retina displays, rounding, and IE11. Massage them into a usable value.
-function sanitizeScrollbarWidth(width) {
-    width = Math.max(0, width); // no negatives
-    width = Math.round(width);
-    return width;
-}
-
-function computeEdges(el, getPadding) {
-    if (getPadding === void 0) { getPadding = false; }
-    var computedStyle = window.getComputedStyle(el);
-    var borderLeft = parseInt(computedStyle.borderLeftWidth, 10) || 0;
-    var borderRight = parseInt(computedStyle.borderRightWidth, 10) || 0;
-    var borderTop = parseInt(computedStyle.borderTopWidth, 10) || 0;
-    var borderBottom = parseInt(computedStyle.borderBottomWidth, 10) || 0;
-    // must use offset(Width|Height) because compatible with client(Width|Height)
-    var scrollbarLeftRight = sanitizeScrollbarWidth(el.offsetWidth - el.clientWidth - borderLeft - borderRight);
-    var scrollbarBottom = sanitizeScrollbarWidth(el.offsetHeight - el.clientHeight - borderTop - borderBottom);
-    var res = {
-        borderLeft: borderLeft,
-        borderRight: borderRight,
-        borderTop: borderTop,
-        borderBottom: borderBottom,
-        scrollbarBottom: scrollbarBottom,
-        scrollbarLeft: 0,
-        scrollbarRight: 0
-    };
-    if (getIsRtlScrollbarOnLeft() && computedStyle.direction === 'rtl') { // is the scrollbar on the left side?
-        res.scrollbarLeft = scrollbarLeftRight;
-    }
-    else {
-        res.scrollbarRight = scrollbarLeftRight;
-    }
-    if (getPadding) {
-        res.paddingLeft = parseInt(computedStyle.paddingLeft, 10) || 0;
-        res.paddingRight = parseInt(computedStyle.paddingRight, 10) || 0;
-        res.paddingTop = parseInt(computedStyle.paddingTop, 10) || 0;
-        res.paddingBottom = parseInt(computedStyle.paddingBottom, 10) || 0;
-    }
-    return res;
-}
-function computeInnerRect(el, goWithinPadding) {
-    if (goWithinPadding === void 0) { goWithinPadding = false; }
-    var outerRect = computeRect(el);
-    var edges = computeEdges(el, goWithinPadding);
-    var res = {
-        left: outerRect.left + edges.borderLeft + edges.scrollbarLeft,
-        right: outerRect.right - edges.borderRight - edges.scrollbarRight,
-        top: outerRect.top + edges.borderTop,
-        bottom: outerRect.bottom - edges.borderBottom - edges.scrollbarBottom
-    };
-    if (goWithinPadding) {
-        res.left += edges.paddingLeft;
-        res.right -= edges.paddingRight;
-        res.top += edges.paddingTop;
-        res.bottom -= edges.paddingBottom;
-    }
-    return res;
-}
-function computeRect(el) {
-    var rect = el.getBoundingClientRect();
-    return {
-        left: rect.left + window.pageXOffset,
-        top: rect.top + window.pageYOffset,
-        right: rect.right + window.pageXOffset,
-        bottom: rect.bottom + window.pageYOffset
-    };
-}
-function computeViewportRect() {
-    return {
-        left: window.pageXOffset,
-        right: window.pageXOffset + document.documentElement.clientWidth,
-        top: window.pageYOffset,
-        bottom: window.pageYOffset + document.documentElement.clientHeight
-    };
-}
-function computeHeightAndMargins(el) {
-    return el.getBoundingClientRect().height + computeVMargins(el);
-}
-function computeVMargins(el) {
-    var computed = window.getComputedStyle(el);
-    return parseInt(computed.marginTop, 10) +
-        parseInt(computed.marginBottom, 10);
-}
-// does not return window
-function getClippingParents(el) {
-    var parents = [];
-    while (el instanceof HTMLElement) { // will stop when gets to document or null
-        var computedStyle = window.getComputedStyle(el);
-        if (computedStyle.position === 'fixed') {
-            break;
-        }
-        if ((/(auto|scroll)/).test(computedStyle.overflow + computedStyle.overflowY + computedStyle.overflowX)) {
-            parents.push(el);
-        }
-        el = el.parentNode;
-    }
-    return parents;
-}
-function computeClippingRect(el) {
-    return getClippingParents(el)
-        .map(function (el) {
-        return computeInnerRect(el);
-    })
-        .concat(computeViewportRect())
-        .reduce(function (rect0, rect1) {
-        return intersectRects(rect0, rect1) || rect1; // should always intersect
-    });
-}
-
-// Stops a mouse/touch event from doing it's native browser action
-function preventDefault(ev) {
-    ev.preventDefault();
-}
-// Event Delegation
-// ----------------------------------------------------------------------------------------------------------------
-function listenBySelector(container, eventType, selector, handler) {
-    function realHandler(ev) {
-        var matchedChild = elementClosest(ev.target, selector);
-        if (matchedChild) {
-            handler.call(matchedChild, ev, matchedChild);
-        }
-    }
-    container.addEventListener(eventType, realHandler);
-    return function () {
-        container.removeEventListener(eventType, realHandler);
-    };
-}
-function listenToHoverBySelector(container, selector, onMouseEnter, onMouseLeave) {
-    var currentMatchedChild;
-    return listenBySelector(container, 'mouseover', selector, function (ev, matchedChild) {
-        if (matchedChild !== currentMatchedChild) {
-            currentMatchedChild = matchedChild;
-            onMouseEnter(ev, matchedChild);
-            var realOnMouseLeave_1 = function (ev) {
-                currentMatchedChild = null;
-                onMouseLeave(ev, matchedChild);
-                matchedChild.removeEventListener('mouseleave', realOnMouseLeave_1);
-            };
-            // listen to the next mouseleave, and then unattach
-            matchedChild.addEventListener('mouseleave', realOnMouseLeave_1);
-        }
-    });
-}
-// Animation
-// ----------------------------------------------------------------------------------------------------------------
-var transitionEventNames = [
-    'webkitTransitionEnd',
-    'otransitionend',
-    'oTransitionEnd',
-    'msTransitionEnd',
-    'transitionend'
-];
-// triggered only when the next single subsequent transition finishes
-function whenTransitionDone(el, callback) {
-    var realCallback = function (ev) {
-        callback(ev);
-        transitionEventNames.forEach(function (eventName) {
-            el.removeEventListener(eventName, realCallback);
-        });
-    };
-    transitionEventNames.forEach(function (eventName) {
-        el.addEventListener(eventName, realCallback); // cross-browser way to determine when the transition finishes
-    });
-}
-
-var DAY_IDS = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'];
-// Adding
-function addWeeks(m, n) {
-    var a = dateToUtcArray(m);
-    a[2] += n * 7;
-    return arrayToUtcDate(a);
-}
-function addDays(m, n) {
-    var a = dateToUtcArray(m);
-    a[2] += n;
-    return arrayToUtcDate(a);
-}
-function addMs(m, n) {
-    var a = dateToUtcArray(m);
-    a[6] += n;
-    return arrayToUtcDate(a);
-}
-// Diffing (all return floats)
-function diffWeeks(m0, m1) {
-    return diffDays(m0, m1) / 7;
-}
-function diffDays(m0, m1) {
-    return (m1.valueOf() - m0.valueOf()) / (1000 * 60 * 60 * 24);
-}
-function diffHours(m0, m1) {
-    return (m1.valueOf() - m0.valueOf()) / (1000 * 60 * 60);
-}
-function diffMinutes(m0, m1) {
-    return (m1.valueOf() - m0.valueOf()) / (1000 * 60);
-}
-function diffSeconds(m0, m1) {
-    return (m1.valueOf() - m0.valueOf()) / 1000;
-}
-function diffDayAndTime(m0, m1) {
-    var m0day = startOfDay(m0);
-    var m1day = startOfDay(m1);
-    return {
-        years: 0,
-        months: 0,
-        days: Math.round(diffDays(m0day, m1day)),
-        milliseconds: (m1.valueOf() - m1day.valueOf()) - (m0.valueOf() - m0day.valueOf())
-    };
-}
-// Diffing Whole Units
-function diffWholeWeeks(m0, m1) {
-    var d = diffWholeDays(m0, m1);
-    if (d !== null && d % 7 === 0) {
-        return d / 7;
-    }
-    return null;
-}
-function diffWholeDays(m0, m1) {
-    if (timeAsMs(m0) === timeAsMs(m1)) {
-        return Math.round(diffDays(m0, m1));
-    }
-    return null;
-}
-// Start-Of
-function startOfDay(m) {
-    return arrayToUtcDate([
-        m.getUTCFullYear(),
-        m.getUTCMonth(),
-        m.getUTCDate()
-    ]);
-}
-function startOfHour(m) {
-    return arrayToUtcDate([
-        m.getUTCFullYear(),
-        m.getUTCMonth(),
-        m.getUTCDate(),
-        m.getUTCHours()
-    ]);
-}
-function startOfMinute(m) {
-    return arrayToUtcDate([
-        m.getUTCFullYear(),
-        m.getUTCMonth(),
-        m.getUTCDate(),
-        m.getUTCHours(),
-        m.getUTCMinutes()
-    ]);
-}
-function startOfSecond(m) {
-    return arrayToUtcDate([
-        m.getUTCFullYear(),
-        m.getUTCMonth(),
-        m.getUTCDate(),
-        m.getUTCHours(),
-        m.getUTCMinutes(),
-        m.getUTCSeconds()
-    ]);
-}
-// Week Computation
-function weekOfYear(marker, dow, doy) {
-    var y = marker.getUTCFullYear();
-    var w = weekOfGivenYear(marker, y, dow, doy);
-    if (w < 1) {
-        return weekOfGivenYear(marker, y - 1, dow, doy);
-    }
-    var nextW = weekOfGivenYear(marker, y + 1, dow, doy);
-    if (nextW >= 1) {
-        return Math.min(w, nextW);
-    }
-    return w;
-}
-function weekOfGivenYear(marker, year, dow, doy) {
-    var firstWeekStart = arrayToUtcDate([year, 0, 1 + firstWeekOffset(year, dow, doy)]);
-    var dayStart = startOfDay(marker);
-    var days = Math.round(diffDays(firstWeekStart, dayStart));
-    return Math.floor(days / 7) + 1; // zero-indexed
-}
-// start-of-first-week - start-of-year
-function firstWeekOffset(year, dow, doy) {
-    // first-week day -- which january is always in the first week (4 for iso, 1 for other)
-    var fwd = 7 + dow - doy;
-    // first-week day local weekday -- which local weekday is fwd
-    var fwdlw = (7 + arrayToUtcDate([year, 0, fwd]).getUTCDay() - dow) % 7;
-    return -fwdlw + fwd - 1;
-}
-// Array Conversion
-function dateToLocalArray(date) {
-    return [
-        date.getFullYear(),
-        date.getMonth(),
-        date.getDate(),
-        date.getHours(),
-        date.getMinutes(),
-        date.getSeconds(),
-        date.getMilliseconds()
-    ];
-}
-function arrayToLocalDate(a) {
-    return new Date(a[0], a[1] || 0, a[2] == null ? 1 : a[2], // day of month
-    a[3] || 0, a[4] || 0, a[5] || 0);
-}
-function dateToUtcArray(date) {
-    return [
-        date.getUTCFullYear(),
-        date.getUTCMonth(),
-        date.getUTCDate(),
-        date.getUTCHours(),
-        date.getUTCMinutes(),
-        date.getUTCSeconds(),
-        date.getUTCMilliseconds()
-    ];
-}
-function arrayToUtcDate(a) {
-    // according to web standards (and Safari), a month index is required.
-    // massage if only given a year.
-    if (a.length === 1) {
-        a = a.concat([0]);
-    }
-    return new Date(Date.UTC.apply(Date, a));
-}
-// Other Utils
-function isValidDate(m) {
-    return !isNaN(m.valueOf());
-}
-function timeAsMs(m) {
-    return m.getUTCHours() * 1000 * 60 * 60 +
-        m.getUTCMinutes() * 1000 * 60 +
-        m.getUTCSeconds() * 1000 +
-        m.getUTCMilliseconds();
-}
-
-var INTERNAL_UNITS = ['years', 'months', 'days', 'milliseconds'];
-var PARSE_RE = /^(-?)(?:(\d+)\.)?(\d+):(\d\d)(?::(\d\d)(?:\.(\d\d\d))?)?/;
-// Parsing and Creation
-function createDuration(input, unit) {
-    var _a;
-    if (typeof input === 'string') {
-        return parseString(input);
-    }
-    else if (typeof input === 'object' && input) { // non-null object
-        return normalizeObject(input);
-    }
-    else if (typeof input === 'number') {
-        return normalizeObject((_a = {}, _a[unit || 'milliseconds'] = input, _a));
-    }
-    else {
-        return null;
-    }
-}
-function parseString(s) {
-    var m = PARSE_RE.exec(s);
-    if (m) {
-        var sign = m[1] ? -1 : 1;
-        return {
-            years: 0,
-            months: 0,
-            days: sign * (m[2] ? parseInt(m[2], 10) : 0),
-            milliseconds: sign * ((m[3] ? parseInt(m[3], 10) : 0) * 60 * 60 * 1000 + // hours
-                (m[4] ? parseInt(m[4], 10) : 0) * 60 * 1000 + // minutes
-                (m[5] ? parseInt(m[5], 10) : 0) * 1000 + // seconds
-                (m[6] ? parseInt(m[6], 10) : 0) // ms
-            )
-        };
-    }
-    return null;
-}
-function normalizeObject(obj) {
-    return {
-        years: obj.years || obj.year || 0,
-        months: obj.months || obj.month || 0,
-        days: (obj.days || obj.day || 0) +
-            getWeeksFromInput(obj) * 7,
-        milliseconds: (obj.hours || obj.hour || 0) * 60 * 60 * 1000 + // hours
-            (obj.minutes || obj.minute || 0) * 60 * 1000 + // minutes
-            (obj.seconds || obj.second || 0) * 1000 + // seconds
-            (obj.milliseconds || obj.millisecond || obj.ms || 0) // ms
-    };
-}
-function getWeeksFromInput(obj) {
-    return obj.weeks || obj.week || 0;
-}
-// Equality
-function durationsEqual(d0, d1) {
-    return d0.years === d1.years &&
-        d0.months === d1.months &&
-        d0.days === d1.days &&
-        d0.milliseconds === d1.milliseconds;
-}
-function isSingleDay(dur) {
-    return dur.years === 0 && dur.months === 0 && dur.days === 1 && dur.milliseconds === 0;
-}
-// Simple Math
-function addDurations(d0, d1) {
-    return {
-        years: d0.years + d1.years,
-        months: d0.months + d1.months,
-        days: d0.days + d1.days,
-        milliseconds: d0.milliseconds + d1.milliseconds
-    };
-}
-function subtractDurations(d1, d0) {
-    return {
-        years: d1.years - d0.years,
-        months: d1.months - d0.months,
-        days: d1.days - d0.days,
-        milliseconds: d1.milliseconds - d0.milliseconds
-    };
-}
-function multiplyDuration(d, n) {
-    return {
-        years: d.years * n,
-        months: d.months * n,
-        days: d.days * n,
-        milliseconds: d.milliseconds * n
-    };
-}
-// Conversions
-// "Rough" because they are based on average-case Gregorian months/years
-function asRoughYears(dur) {
-    return asRoughDays(dur) / 365;
-}
-function asRoughMonths(dur) {
-    return asRoughDays(dur) / 30;
-}
-function asRoughDays(dur) {
-    return asRoughMs(dur) / 864e5;
-}
-function asRoughMinutes(dur) {
-    return asRoughMs(dur) / (1000 * 60);
-}
-function asRoughSeconds(dur) {
-    return asRoughMs(dur) / 1000;
-}
-function asRoughMs(dur) {
-    return dur.years * (365 * 864e5) +
-        dur.months * (30 * 864e5) +
-        dur.days * 864e5 +
-        dur.milliseconds;
-}
-// Advanced Math
-function wholeDivideDurations(numerator, denominator) {
-    var res = null;
-    for (var i = 0; i < INTERNAL_UNITS.length; i++) {
-        var unit = INTERNAL_UNITS[i];
-        if (denominator[unit]) {
-            var localRes = numerator[unit] / denominator[unit];
-            if (!isInt(localRes) || (res !== null && res !== localRes)) {
-                return null;
-            }
-            res = localRes;
-        }
-        else if (numerator[unit]) {
-            // needs to divide by something but can't!
-            return null;
-        }
-    }
-    return res;
-}
-function greatestDurationDenominator(dur, dontReturnWeeks) {
-    var ms = dur.milliseconds;
-    if (ms) {
-        if (ms % 1000 !== 0) {
-            return { unit: 'millisecond', value: ms };
-        }
-        if (ms % (1000 * 60) !== 0) {
-            return { unit: 'second', value: ms / 1000 };
-        }
-        if (ms % (1000 * 60 * 60) !== 0) {
-            return { unit: 'minute', value: ms / (1000 * 60) };
-        }
-        if (ms) {
-            return { unit: 'hour', value: ms / (1000 * 60 * 60) };
-        }
-    }
-    if (dur.days) {
-        if (!dontReturnWeeks && dur.days % 7 === 0) {
-            return { unit: 'week', value: dur.days / 7 };
-        }
-        return { unit: 'day', value: dur.days };
-    }
-    if (dur.months) {
-        return { unit: 'month', value: dur.months };
-    }
-    if (dur.years) {
-        return { unit: 'year', value: dur.years };
-    }
-    return { unit: 'millisecond', value: 0 };
-}
-
-/* FullCalendar-specific DOM Utilities
-----------------------------------------------------------------------------------------------------------------------*/
-// Given the scrollbar widths of some other container, create borders/margins on rowEls in order to match the left
-// and right space that was offset by the scrollbars. A 1-pixel border first, then margin beyond that.
-function compensateScroll(rowEl, scrollbarWidths) {
-    if (scrollbarWidths.left) {
-        applyStyle(rowEl, {
-            borderLeftWidth: 1,
-            marginLeft: scrollbarWidths.left - 1
-        });
-    }
-    if (scrollbarWidths.right) {
-        applyStyle(rowEl, {
-            borderRightWidth: 1,
-            marginRight: scrollbarWidths.right - 1
-        });
-    }
-}
-// Undoes compensateScroll and restores all borders/margins
-function uncompensateScroll(rowEl) {
-    applyStyle(rowEl, {
-        marginLeft: '',
-        marginRight: '',
-        borderLeftWidth: '',
-        borderRightWidth: ''
-    });
-}
-// Make the mouse cursor express that an event is not allowed in the current area
-function disableCursor() {
-    document.body.classList.add('fc-not-allowed');
-}
-// Returns the mouse cursor to its original look
-function enableCursor() {
-    document.body.classList.remove('fc-not-allowed');
-}
-// Given a total available height to fill, have `els` (essentially child rows) expand to accomodate.
-// By default, all elements that are shorter than the recommended height are expanded uniformly, not considering
-// any other els that are already too tall. if `shouldRedistribute` is on, it considers these tall rows and
-// reduces the available height.
-function distributeHeight(els, availableHeight, shouldRedistribute) {
-    // *FLOORING NOTE*: we floor in certain places because zoom can give inaccurate floating-point dimensions,
-    // and it is better to be shorter than taller, to avoid creating unnecessary scrollbars.
-    var minOffset1 = Math.floor(availableHeight / els.length); // for non-last element
-    var minOffset2 = Math.floor(availableHeight - minOffset1 * (els.length - 1)); // for last element *FLOORING NOTE*
-    var flexEls = []; // elements that are allowed to expand. array of DOM nodes
-    var flexOffsets = []; // amount of vertical space it takes up
-    var flexHeights = []; // actual css height
-    var usedHeight = 0;
-    undistributeHeight(els); // give all elements their natural height
-    // find elements that are below the recommended height (expandable).
-    // important to query for heights in a single first pass (to avoid reflow oscillation).
-    els.forEach(function (el, i) {
-        var minOffset = i === els.length - 1 ? minOffset2 : minOffset1;
-        var naturalHeight = el.getBoundingClientRect().height;
-        var naturalOffset = naturalHeight + computeVMargins(el);
-        if (naturalOffset < minOffset) {
-            flexEls.push(el);
-            flexOffsets.push(naturalOffset);
-            flexHeights.push(naturalHeight);
-        }
-        else {
-            // this element stretches past recommended height (non-expandable). mark the space as occupied.
-            usedHeight += naturalOffset;
-        }
-    });
-    // readjust the recommended height to only consider the height available to non-maxed-out rows.
-    if (shouldRedistribute) {
-        availableHeight -= usedHeight;
-        minOffset1 = Math.floor(availableHeight / flexEls.length);
-        minOffset2 = Math.floor(availableHeight - minOffset1 * (flexEls.length - 1)); // *FLOORING NOTE*
-    }
-    // assign heights to all expandable elements
-    flexEls.forEach(function (el, i) {
-        var minOffset = i === flexEls.length - 1 ? minOffset2 : minOffset1;
-        var naturalOffset = flexOffsets[i];
-        var naturalHeight = flexHeights[i];
-        var newHeight = minOffset - (naturalOffset - naturalHeight); // subtract the margin/padding
-        if (naturalOffset < minOffset) { // we check this again because redistribution might have changed things
-            el.style.height = newHeight + 'px';
-        }
-    });
-}
-// Undoes distrubuteHeight, restoring all els to their natural height
-function undistributeHeight(els) {
-    els.forEach(function (el) {
-        el.style.height = '';
-    });
-}
-// Given `els`, a set of <td> cells, find the cell with the largest natural width and set the widths of all the
-// cells to be that width.
-// PREREQUISITE: if you want a cell to take up width, it needs to have a single inner element w/ display:inline
-function matchCellWidths(els) {
-    var maxInnerWidth = 0;
-    els.forEach(function (el) {
-        var innerEl = el.firstChild; // hopefully an element
-        if (innerEl instanceof HTMLElement) {
-            var innerWidth_1 = innerEl.getBoundingClientRect().width;
-            if (innerWidth_1 > maxInnerWidth) {
-                maxInnerWidth = innerWidth_1;
-            }
-        }
-    });
-    maxInnerWidth++; // sometimes not accurate of width the text needs to stay on one line. insurance
-    els.forEach(function (el) {
-        el.style.width = maxInnerWidth + 'px';
-    });
-    return maxInnerWidth;
-}
-// Given one element that resides inside another,
-// Subtracts the height of the inner element from the outer element.
-function subtractInnerElHeight(outerEl, innerEl) {
-    // effin' IE8/9/10/11 sometimes returns 0 for dimensions. this weird hack was the only thing that worked
-    var reflowStyleProps = {
-        position: 'relative',
-        left: -1 // ensure reflow in case the el was already relative. negative is less likely to cause new scroll
-    };
-    applyStyle(outerEl, reflowStyleProps);
-    applyStyle(innerEl, reflowStyleProps);
-    var diff = // grab the dimensions
-     outerEl.getBoundingClientRect().height -
-        innerEl.getBoundingClientRect().height;
-    // undo hack
-    var resetStyleProps = { position: '', left: '' };
-    applyStyle(outerEl, resetStyleProps);
-    applyStyle(innerEl, resetStyleProps);
-    return diff;
-}
-/* Selection
-----------------------------------------------------------------------------------------------------------------------*/
-function preventSelection(el) {
-    el.classList.add('fc-unselectable');
-    el.addEventListener('selectstart', preventDefault);
-}
-function allowSelection(el) {
-    el.classList.remove('fc-unselectable');
-    el.removeEventListener('selectstart', preventDefault);
-}
-/* Context Menu
-----------------------------------------------------------------------------------------------------------------------*/
-function preventContextMenu(el) {
-    el.addEventListener('contextmenu', preventDefault);
-}
-function allowContextMenu(el) {
-    el.removeEventListener('contextmenu', preventDefault);
-}
-/* Object Ordering by Field
-----------------------------------------------------------------------------------------------------------------------*/
-function parseFieldSpecs(input) {
-    var specs = [];
-    var tokens = [];
-    var i;
-    var token;
-    if (typeof input === 'string') {
-        tokens = input.split(/\s*,\s*/);
-    }
-    else if (typeof input === 'function') {
-        tokens = [input];
-    }
-    else if (Array.isArray(input)) {
-        tokens = input;
-    }
-    for (i = 0; i < tokens.length; i++) {
-        token = tokens[i];
-        if (typeof token === 'string') {
-            specs.push(token.charAt(0) === '-' ?
-                { field: token.substring(1), order: -1 } :
-                { field: token, order: 1 });
-        }
-        else if (typeof token === 'function') {
-            specs.push({ func: token });
-        }
-    }
-    return specs;
-}
-function compareByFieldSpecs(obj0, obj1, fieldSpecs) {
-    var i;
-    var cmp;
-    for (i = 0; i < fieldSpecs.length; i++) {
-        cmp = compareByFieldSpec(obj0, obj1, fieldSpecs[i]);
-        if (cmp) {
-            return cmp;
-        }
-    }
-    return 0;
-}
-function compareByFieldSpec(obj0, obj1, fieldSpec) {
-    if (fieldSpec.func) {
-        return fieldSpec.func(obj0, obj1);
-    }
-    return flexibleCompare(obj0[fieldSpec.field], obj1[fieldSpec.field])
-        * (fieldSpec.order || 1);
-}
-function flexibleCompare(a, b) {
-    if (!a && !b) {
-        return 0;
-    }
-    if (b == null) {
-        return -1;
-    }
-    if (a == null) {
-        return 1;
-    }
-    if (typeof a === 'string' || typeof b === 'string') {
-        return String(a).localeCompare(String(b));
-    }
-    return a - b;
-}
-/* String Utilities
-----------------------------------------------------------------------------------------------------------------------*/
-function capitaliseFirstLetter(str) {
-    return str.charAt(0).toUpperCase() + str.slice(1);
-}
-function padStart(val, len) {
-    var s = String(val);
-    return '000'.substr(0, len - s.length) + s;
-}
-/* Number Utilities
-----------------------------------------------------------------------------------------------------------------------*/
-function compareNumbers(a, b) {
-    return a - b;
-}
-function isInt(n) {
-    return n % 1 === 0;
-}
-/* Weird Utilities
-----------------------------------------------------------------------------------------------------------------------*/
-function applyAll(functions, thisObj, args) {
-    if (typeof functions === 'function') { // supplied a single function
-        functions = [functions];
-    }
-    if (functions) {
-        var i = void 0;
-        var ret = void 0;
-        for (i = 0; i < functions.length; i++) {
-            ret = functions[i].apply(thisObj, args) || ret;
-        }
-        return ret;
-    }
-}
-function firstDefined() {
-    var args = [];
-    for (var _i = 0; _i < arguments.length; _i++) {
-        args[_i] = arguments[_i];
-    }
-    for (var i = 0; i < args.length; i++) {
-        if (args[i] !== undefined) {
-            return args[i];
-        }
-    }
-}
-// Returns a function, that, as long as it continues to be invoked, will not
-// be triggered. The function will be called after it stops being called for
-// N milliseconds. If `immediate` is passed, trigger the function on the
-// leading edge, instead of the trailing.
-// https://github.com/jashkenas/underscore/blob/1.6.0/underscore.js#L714
-function debounce(func, wait) {
-    var timeout;
-    var args;
-    var context;
-    var timestamp;
-    var result;
-    var later = function () {
-        var last = new Date().valueOf() - timestamp;
-        if (last < wait) {
-            timeout = setTimeout(later, wait - last);
-        }
-        else {
-            timeout = null;
-            result = func.apply(context, args);
-            context = args = null;
-        }
-    };
-    return function () {
-        context = this;
-        args = arguments;
-        timestamp = new Date().valueOf();
-        if (!timeout) {
-            timeout = setTimeout(later, wait);
-        }
-        return result;
-    };
-}
-// Number and Boolean are only types that defaults or not computed for
-// TODO: write more comments
-function refineProps(rawProps, processors, defaults, leftoverProps) {
-    if (defaults === void 0) { defaults = {}; }
-    var refined = {};
-    for (var key in processors) {
-        var processor = processors[key];
-        if (rawProps[key] !== undefined) {
-            // found
-            if (processor === Function) {
-                refined[key] = typeof rawProps[key] === 'function' ? rawProps[key] : null;
-            }
-            else if (processor) { // a refining function?
-                refined[key] = processor(rawProps[key]);
-            }
-            else {
-                refined[key] = rawProps[key];
-            }
-        }
-        else if (defaults[key] !== undefined) {
-            // there's an explicit default
-            refined[key] = defaults[key];
-        }
-        else {
-            // must compute a default
-            if (processor === String) {
-                refined[key] = ''; // empty string is default for String
-            }
-            else if (!processor || processor === Number || processor === Boolean || processor === Function) {
-                refined[key] = null; // assign null for other non-custom processor funcs
-            }
-            else {
-                refined[key] = processor(null); // run the custom processor func
-            }
-        }
-    }
-    if (leftoverProps) {
-        for (var key in rawProps) {
-            if (processors[key] === undefined) {
-                leftoverProps[key] = rawProps[key];
-            }
-        }
-    }
-    return refined;
-}
-/* Date stuff that doesn't belong in datelib core
-----------------------------------------------------------------------------------------------------------------------*/
-// given a timed range, computes an all-day range that has the same exact duration,
-// but whose start time is aligned with the start of the day.
-function computeAlignedDayRange(timedRange) {
-    var dayCnt = Math.floor(diffDays(timedRange.start, timedRange.end)) || 1;
-    var start = startOfDay(timedRange.start);
-    var end = addDays(start, dayCnt);
-    return { start: start, end: end };
-}
-// given a timed range, computes an all-day range based on how for the end date bleeds into the next day
-// TODO: give nextDayThreshold a default arg
-function computeVisibleDayRange(timedRange, nextDayThreshold) {
-    if (nextDayThreshold === void 0) { nextDayThreshold = createDuration(0); }
-    var startDay = null;
-    var endDay = null;
-    if (timedRange.end) {
-        endDay = startOfDay(timedRange.end);
-        var endTimeMS = timedRange.end.valueOf() - endDay.valueOf(); // # of milliseconds into `endDay`
-        // If the end time is actually inclusively part of the next day and is equal to or
-        // beyond the next day threshold, adjust the end to be the exclusive end of `endDay`.
-        // Otherwise, leaving it as inclusive will cause it to exclude `endDay`.
-        if (endTimeMS && endTimeMS >= asRoughMs(nextDayThreshold)) {
-            endDay = addDays(endDay, 1);
-        }
-    }
-    if (timedRange.start) {
-        startDay = startOfDay(timedRange.start); // the beginning of the day the range starts
-        // If end is within `startDay` but not past nextDayThreshold, assign the default duration of one day.
-        if (endDay && endDay <= startDay) {
-            endDay = addDays(startDay, 1);
-        }
-    }
-    return { start: startDay, end: endDay };
-}
-// spans from one day into another?
-function isMultiDayRange(range) {
-    var visibleRange = computeVisibleDayRange(range);
-    return diffDays(visibleRange.start, visibleRange.end) > 1;
-}
-function diffDates(date0, date1, dateEnv, largeUnit) {
-    if (largeUnit === 'year') {
-        return createDuration(dateEnv.diffWholeYears(date0, date1), 'year');
-    }
-    else if (largeUnit === 'month') {
-        return createDuration(dateEnv.diffWholeMonths(date0, date1), 'month');
-    }
-    else {
-        return diffDayAndTime(date0, date1); // returns a duration
-    }
-}
-
-/*! *****************************************************************************
-Copyright (c) Microsoft Corporation. All rights reserved.
-Licensed under the Apache License, Version 2.0 (the "License"); you may not use
-this file except in compliance with the License. You may obtain a copy of the
-License at http://www.apache.org/licenses/LICENSE-2.0
-
-THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
-WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
-MERCHANTABLITY OR NON-INFRINGEMENT.
-
-See the Apache Version 2.0 License for specific language governing permissions
-and limitations under the License.
-***************************************************************************** */
-/* global Reflect, Promise */
-
-var extendStatics = function(d, b) {
-    extendStatics = Object.setPrototypeOf ||
-        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-    return extendStatics(d, b);
-};
-
-function __extends(d, b) {
-    extendStatics(d, b);
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-}
-
-var __assign = function() {
-    __assign = Object.assign || function __assign(t) {
-        for (var s, i = 1, n = arguments.length; i < n; i++) {
-            s = arguments[i];
-            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
-        }
-        return t;
-    };
-    return __assign.apply(this, arguments);
-};
-
-function parseRecurring(eventInput, allDayDefault, dateEnv, recurringTypes, leftovers) {
-    for (var i = 0; i < recurringTypes.length; i++) {
-        var localLeftovers = {};
-        var parsed = recurringTypes[i].parse(eventInput, localLeftovers, dateEnv);
-        if (parsed) {
-            var allDay = localLeftovers.allDay;
-            delete localLeftovers.allDay; // remove from leftovers
-            if (allDay == null) {
-                allDay = allDayDefault;
-                if (allDay == null) {
-                    allDay = parsed.allDayGuess;
-                    if (allDay == null) {
-                        allDay = false;
-                    }
-                }
-            }
-            __assign(leftovers, localLeftovers);
-            return {
-                allDay: allDay,
-                duration: parsed.duration,
-                typeData: parsed.typeData,
-                typeId: i
-            };
-        }
-    }
-    return null;
-}
-/*
-Event MUST have a recurringDef
-*/
-function expandRecurringRanges(eventDef, duration, framingRange, dateEnv, recurringTypes) {
-    var typeDef = recurringTypes[eventDef.recurringDef.typeId];
-    var markers = typeDef.expand(eventDef.recurringDef.typeData, {
-        start: dateEnv.subtract(framingRange.start, duration),
-        end: framingRange.end
-    }, dateEnv);
-    // the recurrence plugins don't guarantee that all-day events are start-of-day, so we have to
-    if (eventDef.allDay) {
-        markers = markers.map(startOfDay);
-    }
-    return markers;
-}
-
-var hasOwnProperty = Object.prototype.hasOwnProperty;
-// Merges an array of objects into a single object.
-// The second argument allows for an array of property names who's object values will be merged together.
-function mergeProps(propObjs, complexProps) {
-    var dest = {};
-    var i;
-    var name;
-    var complexObjs;
-    var j;
-    var val;
-    var props;
-    if (complexProps) {
-        for (i = 0; i < complexProps.length; i++) {
-            name = complexProps[i];
-            complexObjs = [];
-            // collect the trailing object values, stopping when a non-object is discovered
-            for (j = propObjs.length - 1; j >= 0; j--) {
-                val = propObjs[j][name];
-                if (typeof val === 'object' && val) { // non-null object
-                    complexObjs.unshift(val);
-                }
-                else if (val !== undefined) {
-                    dest[name] = val; // if there were no objects, this value will be used
-                    break;
-                }
-            }
-            // if the trailing values were objects, use the merged value
-            if (complexObjs.length) {
-                dest[name] = mergeProps(complexObjs);
-            }
-        }
-    }
-    // copy values into the destination, going from last to first
-    for (i = propObjs.length - 1; i >= 0; i--) {
-        props = propObjs[i];
-        for (name in props) {
-            if (!(name in dest)) { // if already assigned by previous props or complex props, don't reassign
-                dest[name] = props[name];
-            }
-        }
-    }
-    return dest;
-}
-function filterHash(hash, func) {
-    var filtered = {};
-    for (var key in hash) {
-        if (func(hash[key], key)) {
-            filtered[key] = hash[key];
-        }
-    }
-    return filtered;
-}
-function mapHash(hash, func) {
-    var newHash = {};
-    for (var key in hash) {
-        newHash[key] = func(hash[key], key);
-    }
-    return newHash;
-}
-function arrayToHash(a) {
-    var hash = {};
-    for (var _i = 0, a_1 = a; _i < a_1.length; _i++) {
-        var item = a_1[_i];
-        hash[item] = true;
-    }
-    return hash;
-}
-function hashValuesToArray(obj) {
-    var a = [];
-    for (var key in obj) {
-        a.push(obj[key]);
-    }
-    return a;
-}
-function isPropsEqual(obj0, obj1) {
-    for (var key in obj0) {
-        if (hasOwnProperty.call(obj0, key)) {
-            if (!(key in obj1)) {
-                return false;
-            }
-        }
-    }
-    for (var key in obj1) {
-        if (hasOwnProperty.call(obj1, key)) {
-            if (obj0[key] !== obj1[key]) {
-                return false;
-            }
-        }
-    }
-    return true;
-}
-
-function parseEvents(rawEvents, sourceId, calendar, allowOpenRange) {
-    var eventStore = createEmptyEventStore();
-    for (var _i = 0, rawEvents_1 = rawEvents; _i < rawEvents_1.length; _i++) {
-        var rawEvent = rawEvents_1[_i];
-        var tuple = parseEvent(rawEvent, sourceId, calendar, allowOpenRange);
-        if (tuple) {
-            eventTupleToStore(tuple, eventStore);
-        }
-    }
-    return eventStore;
-}
-function eventTupleToStore(tuple, eventStore) {
-    if (eventStore === void 0) { eventStore = createEmptyEventStore(); }
-    eventStore.defs[tuple.def.defId] = tuple.def;
-    if (tuple.instance) {
-        eventStore.instances[tuple.instance.instanceId] = tuple.instance;
-    }
-    return eventStore;
-}
-function expandRecurring(eventStore, framingRange, calendar) {
-    var dateEnv = calendar.dateEnv;
-    var defs = eventStore.defs, instances = eventStore.instances;
-    // remove existing recurring instances
-    instances = filterHash(instances, function (instance) {
-        return !defs[instance.defId].recurringDef;
-    });
-    for (var defId in defs) {
-        var def = defs[defId];
-        if (def.recurringDef) {
-            var duration = def.recurringDef.duration;
-            if (!duration) {
-                duration = def.allDay ?
-                    calendar.defaultAllDayEventDuration :
-                    calendar.defaultTimedEventDuration;
-            }
-            var starts = expandRecurringRanges(def, duration, framingRange, calendar.dateEnv, calendar.pluginSystem.hooks.recurringTypes);
-            for (var _i = 0, starts_1 = starts; _i < starts_1.length; _i++) {
-                var start = starts_1[_i];
-                var instance = createEventInstance(defId, {
-                    start: start,
-                    end: dateEnv.add(start, duration)
-                });
-                instances[instance.instanceId] = instance;
-            }
-        }
-    }
-    return { defs: defs, instances: instances };
-}
-// retrieves events that have the same groupId as the instance specified by `instanceId`
-// or they are the same as the instance.
-// why might instanceId not be in the store? an event from another calendar?
-function getRelevantEvents(eventStore, instanceId) {
-    var instance = eventStore.instances[instanceId];
-    if (instance) {
-        var def_1 = eventStore.defs[instance.defId];
-        // get events/instances with same group
-        var newStore = filterEventStoreDefs(eventStore, function (lookDef) {
-            return isEventDefsGrouped(def_1, lookDef);
-        });
-        // add the original
-        // TODO: wish we could use eventTupleToStore or something like it
-        newStore.defs[def_1.defId] = def_1;
-        newStore.instances[instance.instanceId] = instance;
-        return newStore;
-    }
-    return createEmptyEventStore();
-}
-function isEventDefsGrouped(def0, def1) {
-    return Boolean(def0.groupId && def0.groupId === def1.groupId);
-}
-function transformRawEvents(rawEvents, eventSource, calendar) {
-    var calEachTransform = calendar.opt('eventDataTransform');
-    var sourceEachTransform = eventSource ? eventSource.eventDataTransform : null;
-    if (sourceEachTransform) {
-        rawEvents = transformEachRawEvent(rawEvents, sourceEachTransform);
-    }
-    if (calEachTransform) {
-        rawEvents = transformEachRawEvent(rawEvents, calEachTransform);
-    }
-    return rawEvents;
-}
-function transformEachRawEvent(rawEvents, func) {
-    var refinedEvents;
-    if (!func) {
-        refinedEvents = rawEvents;
-    }
-    else {
-        refinedEvents = [];
-        for (var _i = 0, rawEvents_2 = rawEvents; _i < rawEvents_2.length; _i++) {
-            var rawEvent = rawEvents_2[_i];
-            var refinedEvent = func(rawEvent);
-            if (refinedEvent) {
-                refinedEvents.push(refinedEvent);
-            }
-            else if (refinedEvent == null) {
-                refinedEvents.push(rawEvent);
-            } // if a different falsy value, do nothing
-        }
-    }
-    return refinedEvents;
-}
-function createEmptyEventStore() {
-    return { defs: {}, instances: {} };
-}
-function mergeEventStores(store0, store1) {
-    return {
-        defs: __assign({}, store0.defs, store1.defs),
-        instances: __assign({}, store0.instances, store1.instances)
-    };
-}
-function filterEventStoreDefs(eventStore, filterFunc) {
-    var defs = filterHash(eventStore.defs, filterFunc);
-    var instances = filterHash(eventStore.instances, function (instance) {
-        return defs[instance.defId]; // still exists?
-    });
-    return { defs: defs, instances: instances };
-}
-
-function parseRange(input, dateEnv) {
-    var start = null;
-    var end = null;
-    if (input.start) {
-        start = dateEnv.createMarker(input.start);
-    }
-    if (input.end) {
-        end = dateEnv.createMarker(input.end);
-    }
-    if (!start && !end) {
-        return null;
-    }
-    if (start && end && end < start) {
-        return null;
-    }
-    return { start: start, end: end };
-}
-// SIDE-EFFECT: will mutate ranges.
-// Will return a new array result.
-function invertRanges(ranges, constraintRange) {
-    var invertedRanges = [];
-    var start = constraintRange.start; // the end of the previous range. the start of the new range
-    var i;
-    var dateRange;
-    // ranges need to be in order. required for our date-walking algorithm
-    ranges.sort(compareRanges);
-    for (i = 0; i < ranges.length; i++) {
-        dateRange = ranges[i];
-        // add the span of time before the event (if there is any)
-        if (dateRange.start > start) { // compare millisecond time (skip any ambig logic)
-            invertedRanges.push({ start: start, end: dateRange.start });
-        }
-        if (dateRange.end > start) {
-            start = dateRange.end;
-        }
-    }
-    // add the span of time after the last event (if there is any)
-    if (start < constraintRange.end) { // compare millisecond time (skip any ambig logic)
-        invertedRanges.push({ start: start, end: constraintRange.end });
-    }
-    return invertedRanges;
-}
-function compareRanges(range0, range1) {
-    return range0.start.valueOf() - range1.start.valueOf(); // earlier ranges go first
-}
-function intersectRanges(range0, range1) {
-    var start = range0.start;
-    var end = range0.end;
-    var newRange = null;
-    if (range1.start !== null) {
-        if (start === null) {
-            start = range1.start;
-        }
-        else {
-            start = new Date(Math.max(start.valueOf(), range1.start.valueOf()));
-        }
-    }
-    if (range1.end != null) {
-        if (end === null) {
-            end = range1.end;
-        }
-        else {
-            end = new Date(Math.min(end.valueOf(), range1.end.valueOf()));
-        }
-    }
-    if (start === null || end === null || start < end) {
-        newRange = { start: start, end: end };
-    }
-    return newRange;
-}
-function rangesEqual(range0, range1) {
-    return (range0.start === null ? null : range0.start.valueOf()) === (range1.start === null ? null : range1.start.valueOf()) &&
-        (range0.end === null ? null : range0.end.valueOf()) === (range1.end === null ? null : range1.end.valueOf());
-}
-function rangesIntersect(range0, range1) {
-    return (range0.end === null || range1.start === null || range0.end > range1.start) &&
-        (range0.start === null || range1.end === null || range0.start < range1.end);
-}
-function rangeContainsRange(outerRange, innerRange) {
-    return (outerRange.start === null || (innerRange.start !== null && innerRange.start >= outerRange.start)) &&
-        (outerRange.end === null || (innerRange.end !== null && innerRange.end <= outerRange.end));
-}
-function rangeContainsMarker(range, date) {
-    return (range.start === null || date >= range.start) &&
-        (range.end === null || date < range.end);
-}
-// If the given date is not within the given range, move it inside.
-// (If it's past the end, make it one millisecond before the end).
-function constrainMarkerToRange(date, range) {
-    if (range.start != null && date < range.start) {
-        return range.start;
-    }
-    if (range.end != null && date >= range.end) {
-        return new Date(range.end.valueOf() - 1);
-    }
-    return date;
-}
-
-function removeExact(array, exactVal) {
-    var removeCnt = 0;
-    var i = 0;
-    while (i < array.length) {
-        if (array[i] === exactVal) {
-            array.splice(i, 1);
-            removeCnt++;
-        }
-        else {
-            i++;
-        }
-    }
-    return removeCnt;
-}
-function isArraysEqual(a0, a1) {
-    var len = a0.length;
-    var i;
-    if (len !== a1.length) { // not array? or not same length?
-        return false;
-    }
-    for (i = 0; i < len; i++) {
-        if (a0[i] !== a1[i]) {
-            return false;
-        }
-    }
-    return true;
-}
-
-function memoize(workerFunc) {
-    var args;
-    var res;
-    return function () {
-        if (!args || !isArraysEqual(args, arguments)) {
-            args = arguments;
-            res = workerFunc.apply(this, arguments);
-        }
-        return res;
-    };
-}
-/*
-always executes the workerFunc, but if the result is equal to the previous result,
-return the previous result instead.
-*/
-function memoizeOutput(workerFunc, equalityFunc) {
-    var cachedRes = null;
-    return function () {
-        var newRes = workerFunc.apply(this, arguments);
-        if (cachedRes === null || !(cachedRes === newRes || equalityFunc(cachedRes, newRes))) {
-            cachedRes = newRes;
-        }
-        return cachedRes;
-    };
-}
-
-var EXTENDED_SETTINGS_AND_SEVERITIES = {
-    week: 3,
-    separator: 0,
-    omitZeroMinute: 0,
-    meridiem: 0,
-    omitCommas: 0
-};
-var STANDARD_DATE_PROP_SEVERITIES = {
-    timeZoneName: 7,
-    era: 6,
-    year: 5,
-    month: 4,
-    day: 2,
-    weekday: 2,
-    hour: 1,
-    minute: 1,
-    second: 1
-};
-var MERIDIEM_RE = /\s*([ap])\.?m\.?/i; // eats up leading spaces too
-var COMMA_RE = /,/g; // we need re for globalness
-var MULTI_SPACE_RE = /\s+/g;
-var LTR_RE = /\u200e/g; // control character
-var UTC_RE = /UTC|GMT/;
-var NativeFormatter = /** @class */ (function () {
-    function NativeFormatter(formatSettings) {
-        var standardDateProps = {};
-        var extendedSettings = {};
-        var severity = 0;
-        for (var name_1 in formatSettings) {
-            if (name_1 in EXTENDED_SETTINGS_AND_SEVERITIES) {
-                extendedSettings[name_1] = formatSettings[name_1];
-                severity = Math.max(EXTENDED_SETTINGS_AND_SEVERITIES[name_1], severity);
-            }
-            else {
-                standardDateProps[name_1] = formatSettings[name_1];
-                if (name_1 in STANDARD_DATE_PROP_SEVERITIES) {
-                    severity = Math.max(STANDARD_DATE_PROP_SEVERITIES[name_1], severity);
-                }
-            }
-        }
-        this.standardDateProps = standardDateProps;
-        this.extendedSettings = extendedSettings;
-        this.severity = severity;
-        this.buildFormattingFunc = memoize(buildFormattingFunc);
-    }
-    NativeFormatter.prototype.format = function (date, context) {
-        return this.buildFormattingFunc(this.standardDateProps, this.extendedSettings, context)(date);
-    };
-    NativeFormatter.prototype.formatRange = function (start, end, context) {
-        var _a = this, standardDateProps = _a.standardDateProps, extendedSettings = _a.extendedSettings;
-        var diffSeverity = computeMarkerDiffSeverity(start.marker, end.marker, context.calendarSystem);
-        if (!diffSeverity) {
-            return this.format(start, context);
-        }
-        var biggestUnitForPartial = diffSeverity;
-        if (biggestUnitForPartial > 1 && // the two dates are different in a way that's larger scale than time
-            (standardDateProps.year === 'numeric' || standardDateProps.year === '2-digit') &&
-            (standardDateProps.month === 'numeric' || standardDateProps.month === '2-digit') &&
-            (standardDateProps.day === 'numeric' || standardDateProps.day === '2-digit')) {
-            biggestUnitForPartial = 1; // make it look like the dates are only different in terms of time
-        }
-        var full0 = this.format(start, context);
-        var full1 = this.format(end, context);
-        if (full0 === full1) {
-            return full0;
-        }
-        var partialDateProps = computePartialFormattingOptions(standardDateProps, biggestUnitForPartial);
-        var partialFormattingFunc = buildFormattingFunc(partialDateProps, extendedSettings, context);
-        var partial0 = partialFormattingFunc(start);
-        var partial1 = partialFormattingFunc(end);
-        var insertion = findCommonInsertion(full0, partial0, full1, partial1);
-        var separator = extendedSettings.separator || '';
-        if (insertion) {
-            return insertion.before + partial0 + separator + partial1 + insertion.after;
-        }
-        return full0 + separator + full1;
-    };
-    NativeFormatter.prototype.getLargestUnit = function () {
-        switch (this.severity) {
-            case 7:
-            case 6:
-            case 5:
-                return 'year';
-            case 4:
-                return 'month';
-            case 3:
-                return 'week';
-            default:
-                return 'day';
-        }
-    };
-    return NativeFormatter;
-}());
-function buildFormattingFunc(standardDateProps, extendedSettings, context) {
-    var standardDatePropCnt = Object.keys(standardDateProps).length;
-    if (standardDatePropCnt === 1 && standardDateProps.timeZoneName === 'short') {
-        return function (date) {
-            return formatTimeZoneOffset(date.timeZoneOffset);
-        };
-    }
-    if (standardDatePropCnt === 0 && extendedSettings.week) {
-        return function (date) {
-            return formatWeekNumber(context.computeWeekNumber(date.marker), context.weekLabel, context.locale, extendedSettings.week);
-        };
-    }
-    return buildNativeFormattingFunc(standardDateProps, extendedSettings, context);
-}
-function buildNativeFormattingFunc(standardDateProps, extendedSettings, context) {
-    standardDateProps = __assign({}, standardDateProps); // copy
-    extendedSettings = __assign({}, extendedSettings); // copy
-    sanitizeSettings(standardDateProps, extendedSettings);
-    standardDateProps.timeZone = 'UTC'; // we leverage the only guaranteed timeZone for our UTC markers
-    var normalFormat = new Intl.DateTimeFormat(context.locale.codes, standardDateProps);
-    var zeroFormat; // needed?
-    if (extendedSettings.omitZeroMinute) {
-        var zeroProps = __assign({}, standardDateProps);
-        delete zeroProps.minute; // seconds and ms were already considered in sanitizeSettings
-        zeroFormat = new Intl.DateTimeFormat(context.locale.codes, zeroProps);
-    }
-    return function (date) {
-        var marker = date.marker;
-        var format;
-        if (zeroFormat && !marker.getUTCMinutes()) {
-            format = zeroFormat;
-        }
-        else {
-            format = normalFormat;
-        }
-        var s = format.format(marker);
-        return postProcess(s, date, standardDateProps, extendedSettings, context);
-    };
-}
-function sanitizeSettings(standardDateProps, extendedSettings) {
-    // deal with a browser inconsistency where formatting the timezone
-    // requires that the hour/minute be present.
-    if (standardDateProps.timeZoneName) {
-        if (!standardDateProps.hour) {
-            standardDateProps.hour = '2-digit';
-        }
-        if (!standardDateProps.minute) {
-            standardDateProps.minute = '2-digit';
-        }
-    }
-    // only support short timezone names
-    if (standardDateProps.timeZoneName === 'long') {
-        standardDateProps.timeZoneName = 'short';
-    }
-    // if requesting to display seconds, MUST display minutes
-    if (extendedSettings.omitZeroMinute && (standardDateProps.second || standardDateProps.millisecond)) {
-        delete extendedSettings.omitZeroMinute;
-    }
-}
-function postProcess(s, date, standardDateProps, extendedSettings, context) {
-    s = s.replace(LTR_RE, ''); // remove left-to-right control chars. do first. good for other regexes
-    if (standardDateProps.timeZoneName === 'short') {
-        s = injectTzoStr(s, (context.timeZone === 'UTC' || date.timeZoneOffset == null) ?
-            'UTC' : // important to normalize for IE, which does "GMT"
-            formatTimeZoneOffset(date.timeZoneOffset));
-    }
-    if (extendedSettings.omitCommas) {
-        s = s.replace(COMMA_RE, '').trim();
-    }
-    if (extendedSettings.omitZeroMinute) {
-        s = s.replace(':00', ''); // zeroFormat doesn't always achieve this
-    }
-    // ^ do anything that might create adjacent spaces before this point,
-    // because MERIDIEM_RE likes to eat up loading spaces
-    if (extendedSettings.meridiem === false) {
-        s = s.replace(MERIDIEM_RE, '').trim();
-    }
-    else if (extendedSettings.meridiem === 'narrow') { // a/p
-        s = s.replace(MERIDIEM_RE, function (m0, m1) {
-            return m1.toLocaleLowerCase();
-        });
-    }
-    else if (extendedSettings.meridiem === 'short') { // am/pm
-        s = s.replace(MERIDIEM_RE, function (m0, m1) {
-            return m1.toLocaleLowerCase() + 'm';
-        });
-    }
-    else if (extendedSettings.meridiem === 'lowercase') { // other meridiem transformers already converted to lowercase
-        s = s.replace(MERIDIEM_RE, function (m0) {
-            return m0.toLocaleLowerCase();
-        });
-    }
-    s = s.replace(MULTI_SPACE_RE, ' ');
-    s = s.trim();
-    return s;
-}
-function injectTzoStr(s, tzoStr) {
-    var replaced = false;
-    s = s.replace(UTC_RE, function () {
-        replaced = true;
-        return tzoStr;
-    });
-    // IE11 doesn't include UTC/GMT in the original string, so append to end
-    if (!replaced) {
-        s += ' ' + tzoStr;
-    }
-    return s;
-}
-function formatWeekNumber(num, weekLabel, locale, display) {
-    var parts = [];
-    if (display === 'narrow') {
-        parts.push(weekLabel);
-    }
-    else if (display === 'short') {
-        parts.push(weekLabel, ' ');
-    }
-    // otherwise, considered 'numeric'
-    parts.push(locale.simpleNumberFormat.format(num));
-    if (locale.options.isRtl) { // TODO: use control characters instead?
-        parts.reverse();
-    }
-    return parts.join('');
-}
-// Range Formatting Utils
-// 0 = exactly the same
-// 1 = different by time
-// and bigger
-function computeMarkerDiffSeverity(d0, d1, ca) {
-    if (ca.getMarkerYear(d0) !== ca.getMarkerYear(d1)) {
-        return 5;
-    }
-    if (ca.getMarkerMonth(d0) !== ca.getMarkerMonth(d1)) {
-        return 4;
-    }
-    if (ca.getMarkerDay(d0) !== ca.getMarkerDay(d1)) {
-        return 2;
-    }
-    if (timeAsMs(d0) !== timeAsMs(d1)) {
-        return 1;
-    }
-    return 0;
-}
-function computePartialFormattingOptions(options, biggestUnit) {
-    var partialOptions = {};
-    for (var name_2 in options) {
-        if (!(name_2 in STANDARD_DATE_PROP_SEVERITIES) || // not a date part prop (like timeZone)
-            STANDARD_DATE_PROP_SEVERITIES[name_2] <= biggestUnit) {
-            partialOptions[name_2] = options[name_2];
-        }
-    }
-    return partialOptions;
-}
-function findCommonInsertion(full0, partial0, full1, partial1) {
-    var i0 = 0;
-    while (i0 < full0.length) {
-        var found0 = full0.indexOf(partial0, i0);
-        if (found0 === -1) {
-            break;
-        }
-        var before0 = full0.substr(0, found0);
-        i0 = found0 + partial0.length;
-        var after0 = full0.substr(i0);
-        var i1 = 0;
-        while (i1 < full1.length) {
-            var found1 = full1.indexOf(partial1, i1);
-            if (found1 === -1) {
-                break;
-            }
-            var before1 = full1.substr(0, found1);
-            i1 = found1 + partial1.length;
-            var after1 = full1.substr(i1);
-            if (before0 === before1 && after0 === after1) {
-                return {
-                    before: before0,
-                    after: after0
-                };
-            }
-        }
-    }
-    return null;
-}
-
-/*
-TODO: fix the terminology of "formatter" vs "formatting func"
-*/
-/*
-At the time of instantiation, this object does not know which cmd-formatting system it will use.
-It receives this at the time of formatting, as a setting.
-*/
-var CmdFormatter = /** @class */ (function () {
-    function CmdFormatter(cmdStr, separator) {
-        this.cmdStr = cmdStr;
-        this.separator = separator;
-    }
-    CmdFormatter.prototype.format = function (date, context) {
-        return context.cmdFormatter(this.cmdStr, createVerboseFormattingArg(date, null, context, this.separator));
-    };
-    CmdFormatter.prototype.formatRange = function (start, end, context) {
-        return context.cmdFormatter(this.cmdStr, createVerboseFormattingArg(start, end, context, this.separator));
-    };
-    return CmdFormatter;
-}());
-
-var FuncFormatter = /** @class */ (function () {
-    function FuncFormatter(func) {
-        this.func = func;
-    }
-    FuncFormatter.prototype.format = function (date, context) {
-        return this.func(createVerboseFormattingArg(date, null, context));
-    };
-    FuncFormatter.prototype.formatRange = function (start, end, context) {
-        return this.func(createVerboseFormattingArg(start, end, context));
-    };
-    return FuncFormatter;
-}());
-
-// Formatter Object Creation
-function createFormatter(input, defaultSeparator) {
-    if (typeof input === 'object' && input) { // non-null object
-        if (typeof defaultSeparator === 'string') {
-            input = __assign({ separator: defaultSeparator }, input);
-        }
-        return new NativeFormatter(input);
-    }
-    else if (typeof input === 'string') {
-        return new CmdFormatter(input, defaultSeparator);
-    }
-    else if (typeof input === 'function') {
-        return new FuncFormatter(input);
-    }
-}
-// String Utils
-// timeZoneOffset is in minutes
-function buildIsoString(marker, timeZoneOffset, stripZeroTime) {
-    if (stripZeroTime === void 0) { stripZeroTime = false; }
-    var s = marker.toISOString();
-    s = s.replace('.000', '');
-    if (stripZeroTime) {
-        s = s.replace('T00:00:00Z', '');
-    }
-    if (s.length > 10) { // time part wasn't stripped, can add timezone info
-        if (timeZoneOffset == null) {
-            s = s.replace('Z', '');
-        }
-        else if (timeZoneOffset !== 0) {
-            s = s.replace('Z', formatTimeZoneOffset(timeZoneOffset, true));
-        }
-        // otherwise, its UTC-0 and we want to keep the Z
-    }
-    return s;
-}
-function formatIsoTimeString(marker) {
-    return padStart(marker.getUTCHours(), 2) + ':' +
-        padStart(marker.getUTCMinutes(), 2) + ':' +
-        padStart(marker.getUTCSeconds(), 2);
-}
-function formatTimeZoneOffset(minutes, doIso) {
-    if (doIso === void 0) { doIso = false; }
-    var sign = minutes < 0 ? '-' : '+';
-    var abs = Math.abs(minutes);
-    var hours = Math.floor(abs / 60);
-    var mins = Math.round(abs % 60);
-    if (doIso) {
-        return sign + padStart(hours, 2) + ':' + padStart(mins, 2);
-    }
-    else {
-        return 'GMT' + sign + hours + (mins ? ':' + padStart(mins, 2) : '');
-    }
-}
-// Arg Utils
-function createVerboseFormattingArg(start, end, context, separator) {
-    var startInfo = expandZonedMarker(start, context.calendarSystem);
-    var endInfo = end ? expandZonedMarker(end, context.calendarSystem) : null;
-    return {
-        date: startInfo,
-        start: startInfo,
-        end: endInfo,
-        timeZone: context.timeZone,
-        localeCodes: context.locale.codes,
-        separator: separator
-    };
-}
-function expandZonedMarker(dateInfo, calendarSystem) {
-    var a = calendarSystem.markerToArray(dateInfo.marker);
-    return {
-        marker: dateInfo.marker,
-        timeZoneOffset: dateInfo.timeZoneOffset,
-        array: a,
-        year: a[0],
-        month: a[1],
-        day: a[2],
-        hour: a[3],
-        minute: a[4],
-        second: a[5],
-        millisecond: a[6]
-    };
-}
-
-var EventSourceApi = /** @class */ (function () {
-    function EventSourceApi(calendar, internalEventSource) {
-        this.calendar = calendar;
-        this.internalEventSource = internalEventSource;
-    }
-    EventSourceApi.prototype.remove = function () {
-        this.calendar.dispatch({
-            type: 'REMOVE_EVENT_SOURCE',
-            sourceId: this.internalEventSource.sourceId
-        });
-    };
-    EventSourceApi.prototype.refetch = function () {
-        this.calendar.dispatch({
-            type: 'FETCH_EVENT_SOURCES',
-            sourceIds: [this.internalEventSource.sourceId]
-        });
-    };
-    Object.defineProperty(EventSourceApi.prototype, "id", {
-        get: function () {
-            return this.internalEventSource.publicId;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(EventSourceApi.prototype, "url", {
-        // only relevant to json-feed event sources
-        get: function () {
-            return this.internalEventSource.meta.url;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    return EventSourceApi;
-}());
-
-var EventApi = /** @class */ (function () {
-    function EventApi(calendar, def, instance) {
-        this._calendar = calendar;
-        this._def = def;
-        this._instance = instance || null;
-    }
-    /*
-    TODO: make event struct more responsible for this
-    */
-    EventApi.prototype.setProp = function (name, val) {
-        var _a, _b;
-        if (name in DATE_PROPS) ;
-        else if (name in NON_DATE_PROPS) {
-            if (typeof NON_DATE_PROPS[name] === 'function') {
-                val = NON_DATE_PROPS[name](val);
-            }
-            this.mutate({
-                standardProps: (_a = {}, _a[name] = val, _a)
-            });
-        }
-        else if (name in UNSCOPED_EVENT_UI_PROPS) {
-            var ui = void 0;
-            if (typeof UNSCOPED_EVENT_UI_PROPS[name] === 'function') {
-                val = UNSCOPED_EVENT_UI_PROPS[name](val);
-            }
-            if (name === 'color') {
-                ui = { backgroundColor: val, borderColor: val };
-            }
-            else if (name === 'editable') {
-                ui = { startEditable: val, durationEditable: val };
-            }
-            else {
-                ui = (_b = {}, _b[name] = val, _b);
-            }
-            this.mutate({
-                standardProps: { ui: ui }
-            });
-        }
-    };
-    EventApi.prototype.setExtendedProp = function (name, val) {
-        var _a;
-        this.mutate({
-            extendedProps: (_a = {}, _a[name] = val, _a)
-        });
-    };
-    EventApi.prototype.setStart = function (startInput, options) {
-        if (options === void 0) { options = {}; }
-        var dateEnv = this._calendar.dateEnv;
-        var start = dateEnv.createMarker(startInput);
-        if (start && this._instance) { // TODO: warning if parsed bad
-            var instanceRange = this._instance.range;
-            var startDelta = diffDates(instanceRange.start, start, dateEnv, options.granularity); // what if parsed bad!?
-            if (options.maintainDuration) {
-                this.mutate({ datesDelta: startDelta });
-            }
-            else {
-                this.mutate({ startDelta: startDelta });
-            }
-        }
-    };
-    EventApi.prototype.setEnd = function (endInput, options) {
-        if (options === void 0) { options = {}; }
-        var dateEnv = this._calendar.dateEnv;
-        var end;
-        if (endInput != null) {
-            end = dateEnv.createMarker(endInput);
-            if (!end) {
-                return; // TODO: warning if parsed bad
-            }
-        }
-        if (this._instance) {
-            if (end) {
-                var endDelta = diffDates(this._instance.range.end, end, dateEnv, options.granularity);
-                this.mutate({ endDelta: endDelta });
-            }
-            else {
-                this.mutate({ standardProps: { hasEnd: false } });
-            }
-        }
-    };
-    EventApi.prototype.setDates = function (startInput, endInput, options) {
-        if (options === void 0) { options = {}; }
-        var dateEnv = this._calendar.dateEnv;
-        var standardProps = { allDay: options.allDay };
-        var start = dateEnv.createMarker(startInput);
-        var end;
-        if (!start) {
-            return; // TODO: warning if parsed bad
-        }
-        if (endInput != null) {
-            end = dateEnv.createMarker(endInput);
-            if (!end) { // TODO: warning if parsed bad
-                return;
-            }
-        }
-        if (this._instance) {
-            var instanceRange = this._instance.range;
-            // when computing the diff for an event being converted to all-day,
-            // compute diff off of the all-day values the way event-mutation does.
-            if (options.allDay === true) {
-                instanceRange = computeAlignedDayRange(instanceRange);
-            }
-            var startDelta = diffDates(instanceRange.start, start, dateEnv, options.granularity);
-            if (end) {
-                var endDelta = diffDates(instanceRange.end, end, dateEnv, options.granularity);
-                if (durationsEqual(startDelta, endDelta)) {
-                    this.mutate({ datesDelta: startDelta, standardProps: standardProps });
-                }
-                else {
-                    this.mutate({ startDelta: startDelta, endDelta: endDelta, standardProps: standardProps });
-                }
-            }
-            else { // means "clear the end"
-                standardProps.hasEnd = false;
-                this.mutate({ datesDelta: startDelta, standardProps: standardProps });
-            }
-        }
-    };
-    EventApi.prototype.moveStart = function (deltaInput) {
-        var delta = createDuration(deltaInput);
-        if (delta) { // TODO: warning if parsed bad
-            this.mutate({ startDelta: delta });
-        }
-    };
-    EventApi.prototype.moveEnd = function (deltaInput) {
-        var delta = createDuration(deltaInput);
-        if (delta) { // TODO: warning if parsed bad
-            this.mutate({ endDelta: delta });
-        }
-    };
-    EventApi.prototype.moveDates = function (deltaInput) {
-        var delta = createDuration(deltaInput);
-        if (delta) { // TODO: warning if parsed bad
-            this.mutate({ datesDelta: delta });
-        }
-    };
-    EventApi.prototype.setAllDay = function (allDay, options) {
-        if (options === void 0) { options = {}; }
-        var standardProps = { allDay: allDay };
-        var maintainDuration = options.maintainDuration;
-        if (maintainDuration == null) {
-            maintainDuration = this._calendar.opt('allDayMaintainDuration');
-        }
-        if (this._def.allDay !== allDay) {
-            standardProps.hasEnd = maintainDuration;
-        }
-        this.mutate({ standardProps: standardProps });
-    };
-    EventApi.prototype.formatRange = function (formatInput) {
-        var dateEnv = this._calendar.dateEnv;
-        var instance = this._instance;
-        var formatter = createFormatter(formatInput, this._calendar.opt('defaultRangeSeparator'));
-        if (this._def.hasEnd) {
-            return dateEnv.formatRange(instance.range.start, instance.range.end, formatter, {
-                forcedStartTzo: instance.forcedStartTzo,
-                forcedEndTzo: instance.forcedEndTzo
-            });
-        }
-        else {
-            return dateEnv.format(instance.range.start, formatter, {
-                forcedTzo: instance.forcedStartTzo
-            });
-        }
-    };
-    EventApi.prototype.mutate = function (mutation) {
-        var def = this._def;
-        var instance = this._instance;
-        if (instance) {
-            this._calendar.dispatch({
-                type: 'MUTATE_EVENTS',
-                instanceId: instance.instanceId,
-                mutation: mutation,
-                fromApi: true
-            });
-            var eventStore = this._calendar.state.eventStore;
-            this._def = eventStore.defs[def.defId];
-            this._instance = eventStore.instances[instance.instanceId];
-        }
-    };
-    EventApi.prototype.remove = function () {
-        this._calendar.dispatch({
-            type: 'REMOVE_EVENT_DEF',
-            defId: this._def.defId
-        });
-    };
-    Object.defineProperty(EventApi.prototype, "source", {
-        get: function () {
-            var sourceId = this._def.sourceId;
-            if (sourceId) {
-                return new EventSourceApi(this._calendar, this._calendar.state.eventSources[sourceId]);
-            }
-            return null;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(EventApi.prototype, "start", {
-        get: function () {
-            return this._instance ?
-                this._calendar.dateEnv.toDate(this._instance.range.start) :
-                null;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(EventApi.prototype, "end", {
-        get: function () {
-            return (this._instance && this._def.hasEnd) ?
-                this._calendar.dateEnv.toDate(this._instance.range.end) :
-                null;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(EventApi.prototype, "id", {
-        // computable props that all access the def
-        // TODO: find a TypeScript-compatible way to do this at scale
-        get: function () { return this._def.publicId; },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(EventApi.prototype, "groupId", {
-        get: function () { return this._def.groupId; },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(EventApi.prototype, "allDay", {
-        get: function () { return this._def.allDay; },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(EventApi.prototype, "title", {
-        get: function () { return this._def.title; },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(EventApi.prototype, "url", {
-        get: function () { return this._def.url; },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(EventApi.prototype, "rendering", {
-        get: function () { return this._def.rendering; },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(EventApi.prototype, "startEditable", {
-        get: function () { return this._def.ui.startEditable; },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(EventApi.prototype, "durationEditable", {
-        get: function () { return this._def.ui.durationEditable; },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(EventApi.prototype, "constraint", {
-        get: function () { return this._def.ui.constraints[0] || null; },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(EventApi.prototype, "overlap", {
-        get: function () { return this._def.ui.overlap; },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(EventApi.prototype, "allow", {
-        get: function () { return this._def.ui.allows[0] || null; },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(EventApi.prototype, "backgroundColor", {
-        get: function () { return this._def.ui.backgroundColor; },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(EventApi.prototype, "borderColor", {
-        get: function () { return this._def.ui.borderColor; },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(EventApi.prototype, "textColor", {
-        get: function () { return this._def.ui.textColor; },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(EventApi.prototype, "classNames", {
-        // NOTE: user can't modify these because Object.freeze was called in event-def parsing
-        get: function () { return this._def.ui.classNames; },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(EventApi.prototype, "extendedProps", {
-        get: function () { return this._def.extendedProps; },
-        enumerable: true,
-        configurable: true
-    });
-    return EventApi;
-}());
-
-/*
-Specifying nextDayThreshold signals that all-day ranges should be sliced.
-*/
-function sliceEventStore(eventStore, eventUiBases, framingRange, nextDayThreshold) {
-    var inverseBgByGroupId = {};
-    var inverseBgByDefId = {};
-    var defByGroupId = {};
-    var bgRanges = [];
-    var fgRanges = [];
-    var eventUis = compileEventUis(eventStore.defs, eventUiBases);
-    for (var defId in eventStore.defs) {
-        var def = eventStore.defs[defId];
-        if (def.rendering === 'inverse-background') {
-            if (def.groupId) {
-                inverseBgByGroupId[def.groupId] = [];
-                if (!defByGroupId[def.groupId]) {
-                    defByGroupId[def.groupId] = def;
-                }
-            }
-            else {
-                inverseBgByDefId[defId] = [];
-            }
-        }
-    }
-    for (var instanceId in eventStore.instances) {
-        var instance = eventStore.instances[instanceId];
-        var def = eventStore.defs[instance.defId];
-        var ui = eventUis[def.defId];
-        var origRange = instance.range;
-        var normalRange = (!def.allDay && nextDayThreshold) ?
-            computeVisibleDayRange(origRange, nextDayThreshold) :
-            origRange;
-        var slicedRange = intersectRanges(normalRange, framingRange);
-        if (slicedRange) {
-            if (def.rendering === 'inverse-background') {
-                if (def.groupId) {
-                    inverseBgByGroupId[def.groupId].push(slicedRange);
-                }
-                else {
-                    inverseBgByDefId[instance.defId].push(slicedRange);
-                }
-            }
-            else {
-                (def.rendering === 'background' ? bgRanges : fgRanges).push({
-                    def: def,
-                    ui: ui,
-                    instance: instance,
-                    range: slicedRange,
-                    isStart: normalRange.start && normalRange.start.valueOf() === slicedRange.start.valueOf(),
-                    isEnd: normalRange.end && normalRange.end.valueOf() === slicedRange.end.valueOf()
-                });
-            }
-        }
-    }
-    for (var groupId in inverseBgByGroupId) { // BY GROUP
-        var ranges = inverseBgByGroupId[groupId];
-        var invertedRanges = invertRanges(ranges, framingRange);
-        for (var _i = 0, invertedRanges_1 = invertedRanges; _i < invertedRanges_1.length; _i++) {
-            var invertedRange = invertedRanges_1[_i];
-            var def = defByGroupId[groupId];
-            var ui = eventUis[def.defId];
-            bgRanges.push({
-                def: def,
-                ui: ui,
-                instance: null,
-                range: invertedRange,
-                isStart: false,
-                isEnd: false
-            });
-        }
-    }
-    for (var defId in inverseBgByDefId) {
-        var ranges = inverseBgByDefId[defId];
-        var invertedRanges = invertRanges(ranges, framingRange);
-        for (var _a = 0, invertedRanges_2 = invertedRanges; _a < invertedRanges_2.length; _a++) {
-            var invertedRange = invertedRanges_2[_a];
-            bgRanges.push({
-                def: eventStore.defs[defId],
-                ui: eventUis[defId],
-                instance: null,
-                range: invertedRange,
-                isStart: false,
-                isEnd: false
-            });
-        }
-    }
-    return { bg: bgRanges, fg: fgRanges };
-}
-function hasBgRendering(def) {
-    return def.rendering === 'background' || def.rendering === 'inverse-background';
-}
-function filterSegsViaEls(view, segs, isMirror) {
-    if (view.hasPublicHandlers('eventRender')) {
-        segs = segs.filter(function (seg) {
-            var custom = view.publiclyTrigger('eventRender', [
-                {
-                    event: new EventApi(view.calendar, seg.eventRange.def, seg.eventRange.instance),
-                    isMirror: isMirror,
-                    isStart: seg.isStart,
-                    isEnd: seg.isEnd,
-                    // TODO: include seg.range once all components consistently generate it
-                    el: seg.el,
-                    view: view
-                }
-            ]);
-            if (custom === false) { // means don't render at all
-                return false;
-            }
-            else if (custom && custom !== true) {
-                seg.el = custom;
-            }
-            return true;
-        });
-    }
-    for (var _i = 0, segs_1 = segs; _i < segs_1.length; _i++) {
-        var seg = segs_1[_i];
-        setElSeg(seg.el, seg);
-    }
-    return segs;
-}
-function setElSeg(el, seg) {
-    el.fcSeg = seg;
-}
-function getElSeg(el) {
-    return el.fcSeg || null;
-}
-// event ui computation
-function compileEventUis(eventDefs, eventUiBases) {
-    return mapHash(eventDefs, function (eventDef) {
-        return compileEventUi(eventDef, eventUiBases);
-    });
-}
-function compileEventUi(eventDef, eventUiBases) {
-    var uis = [];
-    if (eventUiBases['']) {
-        uis.push(eventUiBases['']);
-    }
-    if (eventUiBases[eventDef.defId]) {
-        uis.push(eventUiBases[eventDef.defId]);
-    }
-    uis.push(eventDef.ui);
-    return combineEventUis(uis);
-}
-
-// applies the mutation to ALL defs/instances within the event store
-function applyMutationToEventStore(eventStore, eventConfigBase, mutation, calendar) {
-    var eventConfigs = compileEventUis(eventStore.defs, eventConfigBase);
-    var dest = createEmptyEventStore();
-    for (var defId in eventStore.defs) {
-        var def = eventStore.defs[defId];
-        dest.defs[defId] = applyMutationToEventDef(def, eventConfigs[defId], mutation, calendar.pluginSystem.hooks.eventDefMutationAppliers, calendar);
-    }
-    for (var instanceId in eventStore.instances) {
-        var instance = eventStore.instances[instanceId];
-        var def = dest.defs[instance.defId]; // important to grab the newly modified def
-        dest.instances[instanceId] = applyMutationToEventInstance(instance, def, eventConfigs[instance.defId], mutation, calendar);
-    }
-    return dest;
-}
-function applyMutationToEventDef(eventDef, eventConfig, mutation, appliers, calendar) {
-    var standardProps = mutation.standardProps || {};
-    // if hasEnd has not been specified, guess a good value based on deltas.
-    // if duration will change, there's no way the default duration will persist,
-    // and thus, we need to mark the event as having a real end
-    if (standardProps.hasEnd == null &&
-        eventConfig.durationEditable &&
-        (mutation.startDelta || mutation.endDelta)) {
-        standardProps.hasEnd = true; // TODO: is this mutation okay?
-    }
-    var copy = __assign({}, eventDef, standardProps, { ui: __assign({}, eventDef.ui, standardProps.ui) });
-    if (mutation.extendedProps) {
-        copy.extendedProps = __assign({}, copy.extendedProps, mutation.extendedProps);
-    }
-    for (var _i = 0, appliers_1 = appliers; _i < appliers_1.length; _i++) {
-        var applier = appliers_1[_i];
-        applier(copy, mutation, calendar);
-    }
-    if (!copy.hasEnd && calendar.opt('forceEventDuration')) {
-        copy.hasEnd = true;
-    }
-    return copy;
-}
-function applyMutationToEventInstance(eventInstance, eventDef, // must first be modified by applyMutationToEventDef
-eventConfig, mutation, calendar) {
-    var dateEnv = calendar.dateEnv;
-    var forceAllDay = mutation.standardProps && mutation.standardProps.allDay === true;
-    var clearEnd = mutation.standardProps && mutation.standardProps.hasEnd === false;
-    var copy = __assign({}, eventInstance);
-    if (forceAllDay) {
-        copy.range = computeAlignedDayRange(copy.range);
-    }
-    if (mutation.datesDelta && eventConfig.startEditable) {
-        copy.range = {
-            start: dateEnv.add(copy.range.start, mutation.datesDelta),
-            end: dateEnv.add(copy.range.end, mutation.datesDelta)
-        };
-    }
-    if (mutation.startDelta && eventConfig.durationEditable) {
-        copy.range = {
-            start: dateEnv.add(copy.range.start, mutation.startDelta),
-            end: copy.range.end
-        };
-    }
-    if (mutation.endDelta && eventConfig.durationEditable) {
-        copy.range = {
-            start: copy.range.start,
-            end: dateEnv.add(copy.range.end, mutation.endDelta)
-        };
-    }
-    if (clearEnd) {
-        copy.range = {
-            start: copy.range.start,
-            end: calendar.getDefaultEventEnd(eventDef.allDay, copy.range.start)
-        };
-    }
-    // in case event was all-day but the supplied deltas were not
-    // better util for this?
-    if (eventDef.allDay) {
-        copy.range = {
-            start: startOfDay(copy.range.start),
-            end: startOfDay(copy.range.end)
-        };
-    }
-    // handle invalid durations
-    if (copy.range.end < copy.range.start) {
-        copy.range.end = calendar.getDefaultEventEnd(eventDef.allDay, copy.range.start);
-    }
-    return copy;
-}
-
-function reduceEventStore (eventStore, action, eventSources, dateProfile, calendar) {
-    switch (action.type) {
-        case 'RECEIVE_EVENTS': // raw
-            return receiveRawEvents(eventStore, eventSources[action.sourceId], action.fetchId, action.fetchRange, action.rawEvents, calendar);
-        case 'ADD_EVENTS': // already parsed, but not expanded
-            return addEvent(eventStore, action.eventStore, // new ones
-            dateProfile ? dateProfile.activeRange : null, calendar);
-        case 'MERGE_EVENTS': // already parsed and expanded
-            return mergeEventStores(eventStore, action.eventStore);
-        case 'PREV': // TODO: how do we track all actions that affect dateProfile :(
-        case 'NEXT':
-        case 'SET_DATE':
-        case 'SET_VIEW_TYPE':
-            if (dateProfile) {
-                return expandRecurring(eventStore, dateProfile.activeRange, calendar);
-            }
-            else {
-                return eventStore;
-            }
-        case 'CHANGE_TIMEZONE':
-            return rezoneDates(eventStore, action.oldDateEnv, calendar.dateEnv);
-        case 'MUTATE_EVENTS':
-            return applyMutationToRelated(eventStore, action.instanceId, action.mutation, action.fromApi, calendar);
-        case 'REMOVE_EVENT_INSTANCES':
-            return excludeInstances(eventStore, action.instances);
-        case 'REMOVE_EVENT_DEF':
-            return filterEventStoreDefs(eventStore, function (eventDef) {
-                return eventDef.defId !== action.defId;
-            });
-        case 'REMOVE_EVENT_SOURCE':
-            return excludeEventsBySourceId(eventStore, action.sourceId);
-        case 'REMOVE_ALL_EVENT_SOURCES':
-            return filterEventStoreDefs(eventStore, function (eventDef) {
-                return !eventDef.sourceId; // only keep events with no source id
-            });
-        case 'REMOVE_ALL_EVENTS':
-            return createEmptyEventStore();
-        case 'RESET_EVENTS':
-            return {
-                defs: eventStore.defs,
-                instances: eventStore.instances
-            };
-        default:
-            return eventStore;
-    }
-}
-function receiveRawEvents(eventStore, eventSource, fetchId, fetchRange, rawEvents, calendar) {
-    if (eventSource && // not already removed
-        fetchId === eventSource.latestFetchId // TODO: wish this logic was always in event-sources
-    ) {
-        var subset = parseEvents(transformRawEvents(rawEvents, eventSource, calendar), eventSource.sourceId, calendar);
-        if (fetchRange) {
-            subset = expandRecurring(subset, fetchRange, calendar);
-        }
-        return mergeEventStores(excludeEventsBySourceId(eventStore, eventSource.sourceId), subset);
-    }
-    return eventStore;
-}
-function addEvent(eventStore, subset, expandRange, calendar) {
-    if (expandRange) {
-        subset = expandRecurring(subset, expandRange, calendar);
-    }
-    return mergeEventStores(eventStore, subset);
-}
-function rezoneDates(eventStore, oldDateEnv, newDateEnv) {
-    var defs = eventStore.defs;
-    var instances = mapHash(eventStore.instances, function (instance) {
-        var def = defs[instance.defId];
-        if (def.allDay || def.recurringDef) {
-            return instance; // isn't dependent on timezone
-        }
-        else {
-            return __assign({}, instance, { range: {
-                    start: newDateEnv.createMarker(oldDateEnv.toDate(instance.range.start, instance.forcedStartTzo)),
-                    end: newDateEnv.createMarker(oldDateEnv.toDate(instance.range.end, instance.forcedEndTzo))
-                }, forcedStartTzo: newDateEnv.canComputeOffset ? null : instance.forcedStartTzo, forcedEndTzo: newDateEnv.canComputeOffset ? null : instance.forcedEndTzo });
-        }
-    });
-    return { defs: defs, instances: instances };
-}
-function applyMutationToRelated(eventStore, instanceId, mutation, fromApi, calendar) {
-    var relevant = getRelevantEvents(eventStore, instanceId);
-    var eventConfigBase = fromApi ?
-        { '': {
-                startEditable: true,
-                durationEditable: true,
-                constraints: [],
-                overlap: null,
-                allows: [],
-                backgroundColor: '',
-                borderColor: '',
-                textColor: '',
-                classNames: []
-            } } :
-        calendar.eventUiBases;
-    relevant = applyMutationToEventStore(relevant, eventConfigBase, mutation, calendar);
-    return mergeEventStores(eventStore, relevant);
-}
-function excludeEventsBySourceId(eventStore, sourceId) {
-    return filterEventStoreDefs(eventStore, function (eventDef) {
-        return eventDef.sourceId !== sourceId;
-    });
-}
-// QUESTION: why not just return instances? do a general object-property-exclusion util
-function excludeInstances(eventStore, removals) {
-    return {
-        defs: eventStore.defs,
-        instances: filterHash(eventStore.instances, function (instance) {
-            return !removals[instance.instanceId];
-        })
-    };
-}
-
-// high-level segmenting-aware tester functions
-// ------------------------------------------------------------------------------------------------------------------------
-function isInteractionValid(interaction, calendar) {
-    return isNewPropsValid({ eventDrag: interaction }, calendar); // HACK: the eventDrag props is used for ALL interactions
-}
-function isDateSelectionValid(dateSelection, calendar) {
-    return isNewPropsValid({ dateSelection: dateSelection }, calendar);
-}
-function isNewPropsValid(newProps, calendar) {
-    var view = calendar.view;
-    var props = __assign({ businessHours: view ? view.props.businessHours : createEmptyEventStore(), dateSelection: '', eventStore: calendar.state.eventStore, eventUiBases: calendar.eventUiBases, eventSelection: '', eventDrag: null, eventResize: null }, newProps);
-    return (calendar.pluginSystem.hooks.isPropsValid || isPropsValid)(props, calendar);
-}
-function isPropsValid(state, calendar, dateSpanMeta, filterConfig) {
-    if (dateSpanMeta === void 0) { dateSpanMeta = {}; }
-    if (state.eventDrag && !isInteractionPropsValid(state, calendar, dateSpanMeta, filterConfig)) {
-        return false;
-    }
-    if (state.dateSelection && !isDateSelectionPropsValid(state, calendar, dateSpanMeta, filterConfig)) {
-        return false;
-    }
-    return true;
-}
-// Moving Event Validation
-// ------------------------------------------------------------------------------------------------------------------------
-function isInteractionPropsValid(state, calendar, dateSpanMeta, filterConfig) {
-    var interaction = state.eventDrag; // HACK: the eventDrag props is used for ALL interactions
-    var subjectEventStore = interaction.mutatedEvents;
-    var subjectDefs = subjectEventStore.defs;
-    var subjectInstances = subjectEventStore.instances;
-    var subjectConfigs = compileEventUis(subjectDefs, interaction.isEvent ?
-        state.eventUiBases :
-        { '': calendar.selectionConfig } // if not a real event, validate as a selection
-    );
-    if (filterConfig) {
-        subjectConfigs = mapHash(subjectConfigs, filterConfig);
-    }
-    var otherEventStore = excludeInstances(state.eventStore, interaction.affectedEvents.instances); // exclude the subject events. TODO: exclude defs too?
-    var otherDefs = otherEventStore.defs;
-    var otherInstances = otherEventStore.instances;
-    var otherConfigs = compileEventUis(otherDefs, state.eventUiBases);
-    for (var subjectInstanceId in subjectInstances) {
-        var subjectInstance = subjectInstances[subjectInstanceId];
-        var subjectRange = subjectInstance.range;
-        var subjectConfig = subjectConfigs[subjectInstance.defId];
-        var subjectDef = subjectDefs[subjectInstance.defId];
-        // constraint
-        if (!allConstraintsPass(subjectConfig.constraints, subjectRange, otherEventStore, state.businessHours, calendar)) {
-            return false;
-        }
-        // overlap
-        var overlapFunc = calendar.opt('eventOverlap');
-        if (typeof overlapFunc !== 'function') {
-            overlapFunc = null;
-        }
-        for (var otherInstanceId in otherInstances) {
-            var otherInstance = otherInstances[otherInstanceId];
-            // intersect! evaluate
-            if (rangesIntersect(subjectRange, otherInstance.range)) {
-                var otherOverlap = otherConfigs[otherInstance.defId].overlap;
-                // consider the other event's overlap. only do this if the subject event is a "real" event
-                if (otherOverlap === false && interaction.isEvent) {
-                    return false;
-                }
-                if (subjectConfig.overlap === false) {
-                    return false;
-                }
-                if (overlapFunc && !overlapFunc(new EventApi(calendar, otherDefs[otherInstance.defId], otherInstance), // still event
-                new EventApi(calendar, subjectDef, subjectInstance) // moving event
-                )) {
-                    return false;
-                }
-            }
-        }
-        // allow (a function)
-        var calendarEventStore = calendar.state.eventStore; // need global-to-calendar, not local to component (splittable)state
-        for (var _i = 0, _a = subjectConfig.allows; _i < _a.length; _i++) {
-            var subjectAllow = _a[_i];
-            var subjectDateSpan = __assign({}, dateSpanMeta, { range: subjectInstance.range, allDay: subjectDef.allDay });
-            var origDef = calendarEventStore.defs[subjectDef.defId];
-            var origInstance = calendarEventStore.instances[subjectInstanceId];
-            var eventApi = void 0;
-            if (origDef) { // was previously in the calendar
-                eventApi = new EventApi(calendar, origDef, origInstance);
-            }
-            else { // was an external event
-                eventApi = new EventApi(calendar, subjectDef); // no instance, because had no dates
-            }
-            if (!subjectAllow(calendar.buildDateSpanApi(subjectDateSpan), eventApi)) {
-                return false;
-            }
-        }
-    }
-    return true;
-}
-// Date Selection Validation
-// ------------------------------------------------------------------------------------------------------------------------
-function isDateSelectionPropsValid(state, calendar, dateSpanMeta, filterConfig) {
-    var relevantEventStore = state.eventStore;
-    var relevantDefs = relevantEventStore.defs;
-    var relevantInstances = relevantEventStore.instances;
-    var selection = state.dateSelection;
-    var selectionRange = selection.range;
-    var selectionConfig = calendar.selectionConfig;
-    if (filterConfig) {
-        selectionConfig = filterConfig(selectionConfig);
-    }
-    // constraint
-    if (!allConstraintsPass(selectionConfig.constraints, selectionRange, relevantEventStore, state.businessHours, calendar)) {
-        return false;
-    }
-    // overlap
-    var overlapFunc = calendar.opt('selectOverlap');
-    if (typeof overlapFunc !== 'function') {
-        overlapFunc = null;
-    }
-    for (var relevantInstanceId in relevantInstances) {
-        var relevantInstance = relevantInstances[relevantInstanceId];
-        // intersect! evaluate
-        if (rangesIntersect(selectionRange, relevantInstance.range)) {
-            if (selectionConfig.overlap === false) {
-                return false;
-            }
-            if (overlapFunc && !overlapFunc(new EventApi(calendar, relevantDefs[relevantInstance.defId], relevantInstance))) {
-                return false;
-            }
-        }
-    }
-    // allow (a function)
-    for (var _i = 0, _a = selectionConfig.allows; _i < _a.length; _i++) {
-        var selectionAllow = _a[_i];
-        var fullDateSpan = __assign({}, dateSpanMeta, selection);
-        if (!selectionAllow(calendar.buildDateSpanApi(fullDateSpan), null)) {
-            return false;
-        }
-    }
-    return true;
-}
-// Constraint Utils
-// ------------------------------------------------------------------------------------------------------------------------
-function allConstraintsPass(constraints, subjectRange, otherEventStore, businessHoursUnexpanded, calendar) {
-    for (var _i = 0, constraints_1 = constraints; _i < constraints_1.length; _i++) {
-        var constraint = constraints_1[_i];
-        if (!anyRangesContainRange(constraintToRanges(constraint, subjectRange, otherEventStore, businessHoursUnexpanded, calendar), subjectRange)) {
-            return false;
-        }
-    }
-    return true;
-}
-function constraintToRanges(constraint, subjectRange, // for expanding a recurring constraint, or expanding business hours
-otherEventStore, // for if constraint is an even group ID
-businessHoursUnexpanded, // for if constraint is 'businessHours'
-calendar // for expanding businesshours
-) {
-    if (constraint === 'businessHours') {
-        return eventStoreToRanges(expandRecurring(businessHoursUnexpanded, subjectRange, calendar));
-    }
-    else if (typeof constraint === 'string') { // an group ID
-        return eventStoreToRanges(filterEventStoreDefs(otherEventStore, function (eventDef) {
-            return eventDef.groupId === constraint;
-        }));
-    }
-    else if (typeof constraint === 'object' && constraint) { // non-null object
-        return eventStoreToRanges(expandRecurring(constraint, subjectRange, calendar));
-    }
-    return []; // if it's false
-}
-// TODO: move to event-store file?
-function eventStoreToRanges(eventStore) {
-    var instances = eventStore.instances;
-    var ranges = [];
-    for (var instanceId in instances) {
-        ranges.push(instances[instanceId].range);
-    }
-    return ranges;
-}
-// TODO: move to geom file?
-function anyRangesContainRange(outerRanges, innerRange) {
-    for (var _i = 0, outerRanges_1 = outerRanges; _i < outerRanges_1.length; _i++) {
-        var outerRange = outerRanges_1[_i];
-        if (rangeContainsRange(outerRange, innerRange)) {
-            return true;
-        }
-    }
-    return false;
-}
-// Parsing
-// ------------------------------------------------------------------------------------------------------------------------
-function normalizeConstraint(input, calendar) {
-    if (Array.isArray(input)) {
-        return parseEvents(input, '', calendar, true); // allowOpenRange=true
-    }
-    else if (typeof input === 'object' && input) { // non-null object
-        return parseEvents([input], '', calendar, true); // allowOpenRange=true
-    }
-    else if (input != null) {
-        return String(input);
-    }
-    else {
-        return null;
-    }
-}
-
-function htmlEscape(s) {
-    return (s + '').replace(/&/g, '&amp;')
-        .replace(/</g, '&lt;')
-        .replace(/>/g, '&gt;')
-        .replace(/'/g, '&#039;')
-        .replace(/"/g, '&quot;')
-        .replace(/\n/g, '<br />');
-}
-// Given a hash of CSS properties, returns a string of CSS.
-// Uses property names as-is (no camel-case conversion). Will not make statements for null/undefined values.
-function cssToStr(cssProps) {
-    var statements = [];
-    for (var name_1 in cssProps) {
-        var val = cssProps[name_1];
-        if (val != null && val !== '') {
-            statements.push(name_1 + ':' + val);
-        }
-    }
-    return statements.join(';');
-}
-// Given an object hash of HTML attribute names to values,
-// generates a string that can be injected between < > in HTML
-function attrsToStr(attrs) {
-    var parts = [];
-    for (var name_2 in attrs) {
-        var val = attrs[name_2];
-        if (val != null) {
-            parts.push(name_2 + '="' + htmlEscape(val) + '"');
-        }
-    }
-    return parts.join(' ');
-}
-function parseClassName(raw) {
-    if (Array.isArray(raw)) {
-        return raw;
-    }
-    else if (typeof raw === 'string') {
-        return raw.split(/\s+/);
-    }
-    else {
-        return [];
-    }
-}
-
-var UNSCOPED_EVENT_UI_PROPS = {
-    editable: Boolean,
-    startEditable: Boolean,
-    durationEditable: Boolean,
-    constraint: null,
-    overlap: null,
-    allow: null,
-    className: parseClassName,
-    classNames: parseClassName,
-    color: String,
-    backgroundColor: String,
-    borderColor: String,
-    textColor: String
-};
-function processUnscopedUiProps(rawProps, calendar, leftovers) {
-    var props = refineProps(rawProps, UNSCOPED_EVENT_UI_PROPS, {}, leftovers);
-    var constraint = normalizeConstraint(props.constraint, calendar);
-    return {
-        startEditable: props.startEditable != null ? props.startEditable : props.editable,
-        durationEditable: props.durationEditable != null ? props.durationEditable : props.editable,
-        constraints: constraint != null ? [constraint] : [],
-        overlap: props.overlap,
-        allows: props.allow != null ? [props.allow] : [],
-        backgroundColor: props.backgroundColor || props.color,
-        borderColor: props.borderColor || props.color,
-        textColor: props.textColor,
-        classNames: props.classNames.concat(props.className)
-    };
-}
-function processScopedUiProps(prefix, rawScoped, calendar, leftovers) {
-    var rawUnscoped = {};
-    var wasFound = {};
-    for (var key in UNSCOPED_EVENT_UI_PROPS) {
-        var scopedKey = prefix + capitaliseFirstLetter(key);
-        rawUnscoped[key] = rawScoped[scopedKey];
-        wasFound[scopedKey] = true;
-    }
-    if (prefix === 'event') {
-        rawUnscoped.editable = rawScoped.editable; // special case. there is no 'eventEditable', just 'editable'
-    }
-    if (leftovers) {
-        for (var key in rawScoped) {
-            if (!wasFound[key]) {
-                leftovers[key] = rawScoped[key];
-            }
-        }
-    }
-    return processUnscopedUiProps(rawUnscoped, calendar);
-}
-var EMPTY_EVENT_UI = {
-    startEditable: null,
-    durationEditable: null,
-    constraints: [],
-    overlap: null,
-    allows: [],
-    backgroundColor: '',
-    borderColor: '',
-    textColor: '',
-    classNames: []
-};
-// prevent against problems with <2 args!
-function combineEventUis(uis) {
-    return uis.reduce(combineTwoEventUis, EMPTY_EVENT_UI);
-}
-function combineTwoEventUis(item0, item1) {
-    return {
-        startEditable: item1.startEditable != null ? item1.startEditable : item0.startEditable,
-        durationEditable: item1.durationEditable != null ? item1.durationEditable : item0.durationEditable,
-        constraints: item0.constraints.concat(item1.constraints),
-        overlap: typeof item1.overlap === 'boolean' ? item1.overlap : item0.overlap,
-        allows: item0.allows.concat(item1.allows),
-        backgroundColor: item1.backgroundColor || item0.backgroundColor,
-        borderColor: item1.borderColor || item0.borderColor,
-        textColor: item1.textColor || item0.textColor,
-        classNames: item0.classNames.concat(item1.classNames)
-    };
-}
-
-var NON_DATE_PROPS = {
-    id: String,
-    groupId: String,
-    title: String,
-    url: String,
-    rendering: String,
-    extendedProps: null
-};
-var DATE_PROPS = {
-    start: null,
-    date: null,
-    end: null,
-    allDay: null
-};
-var uid = 0;
-function parseEvent(raw, sourceId, calendar, allowOpenRange) {
-    var allDayDefault = computeIsAllDayDefault(sourceId, calendar);
-    var leftovers0 = {};
-    var recurringRes = parseRecurring(raw, // raw, but with single-event stuff stripped out
-    allDayDefault, calendar.dateEnv, calendar.pluginSystem.hooks.recurringTypes, leftovers0 // will populate with non-recurring props
-    );
-    if (recurringRes) {
-        var def = parseEventDef(leftovers0, sourceId, recurringRes.allDay, Boolean(recurringRes.duration), calendar);
-        def.recurringDef = {
-            typeId: recurringRes.typeId,
-            typeData: recurringRes.typeData,
-            duration: recurringRes.duration
-        };
-        return { def: def, instance: null };
-    }
-    else {
-        var leftovers1 = {};
-        var singleRes = parseSingle(raw, allDayDefault, calendar, leftovers1, allowOpenRange);
-        if (singleRes) {
-            var def = parseEventDef(leftovers1, sourceId, singleRes.allDay, singleRes.hasEnd, calendar);
-            var instance = createEventInstance(def.defId, singleRes.range, singleRes.forcedStartTzo, singleRes.forcedEndTzo);
-            return { def: def, instance: instance };
-        }
-    }
-    return null;
-}
-/*
-Will NOT populate extendedProps with the leftover properties.
-Will NOT populate date-related props.
-The EventNonDateInput has been normalized (id => publicId, etc).
-*/
-function parseEventDef(raw, sourceId, allDay, hasEnd, calendar) {
-    var leftovers = {};
-    var def = pluckNonDateProps(raw, calendar, leftovers);
-    def.defId = String(uid++);
-    def.sourceId = sourceId;
-    def.allDay = allDay;
-    def.hasEnd = hasEnd;
-    for (var _i = 0, _a = calendar.pluginSystem.hooks.eventDefParsers; _i < _a.length; _i++) {
-        var eventDefParser = _a[_i];
-        var newLeftovers = {};
-        eventDefParser(def, leftovers, newLeftovers);
-        leftovers = newLeftovers;
-    }
-    def.extendedProps = __assign(leftovers, def.extendedProps || {});
-    // help out EventApi from having user modify props
-    Object.freeze(def.ui.classNames);
-    Object.freeze(def.extendedProps);
-    return def;
-}
-function createEventInstance(defId, range, forcedStartTzo, forcedEndTzo) {
-    return {
-        instanceId: String(uid++),
-        defId: defId,
-        range: range,
-        forcedStartTzo: forcedStartTzo == null ? null : forcedStartTzo,
-        forcedEndTzo: forcedEndTzo == null ? null : forcedEndTzo
-    };
-}
-function parseSingle(raw, allDayDefault, calendar, leftovers, allowOpenRange) {
-    var props = pluckDateProps(raw, leftovers);
-    var allDay = props.allDay;
-    var startMeta;
-    var startMarker = null;
-    var hasEnd = false;
-    var endMeta;
-    var endMarker = null;
-    startMeta = calendar.dateEnv.createMarkerMeta(props.start);
-    if (startMeta) {
-        startMarker = startMeta.marker;
-    }
-    else if (!allowOpenRange) {
-        return null;
-    }
-    if (props.end != null) {
-        endMeta = calendar.dateEnv.createMarkerMeta(props.end);
-    }
-    if (allDay == null) {
-        if (allDayDefault != null) {
-            allDay = allDayDefault;
-        }
-        else {
-            // fall back to the date props LAST
-            allDay = (!startMeta || startMeta.isTimeUnspecified) &&
-                (!endMeta || endMeta.isTimeUnspecified);
-        }
-    }
-    if (allDay && startMarker) {
-        startMarker = startOfDay(startMarker);
-    }
-    if (endMeta) {
-        endMarker = endMeta.marker;
-        if (allDay) {
-            endMarker = startOfDay(endMarker);
-        }
-        if (startMarker && endMarker <= startMarker) {
-            endMarker = null;
-        }
-    }
-    if (endMarker) {
-        hasEnd = true;
-    }
-    else if (!allowOpenRange) {
-        hasEnd = calendar.opt('forceEventDuration') || false;
-        endMarker = calendar.dateEnv.add(startMarker, allDay ?
-            calendar.defaultAllDayEventDuration :
-            calendar.defaultTimedEventDuration);
-    }
-    return {
-        allDay: allDay,
-        hasEnd: hasEnd,
-        range: { start: startMarker, end: endMarker },
-        forcedStartTzo: startMeta ? startMeta.forcedTzo : null,
-        forcedEndTzo: endMeta ? endMeta.forcedTzo : null
-    };
-}
-function pluckDateProps(raw, leftovers) {
-    var props = refineProps(raw, DATE_PROPS, {}, leftovers);
-    props.start = (props.start !== null) ? props.start : props.date;
-    delete props.date;
-    return props;
-}
-function pluckNonDateProps(raw, calendar, leftovers) {
-    var preLeftovers = {};
-    var props = refineProps(raw, NON_DATE_PROPS, {}, preLeftovers);
-    var ui = processUnscopedUiProps(preLeftovers, calendar, leftovers);
-    props.publicId = props.id;
-    delete props.id;
-    props.ui = ui;
-    return props;
-}
-function computeIsAllDayDefault(sourceId, calendar) {
-    var res = null;
-    if (sourceId) {
-        var source = calendar.state.eventSources[sourceId];
-        res = source.allDayDefault;
-    }
-    if (res == null) {
-        res = calendar.opt('allDayDefault');
-    }
-    return res;
-}
-
-var DEF_DEFAULTS = {
-    startTime: '09:00',
-    endTime: '17:00',
-    daysOfWeek: [1, 2, 3, 4, 5],
-    rendering: 'inverse-background',
-    classNames: 'fc-nonbusiness',
-    groupId: '_businessHours' // so multiple defs get grouped
-};
-/*
-TODO: pass around as EventDefHash!!!
-*/
-function parseBusinessHours(input, calendar) {
-    return parseEvents(refineInputs(input), '', calendar);
-}
-function refineInputs(input) {
-    var rawDefs;
-    if (input === true) {
-        rawDefs = [{}]; // will get DEF_DEFAULTS verbatim
-    }
-    else if (Array.isArray(input)) {
-        // if specifying an array, every sub-definition NEEDS a day-of-week
-        rawDefs = input.filter(function (rawDef) {
-            return rawDef.daysOfWeek;
-        });
-    }
-    else if (typeof input === 'object' && input) { // non-null object
-        rawDefs = [input];
-    }
-    else { // is probably false
-        rawDefs = [];
-    }
-    rawDefs = rawDefs.map(function (rawDef) {
-        return __assign({}, DEF_DEFAULTS, rawDef);
-    });
-    return rawDefs;
-}
-
-function memoizeRendering(renderFunc, unrenderFunc, dependencies) {
-    if (dependencies === void 0) { dependencies = []; }
-    var dependents = [];
-    var thisContext;
-    var prevArgs;
-    function unrender() {
-        if (prevArgs) {
-            for (var _i = 0, dependents_1 = dependents; _i < dependents_1.length; _i++) {
-                var dependent = dependents_1[_i];
-                dependent.unrender();
-            }
-            if (unrenderFunc) {
-                unrenderFunc.apply(thisContext, prevArgs);
-            }
-            prevArgs = null;
-        }
-    }
-    function res() {
-        if (!prevArgs || !isArraysEqual(prevArgs, arguments)) {
-            unrender();
-            thisContext = this;
-            prevArgs = arguments;
-            renderFunc.apply(this, arguments);
-        }
-    }
-    res.dependents = dependents;
-    res.unrender = unrender;
-    for (var _i = 0, dependencies_1 = dependencies; _i < dependencies_1.length; _i++) {
-        var dependency = dependencies_1[_i];
-        dependency.dependents.push(res);
-    }
-    return res;
-}
-
-var EMPTY_EVENT_STORE = createEmptyEventStore(); // for purecomponents. TODO: keep elsewhere
-var Splitter = /** @class */ (function () {
-    function Splitter() {
-        this.getKeysForEventDefs = memoize(this._getKeysForEventDefs);
-        this.splitDateSelection = memoize(this._splitDateSpan);
-        this.splitEventStore = memoize(this._splitEventStore);
-        this.splitIndividualUi = memoize(this._splitIndividualUi);
-        this.splitEventDrag = memoize(this._splitInteraction);
-        this.splitEventResize = memoize(this._splitInteraction);
-        this.eventUiBuilders = {}; // TODO: typescript protection
-    }
-    Splitter.prototype.splitProps = function (props) {
-        var _this = this;
-        var keyInfos = this.getKeyInfo(props);
-        var defKeys = this.getKeysForEventDefs(props.eventStore);
-        var dateSelections = this.splitDateSelection(props.dateSelection);
-        var individualUi = this.splitIndividualUi(props.eventUiBases, defKeys); // the individual *bases*
-        var eventStores = this.splitEventStore(props.eventStore, defKeys);
-        var eventDrags = this.splitEventDrag(props.eventDrag);
-        var eventResizes = this.splitEventResize(props.eventResize);
-        var splitProps = {};
-        this.eventUiBuilders = mapHash(keyInfos, function (info, key) {
-            return _this.eventUiBuilders[key] || memoize(buildEventUiForKey);
-        });
-        for (var key in keyInfos) {
-            var keyInfo = keyInfos[key];
-            var eventStore = eventStores[key] || EMPTY_EVENT_STORE;
-            var buildEventUi = this.eventUiBuilders[key];
-            splitProps[key] = {
-                businessHours: keyInfo.businessHours || props.businessHours,
-                dateSelection: dateSelections[key] || null,
-                eventStore: eventStore,
-                eventUiBases: buildEventUi(props.eventUiBases[''], keyInfo.ui, individualUi[key]),
-                eventSelection: eventStore.instances[props.eventSelection] ? props.eventSelection : '',
-                eventDrag: eventDrags[key] || null,
-                eventResize: eventResizes[key] || null
-            };
-        }
-        return splitProps;
-    };
-    Splitter.prototype._splitDateSpan = function (dateSpan) {
-        var dateSpans = {};
-        if (dateSpan) {
-            var keys = this.getKeysForDateSpan(dateSpan);
-            for (var _i = 0, keys_1 = keys; _i < keys_1.length; _i++) {
-                var key = keys_1[_i];
-                dateSpans[key] = dateSpan;
-            }
-        }
-        return dateSpans;
-    };
-    Splitter.prototype._getKeysForEventDefs = function (eventStore) {
-        var _this = this;
-        return mapHash(eventStore.defs, function (eventDef) {
-            return _this.getKeysForEventDef(eventDef);
-        });
-    };
-    Splitter.prototype._splitEventStore = function (eventStore, defKeys) {
-        var defs = eventStore.defs, instances = eventStore.instances;
-        var splitStores = {};
-        for (var defId in defs) {
-            for (var _i = 0, _a = defKeys[defId]; _i < _a.length; _i++) {
-                var key = _a[_i];
-                if (!splitStores[key]) {
-                    splitStores[key] = createEmptyEventStore();
-                }
-                splitStores[key].defs[defId] = defs[defId];
-            }
-        }
-        for (var instanceId in instances) {
-            var instance = instances[instanceId];
-            for (var _b = 0, _c = defKeys[instance.defId]; _b < _c.length; _b++) {
-                var key = _c[_b];
-                if (splitStores[key]) { // must have already been created
-                    splitStores[key].instances[instanceId] = instance;
-                }
-            }
-        }
-        return splitStores;
-    };
-    Splitter.prototype._splitIndividualUi = function (eventUiBases, defKeys) {
-        var splitHashes = {};
-        for (var defId in eventUiBases) {
-            if (defId) { // not the '' key
-                for (var _i = 0, _a = defKeys[defId]; _i < _a.length; _i++) {
-                    var key = _a[_i];
-                    if (!splitHashes[key]) {
-                        splitHashes[key] = {};
-                    }
-                    splitHashes[key][defId] = eventUiBases[defId];
-                }
-            }
-        }
-        return splitHashes;
-    };
-    Splitter.prototype._splitInteraction = function (interaction) {
-        var splitStates = {};
-        if (interaction) {
-            var affectedStores_1 = this._splitEventStore(interaction.affectedEvents, this._getKeysForEventDefs(interaction.affectedEvents) // can't use cached. might be events from other calendar
-            );
-            // can't rely on defKeys because event data is mutated
-            var mutatedKeysByDefId = this._getKeysForEventDefs(interaction.mutatedEvents);
-            var mutatedStores_1 = this._splitEventStore(interaction.mutatedEvents, mutatedKeysByDefId);
-            var populate = function (key) {
-                if (!splitStates[key]) {
-                    splitStates[key] = {
-                        affectedEvents: affectedStores_1[key] || EMPTY_EVENT_STORE,
-                        mutatedEvents: mutatedStores_1[key] || EMPTY_EVENT_STORE,
-                        isEvent: interaction.isEvent,
-                        origSeg: interaction.origSeg
-                    };
-                }
-            };
-            for (var key in affectedStores_1) {
-                populate(key);
-            }
-            for (var key in mutatedStores_1) {
-                populate(key);
-            }
-        }
-        return splitStates;
-    };
-    return Splitter;
-}());
-function buildEventUiForKey(allUi, eventUiForKey, individualUi) {
-    var baseParts = [];
-    if (allUi) {
-        baseParts.push(allUi);
-    }
-    if (eventUiForKey) {
-        baseParts.push(eventUiForKey);
-    }
-    var stuff = {
-        '': combineEventUis(baseParts)
-    };
-    if (individualUi) {
-        __assign(stuff, individualUi);
-    }
-    return stuff;
-}
-
-// Generates HTML for an anchor to another view into the calendar.
-// Will either generate an <a> tag or a non-clickable <span> tag, depending on enabled settings.
-// `gotoOptions` can either be a DateMarker, or an object with the form:
-// { date, type, forceOff }
-// `type` is a view-type like "day" or "week". default value is "day".
-// `attrs` and `innerHtml` are use to generate the rest of the HTML tag.
-function buildGotoAnchorHtml(component, gotoOptions, attrs, innerHtml) {
-    var dateEnv = component.dateEnv;
-    var date;
-    var type;
-    var forceOff;
-    var finalOptions;
-    if (gotoOptions instanceof Date) {
-        date = gotoOptions; // a single date-like input
-    }
-    else {
-        date = gotoOptions.date;
-        type = gotoOptions.type;
-        forceOff = gotoOptions.forceOff;
-    }
-    finalOptions = {
-        date: dateEnv.formatIso(date, { omitTime: true }),
-        type: type || 'day'
-    };
-    if (typeof attrs === 'string') {
-        innerHtml = attrs;
-        attrs = null;
-    }
-    attrs = attrs ? ' ' + attrsToStr(attrs) : ''; // will have a leading space
-    innerHtml = innerHtml || '';
-    if (!forceOff && component.opt('navLinks')) {
-        return '<a' + attrs +
-            ' data-goto="' + htmlEscape(JSON.stringify(finalOptions)) + '">' +
-            innerHtml +
-            '</a>';
-    }
-    else {
-        return '<span' + attrs + '>' +
-            innerHtml +
-            '</span>';
-    }
-}
-function getAllDayHtml(component) {
-    return component.opt('allDayHtml') || htmlEscape(component.opt('allDayText'));
-}
-// Computes HTML classNames for a single-day element
-function getDayClasses(date, dateProfile, context, noThemeHighlight) {
-    var calendar = context.calendar, view = context.view, theme = context.theme, dateEnv = context.dateEnv;
-    var classes = [];
-    var todayStart;
-    var todayEnd;
-    if (!rangeContainsMarker(dateProfile.activeRange, date)) {
-        classes.push('fc-disabled-day');
-    }
-    else {
-        classes.push('fc-' + DAY_IDS[date.getUTCDay()]);
-        if (view.opt('monthMode') &&
-            dateEnv.getMonth(date) !== dateEnv.getMonth(dateProfile.currentRange.start)) {
-            classes.push('fc-other-month');
-        }
-        todayStart = startOfDay(calendar.getNow());
-        todayEnd = addDays(todayStart, 1);
-        if (date < todayStart) {
-            classes.push('fc-past');
-        }
-        else if (date >= todayEnd) {
-            classes.push('fc-future');
-        }
-        else {
-            classes.push('fc-today');
-            if (noThemeHighlight !== true) {
-                classes.push(theme.getClass('today'));
-            }
-        }
-    }
-    return classes;
-}
-
-// given a function that resolves a result asynchronously.
-// the function can either call passed-in success and failure callbacks,
-// or it can return a promise.
-// if you need to pass additional params to func, bind them first.
-function unpromisify(func, success, failure) {
-    // guard against success/failure callbacks being called more than once
-    // and guard against a promise AND callback being used together.
-    var isResolved = false;
-    var wrappedSuccess = function () {
-        if (!isResolved) {
-            isResolved = true;
-            success.apply(this, arguments);
-        }
-    };
-    var wrappedFailure = function () {
-        if (!isResolved) {
-            isResolved = true;
-            if (failure) {
-                failure.apply(this, arguments);
-            }
-        }
-    };
-    var res = func(wrappedSuccess, wrappedFailure);
-    if (res && typeof res.then === 'function') {
-        res.then(wrappedSuccess, wrappedFailure);
-    }
-}
-
-var Mixin = /** @class */ (function () {
-    function Mixin() {
-    }
-    // mix into a CLASS
-    Mixin.mixInto = function (destClass) {
-        this.mixIntoObj(destClass.prototype);
-    };
-    // mix into ANY object
-    Mixin.mixIntoObj = function (destObj) {
-        var _this = this;
-        Object.getOwnPropertyNames(this.prototype).forEach(function (name) {
-            if (!destObj[name]) { // if destination doesn't already define it
-                destObj[name] = _this.prototype[name];
-            }
-        });
-    };
-    /*
-    will override existing methods
-    TODO: remove! not used anymore
-    */
-    Mixin.mixOver = function (destClass) {
-        var _this = this;
-        Object.getOwnPropertyNames(this.prototype).forEach(function (name) {
-            destClass.prototype[name] = _this.prototype[name];
-        });
-    };
-    return Mixin;
-}());
-
-/*
-USAGE:
-  import { default as EmitterMixin, EmitterInterface } from './EmitterMixin'
-in class:
-  on: EmitterInterface['on']
-  one: EmitterInterface['one']
-  off: EmitterInterface['off']
-  trigger: EmitterInterface['trigger']
-  triggerWith: EmitterInterface['triggerWith']
-  hasHandlers: EmitterInterface['hasHandlers']
-after class:
-  EmitterMixin.mixInto(TheClass)
-*/
-var EmitterMixin = /** @class */ (function (_super) {
-    __extends(EmitterMixin, _super);
-    function EmitterMixin() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    EmitterMixin.prototype.on = function (type, handler) {
-        addToHash(this._handlers || (this._handlers = {}), type, handler);
-        return this; // for chaining
-    };
-    // todo: add comments
-    EmitterMixin.prototype.one = function (type, handler) {
-        addToHash(this._oneHandlers || (this._oneHandlers = {}), type, handler);
-        return this; // for chaining
-    };
-    EmitterMixin.prototype.off = function (type, handler) {
-        if (this._handlers) {
-            removeFromHash(this._handlers, type, handler);
-        }
-        if (this._oneHandlers) {
-            removeFromHash(this._oneHandlers, type, handler);
-        }
-        return this; // for chaining
-    };
-    EmitterMixin.prototype.trigger = function (type) {
-        var args = [];
-        for (var _i = 1; _i < arguments.length; _i++) {
-            args[_i - 1] = arguments[_i];
-        }
-        this.triggerWith(type, this, args);
-        return this; // for chaining
-    };
-    EmitterMixin.prototype.triggerWith = function (type, context, args) {
-        if (this._handlers) {
-            applyAll(this._handlers[type], context, args);
-        }
-        if (this._oneHandlers) {
-            applyAll(this._oneHandlers[type], context, args);
-            delete this._oneHandlers[type]; // will never fire again
-        }
-        return this; // for chaining
-    };
-    EmitterMixin.prototype.hasHandlers = function (type) {
-        return (this._handlers && this._handlers[type] && this._handlers[type].length) ||
-            (this._oneHandlers && this._oneHandlers[type] && this._oneHandlers[type].length);
-    };
-    return EmitterMixin;
-}(Mixin));
-function addToHash(hash, type, handler) {
-    (hash[type] || (hash[type] = []))
-        .push(handler);
-}
-function removeFromHash(hash, type, handler) {
-    if (handler) {
-        if (hash[type]) {
-            hash[type] = hash[type].filter(function (func) {
-                return func !== handler;
-            });
-        }
-    }
-    else {
-        delete hash[type]; // remove all handler funcs for this type
-    }
-}
-
-/*
-Records offset information for a set of elements, relative to an origin element.
-Can record the left/right OR the top/bottom OR both.
-Provides methods for querying the cache by position.
-*/
-var PositionCache = /** @class */ (function () {
-    function PositionCache(originEl, els, isHorizontal, isVertical) {
-        this.originEl = originEl;
-        this.els = els;
-        this.isHorizontal = isHorizontal;
-        this.isVertical = isVertical;
-    }
-    // Queries the els for coordinates and stores them.
-    // Call this method before using and of the get* methods below.
-    PositionCache.prototype.build = function () {
-        var originEl = this.originEl;
-        var originClientRect = this.originClientRect =
-            originEl.getBoundingClientRect(); // relative to viewport top-left
-        if (this.isHorizontal) {
-            this.buildElHorizontals(originClientRect.left);
-        }
-        if (this.isVertical) {
-            this.buildElVerticals(originClientRect.top);
-        }
-    };
-    // Populates the left/right internal coordinate arrays
-    PositionCache.prototype.buildElHorizontals = function (originClientLeft) {
-        var lefts = [];
-        var rights = [];
-        for (var _i = 0, _a = this.els; _i < _a.length; _i++) {
-            var el = _a[_i];
-            var rect = el.getBoundingClientRect();
-            lefts.push(rect.left - originClientLeft);
-            rights.push(rect.right - originClientLeft);
-        }
-        this.lefts = lefts;
-        this.rights = rights;
-    };
-    // Populates the top/bottom internal coordinate arrays
-    PositionCache.prototype.buildElVerticals = function (originClientTop) {
-        var tops = [];
-        var bottoms = [];
-        for (var _i = 0, _a = this.els; _i < _a.length; _i++) {
-            var el = _a[_i];
-            var rect = el.getBoundingClientRect();
-            tops.push(rect.top - originClientTop);
-            bottoms.push(rect.bottom - originClientTop);
-        }
-        this.tops = tops;
-        this.bottoms = bottoms;
-    };
-    // Given a left offset (from document left), returns the index of the el that it horizontally intersects.
-    // If no intersection is made, returns undefined.
-    PositionCache.prototype.leftToIndex = function (leftPosition) {
-        var lefts = this.lefts;
-        var rights = this.rights;
-        var len = lefts.length;
-        var i;
-        for (i = 0; i < len; i++) {
-            if (leftPosition >= lefts[i] && leftPosition < rights[i]) {
-                return i;
-            }
-        }
-    };
-    // Given a top offset (from document top), returns the index of the el that it vertically intersects.
-    // If no intersection is made, returns undefined.
-    PositionCache.prototype.topToIndex = function (topPosition) {
-        var tops = this.tops;
-        var bottoms = this.bottoms;
-        var len = tops.length;
-        var i;
-        for (i = 0; i < len; i++) {
-            if (topPosition >= tops[i] && topPosition < bottoms[i]) {
-                return i;
-            }
-        }
-    };
-    // Gets the width of the element at the given index
-    PositionCache.prototype.getWidth = function (leftIndex) {
-        return this.rights[leftIndex] - this.lefts[leftIndex];
-    };
-    // Gets the height of the element at the given index
-    PositionCache.prototype.getHeight = function (topIndex) {
-        return this.bottoms[topIndex] - this.tops[topIndex];
-    };
-    return PositionCache;
-}());
-
-/*
-An object for getting/setting scroll-related information for an element.
-Internally, this is done very differently for window versus DOM element,
-so this object serves as a common interface.
-*/
-var ScrollController = /** @class */ (function () {
-    function ScrollController() {
-    }
-    ScrollController.prototype.getMaxScrollTop = function () {
-        return this.getScrollHeight() - this.getClientHeight();
-    };
-    ScrollController.prototype.getMaxScrollLeft = function () {
-        return this.getScrollWidth() - this.getClientWidth();
-    };
-    ScrollController.prototype.canScrollVertically = function () {
-        return this.getMaxScrollTop() > 0;
-    };
-    ScrollController.prototype.canScrollHorizontally = function () {
-        return this.getMaxScrollLeft() > 0;
-    };
-    ScrollController.prototype.canScrollUp = function () {
-        return this.getScrollTop() > 0;
-    };
-    ScrollController.prototype.canScrollDown = function () {
-        return this.getScrollTop() < this.getMaxScrollTop();
-    };
-    ScrollController.prototype.canScrollLeft = function () {
-        return this.getScrollLeft() > 0;
-    };
-    ScrollController.prototype.canScrollRight = function () {
-        return this.getScrollLeft() < this.getMaxScrollLeft();
-    };
-    return ScrollController;
-}());
-var ElementScrollController = /** @class */ (function (_super) {
-    __extends(ElementScrollController, _super);
-    function ElementScrollController(el) {
-        var _this = _super.call(this) || this;
-        _this.el = el;
-        return _this;
-    }
-    ElementScrollController.prototype.getScrollTop = function () {
-        return this.el.scrollTop;
-    };
-    ElementScrollController.prototype.getScrollLeft = function () {
-        return this.el.scrollLeft;
-    };
-    ElementScrollController.prototype.setScrollTop = function (top) {
-        this.el.scrollTop = top;
-    };
-    ElementScrollController.prototype.setScrollLeft = function (left) {
-        this.el.scrollLeft = left;
-    };
-    ElementScrollController.prototype.getScrollWidth = function () {
-        return this.el.scrollWidth;
-    };
-    ElementScrollController.prototype.getScrollHeight = function () {
-        return this.el.scrollHeight;
-    };
-    ElementScrollController.prototype.getClientHeight = function () {
-        return this.el.clientHeight;
-    };
-    ElementScrollController.prototype.getClientWidth = function () {
-        return this.el.clientWidth;
-    };
-    return ElementScrollController;
-}(ScrollController));
-var WindowScrollController = /** @class */ (function (_super) {
-    __extends(WindowScrollController, _super);
-    function WindowScrollController() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    WindowScrollController.prototype.getScrollTop = function () {
-        return window.pageYOffset;
-    };
-    WindowScrollController.prototype.getScrollLeft = function () {
-        return window.pageXOffset;
-    };
-    WindowScrollController.prototype.setScrollTop = function (n) {
-        window.scroll(window.pageXOffset, n);
-    };
-    WindowScrollController.prototype.setScrollLeft = function (n) {
-        window.scroll(n, window.pageYOffset);
-    };
-    WindowScrollController.prototype.getScrollWidth = function () {
-        return document.documentElement.scrollWidth;
-    };
-    WindowScrollController.prototype.getScrollHeight = function () {
-        return document.documentElement.scrollHeight;
-    };
-    WindowScrollController.prototype.getClientHeight = function () {
-        return document.documentElement.clientHeight;
-    };
-    WindowScrollController.prototype.getClientWidth = function () {
-        return document.documentElement.clientWidth;
-    };
-    return WindowScrollController;
-}(ScrollController));
-
-/*
-Embodies a div that has potential scrollbars
-*/
-var ScrollComponent = /** @class */ (function (_super) {
-    __extends(ScrollComponent, _super);
-    function ScrollComponent(overflowX, overflowY) {
-        var _this = _super.call(this, createElement('div', {
-            className: 'fc-scroller'
-        })) || this;
-        _this.overflowX = overflowX;
-        _this.overflowY = overflowY;
-        _this.applyOverflow();
-        return _this;
-    }
-    // sets to natural height, unlocks overflow
-    ScrollComponent.prototype.clear = function () {
-        this.setHeight('auto');
-        this.applyOverflow();
-    };
-    ScrollComponent.prototype.destroy = function () {
-        removeElement(this.el);
-    };
-    // Overflow
-    // -----------------------------------------------------------------------------------------------------------------
-    ScrollComponent.prototype.applyOverflow = function () {
-        applyStyle(this.el, {
-            overflowX: this.overflowX,
-            overflowY: this.overflowY
-        });
-    };
-    // Causes any 'auto' overflow values to resolves to 'scroll' or 'hidden'.
-    // Useful for preserving scrollbar widths regardless of future resizes.
-    // Can pass in scrollbarWidths for optimization.
-    ScrollComponent.prototype.lockOverflow = function (scrollbarWidths) {
-        var overflowX = this.overflowX;
-        var overflowY = this.overflowY;
-        scrollbarWidths = scrollbarWidths || this.getScrollbarWidths();
-        if (overflowX === 'auto') {
-            overflowX = (scrollbarWidths.bottom || // horizontal scrollbars?
-                this.canScrollHorizontally() // OR scrolling pane with massless scrollbars?
-            ) ? 'scroll' : 'hidden';
-        }
-        if (overflowY === 'auto') {
-            overflowY = (scrollbarWidths.left || scrollbarWidths.right || // horizontal scrollbars?
-                this.canScrollVertically() // OR scrolling pane with massless scrollbars?
-            ) ? 'scroll' : 'hidden';
-        }
-        applyStyle(this.el, { overflowX: overflowX, overflowY: overflowY });
-    };
-    ScrollComponent.prototype.setHeight = function (height) {
-        applyStyleProp(this.el, 'height', height);
-    };
-    ScrollComponent.prototype.getScrollbarWidths = function () {
-        var edges = computeEdges(this.el);
-        return {
-            left: edges.scrollbarLeft,
-            right: edges.scrollbarRight,
-            bottom: edges.scrollbarBottom
-        };
-    };
-    return ScrollComponent;
-}(ElementScrollController));
-
-var Theme = /** @class */ (function () {
-    function Theme(calendarOptions) {
-        this.calendarOptions = calendarOptions;
-        this.processIconOverride();
-    }
-    Theme.prototype.processIconOverride = function () {
-        if (this.iconOverrideOption) {
-            this.setIconOverride(this.calendarOptions[this.iconOverrideOption]);
-        }
-    };
-    Theme.prototype.setIconOverride = function (iconOverrideHash) {
-        var iconClassesCopy;
-        var buttonName;
-        if (typeof iconOverrideHash === 'object' && iconOverrideHash) { // non-null object
-            iconClassesCopy = __assign({}, this.iconClasses);
-            for (buttonName in iconOverrideHash) {
-                iconClassesCopy[buttonName] = this.applyIconOverridePrefix(iconOverrideHash[buttonName]);
-            }
-            this.iconClasses = iconClassesCopy;
-        }
-        else if (iconOverrideHash === false) {
-            this.iconClasses = {};
-        }
-    };
-    Theme.prototype.applyIconOverridePrefix = function (className) {
-        var prefix = this.iconOverridePrefix;
-        if (prefix && className.indexOf(prefix) !== 0) { // if not already present
-            className = prefix + className;
-        }
-        return className;
-    };
-    Theme.prototype.getClass = function (key) {
-        return this.classes[key] || '';
-    };
-    Theme.prototype.getIconClass = function (buttonName) {
-        var className = this.iconClasses[buttonName];
-        if (className) {
-            return this.baseIconClass + ' ' + className;
-        }
-        return '';
-    };
-    Theme.prototype.getCustomButtonIconClass = function (customButtonProps) {
-        var className;
-        if (this.iconOverrideCustomButtonOption) {
-            className = customButtonProps[this.iconOverrideCustomButtonOption];
-            if (className) {
-                return this.baseIconClass + ' ' + this.applyIconOverridePrefix(className);
-            }
-        }
-        return '';
-    };
-    return Theme;
-}());
-Theme.prototype.classes = {};
-Theme.prototype.iconClasses = {};
-Theme.prototype.baseIconClass = '';
-Theme.prototype.iconOverridePrefix = '';
-
-var guid = 0;
-var Component = /** @class */ (function () {
-    function Component(context, isView) {
-        // HACK to populate view at top of component instantiation call chain
-        if (isView) {
-            context.view = this;
-        }
-        this.uid = String(guid++);
-        this.context = context;
-        this.dateEnv = context.dateEnv;
-        this.theme = context.theme;
-        this.view = context.view;
-        this.calendar = context.calendar;
-        this.isRtl = this.opt('dir') === 'rtl';
-    }
-    Component.addEqualityFuncs = function (newFuncs) {
-        this.prototype.equalityFuncs = __assign({}, this.prototype.equalityFuncs, newFuncs);
-    };
-    Component.prototype.opt = function (name) {
-        return this.context.options[name];
-    };
-    Component.prototype.receiveProps = function (props) {
-        var _a = recycleProps(this.props || {}, props, this.equalityFuncs), anyChanges = _a.anyChanges, comboProps = _a.comboProps;
-        this.props = comboProps;
-        if (anyChanges) {
-            this.render(comboProps);
-        }
-    };
-    Component.prototype.render = function (props) {
-    };
-    // after destroy is called, this component won't ever be used again
-    Component.prototype.destroy = function () {
-    };
-    return Component;
-}());
-Component.prototype.equalityFuncs = {};
-/*
-Reuses old values when equal. If anything is unequal, returns newProps as-is.
-Great for PureComponent, but won't be feasible with React, so just eliminate and use React's DOM diffing.
-*/
-function recycleProps(oldProps, newProps, equalityFuncs) {
-    var comboProps = {}; // some old, some new
-    var anyChanges = false;
-    for (var key in newProps) {
-        if (key in oldProps && (oldProps[key] === newProps[key] ||
-            (equalityFuncs[key] && equalityFuncs[key](oldProps[key], newProps[key])))) {
-            // equal to old? use old prop
-            comboProps[key] = oldProps[key];
-        }
-        else {
-            comboProps[key] = newProps[key];
-            anyChanges = true;
-        }
-    }
-    for (var key in oldProps) {
-        if (!(key in newProps)) {
-            anyChanges = true;
-            break;
-        }
-    }
-    return { anyChanges: anyChanges, comboProps: comboProps };
-}
-
-/*
-PURPOSES:
-- hook up to fg, fill, and mirror renderers
-- interface for dragging and hits
-*/
-var DateComponent = /** @class */ (function (_super) {
-    __extends(DateComponent, _super);
-    function DateComponent(context, el, isView) {
-        var _this = _super.call(this, context, isView) || this;
-        _this.el = el;
-        return _this;
-    }
-    DateComponent.prototype.destroy = function () {
-        _super.prototype.destroy.call(this);
-        removeElement(this.el);
-    };
-    // TODO: WHAT ABOUT (sourceSeg && sourceSeg.component.doesDragMirror)
-    //
-    // Event Drag-n-Drop Rendering (for both events and external elements)
-    // ---------------------------------------------------------------------------------------------------------------
-    /*
-    renderEventDragSegs(state: EventSegUiInteractionState) {
-      if (state) {
-        let { isEvent, segs, sourceSeg } = state
-  
-        if (this.eventRenderer) {
-          this.eventRenderer.hideByHash(state.affectedInstances)
-        }
-  
-        // if the user is dragging something that is considered an event with real event data,
-        // and this component likes to do drag mirrors OR the component where the seg came from
-        // likes to do drag mirrors, then render a drag mirror.
-        if (isEvent && (this.doesDragMirror || sourceSeg && sourceSeg.component.doesDragMirror)) {
-          if (this.mirrorRenderer) {
-            this.mirrorRenderer.renderSegs(segs, { isDragging: true, sourceSeg })
-          }
-        }
-  
-        // if it would be impossible to render a drag mirror OR this component likes to render
-        // highlights, then render a highlight.
-        if (!isEvent || this.doesDragHighlight) {
-          if (this.fillRenderer) {
-            this.fillRenderer.renderSegs('highlight', segs)
-          }
-        }
-      }
-    }
-    */
-    // Hit System
-    // -----------------------------------------------------------------------------------------------------------------
-    DateComponent.prototype.buildPositionCaches = function () {
-    };
-    DateComponent.prototype.queryHit = function (positionLeft, positionTop, elWidth, elHeight) {
-        return null; // this should be abstract
-    };
-    // Validation
-    // -----------------------------------------------------------------------------------------------------------------
-    DateComponent.prototype.isInteractionValid = function (interaction) {
-        var calendar = this.calendar;
-        var dateProfile = this.props.dateProfile; // HACK
-        var instances = interaction.mutatedEvents.instances;
-        if (dateProfile) { // HACK for DayTile
-            for (var instanceId in instances) {
-                if (!rangeContainsRange(dateProfile.validRange, instances[instanceId].range)) {
-                    return false;
-                }
-            }
-        }
-        return isInteractionValid(interaction, calendar);
-    };
-    DateComponent.prototype.isDateSelectionValid = function (selection) {
-        var dateProfile = this.props.dateProfile; // HACK
-        if (dateProfile && // HACK for DayTile
-            !rangeContainsRange(dateProfile.validRange, selection.range)) {
-            return false;
-        }
-        return isDateSelectionValid(selection, this.calendar);
-    };
-    // Triggering
-    // -----------------------------------------------------------------------------------------------------------------
-    // TODO: move to Calendar
-    DateComponent.prototype.publiclyTrigger = function (name, args) {
-        var calendar = this.calendar;
-        return calendar.publiclyTrigger(name, args);
-    };
-    DateComponent.prototype.publiclyTriggerAfterSizing = function (name, args) {
-        var calendar = this.calendar;
-        return calendar.publiclyTriggerAfterSizing(name, args);
-    };
-    DateComponent.prototype.hasPublicHandlers = function (name) {
-        var calendar = this.calendar;
-        return calendar.hasPublicHandlers(name);
-    };
-    DateComponent.prototype.triggerRenderedSegs = function (segs, isMirrors) {
-        var calendar = this.calendar;
-        if (this.hasPublicHandlers('eventPositioned')) {
-            for (var _i = 0, segs_1 = segs; _i < segs_1.length; _i++) {
-                var seg = segs_1[_i];
-                this.publiclyTriggerAfterSizing('eventPositioned', [
-                    {
-                        event: new EventApi(calendar, seg.eventRange.def, seg.eventRange.instance),
-                        isMirror: isMirrors,
-                        isStart: seg.isStart,
-                        isEnd: seg.isEnd,
-                        el: seg.el,
-                        view: this // safe to cast because this method is only called on context.view
-                    }
-                ]);
-            }
-        }
-        if (!calendar.state.loadingLevel) { // avoid initial empty state while pending
-            calendar.afterSizingTriggers._eventsPositioned = [null]; // fire once
-        }
-    };
-    DateComponent.prototype.triggerWillRemoveSegs = function (segs, isMirrors) {
-        var calendar = this.calendar;
-        for (var _i = 0, segs_2 = segs; _i < segs_2.length; _i++) {
-            var seg = segs_2[_i];
-            calendar.trigger('eventElRemove', seg.el);
-        }
-        if (this.hasPublicHandlers('eventDestroy')) {
-            for (var _a = 0, segs_3 = segs; _a < segs_3.length; _a++) {
-                var seg = segs_3[_a];
-                this.publiclyTrigger('eventDestroy', [
-                    {
-                        event: new EventApi(calendar, seg.eventRange.def, seg.eventRange.instance),
-                        isMirror: isMirrors,
-                        el: seg.el,
-                        view: this // safe to cast because this method is only called on context.view
-                    }
-                ]);
-            }
-        }
-    };
-    // Pointer Interaction Utils
-    // -----------------------------------------------------------------------------------------------------------------
-    DateComponent.prototype.isValidSegDownEl = function (el) {
-        return !this.props.eventDrag && // HACK
-            !this.props.eventResize && // HACK
-            !elementClosest(el, '.fc-mirror') &&
-            (this.isPopover() || !this.isInPopover(el));
-        // ^above line ensures we don't detect a seg interaction within a nested component.
-        // it's a HACK because it only supports a popover as the nested component.
-    };
-    DateComponent.prototype.isValidDateDownEl = function (el) {
-        var segEl = elementClosest(el, this.fgSegSelector);
-        return (!segEl || segEl.classList.contains('fc-mirror')) &&
-            !elementClosest(el, '.fc-more') && // a "more.." link
-            !elementClosest(el, 'a[data-goto]') && // a clickable nav link
-            !this.isInPopover(el);
-    };
-    DateComponent.prototype.isPopover = function () {
-        return this.el.classList.contains('fc-popover');
-    };
-    DateComponent.prototype.isInPopover = function (el) {
-        return Boolean(elementClosest(el, '.fc-popover'));
-    };
-    return DateComponent;
-}(Component));
-DateComponent.prototype.fgSegSelector = '.fc-event-container > *';
-DateComponent.prototype.bgSegSelector = '.fc-bgevent:not(.fc-nonbusiness)';
-
-var uid$1 = 0;
-function createPlugin(input) {
-    return {
-        id: String(uid$1++),
-        deps: input.deps || [],
-        reducers: input.reducers || [],
-        eventDefParsers: input.eventDefParsers || [],
-        isDraggableTransformers: input.isDraggableTransformers || [],
-        eventDragMutationMassagers: input.eventDragMutationMassagers || [],
-        eventDefMutationAppliers: input.eventDefMutationAppliers || [],
-        dateSelectionTransformers: input.dateSelectionTransformers || [],
-        datePointTransforms: input.datePointTransforms || [],
-        dateSpanTransforms: input.dateSpanTransforms || [],
-        views: input.views || {},
-        viewPropsTransformers: input.viewPropsTransformers || [],
-        isPropsValid: input.isPropsValid || null,
-        externalDefTransforms: input.externalDefTransforms || [],
-        eventResizeJoinTransforms: input.eventResizeJoinTransforms || [],
-        viewContainerModifiers: input.viewContainerModifiers || [],
-        eventDropTransformers: input.eventDropTransformers || [],
-        componentInteractions: input.componentInteractions || [],
-        calendarInteractions: input.calendarInteractions || [],
-        themeClasses: input.themeClasses || {},
-        eventSourceDefs: input.eventSourceDefs || [],
-        cmdFormatter: input.cmdFormatter,
-        recurringTypes: input.recurringTypes || [],
-        namedTimeZonedImpl: input.namedTimeZonedImpl,
-        defaultView: input.defaultView || '',
-        elementDraggingImpl: input.elementDraggingImpl,
-        optionChangeHandlers: input.optionChangeHandlers || {}
-    };
-}
-var PluginSystem = /** @class */ (function () {
-    function PluginSystem() {
-        this.hooks = {
-            reducers: [],
-            eventDefParsers: [],
-            isDraggableTransformers: [],
-            eventDragMutationMassagers: [],
-            eventDefMutationAppliers: [],
-            dateSelectionTransformers: [],
-            datePointTransforms: [],
-            dateSpanTransforms: [],
-            views: {},
-            viewPropsTransformers: [],
-            isPropsValid: null,
-            externalDefTransforms: [],
-            eventResizeJoinTransforms: [],
-            viewContainerModifiers: [],
-            eventDropTransformers: [],
-            componentInteractions: [],
-            calendarInteractions: [],
-            themeClasses: {},
-            eventSourceDefs: [],
-            cmdFormatter: null,
-            recurringTypes: [],
-            namedTimeZonedImpl: null,
-            defaultView: '',
-            elementDraggingImpl: null,
-            optionChangeHandlers: {}
-        };
-        this.addedHash = {};
-    }
-    PluginSystem.prototype.add = function (plugin) {
-        if (!this.addedHash[plugin.id]) {
-            this.addedHash[plugin.id] = true;
-            for (var _i = 0, _a = plugin.deps; _i < _a.length; _i++) {
-                var dep = _a[_i];
-                this.add(dep);
-            }
-            this.hooks = combineHooks(this.hooks, plugin);
-        }
-    };
-    return PluginSystem;
-}());
-function combineHooks(hooks0, hooks1) {
-    return {
-        reducers: hooks0.reducers.concat(hooks1.reducers),
-        eventDefParsers: hooks0.eventDefParsers.concat(hooks1.eventDefParsers),
-        isDraggableTransformers: hooks0.isDraggableTransformers.concat(hooks1.isDraggableTransformers),
-        eventDragMutationMassagers: hooks0.eventDragMutationMassagers.concat(hooks1.eventDragMutationMassagers),
-        eventDefMutationAppliers: hooks0.eventDefMutationAppliers.concat(hooks1.eventDefMutationAppliers),
-        dateSelectionTransformers: hooks0.dateSelectionTransformers.concat(hooks1.dateSelectionTransformers),
-        datePointTransforms: hooks0.datePointTransforms.concat(hooks1.datePointTransforms),
-        dateSpanTransforms: hooks0.dateSpanTransforms.concat(hooks1.dateSpanTransforms),
-        views: __assign({}, hooks0.views, hooks1.views),
-        viewPropsTransformers: hooks0.viewPropsTransformers.concat(hooks1.viewPropsTransformers),
-        isPropsValid: hooks1.isPropsValid || hooks0.isPropsValid,
-        externalDefTransforms: hooks0.externalDefTransforms.concat(hooks1.externalDefTransforms),
-        eventResizeJoinTransforms: hooks0.eventResizeJoinTransforms.concat(hooks1.eventResizeJoinTransforms),
-        viewContainerModifiers: hooks0.viewContainerModifiers.concat(hooks1.viewContainerModifiers),
-        eventDropTransformers: hooks0.eventDropTransformers.concat(hooks1.eventDropTransformers),
-        calendarInteractions: hooks0.calendarInteractions.concat(hooks1.calendarInteractions),
-        componentInteractions: hooks0.componentInteractions.concat(hooks1.componentInteractions),
-        themeClasses: __assign({}, hooks0.themeClasses, hooks1.themeClasses),
-        eventSourceDefs: hooks0.eventSourceDefs.concat(hooks1.eventSourceDefs),
-        cmdFormatter: hooks1.cmdFormatter || hooks0.cmdFormatter,
-        recurringTypes: hooks0.recurringTypes.concat(hooks1.recurringTypes),
-        namedTimeZonedImpl: hooks1.namedTimeZonedImpl || hooks0.namedTimeZonedImpl,
-        defaultView: hooks0.defaultView || hooks1.defaultView,
-        elementDraggingImpl: hooks0.elementDraggingImpl || hooks1.elementDraggingImpl,
-        optionChangeHandlers: __assign({}, hooks0.optionChangeHandlers, hooks1.optionChangeHandlers)
-    };
-}
-
-var eventSourceDef = {
-    ignoreRange: true,
-    parseMeta: function (raw) {
-        if (Array.isArray(raw)) { // short form
-            return raw;
-        }
-        else if (Array.isArray(raw.events)) {
-            return raw.events;
-        }
-        return null;
-    },
-    fetch: function (arg, success) {
-        success({
-            rawEvents: arg.eventSource.meta
-        });
-    }
-};
-var ArrayEventSourcePlugin = createPlugin({
-    eventSourceDefs: [eventSourceDef]
-});
-
-var eventSourceDef$1 = {
-    parseMeta: function (raw) {
-        if (typeof raw === 'function') { // short form
-            return raw;
-        }
-        else if (typeof raw.events === 'function') {
-            return raw.events;
-        }
-        return null;
-    },
-    fetch: function (arg, success, failure) {
-        var dateEnv = arg.calendar.dateEnv;
-        var func = arg.eventSource.meta;
-        unpromisify(func.bind(null, {
-            start: dateEnv.toDate(arg.range.start),
-            end: dateEnv.toDate(arg.range.end),
-            startStr: dateEnv.formatIso(arg.range.start),
-            endStr: dateEnv.formatIso(arg.range.end),
-            timeZone: dateEnv.timeZone
-        }), function (rawEvents) {
-            success({ rawEvents: rawEvents }); // needs an object response
-        }, failure // send errorObj directly to failure callback
-        );
-    }
-};
-var FuncEventSourcePlugin = createPlugin({
-    eventSourceDefs: [eventSourceDef$1]
-});
-
-function requestJson(method, url, params, successCallback, failureCallback) {
-    method = method.toUpperCase();
-    var body = null;
-    if (method === 'GET') {
-        url = injectQueryStringParams(url, params);
-    }
-    else {
-        body = encodeParams(params);
-    }
-    var xhr = new XMLHttpRequest();
-    xhr.open(method, url, true);
-    if (method !== 'GET') {
-        xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
-    }
-    xhr.onload = function () {
-        if (xhr.status >= 200 && xhr.status < 400) {
-            try {
-                var res = JSON.parse(xhr.responseText);
-                successCallback(res, xhr);
-            }
-            catch (err) {
-                failureCallback('Failure parsing JSON', xhr);
-            }
-        }
-        else {
-            failureCallback('Request failed', xhr);
-        }
-    };
-    xhr.onerror = function () {
-        failureCallback('Request failed', xhr);
-    };
-    xhr.send(body);
-}
-function injectQueryStringParams(url, params) {
-    return url +
-        (url.indexOf('?') === -1 ? '?' : '&') +
-        encodeParams(params);
-}
-function encodeParams(params) {
-    var parts = [];
-    for (var key in params) {
-        parts.push(encodeURIComponent(key) + '=' + encodeURIComponent(params[key]));
-    }
-    return parts.join('&');
-}
-
-var eventSourceDef$2 = {
-    parseMeta: function (raw) {
-        if (typeof raw === 'string') { // short form
-            raw = { url: raw };
-        }
-        else if (!raw || typeof raw !== 'object' || !raw.url) {
-            return null;
-        }
-        return {
-            url: raw.url,
-            method: (raw.method || 'GET').toUpperCase(),
-            extraParams: raw.extraParams,
-            startParam: raw.startParam,
-            endParam: raw.endParam,
-            timeZoneParam: raw.timeZoneParam
-        };
-    },
-    fetch: function (arg, success, failure) {
-        var meta = arg.eventSource.meta;
-        var requestParams = buildRequestParams(meta, arg.range, arg.calendar);
-        requestJson(meta.method, meta.url, requestParams, function (rawEvents, xhr) {
-            success({ rawEvents: rawEvents, xhr: xhr });
-        }, function (errorMessage, xhr) {
-            failure({ message: errorMessage, xhr: xhr });
-        });
-    }
-};
-var JsonFeedEventSourcePlugin = createPlugin({
-    eventSourceDefs: [eventSourceDef$2]
-});
-function buildRequestParams(meta, range, calendar) {
-    var dateEnv = calendar.dateEnv;
-    var startParam;
-    var endParam;
-    var timeZoneParam;
-    var customRequestParams;
-    var params = {};
-    startParam = meta.startParam;
-    if (startParam == null) {
-        startParam = calendar.opt('startParam');
-    }
-    endParam = meta.endParam;
-    if (endParam == null) {
-        endParam = calendar.opt('endParam');
-    }
-    timeZoneParam = meta.timeZoneParam;
-    if (timeZoneParam == null) {
-        timeZoneParam = calendar.opt('timeZoneParam');
-    }
-    // retrieve any outbound GET/POST data from the options
-    if (typeof meta.extraParams === 'function') {
-        // supplied as a function that returns a key/value object
-        customRequestParams = meta.extraParams();
-    }
-    else {
-        // probably supplied as a straight key/value object
-        customRequestParams = meta.extraParams || {};
-    }
-    __assign(params, customRequestParams);
-    params[startParam] = dateEnv.formatIso(range.start);
-    params[endParam] = dateEnv.formatIso(range.end);
-    if (dateEnv.timeZone !== 'local') {
-        params[timeZoneParam] = dateEnv.timeZone;
-    }
-    return params;
-}
-
-var recurring = {
-    parse: function (rawEvent, leftoverProps, dateEnv) {
-        var createMarker = dateEnv.createMarker.bind(dateEnv);
-        var processors = {
-            daysOfWeek: null,
-            startTime: createDuration,
-            endTime: createDuration,
-            startRecur: createMarker,
-            endRecur: createMarker
-        };
-        var props = refineProps(rawEvent, processors, {}, leftoverProps);
-        var anyValid = false;
-        for (var propName in props) {
-            if (props[propName] != null) {
-                anyValid = true;
-                break;
-            }
-        }
-        if (anyValid) {
-            var duration = null;
-            if ('duration' in leftoverProps) {
-                duration = createDuration(leftoverProps.duration);
-                delete leftoverProps.duration;
-            }
-            if (!duration && props.startTime && props.endTime) {
-                duration = subtractDurations(props.endTime, props.startTime);
-            }
-            return {
-                allDayGuess: Boolean(!props.startTime && !props.endTime),
-                duration: duration,
-                typeData: props // doesn't need endTime anymore but oh well
-            };
-        }
-        return null;
-    },
-    expand: function (typeData, framingRange, dateEnv) {
-        var clippedFramingRange = intersectRanges(framingRange, { start: typeData.startRecur, end: typeData.endRecur });
-        if (clippedFramingRange) {
-            return expandRanges(typeData.daysOfWeek, typeData.startTime, clippedFramingRange, dateEnv);
-        }
-        else {
-            return [];
-        }
-    }
-};
-var SimpleRecurrencePlugin = createPlugin({
-    recurringTypes: [recurring]
-});
-function expandRanges(daysOfWeek, startTime, framingRange, dateEnv) {
-    var dowHash = daysOfWeek ? arrayToHash(daysOfWeek) : null;
-    var dayMarker = startOfDay(framingRange.start);
-    var endMarker = framingRange.end;
-    var instanceStarts = [];
-    while (dayMarker < endMarker) {
-        var instanceStart 
-        // if everyday, or this particular day-of-week
-        = void 0;
-        // if everyday, or this particular day-of-week
-        if (!dowHash || dowHash[dayMarker.getUTCDay()]) {
-            if (startTime) {
-                instanceStart = dateEnv.add(dayMarker, startTime);
-            }
-            else {
-                instanceStart = dayMarker;
-            }
-            instanceStarts.push(instanceStart);
-        }
-        dayMarker = addDays(dayMarker, 1);
-    }
-    return instanceStarts;
-}
-
-var DefaultOptionChangeHandlers = createPlugin({
-    optionChangeHandlers: {
-        events: function (events, calendar, deepEqual) {
-            handleEventSources([events], calendar, deepEqual);
-        },
-        eventSources: handleEventSources,
-        plugins: handlePlugins
-    }
-});
-function handleEventSources(inputs, calendar, deepEqual) {
-    var unfoundSources = hashValuesToArray(calendar.state.eventSources);
-    var newInputs = [];
-    for (var _i = 0, inputs_1 = inputs; _i < inputs_1.length; _i++) {
-        var input = inputs_1[_i];
-        var inputFound = false;
-        for (var i = 0; i < unfoundSources.length; i++) {
-            if (deepEqual(unfoundSources[i]._raw, input)) {
-                unfoundSources.splice(i, 1); // delete
-                inputFound = true;
-                break;
-            }
-        }
-        if (!inputFound) {
-            newInputs.push(input);
-        }
-    }
-    for (var _a = 0, unfoundSources_1 = unfoundSources; _a < unfoundSources_1.length; _a++) {
-        var unfoundSource = unfoundSources_1[_a];
-        calendar.dispatch({
-            type: 'REMOVE_EVENT_SOURCE',
-            sourceId: unfoundSource.sourceId
-        });
-    }
-    for (var _b = 0, newInputs_1 = newInputs; _b < newInputs_1.length; _b++) {
-        var newInput = newInputs_1[_b];
-        calendar.addEventSource(newInput);
-    }
-}
-// shortcoming: won't remove plugins
-function handlePlugins(inputs, calendar) {
-    calendar.addPluginInputs(inputs); // will gracefully handle duplicates
-}
-
-var config = {}; // TODO: make these options
-var globalDefaults = {
-    defaultRangeSeparator: ' - ',
-    titleRangeSeparator: ' \u2013 ',
-    defaultTimedEventDuration: '01:00:00',
-    defaultAllDayEventDuration: { day: 1 },
-    forceEventDuration: false,
-    nextDayThreshold: '00:00:00',
-    // display
-    columnHeader: true,
-    defaultView: '',
-    aspectRatio: 1.35,
-    header: {
-        left: 'title',
-        center: '',
-        right: 'today prev,next'
-    },
-    weekends: true,
-    weekNumbers: false,
-    weekNumberCalculation: 'local',
-    editable: false,
-    // nowIndicator: false,
-    scrollTime: '06:00:00',
-    minTime: '00:00:00',
-    maxTime: '24:00:00',
-    showNonCurrentDates: true,
-    // event ajax
-    lazyFetching: true,
-    startParam: 'start',
-    endParam: 'end',
-    timeZoneParam: 'timeZone',
-    timeZone: 'local',
-    // allDayDefault: undefined,
-    // locale
-    locales: [],
-    locale: '',
-    // dir: will get this from the default locale
-    // buttonIcons: null,
-    // allows setting a min-height to the event segment to prevent short events overlapping each other
-    timeGridEventMinHeight: 0,
-    themeSystem: 'standard',
-    // eventResizableFromStart: false,
-    dragRevertDuration: 500,
-    dragScroll: true,
-    allDayMaintainDuration: false,
-    // selectable: false,
-    unselectAuto: true,
-    // selectMinDistance: 0,
-    dropAccept: '*',
-    eventOrder: 'start,-duration,allDay,title',
-    // ^ if start tie, longer events go before shorter. final tie-breaker is title text
-    // rerenderDelay: null,
-    eventLimit: false,
-    eventLimitClick: 'popover',
-    dayPopoverFormat: { month: 'long', day: 'numeric', year: 'numeric' },
-    handleWindowResize: true,
-    windowResizeDelay: 100,
-    longPressDelay: 1000,
-    eventDragMinDistance: 5 // only applies to mouse
-};
-var rtlDefaults = {
-    header: {
-        left: 'next,prev today',
-        center: '',
-        right: 'title'
-    },
-    buttonIcons: {
-        // TODO: make RTL support the responibility of the theme
-        prev: 'fc-icon-chevron-right',
-        next: 'fc-icon-chevron-left',
-        prevYear: 'fc-icon-chevrons-right',
-        nextYear: 'fc-icon-chevrons-left'
-    }
-};
-var complexOptions = [
-    'header',
-    'footer',
-    'buttonText',
-    'buttonIcons'
-];
-// Merges an array of option objects into a single object
-function mergeOptions(optionObjs) {
-    return mergeProps(optionObjs, complexOptions);
-}
-// TODO: move this stuff to a "plugin"-related file...
-var INTERNAL_PLUGINS = [
-    ArrayEventSourcePlugin,
-    FuncEventSourcePlugin,
-    JsonFeedEventSourcePlugin,
-    SimpleRecurrencePlugin,
-    DefaultOptionChangeHandlers
-];
-function refinePluginDefs(pluginInputs) {
-    var plugins = [];
-    for (var _i = 0, pluginInputs_1 = pluginInputs; _i < pluginInputs_1.length; _i++) {
-        var pluginInput = pluginInputs_1[_i];
-        if (typeof pluginInput === 'string') {
-            var globalName = 'FullCalendar' + capitaliseFirstLetter(pluginInput);
-            if (!window[globalName]) {
-                console.warn('Plugin file not loaded for ' + pluginInput);
-            }
-            else {
-                plugins.push(window[globalName].default); // is an ES6 module
-            }
-        }
-        else {
-            plugins.push(pluginInput);
-        }
-    }
-    return INTERNAL_PLUGINS.concat(plugins);
-}
-
-var RAW_EN_LOCALE = {
-    code: 'en',
-    week: {
-        dow: 0,
-        doy: 4 // 4 days need to be within the year to be considered the first week
-    },
-    dir: 'ltr',
-    buttonText: {
-        prev: 'prev',
-        next: 'next',
-        prevYear: 'prev year',
-        nextYear: 'next year',
-        year: 'year',
-        today: 'today',
-        month: 'month',
-        week: 'week',
-        day: 'day',
-        list: 'list'
-    },
-    weekLabel: 'W',
-    allDayText: 'all-day',
-    eventLimitText: 'more',
-    noEventsMessage: 'No events to display'
-};
-function parseRawLocales(explicitRawLocales) {
-    var defaultCode = explicitRawLocales.length > 0 ? explicitRawLocales[0].code : 'en';
-    var globalArray = window['FullCalendarLocalesAll'] || []; // from locales-all.js
-    var globalObject = window['FullCalendarLocales'] || {}; // from locales/*.js. keys are meaningless
-    var allRawLocales = globalArray.concat(// globalArray is low prio
-    hashValuesToArray(globalObject), // medium prio
-    explicitRawLocales // highest prio
-    );
-    var rawLocaleMap = {
-        en: RAW_EN_LOCALE // necessary?
-    };
-    for (var _i = 0, allRawLocales_1 = allRawLocales; _i < allRawLocales_1.length; _i++) {
-        var rawLocale = allRawLocales_1[_i];
-        rawLocaleMap[rawLocale.code] = rawLocale;
-    }
-    return {
-        map: rawLocaleMap,
-        defaultCode: defaultCode
-    };
-}
-function buildLocale(inputSingular, available) {
-    if (typeof inputSingular === 'object' && !Array.isArray(inputSingular)) {
-        return parseLocale(inputSingular.code, [inputSingular.code], inputSingular);
-    }
-    else {
-        return queryLocale(inputSingular, available);
-    }
-}
-function queryLocale(codeArg, available) {
-    var codes = [].concat(codeArg || []); // will convert to array
-    var raw = queryRawLocale(codes, available) || RAW_EN_LOCALE;
-    return parseLocale(codeArg, codes, raw);
-}
-function queryRawLocale(codes, available) {
-    for (var i = 0; i < codes.length; i++) {
-        var parts = codes[i].toLocaleLowerCase().split('-');
-        for (var j = parts.length; j > 0; j--) {
-            var simpleId = parts.slice(0, j).join('-');
-            if (available[simpleId]) {
-                return available[simpleId];
-            }
-        }
-    }
-    return null;
-}
-function parseLocale(codeArg, codes, raw) {
-    var merged = mergeProps([RAW_EN_LOCALE, raw], ['buttonText']);
-    delete merged.code; // don't want this part of the options
-    var week = merged.week;
-    delete merged.week;
-    return {
-        codeArg: codeArg,
-        codes: codes,
-        week: week,
-        simpleNumberFormat: new Intl.NumberFormat(codeArg),
-        options: merged
-    };
-}
-
-var OptionsManager = /** @class */ (function () {
-    function OptionsManager(overrides) {
-        this.overrides = __assign({}, overrides); // make a copy
-        this.dynamicOverrides = {};
-        this.compute();
-    }
-    OptionsManager.prototype.mutate = function (updates, removals, isDynamic) {
-        var overrideHash = isDynamic ? this.dynamicOverrides : this.overrides;
-        __assign(overrideHash, updates);
-        for (var _i = 0, removals_1 = removals; _i < removals_1.length; _i++) {
-            var propName = removals_1[_i];
-            delete overrideHash[propName];
-        }
-        this.compute();
-    };
-    // Computes the flattened options hash for the calendar and assigns to `this.options`.
-    // Assumes this.overrides and this.dynamicOverrides have already been initialized.
-    OptionsManager.prototype.compute = function () {
-        // TODO: not a very efficient system
-        var locales = firstDefined(// explicit locale option given?
-        this.dynamicOverrides.locales, this.overrides.locales, globalDefaults.locales);
-        var locale = firstDefined(// explicit locales option given?
-        this.dynamicOverrides.locale, this.overrides.locale, globalDefaults.locale);
-        var available = parseRawLocales(locales);
-        var localeDefaults = buildLocale(locale || available.defaultCode, available.map).options;
-        var dir = firstDefined(// based on options computed so far, is direction RTL?
-        this.dynamicOverrides.dir, this.overrides.dir, localeDefaults.dir);
-        var dirDefaults = dir === 'rtl' ? rtlDefaults : {};
-        this.dirDefaults = dirDefaults;
-        this.localeDefaults = localeDefaults;
-        this.computed = mergeOptions([
-            globalDefaults,
-            dirDefaults,
-            localeDefaults,
-            this.overrides,
-            this.dynamicOverrides
-        ]);
-    };
-    return OptionsManager;
-}());
-
-var calendarSystemClassMap = {};
-function registerCalendarSystem(name, theClass) {
-    calendarSystemClassMap[name] = theClass;
-}
-function createCalendarSystem(name) {
-    return new calendarSystemClassMap[name]();
-}
-var GregorianCalendarSystem = /** @class */ (function () {
-    function GregorianCalendarSystem() {
-    }
-    GregorianCalendarSystem.prototype.getMarkerYear = function (d) {
-        return d.getUTCFullYear();
-    };
-    GregorianCalendarSystem.prototype.getMarkerMonth = function (d) {
-        return d.getUTCMonth();
-    };
-    GregorianCalendarSystem.prototype.getMarkerDay = function (d) {
-        return d.getUTCDate();
-    };
-    GregorianCalendarSystem.prototype.arrayToMarker = function (arr) {
-        return arrayToUtcDate(arr);
-    };
-    GregorianCalendarSystem.prototype.markerToArray = function (marker) {
-        return dateToUtcArray(marker);
-    };
-    return GregorianCalendarSystem;
-}());
-registerCalendarSystem('gregory', GregorianCalendarSystem);
-
-var ISO_RE = /^\s*(\d{4})(-(\d{2})(-(\d{2})([T ](\d{2}):(\d{2})(:(\d{2})(\.(\d+))?)?(Z|(([-+])(\d{2})(:?(\d{2}))?))?)?)?)?$/;
-function parse(str) {
-    var m = ISO_RE.exec(str);
-    if (m) {
-        var marker = new Date(Date.UTC(Number(m[1]), m[3] ? Number(m[3]) - 1 : 0, Number(m[5] || 1), Number(m[7] || 0), Number(m[8] || 0), Number(m[10] || 0), m[12] ? Number('0.' + m[12]) * 1000 : 0));
-        if (isValidDate(marker)) {
-            var timeZoneOffset = null;
-            if (m[13]) {
-                timeZoneOffset = (m[15] === '-' ? -1 : 1) * (Number(m[16] || 0) * 60 +
-                    Number(m[18] || 0));
-            }
-            return {
-                marker: marker,
-                isTimeUnspecified: !m[6],
-                timeZoneOffset: timeZoneOffset
-            };
-        }
-    }
-    return null;
-}
-
-var DateEnv = /** @class */ (function () {
-    function DateEnv(settings) {
-        var timeZone = this.timeZone = settings.timeZone;
-        var isNamedTimeZone = timeZone !== 'local' && timeZone !== 'UTC';
-        if (settings.namedTimeZoneImpl && isNamedTimeZone) {
-            this.namedTimeZoneImpl = new settings.namedTimeZoneImpl(timeZone);
-        }
-        this.canComputeOffset = Boolean(!isNamedTimeZone || this.namedTimeZoneImpl);
-        this.calendarSystem = createCalendarSystem(settings.calendarSystem);
-        this.locale = settings.locale;
-        this.weekDow = settings.locale.week.dow;
-        this.weekDoy = settings.locale.week.doy;
-        if (settings.weekNumberCalculation === 'ISO') {
-            this.weekDow = 1;
-            this.weekDoy = 4;
-        }
-        if (typeof settings.firstDay === 'number') {
-            this.weekDow = settings.firstDay;
-        }
-        if (typeof settings.weekNumberCalculation === 'function') {
-            this.weekNumberFunc = settings.weekNumberCalculation;
-        }
-        this.weekLabel = settings.weekLabel != null ? settings.weekLabel : settings.locale.options.weekLabel;
-        this.cmdFormatter = settings.cmdFormatter;
-    }
-    // Creating / Parsing
-    DateEnv.prototype.createMarker = function (input) {
-        var meta = this.createMarkerMeta(input);
-        if (meta === null) {
-            return null;
-        }
-        return meta.marker;
-    };
-    DateEnv.prototype.createNowMarker = function () {
-        if (this.canComputeOffset) {
-            return this.timestampToMarker(new Date().valueOf());
-        }
-        else {
-            // if we can't compute the current date val for a timezone,
-            // better to give the current local date vals than UTC
-            return arrayToUtcDate(dateToLocalArray(new Date()));
-        }
-    };
-    DateEnv.prototype.createMarkerMeta = function (input) {
-        if (typeof input === 'string') {
-            return this.parse(input);
-        }
-        var marker = null;
-        if (typeof input === 'number') {
-            marker = this.timestampToMarker(input);
-        }
-        else if (input instanceof Date) {
-            input = input.valueOf();
-            if (!isNaN(input)) {
-                marker = this.timestampToMarker(input);
-            }
-        }
-        else if (Array.isArray(input)) {
-            marker = arrayToUtcDate(input);
-        }
-        if (marker === null || !isValidDate(marker)) {
-            return null;
-        }
-        return { marker: marker, isTimeUnspecified: false, forcedTzo: null };
-    };
-    DateEnv.prototype.parse = function (s) {
-        var parts = parse(s);
-        if (parts === null) {
-            return null;
-        }
-        var marker = parts.marker;
-        var forcedTzo = null;
-        if (parts.timeZoneOffset !== null) {
-            if (this.canComputeOffset) {
-                marker = this.timestampToMarker(marker.valueOf() - parts.timeZoneOffset * 60 * 1000);
-            }
-            else {
-                forcedTzo = parts.timeZoneOffset;
-            }
-        }
-        return { marker: marker, isTimeUnspecified: parts.isTimeUnspecified, forcedTzo: forcedTzo };
-    };
-    // Accessors
-    DateEnv.prototype.getYear = function (marker) {
-        return this.calendarSystem.getMarkerYear(marker);
-    };
-    DateEnv.prototype.getMonth = function (marker) {
-        return this.calendarSystem.getMarkerMonth(marker);
-    };
-    // Adding / Subtracting
-    DateEnv.prototype.add = function (marker, dur) {
-        var a = this.calendarSystem.markerToArray(marker);
-        a[0] += dur.years;
-        a[1] += dur.months;
-        a[2] += dur.days;
-        a[6] += dur.milliseconds;
-        return this.calendarSystem.arrayToMarker(a);
-    };
-    DateEnv.prototype.subtract = function (marker, dur) {
-        var a = this.calendarSystem.markerToArray(marker);
-        a[0] -= dur.years;
-        a[1] -= dur.months;
-        a[2] -= dur.days;
-        a[6] -= dur.milliseconds;
-        return this.calendarSystem.arrayToMarker(a);
-    };
-    DateEnv.prototype.addYears = function (marker, n) {
-        var a = this.calendarSystem.markerToArray(marker);
-        a[0] += n;
-        return this.calendarSystem.arrayToMarker(a);
-    };
-    DateEnv.prototype.addMonths = function (marker, n) {
-        var a = this.calendarSystem.markerToArray(marker);
-        a[1] += n;
-        return this.calendarSystem.arrayToMarker(a);
-    };
-    // Diffing Whole Units
-    DateEnv.prototype.diffWholeYears = function (m0, m1) {
-        var calendarSystem = this.calendarSystem;
-        if (timeAsMs(m0) === timeAsMs(m1) &&
-            calendarSystem.getMarkerDay(m0) === calendarSystem.getMarkerDay(m1) &&
-            calendarSystem.getMarkerMonth(m0) === calendarSystem.getMarkerMonth(m1)) {
-            return calendarSystem.getMarkerYear(m1) - calendarSystem.getMarkerYear(m0);
-        }
-        return null;
-    };
-    DateEnv.prototype.diffWholeMonths = function (m0, m1) {
-        var calendarSystem = this.calendarSystem;
-        if (timeAsMs(m0) === timeAsMs(m1) &&
-            calendarSystem.getMarkerDay(m0) === calendarSystem.getMarkerDay(m1)) {
-            return (calendarSystem.getMarkerMonth(m1) - calendarSystem.getMarkerMonth(m0)) +
-                (calendarSystem.getMarkerYear(m1) - calendarSystem.getMarkerYear(m0)) * 12;
-        }
-        return null;
-    };
-    // Range / Duration
-    DateEnv.prototype.greatestWholeUnit = function (m0, m1) {
-        var n = this.diffWholeYears(m0, m1);
-        if (n !== null) {
-            return { unit: 'year', value: n };
-        }
-        n = this.diffWholeMonths(m0, m1);
-        if (n !== null) {
-            return { unit: 'month', value: n };
-        }
-        n = diffWholeWeeks(m0, m1);
-        if (n !== null) {
-            return { unit: 'week', value: n };
-        }
-        n = diffWholeDays(m0, m1);
-        if (n !== null) {
-            return { unit: 'day', value: n };
-        }
-        n = diffHours(m0, m1);
-        if (isInt(n)) {
-            return { unit: 'hour', value: n };
-        }
-        n = diffMinutes(m0, m1);
-        if (isInt(n)) {
-            return { unit: 'minute', value: n };
-        }
-        n = diffSeconds(m0, m1);
-        if (isInt(n)) {
-            return { unit: 'second', value: n };
-        }
-        return { unit: 'millisecond', value: m1.valueOf() - m0.valueOf() };
-    };
-    DateEnv.prototype.countDurationsBetween = function (m0, m1, d) {
-        // TODO: can use greatestWholeUnit
-        var diff;
-        if (d.years) {
-            diff = this.diffWholeYears(m0, m1);
-            if (diff !== null) {
-                return diff / asRoughYears(d);
-            }
-        }
-        if (d.months) {
-            diff = this.diffWholeMonths(m0, m1);
-            if (diff !== null) {
-                return diff / asRoughMonths(d);
-            }
-        }
-        if (d.days) {
-            diff = diffWholeDays(m0, m1);
-            if (diff !== null) {
-                return diff / asRoughDays(d);
-            }
-        }
-        return (m1.valueOf() - m0.valueOf()) / asRoughMs(d);
-    };
-    // Start-Of
-    DateEnv.prototype.startOf = function (m, unit) {
-        if (unit === 'year') {
-            return this.startOfYear(m);
-        }
-        else if (unit === 'month') {
-            return this.startOfMonth(m);
-        }
-        else if (unit === 'week') {
-            return this.startOfWeek(m);
-        }
-        else if (unit === 'day') {
-            return startOfDay(m);
-        }
-        else if (unit === 'hour') {
-            return startOfHour(m);
-        }
-        else if (unit === 'minute') {
-            return startOfMinute(m);
-        }
-        else if (unit === 'second') {
-            return startOfSecond(m);
-        }
-    };
-    DateEnv.prototype.startOfYear = function (m) {
-        return this.calendarSystem.arrayToMarker([
-            this.calendarSystem.getMarkerYear(m)
-        ]);
-    };
-    DateEnv.prototype.startOfMonth = function (m) {
-        return this.calendarSystem.arrayToMarker([
-            this.calendarSystem.getMarkerYear(m),
-            this.calendarSystem.getMarkerMonth(m)
-        ]);
-    };
-    DateEnv.prototype.startOfWeek = function (m) {
-        return this.calendarSystem.arrayToMarker([
-            this.calendarSystem.getMarkerYear(m),
-            this.calendarSystem.getMarkerMonth(m),
-            m.getUTCDate() - ((m.getUTCDay() - this.weekDow + 7) % 7)
-        ]);
-    };
-    // Week Number
-    DateEnv.prototype.computeWeekNumber = function (marker) {
-        if (this.weekNumberFunc) {
-            return this.weekNumberFunc(this.toDate(marker));
-        }
-        else {
-            return weekOfYear(marker, this.weekDow, this.weekDoy);
-        }
-    };
-    // TODO: choke on timeZoneName: long
-    DateEnv.prototype.format = function (marker, formatter, dateOptions) {
-        if (dateOptions === void 0) { dateOptions = {}; }
-        return formatter.format({
-            marker: marker,
-            timeZoneOffset: dateOptions.forcedTzo != null ?
-                dateOptions.forcedTzo :
-                this.offsetForMarker(marker)
-        }, this);
-    };
-    DateEnv.prototype.formatRange = function (start, end, formatter, dateOptions) {
-        if (dateOptions === void 0) { dateOptions = {}; }
-        if (dateOptions.isEndExclusive) {
-            end = addMs(end, -1);
-        }
-        return formatter.formatRange({
-            marker: start,
-            timeZoneOffset: dateOptions.forcedStartTzo != null ?
-                dateOptions.forcedStartTzo :
-                this.offsetForMarker(start)
-        }, {
-            marker: end,
-            timeZoneOffset: dateOptions.forcedEndTzo != null ?
-                dateOptions.forcedEndTzo :
-                this.offsetForMarker(end)
-        }, this);
-    };
-    DateEnv.prototype.formatIso = function (marker, extraOptions) {
-        if (extraOptions === void 0) { extraOptions = {}; }
-        var timeZoneOffset = null;
-        if (!extraOptions.omitTimeZoneOffset) {
-            if (extraOptions.forcedTzo != null) {
-                timeZoneOffset = extraOptions.forcedTzo;
-            }
-            else {
-                timeZoneOffset = this.offsetForMarker(marker);
-            }
-        }
-        return buildIsoString(marker, timeZoneOffset, extraOptions.omitTime);
-    };
-    // TimeZone
-    DateEnv.prototype.timestampToMarker = function (ms) {
-        if (this.timeZone === 'local') {
-            return arrayToUtcDate(dateToLocalArray(new Date(ms)));
-        }
-        else if (this.timeZone === 'UTC' || !this.namedTimeZoneImpl) {
-            return new Date(ms);
-        }
-        else {
-            return arrayToUtcDate(this.namedTimeZoneImpl.timestampToArray(ms));
-        }
-    };
-    DateEnv.prototype.offsetForMarker = function (m) {
-        if (this.timeZone === 'local') {
-            return -arrayToLocalDate(dateToUtcArray(m)).getTimezoneOffset(); // convert "inverse" offset to "normal" offset
-        }
-        else if (this.timeZone === 'UTC') {
-            return 0;
-        }
-        else if (this.namedTimeZoneImpl) {
-            return this.namedTimeZoneImpl.offsetForArray(dateToUtcArray(m));
-        }
-        return null;
-    };
-    // Conversion
-    DateEnv.prototype.toDate = function (m, forcedTzo) {
-        if (this.timeZone === 'local') {
-            return arrayToLocalDate(dateToUtcArray(m));
-        }
-        else if (this.timeZone === 'UTC') {
-            return new Date(m.valueOf()); // make sure it's a copy
-        }
-        else if (!this.namedTimeZoneImpl) {
-            return new Date(m.valueOf() - (forcedTzo || 0));
-        }
-        else {
-            return new Date(m.valueOf() -
-                this.namedTimeZoneImpl.offsetForArray(dateToUtcArray(m)) * 1000 * 60 // convert minutes -> ms
-            );
-        }
-    };
-    return DateEnv;
-}());
-
-var SIMPLE_SOURCE_PROPS = {
-    id: String,
-    allDayDefault: Boolean,
-    eventDataTransform: Function,
-    success: Function,
-    failure: Function
-};
-var uid$2 = 0;
-function doesSourceNeedRange(eventSource, calendar) {
-    var defs = calendar.pluginSystem.hooks.eventSourceDefs;
-    return !defs[eventSource.sourceDefId].ignoreRange;
-}
-function parseEventSource(raw, calendar) {
-    var defs = calendar.pluginSystem.hooks.eventSourceDefs;
-    for (var i = defs.length - 1; i >= 0; i--) { // later-added plugins take precedence
-        var def = defs[i];
-        var meta = def.parseMeta(raw);
-        if (meta) {
-            var res = parseEventSourceProps(typeof raw === 'object' ? raw : {}, meta, i, calendar);
-            res._raw = raw;
-            return res;
-        }
-    }
-    return null;
-}
-function parseEventSourceProps(raw, meta, sourceDefId, calendar) {
-    var leftovers0 = {};
-    var props = refineProps(raw, SIMPLE_SOURCE_PROPS, {}, leftovers0);
-    var leftovers1 = {};
-    var ui = processUnscopedUiProps(leftovers0, calendar, leftovers1);
-    props.isFetching = false;
-    props.latestFetchId = '';
-    props.fetchRange = null;
-    props.publicId = String(raw.id || '');
-    props.sourceId = String(uid$2++);
-    props.sourceDefId = sourceDefId;
-    props.meta = meta;
-    props.ui = ui;
-    props.extendedProps = leftovers1;
-    return props;
-}
-
-function reduceEventSources (eventSources, action, dateProfile, calendar) {
-    switch (action.type) {
-        case 'ADD_EVENT_SOURCES': // already parsed
-            return addSources(eventSources, action.sources, dateProfile ? dateProfile.activeRange : null, calendar);
-        case 'REMOVE_EVENT_SOURCE':
-            return removeSource(eventSources, action.sourceId);
-        case 'PREV': // TODO: how do we track all actions that affect dateProfile :(
-        case 'NEXT':
-        case 'SET_DATE':
-        case 'SET_VIEW_TYPE':
-            if (dateProfile) {
-                return fetchDirtySources(eventSources, dateProfile.activeRange, calendar);
-            }
-            else {
-                return eventSources;
-            }
-        case 'FETCH_EVENT_SOURCES':
-        case 'CHANGE_TIMEZONE':
-            return fetchSourcesByIds(eventSources, action.sourceIds ?
-                arrayToHash(action.sourceIds) :
-                excludeStaticSources(eventSources, calendar), dateProfile ? dateProfile.activeRange : null, calendar);
-        case 'RECEIVE_EVENTS':
-        case 'RECEIVE_EVENT_ERROR':
-            return receiveResponse(eventSources, action.sourceId, action.fetchId, action.fetchRange);
-        case 'REMOVE_ALL_EVENT_SOURCES':
-            return {};
-        default:
-            return eventSources;
-    }
-}
-var uid$3 = 0;
-function addSources(eventSourceHash, sources, fetchRange, calendar) {
-    var hash = {};
-    for (var _i = 0, sources_1 = sources; _i < sources_1.length; _i++) {
-        var source = sources_1[_i];
-        hash[source.sourceId] = source;
-    }
-    if (fetchRange) {
-        hash = fetchDirtySources(hash, fetchRange, calendar);
-    }
-    return __assign({}, eventSourceHash, hash);
-}
-function removeSource(eventSourceHash, sourceId) {
-    return filterHash(eventSourceHash, function (eventSource) {
-        return eventSource.sourceId !== sourceId;
-    });
-}
-function fetchDirtySources(sourceHash, fetchRange, calendar) {
-    return fetchSourcesByIds(sourceHash, filterHash(sourceHash, function (eventSource) {
-        return isSourceDirty(eventSource, fetchRange, calendar);
-    }), fetchRange, calendar);
-}
-function isSourceDirty(eventSource, fetchRange, calendar) {
-    if (!doesSourceNeedRange(eventSource, calendar)) {
-        return !eventSource.latestFetchId;
-    }
-    else {
-        return !calendar.opt('lazyFetching') ||
-            !eventSource.fetchRange ||
-            fetchRange.start < eventSource.fetchRange.start ||
-            fetchRange.end > eventSource.fetchRange.end;
-    }
-}
-function fetchSourcesByIds(prevSources, sourceIdHash, fetchRange, calendar) {
-    var nextSources = {};
-    for (var sourceId in prevSources) {
-        var source = prevSources[sourceId];
-        if (sourceIdHash[sourceId]) {
-            nextSources[sourceId] = fetchSource(source, fetchRange, calendar);
-        }
-        else {
-            nextSources[sourceId] = source;
-        }
-    }
-    return nextSources;
-}
-function fetchSource(eventSource, fetchRange, calendar) {
-    var sourceDef = calendar.pluginSystem.hooks.eventSourceDefs[eventSource.sourceDefId];
-    var fetchId = String(uid$3++);
-    sourceDef.fetch({
-        eventSource: eventSource,
-        calendar: calendar,
-        range: fetchRange
-    }, function (res) {
-        var rawEvents = res.rawEvents;
-        var calSuccess = calendar.opt('eventSourceSuccess');
-        var calSuccessRes;
-        var sourceSuccessRes;
-        if (eventSource.success) {
-            sourceSuccessRes = eventSource.success(rawEvents, res.xhr);
-        }
-        if (calSuccess) {
-            calSuccessRes = calSuccess(rawEvents, res.xhr);
-        }
-        rawEvents = sourceSuccessRes || calSuccessRes || rawEvents;
-        calendar.dispatch({
-            type: 'RECEIVE_EVENTS',
-            sourceId: eventSource.sourceId,
-            fetchId: fetchId,
-            fetchRange: fetchRange,
-            rawEvents: rawEvents
-        });
-    }, function (error) {
-        var callFailure = calendar.opt('eventSourceFailure');
-        console.warn(error.message, error);
-        if (eventSource.failure) {
-            eventSource.failure(error);
-        }
-        if (callFailure) {
-            callFailure(error);
-        }
-        calendar.dispatch({
-            type: 'RECEIVE_EVENT_ERROR',
-            sourceId: eventSource.sourceId,
-            fetchId: fetchId,
-            fetchRange: fetchRange,
-            error: error
-        });
-    });
-    return __assign({}, eventSource, { isFetching: true, latestFetchId: fetchId });
-}
-function receiveResponse(sourceHash, sourceId, fetchId, fetchRange) {
-    var _a;
-    var eventSource = sourceHash[sourceId];
-    if (eventSource && // not already removed
-        fetchId === eventSource.latestFetchId) {
-        return __assign({}, sourceHash, (_a = {}, _a[sourceId] = __assign({}, eventSource, { isFetching: false, fetchRange: fetchRange }), _a));
-    }
-    return sourceHash;
-}
-function excludeStaticSources(eventSources, calendar) {
-    return filterHash(eventSources, function (eventSource) {
-        return doesSourceNeedRange(eventSource, calendar);
-    });
-}
-
-var DateProfileGenerator = /** @class */ (function () {
-    function DateProfileGenerator(viewSpec, calendar) {
-        this.viewSpec = viewSpec;
-        this.options = viewSpec.options;
-        this.dateEnv = calendar.dateEnv;
-        this.calendar = calendar;
-        this.initHiddenDays();
-    }
-    /* Date Range Computation
-    ------------------------------------------------------------------------------------------------------------------*/
-    // Builds a structure with info about what the dates/ranges will be for the "prev" view.
-    DateProfileGenerator.prototype.buildPrev = function (currentDateProfile, currentDate) {
-        var dateEnv = this.dateEnv;
-        var prevDate = dateEnv.subtract(dateEnv.startOf(currentDate, currentDateProfile.currentRangeUnit), // important for start-of-month
-        currentDateProfile.dateIncrement);
-        return this.build(prevDate, -1);
-    };
-    // Builds a structure with info about what the dates/ranges will be for the "next" view.
-    DateProfileGenerator.prototype.buildNext = function (currentDateProfile, currentDate) {
-        var dateEnv = this.dateEnv;
-        var nextDate = dateEnv.add(dateEnv.startOf(currentDate, currentDateProfile.currentRangeUnit), // important for start-of-month
-        currentDateProfile.dateIncrement);
-        return this.build(nextDate, 1);
-    };
-    // Builds a structure holding dates/ranges for rendering around the given date.
-    // Optional direction param indicates whether the date is being incremented/decremented
-    // from its previous value. decremented = -1, incremented = 1 (default).
-    DateProfileGenerator.prototype.build = function (currentDate, direction, forceToValid) {
-        if (forceToValid === void 0) { forceToValid = false; }
-        var validRange;
-        var minTime = null;
-        var maxTime = null;
-        var currentInfo;
-        var isRangeAllDay;
-        var renderRange;
-        var activeRange;
-        var isValid;
-        validRange = this.buildValidRange();
-        validRange = this.trimHiddenDays(validRange);
-        if (forceToValid) {
-            currentDate = constrainMarkerToRange(currentDate, validRange);
-        }
-        currentInfo = this.buildCurrentRangeInfo(currentDate, direction);
-        isRangeAllDay = /^(year|month|week|day)$/.test(currentInfo.unit);
-        renderRange = this.buildRenderRange(this.trimHiddenDays(currentInfo.range), currentInfo.unit, isRangeAllDay);
-        renderRange = this.trimHiddenDays(renderRange);
-        activeRange = renderRange;
-        if (!this.options.showNonCurrentDates) {
-            activeRange = intersectRanges(activeRange, currentInfo.range);
-        }
-        minTime = createDuration(this.options.minTime);
-        maxTime = createDuration(this.options.maxTime);
-        activeRange = this.adjustActiveRange(activeRange, minTime, maxTime);
-        activeRange = intersectRanges(activeRange, validRange); // might return null
-        // it's invalid if the originally requested date is not contained,
-        // or if the range is completely outside of the valid range.
-        isValid = rangesIntersect(currentInfo.range, validRange);
-        return {
-            // constraint for where prev/next operations can go and where events can be dragged/resized to.
-            // an object with optional start and end properties.
-            validRange: validRange,
-            // range the view is formally responsible for.
-            // for example, a month view might have 1st-31st, excluding padded dates
-            currentRange: currentInfo.range,
-            // name of largest unit being displayed, like "month" or "week"
-            currentRangeUnit: currentInfo.unit,
-            isRangeAllDay: isRangeAllDay,
-            // dates that display events and accept drag-n-drop
-            // will be `null` if no dates accept events
-            activeRange: activeRange,
-            // date range with a rendered skeleton
-            // includes not-active days that need some sort of DOM
-            renderRange: renderRange,
-            // Duration object that denotes the first visible time of any given day
-            minTime: minTime,
-            // Duration object that denotes the exclusive visible end time of any given day
-            maxTime: maxTime,
-            isValid: isValid,
-            // how far the current date will move for a prev/next operation
-            dateIncrement: this.buildDateIncrement(currentInfo.duration)
-            // pass a fallback (might be null) ^
-        };
-    };
-    // Builds an object with optional start/end properties.
-    // Indicates the minimum/maximum dates to display.
-    // not responsible for trimming hidden days.
-    DateProfileGenerator.prototype.buildValidRange = function () {
-        return this.getRangeOption('validRange', this.calendar.getNow()) ||
-            { start: null, end: null }; // completely open-ended
-    };
-    // Builds a structure with info about the "current" range, the range that is
-    // highlighted as being the current month for example.
-    // See build() for a description of `direction`.
-    // Guaranteed to have `range` and `unit` properties. `duration` is optional.
-    DateProfileGenerator.prototype.buildCurrentRangeInfo = function (date, direction) {
-        var _a = this, viewSpec = _a.viewSpec, dateEnv = _a.dateEnv;
-        var duration = null;
-        var unit = null;
-        var range = null;
-        var dayCount;
-        if (viewSpec.duration) {
-            duration = viewSpec.duration;
-            unit = viewSpec.durationUnit;
-            range = this.buildRangeFromDuration(date, direction, duration, unit);
-        }
-        else if ((dayCount = this.options.dayCount)) {
-            unit = 'day';
-            range = this.buildRangeFromDayCount(date, direction, dayCount);
-        }
-        else if ((range = this.buildCustomVisibleRange(date))) {
-            unit = dateEnv.greatestWholeUnit(range.start, range.end).unit;
-        }
-        else {
-            duration = this.getFallbackDuration();
-            unit = greatestDurationDenominator(duration).unit;
-            range = this.buildRangeFromDuration(date, direction, duration, unit);
-        }
-        return { duration: duration, unit: unit, range: range };
-    };
-    DateProfileGenerator.prototype.getFallbackDuration = function () {
-        return createDuration({ day: 1 });
-    };
-    // Returns a new activeRange to have time values (un-ambiguate)
-    // minTime or maxTime causes the range to expand.
-    DateProfileGenerator.prototype.adjustActiveRange = function (range, minTime, maxTime) {
-        var dateEnv = this.dateEnv;
-        var start = range.start;
-        var end = range.end;
-        if (this.viewSpec.class.prototype.usesMinMaxTime) {
-            // expand active range if minTime is negative (why not when positive?)
-            if (asRoughDays(minTime) < 0) {
-                start = startOfDay(start); // necessary?
-                start = dateEnv.add(start, minTime);
-            }
-            // expand active range if maxTime is beyond one day (why not when positive?)
-            if (asRoughDays(maxTime) > 1) {
-                end = startOfDay(end); // necessary?
-                end = addDays(end, -1);
-                end = dateEnv.add(end, maxTime);
-            }
-        }
-        return { start: start, end: end };
-    };
-    // Builds the "current" range when it is specified as an explicit duration.
-    // `unit` is the already-computed greatestDurationDenominator unit of duration.
-    DateProfileGenerator.prototype.buildRangeFromDuration = function (date, direction, duration, unit) {
-        var dateEnv = this.dateEnv;
-        var alignment = this.options.dateAlignment;
-        var dateIncrementInput;
-        var dateIncrementDuration;
-        var start;
-        var end;
-        var res;
-        // compute what the alignment should be
-        if (!alignment) {
-            dateIncrementInput = this.options.dateIncrement;
-            if (dateIncrementInput) {
-                dateIncrementDuration = createDuration(dateIncrementInput);
-                // use the smaller of the two units
-                if (asRoughMs(dateIncrementDuration) < asRoughMs(duration)) {
-                    alignment = greatestDurationDenominator(dateIncrementDuration, !getWeeksFromInput(dateIncrementInput)).unit;
-                }
-                else {
-                    alignment = unit;
-                }
-            }
-            else {
-                alignment = unit;
-            }
-        }
-        // if the view displays a single day or smaller
-        if (asRoughDays(duration) <= 1) {
-            if (this.isHiddenDay(start)) {
-                start = this.skipHiddenDays(start, direction);
-                start = startOfDay(start);
-            }
-        }
-        function computeRes() {
-            start = dateEnv.startOf(date, alignment);
-            end = dateEnv.add(start, duration);
-            res = { start: start, end: end };
-        }
-        computeRes();
-        // if range is completely enveloped by hidden days, go past the hidden days
-        if (!this.trimHiddenDays(res)) {
-            date = this.skipHiddenDays(date, direction);
-            computeRes();
-        }
-        return res;
-    };
-    // Builds the "current" range when a dayCount is specified.
-    DateProfileGenerator.prototype.buildRangeFromDayCount = function (date, direction, dayCount) {
-        var dateEnv = this.dateEnv;
-        var customAlignment = this.options.dateAlignment;
-        var runningCount = 0;
-        var start = date;
-        var end;
-        if (customAlignment) {
-            start = dateEnv.startOf(start, customAlignment);
-        }
-        start = startOfDay(start);
-        start = this.skipHiddenDays(start, direction);
-        end = start;
-        do {
-            end = addDays(end, 1);
-            if (!this.isHiddenDay(end)) {
-                runningCount++;
-            }
-        } while (runningCount < dayCount);
-        return { start: start, end: end };
-    };
-    // Builds a normalized range object for the "visible" range,
-    // which is a way to define the currentRange and activeRange at the same time.
-    DateProfileGenerator.prototype.buildCustomVisibleRange = function (date) {
-        var dateEnv = this.dateEnv;
-        var visibleRange = this.getRangeOption('visibleRange', dateEnv.toDate(date));
-        if (visibleRange && (visibleRange.start == null || visibleRange.end == null)) {
-            return null;
-        }
-        return visibleRange;
-    };
-    // Computes the range that will represent the element/cells for *rendering*,
-    // but which may have voided days/times.
-    // not responsible for trimming hidden days.
-    DateProfileGenerator.prototype.buildRenderRange = function (currentRange, currentRangeUnit, isRangeAllDay) {
-        return currentRange;
-    };
-    // Compute the duration value that should be added/substracted to the current date
-    // when a prev/next operation happens.
-    DateProfileGenerator.prototype.buildDateIncrement = function (fallback) {
-        var dateIncrementInput = this.options.dateIncrement;
-        var customAlignment;
-        if (dateIncrementInput) {
-            return createDuration(dateIncrementInput);
-        }
-        else if ((customAlignment = this.options.dateAlignment)) {
-            return createDuration(1, customAlignment);
-        }
-        else if (fallback) {
-            return fallback;
-        }
-        else {
-            return createDuration({ days: 1 });
-        }
-    };
-    // Arguments after name will be forwarded to a hypothetical function value
-    // WARNING: passed-in arguments will be given to generator functions as-is and can cause side-effects.
-    // Always clone your objects if you fear mutation.
-    DateProfileGenerator.prototype.getRangeOption = function (name) {
-        var otherArgs = [];
-        for (var _i = 1; _i < arguments.length; _i++) {
-            otherArgs[_i - 1] = arguments[_i];
-        }
-        var val = this.options[name];
-        if (typeof val === 'function') {
-            val = val.apply(null, otherArgs);
-        }
-        if (val) {
-            val = parseRange(val, this.dateEnv);
-        }
-        if (val) {
-            val = computeVisibleDayRange(val);
-        }
-        return val;
-    };
-    /* Hidden Days
-    ------------------------------------------------------------------------------------------------------------------*/
-    // Initializes internal variables related to calculating hidden days-of-week
-    DateProfileGenerator.prototype.initHiddenDays = function () {
-        var hiddenDays = this.options.hiddenDays || []; // array of day-of-week indices that are hidden
-        var isHiddenDayHash = []; // is the day-of-week hidden? (hash with day-of-week-index -> bool)
-        var dayCnt = 0;
-        var i;
-        if (this.options.weekends === false) {
-            hiddenDays.push(0, 6); // 0=sunday, 6=saturday
-        }
-        for (i = 0; i < 7; i++) {
-            if (!(isHiddenDayHash[i] = hiddenDays.indexOf(i) !== -1)) {
-                dayCnt++;
-            }
-        }
-        if (!dayCnt) {
-            throw new Error('invalid hiddenDays'); // all days were hidden? bad.
-        }
-        this.isHiddenDayHash = isHiddenDayHash;
-    };
-    // Remove days from the beginning and end of the range that are computed as hidden.
-    // If the whole range is trimmed off, returns null
-    DateProfileGenerator.prototype.trimHiddenDays = function (range) {
-        var start = range.start;
-        var end = range.end;
-        if (start) {
-            start = this.skipHiddenDays(start);
-        }
-        if (end) {
-            end = this.skipHiddenDays(end, -1, true);
-        }
-        if (start == null || end == null || start < end) {
-            return { start: start, end: end };
-        }
-        return null;
-    };
-    // Is the current day hidden?
-    // `day` is a day-of-week index (0-6), or a Date (used for UTC)
-    DateProfileGenerator.prototype.isHiddenDay = function (day) {
-        if (day instanceof Date) {
-            day = day.getUTCDay();
-        }
-        return this.isHiddenDayHash[day];
-    };
-    // Incrementing the current day until it is no longer a hidden day, returning a copy.
-    // DOES NOT CONSIDER validRange!
-    // If the initial value of `date` is not a hidden day, don't do anything.
-    // Pass `isExclusive` as `true` if you are dealing with an end date.
-    // `inc` defaults to `1` (increment one day forward each time)
-    DateProfileGenerator.prototype.skipHiddenDays = function (date, inc, isExclusive) {
-        if (inc === void 0) { inc = 1; }
-        if (isExclusive === void 0) { isExclusive = false; }
-        while (this.isHiddenDayHash[(date.getUTCDay() + (isExclusive ? inc : 0) + 7) % 7]) {
-            date = addDays(date, inc);
-        }
-        return date;
-    };
-    return DateProfileGenerator;
-}());
-// TODO: find a way to avoid comparing DateProfiles. it's tedious
-function isDateProfilesEqual(p0, p1) {
-    return rangesEqual(p0.validRange, p1.validRange) &&
-        rangesEqual(p0.activeRange, p1.activeRange) &&
-        rangesEqual(p0.renderRange, p1.renderRange) &&
-        durationsEqual(p0.minTime, p1.minTime) &&
-        durationsEqual(p0.maxTime, p1.maxTime);
-    /*
-    TODO: compare more?
-      currentRange: DateRange
-      currentRangeUnit: string
-      isRangeAllDay: boolean
-      isValid: boolean
-      dateIncrement: Duration
-    */
-}
-
-function reduce (state, action, calendar) {
-    var viewType = reduceViewType(state.viewType, action);
-    var dateProfile = reduceDateProfile(state.dateProfile, action, state.currentDate, viewType, calendar);
-    var eventSources = reduceEventSources(state.eventSources, action, dateProfile, calendar);
-    var nextState = __assign({}, state, { viewType: viewType,
-        dateProfile: dateProfile, currentDate: reduceCurrentDate(state.currentDate, action, dateProfile), eventSources: eventSources, eventStore: reduceEventStore(state.eventStore, action, eventSources, dateProfile, calendar), dateSelection: reduceDateSelection(state.dateSelection, action, calendar), eventSelection: reduceSelectedEvent(state.eventSelection, action), eventDrag: reduceEventDrag(state.eventDrag, action, eventSources, calendar), eventResize: reduceEventResize(state.eventResize, action, eventSources, calendar), eventSourceLoadingLevel: computeLoadingLevel(eventSources), loadingLevel: computeLoadingLevel(eventSources) });
-    for (var _i = 0, _a = calendar.pluginSystem.hooks.reducers; _i < _a.length; _i++) {
-        var reducerFunc = _a[_i];
-        nextState = reducerFunc(nextState, action, calendar);
-    }
-    // console.log(action.type, nextState)
-    return nextState;
-}
-function reduceViewType(currentViewType, action) {
-    switch (action.type) {
-        case 'SET_VIEW_TYPE':
-            return action.viewType;
-        default:
-            return currentViewType;
-    }
-}
-function reduceDateProfile(currentDateProfile, action, currentDate, viewType, calendar) {
-    var newDateProfile;
-    switch (action.type) {
-        case 'PREV':
-            newDateProfile = calendar.dateProfileGenerators[viewType].buildPrev(currentDateProfile, currentDate);
-            break;
-        case 'NEXT':
-            newDateProfile = calendar.dateProfileGenerators[viewType].buildNext(currentDateProfile, currentDate);
-            break;
-        case 'SET_DATE':
-            if (!currentDateProfile.activeRange ||
-                !rangeContainsMarker(currentDateProfile.currentRange, action.dateMarker)) {
-                newDateProfile = calendar.dateProfileGenerators[viewType].build(action.dateMarker, undefined, true // forceToValid
-                );
-            }
-            break;
-        case 'SET_VIEW_TYPE':
-            var generator = calendar.dateProfileGenerators[viewType];
-            if (!generator) {
-                throw new Error(viewType ?
-                    'The FullCalendar view "' + viewType + '" does not exist. Make sure your plugins are loaded correctly.' :
-                    'No available FullCalendar view plugins.');
-            }
-            newDateProfile = generator.build(action.dateMarker || currentDate, undefined, true // forceToValid
-            );
-            break;
-    }
-    if (newDateProfile &&
-        newDateProfile.isValid &&
-        !(currentDateProfile && isDateProfilesEqual(currentDateProfile, newDateProfile))) {
-        return newDateProfile;
-    }
-    else {
-        return currentDateProfile;
-    }
-}
-function reduceCurrentDate(currentDate, action, dateProfile) {
-    switch (action.type) {
-        case 'PREV':
-        case 'NEXT':
-            if (!rangeContainsMarker(dateProfile.currentRange, currentDate)) {
-                return dateProfile.currentRange.start;
-            }
-            else {
-                return currentDate;
-            }
-        case 'SET_DATE':
-        case 'SET_VIEW_TYPE':
-            var newDate = action.dateMarker || currentDate;
-            if (dateProfile.activeRange && !rangeContainsMarker(dateProfile.activeRange, newDate)) {
-                return dateProfile.currentRange.start;
-            }
-            else {
-                return newDate;
-            }
-        default:
-            return currentDate;
-    }
-}
-function reduceDateSelection(currentSelection, action, calendar) {
-    switch (action.type) {
-        case 'SELECT_DATES':
-            return action.selection;
-        case 'UNSELECT_DATES':
-            return null;
-        default:
-            return currentSelection;
-    }
-}
-function reduceSelectedEvent(currentInstanceId, action) {
-    switch (action.type) {
-        case 'SELECT_EVENT':
-            return action.eventInstanceId;
-        case 'UNSELECT_EVENT':
-            return '';
-        default:
-            return currentInstanceId;
-    }
-}
-function reduceEventDrag(currentDrag, action, sources, calendar) {
-    switch (action.type) {
-        case 'SET_EVENT_DRAG':
-            var newDrag = action.state;
-            return {
-                affectedEvents: newDrag.affectedEvents,
-                mutatedEvents: newDrag.mutatedEvents,
-                isEvent: newDrag.isEvent,
-                origSeg: newDrag.origSeg
-            };
-        case 'UNSET_EVENT_DRAG':
-            return null;
-        default:
-            return currentDrag;
-    }
-}
-function reduceEventResize(currentResize, action, sources, calendar) {
-    switch (action.type) {
-        case 'SET_EVENT_RESIZE':
-            var newResize = action.state;
-            return {
-                affectedEvents: newResize.affectedEvents,
-                mutatedEvents: newResize.mutatedEvents,
-                isEvent: newResize.isEvent,
-                origSeg: newResize.origSeg
-            };
-        case 'UNSET_EVENT_RESIZE':
-            return null;
-        default:
-            return currentResize;
-    }
-}
-function computeLoadingLevel(eventSources) {
-    var cnt = 0;
-    for (var sourceId in eventSources) {
-        if (eventSources[sourceId].isFetching) {
-            cnt++;
-        }
-    }
-    return cnt;
-}
-
-var STANDARD_PROPS = {
-    start: null,
-    end: null,
-    allDay: Boolean
-};
-function parseDateSpan(raw, dateEnv, defaultDuration) {
-    var span = parseOpenDateSpan(raw, dateEnv);
-    var range = span.range;
-    if (!range.start) {
-        return null;
-    }
-    if (!range.end) {
-        if (defaultDuration == null) {
-            return null;
-        }
-        else {
-            range.end = dateEnv.add(range.start, defaultDuration);
-        }
-    }
-    return span;
-}
-/*
-TODO: somehow combine with parseRange?
-Will return null if the start/end props were present but parsed invalidly.
-*/
-function parseOpenDateSpan(raw, dateEnv) {
-    var leftovers = {};
-    var standardProps = refineProps(raw, STANDARD_PROPS, {}, leftovers);
-    var startMeta = standardProps.start ? dateEnv.createMarkerMeta(standardProps.start) : null;
-    var endMeta = standardProps.end ? dateEnv.createMarkerMeta(standardProps.end) : null;
-    var allDay = standardProps.allDay;
-    if (allDay == null) {
-        allDay = (startMeta && startMeta.isTimeUnspecified) &&
-            (!endMeta || endMeta.isTimeUnspecified);
-    }
-    // use this leftover object as the selection object
-    leftovers.range = {
-        start: startMeta ? startMeta.marker : null,
-        end: endMeta ? endMeta.marker : null
-    };
-    leftovers.allDay = allDay;
-    return leftovers;
-}
-function isDateSpansEqual(span0, span1) {
-    return rangesEqual(span0.range, span1.range) &&
-        span0.allDay === span1.allDay &&
-        isSpanPropsEqual(span0, span1);
-}
-// the NON-DATE-RELATED props
-function isSpanPropsEqual(span0, span1) {
-    for (var propName in span1) {
-        if (propName !== 'range' && propName !== 'allDay') {
-            if (span0[propName] !== span1[propName]) {
-                return false;
-            }
-        }
-    }
-    // are there any props that span0 has that span1 DOESN'T have?
-    // both have range/allDay, so no need to special-case.
-    for (var propName in span0) {
-        if (!(propName in span1)) {
-            return false;
-        }
-    }
-    return true;
-}
-function buildDateSpanApi(span, dateEnv) {
-    return {
-        start: dateEnv.toDate(span.range.start),
-        end: dateEnv.toDate(span.range.end),
-        startStr: dateEnv.formatIso(span.range.start, { omitTime: span.allDay }),
-        endStr: dateEnv.formatIso(span.range.end, { omitTime: span.allDay }),
-        allDay: span.allDay
-    };
-}
-function buildDatePointApi(span, dateEnv) {
-    return {
-        date: dateEnv.toDate(span.range.start),
-        dateStr: dateEnv.formatIso(span.range.start, { omitTime: span.allDay }),
-        allDay: span.allDay
-    };
-}
-function fabricateEventRange(dateSpan, eventUiBases, calendar) {
-    var def = parseEventDef({ editable: false }, '', // sourceId
-    dateSpan.allDay, true, // hasEnd
-    calendar);
-    return {
-        def: def,
-        ui: compileEventUi(def, eventUiBases),
-        instance: createEventInstance(def.defId, dateSpan.range),
-        range: dateSpan.range,
-        isStart: true,
-        isEnd: true
-    };
-}
-
-function compileViewDefs(defaultConfigs, overrideConfigs) {
-    var hash = {};
-    var viewType;
-    for (viewType in defaultConfigs) {
-        ensureViewDef(viewType, hash, defaultConfigs, overrideConfigs);
-    }
-    for (viewType in overrideConfigs) {
-        ensureViewDef(viewType, hash, defaultConfigs, overrideConfigs);
-    }
-    return hash;
-}
-function ensureViewDef(viewType, hash, defaultConfigs, overrideConfigs) {
-    if (hash[viewType]) {
-        return hash[viewType];
-    }
-    var viewDef = buildViewDef(viewType, hash, defaultConfigs, overrideConfigs);
-    if (viewDef) {
-        hash[viewType] = viewDef;
-    }
-    return viewDef;
-}
-function buildViewDef(viewType, hash, defaultConfigs, overrideConfigs) {
-    var defaultConfig = defaultConfigs[viewType];
-    var overrideConfig = overrideConfigs[viewType];
-    var queryProp = function (name) {
-        return (defaultConfig && defaultConfig[name] !== null) ? defaultConfig[name] :
-            ((overrideConfig && overrideConfig[name] !== null) ? overrideConfig[name] : null);
-    };
-    var theClass = queryProp('class');
-    var superType = queryProp('superType');
-    if (!superType && theClass) {
-        superType =
-            findViewNameBySubclass(theClass, overrideConfigs) ||
-                findViewNameBySubclass(theClass, defaultConfigs);
-    }
-    var superDef = null;
-    if (superType) {
-        if (superType === viewType) {
-            throw new Error('Can\'t have a custom view type that references itself');
-        }
-        superDef = ensureViewDef(superType, hash, defaultConfigs, overrideConfigs);
-    }
-    if (!theClass && superDef) {
-        theClass = superDef.class;
-    }
-    if (!theClass) {
-        return null; // don't throw a warning, might be settings for a single-unit view
-    }
-    return {
-        type: viewType,
-        class: theClass,
-        defaults: __assign({}, (superDef ? superDef.defaults : {}), (defaultConfig ? defaultConfig.options : {})),
-        overrides: __assign({}, (superDef ? superDef.overrides : {}), (overrideConfig ? overrideConfig.options : {}))
-    };
-}
-function findViewNameBySubclass(viewSubclass, configs) {
-    var superProto = Object.getPrototypeOf(viewSubclass.prototype);
-    for (var viewType in configs) {
-        var parsed = configs[viewType];
-        // need DIRECT subclass, so instanceof won't do it
-        if (parsed.class && parsed.class.prototype === superProto) {
-            return viewType;
-        }
-    }
-    return '';
-}
-
-function parseViewConfigs(inputs) {
-    return mapHash(inputs, parseViewConfig);
-}
-var VIEW_DEF_PROPS = {
-    type: String,
-    class: null
-};
-function parseViewConfig(input) {
-    if (typeof input === 'function') {
-        input = { class: input };
-    }
-    var options = {};
-    var props = refineProps(input, VIEW_DEF_PROPS, {}, options);
-    return {
-        superType: props.type,
-        class: props.class,
-        options: options
-    };
-}
-
-function buildViewSpecs(defaultInputs, optionsManager) {
-    var defaultConfigs = parseViewConfigs(defaultInputs);
-    var overrideConfigs = parseViewConfigs(optionsManager.overrides.views);
-    var viewDefs = compileViewDefs(defaultConfigs, overrideConfigs);
-    return mapHash(viewDefs, function (viewDef) {
-        return buildViewSpec(viewDef, overrideConfigs, optionsManager);
-    });
-}
-function buildViewSpec(viewDef, overrideConfigs, optionsManager) {
-    var durationInput = viewDef.overrides.duration ||
-        viewDef.defaults.duration ||
-        optionsManager.dynamicOverrides.duration ||
-        optionsManager.overrides.duration;
-    var duration = null;
-    var durationUnit = '';
-    var singleUnit = '';
-    var singleUnitOverrides = {};
-    if (durationInput) {
-        duration = createDuration(durationInput);
-        if (duration) { // valid?
-            var denom = greatestDurationDenominator(duration, !getWeeksFromInput(durationInput));
-            durationUnit = denom.unit;
-            if (denom.value === 1) {
-                singleUnit = durationUnit;
-                singleUnitOverrides = overrideConfigs[durationUnit] ? overrideConfigs[durationUnit].options : {};
-            }
-        }
-    }
-    var queryButtonText = function (options) {
-        var buttonTextMap = options.buttonText || {};
-        var buttonTextKey = viewDef.defaults.buttonTextKey;
-        if (buttonTextKey != null && buttonTextMap[buttonTextKey] != null) {
-            return buttonTextMap[buttonTextKey];
-        }
-        if (buttonTextMap[viewDef.type] != null) {
-            return buttonTextMap[viewDef.type];
-        }
-        if (buttonTextMap[singleUnit] != null) {
-            return buttonTextMap[singleUnit];
-        }
-    };
-    return {
-        type: viewDef.type,
-        class: viewDef.class,
-        duration: duration,
-        durationUnit: durationUnit,
-        singleUnit: singleUnit,
-        options: __assign({}, globalDefaults, viewDef.defaults, optionsManager.dirDefaults, optionsManager.localeDefaults, optionsManager.overrides, singleUnitOverrides, viewDef.overrides, optionsManager.dynamicOverrides),
-        buttonTextOverride: queryButtonText(optionsManager.dynamicOverrides) ||
-            queryButtonText(optionsManager.overrides) || // constructor-specified buttonText lookup hash takes precedence
-            viewDef.overrides.buttonText,
-        buttonTextDefault: queryButtonText(optionsManager.localeDefaults) ||
-            queryButtonText(optionsManager.dirDefaults) ||
-            viewDef.defaults.buttonText ||
-            queryButtonText(globalDefaults) ||
-            viewDef.type // fall back to given view name
-    };
-}
-
-var Toolbar = /** @class */ (function (_super) {
-    __extends(Toolbar, _super);
-    function Toolbar(context, extraClassName) {
-        var _this = _super.call(this, context) || this;
-        _this._renderLayout = memoizeRendering(_this.renderLayout, _this.unrenderLayout);
-        _this._updateTitle = memoizeRendering(_this.updateTitle, null, [_this._renderLayout]);
-        _this._updateActiveButton = memoizeRendering(_this.updateActiveButton, null, [_this._renderLayout]);
-        _this._updateToday = memoizeRendering(_this.updateToday, null, [_this._renderLayout]);
-        _this._updatePrev = memoizeRendering(_this.updatePrev, null, [_this._renderLayout]);
-        _this._updateNext = memoizeRendering(_this.updateNext, null, [_this._renderLayout]);
-        _this.el = createElement('div', { className: 'fc-toolbar ' + extraClassName });
-        return _this;
-    }
-    Toolbar.prototype.destroy = function () {
-        _super.prototype.destroy.call(this);
-        this._renderLayout.unrender(); // should unrender everything else
-        removeElement(this.el);
-    };
-    Toolbar.prototype.render = function (props) {
-        this._renderLayout(props.layout);
-        this._updateTitle(props.title);
-        this._updateActiveButton(props.activeButton);
-        this._updateToday(props.isTodayEnabled);
-        this._updatePrev(props.isPrevEnabled);
-        this._updateNext(props.isNextEnabled);
-    };
-    Toolbar.prototype.renderLayout = function (layout) {
-        var el = this.el;
-        this.viewsWithButtons = [];
-        appendToElement(el, this.renderSection('left', layout.left));
-        appendToElement(el, this.renderSection('center', layout.center));
-        appendToElement(el, this.renderSection('right', layout.right));
-    };
-    Toolbar.prototype.unrenderLayout = function () {
-        this.el.innerHTML = '';
-    };
-    Toolbar.prototype.renderSection = function (position, buttonStr) {
-        var _this = this;
-        var _a = this, theme = _a.theme, calendar = _a.calendar;
-        var optionsManager = calendar.optionsManager;
-        var viewSpecs = calendar.viewSpecs;
-        var sectionEl = createElement('div', { className: 'fc-' + position });
-        var calendarCustomButtons = optionsManager.computed.customButtons || {};
-        var calendarButtonTextOverrides = optionsManager.overrides.buttonText || {};
-        var calendarButtonText = optionsManager.computed.buttonText || {};
-        if (buttonStr) {
-            buttonStr.split(' ').forEach(function (buttonGroupStr, i) {
-                var groupChildren = [];
-                var isOnlyButtons = true;
-                var groupEl;
-                buttonGroupStr.split(',').forEach(function (buttonName, j) {
-                    var customButtonProps;
-                    var viewSpec;
-                    var buttonClick;
-                    var buttonIcon; // only one of these will be set
-                    var buttonText; // "
-                    var buttonInnerHtml;
-                    var buttonClasses;
-                    var buttonEl;
-                    var buttonAriaAttr;
-                    if (buttonName === 'title') {
-                        groupChildren.push(htmlToElement('<h2>&nbsp;</h2>')); // we always want it to take up height
-                        isOnlyButtons = false;
-                    }
-                    else {
-                        if ((customButtonProps = calendarCustomButtons[buttonName])) {
-                            buttonClick = function (ev) {
-                                if (customButtonProps.click) {
-                                    customButtonProps.click.call(buttonEl, ev);
-                                }
-                            };
-                            (buttonIcon = theme.getCustomButtonIconClass(customButtonProps)) ||
-                                (buttonIcon = theme.getIconClass(buttonName)) ||
-                                (buttonText = customButtonProps.text);
-                        }
-                        else if ((viewSpec = viewSpecs[buttonName])) {
-                            _this.viewsWithButtons.push(buttonName);
-                            buttonClick = function () {
-                                calendar.changeView(buttonName);
-                            };
-                            (buttonText = viewSpec.buttonTextOverride) ||
-                                (buttonIcon = theme.getIconClass(buttonName)) ||
-                                (buttonText = viewSpec.buttonTextDefault);
-                        }
-                        else if (calendar[buttonName]) { // a calendar method
-                            buttonClick = function () {
-                                calendar[buttonName]();
-                            };
-                            (buttonText = calendarButtonTextOverrides[buttonName]) ||
-                                (buttonIcon = theme.getIconClass(buttonName)) ||
-                                (buttonText = calendarButtonText[buttonName]);
-                            //            ^ everything else is considered default
-                        }
-                        if (buttonClick) {
-                            buttonClasses = [
-                                'fc-' + buttonName + '-button',
-                                theme.getClass('button')
-                            ];
-                            if (buttonText) {
-                                buttonInnerHtml = htmlEscape(buttonText);
-                                buttonAriaAttr = '';
-                            }
-                            else if (buttonIcon) {
-                                buttonInnerHtml = "<span class='" + buttonIcon + "'></span>";
-                                buttonAriaAttr = ' aria-label="' + buttonName + '"';
-                            }
-                            buttonEl = htmlToElement(// type="button" so that it doesn't submit a form
-                            '<button type="button" class="' + buttonClasses.join(' ') + '"' +
-                                buttonAriaAttr +
-                                '>' + buttonInnerHtml + '</button>');
-                            buttonEl.addEventListener('click', buttonClick);
-                            groupChildren.push(buttonEl);
-                        }
-                    }
-                });
-                if (groupChildren.length > 1) {
-                    groupEl = document.createElement('div');
-                    var buttonGroupClassName = theme.getClass('buttonGroup');
-                    if (isOnlyButtons && buttonGroupClassName) {
-                        groupEl.classList.add(buttonGroupClassName);
-                    }
-                    appendToElement(groupEl, groupChildren);
-                    sectionEl.appendChild(groupEl);
-                }
-                else {
-                    appendToElement(sectionEl, groupChildren); // 1 or 0 children
-                }
-            });
-        }
-        return sectionEl;
-    };
-    Toolbar.prototype.updateToday = function (isTodayEnabled) {
-        this.toggleButtonEnabled('today', isTodayEnabled);
-    };
-    Toolbar.prototype.updatePrev = function (isPrevEnabled) {
-        this.toggleButtonEnabled('prev', isPrevEnabled);
-    };
-    Toolbar.prototype.updateNext = function (isNextEnabled) {
-        this.toggleButtonEnabled('next', isNextEnabled);
-    };
-    Toolbar.prototype.updateTitle = function (text) {
-        findElements(this.el, 'h2').forEach(function (titleEl) {
-            titleEl.innerText = text;
-        });
-    };
-    Toolbar.prototype.updateActiveButton = function (buttonName) {
-        var className = this.theme.getClass('buttonActive');
-        findElements(this.el, 'button').forEach(function (buttonEl) {
-            if (buttonName && buttonEl.classList.contains('fc-' + buttonName + '-button')) {
-                buttonEl.classList.add(className);
-            }
-            else {
-                buttonEl.classList.remove(className);
-            }
-        });
-    };
-    Toolbar.prototype.toggleButtonEnabled = function (buttonName, bool) {
-        findElements(this.el, '.fc-' + buttonName + '-button').forEach(function (buttonEl) {
-            buttonEl.disabled = !bool;
-        });
-    };
-    return Toolbar;
-}(Component));
-
-var CalendarComponent = /** @class */ (function (_super) {
-    __extends(CalendarComponent, _super);
-    function CalendarComponent(context, el) {
-        var _this = _super.call(this, context) || this;
-        _this._renderToolbars = memoizeRendering(_this.renderToolbars);
-        _this.buildViewPropTransformers = memoize(buildViewPropTransformers);
-        _this.el = el;
-        prependToElement(el, _this.contentEl = createElement('div', { className: 'fc-view-container' }));
-        var calendar = _this.calendar;
-        for (var _i = 0, _a = calendar.pluginSystem.hooks.viewContainerModifiers; _i < _a.length; _i++) {
-            var modifyViewContainer = _a[_i];
-            modifyViewContainer(_this.contentEl, calendar);
-        }
-        _this.toggleElClassNames(true);
-        _this.computeTitle = memoize(computeTitle);
-        _this.parseBusinessHours = memoize(function (input) {
-            return parseBusinessHours(input, _this.calendar);
-        });
-        return _this;
-    }
-    CalendarComponent.prototype.destroy = function () {
-        if (this.header) {
-            this.header.destroy();
-        }
-        if (this.footer) {
-            this.footer.destroy();
-        }
-        if (this.view) {
-            this.view.destroy();
-        }
-        removeElement(this.contentEl);
-        this.toggleElClassNames(false);
-        _super.prototype.destroy.call(this);
-    };
-    CalendarComponent.prototype.toggleElClassNames = function (bool) {
-        var classList = this.el.classList;
-        var dirClassName = 'fc-' + this.opt('dir');
-        var themeClassName = this.theme.getClass('widget');
-        if (bool) {
-            classList.add('fc');
-            classList.add(dirClassName);
-            classList.add(themeClassName);
-        }
-        else {
-            classList.remove('fc');
-            classList.remove(dirClassName);
-            classList.remove(themeClassName);
-        }
-    };
-    CalendarComponent.prototype.render = function (props) {
-        this.freezeHeight();
-        var title = this.computeTitle(props.dateProfile, props.viewSpec.options);
-        this._renderToolbars(props.viewSpec, props.dateProfile, props.currentDate, props.dateProfileGenerator, title);
-        this.renderView(props, title);
-        this.updateSize();
-        this.thawHeight();
-    };
-    CalendarComponent.prototype.renderToolbars = function (viewSpec, dateProfile, currentDate, dateProfileGenerator, title) {
-        var headerLayout = this.opt('header');
-        var footerLayout = this.opt('footer');
-        var now = this.calendar.getNow();
-        var todayInfo = dateProfileGenerator.build(now);
-        var prevInfo = dateProfileGenerator.buildPrev(dateProfile, currentDate);
-        var nextInfo = dateProfileGenerator.buildNext(dateProfile, currentDate);
-        var toolbarProps = {
-            title: title,
-            activeButton: viewSpec.type,
-            isTodayEnabled: todayInfo.isValid && !rangeContainsMarker(dateProfile.currentRange, now),
-            isPrevEnabled: prevInfo.isValid,
-            isNextEnabled: nextInfo.isValid
-        };
-        if (headerLayout) {
-            if (!this.header) {
-                this.header = new Toolbar(this.context, 'fc-header-toolbar');
-                prependToElement(this.el, this.header.el);
-            }
-            this.header.receiveProps(__assign({ layout: headerLayout }, toolbarProps));
-        }
-        else if (this.header) {
-            this.header.destroy();
-            this.header = null;
-        }
-        if (footerLayout) {
-            if (!this.footer) {
-                this.footer = new Toolbar(this.context, 'fc-footer-toolbar');
-                appendToElement(this.el, this.footer.el);
-            }
-            this.footer.receiveProps(__assign({ layout: footerLayout }, toolbarProps));
-        }
-        else if (this.footer) {
-            this.footer.destroy();
-            this.footer = null;
-        }
-    };
-    CalendarComponent.prototype.renderView = function (props, title) {
-        var view = this.view;
-        var viewSpec = props.viewSpec, dateProfileGenerator = props.dateProfileGenerator;
-        if (!view || view.viewSpec !== viewSpec) {
-            if (view) {
-                view.destroy();
-            }
-            view = this.view = new viewSpec['class']({
-                calendar: this.calendar,
-                view: null,
-                dateEnv: this.dateEnv,
-                theme: this.theme,
-                options: viewSpec.options
-            }, viewSpec, dateProfileGenerator, this.contentEl);
-        }
-        else {
-            view.addScroll(view.queryScroll());
-        }
-        view.title = title; // for the API
-        var viewProps = {
-            dateProfile: props.dateProfile,
-            businessHours: this.parseBusinessHours(viewSpec.options.businessHours),
-            eventStore: props.eventStore,
-            eventUiBases: props.eventUiBases,
-            dateSelection: props.dateSelection,
-            eventSelection: props.eventSelection,
-            eventDrag: props.eventDrag,
-            eventResize: props.eventResize
-        };
-        var transformers = this.buildViewPropTransformers(this.calendar.pluginSystem.hooks.viewPropsTransformers);
-        for (var _i = 0, transformers_1 = transformers; _i < transformers_1.length; _i++) {
-            var transformer = transformers_1[_i];
-            __assign(viewProps, transformer.transform(viewProps, viewSpec, props, view));
-        }
-        view.receiveProps(viewProps);
-    };
-    // Sizing
-    // -----------------------------------------------------------------------------------------------------------------
-    CalendarComponent.prototype.updateSize = function (isResize) {
-        if (isResize === void 0) { isResize = false; }
-        var view = this.view;
-        if (isResize) {
-            view.addScroll(view.queryScroll());
-        }
-        if (isResize || this.isHeightAuto == null) {
-            this.computeHeightVars();
-        }
-        view.updateSize(isResize, this.viewHeight, this.isHeightAuto);
-        view.updateNowIndicator(); // we need to guarantee this will run after updateSize
-        view.popScroll(isResize);
-    };
-    CalendarComponent.prototype.computeHeightVars = function () {
-        var calendar = this.calendar; // yuck. need to handle dynamic options
-        var heightInput = calendar.opt('height');
-        var contentHeightInput = calendar.opt('contentHeight');
-        this.isHeightAuto = heightInput === 'auto' || contentHeightInput === 'auto';
-        if (typeof contentHeightInput === 'number') { // exists and not 'auto'
-            this.viewHeight = contentHeightInput;
-        }
-        else if (typeof contentHeightInput === 'function') { // exists and is a function
-            this.viewHeight = contentHeightInput();
-        }
-        else if (typeof heightInput === 'number') { // exists and not 'auto'
-            this.viewHeight = heightInput - this.queryToolbarsHeight();
-        }
-        else if (typeof heightInput === 'function') { // exists and is a function
-            this.viewHeight = heightInput() - this.queryToolbarsHeight();
-        }
-        else if (heightInput === 'parent') { // set to height of parent element
-            var parentEl = this.el.parentNode;
-            this.viewHeight = parentEl.getBoundingClientRect().height - this.queryToolbarsHeight();
-        }
-        else {
-            this.viewHeight = Math.round(this.contentEl.getBoundingClientRect().width /
-                Math.max(calendar.opt('aspectRatio'), .5));
-        }
-    };
-    CalendarComponent.prototype.queryToolbarsHeight = function () {
-        var height = 0;
-        if (this.header) {
-            height += computeHeightAndMargins(this.header.el);
-        }
-        if (this.footer) {
-            height += computeHeightAndMargins(this.footer.el);
-        }
-        return height;
-    };
-    // Height "Freezing"
-    // -----------------------------------------------------------------------------------------------------------------
-    CalendarComponent.prototype.freezeHeight = function () {
-        applyStyle(this.el, {
-            height: this.el.getBoundingClientRect().height,
-            overflow: 'hidden'
-        });
-    };
-    CalendarComponent.prototype.thawHeight = function () {
-        applyStyle(this.el, {
-            height: '',
-            overflow: ''
-        });
-    };
-    return CalendarComponent;
-}(Component));
-// Title and Date Formatting
-// -----------------------------------------------------------------------------------------------------------------
-// Computes what the title at the top of the calendar should be for this view
-function computeTitle(dateProfile, viewOptions) {
-    var range;
-    // for views that span a large unit of time, show the proper interval, ignoring stray days before and after
-    if (/^(year|month)$/.test(dateProfile.currentRangeUnit)) {
-        range = dateProfile.currentRange;
-    }
-    else { // for day units or smaller, use the actual day range
-        range = dateProfile.activeRange;
-    }
-    return this.dateEnv.formatRange(range.start, range.end, createFormatter(viewOptions.titleFormat || computeTitleFormat(dateProfile), viewOptions.titleRangeSeparator), { isEndExclusive: dateProfile.isRangeAllDay });
-}
-// Generates the format string that should be used to generate the title for the current date range.
-// Attempts to compute the most appropriate format if not explicitly specified with `titleFormat`.
-function computeTitleFormat(dateProfile) {
-    var currentRangeUnit = dateProfile.currentRangeUnit;
-    if (currentRangeUnit === 'year') {
-        return { year: 'numeric' };
-    }
-    else if (currentRangeUnit === 'month') {
-        return { year: 'numeric', month: 'long' }; // like "September 2014"
-    }
-    else {
-        var days = diffWholeDays(dateProfile.currentRange.start, dateProfile.currentRange.end);
-        if (days !== null && days > 1) {
-            // multi-day range. shorter, like "Sep 9 - 10 2014"
-            return { year: 'numeric', month: 'short', day: 'numeric' };
-        }
-        else {
-            // one day. longer, like "September 9 2014"
-            return { year: 'numeric', month: 'long', day: 'numeric' };
-        }
-    }
-}
-// Plugin
-// -----------------------------------------------------------------------------------------------------------------
-function buildViewPropTransformers(theClasses) {
-    return theClasses.map(function (theClass) {
-        return new theClass();
-    });
-}
-
-var Interaction = /** @class */ (function () {
-    function Interaction(settings) {
-        this.component = settings.component;
-    }
-    Interaction.prototype.destroy = function () {
-    };
-    return Interaction;
-}());
-function parseInteractionSettings(component, input) {
-    return {
-        component: component,
-        el: input.el,
-        useEventCenter: input.useEventCenter != null ? input.useEventCenter : true
-    };
-}
-function interactionSettingsToStore(settings) {
-    var _a;
-    return _a = {},
-        _a[settings.component.uid] = settings,
-        _a;
-}
-// global state
-var interactionSettingsStore = {};
-
-/*
-Detects when the user clicks on an event within a DateComponent
-*/
-var EventClicking = /** @class */ (function (_super) {
-    __extends(EventClicking, _super);
-    function EventClicking(settings) {
-        var _this = _super.call(this, settings) || this;
-        _this.handleSegClick = function (ev, segEl) {
-            var component = _this.component;
-            var seg = getElSeg(segEl);
-            if (seg && // might be the <div> surrounding the more link
-                component.isValidSegDownEl(ev.target)) {
-                // our way to simulate a link click for elements that can't be <a> tags
-                // grab before trigger fired in case trigger trashes DOM thru rerendering
-                var hasUrlContainer = elementClosest(ev.target, '.fc-has-url');
-                var url = hasUrlContainer ? hasUrlContainer.querySelector('a[href]').href : '';
-                component.publiclyTrigger('eventClick', [
-                    {
-                        el: segEl,
-                        event: new EventApi(component.calendar, seg.eventRange.def, seg.eventRange.instance),
-                        jsEvent: ev,
-                        view: component.view
-                    }
-                ]);
-                if (url && !ev.defaultPrevented) {
-                    window.location.href = url;
-                }
-            }
-        };
-        var component = settings.component;
-        _this.destroy = listenBySelector(component.el, 'click', component.fgSegSelector + ',' + component.bgSegSelector, _this.handleSegClick);
-        return _this;
-    }
-    return EventClicking;
-}(Interaction));
-
-/*
-Triggers events and adds/removes core classNames when the user's pointer
-enters/leaves event-elements of a component.
-*/
-var EventHovering = /** @class */ (function (_super) {
-    __extends(EventHovering, _super);
-    function EventHovering(settings) {
-        var _this = _super.call(this, settings) || this;
-        // for simulating an eventMouseLeave when the event el is destroyed while mouse is over it
-        _this.handleEventElRemove = function (el) {
-            if (el === _this.currentSegEl) {
-                _this.handleSegLeave(null, _this.currentSegEl);
-            }
-        };
-        _this.handleSegEnter = function (ev, segEl) {
-            if (getElSeg(segEl)) { // TODO: better way to make sure not hovering over more+ link or its wrapper
-                segEl.classList.add('fc-allow-mouse-resize');
-                _this.currentSegEl = segEl;
-                _this.triggerEvent('eventMouseEnter', ev, segEl);
-            }
-        };
-        _this.handleSegLeave = function (ev, segEl) {
-            if (_this.currentSegEl) {
-                segEl.classList.remove('fc-allow-mouse-resize');
-                _this.currentSegEl = null;
-                _this.triggerEvent('eventMouseLeave', ev, segEl);
-            }
-        };
-        var component = settings.component;
-        _this.removeHoverListeners = listenToHoverBySelector(component.el, component.fgSegSelector + ',' + component.bgSegSelector, _this.handleSegEnter, _this.handleSegLeave);
-        component.calendar.on('eventElRemove', _this.handleEventElRemove);
-        return _this;
-    }
-    EventHovering.prototype.destroy = function () {
-        this.removeHoverListeners();
-        this.component.calendar.off('eventElRemove', this.handleEventElRemove);
-    };
-    EventHovering.prototype.triggerEvent = function (publicEvName, ev, segEl) {
-        var component = this.component;
-        var seg = getElSeg(segEl);
-        if (!ev || component.isValidSegDownEl(ev.target)) {
-            component.publiclyTrigger(publicEvName, [
-                {
-                    el: segEl,
-                    event: new EventApi(this.component.calendar, seg.eventRange.def, seg.eventRange.instance),
-                    jsEvent: ev,
-                    view: component.view
-                }
-            ]);
-        }
-    };
-    return EventHovering;
-}(Interaction));
-
-var StandardTheme = /** @class */ (function (_super) {
-    __extends(StandardTheme, _super);
-    function StandardTheme() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    return StandardTheme;
-}(Theme));
-StandardTheme.prototype.classes = {
-    widget: 'fc-unthemed',
-    widgetHeader: 'fc-widget-header',
-    widgetContent: 'fc-widget-content',
-    buttonGroup: 'fc-button-group',
-    button: 'fc-button fc-button-primary',
-    buttonActive: 'fc-button-active',
-    popoverHeader: 'fc-widget-header',
-    popoverContent: 'fc-widget-content',
-    // day grid
-    headerRow: 'fc-widget-header',
-    dayRow: 'fc-widget-content',
-    // list view
-    listView: 'fc-widget-content'
-};
-StandardTheme.prototype.baseIconClass = 'fc-icon';
-StandardTheme.prototype.iconClasses = {
-    close: 'fc-icon-x',
-    prev: 'fc-icon-chevron-left',
-    next: 'fc-icon-chevron-right',
-    prevYear: 'fc-icon-chevrons-left',
-    nextYear: 'fc-icon-chevrons-right'
-};
-StandardTheme.prototype.iconOverrideOption = 'buttonIcons';
-StandardTheme.prototype.iconOverrideCustomButtonOption = 'icon';
-StandardTheme.prototype.iconOverridePrefix = 'fc-icon-';
-
-var Calendar = /** @class */ (function () {
-    function Calendar(el, overrides) {
-        var _this = this;
-        this.parseRawLocales = memoize(parseRawLocales);
-        this.buildLocale = memoize(buildLocale);
-        this.buildDateEnv = memoize(buildDateEnv);
-        this.buildTheme = memoize(buildTheme);
-        this.buildEventUiSingleBase = memoize(this._buildEventUiSingleBase);
-        this.buildSelectionConfig = memoize(this._buildSelectionConfig);
-        this.buildEventUiBySource = memoizeOutput(buildEventUiBySource, isPropsEqual);
-        this.buildEventUiBases = memoize(buildEventUiBases);
-        this.interactionsStore = {};
-        this.actionQueue = [];
-        this.isReducing = false;
-        // isDisplaying: boolean = false // installed in DOM? accepting renders?
-        this.needsRerender = false; // needs a render?
-        this.needsFullRerender = false;
-        this.isRendering = false; // currently in the executeRender function?
-        this.renderingPauseDepth = 0;
-        this.buildDelayedRerender = memoize(buildDelayedRerender);
-        this.afterSizingTriggers = {};
-        this.isViewUpdated = false;
-        this.isDatesUpdated = false;
-        this.isEventsUpdated = false;
-        this.el = el;
-        this.optionsManager = new OptionsManager(overrides || {});
-        this.pluginSystem = new PluginSystem();
-        // only do once. don't do in handleOptions. because can't remove plugins
-        this.addPluginInputs(this.optionsManager.computed.plugins || []);
-        this.handleOptions(this.optionsManager.computed);
-        this.publiclyTrigger('_init'); // for tests
-        this.hydrate();
-        this.calendarInteractions = this.pluginSystem.hooks.calendarInteractions
-            .map(function (calendarInteractionClass) {
-            return new calendarInteractionClass(_this);
-        });
-    }
-    Calendar.prototype.addPluginInputs = function (pluginInputs) {
-        var pluginDefs = refinePluginDefs(pluginInputs);
-        for (var _i = 0, pluginDefs_1 = pluginDefs; _i < pluginDefs_1.length; _i++) {
-            var pluginDef = pluginDefs_1[_i];
-            this.pluginSystem.add(pluginDef);
-        }
-    };
-    Object.defineProperty(Calendar.prototype, "view", {
-        // public API
-        get: function () {
-            return this.component ? this.component.view : null;
-        },
-        enumerable: true,
-        configurable: true
-    });
-    // Public API for rendering
-    // -----------------------------------------------------------------------------------------------------------------
-    Calendar.prototype.render = function () {
-        if (!this.component) {
-            this.renderableEventStore = createEmptyEventStore();
-            this.bindHandlers();
-            this.executeRender();
-        }
-        else {
-            this.requestRerender(true);
-        }
-    };
-    Calendar.prototype.destroy = function () {
-        if (this.component) {
-            this.unbindHandlers();
-            this.component.destroy(); // don't null-out. in case API needs access
-            this.component = null; // umm ???
-            for (var _i = 0, _a = this.calendarInteractions; _i < _a.length; _i++) {
-                var interaction = _a[_i];
-                interaction.destroy();
-            }
-            this.publiclyTrigger('_destroyed');
-        }
-    };
-    // Handlers
-    // -----------------------------------------------------------------------------------------------------------------
-    Calendar.prototype.bindHandlers = function () {
-        var _this = this;
-        // event delegation for nav links
-        this.removeNavLinkListener = listenBySelector(this.el, 'click', 'a[data-goto]', function (ev, anchorEl) {
-            var gotoOptions = anchorEl.getAttribute('data-goto');
-            gotoOptions = gotoOptions ? JSON.parse(gotoOptions) : {};
-            var dateEnv = _this.dateEnv;
-            var dateMarker = dateEnv.createMarker(gotoOptions.date);
-            var viewType = gotoOptions.type;
-            // property like "navLinkDayClick". might be a string or a function
-            var customAction = _this.viewOpt('navLink' + capitaliseFirstLetter(viewType) + 'Click');
-            if (typeof customAction === 'function') {
-                customAction(dateEnv.toDate(dateMarker), ev);
-            }
-            else {
-                if (typeof customAction === 'string') {
-                    viewType = customAction;
-                }
-                _this.zoomTo(dateMarker, viewType);
-            }
-        });
-        if (this.opt('handleWindowResize')) {
-            window.addEventListener('resize', this.windowResizeProxy = debounce(// prevents rapid calls
-            this.windowResize.bind(this), this.opt('windowResizeDelay')));
-        }
-    };
-    Calendar.prototype.unbindHandlers = function () {
-        this.removeNavLinkListener();
-        if (this.windowResizeProxy) {
-            window.removeEventListener('resize', this.windowResizeProxy);
-            this.windowResizeProxy = null;
-        }
-    };
-    // Dispatcher
-    // -----------------------------------------------------------------------------------------------------------------
-    Calendar.prototype.hydrate = function () {
-        var _this = this;
-        this.state = this.buildInitialState();
-        var rawSources = this.opt('eventSources') || [];
-        var singleRawSource = this.opt('events');
-        var sources = []; // parsed
-        if (singleRawSource) {
-            rawSources.unshift(singleRawSource);
-        }
-        for (var _i = 0, rawSources_1 = rawSources; _i < rawSources_1.length; _i++) {
-            var rawSource = rawSources_1[_i];
-            var source = parseEventSource(rawSource, this);
-            if (source) {
-                sources.push(source);
-            }
-        }
-        this.batchRendering(function () {
-            _this.dispatch({ type: 'INIT' }); // pass in sources here?
-            _this.dispatch({ type: 'ADD_EVENT_SOURCES', sources: sources });
-            _this.dispatch({
-                type: 'SET_VIEW_TYPE',
-                viewType: _this.opt('defaultView') || _this.pluginSystem.hooks.defaultView
-            });
-        });
-    };
-    Calendar.prototype.buildInitialState = function () {
-        return {
-            viewType: null,
-            loadingLevel: 0,
-            eventSourceLoadingLevel: 0,
-            currentDate: this.getInitialDate(),
-            dateProfile: null,
-            eventSources: {},
-            eventStore: createEmptyEventStore(),
-            dateSelection: null,
-            eventSelection: '',
-            eventDrag: null,
-            eventResize: null
-        };
-    };
-    Calendar.prototype.dispatch = function (action) {
-        this.actionQueue.push(action);
-        if (!this.isReducing) {
-            this.isReducing = true;
-            var oldState = this.state;
-            while (this.actionQueue.length) {
-                this.state = this.reduce(this.state, this.actionQueue.shift(), this);
-            }
-            var newState = this.state;
-            this.isReducing = false;
-            if (!oldState.loadingLevel && newState.loadingLevel) {
-                this.publiclyTrigger('loading', [true]);
-            }
-            else if (oldState.loadingLevel && !newState.loadingLevel) {
-                this.publiclyTrigger('loading', [false]);
-            }
-            var view = this.component && this.component.view;
-            if (oldState.eventStore !== newState.eventStore || this.needsFullRerender) {
-                if (oldState.eventStore) {
-                    this.isEventsUpdated = true;
-                }
-            }
-            if (oldState.dateProfile !== newState.dateProfile || this.needsFullRerender) {
-                if (oldState.dateProfile && view) { // why would view be null!?
-                    this.publiclyTrigger('datesDestroy', [
-                        {
-                            view: view,
-                            el: view.el
-                        }
-                    ]);
-                }
-                this.isDatesUpdated = true;
-            }
-            if (oldState.viewType !== newState.viewType || this.needsFullRerender) {
-                if (oldState.viewType && view) { // why would view be null!?
-                    this.publiclyTrigger('viewSkeletonDestroy', [
-                        {
-                            view: view,
-                            el: view.el
-                        }
-                    ]);
-                }
-                this.isViewUpdated = true;
-            }
-            this.requestRerender();
-        }
-    };
-    Calendar.prototype.reduce = function (state, action, calendar) {
-        return reduce(state, action, calendar);
-    };
-    // Render Queue
-    // -----------------------------------------------------------------------------------------------------------------
-    Calendar.prototype.requestRerender = function (needsFull) {
-        if (needsFull === void 0) { needsFull = false; }
-        this.needsRerender = true;
-        this.needsFullRerender = this.needsFullRerender || needsFull;
-        this.delayedRerender(); // will call a debounced-version of tryRerender
-    };
-    Calendar.prototype.tryRerender = function () {
-        if (this.component && // must be accepting renders
-            this.needsRerender && // indicates that a rerender was requested
-            !this.renderingPauseDepth && // not paused
-            !this.isRendering // not currently in the render loop
-        ) {
-            this.executeRender();
-        }
-    };
-    Calendar.prototype.batchRendering = function (func) {
-        this.renderingPauseDepth++;
-        func();
-        this.renderingPauseDepth--;
-        if (this.needsRerender) {
-            this.requestRerender();
-        }
-    };
-    // Rendering
-    // -----------------------------------------------------------------------------------------------------------------
-    Calendar.prototype.executeRender = function () {
-        var needsFullRerender = this.needsFullRerender; // save before clearing
-        // clear these BEFORE the render so that new values will accumulate during render
-        this.needsRerender = false;
-        this.needsFullRerender = false;
-        this.isRendering = true;
-        this.renderComponent(needsFullRerender);
-        this.isRendering = false;
-        // received a rerender request while rendering
-        if (this.needsRerender) {
-            this.delayedRerender();
-        }
-    };
-    /*
-    don't call this directly. use executeRender instead
-    */
-    Calendar.prototype.renderComponent = function (needsFull) {
-        var _a = this, state = _a.state, component = _a.component;
-        var viewType = state.viewType;
-        var viewSpec = this.viewSpecs[viewType];
-        var savedScroll = (needsFull && component) ? component.view.queryScroll() : null;
-        if (!viewSpec) {
-            throw new Error("View type \"" + viewType + "\" is not valid");
-        }
-        // if event sources are still loading and progressive rendering hasn't been enabled,
-        // keep rendering the last fully loaded set of events
-        var renderableEventStore = this.renderableEventStore =
-            (state.eventSourceLoadingLevel && !this.opt('progressiveEventRendering')) ?
-                this.renderableEventStore :
-                state.eventStore;
-        var eventUiSingleBase = this.buildEventUiSingleBase(viewSpec.options);
-        var eventUiBySource = this.buildEventUiBySource(state.eventSources);
-        var eventUiBases = this.eventUiBases = this.buildEventUiBases(renderableEventStore.defs, eventUiSingleBase, eventUiBySource);
-        if (needsFull || !component) {
-            if (component) {
-                component.freezeHeight(); // next component will unfreeze it
-                component.destroy();
-            }
-            component = this.component = new CalendarComponent({
-                calendar: this,
-                view: null,
-                dateEnv: this.dateEnv,
-                theme: this.theme,
-                options: this.optionsManager.computed
-            }, this.el);
-            this.isViewUpdated = true;
-            this.isDatesUpdated = true;
-            this.isEventsUpdated = true;
-        }
-        component.receiveProps(__assign({}, state, { viewSpec: viewSpec, dateProfile: state.dateProfile, dateProfileGenerator: this.dateProfileGenerators[viewType], eventStore: renderableEventStore, eventUiBases: eventUiBases, dateSelection: state.dateSelection, eventSelection: state.eventSelection, eventDrag: state.eventDrag, eventResize: state.eventResize }));
-        if (savedScroll) {
-            component.view.applyScroll(savedScroll, false);
-        }
-        if (this.isViewUpdated) {
-            this.isViewUpdated = false;
-            this.publiclyTrigger('viewSkeletonRender', [
-                {
-                    view: component.view,
-                    el: component.view.el
-                }
-            ]);
-        }
-        if (this.isDatesUpdated) {
-            this.isDatesUpdated = false;
-            this.publiclyTrigger('datesRender', [
-                {
-                    view: component.view,
-                    el: component.view.el
-                }
-            ]);
-        }
-        if (this.isEventsUpdated) {
-            this.isEventsUpdated = false;
-        }
-        this.releaseAfterSizingTriggers();
-    };
-    // Options
-    // -----------------------------------------------------------------------------------------------------------------
-    Calendar.prototype.setOption = function (name, val) {
-        var _a;
-        this.mutateOptions((_a = {}, _a[name] = val, _a), [], true);
-    };
-    Calendar.prototype.getOption = function (name) {
-        return this.optionsManager.computed[name];
-    };
-    Calendar.prototype.opt = function (name) {
-        return this.optionsManager.computed[name];
-    };
-    Calendar.prototype.viewOpt = function (name) {
-        return this.viewOpts()[name];
-    };
-    Calendar.prototype.viewOpts = function () {
-        return this.viewSpecs[this.state.viewType].options;
-    };
-    /*
-    handles option changes (like a diff)
-    */
-    Calendar.prototype.mutateOptions = function (updates, removals, isDynamic, deepEqual) {
-        var _this = this;
-        var changeHandlers = this.pluginSystem.hooks.optionChangeHandlers;
-        var normalUpdates = {};
-        var specialUpdates = {};
-        var oldDateEnv = this.dateEnv; // do this before handleOptions
-        var isTimeZoneDirty = false;
-        var isSizeDirty = false;
-        var anyDifficultOptions = Boolean(removals.length);
-        for (var name_1 in updates) {
-            if (changeHandlers[name_1]) {
-                specialUpdates[name_1] = updates[name_1];
-            }
-            else {
-                normalUpdates[name_1] = updates[name_1];
-            }
-        }
-        for (var name_2 in normalUpdates) {
-            if (/^(height|contentHeight|aspectRatio)$/.test(name_2)) {
-                isSizeDirty = true;
-            }
-            else if (/^(defaultDate|defaultView)$/.test(name_2)) ;
-            else {
-                anyDifficultOptions = true;
-                if (name_2 === 'timeZone') {
-                    isTimeZoneDirty = true;
-                }
-            }
-        }
-        this.optionsManager.mutate(normalUpdates, removals, isDynamic);
-        if (anyDifficultOptions) {
-            this.handleOptions(this.optionsManager.computed);
-            this.needsFullRerender = true;
-        }
-        this.batchRendering(function () {
-            if (anyDifficultOptions) {
-                if (isTimeZoneDirty) {
-                    _this.dispatch({
-                        type: 'CHANGE_TIMEZONE',
-                        oldDateEnv: oldDateEnv
-                    });
-                }
-                /* HACK
-                has the same effect as calling this.requestRerender(true)
-                but recomputes the state's dateProfile
-                */
-                _this.dispatch({
-                    type: 'SET_VIEW_TYPE',
-                    viewType: _this.state.viewType
-                });
-            }
-            else if (isSizeDirty) {
-                _this.updateSize();
-            }
-            // special updates
-            if (deepEqual) {
-                for (var name_3 in specialUpdates) {
-                    changeHandlers[name_3](specialUpdates[name_3], _this, deepEqual);
-                }
-            }
-        });
-    };
-    /*
-    rebuilds things based off of a complete set of refined options
-    */
-    Calendar.prototype.handleOptions = function (options) {
-        var _this = this;
-        var pluginHooks = this.pluginSystem.hooks;
-        this.defaultAllDayEventDuration = createDuration(options.defaultAllDayEventDuration);
-        this.defaultTimedEventDuration = createDuration(options.defaultTimedEventDuration);
-        this.delayedRerender = this.buildDelayedRerender(options.rerenderDelay);
-        this.theme = this.buildTheme(options);
-        var available = this.parseRawLocales(options.locales);
-        this.availableRawLocales = available.map;
-        var locale = this.buildLocale(options.locale || available.defaultCode, available.map);
-        this.dateEnv = this.buildDateEnv(locale, options.timeZone, pluginHooks.namedTimeZonedImpl, options.firstDay, options.weekNumberCalculation, options.weekLabel, pluginHooks.cmdFormatter);
-        this.selectionConfig = this.buildSelectionConfig(options); // needs dateEnv. do after :(
-        // ineffecient to do every time?
-        this.viewSpecs = buildViewSpecs(pluginHooks.views, this.optionsManager);
-        // ineffecient to do every time?
-        this.dateProfileGenerators = mapHash(this.viewSpecs, function (viewSpec) {
-            return new viewSpec.class.prototype.dateProfileGeneratorClass(viewSpec, _this);
-        });
-    };
-    Calendar.prototype.getAvailableLocaleCodes = function () {
-        return Object.keys(this.availableRawLocales);
-    };
-    Calendar.prototype._buildSelectionConfig = function (rawOpts) {
-        return processScopedUiProps('select', rawOpts, this);
-    };
-    Calendar.prototype._buildEventUiSingleBase = function (rawOpts) {
-        if (rawOpts.editable) { // so 'editable' affected events
-            rawOpts = __assign({}, rawOpts, { eventEditable: true });
-        }
-        return processScopedUiProps('event', rawOpts, this);
-    };
-    // Trigger
-    // -----------------------------------------------------------------------------------------------------------------
-    Calendar.prototype.hasPublicHandlers = function (name) {
-        return this.hasHandlers(name) ||
-            this.opt(name); // handler specified in options
-    };
-    Calendar.prototype.publiclyTrigger = function (name, args) {
-        var optHandler = this.opt(name);
-        this.triggerWith(name, this, args);
-        if (optHandler) {
-            return optHandler.apply(this, args);
-        }
-    };
-    Calendar.prototype.publiclyTriggerAfterSizing = function (name, args) {
-        var afterSizingTriggers = this.afterSizingTriggers;
-        (afterSizingTriggers[name] || (afterSizingTriggers[name] = [])).push(args);
-    };
-    Calendar.prototype.releaseAfterSizingTriggers = function () {
-        var afterSizingTriggers = this.afterSizingTriggers;
-        for (var name_4 in afterSizingTriggers) {
-            for (var _i = 0, _a = afterSizingTriggers[name_4]; _i < _a.length; _i++) {
-                var args = _a[_i];
-                this.publiclyTrigger(name_4, args);
-            }
-        }
-        this.afterSizingTriggers = {};
-    };
-    // View
-    // -----------------------------------------------------------------------------------------------------------------
-    // Returns a boolean about whether the view is okay to instantiate at some point
-    Calendar.prototype.isValidViewType = function (viewType) {
-        return Boolean(this.viewSpecs[viewType]);
-    };
-    Calendar.prototype.changeView = function (viewType, dateOrRange) {
-        var dateMarker = null;
-        if (dateOrRange) {
-            if (dateOrRange.start && dateOrRange.end) { // a range
-                this.optionsManager.mutate({ visibleRange: dateOrRange }, []); // will not rerender
-                this.handleOptions(this.optionsManager.computed); // ...but yuck
-            }
-            else { // a date
-                dateMarker = this.dateEnv.createMarker(dateOrRange); // just like gotoDate
-            }
-        }
-        this.unselect();
-        this.dispatch({
-            type: 'SET_VIEW_TYPE',
-            viewType: viewType,
-            dateMarker: dateMarker
-        });
-    };
-    // Forces navigation to a view for the given date.
-    // `viewType` can be a specific view name or a generic one like "week" or "day".
-    // needs to change
-    Calendar.prototype.zoomTo = function (dateMarker, viewType) {
-        var spec;
-        viewType = viewType || 'day'; // day is default zoom
-        spec = this.viewSpecs[viewType] ||
-            this.getUnitViewSpec(viewType);
-        this.unselect();
-        if (spec) {
-            this.dispatch({
-                type: 'SET_VIEW_TYPE',
-                viewType: spec.type,
-                dateMarker: dateMarker
-            });
-        }
-        else {
-            this.dispatch({
-                type: 'SET_DATE',
-                dateMarker: dateMarker
-            });
-        }
-    };
-    // Given a duration singular unit, like "week" or "day", finds a matching view spec.
-    // Preference is given to views that have corresponding buttons.
-    Calendar.prototype.getUnitViewSpec = function (unit) {
-        var component = this.component;
-        var viewTypes = [];
-        var i;
-        var spec;
-        // put views that have buttons first. there will be duplicates, but oh
-        if (component.header) {
-            viewTypes.push.apply(viewTypes, component.header.viewsWithButtons);
-        }
-        if (component.footer) {
-            viewTypes.push.apply(viewTypes, component.footer.viewsWithButtons);
-        }
-        for (var viewType in this.viewSpecs) {
-            viewTypes.push(viewType);
-        }
-        for (i = 0; i < viewTypes.length; i++) {
-            spec = this.viewSpecs[viewTypes[i]];
-            if (spec) {
-                if (spec.singleUnit === unit) {
-                    return spec;
-                }
-            }
-        }
-    };
-    // Current Date
-    // -----------------------------------------------------------------------------------------------------------------
-    Calendar.prototype.getInitialDate = function () {
-        var defaultDateInput = this.opt('defaultDate');
-        // compute the initial ambig-timezone date
-        if (defaultDateInput != null) {
-            return this.dateEnv.createMarker(defaultDateInput);
-        }
-        else {
-            return this.getNow(); // getNow already returns unzoned
-        }
-    };
-    Calendar.prototype.prev = function () {
-        this.unselect();
-        this.dispatch({ type: 'PREV' });
-    };
-    Calendar.prototype.next = function () {
-        this.unselect();
-        this.dispatch({ type: 'NEXT' });
-    };
-    Calendar.prototype.prevYear = function () {
-        this.unselect();
-        this.dispatch({
-            type: 'SET_DATE',
-            dateMarker: this.dateEnv.addYears(this.state.currentDate, -1)
-        });
-    };
-    Calendar.prototype.nextYear = function () {
-        this.unselect();
-        this.dispatch({
-            type: 'SET_DATE',
-            dateMarker: this.dateEnv.addYears(this.state.currentDate, 1)
-        });
-    };
-    Calendar.prototype.today = function () {
-        this.unselect();
-        this.dispatch({
-            type: 'SET_DATE',
-            dateMarker: this.getNow()
-        });
-    };
-    Calendar.prototype.gotoDate = function (zonedDateInput) {
-        this.unselect();
-        this.dispatch({
-            type: 'SET_DATE',
-            dateMarker: this.dateEnv.createMarker(zonedDateInput)
-        });
-    };
-    Calendar.prototype.incrementDate = function (deltaInput) {
-        var delta = createDuration(deltaInput);
-        if (delta) { // else, warn about invalid input?
-            this.unselect();
-            this.dispatch({
-                type: 'SET_DATE',
-                dateMarker: this.dateEnv.add(this.state.currentDate, delta)
-            });
-        }
-    };
-    // for external API
-    Calendar.prototype.getDate = function () {
-        return this.dateEnv.toDate(this.state.currentDate);
-    };
-    // Date Formatting Utils
-    // -----------------------------------------------------------------------------------------------------------------
-    Calendar.prototype.formatDate = function (d, formatter) {
-        var dateEnv = this.dateEnv;
-        return dateEnv.format(dateEnv.createMarker(d), createFormatter(formatter));
-    };
-    // `settings` is for formatter AND isEndExclusive
-    Calendar.prototype.formatRange = function (d0, d1, settings) {
-        var dateEnv = this.dateEnv;
-        return dateEnv.formatRange(dateEnv.createMarker(d0), dateEnv.createMarker(d1), createFormatter(settings, this.opt('defaultRangeSeparator')), settings);
-    };
-    Calendar.prototype.formatIso = function (d, omitTime) {
-        var dateEnv = this.dateEnv;
-        return dateEnv.formatIso(dateEnv.createMarker(d), { omitTime: omitTime });
-    };
-    // Sizing
-    // -----------------------------------------------------------------------------------------------------------------
-    Calendar.prototype.windowResize = function (ev) {
-        if (!this.isHandlingWindowResize &&
-            this.component && // why?
-            ev.target === window // not a jqui resize event
-        ) {
-            this.isHandlingWindowResize = true;
-            this.updateSize();
-            this.publiclyTrigger('windowResize', [this.view]);
-            this.isHandlingWindowResize = false;
-        }
-    };
-    Calendar.prototype.updateSize = function () {
-        if (this.component) { // when?
-            this.component.updateSize(true);
-        }
-    };
-    // Component Registration
-    // -----------------------------------------------------------------------------------------------------------------
-    Calendar.prototype.registerInteractiveComponent = function (component, settingsInput) {
-        var settings = parseInteractionSettings(component, settingsInput);
-        var DEFAULT_INTERACTIONS = [
-            EventClicking,
-            EventHovering
-        ];
-        var interactionClasses = DEFAULT_INTERACTIONS.concat(this.pluginSystem.hooks.componentInteractions);
-        var interactions = interactionClasses.map(function (interactionClass) {
-            return new interactionClass(settings);
-        });
-        this.interactionsStore[component.uid] = interactions;
-        interactionSettingsStore[component.uid] = settings;
-    };
-    Calendar.prototype.unregisterInteractiveComponent = function (component) {
-        for (var _i = 0, _a = this.interactionsStore[component.uid]; _i < _a.length; _i++) {
-            var listener = _a[_i];
-            listener.destroy();
-        }
-        delete this.interactionsStore[component.uid];
-        delete interactionSettingsStore[component.uid];
-    };
-    // Date Selection / Event Selection / DayClick
-    // -----------------------------------------------------------------------------------------------------------------
-    // this public method receives start/end dates in any format, with any timezone
-    // NOTE: args were changed from v3
-    Calendar.prototype.select = function (dateOrObj, endDate) {
-        var selectionInput;
-        if (endDate == null) {
-            if (dateOrObj.start != null) {
-                selectionInput = dateOrObj;
-            }
-            else {
-                selectionInput = {
-                    start: dateOrObj,
-                    end: null
-                };
-            }
-        }
-        else {
-            selectionInput = {
-                start: dateOrObj,
-                end: endDate
-            };
-        }
-        var selection = parseDateSpan(selectionInput, this.dateEnv, createDuration({ days: 1 }) // TODO: cache this?
-        );
-        if (selection) { // throw parse error otherwise?
-            this.dispatch({ type: 'SELECT_DATES', selection: selection });
-            this.triggerDateSelect(selection);
-        }
-    };
-    // public method
-    Calendar.prototype.unselect = function (pev) {
-        if (this.state.dateSelection) {
-            this.dispatch({ type: 'UNSELECT_DATES' });
-            this.triggerDateUnselect(pev);
-        }
-    };
-    Calendar.prototype.triggerDateSelect = function (selection, pev) {
-        var arg = __assign({}, this.buildDateSpanApi(selection), { jsEvent: pev ? pev.origEvent : null, view: this.view });
-        this.publiclyTrigger('select', [arg]);
-    };
-    Calendar.prototype.triggerDateUnselect = function (pev) {
-        this.publiclyTrigger('unselect', [
-            {
-                jsEvent: pev ? pev.origEvent : null,
-                view: this.view
-            }
-        ]);
-    };
-    // TODO: receive pev?
-    Calendar.prototype.triggerDateClick = function (dateSpan, dayEl, view, ev) {
-        var arg = __assign({}, this.buildDatePointApi(dateSpan), { dayEl: dayEl, jsEvent: ev, // Is this always a mouse event? See #4655
-            view: view });
-        this.publiclyTrigger('dateClick', [arg]);
-    };
-    Calendar.prototype.buildDatePointApi = function (dateSpan) {
-        var props = {};
-        for (var _i = 0, _a = this.pluginSystem.hooks.datePointTransforms; _i < _a.length; _i++) {
-            var transform = _a[_i];
-            __assign(props, transform(dateSpan, this));
-        }
-        __assign(props, buildDatePointApi(dateSpan, this.dateEnv));
-        return props;
-    };
-    Calendar.prototype.buildDateSpanApi = function (dateSpan) {
-        var props = {};
-        for (var _i = 0, _a = this.pluginSystem.hooks.dateSpanTransforms; _i < _a.length; _i++) {
-            var transform = _a[_i];
-            __assign(props, transform(dateSpan, this));
-        }
-        __assign(props, buildDateSpanApi(dateSpan, this.dateEnv));
-        return props;
-    };
-    // Date Utils
-    // -----------------------------------------------------------------------------------------------------------------
-    // Returns a DateMarker for the current date, as defined by the client's computer or from the `now` option
-    Calendar.prototype.getNow = function () {
-        var now = this.opt('now');
-        if (typeof now === 'function') {
-            now = now();
-        }
-        if (now == null) {
-            return this.dateEnv.createNowMarker();
-        }
-        return this.dateEnv.createMarker(now);
-    };
-    // Event-Date Utilities
-    // -----------------------------------------------------------------------------------------------------------------
-    // Given an event's allDay status and start date, return what its fallback end date should be.
-    // TODO: rename to computeDefaultEventEnd
-    Calendar.prototype.getDefaultEventEnd = function (allDay, marker) {
-        var end = marker;
-        if (allDay) {
-            end = startOfDay(end);
-            end = this.dateEnv.add(end, this.defaultAllDayEventDuration);
-        }
-        else {
-            end = this.dateEnv.add(end, this.defaultTimedEventDuration);
-        }
-        return end;
-    };
-    // Public Events API
-    // -----------------------------------------------------------------------------------------------------------------
-    Calendar.prototype.addEvent = function (eventInput, sourceInput) {
-        if (eventInput instanceof EventApi) {
-            var def = eventInput._def;
-            var instance = eventInput._instance;
-            // not already present? don't want to add an old snapshot
-            if (!this.state.eventStore.defs[def.defId]) {
-                this.dispatch({
-                    type: 'ADD_EVENTS',
-                    eventStore: eventTupleToStore({ def: def, instance: instance }) // TODO: better util for two args?
-                });
-            }
-            return eventInput;
-        }
-        var sourceId;
-        if (sourceInput instanceof EventSourceApi) {
-            sourceId = sourceInput.internalEventSource.sourceId;
-        }
-        else if (sourceInput != null) {
-            var sourceApi = this.getEventSourceById(sourceInput); // TODO: use an internal function
-            if (!sourceApi) {
-                console.warn('Could not find an event source with ID "' + sourceInput + '"'); // TODO: test
-                return null;
-            }
-            else {
-                sourceId = sourceApi.internalEventSource.sourceId;
-            }
-        }
-        var tuple = parseEvent(eventInput, sourceId, this);
-        if (tuple) {
-            this.dispatch({
-                type: 'ADD_EVENTS',
-                eventStore: eventTupleToStore(tuple)
-            });
-            return new EventApi(this, tuple.def, tuple.def.recurringDef ? null : tuple.instance);
-        }
-        return null;
-    };
-    // TODO: optimize
-    Calendar.prototype.getEventById = function (id) {
-        var _a = this.state.eventStore, defs = _a.defs, instances = _a.instances;
-        id = String(id);
-        for (var defId in defs) {
-            var def = defs[defId];
-            if (def.publicId === id) {
-                if (def.recurringDef) {
-                    return new EventApi(this, def, null);
-                }
-                else {
-                    for (var instanceId in instances) {
-                        var instance = instances[instanceId];
-                        if (instance.defId === def.defId) {
-                            return new EventApi(this, def, instance);
-                        }
-                    }
-                }
-            }
-        }
-        return null;
-    };
-    Calendar.prototype.getEvents = function () {
-        var _a = this.state.eventStore, defs = _a.defs, instances = _a.instances;
-        var eventApis = [];
-        for (var id in instances) {
-            var instance = instances[id];
-            var def = defs[instance.defId];
-            eventApis.push(new EventApi(this, def, instance));
-        }
-        return eventApis;
-    };
-    Calendar.prototype.removeAllEvents = function () {
-        this.dispatch({ type: 'REMOVE_ALL_EVENTS' });
-    };
-    Calendar.prototype.rerenderEvents = function () {
-        this.dispatch({ type: 'RESET_EVENTS' });
-    };
-    // Public Event Sources API
-    // -----------------------------------------------------------------------------------------------------------------
-    Calendar.prototype.getEventSources = function () {
-        var sourceHash = this.state.eventSources;
-        var sourceApis = [];
-        for (var internalId in sourceHash) {
-            sourceApis.push(new EventSourceApi(this, sourceHash[internalId]));
-        }
-        return sourceApis;
-    };
-    Calendar.prototype.getEventSourceById = function (id) {
-        var sourceHash = this.state.eventSources;
-        id = String(id);
-        for (var sourceId in sourceHash) {
-            if (sourceHash[sourceId].publicId === id) {
-                return new EventSourceApi(this, sourceHash[sourceId]);
-            }
-        }
-        return null;
-    };
-    Calendar.prototype.addEventSource = function (sourceInput) {
-        if (sourceInput instanceof EventSourceApi) {
-            // not already present? don't want to add an old snapshot
-            if (!this.state.eventSources[sourceInput.internalEventSource.sourceId]) {
-                this.dispatch({
-                    type: 'ADD_EVENT_SOURCES',
-                    sources: [sourceInput.internalEventSource]
-                });
-            }
-            return sourceInput;
-        }
-        var eventSource = parseEventSource(sourceInput, this);
-        if (eventSource) { // TODO: error otherwise?
-            this.dispatch({ type: 'ADD_EVENT_SOURCES', sources: [eventSource] });
-            return new EventSourceApi(this, eventSource);
-        }
-        return null;
-    };
-    Calendar.prototype.removeAllEventSources = function () {
-        this.dispatch({ type: 'REMOVE_ALL_EVENT_SOURCES' });
-    };
-    Calendar.prototype.refetchEvents = function () {
-        this.dispatch({ type: 'FETCH_EVENT_SOURCES' });
-    };
-    // Scroll
-    // -----------------------------------------------------------------------------------------------------------------
-    Calendar.prototype.scrollToTime = function (timeInput) {
-        var duration = createDuration(timeInput);
-        if (duration) {
-            this.component.view.scrollToDuration(duration);
-        }
-    };
-    return Calendar;
-}());
-EmitterMixin.mixInto(Calendar);
-// for memoizers
-// -----------------------------------------------------------------------------------------------------------------
-function buildDateEnv(locale, timeZone, namedTimeZoneImpl, firstDay, weekNumberCalculation, weekLabel, cmdFormatter) {
-    return new DateEnv({
-        calendarSystem: 'gregory',
-        timeZone: timeZone,
-        namedTimeZoneImpl: namedTimeZoneImpl,
-        locale: locale,
-        weekNumberCalculation: weekNumberCalculation,
-        firstDay: firstDay,
-        weekLabel: weekLabel,
-        cmdFormatter: cmdFormatter
-    });
-}
-function buildTheme(calendarOptions) {
-    var themeClass = this.pluginSystem.hooks.themeClasses[calendarOptions.themeSystem] || StandardTheme;
-    return new themeClass(calendarOptions);
-}
-function buildDelayedRerender(wait) {
-    var func = this.tryRerender.bind(this);
-    if (wait != null) {
-        func = debounce(func, wait);
-    }
-    return func;
-}
-function buildEventUiBySource(eventSources) {
-    return mapHash(eventSources, function (eventSource) {
-        return eventSource.ui;
-    });
-}
-function buildEventUiBases(eventDefs, eventUiSingleBase, eventUiBySource) {
-    var eventUiBases = { '': eventUiSingleBase };
-    for (var defId in eventDefs) {
-        var def = eventDefs[defId];
-        if (def.sourceId && eventUiBySource[def.sourceId]) {
-            eventUiBases[defId] = eventUiBySource[def.sourceId];
-        }
-    }
-    return eventUiBases;
-}
-
-var View = /** @class */ (function (_super) {
-    __extends(View, _super);
-    function View(context, viewSpec, dateProfileGenerator, parentEl) {
-        var _this = _super.call(this, context, createElement('div', { className: 'fc-view fc-' + viewSpec.type + '-view' }), true // isView (HACK)
-        ) || this;
-        _this.renderDatesMem = memoizeRendering(_this.renderDatesWrap, _this.unrenderDatesWrap);
-        _this.renderBusinessHoursMem = memoizeRendering(_this.renderBusinessHours, _this.unrenderBusinessHours, [_this.renderDatesMem]);
-        _this.renderDateSelectionMem = memoizeRendering(_this.renderDateSelectionWrap, _this.unrenderDateSelectionWrap, [_this.renderDatesMem]);
-        _this.renderEventsMem = memoizeRendering(_this.renderEvents, _this.unrenderEvents, [_this.renderDatesMem]);
-        _this.renderEventSelectionMem = memoizeRendering(_this.renderEventSelectionWrap, _this.unrenderEventSelectionWrap, [_this.renderEventsMem]);
-        _this.renderEventDragMem = memoizeRendering(_this.renderEventDragWrap, _this.unrenderEventDragWrap, [_this.renderDatesMem]);
-        _this.renderEventResizeMem = memoizeRendering(_this.renderEventResizeWrap, _this.unrenderEventResizeWrap, [_this.renderDatesMem]);
-        _this.viewSpec = viewSpec;
-        _this.dateProfileGenerator = dateProfileGenerator;
-        _this.type = viewSpec.type;
-        _this.eventOrderSpecs = parseFieldSpecs(_this.opt('eventOrder'));
-        _this.nextDayThreshold = createDuration(_this.opt('nextDayThreshold'));
-        parentEl.appendChild(_this.el);
-        _this.initialize();
-        return _this;
-    }
-    View.prototype.initialize = function () {
-    };
-    Object.defineProperty(View.prototype, "activeStart", {
-        // Date Setting/Unsetting
-        // -----------------------------------------------------------------------------------------------------------------
-        get: function () {
-            return this.dateEnv.toDate(this.props.dateProfile.activeRange.start);
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(View.prototype, "activeEnd", {
-        get: function () {
-            return this.dateEnv.toDate(this.props.dateProfile.activeRange.end);
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(View.prototype, "currentStart", {
-        get: function () {
-            return this.dateEnv.toDate(this.props.dateProfile.currentRange.start);
-        },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(View.prototype, "currentEnd", {
-        get: function () {
-            return this.dateEnv.toDate(this.props.dateProfile.currentRange.end);
-        },
-        enumerable: true,
-        configurable: true
-    });
-    // General Rendering
-    // -----------------------------------------------------------------------------------------------------------------
-    View.prototype.render = function (props) {
-        this.renderDatesMem(props.dateProfile);
-        this.renderBusinessHoursMem(props.businessHours);
-        this.renderDateSelectionMem(props.dateSelection);
-        this.renderEventsMem(props.eventStore);
-        this.renderEventSelectionMem(props.eventSelection);
-        this.renderEventDragMem(props.eventDrag);
-        this.renderEventResizeMem(props.eventResize);
-    };
-    View.prototype.destroy = function () {
-        _super.prototype.destroy.call(this);
-        this.renderDatesMem.unrender(); // should unrender everything else
-    };
-    // Sizing
-    // -----------------------------------------------------------------------------------------------------------------
-    View.prototype.updateSize = function (isResize, viewHeight, isAuto) {
-        var calendar = this.calendar;
-        if (isResize || // HACKS...
-            calendar.isViewUpdated ||
-            calendar.isDatesUpdated ||
-            calendar.isEventsUpdated) {
-            // sort of the catch-all sizing
-            // anything that might cause dimension changes
-            this.updateBaseSize(isResize, viewHeight, isAuto);
-        }
-    };
-    View.prototype.updateBaseSize = function (isResize, viewHeight, isAuto) {
-    };
-    // Date Rendering
-    // -----------------------------------------------------------------------------------------------------------------
-    View.prototype.renderDatesWrap = function (dateProfile) {
-        this.renderDates(dateProfile);
-        this.addScroll({
-            duration: createDuration(this.opt('scrollTime'))
-        });
-        this.startNowIndicator(dateProfile); // shouldn't render yet because updateSize will be called soon
-    };
-    View.prototype.unrenderDatesWrap = function () {
-        this.stopNowIndicator();
-        this.unrenderDates();
-    };
-    View.prototype.renderDates = function (dateProfile) { };
-    View.prototype.unrenderDates = function () { };
-    // Business Hours
-    // -----------------------------------------------------------------------------------------------------------------
-    View.prototype.renderBusinessHours = function (businessHours) { };
-    View.prototype.unrenderBusinessHours = function () { };
-    // Date Selection
-    // -----------------------------------------------------------------------------------------------------------------
-    View.prototype.renderDateSelectionWrap = function (selection) {
-        if (selection) {
-            this.renderDateSelection(selection);
-        }
-    };
-    View.prototype.unrenderDateSelectionWrap = function (selection) {
-        if (selection) {
-            this.unrenderDateSelection(selection);
-        }
-    };
-    View.prototype.renderDateSelection = function (selection) { };
-    View.prototype.unrenderDateSelection = function (selection) { };
-    // Event Rendering
-    // -----------------------------------------------------------------------------------------------------------------
-    View.prototype.renderEvents = function (eventStore) { };
-    View.prototype.unrenderEvents = function () { };
-    // util for subclasses
-    View.prototype.sliceEvents = function (eventStore, allDay) {
-        var props = this.props;
-        return sliceEventStore(eventStore, props.eventUiBases, props.dateProfile.activeRange, allDay ? this.nextDayThreshold : null).fg;
-    };
-    View.prototype.computeEventDraggable = function (eventDef, eventUi) {
-        var transformers = this.calendar.pluginSystem.hooks.isDraggableTransformers;
-        var val = eventUi.startEditable;
-        for (var _i = 0, transformers_1 = transformers; _i < transformers_1.length; _i++) {
-            var transformer = transformers_1[_i];
-            val = transformer(val, eventDef, eventUi, this);
-        }
-        return val;
-    };
-    View.prototype.computeEventStartResizable = function (eventDef, eventUi) {
-        return eventUi.durationEditable && this.opt('eventResizableFromStart');
-    };
-    View.prototype.computeEventEndResizable = function (eventDef, eventUi) {
-        return eventUi.durationEditable;
-    };
-    // Event Selection
-    // -----------------------------------------------------------------------------------------------------------------
-    View.prototype.renderEventSelectionWrap = function (instanceId) {
-        if (instanceId) {
-            this.renderEventSelection(instanceId);
-        }
-    };
-    View.prototype.unrenderEventSelectionWrap = function (instanceId) {
-        if (instanceId) {
-            this.unrenderEventSelection(instanceId);
-        }
-    };
-    View.prototype.renderEventSelection = function (instanceId) { };
-    View.prototype.unrenderEventSelection = function (instanceId) { };
-    // Event Drag
-    // -----------------------------------------------------------------------------------------------------------------
-    View.prototype.renderEventDragWrap = function (state) {
-        if (state) {
-            this.renderEventDrag(state);
-        }
-    };
-    View.prototype.unrenderEventDragWrap = function (state) {
-        if (state) {
-            this.unrenderEventDrag(state);
-        }
-    };
-    View.prototype.renderEventDrag = function (state) { };
-    View.prototype.unrenderEventDrag = function (state) { };
-    // Event Resize
-    // -----------------------------------------------------------------------------------------------------------------
-    View.prototype.renderEventResizeWrap = function (state) {
-        if (state) {
-            this.renderEventResize(state);
-        }
-    };
-    View.prototype.unrenderEventResizeWrap = function (state) {
-        if (state) {
-            this.unrenderEventResize(state);
-        }
-    };
-    View.prototype.renderEventResize = function (state) { };
-    View.prototype.unrenderEventResize = function (state) { };
-    /* Now Indicator
-    ------------------------------------------------------------------------------------------------------------------*/
-    // Immediately render the current time indicator and begins re-rendering it at an interval,
-    // which is defined by this.getNowIndicatorUnit().
-    // TODO: somehow do this for the current whole day's background too
-    View.prototype.startNowIndicator = function (dateProfile) {
-        var _this = this;
-        var dateEnv = this.dateEnv;
-        var unit;
-        var update;
-        var delay; // ms wait value
-        if (this.opt('nowIndicator')) {
-            unit = this.getNowIndicatorUnit(dateProfile);
-            if (unit) {
-                update = this.updateNowIndicator.bind(this);
-                this.initialNowDate = this.calendar.getNow();
-                this.initialNowQueriedMs = new Date().valueOf();
-                // wait until the beginning of the next interval
-                delay = dateEnv.add(dateEnv.startOf(this.initialNowDate, unit), createDuration(1, unit)).valueOf() - this.initialNowDate.valueOf();
-                // TODO: maybe always use setTimeout, waiting until start of next unit
-                this.nowIndicatorTimeoutID = setTimeout(function () {
-                    _this.nowIndicatorTimeoutID = null;
-                    update();
-                    if (unit === 'second') {
-                        delay = 1000; // every second
-                    }
-                    else {
-                        delay = 1000 * 60; // otherwise, every minute
-                    }
-                    _this.nowIndicatorIntervalID = setInterval(update, delay); // update every interval
-                }, delay);
-            }
-            // rendering will be initiated in updateSize
-        }
-    };
-    // rerenders the now indicator, computing the new current time from the amount of time that has passed
-    // since the initial getNow call.
-    View.prototype.updateNowIndicator = function () {
-        if (this.props.dateProfile && // a way to determine if dates were rendered yet
-            this.initialNowDate // activated before?
-        ) {
-            this.unrenderNowIndicator(); // won't unrender if unnecessary
-            this.renderNowIndicator(addMs(this.initialNowDate, new Date().valueOf() - this.initialNowQueriedMs));
-            this.isNowIndicatorRendered = true;
-        }
-    };
-    // Immediately unrenders the view's current time indicator and stops any re-rendering timers.
-    // Won't cause side effects if indicator isn't rendered.
-    View.prototype.stopNowIndicator = function () {
-        if (this.isNowIndicatorRendered) {
-            if (this.nowIndicatorTimeoutID) {
-                clearTimeout(this.nowIndicatorTimeoutID);
-                this.nowIndicatorTimeoutID = null;
-            }
-            if (this.nowIndicatorIntervalID) {
-                clearInterval(this.nowIndicatorIntervalID);
-                this.nowIndicatorIntervalID = null;
-            }
-            this.unrenderNowIndicator();
-            this.isNowIndicatorRendered = false;
-        }
-    };
-    View.prototype.getNowIndicatorUnit = function (dateProfile) {
-        // subclasses should implement
-    };
-    // Renders a current time indicator at the given datetime
-    View.prototype.renderNowIndicator = function (date) {
-        // SUBCLASSES MUST PASS TO CHILDREN!
-    };
-    // Undoes the rendering actions from renderNowIndicator
-    View.prototype.unrenderNowIndicator = function () {
-        // SUBCLASSES MUST PASS TO CHILDREN!
-    };
-    /* Scroller
-    ------------------------------------------------------------------------------------------------------------------*/
-    View.prototype.addScroll = function (scroll) {
-        var queuedScroll = this.queuedScroll || (this.queuedScroll = {});
-        __assign(queuedScroll, scroll);
-    };
-    View.prototype.popScroll = function (isResize) {
-        this.applyQueuedScroll(isResize);
-        this.queuedScroll = null;
-    };
-    View.prototype.applyQueuedScroll = function (isResize) {
-        this.applyScroll(this.queuedScroll || {}, isResize);
-    };
-    View.prototype.queryScroll = function () {
-        var scroll = {};
-        if (this.props.dateProfile) { // dates rendered yet?
-            __assign(scroll, this.queryDateScroll());
-        }
-        return scroll;
-    };
-    View.prototype.applyScroll = function (scroll, isResize) {
-        var duration = scroll.duration;
-        if (duration != null) {
-            delete scroll.duration;
-            if (this.props.dateProfile) { // dates rendered yet?
-                __assign(scroll, this.computeDateScroll(duration));
-            }
-        }
-        if (this.props.dateProfile) { // dates rendered yet?
-            this.applyDateScroll(scroll);
-        }
-    };
-    View.prototype.computeDateScroll = function (duration) {
-        return {}; // subclasses must implement
-    };
-    View.prototype.queryDateScroll = function () {
-        return {}; // subclasses must implement
-    };
-    View.prototype.applyDateScroll = function (scroll) {
-        // subclasses must implement
-    };
-    // for API
-    View.prototype.scrollToDuration = function (duration) {
-        this.applyScroll({ duration: duration }, false);
-    };
-    return View;
-}(DateComponent));
-EmitterMixin.mixInto(View);
-View.prototype.usesMinMaxTime = false;
-View.prototype.dateProfileGeneratorClass = DateProfileGenerator;
-
-var FgEventRenderer = /** @class */ (function () {
-    function FgEventRenderer(context) {
-        this.segs = [];
-        this.isSizeDirty = false;
-        this.context = context;
-    }
-    FgEventRenderer.prototype.renderSegs = function (segs, mirrorInfo) {
-        this.rangeUpdated(); // called too frequently :(
-        // render an `.el` on each seg
-        // returns a subset of the segs. segs that were actually rendered
-        segs = this.renderSegEls(segs, mirrorInfo);
-        this.segs = segs;
-        this.attachSegs(segs, mirrorInfo);
-        this.isSizeDirty = true;
-        this.context.view.triggerRenderedSegs(this.segs, Boolean(mirrorInfo));
-    };
-    FgEventRenderer.prototype.unrender = function (_segs, mirrorInfo) {
-        this.context.view.triggerWillRemoveSegs(this.segs, Boolean(mirrorInfo));
-        this.detachSegs(this.segs);
-        this.segs = [];
-    };
-    // Updates values that rely on options and also relate to range
-    FgEventRenderer.prototype.rangeUpdated = function () {
-        var options = this.context.options;
-        var displayEventTime;
-        var displayEventEnd;
-        this.eventTimeFormat = createFormatter(options.eventTimeFormat || this.computeEventTimeFormat(), options.defaultRangeSeparator);
-        displayEventTime = options.displayEventTime;
-        if (displayEventTime == null) {
-            displayEventTime = this.computeDisplayEventTime(); // might be based off of range
-        }
-        displayEventEnd = options.displayEventEnd;
-        if (displayEventEnd == null) {
-            displayEventEnd = this.computeDisplayEventEnd(); // might be based off of range
-        }
-        this.displayEventTime = displayEventTime;
-        this.displayEventEnd = displayEventEnd;
-    };
-    // Renders and assigns an `el` property for each foreground event segment.
-    // Only returns segments that successfully rendered.
-    FgEventRenderer.prototype.renderSegEls = function (segs, mirrorInfo) {
-        var html = '';
-        var i;
-        if (segs.length) { // don't build an empty html string
-            // build a large concatenation of event segment HTML
-            for (i = 0; i < segs.length; i++) {
-                html += this.renderSegHtml(segs[i], mirrorInfo);
-            }
-            // Grab individual elements from the combined HTML string. Use each as the default rendering.
-            // Then, compute the 'el' for each segment. An el might be null if the eventRender callback returned false.
-            htmlToElements(html).forEach(function (el, i) {
-                var seg = segs[i];
-                if (el) {
-                    seg.el = el;
-                }
-            });
-            segs = filterSegsViaEls(this.context.view, segs, Boolean(mirrorInfo));
-        }
-        return segs;
-    };
-    // Generic utility for generating the HTML classNames for an event segment's element
-    FgEventRenderer.prototype.getSegClasses = function (seg, isDraggable, isResizable, mirrorInfo) {
-        var classes = [
-            'fc-event',
-            seg.isStart ? 'fc-start' : 'fc-not-start',
-            seg.isEnd ? 'fc-end' : 'fc-not-end'
-        ].concat(seg.eventRange.ui.classNames);
-        if (isDraggable) {
-            classes.push('fc-draggable');
-        }
-        if (isResizable) {
-            classes.push('fc-resizable');
-        }
-        if (mirrorInfo) {
-            classes.push('fc-mirror');
-            if (mirrorInfo.isDragging) {
-                classes.push('fc-dragging');
-            }
-            if (mirrorInfo.isResizing) {
-                classes.push('fc-resizing');
-            }
-        }
-        return classes;
-    };
-    // Compute the text that should be displayed on an event's element.
-    // `range` can be the Event object itself, or something range-like, with at least a `start`.
-    // If event times are disabled, or the event has no time, will return a blank string.
-    // If not specified, formatter will default to the eventTimeFormat setting,
-    // and displayEnd will default to the displayEventEnd setting.
-    FgEventRenderer.prototype.getTimeText = function (eventRange, formatter, displayEnd) {
-        var def = eventRange.def, instance = eventRange.instance;
-        return this._getTimeText(instance.range.start, def.hasEnd ? instance.range.end : null, def.allDay, formatter, displayEnd, instance.forcedStartTzo, instance.forcedEndTzo);
-    };
-    FgEventRenderer.prototype._getTimeText = function (start, end, allDay, formatter, displayEnd, forcedStartTzo, forcedEndTzo) {
-        var dateEnv = this.context.dateEnv;
-        if (formatter == null) {
-            formatter = this.eventTimeFormat;
-        }
-        if (displayEnd == null) {
-            displayEnd = this.displayEventEnd;
-        }
-        if (this.displayEventTime && !allDay) {
-            if (displayEnd && end) {
-                return dateEnv.formatRange(start, end, formatter, {
-                    forcedStartTzo: forcedStartTzo,
-                    forcedEndTzo: forcedEndTzo
-                });
-            }
-            else {
-                return dateEnv.format(start, formatter, {
-                    forcedTzo: forcedStartTzo
-                });
-            }
-        }
-        return '';
-    };
-    FgEventRenderer.prototype.computeEventTimeFormat = function () {
-        return {
-            hour: 'numeric',
-            minute: '2-digit',
-            omitZeroMinute: true
-        };
-    };
-    FgEventRenderer.prototype.computeDisplayEventTime = function () {
-        return true;
-    };
-    FgEventRenderer.prototype.computeDisplayEventEnd = function () {
-        return true;
-    };
-    // Utility for generating event skin-related CSS properties
-    FgEventRenderer.prototype.getSkinCss = function (ui) {
-        return {
-            'background-color': ui.backgroundColor,
-            'border-color': ui.borderColor,
-            color: ui.textColor
-        };
-    };
-    FgEventRenderer.prototype.sortEventSegs = function (segs) {
-        var specs = this.context.view.eventOrderSpecs;
-        var objs = segs.map(buildSegCompareObj);
-        objs.sort(function (obj0, obj1) {
-            return compareByFieldSpecs(obj0, obj1, specs);
-        });
-        return objs.map(function (c) {
-            return c._seg;
-        });
-    };
-    FgEventRenderer.prototype.computeSizes = function (force) {
-        if (force || this.isSizeDirty) {
-            this.computeSegSizes(this.segs);
-        }
-    };
-    FgEventRenderer.prototype.assignSizes = function (force) {
-        if (force || this.isSizeDirty) {
-            this.assignSegSizes(this.segs);
-            this.isSizeDirty = false;
-        }
-    };
-    FgEventRenderer.prototype.computeSegSizes = function (segs) {
-    };
-    FgEventRenderer.prototype.assignSegSizes = function (segs) {
-    };
-    // Manipulation on rendered segs
-    FgEventRenderer.prototype.hideByHash = function (hash) {
-        if (hash) {
-            for (var _i = 0, _a = this.segs; _i < _a.length; _i++) {
-                var seg = _a[_i];
-                if (hash[seg.eventRange.instance.instanceId]) {
-                    seg.el.style.visibility = 'hidden';
-                }
-            }
-        }
-    };
-    FgEventRenderer.prototype.showByHash = function (hash) {
-        if (hash) {
-            for (var _i = 0, _a = this.segs; _i < _a.length; _i++) {
-                var seg = _a[_i];
-                if (hash[seg.eventRange.instance.instanceId]) {
-                    seg.el.style.visibility = '';
-                }
-            }
-        }
-    };
-    FgEventRenderer.prototype.selectByInstanceId = function (instanceId) {
-        if (instanceId) {
-            for (var _i = 0, _a = this.segs; _i < _a.length; _i++) {
-                var seg = _a[_i];
-                var eventInstance = seg.eventRange.instance;
-                if (eventInstance && eventInstance.instanceId === instanceId &&
-                    seg.el // necessary?
-                ) {
-                    seg.el.classList.add('fc-selected');
-                }
-            }
-        }
-    };
-    FgEventRenderer.prototype.unselectByInstanceId = function (instanceId) {
-        if (instanceId) {
-            for (var _i = 0, _a = this.segs; _i < _a.length; _i++) {
-                var seg = _a[_i];
-                if (seg.el) { // necessary?
-                    seg.el.classList.remove('fc-selected');
-                }
-            }
-        }
-    };
-    return FgEventRenderer;
-}());
-// returns a object with all primitive props that can be compared
-function buildSegCompareObj(seg) {
-    var eventDef = seg.eventRange.def;
-    var range = seg.eventRange.instance.range;
-    var start = range.start ? range.start.valueOf() : 0; // TODO: better support for open-range events
-    var end = range.end ? range.end.valueOf() : 0; // "
-    return __assign({}, eventDef.extendedProps, eventDef, { id: eventDef.publicId, start: start,
-        end: end, duration: end - start, allDay: Number(eventDef.allDay), _seg: seg // for later retrieval
-     });
-}
-
-var FillRenderer = /** @class */ (function () {
-    function FillRenderer(context) {
-        this.fillSegTag = 'div';
-        this.dirtySizeFlags = {};
-        this.context = context;
-        this.containerElsByType = {};
-        this.segsByType = {};
-    }
-    FillRenderer.prototype.getSegsByType = function (type) {
-        return this.segsByType[type] || [];
-    };
-    FillRenderer.prototype.renderSegs = function (type, segs) {
-        var _a;
-        var renderedSegs = this.renderSegEls(type, segs); // assignes `.el` to each seg. returns successfully rendered segs
-        var containerEls = this.attachSegs(type, renderedSegs);
-        if (containerEls) {
-            (_a = (this.containerElsByType[type] || (this.containerElsByType[type] = []))).push.apply(_a, containerEls);
-        }
-        this.segsByType[type] = renderedSegs;
-        if (type === 'bgEvent') {
-            this.context.view.triggerRenderedSegs(renderedSegs, false); // isMirror=false
-        }
-        this.dirtySizeFlags[type] = true;
-    };
-    // Unrenders a specific type of fill that is currently rendered on the grid
-    FillRenderer.prototype.unrender = function (type) {
-        var segs = this.segsByType[type];
-        if (segs) {
-            if (type === 'bgEvent') {
-                this.context.view.triggerWillRemoveSegs(segs, false); // isMirror=false
-            }
-            this.detachSegs(type, segs);
-        }
-    };
-    // Renders and assigns an `el` property for each fill segment. Generic enough to work with different types.
-    // Only returns segments that successfully rendered.
-    FillRenderer.prototype.renderSegEls = function (type, segs) {
-        var _this = this;
-        var html = '';
-        var i;
-        if (segs.length) {
-            // build a large concatenation of segment HTML
-            for (i = 0; i < segs.length; i++) {
-                html += this.renderSegHtml(type, segs[i]);
-            }
-            // Grab individual elements from the combined HTML string. Use each as the default rendering.
-            // Then, compute the 'el' for each segment.
-            htmlToElements(html).forEach(function (el, i) {
-                var seg = segs[i];
-                if (el) {
-                    seg.el = el;
-                }
-            });
-            if (type === 'bgEvent') {
-                segs = filterSegsViaEls(this.context.view, segs, false // isMirror. background events can never be mirror elements
-                );
-            }
-            // correct element type? (would be bad if a non-TD were inserted into a table for example)
-            segs = segs.filter(function (seg) {
-                return elementMatches(seg.el, _this.fillSegTag);
-            });
-        }
-        return segs;
-    };
-    // Builds the HTML needed for one fill segment. Generic enough to work with different types.
-    FillRenderer.prototype.renderSegHtml = function (type, seg) {
-        var css = null;
-        var classNames = [];
-        if (type !== 'highlight' && type !== 'businessHours') {
-            css = {
-                'background-color': seg.eventRange.ui.backgroundColor
-            };
-        }
-        if (type !== 'highlight') {
-            classNames = classNames.concat(seg.eventRange.ui.classNames);
-        }
-        if (type === 'businessHours') {
-            classNames.push('fc-bgevent');
-        }
-        else {
-            classNames.push('fc-' + type.toLowerCase());
-        }
-        return '<' + this.fillSegTag +
-            (classNames.length ? ' class="' + classNames.join(' ') + '"' : '') +
-            (css ? ' style="' + cssToStr(css) + '"' : '') +
-            '></' + this.fillSegTag + '>';
-    };
-    FillRenderer.prototype.detachSegs = function (type, segs) {
-        var containerEls = this.containerElsByType[type];
-        if (containerEls) {
-            containerEls.forEach(removeElement);
-            delete this.containerElsByType[type];
-        }
-    };
-    FillRenderer.prototype.computeSizes = function (force) {
-        for (var type in this.segsByType) {
-            if (force || this.dirtySizeFlags[type]) {
-                this.computeSegSizes(this.segsByType[type]);
-            }
-        }
-    };
-    FillRenderer.prototype.assignSizes = function (force) {
-        for (var type in this.segsByType) {
-            if (force || this.dirtySizeFlags[type]) {
-                this.assignSegSizes(this.segsByType[type]);
-            }
-        }
-        this.dirtySizeFlags = {};
-    };
-    FillRenderer.prototype.computeSegSizes = function (segs) {
-    };
-    FillRenderer.prototype.assignSegSizes = function (segs) {
-    };
-    return FillRenderer;
-}());
-
-var NamedTimeZoneImpl = /** @class */ (function () {
-    function NamedTimeZoneImpl(timeZoneName) {
-        this.timeZoneName = timeZoneName;
-    }
-    return NamedTimeZoneImpl;
-}());
-
-/*
-An abstraction for a dragging interaction originating on an event.
-Does higher-level things than PointerDragger, such as possibly:
-- a "mirror" that moves with the pointer
-- a minimum number of pixels or other criteria for a true drag to begin
-
-subclasses must emit:
-- pointerdown
-- dragstart
-- dragmove
-- pointerup
-- dragend
-*/
-var ElementDragging = /** @class */ (function () {
-    function ElementDragging(el) {
-        this.emitter = new EmitterMixin();
-    }
-    ElementDragging.prototype.destroy = function () {
-    };
-    ElementDragging.prototype.setMirrorIsVisible = function (bool) {
-        // optional if subclass doesn't want to support a mirror
-    };
-    ElementDragging.prototype.setMirrorNeedsRevert = function (bool) {
-        // optional if subclass doesn't want to support a mirror
-    };
-    ElementDragging.prototype.setAutoScrollEnabled = function (bool) {
-        // optional
-    };
-    return ElementDragging;
-}());
-
-function formatDate(dateInput, settings) {
-    if (settings === void 0) { settings = {}; }
-    var dateEnv = buildDateEnv$1(settings);
-    var formatter = createFormatter(settings);
-    var dateMeta = dateEnv.createMarkerMeta(dateInput);
-    if (!dateMeta) { // TODO: warning?
-        return '';
-    }
-    return dateEnv.format(dateMeta.marker, formatter, {
-        forcedTzo: dateMeta.forcedTzo
-    });
-}
-function formatRange(startInput, endInput, settings // mixture of env and formatter settings
-) {
-    var dateEnv = buildDateEnv$1(typeof settings === 'object' && settings ? settings : {}); // pass in if non-null object
-    var formatter = createFormatter(settings, globalDefaults.defaultRangeSeparator);
-    var startMeta = dateEnv.createMarkerMeta(startInput);
-    var endMeta = dateEnv.createMarkerMeta(endInput);
-    if (!startMeta || !endMeta) { // TODO: warning?
-        return '';
-    }
-    return dateEnv.formatRange(startMeta.marker, endMeta.marker, formatter, {
-        forcedStartTzo: startMeta.forcedTzo,
-        forcedEndTzo: endMeta.forcedTzo,
-        isEndExclusive: settings.isEndExclusive
-    });
-}
-// TODO: more DRY and optimized
-function buildDateEnv$1(settings) {
-    var locale = buildLocale(settings.locale || 'en', parseRawLocales([]).map); // TODO: don't hardcode 'en' everywhere
-    // ensure required settings
-    settings = __assign({ timeZone: globalDefaults.timeZone, calendarSystem: 'gregory' }, settings, { locale: locale });
-    return new DateEnv(settings);
-}
-
-var DRAG_META_PROPS = {
-    startTime: createDuration,
-    duration: createDuration,
-    create: Boolean,
-    sourceId: String
-};
-var DRAG_META_DEFAULTS = {
-    create: true
-};
-function parseDragMeta(raw) {
-    var leftoverProps = {};
-    var refined = refineProps(raw, DRAG_META_PROPS, DRAG_META_DEFAULTS, leftoverProps);
-    refined.leftoverProps = leftoverProps;
-    return refined;
-}
-
-// Computes a default column header formatting string if `colFormat` is not explicitly defined
-function computeFallbackHeaderFormat(datesRepDistinctDays, dayCnt) {
-    // if more than one week row, or if there are a lot of columns with not much space,
-    // put just the day numbers will be in each cell
-    if (!datesRepDistinctDays || dayCnt > 10) {
-        return { weekday: 'short' }; // "Sat"
-    }
-    else if (dayCnt > 1) {
-        return { weekday: 'short', month: 'numeric', day: 'numeric', omitCommas: true }; // "Sat 11/12"
-    }
-    else {
-        return { weekday: 'long' }; // "Saturday"
-    }
-}
-function renderDateCell(dateMarker, dateProfile, datesRepDistinctDays, colCnt, colHeadFormat, context, colspan, otherAttrs) {
-    var view = context.view, dateEnv = context.dateEnv, theme = context.theme, options = context.options;
-    var isDateValid = rangeContainsMarker(dateProfile.activeRange, dateMarker); // TODO: called too frequently. cache somehow.
-    var classNames = [
-        'fc-day-header',
-        theme.getClass('widgetHeader')
-    ];
-    var innerHtml;
-    if (typeof options.columnHeaderHtml === 'function') {
-        innerHtml = options.columnHeaderHtml(dateEnv.toDate(dateMarker));
-    }
-    else if (typeof options.columnHeaderText === 'function') {
-        innerHtml = htmlEscape(options.columnHeaderText(dateEnv.toDate(dateMarker)));
-    }
-    else {
-        innerHtml = htmlEscape(dateEnv.format(dateMarker, colHeadFormat));
-    }
-    // if only one row of days, the classNames on the header can represent the specific days beneath
-    if (datesRepDistinctDays) {
-        classNames = classNames.concat(
-        // includes the day-of-week class
-        // noThemeHighlight=true (don't highlight the header)
-        getDayClasses(dateMarker, dateProfile, context, true));
-    }
-    else {
-        classNames.push('fc-' + DAY_IDS[dateMarker.getUTCDay()]); // only add the day-of-week class
-    }
-    return '' +
-        '<th class="' + classNames.join(' ') + '"' +
-        ((isDateValid && datesRepDistinctDays) ?
-            ' data-date="' + dateEnv.formatIso(dateMarker, { omitTime: true }) + '"' :
-            '') +
-        (colspan > 1 ?
-            ' colspan="' + colspan + '"' :
-            '') +
-        (otherAttrs ?
-            ' ' + otherAttrs :
-            '') +
-        '>' +
-        (isDateValid ?
-            // don't make a link if the heading could represent multiple days, or if there's only one day (forceOff)
-            buildGotoAnchorHtml(view, { date: dateMarker, forceOff: !datesRepDistinctDays || colCnt === 1 }, innerHtml) :
-            // if not valid, display text, but no link
-            innerHtml) +
-        '</th>';
-}
-
-var DayHeader = /** @class */ (function (_super) {
-    __extends(DayHeader, _super);
-    function DayHeader(context, parentEl) {
-        var _this = _super.call(this, context) || this;
-        parentEl.innerHTML = ''; // because might be nbsp
-        parentEl.appendChild(_this.el = htmlToElement('<div class="fc-row ' + _this.theme.getClass('headerRow') + '">' +
-            '<table class="' + _this.theme.getClass('tableGrid') + '">' +
-            '<thead></thead>' +
-            '</table>' +
-            '</div>'));
-        _this.thead = _this.el.querySelector('thead');
-        return _this;
-    }
-    DayHeader.prototype.destroy = function () {
-        removeElement(this.el);
-    };
-    DayHeader.prototype.render = function (props) {
-        var dates = props.dates, datesRepDistinctDays = props.datesRepDistinctDays;
-        var parts = [];
-        if (props.renderIntroHtml) {
-            parts.push(props.renderIntroHtml());
-        }
-        var colHeadFormat = createFormatter(this.opt('columnHeaderFormat') ||
-            computeFallbackHeaderFormat(datesRepDistinctDays, dates.length));
-        for (var _i = 0, dates_1 = dates; _i < dates_1.length; _i++) {
-            var date = dates_1[_i];
-            parts.push(renderDateCell(date, props.dateProfile, datesRepDistinctDays, dates.length, colHeadFormat, this.context));
-        }
-        if (this.isRtl) {
-            parts.reverse();
-        }
-        this.thead.innerHTML = '<tr>' + parts.join('') + '</tr>';
-    };
-    return DayHeader;
-}(Component));
-
-var DaySeries = /** @class */ (function () {
-    function DaySeries(range, dateProfileGenerator) {
-        var date = range.start;
-        var end = range.end;
-        var indices = [];
-        var dates = [];
-        var dayIndex = -1;
-        while (date < end) { // loop each day from start to end
-            if (dateProfileGenerator.isHiddenDay(date)) {
-                indices.push(dayIndex + 0.5); // mark that it's between indices
-            }
-            else {
-                dayIndex++;
-                indices.push(dayIndex);
-                dates.push(date);
-            }
-            date = addDays(date, 1);
-        }
-        this.dates = dates;
-        this.indices = indices;
-        this.cnt = dates.length;
-    }
-    DaySeries.prototype.sliceRange = function (range) {
-        var firstIndex = this.getDateDayIndex(range.start); // inclusive first index
-        var lastIndex = this.getDateDayIndex(addDays(range.end, -1)); // inclusive last index
-        var clippedFirstIndex = Math.max(0, firstIndex);
-        var clippedLastIndex = Math.min(this.cnt - 1, lastIndex);
-        // deal with in-between indices
-        clippedFirstIndex = Math.ceil(clippedFirstIndex); // in-between starts round to next cell
-        clippedLastIndex = Math.floor(clippedLastIndex); // in-between ends round to prev cell
-        if (clippedFirstIndex <= clippedLastIndex) {
-            return {
-                firstIndex: clippedFirstIndex,
-                lastIndex: clippedLastIndex,
-                isStart: firstIndex === clippedFirstIndex,
-                isEnd: lastIndex === clippedLastIndex
-            };
-        }
-        else {
-            return null;
-        }
-    };
-    // Given a date, returns its chronolocial cell-index from the first cell of the grid.
-    // If the date lies between cells (because of hiddenDays), returns a floating-point value between offsets.
-    // If before the first offset, returns a negative number.
-    // If after the last offset, returns an offset past the last cell offset.
-    // Only works for *start* dates of cells. Will not work for exclusive end dates for cells.
-    DaySeries.prototype.getDateDayIndex = function (date) {
-        var indices = this.indices;
-        var dayOffset = Math.floor(diffDays(this.dates[0], date));
-        if (dayOffset < 0) {
-            return indices[0] - 1;
-        }
-        else if (dayOffset >= indices.length) {
-            return indices[indices.length - 1] + 1;
-        }
-        else {
-            return indices[dayOffset];
-        }
-    };
-    return DaySeries;
-}());
-
-var DayTable = /** @class */ (function () {
-    function DayTable(daySeries, breakOnWeeks) {
-        var dates = daySeries.dates;
-        var daysPerRow;
-        var firstDay;
-        var rowCnt;
-        if (breakOnWeeks) {
-            // count columns until the day-of-week repeats
-            firstDay = dates[0].getUTCDay();
-            for (daysPerRow = 1; daysPerRow < dates.length; daysPerRow++) {
-                if (dates[daysPerRow].getUTCDay() === firstDay) {
-                    break;
-                }
-            }
-            rowCnt = Math.ceil(dates.length / daysPerRow);
-        }
-        else {
-            rowCnt = 1;
-            daysPerRow = dates.length;
-        }
-        this.rowCnt = rowCnt;
-        this.colCnt = daysPerRow;
-        this.daySeries = daySeries;
-        this.cells = this.buildCells();
-        this.headerDates = this.buildHeaderDates();
-    }
-    DayTable.prototype.buildCells = function () {
-        var rows = [];
-        for (var row = 0; row < this.rowCnt; row++) {
-            var cells = [];
-            for (var col = 0; col < this.colCnt; col++) {
-                cells.push(this.buildCell(row, col));
-            }
-            rows.push(cells);
-        }
-        return rows;
-    };
-    DayTable.prototype.buildCell = function (row, col) {
-        return {
-            date: this.daySeries.dates[row * this.colCnt + col]
-        };
-    };
-    DayTable.prototype.buildHeaderDates = function () {
-        var dates = [];
-        for (var col = 0; col < this.colCnt; col++) {
-            dates.push(this.cells[0][col].date);
-        }
-        return dates;
-    };
-    DayTable.prototype.sliceRange = function (range) {
-        var colCnt = this.colCnt;
-        var seriesSeg = this.daySeries.sliceRange(range);
-        var segs = [];
-        if (seriesSeg) {
-            var firstIndex = seriesSeg.firstIndex, lastIndex = seriesSeg.lastIndex;
-            var index = firstIndex;
-            while (index <= lastIndex) {
-                var row = Math.floor(index / colCnt);
-                var nextIndex = Math.min((row + 1) * colCnt, lastIndex + 1);
-                segs.push({
-                    row: row,
-                    firstCol: index % colCnt,
-                    lastCol: (nextIndex - 1) % colCnt,
-                    isStart: seriesSeg.isStart && index === firstIndex,
-                    isEnd: seriesSeg.isEnd && (nextIndex - 1) === lastIndex
-                });
-                index = nextIndex;
-            }
-        }
-        return segs;
-    };
-    return DayTable;
-}());
-
-var Slicer = /** @class */ (function () {
-    function Slicer() {
-        this.sliceBusinessHours = memoize(this._sliceBusinessHours);
-        this.sliceDateSelection = memoize(this._sliceDateSpan);
-        this.sliceEventStore = memoize(this._sliceEventStore);
-        this.sliceEventDrag = memoize(this._sliceInteraction);
-        this.sliceEventResize = memoize(this._sliceInteraction);
-    }
-    Slicer.prototype.sliceProps = function (props, dateProfile, nextDayThreshold, component) {
-        var extraArgs = [];
-        for (var _i = 4; _i < arguments.length; _i++) {
-            extraArgs[_i - 4] = arguments[_i];
-        }
-        var eventUiBases = props.eventUiBases;
-        var eventSegs = this.sliceEventStore.apply(this, [props.eventStore, eventUiBases, dateProfile, nextDayThreshold, component].concat(extraArgs));
-        return {
-            dateSelectionSegs: this.sliceDateSelection.apply(this, [props.dateSelection, eventUiBases, component].concat(extraArgs)),
-            businessHourSegs: this.sliceBusinessHours.apply(this, [props.businessHours, dateProfile, nextDayThreshold, component].concat(extraArgs)),
-            fgEventSegs: eventSegs.fg,
-            bgEventSegs: eventSegs.bg,
-            eventDrag: this.sliceEventDrag.apply(this, [props.eventDrag, eventUiBases, dateProfile, nextDayThreshold, component].concat(extraArgs)),
-            eventResize: this.sliceEventResize.apply(this, [props.eventResize, eventUiBases, dateProfile, nextDayThreshold, component].concat(extraArgs)),
-            eventSelection: props.eventSelection
-        }; // TODO: give interactionSegs?
-    };
-    Slicer.prototype.sliceNowDate = function (// does not memoize
-    date, component) {
-        var extraArgs = [];
-        for (var _i = 2; _i < arguments.length; _i++) {
-            extraArgs[_i - 2] = arguments[_i];
-        }
-        return this._sliceDateSpan.apply(this, [{ range: { start: date, end: addMs(date, 1) }, allDay: false },
-            {},
-            component].concat(extraArgs));
-    };
-    Slicer.prototype._sliceBusinessHours = function (businessHours, dateProfile, nextDayThreshold, component) {
-        var extraArgs = [];
-        for (var _i = 4; _i < arguments.length; _i++) {
-            extraArgs[_i - 4] = arguments[_i];
-        }
-        if (!businessHours) {
-            return [];
-        }
-        return this._sliceEventStore.apply(this, [expandRecurring(businessHours, computeActiveRange(dateProfile, Boolean(nextDayThreshold)), component.calendar),
-            {},
-            dateProfile,
-            nextDayThreshold,
-            component].concat(extraArgs)).bg;
-    };
-    Slicer.prototype._sliceEventStore = function (eventStore, eventUiBases, dateProfile, nextDayThreshold, component) {
-        var extraArgs = [];
-        for (var _i = 5; _i < arguments.length; _i++) {
-            extraArgs[_i - 5] = arguments[_i];
-        }
-        if (eventStore) {
-            var rangeRes = sliceEventStore(eventStore, eventUiBases, computeActiveRange(dateProfile, Boolean(nextDayThreshold)), nextDayThreshold);
-            return {
-                bg: this.sliceEventRanges(rangeRes.bg, component, extraArgs),
-                fg: this.sliceEventRanges(rangeRes.fg, component, extraArgs)
-            };
-        }
-        else {
-            return { bg: [], fg: [] };
-        }
-    };
-    Slicer.prototype._sliceInteraction = function (interaction, eventUiBases, dateProfile, nextDayThreshold, component) {
-        var extraArgs = [];
-        for (var _i = 5; _i < arguments.length; _i++) {
-            extraArgs[_i - 5] = arguments[_i];
-        }
-        if (!interaction) {
-            return null;
-        }
-        var rangeRes = sliceEventStore(interaction.mutatedEvents, eventUiBases, computeActiveRange(dateProfile, Boolean(nextDayThreshold)), nextDayThreshold);
-        return {
-            segs: this.sliceEventRanges(rangeRes.fg, component, extraArgs),
-            affectedInstances: interaction.affectedEvents.instances,
-            isEvent: interaction.isEvent,
-            sourceSeg: interaction.origSeg
-        };
-    };
-    Slicer.prototype._sliceDateSpan = function (dateSpan, eventUiBases, component) {
-        var extraArgs = [];
-        for (var _i = 3; _i < arguments.length; _i++) {
-            extraArgs[_i - 3] = arguments[_i];
-        }
-        if (!dateSpan) {
-            return [];
-        }
-        var eventRange = fabricateEventRange(dateSpan, eventUiBases, component.calendar);
-        var segs = this.sliceRange.apply(this, [dateSpan.range].concat(extraArgs));
-        for (var _a = 0, segs_1 = segs; _a < segs_1.length; _a++) {
-            var seg = segs_1[_a];
-            seg.component = component;
-            seg.eventRange = eventRange;
-        }
-        return segs;
-    };
-    /*
-    "complete" seg means it has component and eventRange
-    */
-    Slicer.prototype.sliceEventRanges = function (eventRanges, component, // TODO: kill
-    extraArgs) {
-        var segs = [];
-        for (var _i = 0, eventRanges_1 = eventRanges; _i < eventRanges_1.length; _i++) {
-            var eventRange = eventRanges_1[_i];
-            segs.push.apply(segs, this.sliceEventRange(eventRange, component, extraArgs));
-        }
-        return segs;
-    };
-    /*
-    "complete" seg means it has component and eventRange
-    */
-    Slicer.prototype.sliceEventRange = function (eventRange, component, // TODO: kill
-    extraArgs) {
-        var segs = this.sliceRange.apply(this, [eventRange.range].concat(extraArgs));
-        for (var _i = 0, segs_2 = segs; _i < segs_2.length; _i++) {
-            var seg = segs_2[_i];
-            seg.component = component;
-            seg.eventRange = eventRange;
-            seg.isStart = eventRange.isStart && seg.isStart;
-            seg.isEnd = eventRange.isEnd && seg.isEnd;
-        }
-        return segs;
-    };
-    return Slicer;
-}());
-/*
-for incorporating minTime/maxTime if appropriate
-TODO: should be part of DateProfile!
-TimelineDateProfile already does this btw
-*/
-function computeActiveRange(dateProfile, isComponentAllDay) {
-    var range = dateProfile.activeRange;
-    if (isComponentAllDay) {
-        return range;
-    }
-    return {
-        start: addMs(range.start, dateProfile.minTime.milliseconds),
-        end: addMs(range.end, dateProfile.maxTime.milliseconds - 864e5) // 864e5 = ms in a day
-    };
-}
-
-// exports
-// --------------------------------------------------------------------------------------------------
-var version = '4.3.1';
-
-export { Calendar, Component, DateComponent, DateEnv, DateProfileGenerator, DayHeader, DaySeries, DayTable, ElementDragging, ElementScrollController, EmitterMixin, EventApi, FgEventRenderer, FillRenderer, Interaction, Mixin, NamedTimeZoneImpl, PositionCache, ScrollComponent, ScrollController, Slicer, Splitter, Theme, View, WindowScrollController, addDays, addDurations, addMs, addWeeks, allowContextMenu, allowSelection, appendToElement, applyAll, applyMutationToEventStore, applyStyle, applyStyleProp, asRoughMinutes, asRoughMs, asRoughSeconds, buildGotoAnchorHtml, buildSegCompareObj, capitaliseFirstLetter, combineEventUis, compareByFieldSpec, compareByFieldSpecs, compareNumbers, compensateScroll, computeClippingRect, computeEdges, computeFallbackHeaderFormat, computeHeightAndMargins, computeInnerRect, computeRect, computeVisibleDayRange, config, constrainPoint, createDuration, createElement, createEmptyEventStore, createEventInstance, createFormatter, createPlugin, cssToStr, debounce, diffDates, diffDayAndTime, diffDays, diffPoints, diffWeeks, diffWholeDays, diffWholeWeeks, disableCursor, distributeHeight, elementClosest, elementMatches, enableCursor, eventTupleToStore, filterEventStoreDefs, filterHash, findChildren, findElements, flexibleCompare, forceClassName, formatDate, formatIsoTimeString, formatRange, getAllDayHtml, getClippingParents, getDayClasses, getElSeg, getRectCenter, getRelevantEvents, globalDefaults, greatestDurationDenominator, hasBgRendering, htmlEscape, htmlToElement, insertAfterElement, interactionSettingsStore, interactionSettingsToStore, intersectRanges, intersectRects, isArraysEqual, isDateSpansEqual, isInt, isInteractionValid, isMultiDayRange, isPropsEqual, isPropsValid, isSingleDay, isValidDate, listenBySelector, mapHash, matchCellWidths, memoize, memoizeOutput, memoizeRendering, mergeEventStores, multiplyDuration, padStart, parseBusinessHours, parseDragMeta, parseEventDef, parseFieldSpecs, parse as parseMarker, pointInsideRect, prependToElement, preventContextMenu, preventDefault, preventSelection, processScopedUiProps, rangeContainsMarker, rangeContainsRange, rangesEqual, rangesIntersect, refineProps, removeElement, removeExact, renderDateCell, requestJson, sliceEventStore, startOfDay, subtractInnerElHeight, translateRect, uncompensateScroll, undistributeHeight, unpromisify, version, whenTransitionDone, wholeDivideDurations };
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/core/main.js b/AKPlan/static/AKPlan/vendor/fullcalendar/core/main.js
deleted file mode 100644
index ec0808d0dd6c77b2a18d0e5bfe595306e044e5fa..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/core/main.js
+++ /dev/null
@@ -1,8717 +0,0 @@
-/*!
-FullCalendar Core Package v4.3.1
-Docs & License: https://fullcalendar.io/
-(c) 2019 Adam Shaw
-*/
-
-(function (global, factory) {
-    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
-    typeof define === 'function' && define.amd ? define(['exports'], factory) :
-    (global = global || self, factory(global.FullCalendar = {}));
-}(this, function (exports) { 'use strict';
-
-    // Creating
-    // ----------------------------------------------------------------------------------------------------------------
-    var elementPropHash = {
-        className: true,
-        colSpan: true,
-        rowSpan: true
-    };
-    var containerTagHash = {
-        '<tr': 'tbody',
-        '<td': 'tr'
-    };
-    function createElement(tagName, attrs, content) {
-        var el = document.createElement(tagName);
-        if (attrs) {
-            for (var attrName in attrs) {
-                if (attrName === 'style') {
-                    applyStyle(el, attrs[attrName]);
-                }
-                else if (elementPropHash[attrName]) {
-                    el[attrName] = attrs[attrName];
-                }
-                else {
-                    el.setAttribute(attrName, attrs[attrName]);
-                }
-            }
-        }
-        if (typeof content === 'string') {
-            el.innerHTML = content; // shortcut. no need to process HTML in any way
-        }
-        else if (content != null) {
-            appendToElement(el, content);
-        }
-        return el;
-    }
-    function htmlToElement(html) {
-        html = html.trim();
-        var container = document.createElement(computeContainerTag(html));
-        container.innerHTML = html;
-        return container.firstChild;
-    }
-    function htmlToElements(html) {
-        return Array.prototype.slice.call(htmlToNodeList(html));
-    }
-    function htmlToNodeList(html) {
-        html = html.trim();
-        var container = document.createElement(computeContainerTag(html));
-        container.innerHTML = html;
-        return container.childNodes;
-    }
-    // assumes html already trimmed and tag names are lowercase
-    function computeContainerTag(html) {
-        return containerTagHash[html.substr(0, 3) // faster than using regex
-        ] || 'div';
-    }
-    function appendToElement(el, content) {
-        var childNodes = normalizeContent(content);
-        for (var i = 0; i < childNodes.length; i++) {
-            el.appendChild(childNodes[i]);
-        }
-    }
-    function prependToElement(parent, content) {
-        var newEls = normalizeContent(content);
-        var afterEl = parent.firstChild || null; // if no firstChild, will append to end, but that's okay, b/c there were no children
-        for (var i = 0; i < newEls.length; i++) {
-            parent.insertBefore(newEls[i], afterEl);
-        }
-    }
-    function insertAfterElement(refEl, content) {
-        var newEls = normalizeContent(content);
-        var afterEl = refEl.nextSibling || null;
-        for (var i = 0; i < newEls.length; i++) {
-            refEl.parentNode.insertBefore(newEls[i], afterEl);
-        }
-    }
-    function normalizeContent(content) {
-        var els;
-        if (typeof content === 'string') {
-            els = htmlToElements(content);
-        }
-        else if (content instanceof Node) {
-            els = [content];
-        }
-        else { // Node[] or NodeList
-            els = Array.prototype.slice.call(content);
-        }
-        return els;
-    }
-    function removeElement(el) {
-        if (el.parentNode) {
-            el.parentNode.removeChild(el);
-        }
-    }
-    // Querying
-    // ----------------------------------------------------------------------------------------------------------------
-    // from https://developer.mozilla.org/en-US/docs/Web/API/Element/closest
-    var matchesMethod = Element.prototype.matches ||
-        Element.prototype.matchesSelector ||
-        Element.prototype.msMatchesSelector;
-    var closestMethod = Element.prototype.closest || function (selector) {
-        // polyfill
-        var el = this;
-        if (!document.documentElement.contains(el)) {
-            return null;
-        }
-        do {
-            if (elementMatches(el, selector)) {
-                return el;
-            }
-            el = el.parentElement || el.parentNode;
-        } while (el !== null && el.nodeType === 1);
-        return null;
-    };
-    function elementClosest(el, selector) {
-        return closestMethod.call(el, selector);
-    }
-    function elementMatches(el, selector) {
-        return matchesMethod.call(el, selector);
-    }
-    // accepts multiple subject els
-    // returns a real array. good for methods like forEach
-    function findElements(container, selector) {
-        var containers = container instanceof HTMLElement ? [container] : container;
-        var allMatches = [];
-        for (var i = 0; i < containers.length; i++) {
-            var matches = containers[i].querySelectorAll(selector);
-            for (var j = 0; j < matches.length; j++) {
-                allMatches.push(matches[j]);
-            }
-        }
-        return allMatches;
-    }
-    // accepts multiple subject els
-    // only queries direct child elements
-    function findChildren(parent, selector) {
-        var parents = parent instanceof HTMLElement ? [parent] : parent;
-        var allMatches = [];
-        for (var i = 0; i < parents.length; i++) {
-            var childNodes = parents[i].children; // only ever elements
-            for (var j = 0; j < childNodes.length; j++) {
-                var childNode = childNodes[j];
-                if (!selector || elementMatches(childNode, selector)) {
-                    allMatches.push(childNode);
-                }
-            }
-        }
-        return allMatches;
-    }
-    // Attributes
-    // ----------------------------------------------------------------------------------------------------------------
-    function forceClassName(el, className, bool) {
-        if (bool) {
-            el.classList.add(className);
-        }
-        else {
-            el.classList.remove(className);
-        }
-    }
-    // Style
-    // ----------------------------------------------------------------------------------------------------------------
-    var PIXEL_PROP_RE = /(top|left|right|bottom|width|height)$/i;
-    function applyStyle(el, props) {
-        for (var propName in props) {
-            applyStyleProp(el, propName, props[propName]);
-        }
-    }
-    function applyStyleProp(el, name, val) {
-        if (val == null) {
-            el.style[name] = '';
-        }
-        else if (typeof val === 'number' && PIXEL_PROP_RE.test(name)) {
-            el.style[name] = val + 'px';
-        }
-        else {
-            el.style[name] = val;
-        }
-    }
-
-    function pointInsideRect(point, rect) {
-        return point.left >= rect.left &&
-            point.left < rect.right &&
-            point.top >= rect.top &&
-            point.top < rect.bottom;
-    }
-    // Returns a new rectangle that is the intersection of the two rectangles. If they don't intersect, returns false
-    function intersectRects(rect1, rect2) {
-        var res = {
-            left: Math.max(rect1.left, rect2.left),
-            right: Math.min(rect1.right, rect2.right),
-            top: Math.max(rect1.top, rect2.top),
-            bottom: Math.min(rect1.bottom, rect2.bottom)
-        };
-        if (res.left < res.right && res.top < res.bottom) {
-            return res;
-        }
-        return false;
-    }
-    function translateRect(rect, deltaX, deltaY) {
-        return {
-            left: rect.left + deltaX,
-            right: rect.right + deltaX,
-            top: rect.top + deltaY,
-            bottom: rect.bottom + deltaY
-        };
-    }
-    // Returns a new point that will have been moved to reside within the given rectangle
-    function constrainPoint(point, rect) {
-        return {
-            left: Math.min(Math.max(point.left, rect.left), rect.right),
-            top: Math.min(Math.max(point.top, rect.top), rect.bottom)
-        };
-    }
-    // Returns a point that is the center of the given rectangle
-    function getRectCenter(rect) {
-        return {
-            left: (rect.left + rect.right) / 2,
-            top: (rect.top + rect.bottom) / 2
-        };
-    }
-    // Subtracts point2's coordinates from point1's coordinates, returning a delta
-    function diffPoints(point1, point2) {
-        return {
-            left: point1.left - point2.left,
-            top: point1.top - point2.top
-        };
-    }
-
-    // Logic for determining if, when the element is right-to-left, the scrollbar appears on the left side
-    var isRtlScrollbarOnLeft = null;
-    function getIsRtlScrollbarOnLeft() {
-        if (isRtlScrollbarOnLeft === null) {
-            isRtlScrollbarOnLeft = computeIsRtlScrollbarOnLeft();
-        }
-        return isRtlScrollbarOnLeft;
-    }
-    function computeIsRtlScrollbarOnLeft() {
-        var outerEl = createElement('div', {
-            style: {
-                position: 'absolute',
-                top: -1000,
-                left: 0,
-                border: 0,
-                padding: 0,
-                overflow: 'scroll',
-                direction: 'rtl'
-            }
-        }, '<div></div>');
-        document.body.appendChild(outerEl);
-        var innerEl = outerEl.firstChild;
-        var res = innerEl.getBoundingClientRect().left > outerEl.getBoundingClientRect().left;
-        removeElement(outerEl);
-        return res;
-    }
-    // The scrollbar width computations in computeEdges are sometimes flawed when it comes to
-    // retina displays, rounding, and IE11. Massage them into a usable value.
-    function sanitizeScrollbarWidth(width) {
-        width = Math.max(0, width); // no negatives
-        width = Math.round(width);
-        return width;
-    }
-
-    function computeEdges(el, getPadding) {
-        if (getPadding === void 0) { getPadding = false; }
-        var computedStyle = window.getComputedStyle(el);
-        var borderLeft = parseInt(computedStyle.borderLeftWidth, 10) || 0;
-        var borderRight = parseInt(computedStyle.borderRightWidth, 10) || 0;
-        var borderTop = parseInt(computedStyle.borderTopWidth, 10) || 0;
-        var borderBottom = parseInt(computedStyle.borderBottomWidth, 10) || 0;
-        // must use offset(Width|Height) because compatible with client(Width|Height)
-        var scrollbarLeftRight = sanitizeScrollbarWidth(el.offsetWidth - el.clientWidth - borderLeft - borderRight);
-        var scrollbarBottom = sanitizeScrollbarWidth(el.offsetHeight - el.clientHeight - borderTop - borderBottom);
-        var res = {
-            borderLeft: borderLeft,
-            borderRight: borderRight,
-            borderTop: borderTop,
-            borderBottom: borderBottom,
-            scrollbarBottom: scrollbarBottom,
-            scrollbarLeft: 0,
-            scrollbarRight: 0
-        };
-        if (getIsRtlScrollbarOnLeft() && computedStyle.direction === 'rtl') { // is the scrollbar on the left side?
-            res.scrollbarLeft = scrollbarLeftRight;
-        }
-        else {
-            res.scrollbarRight = scrollbarLeftRight;
-        }
-        if (getPadding) {
-            res.paddingLeft = parseInt(computedStyle.paddingLeft, 10) || 0;
-            res.paddingRight = parseInt(computedStyle.paddingRight, 10) || 0;
-            res.paddingTop = parseInt(computedStyle.paddingTop, 10) || 0;
-            res.paddingBottom = parseInt(computedStyle.paddingBottom, 10) || 0;
-        }
-        return res;
-    }
-    function computeInnerRect(el, goWithinPadding) {
-        if (goWithinPadding === void 0) { goWithinPadding = false; }
-        var outerRect = computeRect(el);
-        var edges = computeEdges(el, goWithinPadding);
-        var res = {
-            left: outerRect.left + edges.borderLeft + edges.scrollbarLeft,
-            right: outerRect.right - edges.borderRight - edges.scrollbarRight,
-            top: outerRect.top + edges.borderTop,
-            bottom: outerRect.bottom - edges.borderBottom - edges.scrollbarBottom
-        };
-        if (goWithinPadding) {
-            res.left += edges.paddingLeft;
-            res.right -= edges.paddingRight;
-            res.top += edges.paddingTop;
-            res.bottom -= edges.paddingBottom;
-        }
-        return res;
-    }
-    function computeRect(el) {
-        var rect = el.getBoundingClientRect();
-        return {
-            left: rect.left + window.pageXOffset,
-            top: rect.top + window.pageYOffset,
-            right: rect.right + window.pageXOffset,
-            bottom: rect.bottom + window.pageYOffset
-        };
-    }
-    function computeViewportRect() {
-        return {
-            left: window.pageXOffset,
-            right: window.pageXOffset + document.documentElement.clientWidth,
-            top: window.pageYOffset,
-            bottom: window.pageYOffset + document.documentElement.clientHeight
-        };
-    }
-    function computeHeightAndMargins(el) {
-        return el.getBoundingClientRect().height + computeVMargins(el);
-    }
-    function computeVMargins(el) {
-        var computed = window.getComputedStyle(el);
-        return parseInt(computed.marginTop, 10) +
-            parseInt(computed.marginBottom, 10);
-    }
-    // does not return window
-    function getClippingParents(el) {
-        var parents = [];
-        while (el instanceof HTMLElement) { // will stop when gets to document or null
-            var computedStyle = window.getComputedStyle(el);
-            if (computedStyle.position === 'fixed') {
-                break;
-            }
-            if ((/(auto|scroll)/).test(computedStyle.overflow + computedStyle.overflowY + computedStyle.overflowX)) {
-                parents.push(el);
-            }
-            el = el.parentNode;
-        }
-        return parents;
-    }
-    function computeClippingRect(el) {
-        return getClippingParents(el)
-            .map(function (el) {
-            return computeInnerRect(el);
-        })
-            .concat(computeViewportRect())
-            .reduce(function (rect0, rect1) {
-            return intersectRects(rect0, rect1) || rect1; // should always intersect
-        });
-    }
-
-    // Stops a mouse/touch event from doing it's native browser action
-    function preventDefault(ev) {
-        ev.preventDefault();
-    }
-    // Event Delegation
-    // ----------------------------------------------------------------------------------------------------------------
-    function listenBySelector(container, eventType, selector, handler) {
-        function realHandler(ev) {
-            var matchedChild = elementClosest(ev.target, selector);
-            if (matchedChild) {
-                handler.call(matchedChild, ev, matchedChild);
-            }
-        }
-        container.addEventListener(eventType, realHandler);
-        return function () {
-            container.removeEventListener(eventType, realHandler);
-        };
-    }
-    function listenToHoverBySelector(container, selector, onMouseEnter, onMouseLeave) {
-        var currentMatchedChild;
-        return listenBySelector(container, 'mouseover', selector, function (ev, matchedChild) {
-            if (matchedChild !== currentMatchedChild) {
-                currentMatchedChild = matchedChild;
-                onMouseEnter(ev, matchedChild);
-                var realOnMouseLeave_1 = function (ev) {
-                    currentMatchedChild = null;
-                    onMouseLeave(ev, matchedChild);
-                    matchedChild.removeEventListener('mouseleave', realOnMouseLeave_1);
-                };
-                // listen to the next mouseleave, and then unattach
-                matchedChild.addEventListener('mouseleave', realOnMouseLeave_1);
-            }
-        });
-    }
-    // Animation
-    // ----------------------------------------------------------------------------------------------------------------
-    var transitionEventNames = [
-        'webkitTransitionEnd',
-        'otransitionend',
-        'oTransitionEnd',
-        'msTransitionEnd',
-        'transitionend'
-    ];
-    // triggered only when the next single subsequent transition finishes
-    function whenTransitionDone(el, callback) {
-        var realCallback = function (ev) {
-            callback(ev);
-            transitionEventNames.forEach(function (eventName) {
-                el.removeEventListener(eventName, realCallback);
-            });
-        };
-        transitionEventNames.forEach(function (eventName) {
-            el.addEventListener(eventName, realCallback); // cross-browser way to determine when the transition finishes
-        });
-    }
-
-    var DAY_IDS = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'];
-    // Adding
-    function addWeeks(m, n) {
-        var a = dateToUtcArray(m);
-        a[2] += n * 7;
-        return arrayToUtcDate(a);
-    }
-    function addDays(m, n) {
-        var a = dateToUtcArray(m);
-        a[2] += n;
-        return arrayToUtcDate(a);
-    }
-    function addMs(m, n) {
-        var a = dateToUtcArray(m);
-        a[6] += n;
-        return arrayToUtcDate(a);
-    }
-    // Diffing (all return floats)
-    function diffWeeks(m0, m1) {
-        return diffDays(m0, m1) / 7;
-    }
-    function diffDays(m0, m1) {
-        return (m1.valueOf() - m0.valueOf()) / (1000 * 60 * 60 * 24);
-    }
-    function diffHours(m0, m1) {
-        return (m1.valueOf() - m0.valueOf()) / (1000 * 60 * 60);
-    }
-    function diffMinutes(m0, m1) {
-        return (m1.valueOf() - m0.valueOf()) / (1000 * 60);
-    }
-    function diffSeconds(m0, m1) {
-        return (m1.valueOf() - m0.valueOf()) / 1000;
-    }
-    function diffDayAndTime(m0, m1) {
-        var m0day = startOfDay(m0);
-        var m1day = startOfDay(m1);
-        return {
-            years: 0,
-            months: 0,
-            days: Math.round(diffDays(m0day, m1day)),
-            milliseconds: (m1.valueOf() - m1day.valueOf()) - (m0.valueOf() - m0day.valueOf())
-        };
-    }
-    // Diffing Whole Units
-    function diffWholeWeeks(m0, m1) {
-        var d = diffWholeDays(m0, m1);
-        if (d !== null && d % 7 === 0) {
-            return d / 7;
-        }
-        return null;
-    }
-    function diffWholeDays(m0, m1) {
-        if (timeAsMs(m0) === timeAsMs(m1)) {
-            return Math.round(diffDays(m0, m1));
-        }
-        return null;
-    }
-    // Start-Of
-    function startOfDay(m) {
-        return arrayToUtcDate([
-            m.getUTCFullYear(),
-            m.getUTCMonth(),
-            m.getUTCDate()
-        ]);
-    }
-    function startOfHour(m) {
-        return arrayToUtcDate([
-            m.getUTCFullYear(),
-            m.getUTCMonth(),
-            m.getUTCDate(),
-            m.getUTCHours()
-        ]);
-    }
-    function startOfMinute(m) {
-        return arrayToUtcDate([
-            m.getUTCFullYear(),
-            m.getUTCMonth(),
-            m.getUTCDate(),
-            m.getUTCHours(),
-            m.getUTCMinutes()
-        ]);
-    }
-    function startOfSecond(m) {
-        return arrayToUtcDate([
-            m.getUTCFullYear(),
-            m.getUTCMonth(),
-            m.getUTCDate(),
-            m.getUTCHours(),
-            m.getUTCMinutes(),
-            m.getUTCSeconds()
-        ]);
-    }
-    // Week Computation
-    function weekOfYear(marker, dow, doy) {
-        var y = marker.getUTCFullYear();
-        var w = weekOfGivenYear(marker, y, dow, doy);
-        if (w < 1) {
-            return weekOfGivenYear(marker, y - 1, dow, doy);
-        }
-        var nextW = weekOfGivenYear(marker, y + 1, dow, doy);
-        if (nextW >= 1) {
-            return Math.min(w, nextW);
-        }
-        return w;
-    }
-    function weekOfGivenYear(marker, year, dow, doy) {
-        var firstWeekStart = arrayToUtcDate([year, 0, 1 + firstWeekOffset(year, dow, doy)]);
-        var dayStart = startOfDay(marker);
-        var days = Math.round(diffDays(firstWeekStart, dayStart));
-        return Math.floor(days / 7) + 1; // zero-indexed
-    }
-    // start-of-first-week - start-of-year
-    function firstWeekOffset(year, dow, doy) {
-        // first-week day -- which january is always in the first week (4 for iso, 1 for other)
-        var fwd = 7 + dow - doy;
-        // first-week day local weekday -- which local weekday is fwd
-        var fwdlw = (7 + arrayToUtcDate([year, 0, fwd]).getUTCDay() - dow) % 7;
-        return -fwdlw + fwd - 1;
-    }
-    // Array Conversion
-    function dateToLocalArray(date) {
-        return [
-            date.getFullYear(),
-            date.getMonth(),
-            date.getDate(),
-            date.getHours(),
-            date.getMinutes(),
-            date.getSeconds(),
-            date.getMilliseconds()
-        ];
-    }
-    function arrayToLocalDate(a) {
-        return new Date(a[0], a[1] || 0, a[2] == null ? 1 : a[2], // day of month
-        a[3] || 0, a[4] || 0, a[5] || 0);
-    }
-    function dateToUtcArray(date) {
-        return [
-            date.getUTCFullYear(),
-            date.getUTCMonth(),
-            date.getUTCDate(),
-            date.getUTCHours(),
-            date.getUTCMinutes(),
-            date.getUTCSeconds(),
-            date.getUTCMilliseconds()
-        ];
-    }
-    function arrayToUtcDate(a) {
-        // according to web standards (and Safari), a month index is required.
-        // massage if only given a year.
-        if (a.length === 1) {
-            a = a.concat([0]);
-        }
-        return new Date(Date.UTC.apply(Date, a));
-    }
-    // Other Utils
-    function isValidDate(m) {
-        return !isNaN(m.valueOf());
-    }
-    function timeAsMs(m) {
-        return m.getUTCHours() * 1000 * 60 * 60 +
-            m.getUTCMinutes() * 1000 * 60 +
-            m.getUTCSeconds() * 1000 +
-            m.getUTCMilliseconds();
-    }
-
-    var INTERNAL_UNITS = ['years', 'months', 'days', 'milliseconds'];
-    var PARSE_RE = /^(-?)(?:(\d+)\.)?(\d+):(\d\d)(?::(\d\d)(?:\.(\d\d\d))?)?/;
-    // Parsing and Creation
-    function createDuration(input, unit) {
-        var _a;
-        if (typeof input === 'string') {
-            return parseString(input);
-        }
-        else if (typeof input === 'object' && input) { // non-null object
-            return normalizeObject(input);
-        }
-        else if (typeof input === 'number') {
-            return normalizeObject((_a = {}, _a[unit || 'milliseconds'] = input, _a));
-        }
-        else {
-            return null;
-        }
-    }
-    function parseString(s) {
-        var m = PARSE_RE.exec(s);
-        if (m) {
-            var sign = m[1] ? -1 : 1;
-            return {
-                years: 0,
-                months: 0,
-                days: sign * (m[2] ? parseInt(m[2], 10) : 0),
-                milliseconds: sign * ((m[3] ? parseInt(m[3], 10) : 0) * 60 * 60 * 1000 + // hours
-                    (m[4] ? parseInt(m[4], 10) : 0) * 60 * 1000 + // minutes
-                    (m[5] ? parseInt(m[5], 10) : 0) * 1000 + // seconds
-                    (m[6] ? parseInt(m[6], 10) : 0) // ms
-                )
-            };
-        }
-        return null;
-    }
-    function normalizeObject(obj) {
-        return {
-            years: obj.years || obj.year || 0,
-            months: obj.months || obj.month || 0,
-            days: (obj.days || obj.day || 0) +
-                getWeeksFromInput(obj) * 7,
-            milliseconds: (obj.hours || obj.hour || 0) * 60 * 60 * 1000 + // hours
-                (obj.minutes || obj.minute || 0) * 60 * 1000 + // minutes
-                (obj.seconds || obj.second || 0) * 1000 + // seconds
-                (obj.milliseconds || obj.millisecond || obj.ms || 0) // ms
-        };
-    }
-    function getWeeksFromInput(obj) {
-        return obj.weeks || obj.week || 0;
-    }
-    // Equality
-    function durationsEqual(d0, d1) {
-        return d0.years === d1.years &&
-            d0.months === d1.months &&
-            d0.days === d1.days &&
-            d0.milliseconds === d1.milliseconds;
-    }
-    function isSingleDay(dur) {
-        return dur.years === 0 && dur.months === 0 && dur.days === 1 && dur.milliseconds === 0;
-    }
-    // Simple Math
-    function addDurations(d0, d1) {
-        return {
-            years: d0.years + d1.years,
-            months: d0.months + d1.months,
-            days: d0.days + d1.days,
-            milliseconds: d0.milliseconds + d1.milliseconds
-        };
-    }
-    function subtractDurations(d1, d0) {
-        return {
-            years: d1.years - d0.years,
-            months: d1.months - d0.months,
-            days: d1.days - d0.days,
-            milliseconds: d1.milliseconds - d0.milliseconds
-        };
-    }
-    function multiplyDuration(d, n) {
-        return {
-            years: d.years * n,
-            months: d.months * n,
-            days: d.days * n,
-            milliseconds: d.milliseconds * n
-        };
-    }
-    // Conversions
-    // "Rough" because they are based on average-case Gregorian months/years
-    function asRoughYears(dur) {
-        return asRoughDays(dur) / 365;
-    }
-    function asRoughMonths(dur) {
-        return asRoughDays(dur) / 30;
-    }
-    function asRoughDays(dur) {
-        return asRoughMs(dur) / 864e5;
-    }
-    function asRoughMinutes(dur) {
-        return asRoughMs(dur) / (1000 * 60);
-    }
-    function asRoughSeconds(dur) {
-        return asRoughMs(dur) / 1000;
-    }
-    function asRoughMs(dur) {
-        return dur.years * (365 * 864e5) +
-            dur.months * (30 * 864e5) +
-            dur.days * 864e5 +
-            dur.milliseconds;
-    }
-    // Advanced Math
-    function wholeDivideDurations(numerator, denominator) {
-        var res = null;
-        for (var i = 0; i < INTERNAL_UNITS.length; i++) {
-            var unit = INTERNAL_UNITS[i];
-            if (denominator[unit]) {
-                var localRes = numerator[unit] / denominator[unit];
-                if (!isInt(localRes) || (res !== null && res !== localRes)) {
-                    return null;
-                }
-                res = localRes;
-            }
-            else if (numerator[unit]) {
-                // needs to divide by something but can't!
-                return null;
-            }
-        }
-        return res;
-    }
-    function greatestDurationDenominator(dur, dontReturnWeeks) {
-        var ms = dur.milliseconds;
-        if (ms) {
-            if (ms % 1000 !== 0) {
-                return { unit: 'millisecond', value: ms };
-            }
-            if (ms % (1000 * 60) !== 0) {
-                return { unit: 'second', value: ms / 1000 };
-            }
-            if (ms % (1000 * 60 * 60) !== 0) {
-                return { unit: 'minute', value: ms / (1000 * 60) };
-            }
-            if (ms) {
-                return { unit: 'hour', value: ms / (1000 * 60 * 60) };
-            }
-        }
-        if (dur.days) {
-            if (!dontReturnWeeks && dur.days % 7 === 0) {
-                return { unit: 'week', value: dur.days / 7 };
-            }
-            return { unit: 'day', value: dur.days };
-        }
-        if (dur.months) {
-            return { unit: 'month', value: dur.months };
-        }
-        if (dur.years) {
-            return { unit: 'year', value: dur.years };
-        }
-        return { unit: 'millisecond', value: 0 };
-    }
-
-    /* FullCalendar-specific DOM Utilities
-    ----------------------------------------------------------------------------------------------------------------------*/
-    // Given the scrollbar widths of some other container, create borders/margins on rowEls in order to match the left
-    // and right space that was offset by the scrollbars. A 1-pixel border first, then margin beyond that.
-    function compensateScroll(rowEl, scrollbarWidths) {
-        if (scrollbarWidths.left) {
-            applyStyle(rowEl, {
-                borderLeftWidth: 1,
-                marginLeft: scrollbarWidths.left - 1
-            });
-        }
-        if (scrollbarWidths.right) {
-            applyStyle(rowEl, {
-                borderRightWidth: 1,
-                marginRight: scrollbarWidths.right - 1
-            });
-        }
-    }
-    // Undoes compensateScroll and restores all borders/margins
-    function uncompensateScroll(rowEl) {
-        applyStyle(rowEl, {
-            marginLeft: '',
-            marginRight: '',
-            borderLeftWidth: '',
-            borderRightWidth: ''
-        });
-    }
-    // Make the mouse cursor express that an event is not allowed in the current area
-    function disableCursor() {
-        document.body.classList.add('fc-not-allowed');
-    }
-    // Returns the mouse cursor to its original look
-    function enableCursor() {
-        document.body.classList.remove('fc-not-allowed');
-    }
-    // Given a total available height to fill, have `els` (essentially child rows) expand to accomodate.
-    // By default, all elements that are shorter than the recommended height are expanded uniformly, not considering
-    // any other els that are already too tall. if `shouldRedistribute` is on, it considers these tall rows and
-    // reduces the available height.
-    function distributeHeight(els, availableHeight, shouldRedistribute) {
-        // *FLOORING NOTE*: we floor in certain places because zoom can give inaccurate floating-point dimensions,
-        // and it is better to be shorter than taller, to avoid creating unnecessary scrollbars.
-        var minOffset1 = Math.floor(availableHeight / els.length); // for non-last element
-        var minOffset2 = Math.floor(availableHeight - minOffset1 * (els.length - 1)); // for last element *FLOORING NOTE*
-        var flexEls = []; // elements that are allowed to expand. array of DOM nodes
-        var flexOffsets = []; // amount of vertical space it takes up
-        var flexHeights = []; // actual css height
-        var usedHeight = 0;
-        undistributeHeight(els); // give all elements their natural height
-        // find elements that are below the recommended height (expandable).
-        // important to query for heights in a single first pass (to avoid reflow oscillation).
-        els.forEach(function (el, i) {
-            var minOffset = i === els.length - 1 ? minOffset2 : minOffset1;
-            var naturalHeight = el.getBoundingClientRect().height;
-            var naturalOffset = naturalHeight + computeVMargins(el);
-            if (naturalOffset < minOffset) {
-                flexEls.push(el);
-                flexOffsets.push(naturalOffset);
-                flexHeights.push(naturalHeight);
-            }
-            else {
-                // this element stretches past recommended height (non-expandable). mark the space as occupied.
-                usedHeight += naturalOffset;
-            }
-        });
-        // readjust the recommended height to only consider the height available to non-maxed-out rows.
-        if (shouldRedistribute) {
-            availableHeight -= usedHeight;
-            minOffset1 = Math.floor(availableHeight / flexEls.length);
-            minOffset2 = Math.floor(availableHeight - minOffset1 * (flexEls.length - 1)); // *FLOORING NOTE*
-        }
-        // assign heights to all expandable elements
-        flexEls.forEach(function (el, i) {
-            var minOffset = i === flexEls.length - 1 ? minOffset2 : minOffset1;
-            var naturalOffset = flexOffsets[i];
-            var naturalHeight = flexHeights[i];
-            var newHeight = minOffset - (naturalOffset - naturalHeight); // subtract the margin/padding
-            if (naturalOffset < minOffset) { // we check this again because redistribution might have changed things
-                el.style.height = newHeight + 'px';
-            }
-        });
-    }
-    // Undoes distrubuteHeight, restoring all els to their natural height
-    function undistributeHeight(els) {
-        els.forEach(function (el) {
-            el.style.height = '';
-        });
-    }
-    // Given `els`, a set of <td> cells, find the cell with the largest natural width and set the widths of all the
-    // cells to be that width.
-    // PREREQUISITE: if you want a cell to take up width, it needs to have a single inner element w/ display:inline
-    function matchCellWidths(els) {
-        var maxInnerWidth = 0;
-        els.forEach(function (el) {
-            var innerEl = el.firstChild; // hopefully an element
-            if (innerEl instanceof HTMLElement) {
-                var innerWidth_1 = innerEl.getBoundingClientRect().width;
-                if (innerWidth_1 > maxInnerWidth) {
-                    maxInnerWidth = innerWidth_1;
-                }
-            }
-        });
-        maxInnerWidth++; // sometimes not accurate of width the text needs to stay on one line. insurance
-        els.forEach(function (el) {
-            el.style.width = maxInnerWidth + 'px';
-        });
-        return maxInnerWidth;
-    }
-    // Given one element that resides inside another,
-    // Subtracts the height of the inner element from the outer element.
-    function subtractInnerElHeight(outerEl, innerEl) {
-        // effin' IE8/9/10/11 sometimes returns 0 for dimensions. this weird hack was the only thing that worked
-        var reflowStyleProps = {
-            position: 'relative',
-            left: -1 // ensure reflow in case the el was already relative. negative is less likely to cause new scroll
-        };
-        applyStyle(outerEl, reflowStyleProps);
-        applyStyle(innerEl, reflowStyleProps);
-        var diff = // grab the dimensions
-         outerEl.getBoundingClientRect().height -
-            innerEl.getBoundingClientRect().height;
-        // undo hack
-        var resetStyleProps = { position: '', left: '' };
-        applyStyle(outerEl, resetStyleProps);
-        applyStyle(innerEl, resetStyleProps);
-        return diff;
-    }
-    /* Selection
-    ----------------------------------------------------------------------------------------------------------------------*/
-    function preventSelection(el) {
-        el.classList.add('fc-unselectable');
-        el.addEventListener('selectstart', preventDefault);
-    }
-    function allowSelection(el) {
-        el.classList.remove('fc-unselectable');
-        el.removeEventListener('selectstart', preventDefault);
-    }
-    /* Context Menu
-    ----------------------------------------------------------------------------------------------------------------------*/
-    function preventContextMenu(el) {
-        el.addEventListener('contextmenu', preventDefault);
-    }
-    function allowContextMenu(el) {
-        el.removeEventListener('contextmenu', preventDefault);
-    }
-    /* Object Ordering by Field
-    ----------------------------------------------------------------------------------------------------------------------*/
-    function parseFieldSpecs(input) {
-        var specs = [];
-        var tokens = [];
-        var i;
-        var token;
-        if (typeof input === 'string') {
-            tokens = input.split(/\s*,\s*/);
-        }
-        else if (typeof input === 'function') {
-            tokens = [input];
-        }
-        else if (Array.isArray(input)) {
-            tokens = input;
-        }
-        for (i = 0; i < tokens.length; i++) {
-            token = tokens[i];
-            if (typeof token === 'string') {
-                specs.push(token.charAt(0) === '-' ?
-                    { field: token.substring(1), order: -1 } :
-                    { field: token, order: 1 });
-            }
-            else if (typeof token === 'function') {
-                specs.push({ func: token });
-            }
-        }
-        return specs;
-    }
-    function compareByFieldSpecs(obj0, obj1, fieldSpecs) {
-        var i;
-        var cmp;
-        for (i = 0; i < fieldSpecs.length; i++) {
-            cmp = compareByFieldSpec(obj0, obj1, fieldSpecs[i]);
-            if (cmp) {
-                return cmp;
-            }
-        }
-        return 0;
-    }
-    function compareByFieldSpec(obj0, obj1, fieldSpec) {
-        if (fieldSpec.func) {
-            return fieldSpec.func(obj0, obj1);
-        }
-        return flexibleCompare(obj0[fieldSpec.field], obj1[fieldSpec.field])
-            * (fieldSpec.order || 1);
-    }
-    function flexibleCompare(a, b) {
-        if (!a && !b) {
-            return 0;
-        }
-        if (b == null) {
-            return -1;
-        }
-        if (a == null) {
-            return 1;
-        }
-        if (typeof a === 'string' || typeof b === 'string') {
-            return String(a).localeCompare(String(b));
-        }
-        return a - b;
-    }
-    /* String Utilities
-    ----------------------------------------------------------------------------------------------------------------------*/
-    function capitaliseFirstLetter(str) {
-        return str.charAt(0).toUpperCase() + str.slice(1);
-    }
-    function padStart(val, len) {
-        var s = String(val);
-        return '000'.substr(0, len - s.length) + s;
-    }
-    /* Number Utilities
-    ----------------------------------------------------------------------------------------------------------------------*/
-    function compareNumbers(a, b) {
-        return a - b;
-    }
-    function isInt(n) {
-        return n % 1 === 0;
-    }
-    /* Weird Utilities
-    ----------------------------------------------------------------------------------------------------------------------*/
-    function applyAll(functions, thisObj, args) {
-        if (typeof functions === 'function') { // supplied a single function
-            functions = [functions];
-        }
-        if (functions) {
-            var i = void 0;
-            var ret = void 0;
-            for (i = 0; i < functions.length; i++) {
-                ret = functions[i].apply(thisObj, args) || ret;
-            }
-            return ret;
-        }
-    }
-    function firstDefined() {
-        var args = [];
-        for (var _i = 0; _i < arguments.length; _i++) {
-            args[_i] = arguments[_i];
-        }
-        for (var i = 0; i < args.length; i++) {
-            if (args[i] !== undefined) {
-                return args[i];
-            }
-        }
-    }
-    // Returns a function, that, as long as it continues to be invoked, will not
-    // be triggered. The function will be called after it stops being called for
-    // N milliseconds. If `immediate` is passed, trigger the function on the
-    // leading edge, instead of the trailing.
-    // https://github.com/jashkenas/underscore/blob/1.6.0/underscore.js#L714
-    function debounce(func, wait) {
-        var timeout;
-        var args;
-        var context;
-        var timestamp;
-        var result;
-        var later = function () {
-            var last = new Date().valueOf() - timestamp;
-            if (last < wait) {
-                timeout = setTimeout(later, wait - last);
-            }
-            else {
-                timeout = null;
-                result = func.apply(context, args);
-                context = args = null;
-            }
-        };
-        return function () {
-            context = this;
-            args = arguments;
-            timestamp = new Date().valueOf();
-            if (!timeout) {
-                timeout = setTimeout(later, wait);
-            }
-            return result;
-        };
-    }
-    // Number and Boolean are only types that defaults or not computed for
-    // TODO: write more comments
-    function refineProps(rawProps, processors, defaults, leftoverProps) {
-        if (defaults === void 0) { defaults = {}; }
-        var refined = {};
-        for (var key in processors) {
-            var processor = processors[key];
-            if (rawProps[key] !== undefined) {
-                // found
-                if (processor === Function) {
-                    refined[key] = typeof rawProps[key] === 'function' ? rawProps[key] : null;
-                }
-                else if (processor) { // a refining function?
-                    refined[key] = processor(rawProps[key]);
-                }
-                else {
-                    refined[key] = rawProps[key];
-                }
-            }
-            else if (defaults[key] !== undefined) {
-                // there's an explicit default
-                refined[key] = defaults[key];
-            }
-            else {
-                // must compute a default
-                if (processor === String) {
-                    refined[key] = ''; // empty string is default for String
-                }
-                else if (!processor || processor === Number || processor === Boolean || processor === Function) {
-                    refined[key] = null; // assign null for other non-custom processor funcs
-                }
-                else {
-                    refined[key] = processor(null); // run the custom processor func
-                }
-            }
-        }
-        if (leftoverProps) {
-            for (var key in rawProps) {
-                if (processors[key] === undefined) {
-                    leftoverProps[key] = rawProps[key];
-                }
-            }
-        }
-        return refined;
-    }
-    /* Date stuff that doesn't belong in datelib core
-    ----------------------------------------------------------------------------------------------------------------------*/
-    // given a timed range, computes an all-day range that has the same exact duration,
-    // but whose start time is aligned with the start of the day.
-    function computeAlignedDayRange(timedRange) {
-        var dayCnt = Math.floor(diffDays(timedRange.start, timedRange.end)) || 1;
-        var start = startOfDay(timedRange.start);
-        var end = addDays(start, dayCnt);
-        return { start: start, end: end };
-    }
-    // given a timed range, computes an all-day range based on how for the end date bleeds into the next day
-    // TODO: give nextDayThreshold a default arg
-    function computeVisibleDayRange(timedRange, nextDayThreshold) {
-        if (nextDayThreshold === void 0) { nextDayThreshold = createDuration(0); }
-        var startDay = null;
-        var endDay = null;
-        if (timedRange.end) {
-            endDay = startOfDay(timedRange.end);
-            var endTimeMS = timedRange.end.valueOf() - endDay.valueOf(); // # of milliseconds into `endDay`
-            // If the end time is actually inclusively part of the next day and is equal to or
-            // beyond the next day threshold, adjust the end to be the exclusive end of `endDay`.
-            // Otherwise, leaving it as inclusive will cause it to exclude `endDay`.
-            if (endTimeMS && endTimeMS >= asRoughMs(nextDayThreshold)) {
-                endDay = addDays(endDay, 1);
-            }
-        }
-        if (timedRange.start) {
-            startDay = startOfDay(timedRange.start); // the beginning of the day the range starts
-            // If end is within `startDay` but not past nextDayThreshold, assign the default duration of one day.
-            if (endDay && endDay <= startDay) {
-                endDay = addDays(startDay, 1);
-            }
-        }
-        return { start: startDay, end: endDay };
-    }
-    // spans from one day into another?
-    function isMultiDayRange(range) {
-        var visibleRange = computeVisibleDayRange(range);
-        return diffDays(visibleRange.start, visibleRange.end) > 1;
-    }
-    function diffDates(date0, date1, dateEnv, largeUnit) {
-        if (largeUnit === 'year') {
-            return createDuration(dateEnv.diffWholeYears(date0, date1), 'year');
-        }
-        else if (largeUnit === 'month') {
-            return createDuration(dateEnv.diffWholeMonths(date0, date1), 'month');
-        }
-        else {
-            return diffDayAndTime(date0, date1); // returns a duration
-        }
-    }
-
-    /*! *****************************************************************************
-    Copyright (c) Microsoft Corporation. All rights reserved.
-    Licensed under the Apache License, Version 2.0 (the "License"); you may not use
-    this file except in compliance with the License. You may obtain a copy of the
-    License at http://www.apache.org/licenses/LICENSE-2.0
-
-    THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-    KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
-    WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
-    MERCHANTABLITY OR NON-INFRINGEMENT.
-
-    See the Apache Version 2.0 License for specific language governing permissions
-    and limitations under the License.
-    ***************************************************************************** */
-    /* global Reflect, Promise */
-
-    var extendStatics = function(d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-
-    function __extends(d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    }
-
-    var __assign = function() {
-        __assign = Object.assign || function __assign(t) {
-            for (var s, i = 1, n = arguments.length; i < n; i++) {
-                s = arguments[i];
-                for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
-            }
-            return t;
-        };
-        return __assign.apply(this, arguments);
-    };
-
-    function parseRecurring(eventInput, allDayDefault, dateEnv, recurringTypes, leftovers) {
-        for (var i = 0; i < recurringTypes.length; i++) {
-            var localLeftovers = {};
-            var parsed = recurringTypes[i].parse(eventInput, localLeftovers, dateEnv);
-            if (parsed) {
-                var allDay = localLeftovers.allDay;
-                delete localLeftovers.allDay; // remove from leftovers
-                if (allDay == null) {
-                    allDay = allDayDefault;
-                    if (allDay == null) {
-                        allDay = parsed.allDayGuess;
-                        if (allDay == null) {
-                            allDay = false;
-                        }
-                    }
-                }
-                __assign(leftovers, localLeftovers);
-                return {
-                    allDay: allDay,
-                    duration: parsed.duration,
-                    typeData: parsed.typeData,
-                    typeId: i
-                };
-            }
-        }
-        return null;
-    }
-    /*
-    Event MUST have a recurringDef
-    */
-    function expandRecurringRanges(eventDef, duration, framingRange, dateEnv, recurringTypes) {
-        var typeDef = recurringTypes[eventDef.recurringDef.typeId];
-        var markers = typeDef.expand(eventDef.recurringDef.typeData, {
-            start: dateEnv.subtract(framingRange.start, duration),
-            end: framingRange.end
-        }, dateEnv);
-        // the recurrence plugins don't guarantee that all-day events are start-of-day, so we have to
-        if (eventDef.allDay) {
-            markers = markers.map(startOfDay);
-        }
-        return markers;
-    }
-
-    var hasOwnProperty = Object.prototype.hasOwnProperty;
-    // Merges an array of objects into a single object.
-    // The second argument allows for an array of property names who's object values will be merged together.
-    function mergeProps(propObjs, complexProps) {
-        var dest = {};
-        var i;
-        var name;
-        var complexObjs;
-        var j;
-        var val;
-        var props;
-        if (complexProps) {
-            for (i = 0; i < complexProps.length; i++) {
-                name = complexProps[i];
-                complexObjs = [];
-                // collect the trailing object values, stopping when a non-object is discovered
-                for (j = propObjs.length - 1; j >= 0; j--) {
-                    val = propObjs[j][name];
-                    if (typeof val === 'object' && val) { // non-null object
-                        complexObjs.unshift(val);
-                    }
-                    else if (val !== undefined) {
-                        dest[name] = val; // if there were no objects, this value will be used
-                        break;
-                    }
-                }
-                // if the trailing values were objects, use the merged value
-                if (complexObjs.length) {
-                    dest[name] = mergeProps(complexObjs);
-                }
-            }
-        }
-        // copy values into the destination, going from last to first
-        for (i = propObjs.length - 1; i >= 0; i--) {
-            props = propObjs[i];
-            for (name in props) {
-                if (!(name in dest)) { // if already assigned by previous props or complex props, don't reassign
-                    dest[name] = props[name];
-                }
-            }
-        }
-        return dest;
-    }
-    function filterHash(hash, func) {
-        var filtered = {};
-        for (var key in hash) {
-            if (func(hash[key], key)) {
-                filtered[key] = hash[key];
-            }
-        }
-        return filtered;
-    }
-    function mapHash(hash, func) {
-        var newHash = {};
-        for (var key in hash) {
-            newHash[key] = func(hash[key], key);
-        }
-        return newHash;
-    }
-    function arrayToHash(a) {
-        var hash = {};
-        for (var _i = 0, a_1 = a; _i < a_1.length; _i++) {
-            var item = a_1[_i];
-            hash[item] = true;
-        }
-        return hash;
-    }
-    function hashValuesToArray(obj) {
-        var a = [];
-        for (var key in obj) {
-            a.push(obj[key]);
-        }
-        return a;
-    }
-    function isPropsEqual(obj0, obj1) {
-        for (var key in obj0) {
-            if (hasOwnProperty.call(obj0, key)) {
-                if (!(key in obj1)) {
-                    return false;
-                }
-            }
-        }
-        for (var key in obj1) {
-            if (hasOwnProperty.call(obj1, key)) {
-                if (obj0[key] !== obj1[key]) {
-                    return false;
-                }
-            }
-        }
-        return true;
-    }
-
-    function parseEvents(rawEvents, sourceId, calendar, allowOpenRange) {
-        var eventStore = createEmptyEventStore();
-        for (var _i = 0, rawEvents_1 = rawEvents; _i < rawEvents_1.length; _i++) {
-            var rawEvent = rawEvents_1[_i];
-            var tuple = parseEvent(rawEvent, sourceId, calendar, allowOpenRange);
-            if (tuple) {
-                eventTupleToStore(tuple, eventStore);
-            }
-        }
-        return eventStore;
-    }
-    function eventTupleToStore(tuple, eventStore) {
-        if (eventStore === void 0) { eventStore = createEmptyEventStore(); }
-        eventStore.defs[tuple.def.defId] = tuple.def;
-        if (tuple.instance) {
-            eventStore.instances[tuple.instance.instanceId] = tuple.instance;
-        }
-        return eventStore;
-    }
-    function expandRecurring(eventStore, framingRange, calendar) {
-        var dateEnv = calendar.dateEnv;
-        var defs = eventStore.defs, instances = eventStore.instances;
-        // remove existing recurring instances
-        instances = filterHash(instances, function (instance) {
-            return !defs[instance.defId].recurringDef;
-        });
-        for (var defId in defs) {
-            var def = defs[defId];
-            if (def.recurringDef) {
-                var duration = def.recurringDef.duration;
-                if (!duration) {
-                    duration = def.allDay ?
-                        calendar.defaultAllDayEventDuration :
-                        calendar.defaultTimedEventDuration;
-                }
-                var starts = expandRecurringRanges(def, duration, framingRange, calendar.dateEnv, calendar.pluginSystem.hooks.recurringTypes);
-                for (var _i = 0, starts_1 = starts; _i < starts_1.length; _i++) {
-                    var start = starts_1[_i];
-                    var instance = createEventInstance(defId, {
-                        start: start,
-                        end: dateEnv.add(start, duration)
-                    });
-                    instances[instance.instanceId] = instance;
-                }
-            }
-        }
-        return { defs: defs, instances: instances };
-    }
-    // retrieves events that have the same groupId as the instance specified by `instanceId`
-    // or they are the same as the instance.
-    // why might instanceId not be in the store? an event from another calendar?
-    function getRelevantEvents(eventStore, instanceId) {
-        var instance = eventStore.instances[instanceId];
-        if (instance) {
-            var def_1 = eventStore.defs[instance.defId];
-            // get events/instances with same group
-            var newStore = filterEventStoreDefs(eventStore, function (lookDef) {
-                return isEventDefsGrouped(def_1, lookDef);
-            });
-            // add the original
-            // TODO: wish we could use eventTupleToStore or something like it
-            newStore.defs[def_1.defId] = def_1;
-            newStore.instances[instance.instanceId] = instance;
-            return newStore;
-        }
-        return createEmptyEventStore();
-    }
-    function isEventDefsGrouped(def0, def1) {
-        return Boolean(def0.groupId && def0.groupId === def1.groupId);
-    }
-    function transformRawEvents(rawEvents, eventSource, calendar) {
-        var calEachTransform = calendar.opt('eventDataTransform');
-        var sourceEachTransform = eventSource ? eventSource.eventDataTransform : null;
-        if (sourceEachTransform) {
-            rawEvents = transformEachRawEvent(rawEvents, sourceEachTransform);
-        }
-        if (calEachTransform) {
-            rawEvents = transformEachRawEvent(rawEvents, calEachTransform);
-        }
-        return rawEvents;
-    }
-    function transformEachRawEvent(rawEvents, func) {
-        var refinedEvents;
-        if (!func) {
-            refinedEvents = rawEvents;
-        }
-        else {
-            refinedEvents = [];
-            for (var _i = 0, rawEvents_2 = rawEvents; _i < rawEvents_2.length; _i++) {
-                var rawEvent = rawEvents_2[_i];
-                var refinedEvent = func(rawEvent);
-                if (refinedEvent) {
-                    refinedEvents.push(refinedEvent);
-                }
-                else if (refinedEvent == null) {
-                    refinedEvents.push(rawEvent);
-                } // if a different falsy value, do nothing
-            }
-        }
-        return refinedEvents;
-    }
-    function createEmptyEventStore() {
-        return { defs: {}, instances: {} };
-    }
-    function mergeEventStores(store0, store1) {
-        return {
-            defs: __assign({}, store0.defs, store1.defs),
-            instances: __assign({}, store0.instances, store1.instances)
-        };
-    }
-    function filterEventStoreDefs(eventStore, filterFunc) {
-        var defs = filterHash(eventStore.defs, filterFunc);
-        var instances = filterHash(eventStore.instances, function (instance) {
-            return defs[instance.defId]; // still exists?
-        });
-        return { defs: defs, instances: instances };
-    }
-
-    function parseRange(input, dateEnv) {
-        var start = null;
-        var end = null;
-        if (input.start) {
-            start = dateEnv.createMarker(input.start);
-        }
-        if (input.end) {
-            end = dateEnv.createMarker(input.end);
-        }
-        if (!start && !end) {
-            return null;
-        }
-        if (start && end && end < start) {
-            return null;
-        }
-        return { start: start, end: end };
-    }
-    // SIDE-EFFECT: will mutate ranges.
-    // Will return a new array result.
-    function invertRanges(ranges, constraintRange) {
-        var invertedRanges = [];
-        var start = constraintRange.start; // the end of the previous range. the start of the new range
-        var i;
-        var dateRange;
-        // ranges need to be in order. required for our date-walking algorithm
-        ranges.sort(compareRanges);
-        for (i = 0; i < ranges.length; i++) {
-            dateRange = ranges[i];
-            // add the span of time before the event (if there is any)
-            if (dateRange.start > start) { // compare millisecond time (skip any ambig logic)
-                invertedRanges.push({ start: start, end: dateRange.start });
-            }
-            if (dateRange.end > start) {
-                start = dateRange.end;
-            }
-        }
-        // add the span of time after the last event (if there is any)
-        if (start < constraintRange.end) { // compare millisecond time (skip any ambig logic)
-            invertedRanges.push({ start: start, end: constraintRange.end });
-        }
-        return invertedRanges;
-    }
-    function compareRanges(range0, range1) {
-        return range0.start.valueOf() - range1.start.valueOf(); // earlier ranges go first
-    }
-    function intersectRanges(range0, range1) {
-        var start = range0.start;
-        var end = range0.end;
-        var newRange = null;
-        if (range1.start !== null) {
-            if (start === null) {
-                start = range1.start;
-            }
-            else {
-                start = new Date(Math.max(start.valueOf(), range1.start.valueOf()));
-            }
-        }
-        if (range1.end != null) {
-            if (end === null) {
-                end = range1.end;
-            }
-            else {
-                end = new Date(Math.min(end.valueOf(), range1.end.valueOf()));
-            }
-        }
-        if (start === null || end === null || start < end) {
-            newRange = { start: start, end: end };
-        }
-        return newRange;
-    }
-    function rangesEqual(range0, range1) {
-        return (range0.start === null ? null : range0.start.valueOf()) === (range1.start === null ? null : range1.start.valueOf()) &&
-            (range0.end === null ? null : range0.end.valueOf()) === (range1.end === null ? null : range1.end.valueOf());
-    }
-    function rangesIntersect(range0, range1) {
-        return (range0.end === null || range1.start === null || range0.end > range1.start) &&
-            (range0.start === null || range1.end === null || range0.start < range1.end);
-    }
-    function rangeContainsRange(outerRange, innerRange) {
-        return (outerRange.start === null || (innerRange.start !== null && innerRange.start >= outerRange.start)) &&
-            (outerRange.end === null || (innerRange.end !== null && innerRange.end <= outerRange.end));
-    }
-    function rangeContainsMarker(range, date) {
-        return (range.start === null || date >= range.start) &&
-            (range.end === null || date < range.end);
-    }
-    // If the given date is not within the given range, move it inside.
-    // (If it's past the end, make it one millisecond before the end).
-    function constrainMarkerToRange(date, range) {
-        if (range.start != null && date < range.start) {
-            return range.start;
-        }
-        if (range.end != null && date >= range.end) {
-            return new Date(range.end.valueOf() - 1);
-        }
-        return date;
-    }
-
-    function removeExact(array, exactVal) {
-        var removeCnt = 0;
-        var i = 0;
-        while (i < array.length) {
-            if (array[i] === exactVal) {
-                array.splice(i, 1);
-                removeCnt++;
-            }
-            else {
-                i++;
-            }
-        }
-        return removeCnt;
-    }
-    function isArraysEqual(a0, a1) {
-        var len = a0.length;
-        var i;
-        if (len !== a1.length) { // not array? or not same length?
-            return false;
-        }
-        for (i = 0; i < len; i++) {
-            if (a0[i] !== a1[i]) {
-                return false;
-            }
-        }
-        return true;
-    }
-
-    function memoize(workerFunc) {
-        var args;
-        var res;
-        return function () {
-            if (!args || !isArraysEqual(args, arguments)) {
-                args = arguments;
-                res = workerFunc.apply(this, arguments);
-            }
-            return res;
-        };
-    }
-    /*
-    always executes the workerFunc, but if the result is equal to the previous result,
-    return the previous result instead.
-    */
-    function memoizeOutput(workerFunc, equalityFunc) {
-        var cachedRes = null;
-        return function () {
-            var newRes = workerFunc.apply(this, arguments);
-            if (cachedRes === null || !(cachedRes === newRes || equalityFunc(cachedRes, newRes))) {
-                cachedRes = newRes;
-            }
-            return cachedRes;
-        };
-    }
-
-    var EXTENDED_SETTINGS_AND_SEVERITIES = {
-        week: 3,
-        separator: 0,
-        omitZeroMinute: 0,
-        meridiem: 0,
-        omitCommas: 0
-    };
-    var STANDARD_DATE_PROP_SEVERITIES = {
-        timeZoneName: 7,
-        era: 6,
-        year: 5,
-        month: 4,
-        day: 2,
-        weekday: 2,
-        hour: 1,
-        minute: 1,
-        second: 1
-    };
-    var MERIDIEM_RE = /\s*([ap])\.?m\.?/i; // eats up leading spaces too
-    var COMMA_RE = /,/g; // we need re for globalness
-    var MULTI_SPACE_RE = /\s+/g;
-    var LTR_RE = /\u200e/g; // control character
-    var UTC_RE = /UTC|GMT/;
-    var NativeFormatter = /** @class */ (function () {
-        function NativeFormatter(formatSettings) {
-            var standardDateProps = {};
-            var extendedSettings = {};
-            var severity = 0;
-            for (var name_1 in formatSettings) {
-                if (name_1 in EXTENDED_SETTINGS_AND_SEVERITIES) {
-                    extendedSettings[name_1] = formatSettings[name_1];
-                    severity = Math.max(EXTENDED_SETTINGS_AND_SEVERITIES[name_1], severity);
-                }
-                else {
-                    standardDateProps[name_1] = formatSettings[name_1];
-                    if (name_1 in STANDARD_DATE_PROP_SEVERITIES) {
-                        severity = Math.max(STANDARD_DATE_PROP_SEVERITIES[name_1], severity);
-                    }
-                }
-            }
-            this.standardDateProps = standardDateProps;
-            this.extendedSettings = extendedSettings;
-            this.severity = severity;
-            this.buildFormattingFunc = memoize(buildFormattingFunc);
-        }
-        NativeFormatter.prototype.format = function (date, context) {
-            return this.buildFormattingFunc(this.standardDateProps, this.extendedSettings, context)(date);
-        };
-        NativeFormatter.prototype.formatRange = function (start, end, context) {
-            var _a = this, standardDateProps = _a.standardDateProps, extendedSettings = _a.extendedSettings;
-            var diffSeverity = computeMarkerDiffSeverity(start.marker, end.marker, context.calendarSystem);
-            if (!diffSeverity) {
-                return this.format(start, context);
-            }
-            var biggestUnitForPartial = diffSeverity;
-            if (biggestUnitForPartial > 1 && // the two dates are different in a way that's larger scale than time
-                (standardDateProps.year === 'numeric' || standardDateProps.year === '2-digit') &&
-                (standardDateProps.month === 'numeric' || standardDateProps.month === '2-digit') &&
-                (standardDateProps.day === 'numeric' || standardDateProps.day === '2-digit')) {
-                biggestUnitForPartial = 1; // make it look like the dates are only different in terms of time
-            }
-            var full0 = this.format(start, context);
-            var full1 = this.format(end, context);
-            if (full0 === full1) {
-                return full0;
-            }
-            var partialDateProps = computePartialFormattingOptions(standardDateProps, biggestUnitForPartial);
-            var partialFormattingFunc = buildFormattingFunc(partialDateProps, extendedSettings, context);
-            var partial0 = partialFormattingFunc(start);
-            var partial1 = partialFormattingFunc(end);
-            var insertion = findCommonInsertion(full0, partial0, full1, partial1);
-            var separator = extendedSettings.separator || '';
-            if (insertion) {
-                return insertion.before + partial0 + separator + partial1 + insertion.after;
-            }
-            return full0 + separator + full1;
-        };
-        NativeFormatter.prototype.getLargestUnit = function () {
-            switch (this.severity) {
-                case 7:
-                case 6:
-                case 5:
-                    return 'year';
-                case 4:
-                    return 'month';
-                case 3:
-                    return 'week';
-                default:
-                    return 'day';
-            }
-        };
-        return NativeFormatter;
-    }());
-    function buildFormattingFunc(standardDateProps, extendedSettings, context) {
-        var standardDatePropCnt = Object.keys(standardDateProps).length;
-        if (standardDatePropCnt === 1 && standardDateProps.timeZoneName === 'short') {
-            return function (date) {
-                return formatTimeZoneOffset(date.timeZoneOffset);
-            };
-        }
-        if (standardDatePropCnt === 0 && extendedSettings.week) {
-            return function (date) {
-                return formatWeekNumber(context.computeWeekNumber(date.marker), context.weekLabel, context.locale, extendedSettings.week);
-            };
-        }
-        return buildNativeFormattingFunc(standardDateProps, extendedSettings, context);
-    }
-    function buildNativeFormattingFunc(standardDateProps, extendedSettings, context) {
-        standardDateProps = __assign({}, standardDateProps); // copy
-        extendedSettings = __assign({}, extendedSettings); // copy
-        sanitizeSettings(standardDateProps, extendedSettings);
-        standardDateProps.timeZone = 'UTC'; // we leverage the only guaranteed timeZone for our UTC markers
-        var normalFormat = new Intl.DateTimeFormat(context.locale.codes, standardDateProps);
-        var zeroFormat; // needed?
-        if (extendedSettings.omitZeroMinute) {
-            var zeroProps = __assign({}, standardDateProps);
-            delete zeroProps.minute; // seconds and ms were already considered in sanitizeSettings
-            zeroFormat = new Intl.DateTimeFormat(context.locale.codes, zeroProps);
-        }
-        return function (date) {
-            var marker = date.marker;
-            var format;
-            if (zeroFormat && !marker.getUTCMinutes()) {
-                format = zeroFormat;
-            }
-            else {
-                format = normalFormat;
-            }
-            var s = format.format(marker);
-            return postProcess(s, date, standardDateProps, extendedSettings, context);
-        };
-    }
-    function sanitizeSettings(standardDateProps, extendedSettings) {
-        // deal with a browser inconsistency where formatting the timezone
-        // requires that the hour/minute be present.
-        if (standardDateProps.timeZoneName) {
-            if (!standardDateProps.hour) {
-                standardDateProps.hour = '2-digit';
-            }
-            if (!standardDateProps.minute) {
-                standardDateProps.minute = '2-digit';
-            }
-        }
-        // only support short timezone names
-        if (standardDateProps.timeZoneName === 'long') {
-            standardDateProps.timeZoneName = 'short';
-        }
-        // if requesting to display seconds, MUST display minutes
-        if (extendedSettings.omitZeroMinute && (standardDateProps.second || standardDateProps.millisecond)) {
-            delete extendedSettings.omitZeroMinute;
-        }
-    }
-    function postProcess(s, date, standardDateProps, extendedSettings, context) {
-        s = s.replace(LTR_RE, ''); // remove left-to-right control chars. do first. good for other regexes
-        if (standardDateProps.timeZoneName === 'short') {
-            s = injectTzoStr(s, (context.timeZone === 'UTC' || date.timeZoneOffset == null) ?
-                'UTC' : // important to normalize for IE, which does "GMT"
-                formatTimeZoneOffset(date.timeZoneOffset));
-        }
-        if (extendedSettings.omitCommas) {
-            s = s.replace(COMMA_RE, '').trim();
-        }
-        if (extendedSettings.omitZeroMinute) {
-            s = s.replace(':00', ''); // zeroFormat doesn't always achieve this
-        }
-        // ^ do anything that might create adjacent spaces before this point,
-        // because MERIDIEM_RE likes to eat up loading spaces
-        if (extendedSettings.meridiem === false) {
-            s = s.replace(MERIDIEM_RE, '').trim();
-        }
-        else if (extendedSettings.meridiem === 'narrow') { // a/p
-            s = s.replace(MERIDIEM_RE, function (m0, m1) {
-                return m1.toLocaleLowerCase();
-            });
-        }
-        else if (extendedSettings.meridiem === 'short') { // am/pm
-            s = s.replace(MERIDIEM_RE, function (m0, m1) {
-                return m1.toLocaleLowerCase() + 'm';
-            });
-        }
-        else if (extendedSettings.meridiem === 'lowercase') { // other meridiem transformers already converted to lowercase
-            s = s.replace(MERIDIEM_RE, function (m0) {
-                return m0.toLocaleLowerCase();
-            });
-        }
-        s = s.replace(MULTI_SPACE_RE, ' ');
-        s = s.trim();
-        return s;
-    }
-    function injectTzoStr(s, tzoStr) {
-        var replaced = false;
-        s = s.replace(UTC_RE, function () {
-            replaced = true;
-            return tzoStr;
-        });
-        // IE11 doesn't include UTC/GMT in the original string, so append to end
-        if (!replaced) {
-            s += ' ' + tzoStr;
-        }
-        return s;
-    }
-    function formatWeekNumber(num, weekLabel, locale, display) {
-        var parts = [];
-        if (display === 'narrow') {
-            parts.push(weekLabel);
-        }
-        else if (display === 'short') {
-            parts.push(weekLabel, ' ');
-        }
-        // otherwise, considered 'numeric'
-        parts.push(locale.simpleNumberFormat.format(num));
-        if (locale.options.isRtl) { // TODO: use control characters instead?
-            parts.reverse();
-        }
-        return parts.join('');
-    }
-    // Range Formatting Utils
-    // 0 = exactly the same
-    // 1 = different by time
-    // and bigger
-    function computeMarkerDiffSeverity(d0, d1, ca) {
-        if (ca.getMarkerYear(d0) !== ca.getMarkerYear(d1)) {
-            return 5;
-        }
-        if (ca.getMarkerMonth(d0) !== ca.getMarkerMonth(d1)) {
-            return 4;
-        }
-        if (ca.getMarkerDay(d0) !== ca.getMarkerDay(d1)) {
-            return 2;
-        }
-        if (timeAsMs(d0) !== timeAsMs(d1)) {
-            return 1;
-        }
-        return 0;
-    }
-    function computePartialFormattingOptions(options, biggestUnit) {
-        var partialOptions = {};
-        for (var name_2 in options) {
-            if (!(name_2 in STANDARD_DATE_PROP_SEVERITIES) || // not a date part prop (like timeZone)
-                STANDARD_DATE_PROP_SEVERITIES[name_2] <= biggestUnit) {
-                partialOptions[name_2] = options[name_2];
-            }
-        }
-        return partialOptions;
-    }
-    function findCommonInsertion(full0, partial0, full1, partial1) {
-        var i0 = 0;
-        while (i0 < full0.length) {
-            var found0 = full0.indexOf(partial0, i0);
-            if (found0 === -1) {
-                break;
-            }
-            var before0 = full0.substr(0, found0);
-            i0 = found0 + partial0.length;
-            var after0 = full0.substr(i0);
-            var i1 = 0;
-            while (i1 < full1.length) {
-                var found1 = full1.indexOf(partial1, i1);
-                if (found1 === -1) {
-                    break;
-                }
-                var before1 = full1.substr(0, found1);
-                i1 = found1 + partial1.length;
-                var after1 = full1.substr(i1);
-                if (before0 === before1 && after0 === after1) {
-                    return {
-                        before: before0,
-                        after: after0
-                    };
-                }
-            }
-        }
-        return null;
-    }
-
-    /*
-    TODO: fix the terminology of "formatter" vs "formatting func"
-    */
-    /*
-    At the time of instantiation, this object does not know which cmd-formatting system it will use.
-    It receives this at the time of formatting, as a setting.
-    */
-    var CmdFormatter = /** @class */ (function () {
-        function CmdFormatter(cmdStr, separator) {
-            this.cmdStr = cmdStr;
-            this.separator = separator;
-        }
-        CmdFormatter.prototype.format = function (date, context) {
-            return context.cmdFormatter(this.cmdStr, createVerboseFormattingArg(date, null, context, this.separator));
-        };
-        CmdFormatter.prototype.formatRange = function (start, end, context) {
-            return context.cmdFormatter(this.cmdStr, createVerboseFormattingArg(start, end, context, this.separator));
-        };
-        return CmdFormatter;
-    }());
-
-    var FuncFormatter = /** @class */ (function () {
-        function FuncFormatter(func) {
-            this.func = func;
-        }
-        FuncFormatter.prototype.format = function (date, context) {
-            return this.func(createVerboseFormattingArg(date, null, context));
-        };
-        FuncFormatter.prototype.formatRange = function (start, end, context) {
-            return this.func(createVerboseFormattingArg(start, end, context));
-        };
-        return FuncFormatter;
-    }());
-
-    // Formatter Object Creation
-    function createFormatter(input, defaultSeparator) {
-        if (typeof input === 'object' && input) { // non-null object
-            if (typeof defaultSeparator === 'string') {
-                input = __assign({ separator: defaultSeparator }, input);
-            }
-            return new NativeFormatter(input);
-        }
-        else if (typeof input === 'string') {
-            return new CmdFormatter(input, defaultSeparator);
-        }
-        else if (typeof input === 'function') {
-            return new FuncFormatter(input);
-        }
-    }
-    // String Utils
-    // timeZoneOffset is in minutes
-    function buildIsoString(marker, timeZoneOffset, stripZeroTime) {
-        if (stripZeroTime === void 0) { stripZeroTime = false; }
-        var s = marker.toISOString();
-        s = s.replace('.000', '');
-        if (stripZeroTime) {
-            s = s.replace('T00:00:00Z', '');
-        }
-        if (s.length > 10) { // time part wasn't stripped, can add timezone info
-            if (timeZoneOffset == null) {
-                s = s.replace('Z', '');
-            }
-            else if (timeZoneOffset !== 0) {
-                s = s.replace('Z', formatTimeZoneOffset(timeZoneOffset, true));
-            }
-            // otherwise, its UTC-0 and we want to keep the Z
-        }
-        return s;
-    }
-    function formatIsoTimeString(marker) {
-        return padStart(marker.getUTCHours(), 2) + ':' +
-            padStart(marker.getUTCMinutes(), 2) + ':' +
-            padStart(marker.getUTCSeconds(), 2);
-    }
-    function formatTimeZoneOffset(minutes, doIso) {
-        if (doIso === void 0) { doIso = false; }
-        var sign = minutes < 0 ? '-' : '+';
-        var abs = Math.abs(minutes);
-        var hours = Math.floor(abs / 60);
-        var mins = Math.round(abs % 60);
-        if (doIso) {
-            return sign + padStart(hours, 2) + ':' + padStart(mins, 2);
-        }
-        else {
-            return 'GMT' + sign + hours + (mins ? ':' + padStart(mins, 2) : '');
-        }
-    }
-    // Arg Utils
-    function createVerboseFormattingArg(start, end, context, separator) {
-        var startInfo = expandZonedMarker(start, context.calendarSystem);
-        var endInfo = end ? expandZonedMarker(end, context.calendarSystem) : null;
-        return {
-            date: startInfo,
-            start: startInfo,
-            end: endInfo,
-            timeZone: context.timeZone,
-            localeCodes: context.locale.codes,
-            separator: separator
-        };
-    }
-    function expandZonedMarker(dateInfo, calendarSystem) {
-        var a = calendarSystem.markerToArray(dateInfo.marker);
-        return {
-            marker: dateInfo.marker,
-            timeZoneOffset: dateInfo.timeZoneOffset,
-            array: a,
-            year: a[0],
-            month: a[1],
-            day: a[2],
-            hour: a[3],
-            minute: a[4],
-            second: a[5],
-            millisecond: a[6]
-        };
-    }
-
-    var EventSourceApi = /** @class */ (function () {
-        function EventSourceApi(calendar, internalEventSource) {
-            this.calendar = calendar;
-            this.internalEventSource = internalEventSource;
-        }
-        EventSourceApi.prototype.remove = function () {
-            this.calendar.dispatch({
-                type: 'REMOVE_EVENT_SOURCE',
-                sourceId: this.internalEventSource.sourceId
-            });
-        };
-        EventSourceApi.prototype.refetch = function () {
-            this.calendar.dispatch({
-                type: 'FETCH_EVENT_SOURCES',
-                sourceIds: [this.internalEventSource.sourceId]
-            });
-        };
-        Object.defineProperty(EventSourceApi.prototype, "id", {
-            get: function () {
-                return this.internalEventSource.publicId;
-            },
-            enumerable: true,
-            configurable: true
-        });
-        Object.defineProperty(EventSourceApi.prototype, "url", {
-            // only relevant to json-feed event sources
-            get: function () {
-                return this.internalEventSource.meta.url;
-            },
-            enumerable: true,
-            configurable: true
-        });
-        return EventSourceApi;
-    }());
-
-    var EventApi = /** @class */ (function () {
-        function EventApi(calendar, def, instance) {
-            this._calendar = calendar;
-            this._def = def;
-            this._instance = instance || null;
-        }
-        /*
-        TODO: make event struct more responsible for this
-        */
-        EventApi.prototype.setProp = function (name, val) {
-            var _a, _b;
-            if (name in DATE_PROPS) ;
-            else if (name in NON_DATE_PROPS) {
-                if (typeof NON_DATE_PROPS[name] === 'function') {
-                    val = NON_DATE_PROPS[name](val);
-                }
-                this.mutate({
-                    standardProps: (_a = {}, _a[name] = val, _a)
-                });
-            }
-            else if (name in UNSCOPED_EVENT_UI_PROPS) {
-                var ui = void 0;
-                if (typeof UNSCOPED_EVENT_UI_PROPS[name] === 'function') {
-                    val = UNSCOPED_EVENT_UI_PROPS[name](val);
-                }
-                if (name === 'color') {
-                    ui = { backgroundColor: val, borderColor: val };
-                }
-                else if (name === 'editable') {
-                    ui = { startEditable: val, durationEditable: val };
-                }
-                else {
-                    ui = (_b = {}, _b[name] = val, _b);
-                }
-                this.mutate({
-                    standardProps: { ui: ui }
-                });
-            }
-        };
-        EventApi.prototype.setExtendedProp = function (name, val) {
-            var _a;
-            this.mutate({
-                extendedProps: (_a = {}, _a[name] = val, _a)
-            });
-        };
-        EventApi.prototype.setStart = function (startInput, options) {
-            if (options === void 0) { options = {}; }
-            var dateEnv = this._calendar.dateEnv;
-            var start = dateEnv.createMarker(startInput);
-            if (start && this._instance) { // TODO: warning if parsed bad
-                var instanceRange = this._instance.range;
-                var startDelta = diffDates(instanceRange.start, start, dateEnv, options.granularity); // what if parsed bad!?
-                if (options.maintainDuration) {
-                    this.mutate({ datesDelta: startDelta });
-                }
-                else {
-                    this.mutate({ startDelta: startDelta });
-                }
-            }
-        };
-        EventApi.prototype.setEnd = function (endInput, options) {
-            if (options === void 0) { options = {}; }
-            var dateEnv = this._calendar.dateEnv;
-            var end;
-            if (endInput != null) {
-                end = dateEnv.createMarker(endInput);
-                if (!end) {
-                    return; // TODO: warning if parsed bad
-                }
-            }
-            if (this._instance) {
-                if (end) {
-                    var endDelta = diffDates(this._instance.range.end, end, dateEnv, options.granularity);
-                    this.mutate({ endDelta: endDelta });
-                }
-                else {
-                    this.mutate({ standardProps: { hasEnd: false } });
-                }
-            }
-        };
-        EventApi.prototype.setDates = function (startInput, endInput, options) {
-            if (options === void 0) { options = {}; }
-            var dateEnv = this._calendar.dateEnv;
-            var standardProps = { allDay: options.allDay };
-            var start = dateEnv.createMarker(startInput);
-            var end;
-            if (!start) {
-                return; // TODO: warning if parsed bad
-            }
-            if (endInput != null) {
-                end = dateEnv.createMarker(endInput);
-                if (!end) { // TODO: warning if parsed bad
-                    return;
-                }
-            }
-            if (this._instance) {
-                var instanceRange = this._instance.range;
-                // when computing the diff for an event being converted to all-day,
-                // compute diff off of the all-day values the way event-mutation does.
-                if (options.allDay === true) {
-                    instanceRange = computeAlignedDayRange(instanceRange);
-                }
-                var startDelta = diffDates(instanceRange.start, start, dateEnv, options.granularity);
-                if (end) {
-                    var endDelta = diffDates(instanceRange.end, end, dateEnv, options.granularity);
-                    if (durationsEqual(startDelta, endDelta)) {
-                        this.mutate({ datesDelta: startDelta, standardProps: standardProps });
-                    }
-                    else {
-                        this.mutate({ startDelta: startDelta, endDelta: endDelta, standardProps: standardProps });
-                    }
-                }
-                else { // means "clear the end"
-                    standardProps.hasEnd = false;
-                    this.mutate({ datesDelta: startDelta, standardProps: standardProps });
-                }
-            }
-        };
-        EventApi.prototype.moveStart = function (deltaInput) {
-            var delta = createDuration(deltaInput);
-            if (delta) { // TODO: warning if parsed bad
-                this.mutate({ startDelta: delta });
-            }
-        };
-        EventApi.prototype.moveEnd = function (deltaInput) {
-            var delta = createDuration(deltaInput);
-            if (delta) { // TODO: warning if parsed bad
-                this.mutate({ endDelta: delta });
-            }
-        };
-        EventApi.prototype.moveDates = function (deltaInput) {
-            var delta = createDuration(deltaInput);
-            if (delta) { // TODO: warning if parsed bad
-                this.mutate({ datesDelta: delta });
-            }
-        };
-        EventApi.prototype.setAllDay = function (allDay, options) {
-            if (options === void 0) { options = {}; }
-            var standardProps = { allDay: allDay };
-            var maintainDuration = options.maintainDuration;
-            if (maintainDuration == null) {
-                maintainDuration = this._calendar.opt('allDayMaintainDuration');
-            }
-            if (this._def.allDay !== allDay) {
-                standardProps.hasEnd = maintainDuration;
-            }
-            this.mutate({ standardProps: standardProps });
-        };
-        EventApi.prototype.formatRange = function (formatInput) {
-            var dateEnv = this._calendar.dateEnv;
-            var instance = this._instance;
-            var formatter = createFormatter(formatInput, this._calendar.opt('defaultRangeSeparator'));
-            if (this._def.hasEnd) {
-                return dateEnv.formatRange(instance.range.start, instance.range.end, formatter, {
-                    forcedStartTzo: instance.forcedStartTzo,
-                    forcedEndTzo: instance.forcedEndTzo
-                });
-            }
-            else {
-                return dateEnv.format(instance.range.start, formatter, {
-                    forcedTzo: instance.forcedStartTzo
-                });
-            }
-        };
-        EventApi.prototype.mutate = function (mutation) {
-            var def = this._def;
-            var instance = this._instance;
-            if (instance) {
-                this._calendar.dispatch({
-                    type: 'MUTATE_EVENTS',
-                    instanceId: instance.instanceId,
-                    mutation: mutation,
-                    fromApi: true
-                });
-                var eventStore = this._calendar.state.eventStore;
-                this._def = eventStore.defs[def.defId];
-                this._instance = eventStore.instances[instance.instanceId];
-            }
-        };
-        EventApi.prototype.remove = function () {
-            this._calendar.dispatch({
-                type: 'REMOVE_EVENT_DEF',
-                defId: this._def.defId
-            });
-        };
-        Object.defineProperty(EventApi.prototype, "source", {
-            get: function () {
-                var sourceId = this._def.sourceId;
-                if (sourceId) {
-                    return new EventSourceApi(this._calendar, this._calendar.state.eventSources[sourceId]);
-                }
-                return null;
-            },
-            enumerable: true,
-            configurable: true
-        });
-        Object.defineProperty(EventApi.prototype, "start", {
-            get: function () {
-                return this._instance ?
-                    this._calendar.dateEnv.toDate(this._instance.range.start) :
-                    null;
-            },
-            enumerable: true,
-            configurable: true
-        });
-        Object.defineProperty(EventApi.prototype, "end", {
-            get: function () {
-                return (this._instance && this._def.hasEnd) ?
-                    this._calendar.dateEnv.toDate(this._instance.range.end) :
-                    null;
-            },
-            enumerable: true,
-            configurable: true
-        });
-        Object.defineProperty(EventApi.prototype, "id", {
-            // computable props that all access the def
-            // TODO: find a TypeScript-compatible way to do this at scale
-            get: function () { return this._def.publicId; },
-            enumerable: true,
-            configurable: true
-        });
-        Object.defineProperty(EventApi.prototype, "groupId", {
-            get: function () { return this._def.groupId; },
-            enumerable: true,
-            configurable: true
-        });
-        Object.defineProperty(EventApi.prototype, "allDay", {
-            get: function () { return this._def.allDay; },
-            enumerable: true,
-            configurable: true
-        });
-        Object.defineProperty(EventApi.prototype, "title", {
-            get: function () { return this._def.title; },
-            enumerable: true,
-            configurable: true
-        });
-        Object.defineProperty(EventApi.prototype, "url", {
-            get: function () { return this._def.url; },
-            enumerable: true,
-            configurable: true
-        });
-        Object.defineProperty(EventApi.prototype, "rendering", {
-            get: function () { return this._def.rendering; },
-            enumerable: true,
-            configurable: true
-        });
-        Object.defineProperty(EventApi.prototype, "startEditable", {
-            get: function () { return this._def.ui.startEditable; },
-            enumerable: true,
-            configurable: true
-        });
-        Object.defineProperty(EventApi.prototype, "durationEditable", {
-            get: function () { return this._def.ui.durationEditable; },
-            enumerable: true,
-            configurable: true
-        });
-        Object.defineProperty(EventApi.prototype, "constraint", {
-            get: function () { return this._def.ui.constraints[0] || null; },
-            enumerable: true,
-            configurable: true
-        });
-        Object.defineProperty(EventApi.prototype, "overlap", {
-            get: function () { return this._def.ui.overlap; },
-            enumerable: true,
-            configurable: true
-        });
-        Object.defineProperty(EventApi.prototype, "allow", {
-            get: function () { return this._def.ui.allows[0] || null; },
-            enumerable: true,
-            configurable: true
-        });
-        Object.defineProperty(EventApi.prototype, "backgroundColor", {
-            get: function () { return this._def.ui.backgroundColor; },
-            enumerable: true,
-            configurable: true
-        });
-        Object.defineProperty(EventApi.prototype, "borderColor", {
-            get: function () { return this._def.ui.borderColor; },
-            enumerable: true,
-            configurable: true
-        });
-        Object.defineProperty(EventApi.prototype, "textColor", {
-            get: function () { return this._def.ui.textColor; },
-            enumerable: true,
-            configurable: true
-        });
-        Object.defineProperty(EventApi.prototype, "classNames", {
-            // NOTE: user can't modify these because Object.freeze was called in event-def parsing
-            get: function () { return this._def.ui.classNames; },
-            enumerable: true,
-            configurable: true
-        });
-        Object.defineProperty(EventApi.prototype, "extendedProps", {
-            get: function () { return this._def.extendedProps; },
-            enumerable: true,
-            configurable: true
-        });
-        return EventApi;
-    }());
-
-    /*
-    Specifying nextDayThreshold signals that all-day ranges should be sliced.
-    */
-    function sliceEventStore(eventStore, eventUiBases, framingRange, nextDayThreshold) {
-        var inverseBgByGroupId = {};
-        var inverseBgByDefId = {};
-        var defByGroupId = {};
-        var bgRanges = [];
-        var fgRanges = [];
-        var eventUis = compileEventUis(eventStore.defs, eventUiBases);
-        for (var defId in eventStore.defs) {
-            var def = eventStore.defs[defId];
-            if (def.rendering === 'inverse-background') {
-                if (def.groupId) {
-                    inverseBgByGroupId[def.groupId] = [];
-                    if (!defByGroupId[def.groupId]) {
-                        defByGroupId[def.groupId] = def;
-                    }
-                }
-                else {
-                    inverseBgByDefId[defId] = [];
-                }
-            }
-        }
-        for (var instanceId in eventStore.instances) {
-            var instance = eventStore.instances[instanceId];
-            var def = eventStore.defs[instance.defId];
-            var ui = eventUis[def.defId];
-            var origRange = instance.range;
-            var normalRange = (!def.allDay && nextDayThreshold) ?
-                computeVisibleDayRange(origRange, nextDayThreshold) :
-                origRange;
-            var slicedRange = intersectRanges(normalRange, framingRange);
-            if (slicedRange) {
-                if (def.rendering === 'inverse-background') {
-                    if (def.groupId) {
-                        inverseBgByGroupId[def.groupId].push(slicedRange);
-                    }
-                    else {
-                        inverseBgByDefId[instance.defId].push(slicedRange);
-                    }
-                }
-                else {
-                    (def.rendering === 'background' ? bgRanges : fgRanges).push({
-                        def: def,
-                        ui: ui,
-                        instance: instance,
-                        range: slicedRange,
-                        isStart: normalRange.start && normalRange.start.valueOf() === slicedRange.start.valueOf(),
-                        isEnd: normalRange.end && normalRange.end.valueOf() === slicedRange.end.valueOf()
-                    });
-                }
-            }
-        }
-        for (var groupId in inverseBgByGroupId) { // BY GROUP
-            var ranges = inverseBgByGroupId[groupId];
-            var invertedRanges = invertRanges(ranges, framingRange);
-            for (var _i = 0, invertedRanges_1 = invertedRanges; _i < invertedRanges_1.length; _i++) {
-                var invertedRange = invertedRanges_1[_i];
-                var def = defByGroupId[groupId];
-                var ui = eventUis[def.defId];
-                bgRanges.push({
-                    def: def,
-                    ui: ui,
-                    instance: null,
-                    range: invertedRange,
-                    isStart: false,
-                    isEnd: false
-                });
-            }
-        }
-        for (var defId in inverseBgByDefId) {
-            var ranges = inverseBgByDefId[defId];
-            var invertedRanges = invertRanges(ranges, framingRange);
-            for (var _a = 0, invertedRanges_2 = invertedRanges; _a < invertedRanges_2.length; _a++) {
-                var invertedRange = invertedRanges_2[_a];
-                bgRanges.push({
-                    def: eventStore.defs[defId],
-                    ui: eventUis[defId],
-                    instance: null,
-                    range: invertedRange,
-                    isStart: false,
-                    isEnd: false
-                });
-            }
-        }
-        return { bg: bgRanges, fg: fgRanges };
-    }
-    function hasBgRendering(def) {
-        return def.rendering === 'background' || def.rendering === 'inverse-background';
-    }
-    function filterSegsViaEls(view, segs, isMirror) {
-        if (view.hasPublicHandlers('eventRender')) {
-            segs = segs.filter(function (seg) {
-                var custom = view.publiclyTrigger('eventRender', [
-                    {
-                        event: new EventApi(view.calendar, seg.eventRange.def, seg.eventRange.instance),
-                        isMirror: isMirror,
-                        isStart: seg.isStart,
-                        isEnd: seg.isEnd,
-                        // TODO: include seg.range once all components consistently generate it
-                        el: seg.el,
-                        view: view
-                    }
-                ]);
-                if (custom === false) { // means don't render at all
-                    return false;
-                }
-                else if (custom && custom !== true) {
-                    seg.el = custom;
-                }
-                return true;
-            });
-        }
-        for (var _i = 0, segs_1 = segs; _i < segs_1.length; _i++) {
-            var seg = segs_1[_i];
-            setElSeg(seg.el, seg);
-        }
-        return segs;
-    }
-    function setElSeg(el, seg) {
-        el.fcSeg = seg;
-    }
-    function getElSeg(el) {
-        return el.fcSeg || null;
-    }
-    // event ui computation
-    function compileEventUis(eventDefs, eventUiBases) {
-        return mapHash(eventDefs, function (eventDef) {
-            return compileEventUi(eventDef, eventUiBases);
-        });
-    }
-    function compileEventUi(eventDef, eventUiBases) {
-        var uis = [];
-        if (eventUiBases['']) {
-            uis.push(eventUiBases['']);
-        }
-        if (eventUiBases[eventDef.defId]) {
-            uis.push(eventUiBases[eventDef.defId]);
-        }
-        uis.push(eventDef.ui);
-        return combineEventUis(uis);
-    }
-
-    // applies the mutation to ALL defs/instances within the event store
-    function applyMutationToEventStore(eventStore, eventConfigBase, mutation, calendar) {
-        var eventConfigs = compileEventUis(eventStore.defs, eventConfigBase);
-        var dest = createEmptyEventStore();
-        for (var defId in eventStore.defs) {
-            var def = eventStore.defs[defId];
-            dest.defs[defId] = applyMutationToEventDef(def, eventConfigs[defId], mutation, calendar.pluginSystem.hooks.eventDefMutationAppliers, calendar);
-        }
-        for (var instanceId in eventStore.instances) {
-            var instance = eventStore.instances[instanceId];
-            var def = dest.defs[instance.defId]; // important to grab the newly modified def
-            dest.instances[instanceId] = applyMutationToEventInstance(instance, def, eventConfigs[instance.defId], mutation, calendar);
-        }
-        return dest;
-    }
-    function applyMutationToEventDef(eventDef, eventConfig, mutation, appliers, calendar) {
-        var standardProps = mutation.standardProps || {};
-        // if hasEnd has not been specified, guess a good value based on deltas.
-        // if duration will change, there's no way the default duration will persist,
-        // and thus, we need to mark the event as having a real end
-        if (standardProps.hasEnd == null &&
-            eventConfig.durationEditable &&
-            (mutation.startDelta || mutation.endDelta)) {
-            standardProps.hasEnd = true; // TODO: is this mutation okay?
-        }
-        var copy = __assign({}, eventDef, standardProps, { ui: __assign({}, eventDef.ui, standardProps.ui) });
-        if (mutation.extendedProps) {
-            copy.extendedProps = __assign({}, copy.extendedProps, mutation.extendedProps);
-        }
-        for (var _i = 0, appliers_1 = appliers; _i < appliers_1.length; _i++) {
-            var applier = appliers_1[_i];
-            applier(copy, mutation, calendar);
-        }
-        if (!copy.hasEnd && calendar.opt('forceEventDuration')) {
-            copy.hasEnd = true;
-        }
-        return copy;
-    }
-    function applyMutationToEventInstance(eventInstance, eventDef, // must first be modified by applyMutationToEventDef
-    eventConfig, mutation, calendar) {
-        var dateEnv = calendar.dateEnv;
-        var forceAllDay = mutation.standardProps && mutation.standardProps.allDay === true;
-        var clearEnd = mutation.standardProps && mutation.standardProps.hasEnd === false;
-        var copy = __assign({}, eventInstance);
-        if (forceAllDay) {
-            copy.range = computeAlignedDayRange(copy.range);
-        }
-        if (mutation.datesDelta && eventConfig.startEditable) {
-            copy.range = {
-                start: dateEnv.add(copy.range.start, mutation.datesDelta),
-                end: dateEnv.add(copy.range.end, mutation.datesDelta)
-            };
-        }
-        if (mutation.startDelta && eventConfig.durationEditable) {
-            copy.range = {
-                start: dateEnv.add(copy.range.start, mutation.startDelta),
-                end: copy.range.end
-            };
-        }
-        if (mutation.endDelta && eventConfig.durationEditable) {
-            copy.range = {
-                start: copy.range.start,
-                end: dateEnv.add(copy.range.end, mutation.endDelta)
-            };
-        }
-        if (clearEnd) {
-            copy.range = {
-                start: copy.range.start,
-                end: calendar.getDefaultEventEnd(eventDef.allDay, copy.range.start)
-            };
-        }
-        // in case event was all-day but the supplied deltas were not
-        // better util for this?
-        if (eventDef.allDay) {
-            copy.range = {
-                start: startOfDay(copy.range.start),
-                end: startOfDay(copy.range.end)
-            };
-        }
-        // handle invalid durations
-        if (copy.range.end < copy.range.start) {
-            copy.range.end = calendar.getDefaultEventEnd(eventDef.allDay, copy.range.start);
-        }
-        return copy;
-    }
-
-    function reduceEventStore (eventStore, action, eventSources, dateProfile, calendar) {
-        switch (action.type) {
-            case 'RECEIVE_EVENTS': // raw
-                return receiveRawEvents(eventStore, eventSources[action.sourceId], action.fetchId, action.fetchRange, action.rawEvents, calendar);
-            case 'ADD_EVENTS': // already parsed, but not expanded
-                return addEvent(eventStore, action.eventStore, // new ones
-                dateProfile ? dateProfile.activeRange : null, calendar);
-            case 'MERGE_EVENTS': // already parsed and expanded
-                return mergeEventStores(eventStore, action.eventStore);
-            case 'PREV': // TODO: how do we track all actions that affect dateProfile :(
-            case 'NEXT':
-            case 'SET_DATE':
-            case 'SET_VIEW_TYPE':
-                if (dateProfile) {
-                    return expandRecurring(eventStore, dateProfile.activeRange, calendar);
-                }
-                else {
-                    return eventStore;
-                }
-            case 'CHANGE_TIMEZONE':
-                return rezoneDates(eventStore, action.oldDateEnv, calendar.dateEnv);
-            case 'MUTATE_EVENTS':
-                return applyMutationToRelated(eventStore, action.instanceId, action.mutation, action.fromApi, calendar);
-            case 'REMOVE_EVENT_INSTANCES':
-                return excludeInstances(eventStore, action.instances);
-            case 'REMOVE_EVENT_DEF':
-                return filterEventStoreDefs(eventStore, function (eventDef) {
-                    return eventDef.defId !== action.defId;
-                });
-            case 'REMOVE_EVENT_SOURCE':
-                return excludeEventsBySourceId(eventStore, action.sourceId);
-            case 'REMOVE_ALL_EVENT_SOURCES':
-                return filterEventStoreDefs(eventStore, function (eventDef) {
-                    return !eventDef.sourceId; // only keep events with no source id
-                });
-            case 'REMOVE_ALL_EVENTS':
-                return createEmptyEventStore();
-            case 'RESET_EVENTS':
-                return {
-                    defs: eventStore.defs,
-                    instances: eventStore.instances
-                };
-            default:
-                return eventStore;
-        }
-    }
-    function receiveRawEvents(eventStore, eventSource, fetchId, fetchRange, rawEvents, calendar) {
-        if (eventSource && // not already removed
-            fetchId === eventSource.latestFetchId // TODO: wish this logic was always in event-sources
-        ) {
-            var subset = parseEvents(transformRawEvents(rawEvents, eventSource, calendar), eventSource.sourceId, calendar);
-            if (fetchRange) {
-                subset = expandRecurring(subset, fetchRange, calendar);
-            }
-            return mergeEventStores(excludeEventsBySourceId(eventStore, eventSource.sourceId), subset);
-        }
-        return eventStore;
-    }
-    function addEvent(eventStore, subset, expandRange, calendar) {
-        if (expandRange) {
-            subset = expandRecurring(subset, expandRange, calendar);
-        }
-        return mergeEventStores(eventStore, subset);
-    }
-    function rezoneDates(eventStore, oldDateEnv, newDateEnv) {
-        var defs = eventStore.defs;
-        var instances = mapHash(eventStore.instances, function (instance) {
-            var def = defs[instance.defId];
-            if (def.allDay || def.recurringDef) {
-                return instance; // isn't dependent on timezone
-            }
-            else {
-                return __assign({}, instance, { range: {
-                        start: newDateEnv.createMarker(oldDateEnv.toDate(instance.range.start, instance.forcedStartTzo)),
-                        end: newDateEnv.createMarker(oldDateEnv.toDate(instance.range.end, instance.forcedEndTzo))
-                    }, forcedStartTzo: newDateEnv.canComputeOffset ? null : instance.forcedStartTzo, forcedEndTzo: newDateEnv.canComputeOffset ? null : instance.forcedEndTzo });
-            }
-        });
-        return { defs: defs, instances: instances };
-    }
-    function applyMutationToRelated(eventStore, instanceId, mutation, fromApi, calendar) {
-        var relevant = getRelevantEvents(eventStore, instanceId);
-        var eventConfigBase = fromApi ?
-            { '': {
-                    startEditable: true,
-                    durationEditable: true,
-                    constraints: [],
-                    overlap: null,
-                    allows: [],
-                    backgroundColor: '',
-                    borderColor: '',
-                    textColor: '',
-                    classNames: []
-                } } :
-            calendar.eventUiBases;
-        relevant = applyMutationToEventStore(relevant, eventConfigBase, mutation, calendar);
-        return mergeEventStores(eventStore, relevant);
-    }
-    function excludeEventsBySourceId(eventStore, sourceId) {
-        return filterEventStoreDefs(eventStore, function (eventDef) {
-            return eventDef.sourceId !== sourceId;
-        });
-    }
-    // QUESTION: why not just return instances? do a general object-property-exclusion util
-    function excludeInstances(eventStore, removals) {
-        return {
-            defs: eventStore.defs,
-            instances: filterHash(eventStore.instances, function (instance) {
-                return !removals[instance.instanceId];
-            })
-        };
-    }
-
-    // high-level segmenting-aware tester functions
-    // ------------------------------------------------------------------------------------------------------------------------
-    function isInteractionValid(interaction, calendar) {
-        return isNewPropsValid({ eventDrag: interaction }, calendar); // HACK: the eventDrag props is used for ALL interactions
-    }
-    function isDateSelectionValid(dateSelection, calendar) {
-        return isNewPropsValid({ dateSelection: dateSelection }, calendar);
-    }
-    function isNewPropsValid(newProps, calendar) {
-        var view = calendar.view;
-        var props = __assign({ businessHours: view ? view.props.businessHours : createEmptyEventStore(), dateSelection: '', eventStore: calendar.state.eventStore, eventUiBases: calendar.eventUiBases, eventSelection: '', eventDrag: null, eventResize: null }, newProps);
-        return (calendar.pluginSystem.hooks.isPropsValid || isPropsValid)(props, calendar);
-    }
-    function isPropsValid(state, calendar, dateSpanMeta, filterConfig) {
-        if (dateSpanMeta === void 0) { dateSpanMeta = {}; }
-        if (state.eventDrag && !isInteractionPropsValid(state, calendar, dateSpanMeta, filterConfig)) {
-            return false;
-        }
-        if (state.dateSelection && !isDateSelectionPropsValid(state, calendar, dateSpanMeta, filterConfig)) {
-            return false;
-        }
-        return true;
-    }
-    // Moving Event Validation
-    // ------------------------------------------------------------------------------------------------------------------------
-    function isInteractionPropsValid(state, calendar, dateSpanMeta, filterConfig) {
-        var interaction = state.eventDrag; // HACK: the eventDrag props is used for ALL interactions
-        var subjectEventStore = interaction.mutatedEvents;
-        var subjectDefs = subjectEventStore.defs;
-        var subjectInstances = subjectEventStore.instances;
-        var subjectConfigs = compileEventUis(subjectDefs, interaction.isEvent ?
-            state.eventUiBases :
-            { '': calendar.selectionConfig } // if not a real event, validate as a selection
-        );
-        if (filterConfig) {
-            subjectConfigs = mapHash(subjectConfigs, filterConfig);
-        }
-        var otherEventStore = excludeInstances(state.eventStore, interaction.affectedEvents.instances); // exclude the subject events. TODO: exclude defs too?
-        var otherDefs = otherEventStore.defs;
-        var otherInstances = otherEventStore.instances;
-        var otherConfigs = compileEventUis(otherDefs, state.eventUiBases);
-        for (var subjectInstanceId in subjectInstances) {
-            var subjectInstance = subjectInstances[subjectInstanceId];
-            var subjectRange = subjectInstance.range;
-            var subjectConfig = subjectConfigs[subjectInstance.defId];
-            var subjectDef = subjectDefs[subjectInstance.defId];
-            // constraint
-            if (!allConstraintsPass(subjectConfig.constraints, subjectRange, otherEventStore, state.businessHours, calendar)) {
-                return false;
-            }
-            // overlap
-            var overlapFunc = calendar.opt('eventOverlap');
-            if (typeof overlapFunc !== 'function') {
-                overlapFunc = null;
-            }
-            for (var otherInstanceId in otherInstances) {
-                var otherInstance = otherInstances[otherInstanceId];
-                // intersect! evaluate
-                if (rangesIntersect(subjectRange, otherInstance.range)) {
-                    var otherOverlap = otherConfigs[otherInstance.defId].overlap;
-                    // consider the other event's overlap. only do this if the subject event is a "real" event
-                    if (otherOverlap === false && interaction.isEvent) {
-                        return false;
-                    }
-                    if (subjectConfig.overlap === false) {
-                        return false;
-                    }
-                    if (overlapFunc && !overlapFunc(new EventApi(calendar, otherDefs[otherInstance.defId], otherInstance), // still event
-                    new EventApi(calendar, subjectDef, subjectInstance) // moving event
-                    )) {
-                        return false;
-                    }
-                }
-            }
-            // allow (a function)
-            var calendarEventStore = calendar.state.eventStore; // need global-to-calendar, not local to component (splittable)state
-            for (var _i = 0, _a = subjectConfig.allows; _i < _a.length; _i++) {
-                var subjectAllow = _a[_i];
-                var subjectDateSpan = __assign({}, dateSpanMeta, { range: subjectInstance.range, allDay: subjectDef.allDay });
-                var origDef = calendarEventStore.defs[subjectDef.defId];
-                var origInstance = calendarEventStore.instances[subjectInstanceId];
-                var eventApi = void 0;
-                if (origDef) { // was previously in the calendar
-                    eventApi = new EventApi(calendar, origDef, origInstance);
-                }
-                else { // was an external event
-                    eventApi = new EventApi(calendar, subjectDef); // no instance, because had no dates
-                }
-                if (!subjectAllow(calendar.buildDateSpanApi(subjectDateSpan), eventApi)) {
-                    return false;
-                }
-            }
-        }
-        return true;
-    }
-    // Date Selection Validation
-    // ------------------------------------------------------------------------------------------------------------------------
-    function isDateSelectionPropsValid(state, calendar, dateSpanMeta, filterConfig) {
-        var relevantEventStore = state.eventStore;
-        var relevantDefs = relevantEventStore.defs;
-        var relevantInstances = relevantEventStore.instances;
-        var selection = state.dateSelection;
-        var selectionRange = selection.range;
-        var selectionConfig = calendar.selectionConfig;
-        if (filterConfig) {
-            selectionConfig = filterConfig(selectionConfig);
-        }
-        // constraint
-        if (!allConstraintsPass(selectionConfig.constraints, selectionRange, relevantEventStore, state.businessHours, calendar)) {
-            return false;
-        }
-        // overlap
-        var overlapFunc = calendar.opt('selectOverlap');
-        if (typeof overlapFunc !== 'function') {
-            overlapFunc = null;
-        }
-        for (var relevantInstanceId in relevantInstances) {
-            var relevantInstance = relevantInstances[relevantInstanceId];
-            // intersect! evaluate
-            if (rangesIntersect(selectionRange, relevantInstance.range)) {
-                if (selectionConfig.overlap === false) {
-                    return false;
-                }
-                if (overlapFunc && !overlapFunc(new EventApi(calendar, relevantDefs[relevantInstance.defId], relevantInstance))) {
-                    return false;
-                }
-            }
-        }
-        // allow (a function)
-        for (var _i = 0, _a = selectionConfig.allows; _i < _a.length; _i++) {
-            var selectionAllow = _a[_i];
-            var fullDateSpan = __assign({}, dateSpanMeta, selection);
-            if (!selectionAllow(calendar.buildDateSpanApi(fullDateSpan), null)) {
-                return false;
-            }
-        }
-        return true;
-    }
-    // Constraint Utils
-    // ------------------------------------------------------------------------------------------------------------------------
-    function allConstraintsPass(constraints, subjectRange, otherEventStore, businessHoursUnexpanded, calendar) {
-        for (var _i = 0, constraints_1 = constraints; _i < constraints_1.length; _i++) {
-            var constraint = constraints_1[_i];
-            if (!anyRangesContainRange(constraintToRanges(constraint, subjectRange, otherEventStore, businessHoursUnexpanded, calendar), subjectRange)) {
-                return false;
-            }
-        }
-        return true;
-    }
-    function constraintToRanges(constraint, subjectRange, // for expanding a recurring constraint, or expanding business hours
-    otherEventStore, // for if constraint is an even group ID
-    businessHoursUnexpanded, // for if constraint is 'businessHours'
-    calendar // for expanding businesshours
-    ) {
-        if (constraint === 'businessHours') {
-            return eventStoreToRanges(expandRecurring(businessHoursUnexpanded, subjectRange, calendar));
-        }
-        else if (typeof constraint === 'string') { // an group ID
-            return eventStoreToRanges(filterEventStoreDefs(otherEventStore, function (eventDef) {
-                return eventDef.groupId === constraint;
-            }));
-        }
-        else if (typeof constraint === 'object' && constraint) { // non-null object
-            return eventStoreToRanges(expandRecurring(constraint, subjectRange, calendar));
-        }
-        return []; // if it's false
-    }
-    // TODO: move to event-store file?
-    function eventStoreToRanges(eventStore) {
-        var instances = eventStore.instances;
-        var ranges = [];
-        for (var instanceId in instances) {
-            ranges.push(instances[instanceId].range);
-        }
-        return ranges;
-    }
-    // TODO: move to geom file?
-    function anyRangesContainRange(outerRanges, innerRange) {
-        for (var _i = 0, outerRanges_1 = outerRanges; _i < outerRanges_1.length; _i++) {
-            var outerRange = outerRanges_1[_i];
-            if (rangeContainsRange(outerRange, innerRange)) {
-                return true;
-            }
-        }
-        return false;
-    }
-    // Parsing
-    // ------------------------------------------------------------------------------------------------------------------------
-    function normalizeConstraint(input, calendar) {
-        if (Array.isArray(input)) {
-            return parseEvents(input, '', calendar, true); // allowOpenRange=true
-        }
-        else if (typeof input === 'object' && input) { // non-null object
-            return parseEvents([input], '', calendar, true); // allowOpenRange=true
-        }
-        else if (input != null) {
-            return String(input);
-        }
-        else {
-            return null;
-        }
-    }
-
-    function htmlEscape(s) {
-        return (s + '').replace(/&/g, '&amp;')
-            .replace(/</g, '&lt;')
-            .replace(/>/g, '&gt;')
-            .replace(/'/g, '&#039;')
-            .replace(/"/g, '&quot;')
-            .replace(/\n/g, '<br />');
-    }
-    // Given a hash of CSS properties, returns a string of CSS.
-    // Uses property names as-is (no camel-case conversion). Will not make statements for null/undefined values.
-    function cssToStr(cssProps) {
-        var statements = [];
-        for (var name_1 in cssProps) {
-            var val = cssProps[name_1];
-            if (val != null && val !== '') {
-                statements.push(name_1 + ':' + val);
-            }
-        }
-        return statements.join(';');
-    }
-    // Given an object hash of HTML attribute names to values,
-    // generates a string that can be injected between < > in HTML
-    function attrsToStr(attrs) {
-        var parts = [];
-        for (var name_2 in attrs) {
-            var val = attrs[name_2];
-            if (val != null) {
-                parts.push(name_2 + '="' + htmlEscape(val) + '"');
-            }
-        }
-        return parts.join(' ');
-    }
-    function parseClassName(raw) {
-        if (Array.isArray(raw)) {
-            return raw;
-        }
-        else if (typeof raw === 'string') {
-            return raw.split(/\s+/);
-        }
-        else {
-            return [];
-        }
-    }
-
-    var UNSCOPED_EVENT_UI_PROPS = {
-        editable: Boolean,
-        startEditable: Boolean,
-        durationEditable: Boolean,
-        constraint: null,
-        overlap: null,
-        allow: null,
-        className: parseClassName,
-        classNames: parseClassName,
-        color: String,
-        backgroundColor: String,
-        borderColor: String,
-        textColor: String
-    };
-    function processUnscopedUiProps(rawProps, calendar, leftovers) {
-        var props = refineProps(rawProps, UNSCOPED_EVENT_UI_PROPS, {}, leftovers);
-        var constraint = normalizeConstraint(props.constraint, calendar);
-        return {
-            startEditable: props.startEditable != null ? props.startEditable : props.editable,
-            durationEditable: props.durationEditable != null ? props.durationEditable : props.editable,
-            constraints: constraint != null ? [constraint] : [],
-            overlap: props.overlap,
-            allows: props.allow != null ? [props.allow] : [],
-            backgroundColor: props.backgroundColor || props.color,
-            borderColor: props.borderColor || props.color,
-            textColor: props.textColor,
-            classNames: props.classNames.concat(props.className)
-        };
-    }
-    function processScopedUiProps(prefix, rawScoped, calendar, leftovers) {
-        var rawUnscoped = {};
-        var wasFound = {};
-        for (var key in UNSCOPED_EVENT_UI_PROPS) {
-            var scopedKey = prefix + capitaliseFirstLetter(key);
-            rawUnscoped[key] = rawScoped[scopedKey];
-            wasFound[scopedKey] = true;
-        }
-        if (prefix === 'event') {
-            rawUnscoped.editable = rawScoped.editable; // special case. there is no 'eventEditable', just 'editable'
-        }
-        if (leftovers) {
-            for (var key in rawScoped) {
-                if (!wasFound[key]) {
-                    leftovers[key] = rawScoped[key];
-                }
-            }
-        }
-        return processUnscopedUiProps(rawUnscoped, calendar);
-    }
-    var EMPTY_EVENT_UI = {
-        startEditable: null,
-        durationEditable: null,
-        constraints: [],
-        overlap: null,
-        allows: [],
-        backgroundColor: '',
-        borderColor: '',
-        textColor: '',
-        classNames: []
-    };
-    // prevent against problems with <2 args!
-    function combineEventUis(uis) {
-        return uis.reduce(combineTwoEventUis, EMPTY_EVENT_UI);
-    }
-    function combineTwoEventUis(item0, item1) {
-        return {
-            startEditable: item1.startEditable != null ? item1.startEditable : item0.startEditable,
-            durationEditable: item1.durationEditable != null ? item1.durationEditable : item0.durationEditable,
-            constraints: item0.constraints.concat(item1.constraints),
-            overlap: typeof item1.overlap === 'boolean' ? item1.overlap : item0.overlap,
-            allows: item0.allows.concat(item1.allows),
-            backgroundColor: item1.backgroundColor || item0.backgroundColor,
-            borderColor: item1.borderColor || item0.borderColor,
-            textColor: item1.textColor || item0.textColor,
-            classNames: item0.classNames.concat(item1.classNames)
-        };
-    }
-
-    var NON_DATE_PROPS = {
-        id: String,
-        groupId: String,
-        title: String,
-        url: String,
-        rendering: String,
-        extendedProps: null
-    };
-    var DATE_PROPS = {
-        start: null,
-        date: null,
-        end: null,
-        allDay: null
-    };
-    var uid = 0;
-    function parseEvent(raw, sourceId, calendar, allowOpenRange) {
-        var allDayDefault = computeIsAllDayDefault(sourceId, calendar);
-        var leftovers0 = {};
-        var recurringRes = parseRecurring(raw, // raw, but with single-event stuff stripped out
-        allDayDefault, calendar.dateEnv, calendar.pluginSystem.hooks.recurringTypes, leftovers0 // will populate with non-recurring props
-        );
-        if (recurringRes) {
-            var def = parseEventDef(leftovers0, sourceId, recurringRes.allDay, Boolean(recurringRes.duration), calendar);
-            def.recurringDef = {
-                typeId: recurringRes.typeId,
-                typeData: recurringRes.typeData,
-                duration: recurringRes.duration
-            };
-            return { def: def, instance: null };
-        }
-        else {
-            var leftovers1 = {};
-            var singleRes = parseSingle(raw, allDayDefault, calendar, leftovers1, allowOpenRange);
-            if (singleRes) {
-                var def = parseEventDef(leftovers1, sourceId, singleRes.allDay, singleRes.hasEnd, calendar);
-                var instance = createEventInstance(def.defId, singleRes.range, singleRes.forcedStartTzo, singleRes.forcedEndTzo);
-                return { def: def, instance: instance };
-            }
-        }
-        return null;
-    }
-    /*
-    Will NOT populate extendedProps with the leftover properties.
-    Will NOT populate date-related props.
-    The EventNonDateInput has been normalized (id => publicId, etc).
-    */
-    function parseEventDef(raw, sourceId, allDay, hasEnd, calendar) {
-        var leftovers = {};
-        var def = pluckNonDateProps(raw, calendar, leftovers);
-        def.defId = String(uid++);
-        def.sourceId = sourceId;
-        def.allDay = allDay;
-        def.hasEnd = hasEnd;
-        for (var _i = 0, _a = calendar.pluginSystem.hooks.eventDefParsers; _i < _a.length; _i++) {
-            var eventDefParser = _a[_i];
-            var newLeftovers = {};
-            eventDefParser(def, leftovers, newLeftovers);
-            leftovers = newLeftovers;
-        }
-        def.extendedProps = __assign(leftovers, def.extendedProps || {});
-        // help out EventApi from having user modify props
-        Object.freeze(def.ui.classNames);
-        Object.freeze(def.extendedProps);
-        return def;
-    }
-    function createEventInstance(defId, range, forcedStartTzo, forcedEndTzo) {
-        return {
-            instanceId: String(uid++),
-            defId: defId,
-            range: range,
-            forcedStartTzo: forcedStartTzo == null ? null : forcedStartTzo,
-            forcedEndTzo: forcedEndTzo == null ? null : forcedEndTzo
-        };
-    }
-    function parseSingle(raw, allDayDefault, calendar, leftovers, allowOpenRange) {
-        var props = pluckDateProps(raw, leftovers);
-        var allDay = props.allDay;
-        var startMeta;
-        var startMarker = null;
-        var hasEnd = false;
-        var endMeta;
-        var endMarker = null;
-        startMeta = calendar.dateEnv.createMarkerMeta(props.start);
-        if (startMeta) {
-            startMarker = startMeta.marker;
-        }
-        else if (!allowOpenRange) {
-            return null;
-        }
-        if (props.end != null) {
-            endMeta = calendar.dateEnv.createMarkerMeta(props.end);
-        }
-        if (allDay == null) {
-            if (allDayDefault != null) {
-                allDay = allDayDefault;
-            }
-            else {
-                // fall back to the date props LAST
-                allDay = (!startMeta || startMeta.isTimeUnspecified) &&
-                    (!endMeta || endMeta.isTimeUnspecified);
-            }
-        }
-        if (allDay && startMarker) {
-            startMarker = startOfDay(startMarker);
-        }
-        if (endMeta) {
-            endMarker = endMeta.marker;
-            if (allDay) {
-                endMarker = startOfDay(endMarker);
-            }
-            if (startMarker && endMarker <= startMarker) {
-                endMarker = null;
-            }
-        }
-        if (endMarker) {
-            hasEnd = true;
-        }
-        else if (!allowOpenRange) {
-            hasEnd = calendar.opt('forceEventDuration') || false;
-            endMarker = calendar.dateEnv.add(startMarker, allDay ?
-                calendar.defaultAllDayEventDuration :
-                calendar.defaultTimedEventDuration);
-        }
-        return {
-            allDay: allDay,
-            hasEnd: hasEnd,
-            range: { start: startMarker, end: endMarker },
-            forcedStartTzo: startMeta ? startMeta.forcedTzo : null,
-            forcedEndTzo: endMeta ? endMeta.forcedTzo : null
-        };
-    }
-    function pluckDateProps(raw, leftovers) {
-        var props = refineProps(raw, DATE_PROPS, {}, leftovers);
-        props.start = (props.start !== null) ? props.start : props.date;
-        delete props.date;
-        return props;
-    }
-    function pluckNonDateProps(raw, calendar, leftovers) {
-        var preLeftovers = {};
-        var props = refineProps(raw, NON_DATE_PROPS, {}, preLeftovers);
-        var ui = processUnscopedUiProps(preLeftovers, calendar, leftovers);
-        props.publicId = props.id;
-        delete props.id;
-        props.ui = ui;
-        return props;
-    }
-    function computeIsAllDayDefault(sourceId, calendar) {
-        var res = null;
-        if (sourceId) {
-            var source = calendar.state.eventSources[sourceId];
-            res = source.allDayDefault;
-        }
-        if (res == null) {
-            res = calendar.opt('allDayDefault');
-        }
-        return res;
-    }
-
-    var DEF_DEFAULTS = {
-        startTime: '09:00',
-        endTime: '17:00',
-        daysOfWeek: [1, 2, 3, 4, 5],
-        rendering: 'inverse-background',
-        classNames: 'fc-nonbusiness',
-        groupId: '_businessHours' // so multiple defs get grouped
-    };
-    /*
-    TODO: pass around as EventDefHash!!!
-    */
-    function parseBusinessHours(input, calendar) {
-        return parseEvents(refineInputs(input), '', calendar);
-    }
-    function refineInputs(input) {
-        var rawDefs;
-        if (input === true) {
-            rawDefs = [{}]; // will get DEF_DEFAULTS verbatim
-        }
-        else if (Array.isArray(input)) {
-            // if specifying an array, every sub-definition NEEDS a day-of-week
-            rawDefs = input.filter(function (rawDef) {
-                return rawDef.daysOfWeek;
-            });
-        }
-        else if (typeof input === 'object' && input) { // non-null object
-            rawDefs = [input];
-        }
-        else { // is probably false
-            rawDefs = [];
-        }
-        rawDefs = rawDefs.map(function (rawDef) {
-            return __assign({}, DEF_DEFAULTS, rawDef);
-        });
-        return rawDefs;
-    }
-
-    function memoizeRendering(renderFunc, unrenderFunc, dependencies) {
-        if (dependencies === void 0) { dependencies = []; }
-        var dependents = [];
-        var thisContext;
-        var prevArgs;
-        function unrender() {
-            if (prevArgs) {
-                for (var _i = 0, dependents_1 = dependents; _i < dependents_1.length; _i++) {
-                    var dependent = dependents_1[_i];
-                    dependent.unrender();
-                }
-                if (unrenderFunc) {
-                    unrenderFunc.apply(thisContext, prevArgs);
-                }
-                prevArgs = null;
-            }
-        }
-        function res() {
-            if (!prevArgs || !isArraysEqual(prevArgs, arguments)) {
-                unrender();
-                thisContext = this;
-                prevArgs = arguments;
-                renderFunc.apply(this, arguments);
-            }
-        }
-        res.dependents = dependents;
-        res.unrender = unrender;
-        for (var _i = 0, dependencies_1 = dependencies; _i < dependencies_1.length; _i++) {
-            var dependency = dependencies_1[_i];
-            dependency.dependents.push(res);
-        }
-        return res;
-    }
-
-    var EMPTY_EVENT_STORE = createEmptyEventStore(); // for purecomponents. TODO: keep elsewhere
-    var Splitter = /** @class */ (function () {
-        function Splitter() {
-            this.getKeysForEventDefs = memoize(this._getKeysForEventDefs);
-            this.splitDateSelection = memoize(this._splitDateSpan);
-            this.splitEventStore = memoize(this._splitEventStore);
-            this.splitIndividualUi = memoize(this._splitIndividualUi);
-            this.splitEventDrag = memoize(this._splitInteraction);
-            this.splitEventResize = memoize(this._splitInteraction);
-            this.eventUiBuilders = {}; // TODO: typescript protection
-        }
-        Splitter.prototype.splitProps = function (props) {
-            var _this = this;
-            var keyInfos = this.getKeyInfo(props);
-            var defKeys = this.getKeysForEventDefs(props.eventStore);
-            var dateSelections = this.splitDateSelection(props.dateSelection);
-            var individualUi = this.splitIndividualUi(props.eventUiBases, defKeys); // the individual *bases*
-            var eventStores = this.splitEventStore(props.eventStore, defKeys);
-            var eventDrags = this.splitEventDrag(props.eventDrag);
-            var eventResizes = this.splitEventResize(props.eventResize);
-            var splitProps = {};
-            this.eventUiBuilders = mapHash(keyInfos, function (info, key) {
-                return _this.eventUiBuilders[key] || memoize(buildEventUiForKey);
-            });
-            for (var key in keyInfos) {
-                var keyInfo = keyInfos[key];
-                var eventStore = eventStores[key] || EMPTY_EVENT_STORE;
-                var buildEventUi = this.eventUiBuilders[key];
-                splitProps[key] = {
-                    businessHours: keyInfo.businessHours || props.businessHours,
-                    dateSelection: dateSelections[key] || null,
-                    eventStore: eventStore,
-                    eventUiBases: buildEventUi(props.eventUiBases[''], keyInfo.ui, individualUi[key]),
-                    eventSelection: eventStore.instances[props.eventSelection] ? props.eventSelection : '',
-                    eventDrag: eventDrags[key] || null,
-                    eventResize: eventResizes[key] || null
-                };
-            }
-            return splitProps;
-        };
-        Splitter.prototype._splitDateSpan = function (dateSpan) {
-            var dateSpans = {};
-            if (dateSpan) {
-                var keys = this.getKeysForDateSpan(dateSpan);
-                for (var _i = 0, keys_1 = keys; _i < keys_1.length; _i++) {
-                    var key = keys_1[_i];
-                    dateSpans[key] = dateSpan;
-                }
-            }
-            return dateSpans;
-        };
-        Splitter.prototype._getKeysForEventDefs = function (eventStore) {
-            var _this = this;
-            return mapHash(eventStore.defs, function (eventDef) {
-                return _this.getKeysForEventDef(eventDef);
-            });
-        };
-        Splitter.prototype._splitEventStore = function (eventStore, defKeys) {
-            var defs = eventStore.defs, instances = eventStore.instances;
-            var splitStores = {};
-            for (var defId in defs) {
-                for (var _i = 0, _a = defKeys[defId]; _i < _a.length; _i++) {
-                    var key = _a[_i];
-                    if (!splitStores[key]) {
-                        splitStores[key] = createEmptyEventStore();
-                    }
-                    splitStores[key].defs[defId] = defs[defId];
-                }
-            }
-            for (var instanceId in instances) {
-                var instance = instances[instanceId];
-                for (var _b = 0, _c = defKeys[instance.defId]; _b < _c.length; _b++) {
-                    var key = _c[_b];
-                    if (splitStores[key]) { // must have already been created
-                        splitStores[key].instances[instanceId] = instance;
-                    }
-                }
-            }
-            return splitStores;
-        };
-        Splitter.prototype._splitIndividualUi = function (eventUiBases, defKeys) {
-            var splitHashes = {};
-            for (var defId in eventUiBases) {
-                if (defId) { // not the '' key
-                    for (var _i = 0, _a = defKeys[defId]; _i < _a.length; _i++) {
-                        var key = _a[_i];
-                        if (!splitHashes[key]) {
-                            splitHashes[key] = {};
-                        }
-                        splitHashes[key][defId] = eventUiBases[defId];
-                    }
-                }
-            }
-            return splitHashes;
-        };
-        Splitter.prototype._splitInteraction = function (interaction) {
-            var splitStates = {};
-            if (interaction) {
-                var affectedStores_1 = this._splitEventStore(interaction.affectedEvents, this._getKeysForEventDefs(interaction.affectedEvents) // can't use cached. might be events from other calendar
-                );
-                // can't rely on defKeys because event data is mutated
-                var mutatedKeysByDefId = this._getKeysForEventDefs(interaction.mutatedEvents);
-                var mutatedStores_1 = this._splitEventStore(interaction.mutatedEvents, mutatedKeysByDefId);
-                var populate = function (key) {
-                    if (!splitStates[key]) {
-                        splitStates[key] = {
-                            affectedEvents: affectedStores_1[key] || EMPTY_EVENT_STORE,
-                            mutatedEvents: mutatedStores_1[key] || EMPTY_EVENT_STORE,
-                            isEvent: interaction.isEvent,
-                            origSeg: interaction.origSeg
-                        };
-                    }
-                };
-                for (var key in affectedStores_1) {
-                    populate(key);
-                }
-                for (var key in mutatedStores_1) {
-                    populate(key);
-                }
-            }
-            return splitStates;
-        };
-        return Splitter;
-    }());
-    function buildEventUiForKey(allUi, eventUiForKey, individualUi) {
-        var baseParts = [];
-        if (allUi) {
-            baseParts.push(allUi);
-        }
-        if (eventUiForKey) {
-            baseParts.push(eventUiForKey);
-        }
-        var stuff = {
-            '': combineEventUis(baseParts)
-        };
-        if (individualUi) {
-            __assign(stuff, individualUi);
-        }
-        return stuff;
-    }
-
-    // Generates HTML for an anchor to another view into the calendar.
-    // Will either generate an <a> tag or a non-clickable <span> tag, depending on enabled settings.
-    // `gotoOptions` can either be a DateMarker, or an object with the form:
-    // { date, type, forceOff }
-    // `type` is a view-type like "day" or "week". default value is "day".
-    // `attrs` and `innerHtml` are use to generate the rest of the HTML tag.
-    function buildGotoAnchorHtml(component, gotoOptions, attrs, innerHtml) {
-        var dateEnv = component.dateEnv;
-        var date;
-        var type;
-        var forceOff;
-        var finalOptions;
-        if (gotoOptions instanceof Date) {
-            date = gotoOptions; // a single date-like input
-        }
-        else {
-            date = gotoOptions.date;
-            type = gotoOptions.type;
-            forceOff = gotoOptions.forceOff;
-        }
-        finalOptions = {
-            date: dateEnv.formatIso(date, { omitTime: true }),
-            type: type || 'day'
-        };
-        if (typeof attrs === 'string') {
-            innerHtml = attrs;
-            attrs = null;
-        }
-        attrs = attrs ? ' ' + attrsToStr(attrs) : ''; // will have a leading space
-        innerHtml = innerHtml || '';
-        if (!forceOff && component.opt('navLinks')) {
-            return '<a' + attrs +
-                ' data-goto="' + htmlEscape(JSON.stringify(finalOptions)) + '">' +
-                innerHtml +
-                '</a>';
-        }
-        else {
-            return '<span' + attrs + '>' +
-                innerHtml +
-                '</span>';
-        }
-    }
-    function getAllDayHtml(component) {
-        return component.opt('allDayHtml') || htmlEscape(component.opt('allDayText'));
-    }
-    // Computes HTML classNames for a single-day element
-    function getDayClasses(date, dateProfile, context, noThemeHighlight) {
-        var calendar = context.calendar, view = context.view, theme = context.theme, dateEnv = context.dateEnv;
-        var classes = [];
-        var todayStart;
-        var todayEnd;
-        if (!rangeContainsMarker(dateProfile.activeRange, date)) {
-            classes.push('fc-disabled-day');
-        }
-        else {
-            classes.push('fc-' + DAY_IDS[date.getUTCDay()]);
-            if (view.opt('monthMode') &&
-                dateEnv.getMonth(date) !== dateEnv.getMonth(dateProfile.currentRange.start)) {
-                classes.push('fc-other-month');
-            }
-            todayStart = startOfDay(calendar.getNow());
-            todayEnd = addDays(todayStart, 1);
-            if (date < todayStart) {
-                classes.push('fc-past');
-            }
-            else if (date >= todayEnd) {
-                classes.push('fc-future');
-            }
-            else {
-                classes.push('fc-today');
-                if (noThemeHighlight !== true) {
-                    classes.push(theme.getClass('today'));
-                }
-            }
-        }
-        return classes;
-    }
-
-    // given a function that resolves a result asynchronously.
-    // the function can either call passed-in success and failure callbacks,
-    // or it can return a promise.
-    // if you need to pass additional params to func, bind them first.
-    function unpromisify(func, success, failure) {
-        // guard against success/failure callbacks being called more than once
-        // and guard against a promise AND callback being used together.
-        var isResolved = false;
-        var wrappedSuccess = function () {
-            if (!isResolved) {
-                isResolved = true;
-                success.apply(this, arguments);
-            }
-        };
-        var wrappedFailure = function () {
-            if (!isResolved) {
-                isResolved = true;
-                if (failure) {
-                    failure.apply(this, arguments);
-                }
-            }
-        };
-        var res = func(wrappedSuccess, wrappedFailure);
-        if (res && typeof res.then === 'function') {
-            res.then(wrappedSuccess, wrappedFailure);
-        }
-    }
-
-    var Mixin = /** @class */ (function () {
-        function Mixin() {
-        }
-        // mix into a CLASS
-        Mixin.mixInto = function (destClass) {
-            this.mixIntoObj(destClass.prototype);
-        };
-        // mix into ANY object
-        Mixin.mixIntoObj = function (destObj) {
-            var _this = this;
-            Object.getOwnPropertyNames(this.prototype).forEach(function (name) {
-                if (!destObj[name]) { // if destination doesn't already define it
-                    destObj[name] = _this.prototype[name];
-                }
-            });
-        };
-        /*
-        will override existing methods
-        TODO: remove! not used anymore
-        */
-        Mixin.mixOver = function (destClass) {
-            var _this = this;
-            Object.getOwnPropertyNames(this.prototype).forEach(function (name) {
-                destClass.prototype[name] = _this.prototype[name];
-            });
-        };
-        return Mixin;
-    }());
-
-    /*
-    USAGE:
-      import { default as EmitterMixin, EmitterInterface } from './EmitterMixin'
-    in class:
-      on: EmitterInterface['on']
-      one: EmitterInterface['one']
-      off: EmitterInterface['off']
-      trigger: EmitterInterface['trigger']
-      triggerWith: EmitterInterface['triggerWith']
-      hasHandlers: EmitterInterface['hasHandlers']
-    after class:
-      EmitterMixin.mixInto(TheClass)
-    */
-    var EmitterMixin = /** @class */ (function (_super) {
-        __extends(EmitterMixin, _super);
-        function EmitterMixin() {
-            return _super !== null && _super.apply(this, arguments) || this;
-        }
-        EmitterMixin.prototype.on = function (type, handler) {
-            addToHash(this._handlers || (this._handlers = {}), type, handler);
-            return this; // for chaining
-        };
-        // todo: add comments
-        EmitterMixin.prototype.one = function (type, handler) {
-            addToHash(this._oneHandlers || (this._oneHandlers = {}), type, handler);
-            return this; // for chaining
-        };
-        EmitterMixin.prototype.off = function (type, handler) {
-            if (this._handlers) {
-                removeFromHash(this._handlers, type, handler);
-            }
-            if (this._oneHandlers) {
-                removeFromHash(this._oneHandlers, type, handler);
-            }
-            return this; // for chaining
-        };
-        EmitterMixin.prototype.trigger = function (type) {
-            var args = [];
-            for (var _i = 1; _i < arguments.length; _i++) {
-                args[_i - 1] = arguments[_i];
-            }
-            this.triggerWith(type, this, args);
-            return this; // for chaining
-        };
-        EmitterMixin.prototype.triggerWith = function (type, context, args) {
-            if (this._handlers) {
-                applyAll(this._handlers[type], context, args);
-            }
-            if (this._oneHandlers) {
-                applyAll(this._oneHandlers[type], context, args);
-                delete this._oneHandlers[type]; // will never fire again
-            }
-            return this; // for chaining
-        };
-        EmitterMixin.prototype.hasHandlers = function (type) {
-            return (this._handlers && this._handlers[type] && this._handlers[type].length) ||
-                (this._oneHandlers && this._oneHandlers[type] && this._oneHandlers[type].length);
-        };
-        return EmitterMixin;
-    }(Mixin));
-    function addToHash(hash, type, handler) {
-        (hash[type] || (hash[type] = []))
-            .push(handler);
-    }
-    function removeFromHash(hash, type, handler) {
-        if (handler) {
-            if (hash[type]) {
-                hash[type] = hash[type].filter(function (func) {
-                    return func !== handler;
-                });
-            }
-        }
-        else {
-            delete hash[type]; // remove all handler funcs for this type
-        }
-    }
-
-    /*
-    Records offset information for a set of elements, relative to an origin element.
-    Can record the left/right OR the top/bottom OR both.
-    Provides methods for querying the cache by position.
-    */
-    var PositionCache = /** @class */ (function () {
-        function PositionCache(originEl, els, isHorizontal, isVertical) {
-            this.originEl = originEl;
-            this.els = els;
-            this.isHorizontal = isHorizontal;
-            this.isVertical = isVertical;
-        }
-        // Queries the els for coordinates and stores them.
-        // Call this method before using and of the get* methods below.
-        PositionCache.prototype.build = function () {
-            var originEl = this.originEl;
-            var originClientRect = this.originClientRect =
-                originEl.getBoundingClientRect(); // relative to viewport top-left
-            if (this.isHorizontal) {
-                this.buildElHorizontals(originClientRect.left);
-            }
-            if (this.isVertical) {
-                this.buildElVerticals(originClientRect.top);
-            }
-        };
-        // Populates the left/right internal coordinate arrays
-        PositionCache.prototype.buildElHorizontals = function (originClientLeft) {
-            var lefts = [];
-            var rights = [];
-            for (var _i = 0, _a = this.els; _i < _a.length; _i++) {
-                var el = _a[_i];
-                var rect = el.getBoundingClientRect();
-                lefts.push(rect.left - originClientLeft);
-                rights.push(rect.right - originClientLeft);
-            }
-            this.lefts = lefts;
-            this.rights = rights;
-        };
-        // Populates the top/bottom internal coordinate arrays
-        PositionCache.prototype.buildElVerticals = function (originClientTop) {
-            var tops = [];
-            var bottoms = [];
-            for (var _i = 0, _a = this.els; _i < _a.length; _i++) {
-                var el = _a[_i];
-                var rect = el.getBoundingClientRect();
-                tops.push(rect.top - originClientTop);
-                bottoms.push(rect.bottom - originClientTop);
-            }
-            this.tops = tops;
-            this.bottoms = bottoms;
-        };
-        // Given a left offset (from document left), returns the index of the el that it horizontally intersects.
-        // If no intersection is made, returns undefined.
-        PositionCache.prototype.leftToIndex = function (leftPosition) {
-            var lefts = this.lefts;
-            var rights = this.rights;
-            var len = lefts.length;
-            var i;
-            for (i = 0; i < len; i++) {
-                if (leftPosition >= lefts[i] && leftPosition < rights[i]) {
-                    return i;
-                }
-            }
-        };
-        // Given a top offset (from document top), returns the index of the el that it vertically intersects.
-        // If no intersection is made, returns undefined.
-        PositionCache.prototype.topToIndex = function (topPosition) {
-            var tops = this.tops;
-            var bottoms = this.bottoms;
-            var len = tops.length;
-            var i;
-            for (i = 0; i < len; i++) {
-                if (topPosition >= tops[i] && topPosition < bottoms[i]) {
-                    return i;
-                }
-            }
-        };
-        // Gets the width of the element at the given index
-        PositionCache.prototype.getWidth = function (leftIndex) {
-            return this.rights[leftIndex] - this.lefts[leftIndex];
-        };
-        // Gets the height of the element at the given index
-        PositionCache.prototype.getHeight = function (topIndex) {
-            return this.bottoms[topIndex] - this.tops[topIndex];
-        };
-        return PositionCache;
-    }());
-
-    /*
-    An object for getting/setting scroll-related information for an element.
-    Internally, this is done very differently for window versus DOM element,
-    so this object serves as a common interface.
-    */
-    var ScrollController = /** @class */ (function () {
-        function ScrollController() {
-        }
-        ScrollController.prototype.getMaxScrollTop = function () {
-            return this.getScrollHeight() - this.getClientHeight();
-        };
-        ScrollController.prototype.getMaxScrollLeft = function () {
-            return this.getScrollWidth() - this.getClientWidth();
-        };
-        ScrollController.prototype.canScrollVertically = function () {
-            return this.getMaxScrollTop() > 0;
-        };
-        ScrollController.prototype.canScrollHorizontally = function () {
-            return this.getMaxScrollLeft() > 0;
-        };
-        ScrollController.prototype.canScrollUp = function () {
-            return this.getScrollTop() > 0;
-        };
-        ScrollController.prototype.canScrollDown = function () {
-            return this.getScrollTop() < this.getMaxScrollTop();
-        };
-        ScrollController.prototype.canScrollLeft = function () {
-            return this.getScrollLeft() > 0;
-        };
-        ScrollController.prototype.canScrollRight = function () {
-            return this.getScrollLeft() < this.getMaxScrollLeft();
-        };
-        return ScrollController;
-    }());
-    var ElementScrollController = /** @class */ (function (_super) {
-        __extends(ElementScrollController, _super);
-        function ElementScrollController(el) {
-            var _this = _super.call(this) || this;
-            _this.el = el;
-            return _this;
-        }
-        ElementScrollController.prototype.getScrollTop = function () {
-            return this.el.scrollTop;
-        };
-        ElementScrollController.prototype.getScrollLeft = function () {
-            return this.el.scrollLeft;
-        };
-        ElementScrollController.prototype.setScrollTop = function (top) {
-            this.el.scrollTop = top;
-        };
-        ElementScrollController.prototype.setScrollLeft = function (left) {
-            this.el.scrollLeft = left;
-        };
-        ElementScrollController.prototype.getScrollWidth = function () {
-            return this.el.scrollWidth;
-        };
-        ElementScrollController.prototype.getScrollHeight = function () {
-            return this.el.scrollHeight;
-        };
-        ElementScrollController.prototype.getClientHeight = function () {
-            return this.el.clientHeight;
-        };
-        ElementScrollController.prototype.getClientWidth = function () {
-            return this.el.clientWidth;
-        };
-        return ElementScrollController;
-    }(ScrollController));
-    var WindowScrollController = /** @class */ (function (_super) {
-        __extends(WindowScrollController, _super);
-        function WindowScrollController() {
-            return _super !== null && _super.apply(this, arguments) || this;
-        }
-        WindowScrollController.prototype.getScrollTop = function () {
-            return window.pageYOffset;
-        };
-        WindowScrollController.prototype.getScrollLeft = function () {
-            return window.pageXOffset;
-        };
-        WindowScrollController.prototype.setScrollTop = function (n) {
-            window.scroll(window.pageXOffset, n);
-        };
-        WindowScrollController.prototype.setScrollLeft = function (n) {
-            window.scroll(n, window.pageYOffset);
-        };
-        WindowScrollController.prototype.getScrollWidth = function () {
-            return document.documentElement.scrollWidth;
-        };
-        WindowScrollController.prototype.getScrollHeight = function () {
-            return document.documentElement.scrollHeight;
-        };
-        WindowScrollController.prototype.getClientHeight = function () {
-            return document.documentElement.clientHeight;
-        };
-        WindowScrollController.prototype.getClientWidth = function () {
-            return document.documentElement.clientWidth;
-        };
-        return WindowScrollController;
-    }(ScrollController));
-
-    /*
-    Embodies a div that has potential scrollbars
-    */
-    var ScrollComponent = /** @class */ (function (_super) {
-        __extends(ScrollComponent, _super);
-        function ScrollComponent(overflowX, overflowY) {
-            var _this = _super.call(this, createElement('div', {
-                className: 'fc-scroller'
-            })) || this;
-            _this.overflowX = overflowX;
-            _this.overflowY = overflowY;
-            _this.applyOverflow();
-            return _this;
-        }
-        // sets to natural height, unlocks overflow
-        ScrollComponent.prototype.clear = function () {
-            this.setHeight('auto');
-            this.applyOverflow();
-        };
-        ScrollComponent.prototype.destroy = function () {
-            removeElement(this.el);
-        };
-        // Overflow
-        // -----------------------------------------------------------------------------------------------------------------
-        ScrollComponent.prototype.applyOverflow = function () {
-            applyStyle(this.el, {
-                overflowX: this.overflowX,
-                overflowY: this.overflowY
-            });
-        };
-        // Causes any 'auto' overflow values to resolves to 'scroll' or 'hidden'.
-        // Useful for preserving scrollbar widths regardless of future resizes.
-        // Can pass in scrollbarWidths for optimization.
-        ScrollComponent.prototype.lockOverflow = function (scrollbarWidths) {
-            var overflowX = this.overflowX;
-            var overflowY = this.overflowY;
-            scrollbarWidths = scrollbarWidths || this.getScrollbarWidths();
-            if (overflowX === 'auto') {
-                overflowX = (scrollbarWidths.bottom || // horizontal scrollbars?
-                    this.canScrollHorizontally() // OR scrolling pane with massless scrollbars?
-                ) ? 'scroll' : 'hidden';
-            }
-            if (overflowY === 'auto') {
-                overflowY = (scrollbarWidths.left || scrollbarWidths.right || // horizontal scrollbars?
-                    this.canScrollVertically() // OR scrolling pane with massless scrollbars?
-                ) ? 'scroll' : 'hidden';
-            }
-            applyStyle(this.el, { overflowX: overflowX, overflowY: overflowY });
-        };
-        ScrollComponent.prototype.setHeight = function (height) {
-            applyStyleProp(this.el, 'height', height);
-        };
-        ScrollComponent.prototype.getScrollbarWidths = function () {
-            var edges = computeEdges(this.el);
-            return {
-                left: edges.scrollbarLeft,
-                right: edges.scrollbarRight,
-                bottom: edges.scrollbarBottom
-            };
-        };
-        return ScrollComponent;
-    }(ElementScrollController));
-
-    var Theme = /** @class */ (function () {
-        function Theme(calendarOptions) {
-            this.calendarOptions = calendarOptions;
-            this.processIconOverride();
-        }
-        Theme.prototype.processIconOverride = function () {
-            if (this.iconOverrideOption) {
-                this.setIconOverride(this.calendarOptions[this.iconOverrideOption]);
-            }
-        };
-        Theme.prototype.setIconOverride = function (iconOverrideHash) {
-            var iconClassesCopy;
-            var buttonName;
-            if (typeof iconOverrideHash === 'object' && iconOverrideHash) { // non-null object
-                iconClassesCopy = __assign({}, this.iconClasses);
-                for (buttonName in iconOverrideHash) {
-                    iconClassesCopy[buttonName] = this.applyIconOverridePrefix(iconOverrideHash[buttonName]);
-                }
-                this.iconClasses = iconClassesCopy;
-            }
-            else if (iconOverrideHash === false) {
-                this.iconClasses = {};
-            }
-        };
-        Theme.prototype.applyIconOverridePrefix = function (className) {
-            var prefix = this.iconOverridePrefix;
-            if (prefix && className.indexOf(prefix) !== 0) { // if not already present
-                className = prefix + className;
-            }
-            return className;
-        };
-        Theme.prototype.getClass = function (key) {
-            return this.classes[key] || '';
-        };
-        Theme.prototype.getIconClass = function (buttonName) {
-            var className = this.iconClasses[buttonName];
-            if (className) {
-                return this.baseIconClass + ' ' + className;
-            }
-            return '';
-        };
-        Theme.prototype.getCustomButtonIconClass = function (customButtonProps) {
-            var className;
-            if (this.iconOverrideCustomButtonOption) {
-                className = customButtonProps[this.iconOverrideCustomButtonOption];
-                if (className) {
-                    return this.baseIconClass + ' ' + this.applyIconOverridePrefix(className);
-                }
-            }
-            return '';
-        };
-        return Theme;
-    }());
-    Theme.prototype.classes = {};
-    Theme.prototype.iconClasses = {};
-    Theme.prototype.baseIconClass = '';
-    Theme.prototype.iconOverridePrefix = '';
-
-    var guid = 0;
-    var Component = /** @class */ (function () {
-        function Component(context, isView) {
-            // HACK to populate view at top of component instantiation call chain
-            if (isView) {
-                context.view = this;
-            }
-            this.uid = String(guid++);
-            this.context = context;
-            this.dateEnv = context.dateEnv;
-            this.theme = context.theme;
-            this.view = context.view;
-            this.calendar = context.calendar;
-            this.isRtl = this.opt('dir') === 'rtl';
-        }
-        Component.addEqualityFuncs = function (newFuncs) {
-            this.prototype.equalityFuncs = __assign({}, this.prototype.equalityFuncs, newFuncs);
-        };
-        Component.prototype.opt = function (name) {
-            return this.context.options[name];
-        };
-        Component.prototype.receiveProps = function (props) {
-            var _a = recycleProps(this.props || {}, props, this.equalityFuncs), anyChanges = _a.anyChanges, comboProps = _a.comboProps;
-            this.props = comboProps;
-            if (anyChanges) {
-                this.render(comboProps);
-            }
-        };
-        Component.prototype.render = function (props) {
-        };
-        // after destroy is called, this component won't ever be used again
-        Component.prototype.destroy = function () {
-        };
-        return Component;
-    }());
-    Component.prototype.equalityFuncs = {};
-    /*
-    Reuses old values when equal. If anything is unequal, returns newProps as-is.
-    Great for PureComponent, but won't be feasible with React, so just eliminate and use React's DOM diffing.
-    */
-    function recycleProps(oldProps, newProps, equalityFuncs) {
-        var comboProps = {}; // some old, some new
-        var anyChanges = false;
-        for (var key in newProps) {
-            if (key in oldProps && (oldProps[key] === newProps[key] ||
-                (equalityFuncs[key] && equalityFuncs[key](oldProps[key], newProps[key])))) {
-                // equal to old? use old prop
-                comboProps[key] = oldProps[key];
-            }
-            else {
-                comboProps[key] = newProps[key];
-                anyChanges = true;
-            }
-        }
-        for (var key in oldProps) {
-            if (!(key in newProps)) {
-                anyChanges = true;
-                break;
-            }
-        }
-        return { anyChanges: anyChanges, comboProps: comboProps };
-    }
-
-    /*
-    PURPOSES:
-    - hook up to fg, fill, and mirror renderers
-    - interface for dragging and hits
-    */
-    var DateComponent = /** @class */ (function (_super) {
-        __extends(DateComponent, _super);
-        function DateComponent(context, el, isView) {
-            var _this = _super.call(this, context, isView) || this;
-            _this.el = el;
-            return _this;
-        }
-        DateComponent.prototype.destroy = function () {
-            _super.prototype.destroy.call(this);
-            removeElement(this.el);
-        };
-        // TODO: WHAT ABOUT (sourceSeg && sourceSeg.component.doesDragMirror)
-        //
-        // Event Drag-n-Drop Rendering (for both events and external elements)
-        // ---------------------------------------------------------------------------------------------------------------
-        /*
-        renderEventDragSegs(state: EventSegUiInteractionState) {
-          if (state) {
-            let { isEvent, segs, sourceSeg } = state
-      
-            if (this.eventRenderer) {
-              this.eventRenderer.hideByHash(state.affectedInstances)
-            }
-      
-            // if the user is dragging something that is considered an event with real event data,
-            // and this component likes to do drag mirrors OR the component where the seg came from
-            // likes to do drag mirrors, then render a drag mirror.
-            if (isEvent && (this.doesDragMirror || sourceSeg && sourceSeg.component.doesDragMirror)) {
-              if (this.mirrorRenderer) {
-                this.mirrorRenderer.renderSegs(segs, { isDragging: true, sourceSeg })
-              }
-            }
-      
-            // if it would be impossible to render a drag mirror OR this component likes to render
-            // highlights, then render a highlight.
-            if (!isEvent || this.doesDragHighlight) {
-              if (this.fillRenderer) {
-                this.fillRenderer.renderSegs('highlight', segs)
-              }
-            }
-          }
-        }
-        */
-        // Hit System
-        // -----------------------------------------------------------------------------------------------------------------
-        DateComponent.prototype.buildPositionCaches = function () {
-        };
-        DateComponent.prototype.queryHit = function (positionLeft, positionTop, elWidth, elHeight) {
-            return null; // this should be abstract
-        };
-        // Validation
-        // -----------------------------------------------------------------------------------------------------------------
-        DateComponent.prototype.isInteractionValid = function (interaction) {
-            var calendar = this.calendar;
-            var dateProfile = this.props.dateProfile; // HACK
-            var instances = interaction.mutatedEvents.instances;
-            if (dateProfile) { // HACK for DayTile
-                for (var instanceId in instances) {
-                    if (!rangeContainsRange(dateProfile.validRange, instances[instanceId].range)) {
-                        return false;
-                    }
-                }
-            }
-            return isInteractionValid(interaction, calendar);
-        };
-        DateComponent.prototype.isDateSelectionValid = function (selection) {
-            var dateProfile = this.props.dateProfile; // HACK
-            if (dateProfile && // HACK for DayTile
-                !rangeContainsRange(dateProfile.validRange, selection.range)) {
-                return false;
-            }
-            return isDateSelectionValid(selection, this.calendar);
-        };
-        // Triggering
-        // -----------------------------------------------------------------------------------------------------------------
-        // TODO: move to Calendar
-        DateComponent.prototype.publiclyTrigger = function (name, args) {
-            var calendar = this.calendar;
-            return calendar.publiclyTrigger(name, args);
-        };
-        DateComponent.prototype.publiclyTriggerAfterSizing = function (name, args) {
-            var calendar = this.calendar;
-            return calendar.publiclyTriggerAfterSizing(name, args);
-        };
-        DateComponent.prototype.hasPublicHandlers = function (name) {
-            var calendar = this.calendar;
-            return calendar.hasPublicHandlers(name);
-        };
-        DateComponent.prototype.triggerRenderedSegs = function (segs, isMirrors) {
-            var calendar = this.calendar;
-            if (this.hasPublicHandlers('eventPositioned')) {
-                for (var _i = 0, segs_1 = segs; _i < segs_1.length; _i++) {
-                    var seg = segs_1[_i];
-                    this.publiclyTriggerAfterSizing('eventPositioned', [
-                        {
-                            event: new EventApi(calendar, seg.eventRange.def, seg.eventRange.instance),
-                            isMirror: isMirrors,
-                            isStart: seg.isStart,
-                            isEnd: seg.isEnd,
-                            el: seg.el,
-                            view: this // safe to cast because this method is only called on context.view
-                        }
-                    ]);
-                }
-            }
-            if (!calendar.state.loadingLevel) { // avoid initial empty state while pending
-                calendar.afterSizingTriggers._eventsPositioned = [null]; // fire once
-            }
-        };
-        DateComponent.prototype.triggerWillRemoveSegs = function (segs, isMirrors) {
-            var calendar = this.calendar;
-            for (var _i = 0, segs_2 = segs; _i < segs_2.length; _i++) {
-                var seg = segs_2[_i];
-                calendar.trigger('eventElRemove', seg.el);
-            }
-            if (this.hasPublicHandlers('eventDestroy')) {
-                for (var _a = 0, segs_3 = segs; _a < segs_3.length; _a++) {
-                    var seg = segs_3[_a];
-                    this.publiclyTrigger('eventDestroy', [
-                        {
-                            event: new EventApi(calendar, seg.eventRange.def, seg.eventRange.instance),
-                            isMirror: isMirrors,
-                            el: seg.el,
-                            view: this // safe to cast because this method is only called on context.view
-                        }
-                    ]);
-                }
-            }
-        };
-        // Pointer Interaction Utils
-        // -----------------------------------------------------------------------------------------------------------------
-        DateComponent.prototype.isValidSegDownEl = function (el) {
-            return !this.props.eventDrag && // HACK
-                !this.props.eventResize && // HACK
-                !elementClosest(el, '.fc-mirror') &&
-                (this.isPopover() || !this.isInPopover(el));
-            // ^above line ensures we don't detect a seg interaction within a nested component.
-            // it's a HACK because it only supports a popover as the nested component.
-        };
-        DateComponent.prototype.isValidDateDownEl = function (el) {
-            var segEl = elementClosest(el, this.fgSegSelector);
-            return (!segEl || segEl.classList.contains('fc-mirror')) &&
-                !elementClosest(el, '.fc-more') && // a "more.." link
-                !elementClosest(el, 'a[data-goto]') && // a clickable nav link
-                !this.isInPopover(el);
-        };
-        DateComponent.prototype.isPopover = function () {
-            return this.el.classList.contains('fc-popover');
-        };
-        DateComponent.prototype.isInPopover = function (el) {
-            return Boolean(elementClosest(el, '.fc-popover'));
-        };
-        return DateComponent;
-    }(Component));
-    DateComponent.prototype.fgSegSelector = '.fc-event-container > *';
-    DateComponent.prototype.bgSegSelector = '.fc-bgevent:not(.fc-nonbusiness)';
-
-    var uid$1 = 0;
-    function createPlugin(input) {
-        return {
-            id: String(uid$1++),
-            deps: input.deps || [],
-            reducers: input.reducers || [],
-            eventDefParsers: input.eventDefParsers || [],
-            isDraggableTransformers: input.isDraggableTransformers || [],
-            eventDragMutationMassagers: input.eventDragMutationMassagers || [],
-            eventDefMutationAppliers: input.eventDefMutationAppliers || [],
-            dateSelectionTransformers: input.dateSelectionTransformers || [],
-            datePointTransforms: input.datePointTransforms || [],
-            dateSpanTransforms: input.dateSpanTransforms || [],
-            views: input.views || {},
-            viewPropsTransformers: input.viewPropsTransformers || [],
-            isPropsValid: input.isPropsValid || null,
-            externalDefTransforms: input.externalDefTransforms || [],
-            eventResizeJoinTransforms: input.eventResizeJoinTransforms || [],
-            viewContainerModifiers: input.viewContainerModifiers || [],
-            eventDropTransformers: input.eventDropTransformers || [],
-            componentInteractions: input.componentInteractions || [],
-            calendarInteractions: input.calendarInteractions || [],
-            themeClasses: input.themeClasses || {},
-            eventSourceDefs: input.eventSourceDefs || [],
-            cmdFormatter: input.cmdFormatter,
-            recurringTypes: input.recurringTypes || [],
-            namedTimeZonedImpl: input.namedTimeZonedImpl,
-            defaultView: input.defaultView || '',
-            elementDraggingImpl: input.elementDraggingImpl,
-            optionChangeHandlers: input.optionChangeHandlers || {}
-        };
-    }
-    var PluginSystem = /** @class */ (function () {
-        function PluginSystem() {
-            this.hooks = {
-                reducers: [],
-                eventDefParsers: [],
-                isDraggableTransformers: [],
-                eventDragMutationMassagers: [],
-                eventDefMutationAppliers: [],
-                dateSelectionTransformers: [],
-                datePointTransforms: [],
-                dateSpanTransforms: [],
-                views: {},
-                viewPropsTransformers: [],
-                isPropsValid: null,
-                externalDefTransforms: [],
-                eventResizeJoinTransforms: [],
-                viewContainerModifiers: [],
-                eventDropTransformers: [],
-                componentInteractions: [],
-                calendarInteractions: [],
-                themeClasses: {},
-                eventSourceDefs: [],
-                cmdFormatter: null,
-                recurringTypes: [],
-                namedTimeZonedImpl: null,
-                defaultView: '',
-                elementDraggingImpl: null,
-                optionChangeHandlers: {}
-            };
-            this.addedHash = {};
-        }
-        PluginSystem.prototype.add = function (plugin) {
-            if (!this.addedHash[plugin.id]) {
-                this.addedHash[plugin.id] = true;
-                for (var _i = 0, _a = plugin.deps; _i < _a.length; _i++) {
-                    var dep = _a[_i];
-                    this.add(dep);
-                }
-                this.hooks = combineHooks(this.hooks, plugin);
-            }
-        };
-        return PluginSystem;
-    }());
-    function combineHooks(hooks0, hooks1) {
-        return {
-            reducers: hooks0.reducers.concat(hooks1.reducers),
-            eventDefParsers: hooks0.eventDefParsers.concat(hooks1.eventDefParsers),
-            isDraggableTransformers: hooks0.isDraggableTransformers.concat(hooks1.isDraggableTransformers),
-            eventDragMutationMassagers: hooks0.eventDragMutationMassagers.concat(hooks1.eventDragMutationMassagers),
-            eventDefMutationAppliers: hooks0.eventDefMutationAppliers.concat(hooks1.eventDefMutationAppliers),
-            dateSelectionTransformers: hooks0.dateSelectionTransformers.concat(hooks1.dateSelectionTransformers),
-            datePointTransforms: hooks0.datePointTransforms.concat(hooks1.datePointTransforms),
-            dateSpanTransforms: hooks0.dateSpanTransforms.concat(hooks1.dateSpanTransforms),
-            views: __assign({}, hooks0.views, hooks1.views),
-            viewPropsTransformers: hooks0.viewPropsTransformers.concat(hooks1.viewPropsTransformers),
-            isPropsValid: hooks1.isPropsValid || hooks0.isPropsValid,
-            externalDefTransforms: hooks0.externalDefTransforms.concat(hooks1.externalDefTransforms),
-            eventResizeJoinTransforms: hooks0.eventResizeJoinTransforms.concat(hooks1.eventResizeJoinTransforms),
-            viewContainerModifiers: hooks0.viewContainerModifiers.concat(hooks1.viewContainerModifiers),
-            eventDropTransformers: hooks0.eventDropTransformers.concat(hooks1.eventDropTransformers),
-            calendarInteractions: hooks0.calendarInteractions.concat(hooks1.calendarInteractions),
-            componentInteractions: hooks0.componentInteractions.concat(hooks1.componentInteractions),
-            themeClasses: __assign({}, hooks0.themeClasses, hooks1.themeClasses),
-            eventSourceDefs: hooks0.eventSourceDefs.concat(hooks1.eventSourceDefs),
-            cmdFormatter: hooks1.cmdFormatter || hooks0.cmdFormatter,
-            recurringTypes: hooks0.recurringTypes.concat(hooks1.recurringTypes),
-            namedTimeZonedImpl: hooks1.namedTimeZonedImpl || hooks0.namedTimeZonedImpl,
-            defaultView: hooks0.defaultView || hooks1.defaultView,
-            elementDraggingImpl: hooks0.elementDraggingImpl || hooks1.elementDraggingImpl,
-            optionChangeHandlers: __assign({}, hooks0.optionChangeHandlers, hooks1.optionChangeHandlers)
-        };
-    }
-
-    var eventSourceDef = {
-        ignoreRange: true,
-        parseMeta: function (raw) {
-            if (Array.isArray(raw)) { // short form
-                return raw;
-            }
-            else if (Array.isArray(raw.events)) {
-                return raw.events;
-            }
-            return null;
-        },
-        fetch: function (arg, success) {
-            success({
-                rawEvents: arg.eventSource.meta
-            });
-        }
-    };
-    var ArrayEventSourcePlugin = createPlugin({
-        eventSourceDefs: [eventSourceDef]
-    });
-
-    var eventSourceDef$1 = {
-        parseMeta: function (raw) {
-            if (typeof raw === 'function') { // short form
-                return raw;
-            }
-            else if (typeof raw.events === 'function') {
-                return raw.events;
-            }
-            return null;
-        },
-        fetch: function (arg, success, failure) {
-            var dateEnv = arg.calendar.dateEnv;
-            var func = arg.eventSource.meta;
-            unpromisify(func.bind(null, {
-                start: dateEnv.toDate(arg.range.start),
-                end: dateEnv.toDate(arg.range.end),
-                startStr: dateEnv.formatIso(arg.range.start),
-                endStr: dateEnv.formatIso(arg.range.end),
-                timeZone: dateEnv.timeZone
-            }), function (rawEvents) {
-                success({ rawEvents: rawEvents }); // needs an object response
-            }, failure // send errorObj directly to failure callback
-            );
-        }
-    };
-    var FuncEventSourcePlugin = createPlugin({
-        eventSourceDefs: [eventSourceDef$1]
-    });
-
-    function requestJson(method, url, params, successCallback, failureCallback) {
-        method = method.toUpperCase();
-        var body = null;
-        if (method === 'GET') {
-            url = injectQueryStringParams(url, params);
-        }
-        else {
-            body = encodeParams(params);
-        }
-        var xhr = new XMLHttpRequest();
-        xhr.open(method, url, true);
-        if (method !== 'GET') {
-            xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
-        }
-        xhr.onload = function () {
-            if (xhr.status >= 200 && xhr.status < 400) {
-                try {
-                    var res = JSON.parse(xhr.responseText);
-                    successCallback(res, xhr);
-                }
-                catch (err) {
-                    failureCallback('Failure parsing JSON', xhr);
-                }
-            }
-            else {
-                failureCallback('Request failed', xhr);
-            }
-        };
-        xhr.onerror = function () {
-            failureCallback('Request failed', xhr);
-        };
-        xhr.send(body);
-    }
-    function injectQueryStringParams(url, params) {
-        return url +
-            (url.indexOf('?') === -1 ? '?' : '&') +
-            encodeParams(params);
-    }
-    function encodeParams(params) {
-        var parts = [];
-        for (var key in params) {
-            parts.push(encodeURIComponent(key) + '=' + encodeURIComponent(params[key]));
-        }
-        return parts.join('&');
-    }
-
-    var eventSourceDef$2 = {
-        parseMeta: function (raw) {
-            if (typeof raw === 'string') { // short form
-                raw = { url: raw };
-            }
-            else if (!raw || typeof raw !== 'object' || !raw.url) {
-                return null;
-            }
-            return {
-                url: raw.url,
-                method: (raw.method || 'GET').toUpperCase(),
-                extraParams: raw.extraParams,
-                startParam: raw.startParam,
-                endParam: raw.endParam,
-                timeZoneParam: raw.timeZoneParam
-            };
-        },
-        fetch: function (arg, success, failure) {
-            var meta = arg.eventSource.meta;
-            var requestParams = buildRequestParams(meta, arg.range, arg.calendar);
-            requestJson(meta.method, meta.url, requestParams, function (rawEvents, xhr) {
-                success({ rawEvents: rawEvents, xhr: xhr });
-            }, function (errorMessage, xhr) {
-                failure({ message: errorMessage, xhr: xhr });
-            });
-        }
-    };
-    var JsonFeedEventSourcePlugin = createPlugin({
-        eventSourceDefs: [eventSourceDef$2]
-    });
-    function buildRequestParams(meta, range, calendar) {
-        var dateEnv = calendar.dateEnv;
-        var startParam;
-        var endParam;
-        var timeZoneParam;
-        var customRequestParams;
-        var params = {};
-        startParam = meta.startParam;
-        if (startParam == null) {
-            startParam = calendar.opt('startParam');
-        }
-        endParam = meta.endParam;
-        if (endParam == null) {
-            endParam = calendar.opt('endParam');
-        }
-        timeZoneParam = meta.timeZoneParam;
-        if (timeZoneParam == null) {
-            timeZoneParam = calendar.opt('timeZoneParam');
-        }
-        // retrieve any outbound GET/POST data from the options
-        if (typeof meta.extraParams === 'function') {
-            // supplied as a function that returns a key/value object
-            customRequestParams = meta.extraParams();
-        }
-        else {
-            // probably supplied as a straight key/value object
-            customRequestParams = meta.extraParams || {};
-        }
-        __assign(params, customRequestParams);
-        params[startParam] = dateEnv.formatIso(range.start);
-        params[endParam] = dateEnv.formatIso(range.end);
-        if (dateEnv.timeZone !== 'local') {
-            params[timeZoneParam] = dateEnv.timeZone;
-        }
-        return params;
-    }
-
-    var recurring = {
-        parse: function (rawEvent, leftoverProps, dateEnv) {
-            var createMarker = dateEnv.createMarker.bind(dateEnv);
-            var processors = {
-                daysOfWeek: null,
-                startTime: createDuration,
-                endTime: createDuration,
-                startRecur: createMarker,
-                endRecur: createMarker
-            };
-            var props = refineProps(rawEvent, processors, {}, leftoverProps);
-            var anyValid = false;
-            for (var propName in props) {
-                if (props[propName] != null) {
-                    anyValid = true;
-                    break;
-                }
-            }
-            if (anyValid) {
-                var duration = null;
-                if ('duration' in leftoverProps) {
-                    duration = createDuration(leftoverProps.duration);
-                    delete leftoverProps.duration;
-                }
-                if (!duration && props.startTime && props.endTime) {
-                    duration = subtractDurations(props.endTime, props.startTime);
-                }
-                return {
-                    allDayGuess: Boolean(!props.startTime && !props.endTime),
-                    duration: duration,
-                    typeData: props // doesn't need endTime anymore but oh well
-                };
-            }
-            return null;
-        },
-        expand: function (typeData, framingRange, dateEnv) {
-            var clippedFramingRange = intersectRanges(framingRange, { start: typeData.startRecur, end: typeData.endRecur });
-            if (clippedFramingRange) {
-                return expandRanges(typeData.daysOfWeek, typeData.startTime, clippedFramingRange, dateEnv);
-            }
-            else {
-                return [];
-            }
-        }
-    };
-    var SimpleRecurrencePlugin = createPlugin({
-        recurringTypes: [recurring]
-    });
-    function expandRanges(daysOfWeek, startTime, framingRange, dateEnv) {
-        var dowHash = daysOfWeek ? arrayToHash(daysOfWeek) : null;
-        var dayMarker = startOfDay(framingRange.start);
-        var endMarker = framingRange.end;
-        var instanceStarts = [];
-        while (dayMarker < endMarker) {
-            var instanceStart 
-            // if everyday, or this particular day-of-week
-            = void 0;
-            // if everyday, or this particular day-of-week
-            if (!dowHash || dowHash[dayMarker.getUTCDay()]) {
-                if (startTime) {
-                    instanceStart = dateEnv.add(dayMarker, startTime);
-                }
-                else {
-                    instanceStart = dayMarker;
-                }
-                instanceStarts.push(instanceStart);
-            }
-            dayMarker = addDays(dayMarker, 1);
-        }
-        return instanceStarts;
-    }
-
-    var DefaultOptionChangeHandlers = createPlugin({
-        optionChangeHandlers: {
-            events: function (events, calendar, deepEqual) {
-                handleEventSources([events], calendar, deepEqual);
-            },
-            eventSources: handleEventSources,
-            plugins: handlePlugins
-        }
-    });
-    function handleEventSources(inputs, calendar, deepEqual) {
-        var unfoundSources = hashValuesToArray(calendar.state.eventSources);
-        var newInputs = [];
-        for (var _i = 0, inputs_1 = inputs; _i < inputs_1.length; _i++) {
-            var input = inputs_1[_i];
-            var inputFound = false;
-            for (var i = 0; i < unfoundSources.length; i++) {
-                if (deepEqual(unfoundSources[i]._raw, input)) {
-                    unfoundSources.splice(i, 1); // delete
-                    inputFound = true;
-                    break;
-                }
-            }
-            if (!inputFound) {
-                newInputs.push(input);
-            }
-        }
-        for (var _a = 0, unfoundSources_1 = unfoundSources; _a < unfoundSources_1.length; _a++) {
-            var unfoundSource = unfoundSources_1[_a];
-            calendar.dispatch({
-                type: 'REMOVE_EVENT_SOURCE',
-                sourceId: unfoundSource.sourceId
-            });
-        }
-        for (var _b = 0, newInputs_1 = newInputs; _b < newInputs_1.length; _b++) {
-            var newInput = newInputs_1[_b];
-            calendar.addEventSource(newInput);
-        }
-    }
-    // shortcoming: won't remove plugins
-    function handlePlugins(inputs, calendar) {
-        calendar.addPluginInputs(inputs); // will gracefully handle duplicates
-    }
-
-    var config = {}; // TODO: make these options
-    var globalDefaults = {
-        defaultRangeSeparator: ' - ',
-        titleRangeSeparator: ' \u2013 ',
-        defaultTimedEventDuration: '01:00:00',
-        defaultAllDayEventDuration: { day: 1 },
-        forceEventDuration: false,
-        nextDayThreshold: '00:00:00',
-        // display
-        columnHeader: true,
-        defaultView: '',
-        aspectRatio: 1.35,
-        header: {
-            left: 'title',
-            center: '',
-            right: 'today prev,next'
-        },
-        weekends: true,
-        weekNumbers: false,
-        weekNumberCalculation: 'local',
-        editable: false,
-        // nowIndicator: false,
-        scrollTime: '06:00:00',
-        minTime: '00:00:00',
-        maxTime: '24:00:00',
-        showNonCurrentDates: true,
-        // event ajax
-        lazyFetching: true,
-        startParam: 'start',
-        endParam: 'end',
-        timeZoneParam: 'timeZone',
-        timeZone: 'local',
-        // allDayDefault: undefined,
-        // locale
-        locales: [],
-        locale: '',
-        // dir: will get this from the default locale
-        // buttonIcons: null,
-        // allows setting a min-height to the event segment to prevent short events overlapping each other
-        timeGridEventMinHeight: 0,
-        themeSystem: 'standard',
-        // eventResizableFromStart: false,
-        dragRevertDuration: 500,
-        dragScroll: true,
-        allDayMaintainDuration: false,
-        // selectable: false,
-        unselectAuto: true,
-        // selectMinDistance: 0,
-        dropAccept: '*',
-        eventOrder: 'start,-duration,allDay,title',
-        // ^ if start tie, longer events go before shorter. final tie-breaker is title text
-        // rerenderDelay: null,
-        eventLimit: false,
-        eventLimitClick: 'popover',
-        dayPopoverFormat: { month: 'long', day: 'numeric', year: 'numeric' },
-        handleWindowResize: true,
-        windowResizeDelay: 100,
-        longPressDelay: 1000,
-        eventDragMinDistance: 5 // only applies to mouse
-    };
-    var rtlDefaults = {
-        header: {
-            left: 'next,prev today',
-            center: '',
-            right: 'title'
-        },
-        buttonIcons: {
-            // TODO: make RTL support the responibility of the theme
-            prev: 'fc-icon-chevron-right',
-            next: 'fc-icon-chevron-left',
-            prevYear: 'fc-icon-chevrons-right',
-            nextYear: 'fc-icon-chevrons-left'
-        }
-    };
-    var complexOptions = [
-        'header',
-        'footer',
-        'buttonText',
-        'buttonIcons'
-    ];
-    // Merges an array of option objects into a single object
-    function mergeOptions(optionObjs) {
-        return mergeProps(optionObjs, complexOptions);
-    }
-    // TODO: move this stuff to a "plugin"-related file...
-    var INTERNAL_PLUGINS = [
-        ArrayEventSourcePlugin,
-        FuncEventSourcePlugin,
-        JsonFeedEventSourcePlugin,
-        SimpleRecurrencePlugin,
-        DefaultOptionChangeHandlers
-    ];
-    function refinePluginDefs(pluginInputs) {
-        var plugins = [];
-        for (var _i = 0, pluginInputs_1 = pluginInputs; _i < pluginInputs_1.length; _i++) {
-            var pluginInput = pluginInputs_1[_i];
-            if (typeof pluginInput === 'string') {
-                var globalName = 'FullCalendar' + capitaliseFirstLetter(pluginInput);
-                if (!window[globalName]) {
-                    console.warn('Plugin file not loaded for ' + pluginInput);
-                }
-                else {
-                    plugins.push(window[globalName].default); // is an ES6 module
-                }
-            }
-            else {
-                plugins.push(pluginInput);
-            }
-        }
-        return INTERNAL_PLUGINS.concat(plugins);
-    }
-
-    var RAW_EN_LOCALE = {
-        code: 'en',
-        week: {
-            dow: 0,
-            doy: 4 // 4 days need to be within the year to be considered the first week
-        },
-        dir: 'ltr',
-        buttonText: {
-            prev: 'prev',
-            next: 'next',
-            prevYear: 'prev year',
-            nextYear: 'next year',
-            year: 'year',
-            today: 'today',
-            month: 'month',
-            week: 'week',
-            day: 'day',
-            list: 'list'
-        },
-        weekLabel: 'W',
-        allDayText: 'all-day',
-        eventLimitText: 'more',
-        noEventsMessage: 'No events to display'
-    };
-    function parseRawLocales(explicitRawLocales) {
-        var defaultCode = explicitRawLocales.length > 0 ? explicitRawLocales[0].code : 'en';
-        var globalArray = window['FullCalendarLocalesAll'] || []; // from locales-all.js
-        var globalObject = window['FullCalendarLocales'] || {}; // from locales/*.js. keys are meaningless
-        var allRawLocales = globalArray.concat(// globalArray is low prio
-        hashValuesToArray(globalObject), // medium prio
-        explicitRawLocales // highest prio
-        );
-        var rawLocaleMap = {
-            en: RAW_EN_LOCALE // necessary?
-        };
-        for (var _i = 0, allRawLocales_1 = allRawLocales; _i < allRawLocales_1.length; _i++) {
-            var rawLocale = allRawLocales_1[_i];
-            rawLocaleMap[rawLocale.code] = rawLocale;
-        }
-        return {
-            map: rawLocaleMap,
-            defaultCode: defaultCode
-        };
-    }
-    function buildLocale(inputSingular, available) {
-        if (typeof inputSingular === 'object' && !Array.isArray(inputSingular)) {
-            return parseLocale(inputSingular.code, [inputSingular.code], inputSingular);
-        }
-        else {
-            return queryLocale(inputSingular, available);
-        }
-    }
-    function queryLocale(codeArg, available) {
-        var codes = [].concat(codeArg || []); // will convert to array
-        var raw = queryRawLocale(codes, available) || RAW_EN_LOCALE;
-        return parseLocale(codeArg, codes, raw);
-    }
-    function queryRawLocale(codes, available) {
-        for (var i = 0; i < codes.length; i++) {
-            var parts = codes[i].toLocaleLowerCase().split('-');
-            for (var j = parts.length; j > 0; j--) {
-                var simpleId = parts.slice(0, j).join('-');
-                if (available[simpleId]) {
-                    return available[simpleId];
-                }
-            }
-        }
-        return null;
-    }
-    function parseLocale(codeArg, codes, raw) {
-        var merged = mergeProps([RAW_EN_LOCALE, raw], ['buttonText']);
-        delete merged.code; // don't want this part of the options
-        var week = merged.week;
-        delete merged.week;
-        return {
-            codeArg: codeArg,
-            codes: codes,
-            week: week,
-            simpleNumberFormat: new Intl.NumberFormat(codeArg),
-            options: merged
-        };
-    }
-
-    var OptionsManager = /** @class */ (function () {
-        function OptionsManager(overrides) {
-            this.overrides = __assign({}, overrides); // make a copy
-            this.dynamicOverrides = {};
-            this.compute();
-        }
-        OptionsManager.prototype.mutate = function (updates, removals, isDynamic) {
-            var overrideHash = isDynamic ? this.dynamicOverrides : this.overrides;
-            __assign(overrideHash, updates);
-            for (var _i = 0, removals_1 = removals; _i < removals_1.length; _i++) {
-                var propName = removals_1[_i];
-                delete overrideHash[propName];
-            }
-            this.compute();
-        };
-        // Computes the flattened options hash for the calendar and assigns to `this.options`.
-        // Assumes this.overrides and this.dynamicOverrides have already been initialized.
-        OptionsManager.prototype.compute = function () {
-            // TODO: not a very efficient system
-            var locales = firstDefined(// explicit locale option given?
-            this.dynamicOverrides.locales, this.overrides.locales, globalDefaults.locales);
-            var locale = firstDefined(// explicit locales option given?
-            this.dynamicOverrides.locale, this.overrides.locale, globalDefaults.locale);
-            var available = parseRawLocales(locales);
-            var localeDefaults = buildLocale(locale || available.defaultCode, available.map).options;
-            var dir = firstDefined(// based on options computed so far, is direction RTL?
-            this.dynamicOverrides.dir, this.overrides.dir, localeDefaults.dir);
-            var dirDefaults = dir === 'rtl' ? rtlDefaults : {};
-            this.dirDefaults = dirDefaults;
-            this.localeDefaults = localeDefaults;
-            this.computed = mergeOptions([
-                globalDefaults,
-                dirDefaults,
-                localeDefaults,
-                this.overrides,
-                this.dynamicOverrides
-            ]);
-        };
-        return OptionsManager;
-    }());
-
-    var calendarSystemClassMap = {};
-    function registerCalendarSystem(name, theClass) {
-        calendarSystemClassMap[name] = theClass;
-    }
-    function createCalendarSystem(name) {
-        return new calendarSystemClassMap[name]();
-    }
-    var GregorianCalendarSystem = /** @class */ (function () {
-        function GregorianCalendarSystem() {
-        }
-        GregorianCalendarSystem.prototype.getMarkerYear = function (d) {
-            return d.getUTCFullYear();
-        };
-        GregorianCalendarSystem.prototype.getMarkerMonth = function (d) {
-            return d.getUTCMonth();
-        };
-        GregorianCalendarSystem.prototype.getMarkerDay = function (d) {
-            return d.getUTCDate();
-        };
-        GregorianCalendarSystem.prototype.arrayToMarker = function (arr) {
-            return arrayToUtcDate(arr);
-        };
-        GregorianCalendarSystem.prototype.markerToArray = function (marker) {
-            return dateToUtcArray(marker);
-        };
-        return GregorianCalendarSystem;
-    }());
-    registerCalendarSystem('gregory', GregorianCalendarSystem);
-
-    var ISO_RE = /^\s*(\d{4})(-(\d{2})(-(\d{2})([T ](\d{2}):(\d{2})(:(\d{2})(\.(\d+))?)?(Z|(([-+])(\d{2})(:?(\d{2}))?))?)?)?)?$/;
-    function parse(str) {
-        var m = ISO_RE.exec(str);
-        if (m) {
-            var marker = new Date(Date.UTC(Number(m[1]), m[3] ? Number(m[3]) - 1 : 0, Number(m[5] || 1), Number(m[7] || 0), Number(m[8] || 0), Number(m[10] || 0), m[12] ? Number('0.' + m[12]) * 1000 : 0));
-            if (isValidDate(marker)) {
-                var timeZoneOffset = null;
-                if (m[13]) {
-                    timeZoneOffset = (m[15] === '-' ? -1 : 1) * (Number(m[16] || 0) * 60 +
-                        Number(m[18] || 0));
-                }
-                return {
-                    marker: marker,
-                    isTimeUnspecified: !m[6],
-                    timeZoneOffset: timeZoneOffset
-                };
-            }
-        }
-        return null;
-    }
-
-    var DateEnv = /** @class */ (function () {
-        function DateEnv(settings) {
-            var timeZone = this.timeZone = settings.timeZone;
-            var isNamedTimeZone = timeZone !== 'local' && timeZone !== 'UTC';
-            if (settings.namedTimeZoneImpl && isNamedTimeZone) {
-                this.namedTimeZoneImpl = new settings.namedTimeZoneImpl(timeZone);
-            }
-            this.canComputeOffset = Boolean(!isNamedTimeZone || this.namedTimeZoneImpl);
-            this.calendarSystem = createCalendarSystem(settings.calendarSystem);
-            this.locale = settings.locale;
-            this.weekDow = settings.locale.week.dow;
-            this.weekDoy = settings.locale.week.doy;
-            if (settings.weekNumberCalculation === 'ISO') {
-                this.weekDow = 1;
-                this.weekDoy = 4;
-            }
-            if (typeof settings.firstDay === 'number') {
-                this.weekDow = settings.firstDay;
-            }
-            if (typeof settings.weekNumberCalculation === 'function') {
-                this.weekNumberFunc = settings.weekNumberCalculation;
-            }
-            this.weekLabel = settings.weekLabel != null ? settings.weekLabel : settings.locale.options.weekLabel;
-            this.cmdFormatter = settings.cmdFormatter;
-        }
-        // Creating / Parsing
-        DateEnv.prototype.createMarker = function (input) {
-            var meta = this.createMarkerMeta(input);
-            if (meta === null) {
-                return null;
-            }
-            return meta.marker;
-        };
-        DateEnv.prototype.createNowMarker = function () {
-            if (this.canComputeOffset) {
-                return this.timestampToMarker(new Date().valueOf());
-            }
-            else {
-                // if we can't compute the current date val for a timezone,
-                // better to give the current local date vals than UTC
-                return arrayToUtcDate(dateToLocalArray(new Date()));
-            }
-        };
-        DateEnv.prototype.createMarkerMeta = function (input) {
-            if (typeof input === 'string') {
-                return this.parse(input);
-            }
-            var marker = null;
-            if (typeof input === 'number') {
-                marker = this.timestampToMarker(input);
-            }
-            else if (input instanceof Date) {
-                input = input.valueOf();
-                if (!isNaN(input)) {
-                    marker = this.timestampToMarker(input);
-                }
-            }
-            else if (Array.isArray(input)) {
-                marker = arrayToUtcDate(input);
-            }
-            if (marker === null || !isValidDate(marker)) {
-                return null;
-            }
-            return { marker: marker, isTimeUnspecified: false, forcedTzo: null };
-        };
-        DateEnv.prototype.parse = function (s) {
-            var parts = parse(s);
-            if (parts === null) {
-                return null;
-            }
-            var marker = parts.marker;
-            var forcedTzo = null;
-            if (parts.timeZoneOffset !== null) {
-                if (this.canComputeOffset) {
-                    marker = this.timestampToMarker(marker.valueOf() - parts.timeZoneOffset * 60 * 1000);
-                }
-                else {
-                    forcedTzo = parts.timeZoneOffset;
-                }
-            }
-            return { marker: marker, isTimeUnspecified: parts.isTimeUnspecified, forcedTzo: forcedTzo };
-        };
-        // Accessors
-        DateEnv.prototype.getYear = function (marker) {
-            return this.calendarSystem.getMarkerYear(marker);
-        };
-        DateEnv.prototype.getMonth = function (marker) {
-            return this.calendarSystem.getMarkerMonth(marker);
-        };
-        // Adding / Subtracting
-        DateEnv.prototype.add = function (marker, dur) {
-            var a = this.calendarSystem.markerToArray(marker);
-            a[0] += dur.years;
-            a[1] += dur.months;
-            a[2] += dur.days;
-            a[6] += dur.milliseconds;
-            return this.calendarSystem.arrayToMarker(a);
-        };
-        DateEnv.prototype.subtract = function (marker, dur) {
-            var a = this.calendarSystem.markerToArray(marker);
-            a[0] -= dur.years;
-            a[1] -= dur.months;
-            a[2] -= dur.days;
-            a[6] -= dur.milliseconds;
-            return this.calendarSystem.arrayToMarker(a);
-        };
-        DateEnv.prototype.addYears = function (marker, n) {
-            var a = this.calendarSystem.markerToArray(marker);
-            a[0] += n;
-            return this.calendarSystem.arrayToMarker(a);
-        };
-        DateEnv.prototype.addMonths = function (marker, n) {
-            var a = this.calendarSystem.markerToArray(marker);
-            a[1] += n;
-            return this.calendarSystem.arrayToMarker(a);
-        };
-        // Diffing Whole Units
-        DateEnv.prototype.diffWholeYears = function (m0, m1) {
-            var calendarSystem = this.calendarSystem;
-            if (timeAsMs(m0) === timeAsMs(m1) &&
-                calendarSystem.getMarkerDay(m0) === calendarSystem.getMarkerDay(m1) &&
-                calendarSystem.getMarkerMonth(m0) === calendarSystem.getMarkerMonth(m1)) {
-                return calendarSystem.getMarkerYear(m1) - calendarSystem.getMarkerYear(m0);
-            }
-            return null;
-        };
-        DateEnv.prototype.diffWholeMonths = function (m0, m1) {
-            var calendarSystem = this.calendarSystem;
-            if (timeAsMs(m0) === timeAsMs(m1) &&
-                calendarSystem.getMarkerDay(m0) === calendarSystem.getMarkerDay(m1)) {
-                return (calendarSystem.getMarkerMonth(m1) - calendarSystem.getMarkerMonth(m0)) +
-                    (calendarSystem.getMarkerYear(m1) - calendarSystem.getMarkerYear(m0)) * 12;
-            }
-            return null;
-        };
-        // Range / Duration
-        DateEnv.prototype.greatestWholeUnit = function (m0, m1) {
-            var n = this.diffWholeYears(m0, m1);
-            if (n !== null) {
-                return { unit: 'year', value: n };
-            }
-            n = this.diffWholeMonths(m0, m1);
-            if (n !== null) {
-                return { unit: 'month', value: n };
-            }
-            n = diffWholeWeeks(m0, m1);
-            if (n !== null) {
-                return { unit: 'week', value: n };
-            }
-            n = diffWholeDays(m0, m1);
-            if (n !== null) {
-                return { unit: 'day', value: n };
-            }
-            n = diffHours(m0, m1);
-            if (isInt(n)) {
-                return { unit: 'hour', value: n };
-            }
-            n = diffMinutes(m0, m1);
-            if (isInt(n)) {
-                return { unit: 'minute', value: n };
-            }
-            n = diffSeconds(m0, m1);
-            if (isInt(n)) {
-                return { unit: 'second', value: n };
-            }
-            return { unit: 'millisecond', value: m1.valueOf() - m0.valueOf() };
-        };
-        DateEnv.prototype.countDurationsBetween = function (m0, m1, d) {
-            // TODO: can use greatestWholeUnit
-            var diff;
-            if (d.years) {
-                diff = this.diffWholeYears(m0, m1);
-                if (diff !== null) {
-                    return diff / asRoughYears(d);
-                }
-            }
-            if (d.months) {
-                diff = this.diffWholeMonths(m0, m1);
-                if (diff !== null) {
-                    return diff / asRoughMonths(d);
-                }
-            }
-            if (d.days) {
-                diff = diffWholeDays(m0, m1);
-                if (diff !== null) {
-                    return diff / asRoughDays(d);
-                }
-            }
-            return (m1.valueOf() - m0.valueOf()) / asRoughMs(d);
-        };
-        // Start-Of
-        DateEnv.prototype.startOf = function (m, unit) {
-            if (unit === 'year') {
-                return this.startOfYear(m);
-            }
-            else if (unit === 'month') {
-                return this.startOfMonth(m);
-            }
-            else if (unit === 'week') {
-                return this.startOfWeek(m);
-            }
-            else if (unit === 'day') {
-                return startOfDay(m);
-            }
-            else if (unit === 'hour') {
-                return startOfHour(m);
-            }
-            else if (unit === 'minute') {
-                return startOfMinute(m);
-            }
-            else if (unit === 'second') {
-                return startOfSecond(m);
-            }
-        };
-        DateEnv.prototype.startOfYear = function (m) {
-            return this.calendarSystem.arrayToMarker([
-                this.calendarSystem.getMarkerYear(m)
-            ]);
-        };
-        DateEnv.prototype.startOfMonth = function (m) {
-            return this.calendarSystem.arrayToMarker([
-                this.calendarSystem.getMarkerYear(m),
-                this.calendarSystem.getMarkerMonth(m)
-            ]);
-        };
-        DateEnv.prototype.startOfWeek = function (m) {
-            return this.calendarSystem.arrayToMarker([
-                this.calendarSystem.getMarkerYear(m),
-                this.calendarSystem.getMarkerMonth(m),
-                m.getUTCDate() - ((m.getUTCDay() - this.weekDow + 7) % 7)
-            ]);
-        };
-        // Week Number
-        DateEnv.prototype.computeWeekNumber = function (marker) {
-            if (this.weekNumberFunc) {
-                return this.weekNumberFunc(this.toDate(marker));
-            }
-            else {
-                return weekOfYear(marker, this.weekDow, this.weekDoy);
-            }
-        };
-        // TODO: choke on timeZoneName: long
-        DateEnv.prototype.format = function (marker, formatter, dateOptions) {
-            if (dateOptions === void 0) { dateOptions = {}; }
-            return formatter.format({
-                marker: marker,
-                timeZoneOffset: dateOptions.forcedTzo != null ?
-                    dateOptions.forcedTzo :
-                    this.offsetForMarker(marker)
-            }, this);
-        };
-        DateEnv.prototype.formatRange = function (start, end, formatter, dateOptions) {
-            if (dateOptions === void 0) { dateOptions = {}; }
-            if (dateOptions.isEndExclusive) {
-                end = addMs(end, -1);
-            }
-            return formatter.formatRange({
-                marker: start,
-                timeZoneOffset: dateOptions.forcedStartTzo != null ?
-                    dateOptions.forcedStartTzo :
-                    this.offsetForMarker(start)
-            }, {
-                marker: end,
-                timeZoneOffset: dateOptions.forcedEndTzo != null ?
-                    dateOptions.forcedEndTzo :
-                    this.offsetForMarker(end)
-            }, this);
-        };
-        DateEnv.prototype.formatIso = function (marker, extraOptions) {
-            if (extraOptions === void 0) { extraOptions = {}; }
-            var timeZoneOffset = null;
-            if (!extraOptions.omitTimeZoneOffset) {
-                if (extraOptions.forcedTzo != null) {
-                    timeZoneOffset = extraOptions.forcedTzo;
-                }
-                else {
-                    timeZoneOffset = this.offsetForMarker(marker);
-                }
-            }
-            return buildIsoString(marker, timeZoneOffset, extraOptions.omitTime);
-        };
-        // TimeZone
-        DateEnv.prototype.timestampToMarker = function (ms) {
-            if (this.timeZone === 'local') {
-                return arrayToUtcDate(dateToLocalArray(new Date(ms)));
-            }
-            else if (this.timeZone === 'UTC' || !this.namedTimeZoneImpl) {
-                return new Date(ms);
-            }
-            else {
-                return arrayToUtcDate(this.namedTimeZoneImpl.timestampToArray(ms));
-            }
-        };
-        DateEnv.prototype.offsetForMarker = function (m) {
-            if (this.timeZone === 'local') {
-                return -arrayToLocalDate(dateToUtcArray(m)).getTimezoneOffset(); // convert "inverse" offset to "normal" offset
-            }
-            else if (this.timeZone === 'UTC') {
-                return 0;
-            }
-            else if (this.namedTimeZoneImpl) {
-                return this.namedTimeZoneImpl.offsetForArray(dateToUtcArray(m));
-            }
-            return null;
-        };
-        // Conversion
-        DateEnv.prototype.toDate = function (m, forcedTzo) {
-            if (this.timeZone === 'local') {
-                return arrayToLocalDate(dateToUtcArray(m));
-            }
-            else if (this.timeZone === 'UTC') {
-                return new Date(m.valueOf()); // make sure it's a copy
-            }
-            else if (!this.namedTimeZoneImpl) {
-                return new Date(m.valueOf() - (forcedTzo || 0));
-            }
-            else {
-                return new Date(m.valueOf() -
-                    this.namedTimeZoneImpl.offsetForArray(dateToUtcArray(m)) * 1000 * 60 // convert minutes -> ms
-                );
-            }
-        };
-        return DateEnv;
-    }());
-
-    var SIMPLE_SOURCE_PROPS = {
-        id: String,
-        allDayDefault: Boolean,
-        eventDataTransform: Function,
-        success: Function,
-        failure: Function
-    };
-    var uid$2 = 0;
-    function doesSourceNeedRange(eventSource, calendar) {
-        var defs = calendar.pluginSystem.hooks.eventSourceDefs;
-        return !defs[eventSource.sourceDefId].ignoreRange;
-    }
-    function parseEventSource(raw, calendar) {
-        var defs = calendar.pluginSystem.hooks.eventSourceDefs;
-        for (var i = defs.length - 1; i >= 0; i--) { // later-added plugins take precedence
-            var def = defs[i];
-            var meta = def.parseMeta(raw);
-            if (meta) {
-                var res = parseEventSourceProps(typeof raw === 'object' ? raw : {}, meta, i, calendar);
-                res._raw = raw;
-                return res;
-            }
-        }
-        return null;
-    }
-    function parseEventSourceProps(raw, meta, sourceDefId, calendar) {
-        var leftovers0 = {};
-        var props = refineProps(raw, SIMPLE_SOURCE_PROPS, {}, leftovers0);
-        var leftovers1 = {};
-        var ui = processUnscopedUiProps(leftovers0, calendar, leftovers1);
-        props.isFetching = false;
-        props.latestFetchId = '';
-        props.fetchRange = null;
-        props.publicId = String(raw.id || '');
-        props.sourceId = String(uid$2++);
-        props.sourceDefId = sourceDefId;
-        props.meta = meta;
-        props.ui = ui;
-        props.extendedProps = leftovers1;
-        return props;
-    }
-
-    function reduceEventSources (eventSources, action, dateProfile, calendar) {
-        switch (action.type) {
-            case 'ADD_EVENT_SOURCES': // already parsed
-                return addSources(eventSources, action.sources, dateProfile ? dateProfile.activeRange : null, calendar);
-            case 'REMOVE_EVENT_SOURCE':
-                return removeSource(eventSources, action.sourceId);
-            case 'PREV': // TODO: how do we track all actions that affect dateProfile :(
-            case 'NEXT':
-            case 'SET_DATE':
-            case 'SET_VIEW_TYPE':
-                if (dateProfile) {
-                    return fetchDirtySources(eventSources, dateProfile.activeRange, calendar);
-                }
-                else {
-                    return eventSources;
-                }
-            case 'FETCH_EVENT_SOURCES':
-            case 'CHANGE_TIMEZONE':
-                return fetchSourcesByIds(eventSources, action.sourceIds ?
-                    arrayToHash(action.sourceIds) :
-                    excludeStaticSources(eventSources, calendar), dateProfile ? dateProfile.activeRange : null, calendar);
-            case 'RECEIVE_EVENTS':
-            case 'RECEIVE_EVENT_ERROR':
-                return receiveResponse(eventSources, action.sourceId, action.fetchId, action.fetchRange);
-            case 'REMOVE_ALL_EVENT_SOURCES':
-                return {};
-            default:
-                return eventSources;
-        }
-    }
-    var uid$3 = 0;
-    function addSources(eventSourceHash, sources, fetchRange, calendar) {
-        var hash = {};
-        for (var _i = 0, sources_1 = sources; _i < sources_1.length; _i++) {
-            var source = sources_1[_i];
-            hash[source.sourceId] = source;
-        }
-        if (fetchRange) {
-            hash = fetchDirtySources(hash, fetchRange, calendar);
-        }
-        return __assign({}, eventSourceHash, hash);
-    }
-    function removeSource(eventSourceHash, sourceId) {
-        return filterHash(eventSourceHash, function (eventSource) {
-            return eventSource.sourceId !== sourceId;
-        });
-    }
-    function fetchDirtySources(sourceHash, fetchRange, calendar) {
-        return fetchSourcesByIds(sourceHash, filterHash(sourceHash, function (eventSource) {
-            return isSourceDirty(eventSource, fetchRange, calendar);
-        }), fetchRange, calendar);
-    }
-    function isSourceDirty(eventSource, fetchRange, calendar) {
-        if (!doesSourceNeedRange(eventSource, calendar)) {
-            return !eventSource.latestFetchId;
-        }
-        else {
-            return !calendar.opt('lazyFetching') ||
-                !eventSource.fetchRange ||
-                fetchRange.start < eventSource.fetchRange.start ||
-                fetchRange.end > eventSource.fetchRange.end;
-        }
-    }
-    function fetchSourcesByIds(prevSources, sourceIdHash, fetchRange, calendar) {
-        var nextSources = {};
-        for (var sourceId in prevSources) {
-            var source = prevSources[sourceId];
-            if (sourceIdHash[sourceId]) {
-                nextSources[sourceId] = fetchSource(source, fetchRange, calendar);
-            }
-            else {
-                nextSources[sourceId] = source;
-            }
-        }
-        return nextSources;
-    }
-    function fetchSource(eventSource, fetchRange, calendar) {
-        var sourceDef = calendar.pluginSystem.hooks.eventSourceDefs[eventSource.sourceDefId];
-        var fetchId = String(uid$3++);
-        sourceDef.fetch({
-            eventSource: eventSource,
-            calendar: calendar,
-            range: fetchRange
-        }, function (res) {
-            var rawEvents = res.rawEvents;
-            var calSuccess = calendar.opt('eventSourceSuccess');
-            var calSuccessRes;
-            var sourceSuccessRes;
-            if (eventSource.success) {
-                sourceSuccessRes = eventSource.success(rawEvents, res.xhr);
-            }
-            if (calSuccess) {
-                calSuccessRes = calSuccess(rawEvents, res.xhr);
-            }
-            rawEvents = sourceSuccessRes || calSuccessRes || rawEvents;
-            calendar.dispatch({
-                type: 'RECEIVE_EVENTS',
-                sourceId: eventSource.sourceId,
-                fetchId: fetchId,
-                fetchRange: fetchRange,
-                rawEvents: rawEvents
-            });
-        }, function (error) {
-            var callFailure = calendar.opt('eventSourceFailure');
-            console.warn(error.message, error);
-            if (eventSource.failure) {
-                eventSource.failure(error);
-            }
-            if (callFailure) {
-                callFailure(error);
-            }
-            calendar.dispatch({
-                type: 'RECEIVE_EVENT_ERROR',
-                sourceId: eventSource.sourceId,
-                fetchId: fetchId,
-                fetchRange: fetchRange,
-                error: error
-            });
-        });
-        return __assign({}, eventSource, { isFetching: true, latestFetchId: fetchId });
-    }
-    function receiveResponse(sourceHash, sourceId, fetchId, fetchRange) {
-        var _a;
-        var eventSource = sourceHash[sourceId];
-        if (eventSource && // not already removed
-            fetchId === eventSource.latestFetchId) {
-            return __assign({}, sourceHash, (_a = {}, _a[sourceId] = __assign({}, eventSource, { isFetching: false, fetchRange: fetchRange }), _a));
-        }
-        return sourceHash;
-    }
-    function excludeStaticSources(eventSources, calendar) {
-        return filterHash(eventSources, function (eventSource) {
-            return doesSourceNeedRange(eventSource, calendar);
-        });
-    }
-
-    var DateProfileGenerator = /** @class */ (function () {
-        function DateProfileGenerator(viewSpec, calendar) {
-            this.viewSpec = viewSpec;
-            this.options = viewSpec.options;
-            this.dateEnv = calendar.dateEnv;
-            this.calendar = calendar;
-            this.initHiddenDays();
-        }
-        /* Date Range Computation
-        ------------------------------------------------------------------------------------------------------------------*/
-        // Builds a structure with info about what the dates/ranges will be for the "prev" view.
-        DateProfileGenerator.prototype.buildPrev = function (currentDateProfile, currentDate) {
-            var dateEnv = this.dateEnv;
-            var prevDate = dateEnv.subtract(dateEnv.startOf(currentDate, currentDateProfile.currentRangeUnit), // important for start-of-month
-            currentDateProfile.dateIncrement);
-            return this.build(prevDate, -1);
-        };
-        // Builds a structure with info about what the dates/ranges will be for the "next" view.
-        DateProfileGenerator.prototype.buildNext = function (currentDateProfile, currentDate) {
-            var dateEnv = this.dateEnv;
-            var nextDate = dateEnv.add(dateEnv.startOf(currentDate, currentDateProfile.currentRangeUnit), // important for start-of-month
-            currentDateProfile.dateIncrement);
-            return this.build(nextDate, 1);
-        };
-        // Builds a structure holding dates/ranges for rendering around the given date.
-        // Optional direction param indicates whether the date is being incremented/decremented
-        // from its previous value. decremented = -1, incremented = 1 (default).
-        DateProfileGenerator.prototype.build = function (currentDate, direction, forceToValid) {
-            if (forceToValid === void 0) { forceToValid = false; }
-            var validRange;
-            var minTime = null;
-            var maxTime = null;
-            var currentInfo;
-            var isRangeAllDay;
-            var renderRange;
-            var activeRange;
-            var isValid;
-            validRange = this.buildValidRange();
-            validRange = this.trimHiddenDays(validRange);
-            if (forceToValid) {
-                currentDate = constrainMarkerToRange(currentDate, validRange);
-            }
-            currentInfo = this.buildCurrentRangeInfo(currentDate, direction);
-            isRangeAllDay = /^(year|month|week|day)$/.test(currentInfo.unit);
-            renderRange = this.buildRenderRange(this.trimHiddenDays(currentInfo.range), currentInfo.unit, isRangeAllDay);
-            renderRange = this.trimHiddenDays(renderRange);
-            activeRange = renderRange;
-            if (!this.options.showNonCurrentDates) {
-                activeRange = intersectRanges(activeRange, currentInfo.range);
-            }
-            minTime = createDuration(this.options.minTime);
-            maxTime = createDuration(this.options.maxTime);
-            activeRange = this.adjustActiveRange(activeRange, minTime, maxTime);
-            activeRange = intersectRanges(activeRange, validRange); // might return null
-            // it's invalid if the originally requested date is not contained,
-            // or if the range is completely outside of the valid range.
-            isValid = rangesIntersect(currentInfo.range, validRange);
-            return {
-                // constraint for where prev/next operations can go and where events can be dragged/resized to.
-                // an object with optional start and end properties.
-                validRange: validRange,
-                // range the view is formally responsible for.
-                // for example, a month view might have 1st-31st, excluding padded dates
-                currentRange: currentInfo.range,
-                // name of largest unit being displayed, like "month" or "week"
-                currentRangeUnit: currentInfo.unit,
-                isRangeAllDay: isRangeAllDay,
-                // dates that display events and accept drag-n-drop
-                // will be `null` if no dates accept events
-                activeRange: activeRange,
-                // date range with a rendered skeleton
-                // includes not-active days that need some sort of DOM
-                renderRange: renderRange,
-                // Duration object that denotes the first visible time of any given day
-                minTime: minTime,
-                // Duration object that denotes the exclusive visible end time of any given day
-                maxTime: maxTime,
-                isValid: isValid,
-                // how far the current date will move for a prev/next operation
-                dateIncrement: this.buildDateIncrement(currentInfo.duration)
-                // pass a fallback (might be null) ^
-            };
-        };
-        // Builds an object with optional start/end properties.
-        // Indicates the minimum/maximum dates to display.
-        // not responsible for trimming hidden days.
-        DateProfileGenerator.prototype.buildValidRange = function () {
-            return this.getRangeOption('validRange', this.calendar.getNow()) ||
-                { start: null, end: null }; // completely open-ended
-        };
-        // Builds a structure with info about the "current" range, the range that is
-        // highlighted as being the current month for example.
-        // See build() for a description of `direction`.
-        // Guaranteed to have `range` and `unit` properties. `duration` is optional.
-        DateProfileGenerator.prototype.buildCurrentRangeInfo = function (date, direction) {
-            var _a = this, viewSpec = _a.viewSpec, dateEnv = _a.dateEnv;
-            var duration = null;
-            var unit = null;
-            var range = null;
-            var dayCount;
-            if (viewSpec.duration) {
-                duration = viewSpec.duration;
-                unit = viewSpec.durationUnit;
-                range = this.buildRangeFromDuration(date, direction, duration, unit);
-            }
-            else if ((dayCount = this.options.dayCount)) {
-                unit = 'day';
-                range = this.buildRangeFromDayCount(date, direction, dayCount);
-            }
-            else if ((range = this.buildCustomVisibleRange(date))) {
-                unit = dateEnv.greatestWholeUnit(range.start, range.end).unit;
-            }
-            else {
-                duration = this.getFallbackDuration();
-                unit = greatestDurationDenominator(duration).unit;
-                range = this.buildRangeFromDuration(date, direction, duration, unit);
-            }
-            return { duration: duration, unit: unit, range: range };
-        };
-        DateProfileGenerator.prototype.getFallbackDuration = function () {
-            return createDuration({ day: 1 });
-        };
-        // Returns a new activeRange to have time values (un-ambiguate)
-        // minTime or maxTime causes the range to expand.
-        DateProfileGenerator.prototype.adjustActiveRange = function (range, minTime, maxTime) {
-            var dateEnv = this.dateEnv;
-            var start = range.start;
-            var end = range.end;
-            if (this.viewSpec.class.prototype.usesMinMaxTime) {
-                // expand active range if minTime is negative (why not when positive?)
-                if (asRoughDays(minTime) < 0) {
-                    start = startOfDay(start); // necessary?
-                    start = dateEnv.add(start, minTime);
-                }
-                // expand active range if maxTime is beyond one day (why not when positive?)
-                if (asRoughDays(maxTime) > 1) {
-                    end = startOfDay(end); // necessary?
-                    end = addDays(end, -1);
-                    end = dateEnv.add(end, maxTime);
-                }
-            }
-            return { start: start, end: end };
-        };
-        // Builds the "current" range when it is specified as an explicit duration.
-        // `unit` is the already-computed greatestDurationDenominator unit of duration.
-        DateProfileGenerator.prototype.buildRangeFromDuration = function (date, direction, duration, unit) {
-            var dateEnv = this.dateEnv;
-            var alignment = this.options.dateAlignment;
-            var dateIncrementInput;
-            var dateIncrementDuration;
-            var start;
-            var end;
-            var res;
-            // compute what the alignment should be
-            if (!alignment) {
-                dateIncrementInput = this.options.dateIncrement;
-                if (dateIncrementInput) {
-                    dateIncrementDuration = createDuration(dateIncrementInput);
-                    // use the smaller of the two units
-                    if (asRoughMs(dateIncrementDuration) < asRoughMs(duration)) {
-                        alignment = greatestDurationDenominator(dateIncrementDuration, !getWeeksFromInput(dateIncrementInput)).unit;
-                    }
-                    else {
-                        alignment = unit;
-                    }
-                }
-                else {
-                    alignment = unit;
-                }
-            }
-            // if the view displays a single day or smaller
-            if (asRoughDays(duration) <= 1) {
-                if (this.isHiddenDay(start)) {
-                    start = this.skipHiddenDays(start, direction);
-                    start = startOfDay(start);
-                }
-            }
-            function computeRes() {
-                start = dateEnv.startOf(date, alignment);
-                end = dateEnv.add(start, duration);
-                res = { start: start, end: end };
-            }
-            computeRes();
-            // if range is completely enveloped by hidden days, go past the hidden days
-            if (!this.trimHiddenDays(res)) {
-                date = this.skipHiddenDays(date, direction);
-                computeRes();
-            }
-            return res;
-        };
-        // Builds the "current" range when a dayCount is specified.
-        DateProfileGenerator.prototype.buildRangeFromDayCount = function (date, direction, dayCount) {
-            var dateEnv = this.dateEnv;
-            var customAlignment = this.options.dateAlignment;
-            var runningCount = 0;
-            var start = date;
-            var end;
-            if (customAlignment) {
-                start = dateEnv.startOf(start, customAlignment);
-            }
-            start = startOfDay(start);
-            start = this.skipHiddenDays(start, direction);
-            end = start;
-            do {
-                end = addDays(end, 1);
-                if (!this.isHiddenDay(end)) {
-                    runningCount++;
-                }
-            } while (runningCount < dayCount);
-            return { start: start, end: end };
-        };
-        // Builds a normalized range object for the "visible" range,
-        // which is a way to define the currentRange and activeRange at the same time.
-        DateProfileGenerator.prototype.buildCustomVisibleRange = function (date) {
-            var dateEnv = this.dateEnv;
-            var visibleRange = this.getRangeOption('visibleRange', dateEnv.toDate(date));
-            if (visibleRange && (visibleRange.start == null || visibleRange.end == null)) {
-                return null;
-            }
-            return visibleRange;
-        };
-        // Computes the range that will represent the element/cells for *rendering*,
-        // but which may have voided days/times.
-        // not responsible for trimming hidden days.
-        DateProfileGenerator.prototype.buildRenderRange = function (currentRange, currentRangeUnit, isRangeAllDay) {
-            return currentRange;
-        };
-        // Compute the duration value that should be added/substracted to the current date
-        // when a prev/next operation happens.
-        DateProfileGenerator.prototype.buildDateIncrement = function (fallback) {
-            var dateIncrementInput = this.options.dateIncrement;
-            var customAlignment;
-            if (dateIncrementInput) {
-                return createDuration(dateIncrementInput);
-            }
-            else if ((customAlignment = this.options.dateAlignment)) {
-                return createDuration(1, customAlignment);
-            }
-            else if (fallback) {
-                return fallback;
-            }
-            else {
-                return createDuration({ days: 1 });
-            }
-        };
-        // Arguments after name will be forwarded to a hypothetical function value
-        // WARNING: passed-in arguments will be given to generator functions as-is and can cause side-effects.
-        // Always clone your objects if you fear mutation.
-        DateProfileGenerator.prototype.getRangeOption = function (name) {
-            var otherArgs = [];
-            for (var _i = 1; _i < arguments.length; _i++) {
-                otherArgs[_i - 1] = arguments[_i];
-            }
-            var val = this.options[name];
-            if (typeof val === 'function') {
-                val = val.apply(null, otherArgs);
-            }
-            if (val) {
-                val = parseRange(val, this.dateEnv);
-            }
-            if (val) {
-                val = computeVisibleDayRange(val);
-            }
-            return val;
-        };
-        /* Hidden Days
-        ------------------------------------------------------------------------------------------------------------------*/
-        // Initializes internal variables related to calculating hidden days-of-week
-        DateProfileGenerator.prototype.initHiddenDays = function () {
-            var hiddenDays = this.options.hiddenDays || []; // array of day-of-week indices that are hidden
-            var isHiddenDayHash = []; // is the day-of-week hidden? (hash with day-of-week-index -> bool)
-            var dayCnt = 0;
-            var i;
-            if (this.options.weekends === false) {
-                hiddenDays.push(0, 6); // 0=sunday, 6=saturday
-            }
-            for (i = 0; i < 7; i++) {
-                if (!(isHiddenDayHash[i] = hiddenDays.indexOf(i) !== -1)) {
-                    dayCnt++;
-                }
-            }
-            if (!dayCnt) {
-                throw new Error('invalid hiddenDays'); // all days were hidden? bad.
-            }
-            this.isHiddenDayHash = isHiddenDayHash;
-        };
-        // Remove days from the beginning and end of the range that are computed as hidden.
-        // If the whole range is trimmed off, returns null
-        DateProfileGenerator.prototype.trimHiddenDays = function (range) {
-            var start = range.start;
-            var end = range.end;
-            if (start) {
-                start = this.skipHiddenDays(start);
-            }
-            if (end) {
-                end = this.skipHiddenDays(end, -1, true);
-            }
-            if (start == null || end == null || start < end) {
-                return { start: start, end: end };
-            }
-            return null;
-        };
-        // Is the current day hidden?
-        // `day` is a day-of-week index (0-6), or a Date (used for UTC)
-        DateProfileGenerator.prototype.isHiddenDay = function (day) {
-            if (day instanceof Date) {
-                day = day.getUTCDay();
-            }
-            return this.isHiddenDayHash[day];
-        };
-        // Incrementing the current day until it is no longer a hidden day, returning a copy.
-        // DOES NOT CONSIDER validRange!
-        // If the initial value of `date` is not a hidden day, don't do anything.
-        // Pass `isExclusive` as `true` if you are dealing with an end date.
-        // `inc` defaults to `1` (increment one day forward each time)
-        DateProfileGenerator.prototype.skipHiddenDays = function (date, inc, isExclusive) {
-            if (inc === void 0) { inc = 1; }
-            if (isExclusive === void 0) { isExclusive = false; }
-            while (this.isHiddenDayHash[(date.getUTCDay() + (isExclusive ? inc : 0) + 7) % 7]) {
-                date = addDays(date, inc);
-            }
-            return date;
-        };
-        return DateProfileGenerator;
-    }());
-    // TODO: find a way to avoid comparing DateProfiles. it's tedious
-    function isDateProfilesEqual(p0, p1) {
-        return rangesEqual(p0.validRange, p1.validRange) &&
-            rangesEqual(p0.activeRange, p1.activeRange) &&
-            rangesEqual(p0.renderRange, p1.renderRange) &&
-            durationsEqual(p0.minTime, p1.minTime) &&
-            durationsEqual(p0.maxTime, p1.maxTime);
-        /*
-        TODO: compare more?
-          currentRange: DateRange
-          currentRangeUnit: string
-          isRangeAllDay: boolean
-          isValid: boolean
-          dateIncrement: Duration
-        */
-    }
-
-    function reduce (state, action, calendar) {
-        var viewType = reduceViewType(state.viewType, action);
-        var dateProfile = reduceDateProfile(state.dateProfile, action, state.currentDate, viewType, calendar);
-        var eventSources = reduceEventSources(state.eventSources, action, dateProfile, calendar);
-        var nextState = __assign({}, state, { viewType: viewType,
-            dateProfile: dateProfile, currentDate: reduceCurrentDate(state.currentDate, action, dateProfile), eventSources: eventSources, eventStore: reduceEventStore(state.eventStore, action, eventSources, dateProfile, calendar), dateSelection: reduceDateSelection(state.dateSelection, action, calendar), eventSelection: reduceSelectedEvent(state.eventSelection, action), eventDrag: reduceEventDrag(state.eventDrag, action, eventSources, calendar), eventResize: reduceEventResize(state.eventResize, action, eventSources, calendar), eventSourceLoadingLevel: computeLoadingLevel(eventSources), loadingLevel: computeLoadingLevel(eventSources) });
-        for (var _i = 0, _a = calendar.pluginSystem.hooks.reducers; _i < _a.length; _i++) {
-            var reducerFunc = _a[_i];
-            nextState = reducerFunc(nextState, action, calendar);
-        }
-        // console.log(action.type, nextState)
-        return nextState;
-    }
-    function reduceViewType(currentViewType, action) {
-        switch (action.type) {
-            case 'SET_VIEW_TYPE':
-                return action.viewType;
-            default:
-                return currentViewType;
-        }
-    }
-    function reduceDateProfile(currentDateProfile, action, currentDate, viewType, calendar) {
-        var newDateProfile;
-        switch (action.type) {
-            case 'PREV':
-                newDateProfile = calendar.dateProfileGenerators[viewType].buildPrev(currentDateProfile, currentDate);
-                break;
-            case 'NEXT':
-                newDateProfile = calendar.dateProfileGenerators[viewType].buildNext(currentDateProfile, currentDate);
-                break;
-            case 'SET_DATE':
-                if (!currentDateProfile.activeRange ||
-                    !rangeContainsMarker(currentDateProfile.currentRange, action.dateMarker)) {
-                    newDateProfile = calendar.dateProfileGenerators[viewType].build(action.dateMarker, undefined, true // forceToValid
-                    );
-                }
-                break;
-            case 'SET_VIEW_TYPE':
-                var generator = calendar.dateProfileGenerators[viewType];
-                if (!generator) {
-                    throw new Error(viewType ?
-                        'The FullCalendar view "' + viewType + '" does not exist. Make sure your plugins are loaded correctly.' :
-                        'No available FullCalendar view plugins.');
-                }
-                newDateProfile = generator.build(action.dateMarker || currentDate, undefined, true // forceToValid
-                );
-                break;
-        }
-        if (newDateProfile &&
-            newDateProfile.isValid &&
-            !(currentDateProfile && isDateProfilesEqual(currentDateProfile, newDateProfile))) {
-            return newDateProfile;
-        }
-        else {
-            return currentDateProfile;
-        }
-    }
-    function reduceCurrentDate(currentDate, action, dateProfile) {
-        switch (action.type) {
-            case 'PREV':
-            case 'NEXT':
-                if (!rangeContainsMarker(dateProfile.currentRange, currentDate)) {
-                    return dateProfile.currentRange.start;
-                }
-                else {
-                    return currentDate;
-                }
-            case 'SET_DATE':
-            case 'SET_VIEW_TYPE':
-                var newDate = action.dateMarker || currentDate;
-                if (dateProfile.activeRange && !rangeContainsMarker(dateProfile.activeRange, newDate)) {
-                    return dateProfile.currentRange.start;
-                }
-                else {
-                    return newDate;
-                }
-            default:
-                return currentDate;
-        }
-    }
-    function reduceDateSelection(currentSelection, action, calendar) {
-        switch (action.type) {
-            case 'SELECT_DATES':
-                return action.selection;
-            case 'UNSELECT_DATES':
-                return null;
-            default:
-                return currentSelection;
-        }
-    }
-    function reduceSelectedEvent(currentInstanceId, action) {
-        switch (action.type) {
-            case 'SELECT_EVENT':
-                return action.eventInstanceId;
-            case 'UNSELECT_EVENT':
-                return '';
-            default:
-                return currentInstanceId;
-        }
-    }
-    function reduceEventDrag(currentDrag, action, sources, calendar) {
-        switch (action.type) {
-            case 'SET_EVENT_DRAG':
-                var newDrag = action.state;
-                return {
-                    affectedEvents: newDrag.affectedEvents,
-                    mutatedEvents: newDrag.mutatedEvents,
-                    isEvent: newDrag.isEvent,
-                    origSeg: newDrag.origSeg
-                };
-            case 'UNSET_EVENT_DRAG':
-                return null;
-            default:
-                return currentDrag;
-        }
-    }
-    function reduceEventResize(currentResize, action, sources, calendar) {
-        switch (action.type) {
-            case 'SET_EVENT_RESIZE':
-                var newResize = action.state;
-                return {
-                    affectedEvents: newResize.affectedEvents,
-                    mutatedEvents: newResize.mutatedEvents,
-                    isEvent: newResize.isEvent,
-                    origSeg: newResize.origSeg
-                };
-            case 'UNSET_EVENT_RESIZE':
-                return null;
-            default:
-                return currentResize;
-        }
-    }
-    function computeLoadingLevel(eventSources) {
-        var cnt = 0;
-        for (var sourceId in eventSources) {
-            if (eventSources[sourceId].isFetching) {
-                cnt++;
-            }
-        }
-        return cnt;
-    }
-
-    var STANDARD_PROPS = {
-        start: null,
-        end: null,
-        allDay: Boolean
-    };
-    function parseDateSpan(raw, dateEnv, defaultDuration) {
-        var span = parseOpenDateSpan(raw, dateEnv);
-        var range = span.range;
-        if (!range.start) {
-            return null;
-        }
-        if (!range.end) {
-            if (defaultDuration == null) {
-                return null;
-            }
-            else {
-                range.end = dateEnv.add(range.start, defaultDuration);
-            }
-        }
-        return span;
-    }
-    /*
-    TODO: somehow combine with parseRange?
-    Will return null if the start/end props were present but parsed invalidly.
-    */
-    function parseOpenDateSpan(raw, dateEnv) {
-        var leftovers = {};
-        var standardProps = refineProps(raw, STANDARD_PROPS, {}, leftovers);
-        var startMeta = standardProps.start ? dateEnv.createMarkerMeta(standardProps.start) : null;
-        var endMeta = standardProps.end ? dateEnv.createMarkerMeta(standardProps.end) : null;
-        var allDay = standardProps.allDay;
-        if (allDay == null) {
-            allDay = (startMeta && startMeta.isTimeUnspecified) &&
-                (!endMeta || endMeta.isTimeUnspecified);
-        }
-        // use this leftover object as the selection object
-        leftovers.range = {
-            start: startMeta ? startMeta.marker : null,
-            end: endMeta ? endMeta.marker : null
-        };
-        leftovers.allDay = allDay;
-        return leftovers;
-    }
-    function isDateSpansEqual(span0, span1) {
-        return rangesEqual(span0.range, span1.range) &&
-            span0.allDay === span1.allDay &&
-            isSpanPropsEqual(span0, span1);
-    }
-    // the NON-DATE-RELATED props
-    function isSpanPropsEqual(span0, span1) {
-        for (var propName in span1) {
-            if (propName !== 'range' && propName !== 'allDay') {
-                if (span0[propName] !== span1[propName]) {
-                    return false;
-                }
-            }
-        }
-        // are there any props that span0 has that span1 DOESN'T have?
-        // both have range/allDay, so no need to special-case.
-        for (var propName in span0) {
-            if (!(propName in span1)) {
-                return false;
-            }
-        }
-        return true;
-    }
-    function buildDateSpanApi(span, dateEnv) {
-        return {
-            start: dateEnv.toDate(span.range.start),
-            end: dateEnv.toDate(span.range.end),
-            startStr: dateEnv.formatIso(span.range.start, { omitTime: span.allDay }),
-            endStr: dateEnv.formatIso(span.range.end, { omitTime: span.allDay }),
-            allDay: span.allDay
-        };
-    }
-    function buildDatePointApi(span, dateEnv) {
-        return {
-            date: dateEnv.toDate(span.range.start),
-            dateStr: dateEnv.formatIso(span.range.start, { omitTime: span.allDay }),
-            allDay: span.allDay
-        };
-    }
-    function fabricateEventRange(dateSpan, eventUiBases, calendar) {
-        var def = parseEventDef({ editable: false }, '', // sourceId
-        dateSpan.allDay, true, // hasEnd
-        calendar);
-        return {
-            def: def,
-            ui: compileEventUi(def, eventUiBases),
-            instance: createEventInstance(def.defId, dateSpan.range),
-            range: dateSpan.range,
-            isStart: true,
-            isEnd: true
-        };
-    }
-
-    function compileViewDefs(defaultConfigs, overrideConfigs) {
-        var hash = {};
-        var viewType;
-        for (viewType in defaultConfigs) {
-            ensureViewDef(viewType, hash, defaultConfigs, overrideConfigs);
-        }
-        for (viewType in overrideConfigs) {
-            ensureViewDef(viewType, hash, defaultConfigs, overrideConfigs);
-        }
-        return hash;
-    }
-    function ensureViewDef(viewType, hash, defaultConfigs, overrideConfigs) {
-        if (hash[viewType]) {
-            return hash[viewType];
-        }
-        var viewDef = buildViewDef(viewType, hash, defaultConfigs, overrideConfigs);
-        if (viewDef) {
-            hash[viewType] = viewDef;
-        }
-        return viewDef;
-    }
-    function buildViewDef(viewType, hash, defaultConfigs, overrideConfigs) {
-        var defaultConfig = defaultConfigs[viewType];
-        var overrideConfig = overrideConfigs[viewType];
-        var queryProp = function (name) {
-            return (defaultConfig && defaultConfig[name] !== null) ? defaultConfig[name] :
-                ((overrideConfig && overrideConfig[name] !== null) ? overrideConfig[name] : null);
-        };
-        var theClass = queryProp('class');
-        var superType = queryProp('superType');
-        if (!superType && theClass) {
-            superType =
-                findViewNameBySubclass(theClass, overrideConfigs) ||
-                    findViewNameBySubclass(theClass, defaultConfigs);
-        }
-        var superDef = null;
-        if (superType) {
-            if (superType === viewType) {
-                throw new Error('Can\'t have a custom view type that references itself');
-            }
-            superDef = ensureViewDef(superType, hash, defaultConfigs, overrideConfigs);
-        }
-        if (!theClass && superDef) {
-            theClass = superDef.class;
-        }
-        if (!theClass) {
-            return null; // don't throw a warning, might be settings for a single-unit view
-        }
-        return {
-            type: viewType,
-            class: theClass,
-            defaults: __assign({}, (superDef ? superDef.defaults : {}), (defaultConfig ? defaultConfig.options : {})),
-            overrides: __assign({}, (superDef ? superDef.overrides : {}), (overrideConfig ? overrideConfig.options : {}))
-        };
-    }
-    function findViewNameBySubclass(viewSubclass, configs) {
-        var superProto = Object.getPrototypeOf(viewSubclass.prototype);
-        for (var viewType in configs) {
-            var parsed = configs[viewType];
-            // need DIRECT subclass, so instanceof won't do it
-            if (parsed.class && parsed.class.prototype === superProto) {
-                return viewType;
-            }
-        }
-        return '';
-    }
-
-    function parseViewConfigs(inputs) {
-        return mapHash(inputs, parseViewConfig);
-    }
-    var VIEW_DEF_PROPS = {
-        type: String,
-        class: null
-    };
-    function parseViewConfig(input) {
-        if (typeof input === 'function') {
-            input = { class: input };
-        }
-        var options = {};
-        var props = refineProps(input, VIEW_DEF_PROPS, {}, options);
-        return {
-            superType: props.type,
-            class: props.class,
-            options: options
-        };
-    }
-
-    function buildViewSpecs(defaultInputs, optionsManager) {
-        var defaultConfigs = parseViewConfigs(defaultInputs);
-        var overrideConfigs = parseViewConfigs(optionsManager.overrides.views);
-        var viewDefs = compileViewDefs(defaultConfigs, overrideConfigs);
-        return mapHash(viewDefs, function (viewDef) {
-            return buildViewSpec(viewDef, overrideConfigs, optionsManager);
-        });
-    }
-    function buildViewSpec(viewDef, overrideConfigs, optionsManager) {
-        var durationInput = viewDef.overrides.duration ||
-            viewDef.defaults.duration ||
-            optionsManager.dynamicOverrides.duration ||
-            optionsManager.overrides.duration;
-        var duration = null;
-        var durationUnit = '';
-        var singleUnit = '';
-        var singleUnitOverrides = {};
-        if (durationInput) {
-            duration = createDuration(durationInput);
-            if (duration) { // valid?
-                var denom = greatestDurationDenominator(duration, !getWeeksFromInput(durationInput));
-                durationUnit = denom.unit;
-                if (denom.value === 1) {
-                    singleUnit = durationUnit;
-                    singleUnitOverrides = overrideConfigs[durationUnit] ? overrideConfigs[durationUnit].options : {};
-                }
-            }
-        }
-        var queryButtonText = function (options) {
-            var buttonTextMap = options.buttonText || {};
-            var buttonTextKey = viewDef.defaults.buttonTextKey;
-            if (buttonTextKey != null && buttonTextMap[buttonTextKey] != null) {
-                return buttonTextMap[buttonTextKey];
-            }
-            if (buttonTextMap[viewDef.type] != null) {
-                return buttonTextMap[viewDef.type];
-            }
-            if (buttonTextMap[singleUnit] != null) {
-                return buttonTextMap[singleUnit];
-            }
-        };
-        return {
-            type: viewDef.type,
-            class: viewDef.class,
-            duration: duration,
-            durationUnit: durationUnit,
-            singleUnit: singleUnit,
-            options: __assign({}, globalDefaults, viewDef.defaults, optionsManager.dirDefaults, optionsManager.localeDefaults, optionsManager.overrides, singleUnitOverrides, viewDef.overrides, optionsManager.dynamicOverrides),
-            buttonTextOverride: queryButtonText(optionsManager.dynamicOverrides) ||
-                queryButtonText(optionsManager.overrides) || // constructor-specified buttonText lookup hash takes precedence
-                viewDef.overrides.buttonText,
-            buttonTextDefault: queryButtonText(optionsManager.localeDefaults) ||
-                queryButtonText(optionsManager.dirDefaults) ||
-                viewDef.defaults.buttonText ||
-                queryButtonText(globalDefaults) ||
-                viewDef.type // fall back to given view name
-        };
-    }
-
-    var Toolbar = /** @class */ (function (_super) {
-        __extends(Toolbar, _super);
-        function Toolbar(context, extraClassName) {
-            var _this = _super.call(this, context) || this;
-            _this._renderLayout = memoizeRendering(_this.renderLayout, _this.unrenderLayout);
-            _this._updateTitle = memoizeRendering(_this.updateTitle, null, [_this._renderLayout]);
-            _this._updateActiveButton = memoizeRendering(_this.updateActiveButton, null, [_this._renderLayout]);
-            _this._updateToday = memoizeRendering(_this.updateToday, null, [_this._renderLayout]);
-            _this._updatePrev = memoizeRendering(_this.updatePrev, null, [_this._renderLayout]);
-            _this._updateNext = memoizeRendering(_this.updateNext, null, [_this._renderLayout]);
-            _this.el = createElement('div', { className: 'fc-toolbar ' + extraClassName });
-            return _this;
-        }
-        Toolbar.prototype.destroy = function () {
-            _super.prototype.destroy.call(this);
-            this._renderLayout.unrender(); // should unrender everything else
-            removeElement(this.el);
-        };
-        Toolbar.prototype.render = function (props) {
-            this._renderLayout(props.layout);
-            this._updateTitle(props.title);
-            this._updateActiveButton(props.activeButton);
-            this._updateToday(props.isTodayEnabled);
-            this._updatePrev(props.isPrevEnabled);
-            this._updateNext(props.isNextEnabled);
-        };
-        Toolbar.prototype.renderLayout = function (layout) {
-            var el = this.el;
-            this.viewsWithButtons = [];
-            appendToElement(el, this.renderSection('left', layout.left));
-            appendToElement(el, this.renderSection('center', layout.center));
-            appendToElement(el, this.renderSection('right', layout.right));
-        };
-        Toolbar.prototype.unrenderLayout = function () {
-            this.el.innerHTML = '';
-        };
-        Toolbar.prototype.renderSection = function (position, buttonStr) {
-            var _this = this;
-            var _a = this, theme = _a.theme, calendar = _a.calendar;
-            var optionsManager = calendar.optionsManager;
-            var viewSpecs = calendar.viewSpecs;
-            var sectionEl = createElement('div', { className: 'fc-' + position });
-            var calendarCustomButtons = optionsManager.computed.customButtons || {};
-            var calendarButtonTextOverrides = optionsManager.overrides.buttonText || {};
-            var calendarButtonText = optionsManager.computed.buttonText || {};
-            if (buttonStr) {
-                buttonStr.split(' ').forEach(function (buttonGroupStr, i) {
-                    var groupChildren = [];
-                    var isOnlyButtons = true;
-                    var groupEl;
-                    buttonGroupStr.split(',').forEach(function (buttonName, j) {
-                        var customButtonProps;
-                        var viewSpec;
-                        var buttonClick;
-                        var buttonIcon; // only one of these will be set
-                        var buttonText; // "
-                        var buttonInnerHtml;
-                        var buttonClasses;
-                        var buttonEl;
-                        var buttonAriaAttr;
-                        if (buttonName === 'title') {
-                            groupChildren.push(htmlToElement('<h2>&nbsp;</h2>')); // we always want it to take up height
-                            isOnlyButtons = false;
-                        }
-                        else {
-                            if ((customButtonProps = calendarCustomButtons[buttonName])) {
-                                buttonClick = function (ev) {
-                                    if (customButtonProps.click) {
-                                        customButtonProps.click.call(buttonEl, ev);
-                                    }
-                                };
-                                (buttonIcon = theme.getCustomButtonIconClass(customButtonProps)) ||
-                                    (buttonIcon = theme.getIconClass(buttonName)) ||
-                                    (buttonText = customButtonProps.text);
-                            }
-                            else if ((viewSpec = viewSpecs[buttonName])) {
-                                _this.viewsWithButtons.push(buttonName);
-                                buttonClick = function () {
-                                    calendar.changeView(buttonName);
-                                };
-                                (buttonText = viewSpec.buttonTextOverride) ||
-                                    (buttonIcon = theme.getIconClass(buttonName)) ||
-                                    (buttonText = viewSpec.buttonTextDefault);
-                            }
-                            else if (calendar[buttonName]) { // a calendar method
-                                buttonClick = function () {
-                                    calendar[buttonName]();
-                                };
-                                (buttonText = calendarButtonTextOverrides[buttonName]) ||
-                                    (buttonIcon = theme.getIconClass(buttonName)) ||
-                                    (buttonText = calendarButtonText[buttonName]);
-                                //            ^ everything else is considered default
-                            }
-                            if (buttonClick) {
-                                buttonClasses = [
-                                    'fc-' + buttonName + '-button',
-                                    theme.getClass('button')
-                                ];
-                                if (buttonText) {
-                                    buttonInnerHtml = htmlEscape(buttonText);
-                                    buttonAriaAttr = '';
-                                }
-                                else if (buttonIcon) {
-                                    buttonInnerHtml = "<span class='" + buttonIcon + "'></span>";
-                                    buttonAriaAttr = ' aria-label="' + buttonName + '"';
-                                }
-                                buttonEl = htmlToElement(// type="button" so that it doesn't submit a form
-                                '<button type="button" class="' + buttonClasses.join(' ') + '"' +
-                                    buttonAriaAttr +
-                                    '>' + buttonInnerHtml + '</button>');
-                                buttonEl.addEventListener('click', buttonClick);
-                                groupChildren.push(buttonEl);
-                            }
-                        }
-                    });
-                    if (groupChildren.length > 1) {
-                        groupEl = document.createElement('div');
-                        var buttonGroupClassName = theme.getClass('buttonGroup');
-                        if (isOnlyButtons && buttonGroupClassName) {
-                            groupEl.classList.add(buttonGroupClassName);
-                        }
-                        appendToElement(groupEl, groupChildren);
-                        sectionEl.appendChild(groupEl);
-                    }
-                    else {
-                        appendToElement(sectionEl, groupChildren); // 1 or 0 children
-                    }
-                });
-            }
-            return sectionEl;
-        };
-        Toolbar.prototype.updateToday = function (isTodayEnabled) {
-            this.toggleButtonEnabled('today', isTodayEnabled);
-        };
-        Toolbar.prototype.updatePrev = function (isPrevEnabled) {
-            this.toggleButtonEnabled('prev', isPrevEnabled);
-        };
-        Toolbar.prototype.updateNext = function (isNextEnabled) {
-            this.toggleButtonEnabled('next', isNextEnabled);
-        };
-        Toolbar.prototype.updateTitle = function (text) {
-            findElements(this.el, 'h2').forEach(function (titleEl) {
-                titleEl.innerText = text;
-            });
-        };
-        Toolbar.prototype.updateActiveButton = function (buttonName) {
-            var className = this.theme.getClass('buttonActive');
-            findElements(this.el, 'button').forEach(function (buttonEl) {
-                if (buttonName && buttonEl.classList.contains('fc-' + buttonName + '-button')) {
-                    buttonEl.classList.add(className);
-                }
-                else {
-                    buttonEl.classList.remove(className);
-                }
-            });
-        };
-        Toolbar.prototype.toggleButtonEnabled = function (buttonName, bool) {
-            findElements(this.el, '.fc-' + buttonName + '-button').forEach(function (buttonEl) {
-                buttonEl.disabled = !bool;
-            });
-        };
-        return Toolbar;
-    }(Component));
-
-    var CalendarComponent = /** @class */ (function (_super) {
-        __extends(CalendarComponent, _super);
-        function CalendarComponent(context, el) {
-            var _this = _super.call(this, context) || this;
-            _this._renderToolbars = memoizeRendering(_this.renderToolbars);
-            _this.buildViewPropTransformers = memoize(buildViewPropTransformers);
-            _this.el = el;
-            prependToElement(el, _this.contentEl = createElement('div', { className: 'fc-view-container' }));
-            var calendar = _this.calendar;
-            for (var _i = 0, _a = calendar.pluginSystem.hooks.viewContainerModifiers; _i < _a.length; _i++) {
-                var modifyViewContainer = _a[_i];
-                modifyViewContainer(_this.contentEl, calendar);
-            }
-            _this.toggleElClassNames(true);
-            _this.computeTitle = memoize(computeTitle);
-            _this.parseBusinessHours = memoize(function (input) {
-                return parseBusinessHours(input, _this.calendar);
-            });
-            return _this;
-        }
-        CalendarComponent.prototype.destroy = function () {
-            if (this.header) {
-                this.header.destroy();
-            }
-            if (this.footer) {
-                this.footer.destroy();
-            }
-            if (this.view) {
-                this.view.destroy();
-            }
-            removeElement(this.contentEl);
-            this.toggleElClassNames(false);
-            _super.prototype.destroy.call(this);
-        };
-        CalendarComponent.prototype.toggleElClassNames = function (bool) {
-            var classList = this.el.classList;
-            var dirClassName = 'fc-' + this.opt('dir');
-            var themeClassName = this.theme.getClass('widget');
-            if (bool) {
-                classList.add('fc');
-                classList.add(dirClassName);
-                classList.add(themeClassName);
-            }
-            else {
-                classList.remove('fc');
-                classList.remove(dirClassName);
-                classList.remove(themeClassName);
-            }
-        };
-        CalendarComponent.prototype.render = function (props) {
-            this.freezeHeight();
-            var title = this.computeTitle(props.dateProfile, props.viewSpec.options);
-            this._renderToolbars(props.viewSpec, props.dateProfile, props.currentDate, props.dateProfileGenerator, title);
-            this.renderView(props, title);
-            this.updateSize();
-            this.thawHeight();
-        };
-        CalendarComponent.prototype.renderToolbars = function (viewSpec, dateProfile, currentDate, dateProfileGenerator, title) {
-            var headerLayout = this.opt('header');
-            var footerLayout = this.opt('footer');
-            var now = this.calendar.getNow();
-            var todayInfo = dateProfileGenerator.build(now);
-            var prevInfo = dateProfileGenerator.buildPrev(dateProfile, currentDate);
-            var nextInfo = dateProfileGenerator.buildNext(dateProfile, currentDate);
-            var toolbarProps = {
-                title: title,
-                activeButton: viewSpec.type,
-                isTodayEnabled: todayInfo.isValid && !rangeContainsMarker(dateProfile.currentRange, now),
-                isPrevEnabled: prevInfo.isValid,
-                isNextEnabled: nextInfo.isValid
-            };
-            if (headerLayout) {
-                if (!this.header) {
-                    this.header = new Toolbar(this.context, 'fc-header-toolbar');
-                    prependToElement(this.el, this.header.el);
-                }
-                this.header.receiveProps(__assign({ layout: headerLayout }, toolbarProps));
-            }
-            else if (this.header) {
-                this.header.destroy();
-                this.header = null;
-            }
-            if (footerLayout) {
-                if (!this.footer) {
-                    this.footer = new Toolbar(this.context, 'fc-footer-toolbar');
-                    appendToElement(this.el, this.footer.el);
-                }
-                this.footer.receiveProps(__assign({ layout: footerLayout }, toolbarProps));
-            }
-            else if (this.footer) {
-                this.footer.destroy();
-                this.footer = null;
-            }
-        };
-        CalendarComponent.prototype.renderView = function (props, title) {
-            var view = this.view;
-            var viewSpec = props.viewSpec, dateProfileGenerator = props.dateProfileGenerator;
-            if (!view || view.viewSpec !== viewSpec) {
-                if (view) {
-                    view.destroy();
-                }
-                view = this.view = new viewSpec['class']({
-                    calendar: this.calendar,
-                    view: null,
-                    dateEnv: this.dateEnv,
-                    theme: this.theme,
-                    options: viewSpec.options
-                }, viewSpec, dateProfileGenerator, this.contentEl);
-            }
-            else {
-                view.addScroll(view.queryScroll());
-            }
-            view.title = title; // for the API
-            var viewProps = {
-                dateProfile: props.dateProfile,
-                businessHours: this.parseBusinessHours(viewSpec.options.businessHours),
-                eventStore: props.eventStore,
-                eventUiBases: props.eventUiBases,
-                dateSelection: props.dateSelection,
-                eventSelection: props.eventSelection,
-                eventDrag: props.eventDrag,
-                eventResize: props.eventResize
-            };
-            var transformers = this.buildViewPropTransformers(this.calendar.pluginSystem.hooks.viewPropsTransformers);
-            for (var _i = 0, transformers_1 = transformers; _i < transformers_1.length; _i++) {
-                var transformer = transformers_1[_i];
-                __assign(viewProps, transformer.transform(viewProps, viewSpec, props, view));
-            }
-            view.receiveProps(viewProps);
-        };
-        // Sizing
-        // -----------------------------------------------------------------------------------------------------------------
-        CalendarComponent.prototype.updateSize = function (isResize) {
-            if (isResize === void 0) { isResize = false; }
-            var view = this.view;
-            if (isResize) {
-                view.addScroll(view.queryScroll());
-            }
-            if (isResize || this.isHeightAuto == null) {
-                this.computeHeightVars();
-            }
-            view.updateSize(isResize, this.viewHeight, this.isHeightAuto);
-            view.updateNowIndicator(); // we need to guarantee this will run after updateSize
-            view.popScroll(isResize);
-        };
-        CalendarComponent.prototype.computeHeightVars = function () {
-            var calendar = this.calendar; // yuck. need to handle dynamic options
-            var heightInput = calendar.opt('height');
-            var contentHeightInput = calendar.opt('contentHeight');
-            this.isHeightAuto = heightInput === 'auto' || contentHeightInput === 'auto';
-            if (typeof contentHeightInput === 'number') { // exists and not 'auto'
-                this.viewHeight = contentHeightInput;
-            }
-            else if (typeof contentHeightInput === 'function') { // exists and is a function
-                this.viewHeight = contentHeightInput();
-            }
-            else if (typeof heightInput === 'number') { // exists and not 'auto'
-                this.viewHeight = heightInput - this.queryToolbarsHeight();
-            }
-            else if (typeof heightInput === 'function') { // exists and is a function
-                this.viewHeight = heightInput() - this.queryToolbarsHeight();
-            }
-            else if (heightInput === 'parent') { // set to height of parent element
-                var parentEl = this.el.parentNode;
-                this.viewHeight = parentEl.getBoundingClientRect().height - this.queryToolbarsHeight();
-            }
-            else {
-                this.viewHeight = Math.round(this.contentEl.getBoundingClientRect().width /
-                    Math.max(calendar.opt('aspectRatio'), .5));
-            }
-        };
-        CalendarComponent.prototype.queryToolbarsHeight = function () {
-            var height = 0;
-            if (this.header) {
-                height += computeHeightAndMargins(this.header.el);
-            }
-            if (this.footer) {
-                height += computeHeightAndMargins(this.footer.el);
-            }
-            return height;
-        };
-        // Height "Freezing"
-        // -----------------------------------------------------------------------------------------------------------------
-        CalendarComponent.prototype.freezeHeight = function () {
-            applyStyle(this.el, {
-                height: this.el.getBoundingClientRect().height,
-                overflow: 'hidden'
-            });
-        };
-        CalendarComponent.prototype.thawHeight = function () {
-            applyStyle(this.el, {
-                height: '',
-                overflow: ''
-            });
-        };
-        return CalendarComponent;
-    }(Component));
-    // Title and Date Formatting
-    // -----------------------------------------------------------------------------------------------------------------
-    // Computes what the title at the top of the calendar should be for this view
-    function computeTitle(dateProfile, viewOptions) {
-        var range;
-        // for views that span a large unit of time, show the proper interval, ignoring stray days before and after
-        if (/^(year|month)$/.test(dateProfile.currentRangeUnit)) {
-            range = dateProfile.currentRange;
-        }
-        else { // for day units or smaller, use the actual day range
-            range = dateProfile.activeRange;
-        }
-        return this.dateEnv.formatRange(range.start, range.end, createFormatter(viewOptions.titleFormat || computeTitleFormat(dateProfile), viewOptions.titleRangeSeparator), { isEndExclusive: dateProfile.isRangeAllDay });
-    }
-    // Generates the format string that should be used to generate the title for the current date range.
-    // Attempts to compute the most appropriate format if not explicitly specified with `titleFormat`.
-    function computeTitleFormat(dateProfile) {
-        var currentRangeUnit = dateProfile.currentRangeUnit;
-        if (currentRangeUnit === 'year') {
-            return { year: 'numeric' };
-        }
-        else if (currentRangeUnit === 'month') {
-            return { year: 'numeric', month: 'long' }; // like "September 2014"
-        }
-        else {
-            var days = diffWholeDays(dateProfile.currentRange.start, dateProfile.currentRange.end);
-            if (days !== null && days > 1) {
-                // multi-day range. shorter, like "Sep 9 - 10 2014"
-                return { year: 'numeric', month: 'short', day: 'numeric' };
-            }
-            else {
-                // one day. longer, like "September 9 2014"
-                return { year: 'numeric', month: 'long', day: 'numeric' };
-            }
-        }
-    }
-    // Plugin
-    // -----------------------------------------------------------------------------------------------------------------
-    function buildViewPropTransformers(theClasses) {
-        return theClasses.map(function (theClass) {
-            return new theClass();
-        });
-    }
-
-    var Interaction = /** @class */ (function () {
-        function Interaction(settings) {
-            this.component = settings.component;
-        }
-        Interaction.prototype.destroy = function () {
-        };
-        return Interaction;
-    }());
-    function parseInteractionSettings(component, input) {
-        return {
-            component: component,
-            el: input.el,
-            useEventCenter: input.useEventCenter != null ? input.useEventCenter : true
-        };
-    }
-    function interactionSettingsToStore(settings) {
-        var _a;
-        return _a = {},
-            _a[settings.component.uid] = settings,
-            _a;
-    }
-    // global state
-    var interactionSettingsStore = {};
-
-    /*
-    Detects when the user clicks on an event within a DateComponent
-    */
-    var EventClicking = /** @class */ (function (_super) {
-        __extends(EventClicking, _super);
-        function EventClicking(settings) {
-            var _this = _super.call(this, settings) || this;
-            _this.handleSegClick = function (ev, segEl) {
-                var component = _this.component;
-                var seg = getElSeg(segEl);
-                if (seg && // might be the <div> surrounding the more link
-                    component.isValidSegDownEl(ev.target)) {
-                    // our way to simulate a link click for elements that can't be <a> tags
-                    // grab before trigger fired in case trigger trashes DOM thru rerendering
-                    var hasUrlContainer = elementClosest(ev.target, '.fc-has-url');
-                    var url = hasUrlContainer ? hasUrlContainer.querySelector('a[href]').href : '';
-                    component.publiclyTrigger('eventClick', [
-                        {
-                            el: segEl,
-                            event: new EventApi(component.calendar, seg.eventRange.def, seg.eventRange.instance),
-                            jsEvent: ev,
-                            view: component.view
-                        }
-                    ]);
-                    if (url && !ev.defaultPrevented) {
-                        window.location.href = url;
-                    }
-                }
-            };
-            var component = settings.component;
-            _this.destroy = listenBySelector(component.el, 'click', component.fgSegSelector + ',' + component.bgSegSelector, _this.handleSegClick);
-            return _this;
-        }
-        return EventClicking;
-    }(Interaction));
-
-    /*
-    Triggers events and adds/removes core classNames when the user's pointer
-    enters/leaves event-elements of a component.
-    */
-    var EventHovering = /** @class */ (function (_super) {
-        __extends(EventHovering, _super);
-        function EventHovering(settings) {
-            var _this = _super.call(this, settings) || this;
-            // for simulating an eventMouseLeave when the event el is destroyed while mouse is over it
-            _this.handleEventElRemove = function (el) {
-                if (el === _this.currentSegEl) {
-                    _this.handleSegLeave(null, _this.currentSegEl);
-                }
-            };
-            _this.handleSegEnter = function (ev, segEl) {
-                if (getElSeg(segEl)) { // TODO: better way to make sure not hovering over more+ link or its wrapper
-                    segEl.classList.add('fc-allow-mouse-resize');
-                    _this.currentSegEl = segEl;
-                    _this.triggerEvent('eventMouseEnter', ev, segEl);
-                }
-            };
-            _this.handleSegLeave = function (ev, segEl) {
-                if (_this.currentSegEl) {
-                    segEl.classList.remove('fc-allow-mouse-resize');
-                    _this.currentSegEl = null;
-                    _this.triggerEvent('eventMouseLeave', ev, segEl);
-                }
-            };
-            var component = settings.component;
-            _this.removeHoverListeners = listenToHoverBySelector(component.el, component.fgSegSelector + ',' + component.bgSegSelector, _this.handleSegEnter, _this.handleSegLeave);
-            component.calendar.on('eventElRemove', _this.handleEventElRemove);
-            return _this;
-        }
-        EventHovering.prototype.destroy = function () {
-            this.removeHoverListeners();
-            this.component.calendar.off('eventElRemove', this.handleEventElRemove);
-        };
-        EventHovering.prototype.triggerEvent = function (publicEvName, ev, segEl) {
-            var component = this.component;
-            var seg = getElSeg(segEl);
-            if (!ev || component.isValidSegDownEl(ev.target)) {
-                component.publiclyTrigger(publicEvName, [
-                    {
-                        el: segEl,
-                        event: new EventApi(this.component.calendar, seg.eventRange.def, seg.eventRange.instance),
-                        jsEvent: ev,
-                        view: component.view
-                    }
-                ]);
-            }
-        };
-        return EventHovering;
-    }(Interaction));
-
-    var StandardTheme = /** @class */ (function (_super) {
-        __extends(StandardTheme, _super);
-        function StandardTheme() {
-            return _super !== null && _super.apply(this, arguments) || this;
-        }
-        return StandardTheme;
-    }(Theme));
-    StandardTheme.prototype.classes = {
-        widget: 'fc-unthemed',
-        widgetHeader: 'fc-widget-header',
-        widgetContent: 'fc-widget-content',
-        buttonGroup: 'fc-button-group',
-        button: 'fc-button fc-button-primary',
-        buttonActive: 'fc-button-active',
-        popoverHeader: 'fc-widget-header',
-        popoverContent: 'fc-widget-content',
-        // day grid
-        headerRow: 'fc-widget-header',
-        dayRow: 'fc-widget-content',
-        // list view
-        listView: 'fc-widget-content'
-    };
-    StandardTheme.prototype.baseIconClass = 'fc-icon';
-    StandardTheme.prototype.iconClasses = {
-        close: 'fc-icon-x',
-        prev: 'fc-icon-chevron-left',
-        next: 'fc-icon-chevron-right',
-        prevYear: 'fc-icon-chevrons-left',
-        nextYear: 'fc-icon-chevrons-right'
-    };
-    StandardTheme.prototype.iconOverrideOption = 'buttonIcons';
-    StandardTheme.prototype.iconOverrideCustomButtonOption = 'icon';
-    StandardTheme.prototype.iconOverridePrefix = 'fc-icon-';
-
-    var Calendar = /** @class */ (function () {
-        function Calendar(el, overrides) {
-            var _this = this;
-            this.parseRawLocales = memoize(parseRawLocales);
-            this.buildLocale = memoize(buildLocale);
-            this.buildDateEnv = memoize(buildDateEnv);
-            this.buildTheme = memoize(buildTheme);
-            this.buildEventUiSingleBase = memoize(this._buildEventUiSingleBase);
-            this.buildSelectionConfig = memoize(this._buildSelectionConfig);
-            this.buildEventUiBySource = memoizeOutput(buildEventUiBySource, isPropsEqual);
-            this.buildEventUiBases = memoize(buildEventUiBases);
-            this.interactionsStore = {};
-            this.actionQueue = [];
-            this.isReducing = false;
-            // isDisplaying: boolean = false // installed in DOM? accepting renders?
-            this.needsRerender = false; // needs a render?
-            this.needsFullRerender = false;
-            this.isRendering = false; // currently in the executeRender function?
-            this.renderingPauseDepth = 0;
-            this.buildDelayedRerender = memoize(buildDelayedRerender);
-            this.afterSizingTriggers = {};
-            this.isViewUpdated = false;
-            this.isDatesUpdated = false;
-            this.isEventsUpdated = false;
-            this.el = el;
-            this.optionsManager = new OptionsManager(overrides || {});
-            this.pluginSystem = new PluginSystem();
-            // only do once. don't do in handleOptions. because can't remove plugins
-            this.addPluginInputs(this.optionsManager.computed.plugins || []);
-            this.handleOptions(this.optionsManager.computed);
-            this.publiclyTrigger('_init'); // for tests
-            this.hydrate();
-            this.calendarInteractions = this.pluginSystem.hooks.calendarInteractions
-                .map(function (calendarInteractionClass) {
-                return new calendarInteractionClass(_this);
-            });
-        }
-        Calendar.prototype.addPluginInputs = function (pluginInputs) {
-            var pluginDefs = refinePluginDefs(pluginInputs);
-            for (var _i = 0, pluginDefs_1 = pluginDefs; _i < pluginDefs_1.length; _i++) {
-                var pluginDef = pluginDefs_1[_i];
-                this.pluginSystem.add(pluginDef);
-            }
-        };
-        Object.defineProperty(Calendar.prototype, "view", {
-            // public API
-            get: function () {
-                return this.component ? this.component.view : null;
-            },
-            enumerable: true,
-            configurable: true
-        });
-        // Public API for rendering
-        // -----------------------------------------------------------------------------------------------------------------
-        Calendar.prototype.render = function () {
-            if (!this.component) {
-                this.renderableEventStore = createEmptyEventStore();
-                this.bindHandlers();
-                this.executeRender();
-            }
-            else {
-                this.requestRerender(true);
-            }
-        };
-        Calendar.prototype.destroy = function () {
-            if (this.component) {
-                this.unbindHandlers();
-                this.component.destroy(); // don't null-out. in case API needs access
-                this.component = null; // umm ???
-                for (var _i = 0, _a = this.calendarInteractions; _i < _a.length; _i++) {
-                    var interaction = _a[_i];
-                    interaction.destroy();
-                }
-                this.publiclyTrigger('_destroyed');
-            }
-        };
-        // Handlers
-        // -----------------------------------------------------------------------------------------------------------------
-        Calendar.prototype.bindHandlers = function () {
-            var _this = this;
-            // event delegation for nav links
-            this.removeNavLinkListener = listenBySelector(this.el, 'click', 'a[data-goto]', function (ev, anchorEl) {
-                var gotoOptions = anchorEl.getAttribute('data-goto');
-                gotoOptions = gotoOptions ? JSON.parse(gotoOptions) : {};
-                var dateEnv = _this.dateEnv;
-                var dateMarker = dateEnv.createMarker(gotoOptions.date);
-                var viewType = gotoOptions.type;
-                // property like "navLinkDayClick". might be a string or a function
-                var customAction = _this.viewOpt('navLink' + capitaliseFirstLetter(viewType) + 'Click');
-                if (typeof customAction === 'function') {
-                    customAction(dateEnv.toDate(dateMarker), ev);
-                }
-                else {
-                    if (typeof customAction === 'string') {
-                        viewType = customAction;
-                    }
-                    _this.zoomTo(dateMarker, viewType);
-                }
-            });
-            if (this.opt('handleWindowResize')) {
-                window.addEventListener('resize', this.windowResizeProxy = debounce(// prevents rapid calls
-                this.windowResize.bind(this), this.opt('windowResizeDelay')));
-            }
-        };
-        Calendar.prototype.unbindHandlers = function () {
-            this.removeNavLinkListener();
-            if (this.windowResizeProxy) {
-                window.removeEventListener('resize', this.windowResizeProxy);
-                this.windowResizeProxy = null;
-            }
-        };
-        // Dispatcher
-        // -----------------------------------------------------------------------------------------------------------------
-        Calendar.prototype.hydrate = function () {
-            var _this = this;
-            this.state = this.buildInitialState();
-            var rawSources = this.opt('eventSources') || [];
-            var singleRawSource = this.opt('events');
-            var sources = []; // parsed
-            if (singleRawSource) {
-                rawSources.unshift(singleRawSource);
-            }
-            for (var _i = 0, rawSources_1 = rawSources; _i < rawSources_1.length; _i++) {
-                var rawSource = rawSources_1[_i];
-                var source = parseEventSource(rawSource, this);
-                if (source) {
-                    sources.push(source);
-                }
-            }
-            this.batchRendering(function () {
-                _this.dispatch({ type: 'INIT' }); // pass in sources here?
-                _this.dispatch({ type: 'ADD_EVENT_SOURCES', sources: sources });
-                _this.dispatch({
-                    type: 'SET_VIEW_TYPE',
-                    viewType: _this.opt('defaultView') || _this.pluginSystem.hooks.defaultView
-                });
-            });
-        };
-        Calendar.prototype.buildInitialState = function () {
-            return {
-                viewType: null,
-                loadingLevel: 0,
-                eventSourceLoadingLevel: 0,
-                currentDate: this.getInitialDate(),
-                dateProfile: null,
-                eventSources: {},
-                eventStore: createEmptyEventStore(),
-                dateSelection: null,
-                eventSelection: '',
-                eventDrag: null,
-                eventResize: null
-            };
-        };
-        Calendar.prototype.dispatch = function (action) {
-            this.actionQueue.push(action);
-            if (!this.isReducing) {
-                this.isReducing = true;
-                var oldState = this.state;
-                while (this.actionQueue.length) {
-                    this.state = this.reduce(this.state, this.actionQueue.shift(), this);
-                }
-                var newState = this.state;
-                this.isReducing = false;
-                if (!oldState.loadingLevel && newState.loadingLevel) {
-                    this.publiclyTrigger('loading', [true]);
-                }
-                else if (oldState.loadingLevel && !newState.loadingLevel) {
-                    this.publiclyTrigger('loading', [false]);
-                }
-                var view = this.component && this.component.view;
-                if (oldState.eventStore !== newState.eventStore || this.needsFullRerender) {
-                    if (oldState.eventStore) {
-                        this.isEventsUpdated = true;
-                    }
-                }
-                if (oldState.dateProfile !== newState.dateProfile || this.needsFullRerender) {
-                    if (oldState.dateProfile && view) { // why would view be null!?
-                        this.publiclyTrigger('datesDestroy', [
-                            {
-                                view: view,
-                                el: view.el
-                            }
-                        ]);
-                    }
-                    this.isDatesUpdated = true;
-                }
-                if (oldState.viewType !== newState.viewType || this.needsFullRerender) {
-                    if (oldState.viewType && view) { // why would view be null!?
-                        this.publiclyTrigger('viewSkeletonDestroy', [
-                            {
-                                view: view,
-                                el: view.el
-                            }
-                        ]);
-                    }
-                    this.isViewUpdated = true;
-                }
-                this.requestRerender();
-            }
-        };
-        Calendar.prototype.reduce = function (state, action, calendar) {
-            return reduce(state, action, calendar);
-        };
-        // Render Queue
-        // -----------------------------------------------------------------------------------------------------------------
-        Calendar.prototype.requestRerender = function (needsFull) {
-            if (needsFull === void 0) { needsFull = false; }
-            this.needsRerender = true;
-            this.needsFullRerender = this.needsFullRerender || needsFull;
-            this.delayedRerender(); // will call a debounced-version of tryRerender
-        };
-        Calendar.prototype.tryRerender = function () {
-            if (this.component && // must be accepting renders
-                this.needsRerender && // indicates that a rerender was requested
-                !this.renderingPauseDepth && // not paused
-                !this.isRendering // not currently in the render loop
-            ) {
-                this.executeRender();
-            }
-        };
-        Calendar.prototype.batchRendering = function (func) {
-            this.renderingPauseDepth++;
-            func();
-            this.renderingPauseDepth--;
-            if (this.needsRerender) {
-                this.requestRerender();
-            }
-        };
-        // Rendering
-        // -----------------------------------------------------------------------------------------------------------------
-        Calendar.prototype.executeRender = function () {
-            var needsFullRerender = this.needsFullRerender; // save before clearing
-            // clear these BEFORE the render so that new values will accumulate during render
-            this.needsRerender = false;
-            this.needsFullRerender = false;
-            this.isRendering = true;
-            this.renderComponent(needsFullRerender);
-            this.isRendering = false;
-            // received a rerender request while rendering
-            if (this.needsRerender) {
-                this.delayedRerender();
-            }
-        };
-        /*
-        don't call this directly. use executeRender instead
-        */
-        Calendar.prototype.renderComponent = function (needsFull) {
-            var _a = this, state = _a.state, component = _a.component;
-            var viewType = state.viewType;
-            var viewSpec = this.viewSpecs[viewType];
-            var savedScroll = (needsFull && component) ? component.view.queryScroll() : null;
-            if (!viewSpec) {
-                throw new Error("View type \"" + viewType + "\" is not valid");
-            }
-            // if event sources are still loading and progressive rendering hasn't been enabled,
-            // keep rendering the last fully loaded set of events
-            var renderableEventStore = this.renderableEventStore =
-                (state.eventSourceLoadingLevel && !this.opt('progressiveEventRendering')) ?
-                    this.renderableEventStore :
-                    state.eventStore;
-            var eventUiSingleBase = this.buildEventUiSingleBase(viewSpec.options);
-            var eventUiBySource = this.buildEventUiBySource(state.eventSources);
-            var eventUiBases = this.eventUiBases = this.buildEventUiBases(renderableEventStore.defs, eventUiSingleBase, eventUiBySource);
-            if (needsFull || !component) {
-                if (component) {
-                    component.freezeHeight(); // next component will unfreeze it
-                    component.destroy();
-                }
-                component = this.component = new CalendarComponent({
-                    calendar: this,
-                    view: null,
-                    dateEnv: this.dateEnv,
-                    theme: this.theme,
-                    options: this.optionsManager.computed
-                }, this.el);
-                this.isViewUpdated = true;
-                this.isDatesUpdated = true;
-                this.isEventsUpdated = true;
-            }
-            component.receiveProps(__assign({}, state, { viewSpec: viewSpec, dateProfile: state.dateProfile, dateProfileGenerator: this.dateProfileGenerators[viewType], eventStore: renderableEventStore, eventUiBases: eventUiBases, dateSelection: state.dateSelection, eventSelection: state.eventSelection, eventDrag: state.eventDrag, eventResize: state.eventResize }));
-            if (savedScroll) {
-                component.view.applyScroll(savedScroll, false);
-            }
-            if (this.isViewUpdated) {
-                this.isViewUpdated = false;
-                this.publiclyTrigger('viewSkeletonRender', [
-                    {
-                        view: component.view,
-                        el: component.view.el
-                    }
-                ]);
-            }
-            if (this.isDatesUpdated) {
-                this.isDatesUpdated = false;
-                this.publiclyTrigger('datesRender', [
-                    {
-                        view: component.view,
-                        el: component.view.el
-                    }
-                ]);
-            }
-            if (this.isEventsUpdated) {
-                this.isEventsUpdated = false;
-            }
-            this.releaseAfterSizingTriggers();
-        };
-        // Options
-        // -----------------------------------------------------------------------------------------------------------------
-        Calendar.prototype.setOption = function (name, val) {
-            var _a;
-            this.mutateOptions((_a = {}, _a[name] = val, _a), [], true);
-        };
-        Calendar.prototype.getOption = function (name) {
-            return this.optionsManager.computed[name];
-        };
-        Calendar.prototype.opt = function (name) {
-            return this.optionsManager.computed[name];
-        };
-        Calendar.prototype.viewOpt = function (name) {
-            return this.viewOpts()[name];
-        };
-        Calendar.prototype.viewOpts = function () {
-            return this.viewSpecs[this.state.viewType].options;
-        };
-        /*
-        handles option changes (like a diff)
-        */
-        Calendar.prototype.mutateOptions = function (updates, removals, isDynamic, deepEqual) {
-            var _this = this;
-            var changeHandlers = this.pluginSystem.hooks.optionChangeHandlers;
-            var normalUpdates = {};
-            var specialUpdates = {};
-            var oldDateEnv = this.dateEnv; // do this before handleOptions
-            var isTimeZoneDirty = false;
-            var isSizeDirty = false;
-            var anyDifficultOptions = Boolean(removals.length);
-            for (var name_1 in updates) {
-                if (changeHandlers[name_1]) {
-                    specialUpdates[name_1] = updates[name_1];
-                }
-                else {
-                    normalUpdates[name_1] = updates[name_1];
-                }
-            }
-            for (var name_2 in normalUpdates) {
-                if (/^(height|contentHeight|aspectRatio)$/.test(name_2)) {
-                    isSizeDirty = true;
-                }
-                else if (/^(defaultDate|defaultView)$/.test(name_2)) ;
-                else {
-                    anyDifficultOptions = true;
-                    if (name_2 === 'timeZone') {
-                        isTimeZoneDirty = true;
-                    }
-                }
-            }
-            this.optionsManager.mutate(normalUpdates, removals, isDynamic);
-            if (anyDifficultOptions) {
-                this.handleOptions(this.optionsManager.computed);
-                this.needsFullRerender = true;
-            }
-            this.batchRendering(function () {
-                if (anyDifficultOptions) {
-                    if (isTimeZoneDirty) {
-                        _this.dispatch({
-                            type: 'CHANGE_TIMEZONE',
-                            oldDateEnv: oldDateEnv
-                        });
-                    }
-                    /* HACK
-                    has the same effect as calling this.requestRerender(true)
-                    but recomputes the state's dateProfile
-                    */
-                    _this.dispatch({
-                        type: 'SET_VIEW_TYPE',
-                        viewType: _this.state.viewType
-                    });
-                }
-                else if (isSizeDirty) {
-                    _this.updateSize();
-                }
-                // special updates
-                if (deepEqual) {
-                    for (var name_3 in specialUpdates) {
-                        changeHandlers[name_3](specialUpdates[name_3], _this, deepEqual);
-                    }
-                }
-            });
-        };
-        /*
-        rebuilds things based off of a complete set of refined options
-        */
-        Calendar.prototype.handleOptions = function (options) {
-            var _this = this;
-            var pluginHooks = this.pluginSystem.hooks;
-            this.defaultAllDayEventDuration = createDuration(options.defaultAllDayEventDuration);
-            this.defaultTimedEventDuration = createDuration(options.defaultTimedEventDuration);
-            this.delayedRerender = this.buildDelayedRerender(options.rerenderDelay);
-            this.theme = this.buildTheme(options);
-            var available = this.parseRawLocales(options.locales);
-            this.availableRawLocales = available.map;
-            var locale = this.buildLocale(options.locale || available.defaultCode, available.map);
-            this.dateEnv = this.buildDateEnv(locale, options.timeZone, pluginHooks.namedTimeZonedImpl, options.firstDay, options.weekNumberCalculation, options.weekLabel, pluginHooks.cmdFormatter);
-            this.selectionConfig = this.buildSelectionConfig(options); // needs dateEnv. do after :(
-            // ineffecient to do every time?
-            this.viewSpecs = buildViewSpecs(pluginHooks.views, this.optionsManager);
-            // ineffecient to do every time?
-            this.dateProfileGenerators = mapHash(this.viewSpecs, function (viewSpec) {
-                return new viewSpec.class.prototype.dateProfileGeneratorClass(viewSpec, _this);
-            });
-        };
-        Calendar.prototype.getAvailableLocaleCodes = function () {
-            return Object.keys(this.availableRawLocales);
-        };
-        Calendar.prototype._buildSelectionConfig = function (rawOpts) {
-            return processScopedUiProps('select', rawOpts, this);
-        };
-        Calendar.prototype._buildEventUiSingleBase = function (rawOpts) {
-            if (rawOpts.editable) { // so 'editable' affected events
-                rawOpts = __assign({}, rawOpts, { eventEditable: true });
-            }
-            return processScopedUiProps('event', rawOpts, this);
-        };
-        // Trigger
-        // -----------------------------------------------------------------------------------------------------------------
-        Calendar.prototype.hasPublicHandlers = function (name) {
-            return this.hasHandlers(name) ||
-                this.opt(name); // handler specified in options
-        };
-        Calendar.prototype.publiclyTrigger = function (name, args) {
-            var optHandler = this.opt(name);
-            this.triggerWith(name, this, args);
-            if (optHandler) {
-                return optHandler.apply(this, args);
-            }
-        };
-        Calendar.prototype.publiclyTriggerAfterSizing = function (name, args) {
-            var afterSizingTriggers = this.afterSizingTriggers;
-            (afterSizingTriggers[name] || (afterSizingTriggers[name] = [])).push(args);
-        };
-        Calendar.prototype.releaseAfterSizingTriggers = function () {
-            var afterSizingTriggers = this.afterSizingTriggers;
-            for (var name_4 in afterSizingTriggers) {
-                for (var _i = 0, _a = afterSizingTriggers[name_4]; _i < _a.length; _i++) {
-                    var args = _a[_i];
-                    this.publiclyTrigger(name_4, args);
-                }
-            }
-            this.afterSizingTriggers = {};
-        };
-        // View
-        // -----------------------------------------------------------------------------------------------------------------
-        // Returns a boolean about whether the view is okay to instantiate at some point
-        Calendar.prototype.isValidViewType = function (viewType) {
-            return Boolean(this.viewSpecs[viewType]);
-        };
-        Calendar.prototype.changeView = function (viewType, dateOrRange) {
-            var dateMarker = null;
-            if (dateOrRange) {
-                if (dateOrRange.start && dateOrRange.end) { // a range
-                    this.optionsManager.mutate({ visibleRange: dateOrRange }, []); // will not rerender
-                    this.handleOptions(this.optionsManager.computed); // ...but yuck
-                }
-                else { // a date
-                    dateMarker = this.dateEnv.createMarker(dateOrRange); // just like gotoDate
-                }
-            }
-            this.unselect();
-            this.dispatch({
-                type: 'SET_VIEW_TYPE',
-                viewType: viewType,
-                dateMarker: dateMarker
-            });
-        };
-        // Forces navigation to a view for the given date.
-        // `viewType` can be a specific view name or a generic one like "week" or "day".
-        // needs to change
-        Calendar.prototype.zoomTo = function (dateMarker, viewType) {
-            var spec;
-            viewType = viewType || 'day'; // day is default zoom
-            spec = this.viewSpecs[viewType] ||
-                this.getUnitViewSpec(viewType);
-            this.unselect();
-            if (spec) {
-                this.dispatch({
-                    type: 'SET_VIEW_TYPE',
-                    viewType: spec.type,
-                    dateMarker: dateMarker
-                });
-            }
-            else {
-                this.dispatch({
-                    type: 'SET_DATE',
-                    dateMarker: dateMarker
-                });
-            }
-        };
-        // Given a duration singular unit, like "week" or "day", finds a matching view spec.
-        // Preference is given to views that have corresponding buttons.
-        Calendar.prototype.getUnitViewSpec = function (unit) {
-            var component = this.component;
-            var viewTypes = [];
-            var i;
-            var spec;
-            // put views that have buttons first. there will be duplicates, but oh
-            if (component.header) {
-                viewTypes.push.apply(viewTypes, component.header.viewsWithButtons);
-            }
-            if (component.footer) {
-                viewTypes.push.apply(viewTypes, component.footer.viewsWithButtons);
-            }
-            for (var viewType in this.viewSpecs) {
-                viewTypes.push(viewType);
-            }
-            for (i = 0; i < viewTypes.length; i++) {
-                spec = this.viewSpecs[viewTypes[i]];
-                if (spec) {
-                    if (spec.singleUnit === unit) {
-                        return spec;
-                    }
-                }
-            }
-        };
-        // Current Date
-        // -----------------------------------------------------------------------------------------------------------------
-        Calendar.prototype.getInitialDate = function () {
-            var defaultDateInput = this.opt('defaultDate');
-            // compute the initial ambig-timezone date
-            if (defaultDateInput != null) {
-                return this.dateEnv.createMarker(defaultDateInput);
-            }
-            else {
-                return this.getNow(); // getNow already returns unzoned
-            }
-        };
-        Calendar.prototype.prev = function () {
-            this.unselect();
-            this.dispatch({ type: 'PREV' });
-        };
-        Calendar.prototype.next = function () {
-            this.unselect();
-            this.dispatch({ type: 'NEXT' });
-        };
-        Calendar.prototype.prevYear = function () {
-            this.unselect();
-            this.dispatch({
-                type: 'SET_DATE',
-                dateMarker: this.dateEnv.addYears(this.state.currentDate, -1)
-            });
-        };
-        Calendar.prototype.nextYear = function () {
-            this.unselect();
-            this.dispatch({
-                type: 'SET_DATE',
-                dateMarker: this.dateEnv.addYears(this.state.currentDate, 1)
-            });
-        };
-        Calendar.prototype.today = function () {
-            this.unselect();
-            this.dispatch({
-                type: 'SET_DATE',
-                dateMarker: this.getNow()
-            });
-        };
-        Calendar.prototype.gotoDate = function (zonedDateInput) {
-            this.unselect();
-            this.dispatch({
-                type: 'SET_DATE',
-                dateMarker: this.dateEnv.createMarker(zonedDateInput)
-            });
-        };
-        Calendar.prototype.incrementDate = function (deltaInput) {
-            var delta = createDuration(deltaInput);
-            if (delta) { // else, warn about invalid input?
-                this.unselect();
-                this.dispatch({
-                    type: 'SET_DATE',
-                    dateMarker: this.dateEnv.add(this.state.currentDate, delta)
-                });
-            }
-        };
-        // for external API
-        Calendar.prototype.getDate = function () {
-            return this.dateEnv.toDate(this.state.currentDate);
-        };
-        // Date Formatting Utils
-        // -----------------------------------------------------------------------------------------------------------------
-        Calendar.prototype.formatDate = function (d, formatter) {
-            var dateEnv = this.dateEnv;
-            return dateEnv.format(dateEnv.createMarker(d), createFormatter(formatter));
-        };
-        // `settings` is for formatter AND isEndExclusive
-        Calendar.prototype.formatRange = function (d0, d1, settings) {
-            var dateEnv = this.dateEnv;
-            return dateEnv.formatRange(dateEnv.createMarker(d0), dateEnv.createMarker(d1), createFormatter(settings, this.opt('defaultRangeSeparator')), settings);
-        };
-        Calendar.prototype.formatIso = function (d, omitTime) {
-            var dateEnv = this.dateEnv;
-            return dateEnv.formatIso(dateEnv.createMarker(d), { omitTime: omitTime });
-        };
-        // Sizing
-        // -----------------------------------------------------------------------------------------------------------------
-        Calendar.prototype.windowResize = function (ev) {
-            if (!this.isHandlingWindowResize &&
-                this.component && // why?
-                ev.target === window // not a jqui resize event
-            ) {
-                this.isHandlingWindowResize = true;
-                this.updateSize();
-                this.publiclyTrigger('windowResize', [this.view]);
-                this.isHandlingWindowResize = false;
-            }
-        };
-        Calendar.prototype.updateSize = function () {
-            if (this.component) { // when?
-                this.component.updateSize(true);
-            }
-        };
-        // Component Registration
-        // -----------------------------------------------------------------------------------------------------------------
-        Calendar.prototype.registerInteractiveComponent = function (component, settingsInput) {
-            var settings = parseInteractionSettings(component, settingsInput);
-            var DEFAULT_INTERACTIONS = [
-                EventClicking,
-                EventHovering
-            ];
-            var interactionClasses = DEFAULT_INTERACTIONS.concat(this.pluginSystem.hooks.componentInteractions);
-            var interactions = interactionClasses.map(function (interactionClass) {
-                return new interactionClass(settings);
-            });
-            this.interactionsStore[component.uid] = interactions;
-            interactionSettingsStore[component.uid] = settings;
-        };
-        Calendar.prototype.unregisterInteractiveComponent = function (component) {
-            for (var _i = 0, _a = this.interactionsStore[component.uid]; _i < _a.length; _i++) {
-                var listener = _a[_i];
-                listener.destroy();
-            }
-            delete this.interactionsStore[component.uid];
-            delete interactionSettingsStore[component.uid];
-        };
-        // Date Selection / Event Selection / DayClick
-        // -----------------------------------------------------------------------------------------------------------------
-        // this public method receives start/end dates in any format, with any timezone
-        // NOTE: args were changed from v3
-        Calendar.prototype.select = function (dateOrObj, endDate) {
-            var selectionInput;
-            if (endDate == null) {
-                if (dateOrObj.start != null) {
-                    selectionInput = dateOrObj;
-                }
-                else {
-                    selectionInput = {
-                        start: dateOrObj,
-                        end: null
-                    };
-                }
-            }
-            else {
-                selectionInput = {
-                    start: dateOrObj,
-                    end: endDate
-                };
-            }
-            var selection = parseDateSpan(selectionInput, this.dateEnv, createDuration({ days: 1 }) // TODO: cache this?
-            );
-            if (selection) { // throw parse error otherwise?
-                this.dispatch({ type: 'SELECT_DATES', selection: selection });
-                this.triggerDateSelect(selection);
-            }
-        };
-        // public method
-        Calendar.prototype.unselect = function (pev) {
-            if (this.state.dateSelection) {
-                this.dispatch({ type: 'UNSELECT_DATES' });
-                this.triggerDateUnselect(pev);
-            }
-        };
-        Calendar.prototype.triggerDateSelect = function (selection, pev) {
-            var arg = __assign({}, this.buildDateSpanApi(selection), { jsEvent: pev ? pev.origEvent : null, view: this.view });
-            this.publiclyTrigger('select', [arg]);
-        };
-        Calendar.prototype.triggerDateUnselect = function (pev) {
-            this.publiclyTrigger('unselect', [
-                {
-                    jsEvent: pev ? pev.origEvent : null,
-                    view: this.view
-                }
-            ]);
-        };
-        // TODO: receive pev?
-        Calendar.prototype.triggerDateClick = function (dateSpan, dayEl, view, ev) {
-            var arg = __assign({}, this.buildDatePointApi(dateSpan), { dayEl: dayEl, jsEvent: ev, // Is this always a mouse event? See #4655
-                view: view });
-            this.publiclyTrigger('dateClick', [arg]);
-        };
-        Calendar.prototype.buildDatePointApi = function (dateSpan) {
-            var props = {};
-            for (var _i = 0, _a = this.pluginSystem.hooks.datePointTransforms; _i < _a.length; _i++) {
-                var transform = _a[_i];
-                __assign(props, transform(dateSpan, this));
-            }
-            __assign(props, buildDatePointApi(dateSpan, this.dateEnv));
-            return props;
-        };
-        Calendar.prototype.buildDateSpanApi = function (dateSpan) {
-            var props = {};
-            for (var _i = 0, _a = this.pluginSystem.hooks.dateSpanTransforms; _i < _a.length; _i++) {
-                var transform = _a[_i];
-                __assign(props, transform(dateSpan, this));
-            }
-            __assign(props, buildDateSpanApi(dateSpan, this.dateEnv));
-            return props;
-        };
-        // Date Utils
-        // -----------------------------------------------------------------------------------------------------------------
-        // Returns a DateMarker for the current date, as defined by the client's computer or from the `now` option
-        Calendar.prototype.getNow = function () {
-            var now = this.opt('now');
-            if (typeof now === 'function') {
-                now = now();
-            }
-            if (now == null) {
-                return this.dateEnv.createNowMarker();
-            }
-            return this.dateEnv.createMarker(now);
-        };
-        // Event-Date Utilities
-        // -----------------------------------------------------------------------------------------------------------------
-        // Given an event's allDay status and start date, return what its fallback end date should be.
-        // TODO: rename to computeDefaultEventEnd
-        Calendar.prototype.getDefaultEventEnd = function (allDay, marker) {
-            var end = marker;
-            if (allDay) {
-                end = startOfDay(end);
-                end = this.dateEnv.add(end, this.defaultAllDayEventDuration);
-            }
-            else {
-                end = this.dateEnv.add(end, this.defaultTimedEventDuration);
-            }
-            return end;
-        };
-        // Public Events API
-        // -----------------------------------------------------------------------------------------------------------------
-        Calendar.prototype.addEvent = function (eventInput, sourceInput) {
-            if (eventInput instanceof EventApi) {
-                var def = eventInput._def;
-                var instance = eventInput._instance;
-                // not already present? don't want to add an old snapshot
-                if (!this.state.eventStore.defs[def.defId]) {
-                    this.dispatch({
-                        type: 'ADD_EVENTS',
-                        eventStore: eventTupleToStore({ def: def, instance: instance }) // TODO: better util for two args?
-                    });
-                }
-                return eventInput;
-            }
-            var sourceId;
-            if (sourceInput instanceof EventSourceApi) {
-                sourceId = sourceInput.internalEventSource.sourceId;
-            }
-            else if (sourceInput != null) {
-                var sourceApi = this.getEventSourceById(sourceInput); // TODO: use an internal function
-                if (!sourceApi) {
-                    console.warn('Could not find an event source with ID "' + sourceInput + '"'); // TODO: test
-                    return null;
-                }
-                else {
-                    sourceId = sourceApi.internalEventSource.sourceId;
-                }
-            }
-            var tuple = parseEvent(eventInput, sourceId, this);
-            if (tuple) {
-                this.dispatch({
-                    type: 'ADD_EVENTS',
-                    eventStore: eventTupleToStore(tuple)
-                });
-                return new EventApi(this, tuple.def, tuple.def.recurringDef ? null : tuple.instance);
-            }
-            return null;
-        };
-        // TODO: optimize
-        Calendar.prototype.getEventById = function (id) {
-            var _a = this.state.eventStore, defs = _a.defs, instances = _a.instances;
-            id = String(id);
-            for (var defId in defs) {
-                var def = defs[defId];
-                if (def.publicId === id) {
-                    if (def.recurringDef) {
-                        return new EventApi(this, def, null);
-                    }
-                    else {
-                        for (var instanceId in instances) {
-                            var instance = instances[instanceId];
-                            if (instance.defId === def.defId) {
-                                return new EventApi(this, def, instance);
-                            }
-                        }
-                    }
-                }
-            }
-            return null;
-        };
-        Calendar.prototype.getEvents = function () {
-            var _a = this.state.eventStore, defs = _a.defs, instances = _a.instances;
-            var eventApis = [];
-            for (var id in instances) {
-                var instance = instances[id];
-                var def = defs[instance.defId];
-                eventApis.push(new EventApi(this, def, instance));
-            }
-            return eventApis;
-        };
-        Calendar.prototype.removeAllEvents = function () {
-            this.dispatch({ type: 'REMOVE_ALL_EVENTS' });
-        };
-        Calendar.prototype.rerenderEvents = function () {
-            this.dispatch({ type: 'RESET_EVENTS' });
-        };
-        // Public Event Sources API
-        // -----------------------------------------------------------------------------------------------------------------
-        Calendar.prototype.getEventSources = function () {
-            var sourceHash = this.state.eventSources;
-            var sourceApis = [];
-            for (var internalId in sourceHash) {
-                sourceApis.push(new EventSourceApi(this, sourceHash[internalId]));
-            }
-            return sourceApis;
-        };
-        Calendar.prototype.getEventSourceById = function (id) {
-            var sourceHash = this.state.eventSources;
-            id = String(id);
-            for (var sourceId in sourceHash) {
-                if (sourceHash[sourceId].publicId === id) {
-                    return new EventSourceApi(this, sourceHash[sourceId]);
-                }
-            }
-            return null;
-        };
-        Calendar.prototype.addEventSource = function (sourceInput) {
-            if (sourceInput instanceof EventSourceApi) {
-                // not already present? don't want to add an old snapshot
-                if (!this.state.eventSources[sourceInput.internalEventSource.sourceId]) {
-                    this.dispatch({
-                        type: 'ADD_EVENT_SOURCES',
-                        sources: [sourceInput.internalEventSource]
-                    });
-                }
-                return sourceInput;
-            }
-            var eventSource = parseEventSource(sourceInput, this);
-            if (eventSource) { // TODO: error otherwise?
-                this.dispatch({ type: 'ADD_EVENT_SOURCES', sources: [eventSource] });
-                return new EventSourceApi(this, eventSource);
-            }
-            return null;
-        };
-        Calendar.prototype.removeAllEventSources = function () {
-            this.dispatch({ type: 'REMOVE_ALL_EVENT_SOURCES' });
-        };
-        Calendar.prototype.refetchEvents = function () {
-            this.dispatch({ type: 'FETCH_EVENT_SOURCES' });
-        };
-        // Scroll
-        // -----------------------------------------------------------------------------------------------------------------
-        Calendar.prototype.scrollToTime = function (timeInput) {
-            var duration = createDuration(timeInput);
-            if (duration) {
-                this.component.view.scrollToDuration(duration);
-            }
-        };
-        return Calendar;
-    }());
-    EmitterMixin.mixInto(Calendar);
-    // for memoizers
-    // -----------------------------------------------------------------------------------------------------------------
-    function buildDateEnv(locale, timeZone, namedTimeZoneImpl, firstDay, weekNumberCalculation, weekLabel, cmdFormatter) {
-        return new DateEnv({
-            calendarSystem: 'gregory',
-            timeZone: timeZone,
-            namedTimeZoneImpl: namedTimeZoneImpl,
-            locale: locale,
-            weekNumberCalculation: weekNumberCalculation,
-            firstDay: firstDay,
-            weekLabel: weekLabel,
-            cmdFormatter: cmdFormatter
-        });
-    }
-    function buildTheme(calendarOptions) {
-        var themeClass = this.pluginSystem.hooks.themeClasses[calendarOptions.themeSystem] || StandardTheme;
-        return new themeClass(calendarOptions);
-    }
-    function buildDelayedRerender(wait) {
-        var func = this.tryRerender.bind(this);
-        if (wait != null) {
-            func = debounce(func, wait);
-        }
-        return func;
-    }
-    function buildEventUiBySource(eventSources) {
-        return mapHash(eventSources, function (eventSource) {
-            return eventSource.ui;
-        });
-    }
-    function buildEventUiBases(eventDefs, eventUiSingleBase, eventUiBySource) {
-        var eventUiBases = { '': eventUiSingleBase };
-        for (var defId in eventDefs) {
-            var def = eventDefs[defId];
-            if (def.sourceId && eventUiBySource[def.sourceId]) {
-                eventUiBases[defId] = eventUiBySource[def.sourceId];
-            }
-        }
-        return eventUiBases;
-    }
-
-    var View = /** @class */ (function (_super) {
-        __extends(View, _super);
-        function View(context, viewSpec, dateProfileGenerator, parentEl) {
-            var _this = _super.call(this, context, createElement('div', { className: 'fc-view fc-' + viewSpec.type + '-view' }), true // isView (HACK)
-            ) || this;
-            _this.renderDatesMem = memoizeRendering(_this.renderDatesWrap, _this.unrenderDatesWrap);
-            _this.renderBusinessHoursMem = memoizeRendering(_this.renderBusinessHours, _this.unrenderBusinessHours, [_this.renderDatesMem]);
-            _this.renderDateSelectionMem = memoizeRendering(_this.renderDateSelectionWrap, _this.unrenderDateSelectionWrap, [_this.renderDatesMem]);
-            _this.renderEventsMem = memoizeRendering(_this.renderEvents, _this.unrenderEvents, [_this.renderDatesMem]);
-            _this.renderEventSelectionMem = memoizeRendering(_this.renderEventSelectionWrap, _this.unrenderEventSelectionWrap, [_this.renderEventsMem]);
-            _this.renderEventDragMem = memoizeRendering(_this.renderEventDragWrap, _this.unrenderEventDragWrap, [_this.renderDatesMem]);
-            _this.renderEventResizeMem = memoizeRendering(_this.renderEventResizeWrap, _this.unrenderEventResizeWrap, [_this.renderDatesMem]);
-            _this.viewSpec = viewSpec;
-            _this.dateProfileGenerator = dateProfileGenerator;
-            _this.type = viewSpec.type;
-            _this.eventOrderSpecs = parseFieldSpecs(_this.opt('eventOrder'));
-            _this.nextDayThreshold = createDuration(_this.opt('nextDayThreshold'));
-            parentEl.appendChild(_this.el);
-            _this.initialize();
-            return _this;
-        }
-        View.prototype.initialize = function () {
-        };
-        Object.defineProperty(View.prototype, "activeStart", {
-            // Date Setting/Unsetting
-            // -----------------------------------------------------------------------------------------------------------------
-            get: function () {
-                return this.dateEnv.toDate(this.props.dateProfile.activeRange.start);
-            },
-            enumerable: true,
-            configurable: true
-        });
-        Object.defineProperty(View.prototype, "activeEnd", {
-            get: function () {
-                return this.dateEnv.toDate(this.props.dateProfile.activeRange.end);
-            },
-            enumerable: true,
-            configurable: true
-        });
-        Object.defineProperty(View.prototype, "currentStart", {
-            get: function () {
-                return this.dateEnv.toDate(this.props.dateProfile.currentRange.start);
-            },
-            enumerable: true,
-            configurable: true
-        });
-        Object.defineProperty(View.prototype, "currentEnd", {
-            get: function () {
-                return this.dateEnv.toDate(this.props.dateProfile.currentRange.end);
-            },
-            enumerable: true,
-            configurable: true
-        });
-        // General Rendering
-        // -----------------------------------------------------------------------------------------------------------------
-        View.prototype.render = function (props) {
-            this.renderDatesMem(props.dateProfile);
-            this.renderBusinessHoursMem(props.businessHours);
-            this.renderDateSelectionMem(props.dateSelection);
-            this.renderEventsMem(props.eventStore);
-            this.renderEventSelectionMem(props.eventSelection);
-            this.renderEventDragMem(props.eventDrag);
-            this.renderEventResizeMem(props.eventResize);
-        };
-        View.prototype.destroy = function () {
-            _super.prototype.destroy.call(this);
-            this.renderDatesMem.unrender(); // should unrender everything else
-        };
-        // Sizing
-        // -----------------------------------------------------------------------------------------------------------------
-        View.prototype.updateSize = function (isResize, viewHeight, isAuto) {
-            var calendar = this.calendar;
-            if (isResize || // HACKS...
-                calendar.isViewUpdated ||
-                calendar.isDatesUpdated ||
-                calendar.isEventsUpdated) {
-                // sort of the catch-all sizing
-                // anything that might cause dimension changes
-                this.updateBaseSize(isResize, viewHeight, isAuto);
-            }
-        };
-        View.prototype.updateBaseSize = function (isResize, viewHeight, isAuto) {
-        };
-        // Date Rendering
-        // -----------------------------------------------------------------------------------------------------------------
-        View.prototype.renderDatesWrap = function (dateProfile) {
-            this.renderDates(dateProfile);
-            this.addScroll({
-                duration: createDuration(this.opt('scrollTime'))
-            });
-            this.startNowIndicator(dateProfile); // shouldn't render yet because updateSize will be called soon
-        };
-        View.prototype.unrenderDatesWrap = function () {
-            this.stopNowIndicator();
-            this.unrenderDates();
-        };
-        View.prototype.renderDates = function (dateProfile) { };
-        View.prototype.unrenderDates = function () { };
-        // Business Hours
-        // -----------------------------------------------------------------------------------------------------------------
-        View.prototype.renderBusinessHours = function (businessHours) { };
-        View.prototype.unrenderBusinessHours = function () { };
-        // Date Selection
-        // -----------------------------------------------------------------------------------------------------------------
-        View.prototype.renderDateSelectionWrap = function (selection) {
-            if (selection) {
-                this.renderDateSelection(selection);
-            }
-        };
-        View.prototype.unrenderDateSelectionWrap = function (selection) {
-            if (selection) {
-                this.unrenderDateSelection(selection);
-            }
-        };
-        View.prototype.renderDateSelection = function (selection) { };
-        View.prototype.unrenderDateSelection = function (selection) { };
-        // Event Rendering
-        // -----------------------------------------------------------------------------------------------------------------
-        View.prototype.renderEvents = function (eventStore) { };
-        View.prototype.unrenderEvents = function () { };
-        // util for subclasses
-        View.prototype.sliceEvents = function (eventStore, allDay) {
-            var props = this.props;
-            return sliceEventStore(eventStore, props.eventUiBases, props.dateProfile.activeRange, allDay ? this.nextDayThreshold : null).fg;
-        };
-        View.prototype.computeEventDraggable = function (eventDef, eventUi) {
-            var transformers = this.calendar.pluginSystem.hooks.isDraggableTransformers;
-            var val = eventUi.startEditable;
-            for (var _i = 0, transformers_1 = transformers; _i < transformers_1.length; _i++) {
-                var transformer = transformers_1[_i];
-                val = transformer(val, eventDef, eventUi, this);
-            }
-            return val;
-        };
-        View.prototype.computeEventStartResizable = function (eventDef, eventUi) {
-            return eventUi.durationEditable && this.opt('eventResizableFromStart');
-        };
-        View.prototype.computeEventEndResizable = function (eventDef, eventUi) {
-            return eventUi.durationEditable;
-        };
-        // Event Selection
-        // -----------------------------------------------------------------------------------------------------------------
-        View.prototype.renderEventSelectionWrap = function (instanceId) {
-            if (instanceId) {
-                this.renderEventSelection(instanceId);
-            }
-        };
-        View.prototype.unrenderEventSelectionWrap = function (instanceId) {
-            if (instanceId) {
-                this.unrenderEventSelection(instanceId);
-            }
-        };
-        View.prototype.renderEventSelection = function (instanceId) { };
-        View.prototype.unrenderEventSelection = function (instanceId) { };
-        // Event Drag
-        // -----------------------------------------------------------------------------------------------------------------
-        View.prototype.renderEventDragWrap = function (state) {
-            if (state) {
-                this.renderEventDrag(state);
-            }
-        };
-        View.prototype.unrenderEventDragWrap = function (state) {
-            if (state) {
-                this.unrenderEventDrag(state);
-            }
-        };
-        View.prototype.renderEventDrag = function (state) { };
-        View.prototype.unrenderEventDrag = function (state) { };
-        // Event Resize
-        // -----------------------------------------------------------------------------------------------------------------
-        View.prototype.renderEventResizeWrap = function (state) {
-            if (state) {
-                this.renderEventResize(state);
-            }
-        };
-        View.prototype.unrenderEventResizeWrap = function (state) {
-            if (state) {
-                this.unrenderEventResize(state);
-            }
-        };
-        View.prototype.renderEventResize = function (state) { };
-        View.prototype.unrenderEventResize = function (state) { };
-        /* Now Indicator
-        ------------------------------------------------------------------------------------------------------------------*/
-        // Immediately render the current time indicator and begins re-rendering it at an interval,
-        // which is defined by this.getNowIndicatorUnit().
-        // TODO: somehow do this for the current whole day's background too
-        View.prototype.startNowIndicator = function (dateProfile) {
-            var _this = this;
-            var dateEnv = this.dateEnv;
-            var unit;
-            var update;
-            var delay; // ms wait value
-            if (this.opt('nowIndicator')) {
-                unit = this.getNowIndicatorUnit(dateProfile);
-                if (unit) {
-                    update = this.updateNowIndicator.bind(this);
-                    this.initialNowDate = this.calendar.getNow();
-                    this.initialNowQueriedMs = new Date().valueOf();
-                    // wait until the beginning of the next interval
-                    delay = dateEnv.add(dateEnv.startOf(this.initialNowDate, unit), createDuration(1, unit)).valueOf() - this.initialNowDate.valueOf();
-                    // TODO: maybe always use setTimeout, waiting until start of next unit
-                    this.nowIndicatorTimeoutID = setTimeout(function () {
-                        _this.nowIndicatorTimeoutID = null;
-                        update();
-                        if (unit === 'second') {
-                            delay = 1000; // every second
-                        }
-                        else {
-                            delay = 1000 * 60; // otherwise, every minute
-                        }
-                        _this.nowIndicatorIntervalID = setInterval(update, delay); // update every interval
-                    }, delay);
-                }
-                // rendering will be initiated in updateSize
-            }
-        };
-        // rerenders the now indicator, computing the new current time from the amount of time that has passed
-        // since the initial getNow call.
-        View.prototype.updateNowIndicator = function () {
-            if (this.props.dateProfile && // a way to determine if dates were rendered yet
-                this.initialNowDate // activated before?
-            ) {
-                this.unrenderNowIndicator(); // won't unrender if unnecessary
-                this.renderNowIndicator(addMs(this.initialNowDate, new Date().valueOf() - this.initialNowQueriedMs));
-                this.isNowIndicatorRendered = true;
-            }
-        };
-        // Immediately unrenders the view's current time indicator and stops any re-rendering timers.
-        // Won't cause side effects if indicator isn't rendered.
-        View.prototype.stopNowIndicator = function () {
-            if (this.isNowIndicatorRendered) {
-                if (this.nowIndicatorTimeoutID) {
-                    clearTimeout(this.nowIndicatorTimeoutID);
-                    this.nowIndicatorTimeoutID = null;
-                }
-                if (this.nowIndicatorIntervalID) {
-                    clearInterval(this.nowIndicatorIntervalID);
-                    this.nowIndicatorIntervalID = null;
-                }
-                this.unrenderNowIndicator();
-                this.isNowIndicatorRendered = false;
-            }
-        };
-        View.prototype.getNowIndicatorUnit = function (dateProfile) {
-            // subclasses should implement
-        };
-        // Renders a current time indicator at the given datetime
-        View.prototype.renderNowIndicator = function (date) {
-            // SUBCLASSES MUST PASS TO CHILDREN!
-        };
-        // Undoes the rendering actions from renderNowIndicator
-        View.prototype.unrenderNowIndicator = function () {
-            // SUBCLASSES MUST PASS TO CHILDREN!
-        };
-        /* Scroller
-        ------------------------------------------------------------------------------------------------------------------*/
-        View.prototype.addScroll = function (scroll) {
-            var queuedScroll = this.queuedScroll || (this.queuedScroll = {});
-            __assign(queuedScroll, scroll);
-        };
-        View.prototype.popScroll = function (isResize) {
-            this.applyQueuedScroll(isResize);
-            this.queuedScroll = null;
-        };
-        View.prototype.applyQueuedScroll = function (isResize) {
-            this.applyScroll(this.queuedScroll || {}, isResize);
-        };
-        View.prototype.queryScroll = function () {
-            var scroll = {};
-            if (this.props.dateProfile) { // dates rendered yet?
-                __assign(scroll, this.queryDateScroll());
-            }
-            return scroll;
-        };
-        View.prototype.applyScroll = function (scroll, isResize) {
-            var duration = scroll.duration;
-            if (duration != null) {
-                delete scroll.duration;
-                if (this.props.dateProfile) { // dates rendered yet?
-                    __assign(scroll, this.computeDateScroll(duration));
-                }
-            }
-            if (this.props.dateProfile) { // dates rendered yet?
-                this.applyDateScroll(scroll);
-            }
-        };
-        View.prototype.computeDateScroll = function (duration) {
-            return {}; // subclasses must implement
-        };
-        View.prototype.queryDateScroll = function () {
-            return {}; // subclasses must implement
-        };
-        View.prototype.applyDateScroll = function (scroll) {
-            // subclasses must implement
-        };
-        // for API
-        View.prototype.scrollToDuration = function (duration) {
-            this.applyScroll({ duration: duration }, false);
-        };
-        return View;
-    }(DateComponent));
-    EmitterMixin.mixInto(View);
-    View.prototype.usesMinMaxTime = false;
-    View.prototype.dateProfileGeneratorClass = DateProfileGenerator;
-
-    var FgEventRenderer = /** @class */ (function () {
-        function FgEventRenderer(context) {
-            this.segs = [];
-            this.isSizeDirty = false;
-            this.context = context;
-        }
-        FgEventRenderer.prototype.renderSegs = function (segs, mirrorInfo) {
-            this.rangeUpdated(); // called too frequently :(
-            // render an `.el` on each seg
-            // returns a subset of the segs. segs that were actually rendered
-            segs = this.renderSegEls(segs, mirrorInfo);
-            this.segs = segs;
-            this.attachSegs(segs, mirrorInfo);
-            this.isSizeDirty = true;
-            this.context.view.triggerRenderedSegs(this.segs, Boolean(mirrorInfo));
-        };
-        FgEventRenderer.prototype.unrender = function (_segs, mirrorInfo) {
-            this.context.view.triggerWillRemoveSegs(this.segs, Boolean(mirrorInfo));
-            this.detachSegs(this.segs);
-            this.segs = [];
-        };
-        // Updates values that rely on options and also relate to range
-        FgEventRenderer.prototype.rangeUpdated = function () {
-            var options = this.context.options;
-            var displayEventTime;
-            var displayEventEnd;
-            this.eventTimeFormat = createFormatter(options.eventTimeFormat || this.computeEventTimeFormat(), options.defaultRangeSeparator);
-            displayEventTime = options.displayEventTime;
-            if (displayEventTime == null) {
-                displayEventTime = this.computeDisplayEventTime(); // might be based off of range
-            }
-            displayEventEnd = options.displayEventEnd;
-            if (displayEventEnd == null) {
-                displayEventEnd = this.computeDisplayEventEnd(); // might be based off of range
-            }
-            this.displayEventTime = displayEventTime;
-            this.displayEventEnd = displayEventEnd;
-        };
-        // Renders and assigns an `el` property for each foreground event segment.
-        // Only returns segments that successfully rendered.
-        FgEventRenderer.prototype.renderSegEls = function (segs, mirrorInfo) {
-            var html = '';
-            var i;
-            if (segs.length) { // don't build an empty html string
-                // build a large concatenation of event segment HTML
-                for (i = 0; i < segs.length; i++) {
-                    html += this.renderSegHtml(segs[i], mirrorInfo);
-                }
-                // Grab individual elements from the combined HTML string. Use each as the default rendering.
-                // Then, compute the 'el' for each segment. An el might be null if the eventRender callback returned false.
-                htmlToElements(html).forEach(function (el, i) {
-                    var seg = segs[i];
-                    if (el) {
-                        seg.el = el;
-                    }
-                });
-                segs = filterSegsViaEls(this.context.view, segs, Boolean(mirrorInfo));
-            }
-            return segs;
-        };
-        // Generic utility for generating the HTML classNames for an event segment's element
-        FgEventRenderer.prototype.getSegClasses = function (seg, isDraggable, isResizable, mirrorInfo) {
-            var classes = [
-                'fc-event',
-                seg.isStart ? 'fc-start' : 'fc-not-start',
-                seg.isEnd ? 'fc-end' : 'fc-not-end'
-            ].concat(seg.eventRange.ui.classNames);
-            if (isDraggable) {
-                classes.push('fc-draggable');
-            }
-            if (isResizable) {
-                classes.push('fc-resizable');
-            }
-            if (mirrorInfo) {
-                classes.push('fc-mirror');
-                if (mirrorInfo.isDragging) {
-                    classes.push('fc-dragging');
-                }
-                if (mirrorInfo.isResizing) {
-                    classes.push('fc-resizing');
-                }
-            }
-            return classes;
-        };
-        // Compute the text that should be displayed on an event's element.
-        // `range` can be the Event object itself, or something range-like, with at least a `start`.
-        // If event times are disabled, or the event has no time, will return a blank string.
-        // If not specified, formatter will default to the eventTimeFormat setting,
-        // and displayEnd will default to the displayEventEnd setting.
-        FgEventRenderer.prototype.getTimeText = function (eventRange, formatter, displayEnd) {
-            var def = eventRange.def, instance = eventRange.instance;
-            return this._getTimeText(instance.range.start, def.hasEnd ? instance.range.end : null, def.allDay, formatter, displayEnd, instance.forcedStartTzo, instance.forcedEndTzo);
-        };
-        FgEventRenderer.prototype._getTimeText = function (start, end, allDay, formatter, displayEnd, forcedStartTzo, forcedEndTzo) {
-            var dateEnv = this.context.dateEnv;
-            if (formatter == null) {
-                formatter = this.eventTimeFormat;
-            }
-            if (displayEnd == null) {
-                displayEnd = this.displayEventEnd;
-            }
-            if (this.displayEventTime && !allDay) {
-                if (displayEnd && end) {
-                    return dateEnv.formatRange(start, end, formatter, {
-                        forcedStartTzo: forcedStartTzo,
-                        forcedEndTzo: forcedEndTzo
-                    });
-                }
-                else {
-                    return dateEnv.format(start, formatter, {
-                        forcedTzo: forcedStartTzo
-                    });
-                }
-            }
-            return '';
-        };
-        FgEventRenderer.prototype.computeEventTimeFormat = function () {
-            return {
-                hour: 'numeric',
-                minute: '2-digit',
-                omitZeroMinute: true
-            };
-        };
-        FgEventRenderer.prototype.computeDisplayEventTime = function () {
-            return true;
-        };
-        FgEventRenderer.prototype.computeDisplayEventEnd = function () {
-            return true;
-        };
-        // Utility for generating event skin-related CSS properties
-        FgEventRenderer.prototype.getSkinCss = function (ui) {
-            return {
-                'background-color': ui.backgroundColor,
-                'border-color': ui.borderColor,
-                color: ui.textColor
-            };
-        };
-        FgEventRenderer.prototype.sortEventSegs = function (segs) {
-            var specs = this.context.view.eventOrderSpecs;
-            var objs = segs.map(buildSegCompareObj);
-            objs.sort(function (obj0, obj1) {
-                return compareByFieldSpecs(obj0, obj1, specs);
-            });
-            return objs.map(function (c) {
-                return c._seg;
-            });
-        };
-        FgEventRenderer.prototype.computeSizes = function (force) {
-            if (force || this.isSizeDirty) {
-                this.computeSegSizes(this.segs);
-            }
-        };
-        FgEventRenderer.prototype.assignSizes = function (force) {
-            if (force || this.isSizeDirty) {
-                this.assignSegSizes(this.segs);
-                this.isSizeDirty = false;
-            }
-        };
-        FgEventRenderer.prototype.computeSegSizes = function (segs) {
-        };
-        FgEventRenderer.prototype.assignSegSizes = function (segs) {
-        };
-        // Manipulation on rendered segs
-        FgEventRenderer.prototype.hideByHash = function (hash) {
-            if (hash) {
-                for (var _i = 0, _a = this.segs; _i < _a.length; _i++) {
-                    var seg = _a[_i];
-                    if (hash[seg.eventRange.instance.instanceId]) {
-                        seg.el.style.visibility = 'hidden';
-                    }
-                }
-            }
-        };
-        FgEventRenderer.prototype.showByHash = function (hash) {
-            if (hash) {
-                for (var _i = 0, _a = this.segs; _i < _a.length; _i++) {
-                    var seg = _a[_i];
-                    if (hash[seg.eventRange.instance.instanceId]) {
-                        seg.el.style.visibility = '';
-                    }
-                }
-            }
-        };
-        FgEventRenderer.prototype.selectByInstanceId = function (instanceId) {
-            if (instanceId) {
-                for (var _i = 0, _a = this.segs; _i < _a.length; _i++) {
-                    var seg = _a[_i];
-                    var eventInstance = seg.eventRange.instance;
-                    if (eventInstance && eventInstance.instanceId === instanceId &&
-                        seg.el // necessary?
-                    ) {
-                        seg.el.classList.add('fc-selected');
-                    }
-                }
-            }
-        };
-        FgEventRenderer.prototype.unselectByInstanceId = function (instanceId) {
-            if (instanceId) {
-                for (var _i = 0, _a = this.segs; _i < _a.length; _i++) {
-                    var seg = _a[_i];
-                    if (seg.el) { // necessary?
-                        seg.el.classList.remove('fc-selected');
-                    }
-                }
-            }
-        };
-        return FgEventRenderer;
-    }());
-    // returns a object with all primitive props that can be compared
-    function buildSegCompareObj(seg) {
-        var eventDef = seg.eventRange.def;
-        var range = seg.eventRange.instance.range;
-        var start = range.start ? range.start.valueOf() : 0; // TODO: better support for open-range events
-        var end = range.end ? range.end.valueOf() : 0; // "
-        return __assign({}, eventDef.extendedProps, eventDef, { id: eventDef.publicId, start: start,
-            end: end, duration: end - start, allDay: Number(eventDef.allDay), _seg: seg // for later retrieval
-         });
-    }
-
-    var FillRenderer = /** @class */ (function () {
-        function FillRenderer(context) {
-            this.fillSegTag = 'div';
-            this.dirtySizeFlags = {};
-            this.context = context;
-            this.containerElsByType = {};
-            this.segsByType = {};
-        }
-        FillRenderer.prototype.getSegsByType = function (type) {
-            return this.segsByType[type] || [];
-        };
-        FillRenderer.prototype.renderSegs = function (type, segs) {
-            var _a;
-            var renderedSegs = this.renderSegEls(type, segs); // assignes `.el` to each seg. returns successfully rendered segs
-            var containerEls = this.attachSegs(type, renderedSegs);
-            if (containerEls) {
-                (_a = (this.containerElsByType[type] || (this.containerElsByType[type] = []))).push.apply(_a, containerEls);
-            }
-            this.segsByType[type] = renderedSegs;
-            if (type === 'bgEvent') {
-                this.context.view.triggerRenderedSegs(renderedSegs, false); // isMirror=false
-            }
-            this.dirtySizeFlags[type] = true;
-        };
-        // Unrenders a specific type of fill that is currently rendered on the grid
-        FillRenderer.prototype.unrender = function (type) {
-            var segs = this.segsByType[type];
-            if (segs) {
-                if (type === 'bgEvent') {
-                    this.context.view.triggerWillRemoveSegs(segs, false); // isMirror=false
-                }
-                this.detachSegs(type, segs);
-            }
-        };
-        // Renders and assigns an `el` property for each fill segment. Generic enough to work with different types.
-        // Only returns segments that successfully rendered.
-        FillRenderer.prototype.renderSegEls = function (type, segs) {
-            var _this = this;
-            var html = '';
-            var i;
-            if (segs.length) {
-                // build a large concatenation of segment HTML
-                for (i = 0; i < segs.length; i++) {
-                    html += this.renderSegHtml(type, segs[i]);
-                }
-                // Grab individual elements from the combined HTML string. Use each as the default rendering.
-                // Then, compute the 'el' for each segment.
-                htmlToElements(html).forEach(function (el, i) {
-                    var seg = segs[i];
-                    if (el) {
-                        seg.el = el;
-                    }
-                });
-                if (type === 'bgEvent') {
-                    segs = filterSegsViaEls(this.context.view, segs, false // isMirror. background events can never be mirror elements
-                    );
-                }
-                // correct element type? (would be bad if a non-TD were inserted into a table for example)
-                segs = segs.filter(function (seg) {
-                    return elementMatches(seg.el, _this.fillSegTag);
-                });
-            }
-            return segs;
-        };
-        // Builds the HTML needed for one fill segment. Generic enough to work with different types.
-        FillRenderer.prototype.renderSegHtml = function (type, seg) {
-            var css = null;
-            var classNames = [];
-            if (type !== 'highlight' && type !== 'businessHours') {
-                css = {
-                    'background-color': seg.eventRange.ui.backgroundColor
-                };
-            }
-            if (type !== 'highlight') {
-                classNames = classNames.concat(seg.eventRange.ui.classNames);
-            }
-            if (type === 'businessHours') {
-                classNames.push('fc-bgevent');
-            }
-            else {
-                classNames.push('fc-' + type.toLowerCase());
-            }
-            return '<' + this.fillSegTag +
-                (classNames.length ? ' class="' + classNames.join(' ') + '"' : '') +
-                (css ? ' style="' + cssToStr(css) + '"' : '') +
-                '></' + this.fillSegTag + '>';
-        };
-        FillRenderer.prototype.detachSegs = function (type, segs) {
-            var containerEls = this.containerElsByType[type];
-            if (containerEls) {
-                containerEls.forEach(removeElement);
-                delete this.containerElsByType[type];
-            }
-        };
-        FillRenderer.prototype.computeSizes = function (force) {
-            for (var type in this.segsByType) {
-                if (force || this.dirtySizeFlags[type]) {
-                    this.computeSegSizes(this.segsByType[type]);
-                }
-            }
-        };
-        FillRenderer.prototype.assignSizes = function (force) {
-            for (var type in this.segsByType) {
-                if (force || this.dirtySizeFlags[type]) {
-                    this.assignSegSizes(this.segsByType[type]);
-                }
-            }
-            this.dirtySizeFlags = {};
-        };
-        FillRenderer.prototype.computeSegSizes = function (segs) {
-        };
-        FillRenderer.prototype.assignSegSizes = function (segs) {
-        };
-        return FillRenderer;
-    }());
-
-    var NamedTimeZoneImpl = /** @class */ (function () {
-        function NamedTimeZoneImpl(timeZoneName) {
-            this.timeZoneName = timeZoneName;
-        }
-        return NamedTimeZoneImpl;
-    }());
-
-    /*
-    An abstraction for a dragging interaction originating on an event.
-    Does higher-level things than PointerDragger, such as possibly:
-    - a "mirror" that moves with the pointer
-    - a minimum number of pixels or other criteria for a true drag to begin
-
-    subclasses must emit:
-    - pointerdown
-    - dragstart
-    - dragmove
-    - pointerup
-    - dragend
-    */
-    var ElementDragging = /** @class */ (function () {
-        function ElementDragging(el) {
-            this.emitter = new EmitterMixin();
-        }
-        ElementDragging.prototype.destroy = function () {
-        };
-        ElementDragging.prototype.setMirrorIsVisible = function (bool) {
-            // optional if subclass doesn't want to support a mirror
-        };
-        ElementDragging.prototype.setMirrorNeedsRevert = function (bool) {
-            // optional if subclass doesn't want to support a mirror
-        };
-        ElementDragging.prototype.setAutoScrollEnabled = function (bool) {
-            // optional
-        };
-        return ElementDragging;
-    }());
-
-    function formatDate(dateInput, settings) {
-        if (settings === void 0) { settings = {}; }
-        var dateEnv = buildDateEnv$1(settings);
-        var formatter = createFormatter(settings);
-        var dateMeta = dateEnv.createMarkerMeta(dateInput);
-        if (!dateMeta) { // TODO: warning?
-            return '';
-        }
-        return dateEnv.format(dateMeta.marker, formatter, {
-            forcedTzo: dateMeta.forcedTzo
-        });
-    }
-    function formatRange(startInput, endInput, settings // mixture of env and formatter settings
-    ) {
-        var dateEnv = buildDateEnv$1(typeof settings === 'object' && settings ? settings : {}); // pass in if non-null object
-        var formatter = createFormatter(settings, globalDefaults.defaultRangeSeparator);
-        var startMeta = dateEnv.createMarkerMeta(startInput);
-        var endMeta = dateEnv.createMarkerMeta(endInput);
-        if (!startMeta || !endMeta) { // TODO: warning?
-            return '';
-        }
-        return dateEnv.formatRange(startMeta.marker, endMeta.marker, formatter, {
-            forcedStartTzo: startMeta.forcedTzo,
-            forcedEndTzo: endMeta.forcedTzo,
-            isEndExclusive: settings.isEndExclusive
-        });
-    }
-    // TODO: more DRY and optimized
-    function buildDateEnv$1(settings) {
-        var locale = buildLocale(settings.locale || 'en', parseRawLocales([]).map); // TODO: don't hardcode 'en' everywhere
-        // ensure required settings
-        settings = __assign({ timeZone: globalDefaults.timeZone, calendarSystem: 'gregory' }, settings, { locale: locale });
-        return new DateEnv(settings);
-    }
-
-    var DRAG_META_PROPS = {
-        startTime: createDuration,
-        duration: createDuration,
-        create: Boolean,
-        sourceId: String
-    };
-    var DRAG_META_DEFAULTS = {
-        create: true
-    };
-    function parseDragMeta(raw) {
-        var leftoverProps = {};
-        var refined = refineProps(raw, DRAG_META_PROPS, DRAG_META_DEFAULTS, leftoverProps);
-        refined.leftoverProps = leftoverProps;
-        return refined;
-    }
-
-    // Computes a default column header formatting string if `colFormat` is not explicitly defined
-    function computeFallbackHeaderFormat(datesRepDistinctDays, dayCnt) {
-        // if more than one week row, or if there are a lot of columns with not much space,
-        // put just the day numbers will be in each cell
-        if (!datesRepDistinctDays || dayCnt > 10) {
-            return { weekday: 'short' }; // "Sat"
-        }
-        else if (dayCnt > 1) {
-            return { weekday: 'short', month: 'numeric', day: 'numeric', omitCommas: true }; // "Sat 11/12"
-        }
-        else {
-            return { weekday: 'long' }; // "Saturday"
-        }
-    }
-    function renderDateCell(dateMarker, dateProfile, datesRepDistinctDays, colCnt, colHeadFormat, context, colspan, otherAttrs) {
-        var view = context.view, dateEnv = context.dateEnv, theme = context.theme, options = context.options;
-        var isDateValid = rangeContainsMarker(dateProfile.activeRange, dateMarker); // TODO: called too frequently. cache somehow.
-        var classNames = [
-            'fc-day-header',
-            theme.getClass('widgetHeader')
-        ];
-        var innerHtml;
-        if (typeof options.columnHeaderHtml === 'function') {
-            innerHtml = options.columnHeaderHtml(dateEnv.toDate(dateMarker));
-        }
-        else if (typeof options.columnHeaderText === 'function') {
-            innerHtml = htmlEscape(options.columnHeaderText(dateEnv.toDate(dateMarker)));
-        }
-        else {
-            innerHtml = htmlEscape(dateEnv.format(dateMarker, colHeadFormat));
-        }
-        // if only one row of days, the classNames on the header can represent the specific days beneath
-        if (datesRepDistinctDays) {
-            classNames = classNames.concat(
-            // includes the day-of-week class
-            // noThemeHighlight=true (don't highlight the header)
-            getDayClasses(dateMarker, dateProfile, context, true));
-        }
-        else {
-            classNames.push('fc-' + DAY_IDS[dateMarker.getUTCDay()]); // only add the day-of-week class
-        }
-        return '' +
-            '<th class="' + classNames.join(' ') + '"' +
-            ((isDateValid && datesRepDistinctDays) ?
-                ' data-date="' + dateEnv.formatIso(dateMarker, { omitTime: true }) + '"' :
-                '') +
-            (colspan > 1 ?
-                ' colspan="' + colspan + '"' :
-                '') +
-            (otherAttrs ?
-                ' ' + otherAttrs :
-                '') +
-            '>' +
-            (isDateValid ?
-                // don't make a link if the heading could represent multiple days, or if there's only one day (forceOff)
-                buildGotoAnchorHtml(view, { date: dateMarker, forceOff: !datesRepDistinctDays || colCnt === 1 }, innerHtml) :
-                // if not valid, display text, but no link
-                innerHtml) +
-            '</th>';
-    }
-
-    var DayHeader = /** @class */ (function (_super) {
-        __extends(DayHeader, _super);
-        function DayHeader(context, parentEl) {
-            var _this = _super.call(this, context) || this;
-            parentEl.innerHTML = ''; // because might be nbsp
-            parentEl.appendChild(_this.el = htmlToElement('<div class="fc-row ' + _this.theme.getClass('headerRow') + '">' +
-                '<table class="' + _this.theme.getClass('tableGrid') + '">' +
-                '<thead></thead>' +
-                '</table>' +
-                '</div>'));
-            _this.thead = _this.el.querySelector('thead');
-            return _this;
-        }
-        DayHeader.prototype.destroy = function () {
-            removeElement(this.el);
-        };
-        DayHeader.prototype.render = function (props) {
-            var dates = props.dates, datesRepDistinctDays = props.datesRepDistinctDays;
-            var parts = [];
-            if (props.renderIntroHtml) {
-                parts.push(props.renderIntroHtml());
-            }
-            var colHeadFormat = createFormatter(this.opt('columnHeaderFormat') ||
-                computeFallbackHeaderFormat(datesRepDistinctDays, dates.length));
-            for (var _i = 0, dates_1 = dates; _i < dates_1.length; _i++) {
-                var date = dates_1[_i];
-                parts.push(renderDateCell(date, props.dateProfile, datesRepDistinctDays, dates.length, colHeadFormat, this.context));
-            }
-            if (this.isRtl) {
-                parts.reverse();
-            }
-            this.thead.innerHTML = '<tr>' + parts.join('') + '</tr>';
-        };
-        return DayHeader;
-    }(Component));
-
-    var DaySeries = /** @class */ (function () {
-        function DaySeries(range, dateProfileGenerator) {
-            var date = range.start;
-            var end = range.end;
-            var indices = [];
-            var dates = [];
-            var dayIndex = -1;
-            while (date < end) { // loop each day from start to end
-                if (dateProfileGenerator.isHiddenDay(date)) {
-                    indices.push(dayIndex + 0.5); // mark that it's between indices
-                }
-                else {
-                    dayIndex++;
-                    indices.push(dayIndex);
-                    dates.push(date);
-                }
-                date = addDays(date, 1);
-            }
-            this.dates = dates;
-            this.indices = indices;
-            this.cnt = dates.length;
-        }
-        DaySeries.prototype.sliceRange = function (range) {
-            var firstIndex = this.getDateDayIndex(range.start); // inclusive first index
-            var lastIndex = this.getDateDayIndex(addDays(range.end, -1)); // inclusive last index
-            var clippedFirstIndex = Math.max(0, firstIndex);
-            var clippedLastIndex = Math.min(this.cnt - 1, lastIndex);
-            // deal with in-between indices
-            clippedFirstIndex = Math.ceil(clippedFirstIndex); // in-between starts round to next cell
-            clippedLastIndex = Math.floor(clippedLastIndex); // in-between ends round to prev cell
-            if (clippedFirstIndex <= clippedLastIndex) {
-                return {
-                    firstIndex: clippedFirstIndex,
-                    lastIndex: clippedLastIndex,
-                    isStart: firstIndex === clippedFirstIndex,
-                    isEnd: lastIndex === clippedLastIndex
-                };
-            }
-            else {
-                return null;
-            }
-        };
-        // Given a date, returns its chronolocial cell-index from the first cell of the grid.
-        // If the date lies between cells (because of hiddenDays), returns a floating-point value between offsets.
-        // If before the first offset, returns a negative number.
-        // If after the last offset, returns an offset past the last cell offset.
-        // Only works for *start* dates of cells. Will not work for exclusive end dates for cells.
-        DaySeries.prototype.getDateDayIndex = function (date) {
-            var indices = this.indices;
-            var dayOffset = Math.floor(diffDays(this.dates[0], date));
-            if (dayOffset < 0) {
-                return indices[0] - 1;
-            }
-            else if (dayOffset >= indices.length) {
-                return indices[indices.length - 1] + 1;
-            }
-            else {
-                return indices[dayOffset];
-            }
-        };
-        return DaySeries;
-    }());
-
-    var DayTable = /** @class */ (function () {
-        function DayTable(daySeries, breakOnWeeks) {
-            var dates = daySeries.dates;
-            var daysPerRow;
-            var firstDay;
-            var rowCnt;
-            if (breakOnWeeks) {
-                // count columns until the day-of-week repeats
-                firstDay = dates[0].getUTCDay();
-                for (daysPerRow = 1; daysPerRow < dates.length; daysPerRow++) {
-                    if (dates[daysPerRow].getUTCDay() === firstDay) {
-                        break;
-                    }
-                }
-                rowCnt = Math.ceil(dates.length / daysPerRow);
-            }
-            else {
-                rowCnt = 1;
-                daysPerRow = dates.length;
-            }
-            this.rowCnt = rowCnt;
-            this.colCnt = daysPerRow;
-            this.daySeries = daySeries;
-            this.cells = this.buildCells();
-            this.headerDates = this.buildHeaderDates();
-        }
-        DayTable.prototype.buildCells = function () {
-            var rows = [];
-            for (var row = 0; row < this.rowCnt; row++) {
-                var cells = [];
-                for (var col = 0; col < this.colCnt; col++) {
-                    cells.push(this.buildCell(row, col));
-                }
-                rows.push(cells);
-            }
-            return rows;
-        };
-        DayTable.prototype.buildCell = function (row, col) {
-            return {
-                date: this.daySeries.dates[row * this.colCnt + col]
-            };
-        };
-        DayTable.prototype.buildHeaderDates = function () {
-            var dates = [];
-            for (var col = 0; col < this.colCnt; col++) {
-                dates.push(this.cells[0][col].date);
-            }
-            return dates;
-        };
-        DayTable.prototype.sliceRange = function (range) {
-            var colCnt = this.colCnt;
-            var seriesSeg = this.daySeries.sliceRange(range);
-            var segs = [];
-            if (seriesSeg) {
-                var firstIndex = seriesSeg.firstIndex, lastIndex = seriesSeg.lastIndex;
-                var index = firstIndex;
-                while (index <= lastIndex) {
-                    var row = Math.floor(index / colCnt);
-                    var nextIndex = Math.min((row + 1) * colCnt, lastIndex + 1);
-                    segs.push({
-                        row: row,
-                        firstCol: index % colCnt,
-                        lastCol: (nextIndex - 1) % colCnt,
-                        isStart: seriesSeg.isStart && index === firstIndex,
-                        isEnd: seriesSeg.isEnd && (nextIndex - 1) === lastIndex
-                    });
-                    index = nextIndex;
-                }
-            }
-            return segs;
-        };
-        return DayTable;
-    }());
-
-    var Slicer = /** @class */ (function () {
-        function Slicer() {
-            this.sliceBusinessHours = memoize(this._sliceBusinessHours);
-            this.sliceDateSelection = memoize(this._sliceDateSpan);
-            this.sliceEventStore = memoize(this._sliceEventStore);
-            this.sliceEventDrag = memoize(this._sliceInteraction);
-            this.sliceEventResize = memoize(this._sliceInteraction);
-        }
-        Slicer.prototype.sliceProps = function (props, dateProfile, nextDayThreshold, component) {
-            var extraArgs = [];
-            for (var _i = 4; _i < arguments.length; _i++) {
-                extraArgs[_i - 4] = arguments[_i];
-            }
-            var eventUiBases = props.eventUiBases;
-            var eventSegs = this.sliceEventStore.apply(this, [props.eventStore, eventUiBases, dateProfile, nextDayThreshold, component].concat(extraArgs));
-            return {
-                dateSelectionSegs: this.sliceDateSelection.apply(this, [props.dateSelection, eventUiBases, component].concat(extraArgs)),
-                businessHourSegs: this.sliceBusinessHours.apply(this, [props.businessHours, dateProfile, nextDayThreshold, component].concat(extraArgs)),
-                fgEventSegs: eventSegs.fg,
-                bgEventSegs: eventSegs.bg,
-                eventDrag: this.sliceEventDrag.apply(this, [props.eventDrag, eventUiBases, dateProfile, nextDayThreshold, component].concat(extraArgs)),
-                eventResize: this.sliceEventResize.apply(this, [props.eventResize, eventUiBases, dateProfile, nextDayThreshold, component].concat(extraArgs)),
-                eventSelection: props.eventSelection
-            }; // TODO: give interactionSegs?
-        };
-        Slicer.prototype.sliceNowDate = function (// does not memoize
-        date, component) {
-            var extraArgs = [];
-            for (var _i = 2; _i < arguments.length; _i++) {
-                extraArgs[_i - 2] = arguments[_i];
-            }
-            return this._sliceDateSpan.apply(this, [{ range: { start: date, end: addMs(date, 1) }, allDay: false },
-                {},
-                component].concat(extraArgs));
-        };
-        Slicer.prototype._sliceBusinessHours = function (businessHours, dateProfile, nextDayThreshold, component) {
-            var extraArgs = [];
-            for (var _i = 4; _i < arguments.length; _i++) {
-                extraArgs[_i - 4] = arguments[_i];
-            }
-            if (!businessHours) {
-                return [];
-            }
-            return this._sliceEventStore.apply(this, [expandRecurring(businessHours, computeActiveRange(dateProfile, Boolean(nextDayThreshold)), component.calendar),
-                {},
-                dateProfile,
-                nextDayThreshold,
-                component].concat(extraArgs)).bg;
-        };
-        Slicer.prototype._sliceEventStore = function (eventStore, eventUiBases, dateProfile, nextDayThreshold, component) {
-            var extraArgs = [];
-            for (var _i = 5; _i < arguments.length; _i++) {
-                extraArgs[_i - 5] = arguments[_i];
-            }
-            if (eventStore) {
-                var rangeRes = sliceEventStore(eventStore, eventUiBases, computeActiveRange(dateProfile, Boolean(nextDayThreshold)), nextDayThreshold);
-                return {
-                    bg: this.sliceEventRanges(rangeRes.bg, component, extraArgs),
-                    fg: this.sliceEventRanges(rangeRes.fg, component, extraArgs)
-                };
-            }
-            else {
-                return { bg: [], fg: [] };
-            }
-        };
-        Slicer.prototype._sliceInteraction = function (interaction, eventUiBases, dateProfile, nextDayThreshold, component) {
-            var extraArgs = [];
-            for (var _i = 5; _i < arguments.length; _i++) {
-                extraArgs[_i - 5] = arguments[_i];
-            }
-            if (!interaction) {
-                return null;
-            }
-            var rangeRes = sliceEventStore(interaction.mutatedEvents, eventUiBases, computeActiveRange(dateProfile, Boolean(nextDayThreshold)), nextDayThreshold);
-            return {
-                segs: this.sliceEventRanges(rangeRes.fg, component, extraArgs),
-                affectedInstances: interaction.affectedEvents.instances,
-                isEvent: interaction.isEvent,
-                sourceSeg: interaction.origSeg
-            };
-        };
-        Slicer.prototype._sliceDateSpan = function (dateSpan, eventUiBases, component) {
-            var extraArgs = [];
-            for (var _i = 3; _i < arguments.length; _i++) {
-                extraArgs[_i - 3] = arguments[_i];
-            }
-            if (!dateSpan) {
-                return [];
-            }
-            var eventRange = fabricateEventRange(dateSpan, eventUiBases, component.calendar);
-            var segs = this.sliceRange.apply(this, [dateSpan.range].concat(extraArgs));
-            for (var _a = 0, segs_1 = segs; _a < segs_1.length; _a++) {
-                var seg = segs_1[_a];
-                seg.component = component;
-                seg.eventRange = eventRange;
-            }
-            return segs;
-        };
-        /*
-        "complete" seg means it has component and eventRange
-        */
-        Slicer.prototype.sliceEventRanges = function (eventRanges, component, // TODO: kill
-        extraArgs) {
-            var segs = [];
-            for (var _i = 0, eventRanges_1 = eventRanges; _i < eventRanges_1.length; _i++) {
-                var eventRange = eventRanges_1[_i];
-                segs.push.apply(segs, this.sliceEventRange(eventRange, component, extraArgs));
-            }
-            return segs;
-        };
-        /*
-        "complete" seg means it has component and eventRange
-        */
-        Slicer.prototype.sliceEventRange = function (eventRange, component, // TODO: kill
-        extraArgs) {
-            var segs = this.sliceRange.apply(this, [eventRange.range].concat(extraArgs));
-            for (var _i = 0, segs_2 = segs; _i < segs_2.length; _i++) {
-                var seg = segs_2[_i];
-                seg.component = component;
-                seg.eventRange = eventRange;
-                seg.isStart = eventRange.isStart && seg.isStart;
-                seg.isEnd = eventRange.isEnd && seg.isEnd;
-            }
-            return segs;
-        };
-        return Slicer;
-    }());
-    /*
-    for incorporating minTime/maxTime if appropriate
-    TODO: should be part of DateProfile!
-    TimelineDateProfile already does this btw
-    */
-    function computeActiveRange(dateProfile, isComponentAllDay) {
-        var range = dateProfile.activeRange;
-        if (isComponentAllDay) {
-            return range;
-        }
-        return {
-            start: addMs(range.start, dateProfile.minTime.milliseconds),
-            end: addMs(range.end, dateProfile.maxTime.milliseconds - 864e5) // 864e5 = ms in a day
-        };
-    }
-
-    // exports
-    // --------------------------------------------------------------------------------------------------
-    var version = '4.3.1';
-
-    exports.Calendar = Calendar;
-    exports.Component = Component;
-    exports.DateComponent = DateComponent;
-    exports.DateEnv = DateEnv;
-    exports.DateProfileGenerator = DateProfileGenerator;
-    exports.DayHeader = DayHeader;
-    exports.DaySeries = DaySeries;
-    exports.DayTable = DayTable;
-    exports.ElementDragging = ElementDragging;
-    exports.ElementScrollController = ElementScrollController;
-    exports.EmitterMixin = EmitterMixin;
-    exports.EventApi = EventApi;
-    exports.FgEventRenderer = FgEventRenderer;
-    exports.FillRenderer = FillRenderer;
-    exports.Interaction = Interaction;
-    exports.Mixin = Mixin;
-    exports.NamedTimeZoneImpl = NamedTimeZoneImpl;
-    exports.PositionCache = PositionCache;
-    exports.ScrollComponent = ScrollComponent;
-    exports.ScrollController = ScrollController;
-    exports.Slicer = Slicer;
-    exports.Splitter = Splitter;
-    exports.Theme = Theme;
-    exports.View = View;
-    exports.WindowScrollController = WindowScrollController;
-    exports.addDays = addDays;
-    exports.addDurations = addDurations;
-    exports.addMs = addMs;
-    exports.addWeeks = addWeeks;
-    exports.allowContextMenu = allowContextMenu;
-    exports.allowSelection = allowSelection;
-    exports.appendToElement = appendToElement;
-    exports.applyAll = applyAll;
-    exports.applyMutationToEventStore = applyMutationToEventStore;
-    exports.applyStyle = applyStyle;
-    exports.applyStyleProp = applyStyleProp;
-    exports.asRoughMinutes = asRoughMinutes;
-    exports.asRoughMs = asRoughMs;
-    exports.asRoughSeconds = asRoughSeconds;
-    exports.buildGotoAnchorHtml = buildGotoAnchorHtml;
-    exports.buildSegCompareObj = buildSegCompareObj;
-    exports.capitaliseFirstLetter = capitaliseFirstLetter;
-    exports.combineEventUis = combineEventUis;
-    exports.compareByFieldSpec = compareByFieldSpec;
-    exports.compareByFieldSpecs = compareByFieldSpecs;
-    exports.compareNumbers = compareNumbers;
-    exports.compensateScroll = compensateScroll;
-    exports.computeClippingRect = computeClippingRect;
-    exports.computeEdges = computeEdges;
-    exports.computeFallbackHeaderFormat = computeFallbackHeaderFormat;
-    exports.computeHeightAndMargins = computeHeightAndMargins;
-    exports.computeInnerRect = computeInnerRect;
-    exports.computeRect = computeRect;
-    exports.computeVisibleDayRange = computeVisibleDayRange;
-    exports.config = config;
-    exports.constrainPoint = constrainPoint;
-    exports.createDuration = createDuration;
-    exports.createElement = createElement;
-    exports.createEmptyEventStore = createEmptyEventStore;
-    exports.createEventInstance = createEventInstance;
-    exports.createFormatter = createFormatter;
-    exports.createPlugin = createPlugin;
-    exports.cssToStr = cssToStr;
-    exports.debounce = debounce;
-    exports.diffDates = diffDates;
-    exports.diffDayAndTime = diffDayAndTime;
-    exports.diffDays = diffDays;
-    exports.diffPoints = diffPoints;
-    exports.diffWeeks = diffWeeks;
-    exports.diffWholeDays = diffWholeDays;
-    exports.diffWholeWeeks = diffWholeWeeks;
-    exports.disableCursor = disableCursor;
-    exports.distributeHeight = distributeHeight;
-    exports.elementClosest = elementClosest;
-    exports.elementMatches = elementMatches;
-    exports.enableCursor = enableCursor;
-    exports.eventTupleToStore = eventTupleToStore;
-    exports.filterEventStoreDefs = filterEventStoreDefs;
-    exports.filterHash = filterHash;
-    exports.findChildren = findChildren;
-    exports.findElements = findElements;
-    exports.flexibleCompare = flexibleCompare;
-    exports.forceClassName = forceClassName;
-    exports.formatDate = formatDate;
-    exports.formatIsoTimeString = formatIsoTimeString;
-    exports.formatRange = formatRange;
-    exports.getAllDayHtml = getAllDayHtml;
-    exports.getClippingParents = getClippingParents;
-    exports.getDayClasses = getDayClasses;
-    exports.getElSeg = getElSeg;
-    exports.getRectCenter = getRectCenter;
-    exports.getRelevantEvents = getRelevantEvents;
-    exports.globalDefaults = globalDefaults;
-    exports.greatestDurationDenominator = greatestDurationDenominator;
-    exports.hasBgRendering = hasBgRendering;
-    exports.htmlEscape = htmlEscape;
-    exports.htmlToElement = htmlToElement;
-    exports.insertAfterElement = insertAfterElement;
-    exports.interactionSettingsStore = interactionSettingsStore;
-    exports.interactionSettingsToStore = interactionSettingsToStore;
-    exports.intersectRanges = intersectRanges;
-    exports.intersectRects = intersectRects;
-    exports.isArraysEqual = isArraysEqual;
-    exports.isDateSpansEqual = isDateSpansEqual;
-    exports.isInt = isInt;
-    exports.isInteractionValid = isInteractionValid;
-    exports.isMultiDayRange = isMultiDayRange;
-    exports.isPropsEqual = isPropsEqual;
-    exports.isPropsValid = isPropsValid;
-    exports.isSingleDay = isSingleDay;
-    exports.isValidDate = isValidDate;
-    exports.listenBySelector = listenBySelector;
-    exports.mapHash = mapHash;
-    exports.matchCellWidths = matchCellWidths;
-    exports.memoize = memoize;
-    exports.memoizeOutput = memoizeOutput;
-    exports.memoizeRendering = memoizeRendering;
-    exports.mergeEventStores = mergeEventStores;
-    exports.multiplyDuration = multiplyDuration;
-    exports.padStart = padStart;
-    exports.parseBusinessHours = parseBusinessHours;
-    exports.parseDragMeta = parseDragMeta;
-    exports.parseEventDef = parseEventDef;
-    exports.parseFieldSpecs = parseFieldSpecs;
-    exports.parseMarker = parse;
-    exports.pointInsideRect = pointInsideRect;
-    exports.prependToElement = prependToElement;
-    exports.preventContextMenu = preventContextMenu;
-    exports.preventDefault = preventDefault;
-    exports.preventSelection = preventSelection;
-    exports.processScopedUiProps = processScopedUiProps;
-    exports.rangeContainsMarker = rangeContainsMarker;
-    exports.rangeContainsRange = rangeContainsRange;
-    exports.rangesEqual = rangesEqual;
-    exports.rangesIntersect = rangesIntersect;
-    exports.refineProps = refineProps;
-    exports.removeElement = removeElement;
-    exports.removeExact = removeExact;
-    exports.renderDateCell = renderDateCell;
-    exports.requestJson = requestJson;
-    exports.sliceEventStore = sliceEventStore;
-    exports.startOfDay = startOfDay;
-    exports.subtractInnerElHeight = subtractInnerElHeight;
-    exports.translateRect = translateRect;
-    exports.uncompensateScroll = uncompensateScroll;
-    exports.undistributeHeight = undistributeHeight;
-    exports.unpromisify = unpromisify;
-    exports.version = version;
-    exports.whenTransitionDone = whenTransitionDone;
-    exports.wholeDivideDurations = wholeDivideDurations;
-
-    Object.defineProperty(exports, '__esModule', { value: true });
-
-}));
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/core/main.min.css b/AKPlan/static/AKPlan/vendor/fullcalendar/core/main.min.css
deleted file mode 100644
index 8948b534b177ac86405cac6e82acf66876348b3a..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/core/main.min.css
+++ /dev/null
@@ -1 +0,0 @@
-@charset "UTF-8";.fc-button:not(:disabled),.fc-event.fc-draggable,.fc-event[href],.fc-popover .fc-header .fc-close,a.fc-more,a[data-goto]{cursor:pointer}.fc-bg,.fc-row .fc-bgevent-skeleton,.fc-row .fc-highlight-skeleton{bottom:0}.fc{direction:ltr;text-align:left}.fc-rtl{text-align:right}body .fc{font-size:1em}.fc-highlight{background:#bce8f1;opacity:.3}.fc-bgevent{background:#8fdf82;opacity:.3}.fc-nonbusiness{background:#d7d7d7}.fc-popover{position:absolute;box-shadow:0 2px 6px rgba(0,0,0,.15)}.fc-popover .fc-header{display:flex;flex-direction:row;justify-content:space-between;align-items:center;padding:2px 4px}.fc-rtl .fc-popover .fc-header{flex-direction:row-reverse}.fc-popover .fc-header .fc-title{margin:0 2px}.fc-popover .fc-header .fc-close{opacity:.65;font-size:1.1em}.fc-divider{border-style:solid;border-width:1px}hr.fc-divider{height:0;margin:0;padding:0 0 2px;border-width:1px 0}.fc-bg table,.fc-row .fc-bgevent-skeleton table,.fc-row .fc-highlight-skeleton table{height:100%}.fc-bg,.fc-bgevent-skeleton,.fc-highlight-skeleton,.fc-mirror-skeleton{position:absolute;top:0;left:0;right:0}.fc table{width:100%;box-sizing:border-box;table-layout:fixed;border-collapse:collapse;border-spacing:0;font-size:1em}.fc th{text-align:center}.fc td,.fc th{border-style:solid;border-width:1px;padding:0;vertical-align:top}.fc td.fc-today{border-style:double}a[data-goto]:hover{text-decoration:underline}.fc .fc-row{border-style:solid;border-width:0}.fc-row table{border-left:0 hidden transparent;border-right:0 hidden transparent;border-bottom:0 hidden transparent}.fc-row:first-child table{border-top:0 hidden transparent}.fc-row{position:relative}.fc-row .fc-bg{z-index:1}.fc-row .fc-bgevent-skeleton td,.fc-row .fc-highlight-skeleton td{border-color:transparent}.fc-row .fc-bgevent-skeleton{z-index:2}.fc-row .fc-highlight-skeleton{z-index:3}.fc-row .fc-content-skeleton{position:relative;z-index:4;padding-bottom:2px}.fc-row .fc-mirror-skeleton{z-index:5}.fc .fc-row .fc-content-skeleton table,.fc .fc-row .fc-content-skeleton td,.fc .fc-row .fc-mirror-skeleton td{background:0 0;border-color:transparent}.fc-row .fc-content-skeleton td,.fc-row .fc-mirror-skeleton td{border-bottom:0}.fc-row .fc-content-skeleton tbody td,.fc-row .fc-mirror-skeleton tbody td{border-top:0}.fc-scroller{-webkit-overflow-scrolling:touch}.fc-scroller>.fc-day-grid,.fc-scroller>.fc-time-grid{position:relative;width:100%}.fc-event{position:relative;display:block;font-size:.85em;line-height:1.4;border-radius:3px;border:1px solid #3788d8}.fc-event,.fc-event-dot{background-color:#3788d8}.fc-event,.fc-event:hover{color:#fff;text-decoration:none}.fc-not-allowed,.fc-not-allowed .fc-event{cursor:not-allowed}.fc-event .fc-content{position:relative;z-index:2}.fc-event .fc-resizer{position:absolute;z-index:4;display:none}.fc-event.fc-allow-mouse-resize .fc-resizer,.fc-event.fc-selected .fc-resizer{display:block}.fc-event.fc-selected .fc-resizer:before{content:"";position:absolute;z-index:9999;top:50%;left:50%;width:40px;height:40px;margin-left:-20px;margin-top:-20px}.fc-event.fc-selected{z-index:9999!important;box-shadow:0 2px 5px rgba(0,0,0,.2)}.fc-event.fc-selected:after{content:"";position:absolute;z-index:1;top:-1px;right:-1px;bottom:-1px;left:-1px;background:#000;opacity:.25}.fc-event.fc-dragging.fc-selected{box-shadow:0 2px 7px rgba(0,0,0,.3)}.fc-event.fc-dragging:not(.fc-selected){opacity:.75}.fc-h-event.fc-selected:before{content:"";position:absolute;z-index:3;top:-10px;bottom:-10px;left:0;right:0}.fc-ltr .fc-h-event.fc-not-start,.fc-rtl .fc-h-event.fc-not-end{margin-left:0;border-left-width:0;padding-left:1px;border-top-left-radius:0;border-bottom-left-radius:0}.fc-ltr .fc-h-event.fc-not-end,.fc-rtl .fc-h-event.fc-not-start{margin-right:0;border-right-width:0;padding-right:1px;border-top-right-radius:0;border-bottom-right-radius:0}.fc-ltr .fc-h-event .fc-start-resizer,.fc-rtl .fc-h-event .fc-end-resizer{cursor:w-resize;left:-1px}.fc-ltr .fc-h-event .fc-end-resizer,.fc-rtl .fc-h-event .fc-start-resizer{cursor:e-resize;right:-1px}.fc-h-event.fc-allow-mouse-resize .fc-resizer{width:7px;top:-1px;bottom:-1px}.fc-h-event.fc-selected .fc-resizer{border-radius:4px;border-width:1px;width:6px;height:6px;border-style:solid;border-color:inherit;background:#fff;top:50%;margin-top:-4px}.fc-ltr .fc-h-event.fc-selected .fc-start-resizer,.fc-rtl .fc-h-event.fc-selected .fc-end-resizer{margin-left:-4px}.fc-ltr .fc-h-event.fc-selected .fc-end-resizer,.fc-rtl .fc-h-event.fc-selected .fc-start-resizer{margin-right:-4px}.fc-day-grid-event{margin:1px 2px 0;padding:0 1px}tr:first-child>td>.fc-day-grid-event{margin-top:2px}.fc-mirror-skeleton tr:first-child>td>.fc-day-grid-event{margin-top:0}.fc-day-grid-event .fc-content{white-space:nowrap;overflow:hidden}.fc-day-grid-event .fc-time{font-weight:700}.fc-ltr .fc-day-grid-event.fc-allow-mouse-resize .fc-start-resizer,.fc-rtl .fc-day-grid-event.fc-allow-mouse-resize .fc-end-resizer{margin-left:-2px}.fc-ltr .fc-day-grid-event.fc-allow-mouse-resize .fc-end-resizer,.fc-rtl .fc-day-grid-event.fc-allow-mouse-resize .fc-start-resizer{margin-right:-2px}a.fc-more{margin:1px 3px;font-size:.85em;text-decoration:none}a.fc-more:hover{text-decoration:underline}.fc-limited{display:none}.fc-button,.fc-icon{display:inline-block;font-weight:400;text-align:center}.fc-day-grid .fc-row{z-index:1}.fc-more-popover{z-index:2;width:220px}.fc-more-popover .fc-event-container{padding:10px}.fc-now-indicator{position:absolute;border:0 solid red}.fc-unselectable{-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-touch-callout:none;-webkit-tap-highlight-color:transparent}.fc-unthemed .fc-content,.fc-unthemed .fc-divider,.fc-unthemed .fc-list-heading td,.fc-unthemed .fc-list-view,.fc-unthemed .fc-popover,.fc-unthemed .fc-row,.fc-unthemed tbody,.fc-unthemed td,.fc-unthemed th,.fc-unthemed thead{border-color:#ddd}.fc-unthemed .fc-popover{background-color:#fff}.fc-unthemed .fc-divider,.fc-unthemed .fc-list-heading td,.fc-unthemed .fc-popover .fc-header{background:#eee}.fc-unthemed td.fc-today{background:#fcf8e3}.fc-unthemed .fc-disabled-day{background:#d7d7d7;opacity:.3}@font-face{font-family:fcicons;src:url("data:application/x-font-ttf;charset=utf-8;base64,AAEAAAALAIAAAwAwT1MvMg8SBfAAAAC8AAAAYGNtYXAXVtKNAAABHAAAAFRnYXNwAAAAEAAAAXAAAAAIZ2x5ZgYydxIAAAF4AAAFNGhlYWQUJ7cIAAAGrAAAADZoaGVhB20DzAAABuQAAAAkaG10eCIABhQAAAcIAAAALGxvY2ED4AU6AAAHNAAAABhtYXhwAA8AjAAAB0wAAAAgbmFtZXsr690AAAdsAAABhnBvc3QAAwAAAAAI9AAAACAAAwPAAZAABQAAApkCzAAAAI8CmQLMAAAB6wAzAQkAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADpBgPA/8AAQAPAAEAAAAABAAAAAAAAAAAAAAAgAAAAAAADAAAAAwAAABwAAQADAAAAHAADAAEAAAAcAAQAOAAAAAoACAACAAIAAQAg6Qb//f//AAAAAAAg6QD//f//AAH/4xcEAAMAAQAAAAAAAAAAAAAAAQAB//8ADwABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAABAWIAjQKeAskAEwAAJSc3NjQnJiIHAQYUFwEWMjc2NCcCnuLiDQ0MJAz/AA0NAQAMJAwNDcni4gwjDQwM/wANIwz/AA0NDCMNAAAAAQFiAI0CngLJABMAACUBNjQnASYiBwYUHwEHBhQXFjI3AZ4BAA0N/wAMJAwNDeLiDQ0MJAyNAQAMIw0BAAwMDSMM4uINIwwNDQAAAAIA4gC3Ax4CngATACcAACUnNzY0JyYiDwEGFB8BFjI3NjQnISc3NjQnJiIPAQYUHwEWMjc2NCcB87e3DQ0MIw3VDQ3VDSMMDQ0BK7e3DQ0MJAzVDQ3VDCQMDQ3zuLcMJAwNDdUNIwzWDAwNIwy4twwkDA0N1Q0jDNYMDA0jDAAAAgDiALcDHgKeABMAJwAAJTc2NC8BJiIHBhQfAQcGFBcWMjchNzY0LwEmIgcGFB8BBwYUFxYyNwJJ1Q0N1Q0jDA0Nt7cNDQwjDf7V1Q0N1QwkDA0Nt7cNDQwkDLfWDCMN1Q0NDCQMt7gMIw0MDNYMIw3VDQ0MJAy3uAwjDQwMAAADAFUAAAOrA1UAMwBoAHcAABMiBgcOAQcOAQcOARURFBYXHgEXHgEXHgEzITI2Nz4BNz4BNz4BNRE0JicuAScuAScuASMFITIWFx4BFx4BFx4BFREUBgcOAQcOAQcOASMhIiYnLgEnLgEnLgE1ETQ2Nz4BNz4BNz4BMxMhMjY1NCYjISIGFRQWM9UNGAwLFQkJDgUFBQUFBQ4JCRULDBgNAlYNGAwLFQkJDgUFBQUFBQ4JCRULDBgN/aoCVgQIBAQHAwMFAQIBAQIBBQMDBwQECAT9qgQIBAQHAwMFAQIBAQIBBQMDBwQECASAAVYRGRkR/qoRGRkRA1UFBAUOCQkVDAsZDf2rDRkLDBUJCA4FBQUFBQUOCQgVDAsZDQJVDRkLDBUJCQ4FBAVVAgECBQMCBwQECAX9qwQJAwQHAwMFAQICAgIBBQMDBwQDCQQCVQUIBAQHAgMFAgEC/oAZEhEZGRESGQAAAAADAFUAAAOrA1UAMwBoAIkAABMiBgcOAQcOAQcOARURFBYXHgEXHgEXHgEzITI2Nz4BNz4BNz4BNRE0JicuAScuAScuASMFITIWFx4BFx4BFx4BFREUBgcOAQcOAQcOASMhIiYnLgEnLgEnLgE1ETQ2Nz4BNz4BNz4BMxMzFRQWMzI2PQEzMjY1NCYrATU0JiMiBh0BIyIGFRQWM9UNGAwLFQkJDgUFBQUFBQ4JCRULDBgNAlYNGAwLFQkJDgUFBQUFBQ4JCRULDBgN/aoCVgQIBAQHAwMFAQIBAQIBBQMDBwQECAT9qgQIBAQHAwMFAQIBAQIBBQMDBwQECASAgBkSEhmAERkZEYAZEhIZgBEZGREDVQUEBQ4JCRUMCxkN/asNGQsMFQkIDgUFBQUFBQ4JCBUMCxkNAlUNGQsMFQkJDgUEBVUCAQIFAwIHBAQIBf2rBAkDBAcDAwUBAgICAgEFAwMHBAMJBAJVBQgEBAcCAwUCAQL+gIASGRkSgBkSERmAEhkZEoAZERIZAAABAOIAjQMeAskAIAAAExcHBhQXFjI/ARcWMjc2NC8BNzY0JyYiDwEnJiIHBhQX4uLiDQ0MJAzi4gwkDA0N4uINDQwkDOLiDCQMDQ0CjeLiDSMMDQ3h4Q0NDCMN4uIMIw0MDOLiDAwNIwwAAAABAAAAAQAAa5n0y18PPPUACwQAAAAAANivOVsAAAAA2K85WwAAAAADqwNVAAAACAACAAAAAAAAAAEAAAPA/8AAAAQAAAAAAAOrAAEAAAAAAAAAAAAAAAAAAAALBAAAAAAAAAAAAAAAAgAAAAQAAWIEAAFiBAAA4gQAAOIEAABVBAAAVQQAAOIAAAAAAAoAFAAeAEQAagCqAOoBngJkApoAAQAAAAsAigADAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAA4ArgABAAAAAAABAAcAAAABAAAAAAACAAcAYAABAAAAAAADAAcANgABAAAAAAAEAAcAdQABAAAAAAAFAAsAFQABAAAAAAAGAAcASwABAAAAAAAKABoAigADAAEECQABAA4ABwADAAEECQACAA4AZwADAAEECQADAA4APQADAAEECQAEAA4AfAADAAEECQAFABYAIAADAAEECQAGAA4AUgADAAEECQAKADQApGZjaWNvbnMAZgBjAGkAYwBvAG4Ac1ZlcnNpb24gMS4wAFYAZQByAHMAaQBvAG4AIAAxAC4AMGZjaWNvbnMAZgBjAGkAYwBvAG4Ac2ZjaWNvbnMAZgBjAGkAYwBvAG4Ac1JlZ3VsYXIAUgBlAGcAdQBsAGEAcmZjaWNvbnMAZgBjAGkAYwBvAG4Ac0ZvbnQgZ2VuZXJhdGVkIGJ5IEljb01vb24uAEYAbwBuAHQAIABnAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAEkAYwBvAE0AbwBvAG4ALgAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=") format("truetype");font-weight:400;font-style:normal}.fc-icon{font-family:fcicons!important;speak:none;font-style:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;width:1em;height:1em}.fc-icon-chevron-left:before{content:""}.fc-icon-chevron-right:before{content:""}.fc-icon-chevrons-left:before{content:""}.fc-icon-chevrons-right:before{content:""}.fc-icon-minus-square:before{content:""}.fc-icon-plus-square:before{content:""}.fc-icon-x:before{content:""}.fc-button{overflow:visible;text-transform:none;margin:0;font-family:inherit}.fc-button::-moz-focus-inner{padding:0;border-style:none}.fc-button{-webkit-appearance:button;color:#212529;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:.4em .65em;font-size:1em;line-height:1.5;border-radius:.25em}.fc-button:hover{color:#212529;text-decoration:none}.fc-button:focus{outline:0;-webkit-box-shadow:0 0 0 .2rem rgba(44,62,80,.25);box-shadow:0 0 0 .2rem rgba(44,62,80,.25)}.fc-button:disabled{opacity:.65}.fc-button-primary{color:#fff;background-color:#2C3E50;border-color:#2C3E50}.fc-button-primary:hover{color:#fff;background-color:#1e2b37;border-color:#1a252f}.fc-button-primary:focus{-webkit-box-shadow:0 0 0 .2rem rgba(76,91,106,.5);box-shadow:0 0 0 .2rem rgba(76,91,106,.5)}.fc-button-primary:disabled{color:#fff;background-color:#2C3E50;border-color:#2C3E50}.fc-button-primary:not(:disabled).fc-button-active,.fc-button-primary:not(:disabled):active{color:#fff;background-color:#1a252f;border-color:#151e27}.fc-button-primary:not(:disabled).fc-button-active:focus,.fc-button-primary:not(:disabled):active:focus{-webkit-box-shadow:0 0 0 .2rem rgba(76,91,106,.5);box-shadow:0 0 0 .2rem rgba(76,91,106,.5)}.fc-button .fc-icon{vertical-align:middle;font-size:1.5em}.fc-button-group{position:relative;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.fc-button-group>.fc-button{position:relative;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto}.fc-button-group>.fc-button.fc-button-active,.fc-button-group>.fc-button:active,.fc-button-group>.fc-button:focus,.fc-button-group>.fc-button:hover{z-index:1}.fc-button-group>.fc-button:not(:first-child){margin-left:-1px;border-top-left-radius:0;border-bottom-left-radius:0}.fc-button-group>.fc-button:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.fc-unthemed .fc-popover{border-width:1px;border-style:solid}.fc-unthemed .fc-list-item:hover td{background-color:#f5f5f5}.fc-toolbar{display:flex;justify-content:space-between;align-items:center}.fc-toolbar.fc-header-toolbar{margin-bottom:1.5em}.fc-toolbar.fc-footer-toolbar{margin-top:1.5em}.fc-toolbar>*>:not(:first-child){margin-left:.75em}.fc-toolbar h2{font-size:1.75em;margin:0}.fc-view-container{position:relative}.fc-view-container *,.fc-view-container :after,.fc-view-container :before{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.fc-view,.fc-view>table{position:relative;z-index:1}@media print{.fc-bg,.fc-bgevent-container,.fc-bgevent-skeleton,.fc-business-container,.fc-event .fc-resizer,.fc-highlight-container,.fc-highlight-skeleton,.fc-mirror-container,.fc-mirror-skeleton{display:none}.fc tbody .fc-row,.fc-time-grid{min-height:0!important}.fc-time-grid .fc-event.fc-not-end:after,.fc-time-grid .fc-event.fc-not-start:before{content:"..."}.fc{max-width:100%!important}.fc-event{background:#fff!important;color:#000!important;page-break-inside:avoid}.fc hr,.fc tbody,.fc td,.fc th,.fc thead,.fc-row{border-color:#ccc!important;background:#fff!important}.fc tbody .fc-row{height:auto!important}.fc tbody .fc-row .fc-content-skeleton{position:static;padding-bottom:0!important}.fc tbody .fc-row .fc-content-skeleton tbody tr:last-child td{padding-bottom:1em}.fc tbody .fc-row .fc-content-skeleton table{height:1em}.fc-more,.fc-more-cell{display:none!important}.fc tr.fc-limited{display:table-row!important}.fc td.fc-limited{display:table-cell!important}.fc-popover,.fc-timeGrid-view .fc-axis{display:none}.fc-slats,.fc-time-grid hr{display:none!important}.fc button,.fc-button-group,.fc-time-grid .fc-event .fc-time span{display:none}.fc-time-grid .fc-content-skeleton{position:static}.fc-time-grid .fc-content-skeleton table{height:4em}.fc-time-grid .fc-event-container{margin:0!important}.fc-time-grid .fc-event{position:static!important;margin:3px 2px!important}.fc-time-grid .fc-event.fc-not-end{border-bottom-width:1px!important}.fc-time-grid .fc-event.fc-not-start{border-top-width:1px!important}.fc-time-grid .fc-event .fc-time{white-space:normal!important}.fc-time-grid .fc-event .fc-time:after{content:attr(data-full)}.fc-day-grid-container,.fc-scroller,.fc-time-grid-container{overflow:visible!important;height:auto!important}.fc-row{border:0!important;margin:0!important}}
\ No newline at end of file
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/core/main.min.js b/AKPlan/static/AKPlan/vendor/fullcalendar/core/main.min.js
deleted file mode 100644
index 6b72fff6c1a4dc91ff572391fec23c0c36236079..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/core/main.min.js
+++ /dev/null
@@ -1,6 +0,0 @@
-/*!
-FullCalendar Core Package v4.3.1
-Docs & License: https://fullcalendar.io/
-(c) 2019 Adam Shaw
-*/
-!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e=e||self).FullCalendar={})}(this,function(e){"use strict";var t={className:!0,colSpan:!0,rowSpan:!0},n={"<tr":"tbody","<td":"tr"};function r(e,n,r){var i=document.createElement(e);if(n)for(var o in n)"style"===o?y(i,n[o]):t[o]?i[o]=n[o]:i.setAttribute(o,n[o]);return"string"==typeof r?i.innerHTML=r:null!=r&&s(i,r),i}function i(e){e=e.trim();var t=document.createElement(a(e));return t.innerHTML=e,t.firstChild}function o(e){return Array.prototype.slice.call(function(e){e=e.trim();var t=document.createElement(a(e));return t.innerHTML=e,t.childNodes}(e))}function a(e){return n[e.substr(0,3)]||"div"}function s(e,t){for(var n=l(t),r=0;r<n.length;r++)e.appendChild(n[r])}function u(e,t){for(var n=l(t),r=e.firstChild||null,i=0;i<n.length;i++)e.insertBefore(n[i],r)}function l(e){return"string"==typeof e?o(e):e instanceof Node?[e]:Array.prototype.slice.call(e)}function c(e){e.parentNode&&e.parentNode.removeChild(e)}var d=Element.prototype.matches||Element.prototype.matchesSelector||Element.prototype.msMatchesSelector,f=Element.prototype.closest||function(e){var t=this;if(!document.documentElement.contains(t))return null;do{if(h(t,e))return t;t=t.parentElement||t.parentNode}while(null!==t&&1===t.nodeType);return null};function p(e,t){return f.call(e,t)}function h(e,t){return d.call(e,t)}function v(e,t){for(var n=e instanceof HTMLElement?[e]:e,r=[],i=0;i<n.length;i++)for(var o=n[i].querySelectorAll(t),a=0;a<o.length;a++)r.push(o[a]);return r}var g=/(top|left|right|bottom|width|height)$/i;function y(e,t){for(var n in t)m(e,n,t[n])}function m(e,t,n){null==n?e.style[t]="":"number"==typeof n&&g.test(t)?e.style[t]=n+"px":e.style[t]=n}function E(e,t){var n={left:Math.max(e.left,t.left),right:Math.min(e.right,t.right),top:Math.max(e.top,t.top),bottom:Math.min(e.bottom,t.bottom)};return n.left<n.right&&n.top<n.bottom&&n}var S=null;function b(){return null===S&&(S=function(){var e=r("div",{style:{position:"absolute",top:-1e3,left:0,border:0,padding:0,overflow:"scroll",direction:"rtl"}},"<div></div>");document.body.appendChild(e);var t=e.firstChild.getBoundingClientRect().left>e.getBoundingClientRect().left;return c(e),t}()),S}function D(e){return e=Math.max(0,e),e=Math.round(e)}function T(e,t){void 0===t&&(t=!1);var n=window.getComputedStyle(e),r=parseInt(n.borderLeftWidth,10)||0,i=parseInt(n.borderRightWidth,10)||0,o=parseInt(n.borderTopWidth,10)||0,a=parseInt(n.borderBottomWidth,10)||0,s=D(e.offsetWidth-e.clientWidth-r-i),u={borderLeft:r,borderRight:i,borderTop:o,borderBottom:a,scrollbarBottom:D(e.offsetHeight-e.clientHeight-o-a),scrollbarLeft:0,scrollbarRight:0};return b()&&"rtl"===n.direction?u.scrollbarLeft=s:u.scrollbarRight=s,t&&(u.paddingLeft=parseInt(n.paddingLeft,10)||0,u.paddingRight=parseInt(n.paddingRight,10)||0,u.paddingTop=parseInt(n.paddingTop,10)||0,u.paddingBottom=parseInt(n.paddingBottom,10)||0),u}function w(e,t){void 0===t&&(t=!1);var n=R(e),r=T(e,t),i={left:n.left+r.borderLeft+r.scrollbarLeft,right:n.right-r.borderRight-r.scrollbarRight,top:n.top+r.borderTop,bottom:n.bottom-r.borderBottom-r.scrollbarBottom};return t&&(i.left+=r.paddingLeft,i.right-=r.paddingRight,i.top+=r.paddingTop,i.bottom-=r.paddingBottom),i}function R(e){var t=e.getBoundingClientRect();return{left:t.left+window.pageXOffset,top:t.top+window.pageYOffset,right:t.right+window.pageXOffset,bottom:t.bottom+window.pageYOffset}}function I(e){return e.getBoundingClientRect().height+C(e)}function C(e){var t=window.getComputedStyle(e);return parseInt(t.marginTop,10)+parseInt(t.marginBottom,10)}function M(e){for(var t=[];e instanceof HTMLElement;){var n=window.getComputedStyle(e);if("fixed"===n.position)break;/(auto|scroll)/.test(n.overflow+n.overflowY+n.overflowX)&&t.push(e),e=e.parentNode}return t}function k(e){e.preventDefault()}function O(e,t,n,r){function i(e){var t=p(e.target,n);t&&r.call(t,e,t)}return e.addEventListener(t,i),function(){e.removeEventListener(t,i)}}var _=["webkitTransitionEnd","otransitionend","oTransitionEnd","msTransitionEnd","transitionend"];var P=["sun","mon","tue","wed","thu","fri","sat"];function x(e,t){var n=Z(e);return n[2]+=t,j(n)}function H(e,t){var n=Z(e);return n[6]+=t,j(n)}function N(e,t){return(t.valueOf()-e.valueOf())/864e5}function z(e,t){var n=B(e),r=B(t);return{years:0,months:0,days:Math.round(N(n,r)),milliseconds:t.valueOf()-r.valueOf()-(e.valueOf()-n.valueOf())}}function U(e,t){var n=L(e,t);return null!==n&&n%7==0?n/7:null}function L(e,t){return q(e)===q(t)?Math.round(N(e,t)):null}function B(e){return j([e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate()])}function V(e,t,n,r){var i=j([t,0,1+A(t,n,r)]),o=B(e),a=Math.round(N(i,o));return Math.floor(a/7)+1}function A(e,t,n){var r=7+t-n;return-((7+j([e,0,r]).getUTCDay()-t)%7)+r-1}function F(e){return[e.getFullYear(),e.getMonth(),e.getDate(),e.getHours(),e.getMinutes(),e.getSeconds(),e.getMilliseconds()]}function W(e){return new Date(e[0],e[1]||0,null==e[2]?1:e[2],e[3]||0,e[4]||0,e[5]||0)}function Z(e){return[e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate(),e.getUTCHours(),e.getUTCMinutes(),e.getUTCSeconds(),e.getUTCMilliseconds()]}function j(e){return 1===e.length&&(e=e.concat([0])),new Date(Date.UTC.apply(Date,e))}function Y(e){return!isNaN(e.valueOf())}function q(e){return 1e3*e.getUTCHours()*60*60+1e3*e.getUTCMinutes()*60+1e3*e.getUTCSeconds()+e.getUTCMilliseconds()}var G=["years","months","days","milliseconds"],X=/^(-?)(?:(\d+)\.)?(\d+):(\d\d)(?::(\d\d)(?:\.(\d\d\d))?)?/;function J(e,t){var n;return"string"==typeof e?function(e){var t=X.exec(e);if(t){var n=t[1]?-1:1;return{years:0,months:0,days:n*(t[2]?parseInt(t[2],10):0),milliseconds:n*(60*(t[3]?parseInt(t[3],10):0)*60*1e3+60*(t[4]?parseInt(t[4],10):0)*1e3+1e3*(t[5]?parseInt(t[5],10):0)+(t[6]?parseInt(t[6],10):0))}}return null}(e):"object"==typeof e&&e?K(e):"number"==typeof e?K(((n={})[t||"milliseconds"]=e,n)):null}function K(e){return{years:e.years||e.year||0,months:e.months||e.month||0,days:(e.days||e.day||0)+7*Q(e),milliseconds:60*(e.hours||e.hour||0)*60*1e3+60*(e.minutes||e.minute||0)*1e3+1e3*(e.seconds||e.second||0)+(e.milliseconds||e.millisecond||e.ms||0)}}function Q(e){return e.weeks||e.week||0}function $(e,t){return e.years===t.years&&e.months===t.months&&e.days===t.days&&e.milliseconds===t.milliseconds}function ee(e){return te(e)/864e5}function te(e){return 31536e6*e.years+2592e6*e.months+864e5*e.days+e.milliseconds}function ne(e,t){var n=e.milliseconds;if(n){if(n%1e3!=0)return{unit:"millisecond",value:n};if(n%6e4!=0)return{unit:"second",value:n/1e3};if(n%36e5!=0)return{unit:"minute",value:n/6e4};if(n)return{unit:"hour",value:n/36e5}}return e.days?t||e.days%7!=0?{unit:"day",value:e.days}:{unit:"week",value:e.days/7}:e.months?{unit:"month",value:e.months}:e.years?{unit:"year",value:e.years}:{unit:"millisecond",value:0}}function re(e){e.forEach(function(e){e.style.height=""})}function ie(e){var t,n,r=[],i=[];for("string"==typeof e?i=e.split(/\s*,\s*/):"function"==typeof e?i=[e]:Array.isArray(e)&&(i=e),t=0;t<i.length;t++)"string"==typeof(n=i[t])?r.push("-"===n.charAt(0)?{field:n.substring(1),order:-1}:{field:n,order:1}):"function"==typeof n&&r.push({func:n});return r}function oe(e,t,n){var r,i;for(r=0;r<n.length;r++)if(i=ae(e,t,n[r]))return i;return 0}function ae(e,t,n){return n.func?n.func(e,t):se(e[n.field],t[n.field])*(n.order||1)}function se(e,t){return e||t?null==t?-1:null==e?1:"string"==typeof e||"string"==typeof t?String(e).localeCompare(String(t)):e-t:0}function ue(e){return e.charAt(0).toUpperCase()+e.slice(1)}function le(e,t){var n=String(e);return"000".substr(0,t-n.length)+n}function ce(e){return e%1==0}function de(e,t,n){if("function"==typeof e&&(e=[e]),e){var r=void 0,i=void 0;for(r=0;r<e.length;r++)i=e[r].apply(t,n)||i;return i}}function fe(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];for(var n=0;n<e.length;n++)if(void 0!==e[n])return e[n]}function pe(e,t){var n,r,i,o,a,s=function(){var u=(new Date).valueOf()-o;u<t?n=setTimeout(s,t-u):(n=null,a=e.apply(i,r),i=r=null)};return function(){return i=this,r=arguments,o=(new Date).valueOf(),n||(n=setTimeout(s,t)),a}}function he(e,t,n,r){void 0===n&&(n={});var i={};for(var o in t){var a=t[o];void 0!==e[o]?a===Function?i[o]="function"==typeof e[o]?e[o]:null:i[o]=a?a(e[o]):e[o]:void 0!==n[o]?i[o]=n[o]:a===String?i[o]="":a&&a!==Number&&a!==Boolean&&a!==Function?i[o]=a(null):i[o]=null}if(r)for(var o in e)void 0===t[o]&&(r[o]=e[o]);return i}function ve(e){var t=Math.floor(N(e.start,e.end))||1,n=B(e.start);return{start:n,end:x(n,t)}}function ge(e,t){void 0===t&&(t=J(0));var n=null,r=null;if(e.end){r=B(e.end);var i=e.end.valueOf()-r.valueOf();i&&i>=te(t)&&(r=x(r,1))}return e.start&&(n=B(e.start),r&&r<=n&&(r=x(n,1))),{start:n,end:r}}function ye(e,t,n,r){return"year"===r?J(n.diffWholeYears(e,t),"year"):"month"===r?J(n.diffWholeMonths(e,t),"month"):z(e,t)}var me=function(e,t){return(me=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])})(e,t)};function Ee(e,t){function n(){this.constructor=e}me(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}var Se=function(){return(Se=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var i in t=arguments[n])Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i]);return e}).apply(this,arguments)};function be(e,t,n,r,i){var o=i[e.recurringDef.typeId].expand(e.recurringDef.typeData,{start:r.subtract(n.start,t),end:n.end},r);return e.allDay&&(o=o.map(B)),o}var De=Object.prototype.hasOwnProperty;function Te(e,t){var n,r,i,o,a,s,u={};if(t)for(n=0;n<t.length;n++){for(r=t[n],i=[],o=e.length-1;o>=0;o--)if("object"==typeof(a=e[o][r])&&a)i.unshift(a);else if(void 0!==a){u[r]=a;break}i.length&&(u[r]=Te(i))}for(n=e.length-1;n>=0;n--)for(r in s=e[n])r in u||(u[r]=s[r]);return u}function we(e,t){var n={};for(var r in e)t(e[r],r)&&(n[r]=e[r]);return n}function Re(e,t){var n={};for(var r in e)n[r]=t(e[r],r);return n}function Ie(e){for(var t={},n=0,r=e;n<r.length;n++){t[r[n]]=!0}return t}function Ce(e){var t=[];for(var n in e)t.push(e[n]);return t}function Me(e,t){for(var n in e)if(De.call(e,n)&&!(n in t))return!1;for(var n in t)if(De.call(t,n)&&e[n]!==t[n])return!1;return!0}function ke(e,t,n,r){for(var i={defs:{},instances:{}},o=0,a=e;o<a.length;o++){var s=Ft(a[o],t,n,r);s&&Oe(s,i)}return i}function Oe(e,t){return void 0===t&&(t={defs:{},instances:{}}),t.defs[e.def.defId]=e.def,e.instance&&(t.instances[e.instance.instanceId]=e.instance),t}function _e(e,t,n){var r=n.dateEnv,i=e.defs,o=e.instances;for(var a in o=we(o,function(e){return!i[e.defId].recurringDef}),i){var s=i[a];if(s.recurringDef){var u=s.recurringDef.duration;u||(u=s.allDay?n.defaultAllDayEventDuration:n.defaultTimedEventDuration);for(var l=0,c=be(s,u,t,n.dateEnv,n.pluginSystem.hooks.recurringTypes);l<c.length;l++){var d=c[l],f=Zt(a,{start:d,end:r.add(d,u)});o[f.instanceId]=f}}}return{defs:i,instances:o}}function Pe(e,t){var n=e.instances[t];if(n){var r=e.defs[n.defId],i=ze(e,function(e){return t=r,n=e,Boolean(t.groupId&&t.groupId===n.groupId);var t,n});return i.defs[r.defId]=r,i.instances[n.instanceId]=n,i}return{defs:{},instances:{}}}function xe(e,t){var n;if(t){n=[];for(var r=0,i=e;r<i.length;r++){var o=i[r],a=t(o);a?n.push(a):null==a&&n.push(o)}}else n=e;return n}function He(){return{defs:{},instances:{}}}function Ne(e,t){return{defs:Se({},e.defs,t.defs),instances:Se({},e.instances,t.instances)}}function ze(e,t){var n=we(e.defs,t),r=we(e.instances,function(e){return n[e.defId]});return{defs:n,instances:r}}function Ue(e,t){var n=null,r=null;return e.start&&(n=t.createMarker(e.start)),e.end&&(r=t.createMarker(e.end)),n||r?n&&r&&r<n?null:{start:n,end:r}:null}function Le(e,t){var n,r,i=[],o=t.start;for(e.sort(Be),n=0;n<e.length;n++)(r=e[n]).start>o&&i.push({start:o,end:r.start}),r.end>o&&(o=r.end);return o<t.end&&i.push({start:o,end:t.end}),i}function Be(e,t){return e.start.valueOf()-t.start.valueOf()}function Ve(e,t){var n=e.start,r=e.end,i=null;return null!==t.start&&(n=null===n?t.start:new Date(Math.max(n.valueOf(),t.start.valueOf()))),null!=t.end&&(r=null===r?t.end:new Date(Math.min(r.valueOf(),t.end.valueOf()))),(null===n||null===r||n<r)&&(i={start:n,end:r}),i}function Ae(e,t){return(null===e.start?null:e.start.valueOf())===(null===t.start?null:t.start.valueOf())&&(null===e.end?null:e.end.valueOf())===(null===t.end?null:t.end.valueOf())}function Fe(e,t){return(null===e.end||null===t.start||e.end>t.start)&&(null===e.start||null===t.end||e.start<t.end)}function We(e,t){return(null===e.start||null!==t.start&&t.start>=e.start)&&(null===e.end||null!==t.end&&t.end<=e.end)}function Ze(e,t){return(null===e.start||t>=e.start)&&(null===e.end||t<e.end)}function je(e,t){var n,r=e.length;if(r!==t.length)return!1;for(n=0;n<r;n++)if(e[n]!==t[n])return!1;return!0}function Ye(e){var t,n;return function(){return t&&je(t,arguments)||(t=arguments,n=e.apply(this,arguments)),n}}function qe(e,t){var n=null;return function(){var r=e.apply(this,arguments);return(null===n||n!==r&&!t(n,r))&&(n=r),n}}var Ge={week:3,separator:0,omitZeroMinute:0,meridiem:0,omitCommas:0},Xe={timeZoneName:7,era:6,year:5,month:4,day:2,weekday:2,hour:1,minute:1,second:1},Je=/\s*([ap])\.?m\.?/i,Ke=/,/g,Qe=/\s+/g,$e=/\u200e/g,et=/UTC|GMT/,tt=function(){function e(e){var t={},n={},r=0;for(var i in e)i in Ge?(n[i]=e[i],r=Math.max(Ge[i],r)):(t[i]=e[i],i in Xe&&(r=Math.max(Xe[i],r)));this.standardDateProps=t,this.extendedSettings=n,this.severity=r,this.buildFormattingFunc=Ye(nt)}return e.prototype.format=function(e,t){return this.buildFormattingFunc(this.standardDateProps,this.extendedSettings,t)(e)},e.prototype.formatRange=function(e,t,n){var r=this.standardDateProps,i=this.extendedSettings,o=function(e,t,n){if(n.getMarkerYear(e)!==n.getMarkerYear(t))return 5;if(n.getMarkerMonth(e)!==n.getMarkerMonth(t))return 4;if(n.getMarkerDay(e)!==n.getMarkerDay(t))return 2;if(q(e)!==q(t))return 1;return 0}(e.marker,t.marker,n.calendarSystem);if(!o)return this.format(e,n);var a=o;!(a>1)||"numeric"!==r.year&&"2-digit"!==r.year||"numeric"!==r.month&&"2-digit"!==r.month||"numeric"!==r.day&&"2-digit"!==r.day||(a=1);var s=this.format(e,n),u=this.format(t,n);if(s===u)return s;var l=nt(function(e,t){var n={};for(var r in e)r in Xe&&!(Xe[r]<=t)||(n[r]=e[r]);return n}(r,a),i,n),c=l(e),d=l(t),f=function(e,t,n,r){var i=0;for(;i<e.length;){var o=e.indexOf(t,i);if(-1===o)break;var a=e.substr(0,o);i=o+t.length;for(var s=e.substr(i),u=0;u<n.length;){var l=n.indexOf(r,u);if(-1===l)break;var c=n.substr(0,l);u=l+r.length;var d=n.substr(u);if(a===c&&s===d)return{before:a,after:s}}}return null}(s,c,u,d),p=i.separator||"";return f?f.before+c+p+d+f.after:s+p+u},e.prototype.getLargestUnit=function(){switch(this.severity){case 7:case 6:case 5:return"year";case 4:return"month";case 3:return"week";default:return"day"}},e}();function nt(e,t,n){var r=Object.keys(e).length;return 1===r&&"short"===e.timeZoneName?function(e){return at(e.timeZoneOffset)}:0===r&&t.week?function(e){return function(e,t,n,r){var i=[];"narrow"===r?i.push(t):"short"===r&&i.push(t," ");i.push(n.simpleNumberFormat.format(e)),n.options.isRtl&&i.reverse();return i.join("")}(n.computeWeekNumber(e.marker),n.weekLabel,n.locale,t.week)}:function(e,t,n){e=Se({},e),t=Se({},t),function(e,t){e.timeZoneName&&(e.hour||(e.hour="2-digit"),e.minute||(e.minute="2-digit"));"long"===e.timeZoneName&&(e.timeZoneName="short");t.omitZeroMinute&&(e.second||e.millisecond)&&delete t.omitZeroMinute}(e,t),e.timeZone="UTC";var r,i=new Intl.DateTimeFormat(n.locale.codes,e);if(t.omitZeroMinute){var o=Se({},e);delete o.minute,r=new Intl.DateTimeFormat(n.locale.codes,o)}return function(o){var a=o.marker,s=(r&&!a.getUTCMinutes()?r:i).format(a);return function(e,t,n,r,i){e=e.replace($e,""),"short"===n.timeZoneName&&(e=function(e,t){var n=!1;e=e.replace(et,function(){return n=!0,t}),n||(e+=" "+t);return e}(e,"UTC"===i.timeZone||null==t.timeZoneOffset?"UTC":at(t.timeZoneOffset)));r.omitCommas&&(e=e.replace(Ke,"").trim());r.omitZeroMinute&&(e=e.replace(":00",""));!1===r.meridiem?e=e.replace(Je,"").trim():"narrow"===r.meridiem?e=e.replace(Je,function(e,t){return t.toLocaleLowerCase()}):"short"===r.meridiem?e=e.replace(Je,function(e,t){return t.toLocaleLowerCase()+"m"}):"lowercase"===r.meridiem&&(e=e.replace(Je,function(e){return e.toLocaleLowerCase()}));return e=(e=e.replace(Qe," ")).trim()}(s,o,e,t,n)}}(e,t,n)}var rt=function(){function e(e,t){this.cmdStr=e,this.separator=t}return e.prototype.format=function(e,t){return t.cmdFormatter(this.cmdStr,st(e,null,t,this.separator))},e.prototype.formatRange=function(e,t,n){return n.cmdFormatter(this.cmdStr,st(e,t,n,this.separator))},e}(),it=function(){function e(e){this.func=e}return e.prototype.format=function(e,t){return this.func(st(e,null,t))},e.prototype.formatRange=function(e,t,n){return this.func(st(e,t,n))},e}();function ot(e,t){return"object"==typeof e&&e?("string"==typeof t&&(e=Se({separator:t},e)),new tt(e)):"string"==typeof e?new rt(e,t):"function"==typeof e?new it(e):void 0}function at(e,t){void 0===t&&(t=!1);var n=e<0?"-":"+",r=Math.abs(e),i=Math.floor(r/60),o=Math.round(r%60);return t?n+le(i,2)+":"+le(o,2):"GMT"+n+i+(o?":"+le(o,2):"")}function st(e,t,n,r){var i=ut(e,n.calendarSystem);return{date:i,start:i,end:t?ut(t,n.calendarSystem):null,timeZone:n.timeZone,localeCodes:n.locale.codes,separator:r}}function ut(e,t){var n=t.markerToArray(e.marker);return{marker:e.marker,timeZoneOffset:e.timeZoneOffset,array:n,year:n[0],month:n[1],day:n[2],hour:n[3],minute:n[4],second:n[5],millisecond:n[6]}}var lt=function(){function e(e,t){this.calendar=e,this.internalEventSource=t}return e.prototype.remove=function(){this.calendar.dispatch({type:"REMOVE_EVENT_SOURCE",sourceId:this.internalEventSource.sourceId})},e.prototype.refetch=function(){this.calendar.dispatch({type:"FETCH_EVENT_SOURCES",sourceIds:[this.internalEventSource.sourceId]})},Object.defineProperty(e.prototype,"id",{get:function(){return this.internalEventSource.publicId},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"url",{get:function(){return this.internalEventSource.meta.url},enumerable:!0,configurable:!0}),e}(),ct=function(){function e(e,t,n){this._calendar=e,this._def=t,this._instance=n||null}return e.prototype.setProp=function(e,t){var n,r;if(e in Vt);else if(e in Bt)"function"==typeof Bt[e]&&(t=Bt[e](t)),this.mutate({standardProps:(n={},n[e]=t,n)});else if(e in xt){var i=void 0;"function"==typeof xt[e]&&(t=xt[e](t)),"color"===e?i={backgroundColor:t,borderColor:t}:"editable"===e?i={startEditable:t,durationEditable:t}:((r={})[e]=t,i=r),this.mutate({standardProps:{ui:i}})}},e.prototype.setExtendedProp=function(e,t){var n;this.mutate({extendedProps:(n={},n[e]=t,n)})},e.prototype.setStart=function(e,t){void 0===t&&(t={});var n=this._calendar.dateEnv,r=n.createMarker(e);if(r&&this._instance){var i=ye(this._instance.range.start,r,n,t.granularity);t.maintainDuration?this.mutate({datesDelta:i}):this.mutate({startDelta:i})}},e.prototype.setEnd=function(e,t){void 0===t&&(t={});var n,r=this._calendar.dateEnv;if((null==e||(n=r.createMarker(e)))&&this._instance)if(n){var i=ye(this._instance.range.end,n,r,t.granularity);this.mutate({endDelta:i})}else this.mutate({standardProps:{hasEnd:!1}})},e.prototype.setDates=function(e,t,n){void 0===n&&(n={});var r,i=this._calendar.dateEnv,o={allDay:n.allDay},a=i.createMarker(e);if(a&&(null==t||(r=i.createMarker(t)))&&this._instance){var s=this._instance.range;!0===n.allDay&&(s=ve(s));var u=ye(s.start,a,i,n.granularity);if(r){var l=ye(s.end,r,i,n.granularity);$(u,l)?this.mutate({datesDelta:u,standardProps:o}):this.mutate({startDelta:u,endDelta:l,standardProps:o})}else o.hasEnd=!1,this.mutate({datesDelta:u,standardProps:o})}},e.prototype.moveStart=function(e){var t=J(e);t&&this.mutate({startDelta:t})},e.prototype.moveEnd=function(e){var t=J(e);t&&this.mutate({endDelta:t})},e.prototype.moveDates=function(e){var t=J(e);t&&this.mutate({datesDelta:t})},e.prototype.setAllDay=function(e,t){void 0===t&&(t={});var n={allDay:e},r=t.maintainDuration;null==r&&(r=this._calendar.opt("allDayMaintainDuration")),this._def.allDay!==e&&(n.hasEnd=r),this.mutate({standardProps:n})},e.prototype.formatRange=function(e){var t=this._calendar.dateEnv,n=this._instance,r=ot(e,this._calendar.opt("defaultRangeSeparator"));return this._def.hasEnd?t.formatRange(n.range.start,n.range.end,r,{forcedStartTzo:n.forcedStartTzo,forcedEndTzo:n.forcedEndTzo}):t.format(n.range.start,r,{forcedTzo:n.forcedStartTzo})},e.prototype.mutate=function(e){var t=this._def,n=this._instance;if(n){this._calendar.dispatch({type:"MUTATE_EVENTS",instanceId:n.instanceId,mutation:e,fromApi:!0});var r=this._calendar.state.eventStore;this._def=r.defs[t.defId],this._instance=r.instances[n.instanceId]}},e.prototype.remove=function(){this._calendar.dispatch({type:"REMOVE_EVENT_DEF",defId:this._def.defId})},Object.defineProperty(e.prototype,"source",{get:function(){var e=this._def.sourceId;return e?new lt(this._calendar,this._calendar.state.eventSources[e]):null},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"start",{get:function(){return this._instance?this._calendar.dateEnv.toDate(this._instance.range.start):null},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"end",{get:function(){return this._instance&&this._def.hasEnd?this._calendar.dateEnv.toDate(this._instance.range.end):null},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"id",{get:function(){return this._def.publicId},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"groupId",{get:function(){return this._def.groupId},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"allDay",{get:function(){return this._def.allDay},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"title",{get:function(){return this._def.title},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"url",{get:function(){return this._def.url},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"rendering",{get:function(){return this._def.rendering},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"startEditable",{get:function(){return this._def.ui.startEditable},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"durationEditable",{get:function(){return this._def.ui.durationEditable},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"constraint",{get:function(){return this._def.ui.constraints[0]||null},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"overlap",{get:function(){return this._def.ui.overlap},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"allow",{get:function(){return this._def.ui.allows[0]||null},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"backgroundColor",{get:function(){return this._def.ui.backgroundColor},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"borderColor",{get:function(){return this._def.ui.borderColor},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"textColor",{get:function(){return this._def.ui.textColor},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"classNames",{get:function(){return this._def.ui.classNames},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"extendedProps",{get:function(){return this._def.extendedProps},enumerable:!0,configurable:!0}),e}();function dt(e,t,n,r){var i={},o={},a={},s=[],u=[],l=vt(e.defs,t);for(var c in e.defs){"inverse-background"===(S=e.defs[c]).rendering&&(S.groupId?(i[S.groupId]=[],a[S.groupId]||(a[S.groupId]=S)):o[c]=[])}for(var d in e.instances){var f=e.instances[d],p=l[(S=e.defs[f.defId]).defId],h=f.range,v=!S.allDay&&r?ge(h,r):h,g=Ve(v,n);g&&("inverse-background"===S.rendering?S.groupId?i[S.groupId].push(g):o[f.defId].push(g):("background"===S.rendering?s:u).push({def:S,ui:p,instance:f,range:g,isStart:v.start&&v.start.valueOf()===g.start.valueOf(),isEnd:v.end&&v.end.valueOf()===g.end.valueOf()}))}for(var y in i)for(var m=0,E=Le(i[y],n);m<E.length;m++){var S,b=E[m];p=l[(S=a[y]).defId];s.push({def:S,ui:p,instance:null,range:b,isStart:!1,isEnd:!1})}for(var c in o)for(var D=0,T=Le(o[c],n);D<T.length;D++){b=T[D];s.push({def:e.defs[c],ui:l[c],instance:null,range:b,isStart:!1,isEnd:!1})}return{bg:s,fg:u}}function ft(e,t,n){e.hasPublicHandlers("eventRender")&&(t=t.filter(function(t){var r=e.publiclyTrigger("eventRender",[{event:new ct(e.calendar,t.eventRange.def,t.eventRange.instance),isMirror:n,isStart:t.isStart,isEnd:t.isEnd,el:t.el,view:e}]);return!1!==r&&(r&&!0!==r&&(t.el=r),!0)}));for(var r=0,i=t;r<i.length;r++){var o=i[r];pt(o.el,o)}return t}function pt(e,t){e.fcSeg=t}function ht(e){return e.fcSeg||null}function vt(e,t){return Re(e,function(e){return gt(e,t)})}function gt(e,t){var n=[];return t[""]&&n.push(t[""]),t[e.defId]&&n.push(t[e.defId]),n.push(e.ui),Ut(n)}function yt(e,t,n,r){var i=vt(e.defs,t),o={defs:{},instances:{}};for(var a in e.defs){var s=e.defs[a];o.defs[a]=mt(s,i[a],n,r.pluginSystem.hooks.eventDefMutationAppliers,r)}for(var u in e.instances){var l=e.instances[u];s=o.defs[l.defId];o.instances[u]=Et(l,s,i[l.defId],n,r)}return o}function mt(e,t,n,r,i){var o=n.standardProps||{};null==o.hasEnd&&t.durationEditable&&(n.startDelta||n.endDelta)&&(o.hasEnd=!0);var a=Se({},e,o,{ui:Se({},e.ui,o.ui)});n.extendedProps&&(a.extendedProps=Se({},a.extendedProps,n.extendedProps));for(var s=0,u=r;s<u.length;s++){(0,u[s])(a,n,i)}return!a.hasEnd&&i.opt("forceEventDuration")&&(a.hasEnd=!0),a}function Et(e,t,n,r,i){var o=i.dateEnv,a=r.standardProps&&!0===r.standardProps.allDay,s=r.standardProps&&!1===r.standardProps.hasEnd,u=Se({},e);return a&&(u.range=ve(u.range)),r.datesDelta&&n.startEditable&&(u.range={start:o.add(u.range.start,r.datesDelta),end:o.add(u.range.end,r.datesDelta)}),r.startDelta&&n.durationEditable&&(u.range={start:o.add(u.range.start,r.startDelta),end:u.range.end}),r.endDelta&&n.durationEditable&&(u.range={start:u.range.start,end:o.add(u.range.end,r.endDelta)}),s&&(u.range={start:u.range.start,end:i.getDefaultEventEnd(t.allDay,u.range.start)}),t.allDay&&(u.range={start:B(u.range.start),end:B(u.range.end)}),u.range.end<u.range.start&&(u.range.end=i.getDefaultEventEnd(t.allDay,u.range.start)),u}function St(e,t,n,r,i){switch(t.type){case"RECEIVE_EVENTS":return function(e,t,n,r,i,o){if(t&&n===t.latestFetchId){var a=ke(function(e,t,n){var r=n.opt("eventDataTransform"),i=t?t.eventDataTransform:null;return i&&(e=xe(e,i)),r&&(e=xe(e,r)),e}(i,t,o),t.sourceId,o);return r&&(a=_e(a,r,o)),Ne(bt(e,t.sourceId),a)}return e}(e,n[t.sourceId],t.fetchId,t.fetchRange,t.rawEvents,i);case"ADD_EVENTS":return function(e,t,n,r){n&&(t=_e(t,n,r));return Ne(e,t)}(e,t.eventStore,r?r.activeRange:null,i);case"MERGE_EVENTS":return Ne(e,t.eventStore);case"PREV":case"NEXT":case"SET_DATE":case"SET_VIEW_TYPE":return r?_e(e,r.activeRange,i):e;case"CHANGE_TIMEZONE":return function(e,t,n){var r=e.defs,i=Re(e.instances,function(e){var i=r[e.defId];return i.allDay||i.recurringDef?e:Se({},e,{range:{start:n.createMarker(t.toDate(e.range.start,e.forcedStartTzo)),end:n.createMarker(t.toDate(e.range.end,e.forcedEndTzo))},forcedStartTzo:n.canComputeOffset?null:e.forcedStartTzo,forcedEndTzo:n.canComputeOffset?null:e.forcedEndTzo})});return{defs:r,instances:i}}(e,t.oldDateEnv,i.dateEnv);case"MUTATE_EVENTS":return function(e,t,n,r,i){var o=Pe(e,t),a=r?{"":{startEditable:!0,durationEditable:!0,constraints:[],overlap:null,allows:[],backgroundColor:"",borderColor:"",textColor:"",classNames:[]}}:i.eventUiBases;return o=yt(o,a,n,i),Ne(e,o)}(e,t.instanceId,t.mutation,t.fromApi,i);case"REMOVE_EVENT_INSTANCES":return Dt(e,t.instances);case"REMOVE_EVENT_DEF":return ze(e,function(e){return e.defId!==t.defId});case"REMOVE_EVENT_SOURCE":return bt(e,t.sourceId);case"REMOVE_ALL_EVENT_SOURCES":return ze(e,function(e){return!e.sourceId});case"REMOVE_ALL_EVENTS":return{defs:{},instances:{}};case"RESET_EVENTS":return{defs:e.defs,instances:e.instances};default:return e}}function bt(e,t){return ze(e,function(e){return e.sourceId!==t})}function Dt(e,t){return{defs:e.defs,instances:we(e.instances,function(e){return!t[e.instanceId]})}}function Tt(e,t){return wt({eventDrag:e},t)}function wt(e,t){var n=t.view,r=Se({businessHours:n?n.props.businessHours:{defs:{},instances:{}},dateSelection:"",eventStore:t.state.eventStore,eventUiBases:t.eventUiBases,eventSelection:"",eventDrag:null,eventResize:null},e);return(t.pluginSystem.hooks.isPropsValid||Rt)(r,t)}function Rt(e,t,n,r){return void 0===n&&(n={}),!(e.eventDrag&&!function(e,t,n,r){var i=e.eventDrag,o=i.mutatedEvents,a=o.defs,s=o.instances,u=vt(a,i.isEvent?e.eventUiBases:{"":t.selectionConfig});r&&(u=Re(u,r));var l=Dt(e.eventStore,i.affectedEvents.instances),c=l.defs,d=l.instances,f=vt(c,e.eventUiBases);for(var p in s){var h=s[p],v=h.range,g=u[h.defId],y=a[h.defId];if(!It(g.constraints,v,l,e.businessHours,t))return!1;var m=t.opt("eventOverlap");for(var E in"function"!=typeof m&&(m=null),d){var S=d[E];if(Fe(v,S.range)){var b=f[S.defId].overlap;if(!1===b&&i.isEvent)return!1;if(!1===g.overlap)return!1;if(m&&!m(new ct(t,c[S.defId],S),new ct(t,y,h)))return!1}}for(var D=t.state.eventStore,T=0,w=g.allows;T<w.length;T++){var R=w[T],I=Se({},n,{range:h.range,allDay:y.allDay}),C=D.defs[y.defId],M=D.instances[p],k=void 0;if(k=C?new ct(t,C,M):new ct(t,y),!R(t.buildDateSpanApi(I),k))return!1}}return!0}(e,t,n,r))&&!(e.dateSelection&&!function(e,t,n,r){var i=e.eventStore,o=i.defs,a=i.instances,s=e.dateSelection,u=s.range,l=t.selectionConfig;r&&(l=r(l));if(!It(l.constraints,u,i,e.businessHours,t))return!1;var c=t.opt("selectOverlap");"function"!=typeof c&&(c=null);for(var d in a){var f=a[d];if(Fe(u,f.range)){if(!1===l.overlap)return!1;if(c&&!c(new ct(t,o[f.defId],f)))return!1}}for(var p=0,h=l.allows;p<h.length;p++){var v=h[p],g=Se({},n,s);if(!v(t.buildDateSpanApi(g),null))return!1}return!0}(e,t,n,r))}function It(e,t,n,r,i){for(var o=0,a=e;o<a.length;o++){if(!kt(Ct(a[o],t,n,r,i),t))return!1}return!0}function Ct(e,t,n,r,i){return"businessHours"===e?Mt(_e(r,t,i)):"string"==typeof e?Mt(ze(n,function(t){return t.groupId===e})):"object"==typeof e&&e?Mt(_e(e,t,i)):[]}function Mt(e){var t=e.instances,n=[];for(var r in t)n.push(t[r].range);return n}function kt(e,t){for(var n=0,r=e;n<r.length;n++){if(We(r[n],t))return!0}return!1}function Ot(e){return(e+"").replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/'/g,"&#039;").replace(/"/g,"&quot;").replace(/\n/g,"<br />")}function _t(e){var t=[];for(var n in e){var r=e[n];null!=r&&""!==r&&t.push(n+":"+r)}return t.join(";")}function Pt(e){return Array.isArray(e)?e:"string"==typeof e?e.split(/\s+/):[]}var xt={editable:Boolean,startEditable:Boolean,durationEditable:Boolean,constraint:null,overlap:null,allow:null,className:Pt,classNames:Pt,color:String,backgroundColor:String,borderColor:String,textColor:String};function Ht(e,t,n){var r=he(e,xt,{},n),i=function(e,t){return Array.isArray(e)?ke(e,"",t,!0):"object"==typeof e&&e?ke([e],"",t,!0):null!=e?String(e):null}(r.constraint,t);return{startEditable:null!=r.startEditable?r.startEditable:r.editable,durationEditable:null!=r.durationEditable?r.durationEditable:r.editable,constraints:null!=i?[i]:[],overlap:r.overlap,allows:null!=r.allow?[r.allow]:[],backgroundColor:r.backgroundColor||r.color,borderColor:r.borderColor||r.color,textColor:r.textColor,classNames:r.classNames.concat(r.className)}}function Nt(e,t,n,r){var i={},o={};for(var a in xt){var s=e+ue(a);i[a]=t[s],o[s]=!0}if("event"===e&&(i.editable=t.editable),r)for(var a in t)o[a]||(r[a]=t[a]);return Ht(i,n)}var zt={startEditable:null,durationEditable:null,constraints:[],overlap:null,allows:[],backgroundColor:"",borderColor:"",textColor:"",classNames:[]};function Ut(e){return e.reduce(Lt,zt)}function Lt(e,t){return{startEditable:null!=t.startEditable?t.startEditable:e.startEditable,durationEditable:null!=t.durationEditable?t.durationEditable:e.durationEditable,constraints:e.constraints.concat(t.constraints),overlap:"boolean"==typeof t.overlap?t.overlap:e.overlap,allows:e.allows.concat(t.allows),backgroundColor:t.backgroundColor||e.backgroundColor,borderColor:t.borderColor||e.borderColor,textColor:t.textColor||e.textColor,classNames:e.classNames.concat(t.classNames)}}var Bt={id:String,groupId:String,title:String,url:String,rendering:String,extendedProps:null},Vt={start:null,date:null,end:null,allDay:null},At=0;function Ft(e,t,n,r){var i=function(e,t){var n=null;if(e){var r=t.state.eventSources[e];n=r.allDayDefault}null==n&&(n=t.opt("allDayDefault"));return n}(t,n),o={},a=function(e,t,n,r,i){for(var o=0;o<r.length;o++){var a={},s=r[o].parse(e,a,n);if(s){var u=a.allDay;return delete a.allDay,null==u&&null==(u=t)&&null==(u=s.allDayGuess)&&(u=!1),Se(i,a),{allDay:u,duration:s.duration,typeData:s.typeData,typeId:o}}}return null}(e,i,n.dateEnv,n.pluginSystem.hooks.recurringTypes,o);if(a)return(s=Wt(o,t,a.allDay,Boolean(a.duration),n)).recurringDef={typeId:a.typeId,typeData:a.typeData,duration:a.duration},{def:s,instance:null};var s,u={},l=function(e,t,n,r,i){var o,a,s=function(e,t){var n=he(e,Vt,{},t);return n.start=null!==n.start?n.start:n.date,delete n.date,n}(e,r),u=s.allDay,l=null,c=!1,d=null;if(o=n.dateEnv.createMarkerMeta(s.start))l=o.marker;else if(!i)return null;null!=s.end&&(a=n.dateEnv.createMarkerMeta(s.end));null==u&&(u=null!=t?t:(!o||o.isTimeUnspecified)&&(!a||a.isTimeUnspecified));u&&l&&(l=B(l));a&&(d=a.marker,u&&(d=B(d)),l&&d<=l&&(d=null));d?c=!0:i||(c=n.opt("forceEventDuration")||!1,d=n.dateEnv.add(l,u?n.defaultAllDayEventDuration:n.defaultTimedEventDuration));return{allDay:u,hasEnd:c,range:{start:l,end:d},forcedStartTzo:o?o.forcedTzo:null,forcedEndTzo:a?a.forcedTzo:null}}(e,i,n,u,r);return l?{def:s=Wt(u,t,l.allDay,l.hasEnd,n),instance:Zt(s.defId,l.range,l.forcedStartTzo,l.forcedEndTzo)}:null}function Wt(e,t,n,r,i){var o={},a=function(e,t,n){var r={},i=he(e,Bt,{},r),o=Ht(r,t,n);return i.publicId=i.id,delete i.id,i.ui=o,i}(e,i,o);a.defId=String(At++),a.sourceId=t,a.allDay=n,a.hasEnd=r;for(var s=0,u=i.pluginSystem.hooks.eventDefParsers;s<u.length;s++){var l={};(0,u[s])(a,o,l),o=l}return a.extendedProps=Se(o,a.extendedProps||{}),Object.freeze(a.ui.classNames),Object.freeze(a.extendedProps),a}function Zt(e,t,n,r){return{instanceId:String(At++),defId:e,range:t,forcedStartTzo:null==n?null:n,forcedEndTzo:null==r?null:r}}var jt={startTime:"09:00",endTime:"17:00",daysOfWeek:[1,2,3,4,5],rendering:"inverse-background",classNames:"fc-nonbusiness",groupId:"_businessHours"};function Yt(e,t){return ke(function(e){var t;t=!0===e?[{}]:Array.isArray(e)?e.filter(function(e){return e.daysOfWeek}):"object"==typeof e&&e?[e]:[];return t=t.map(function(e){return Se({},jt,e)})}(e),"",t)}function qt(e,t,n){void 0===n&&(n=[]);var r,i,o=[];function a(){if(i){for(var e=0,n=o;e<n.length;e++){n[e].unrender()}t&&t.apply(r,i),i=null}}function s(){i&&je(i,arguments)||(a(),r=this,i=arguments,e.apply(this,arguments))}s.dependents=o,s.unrender=a;for(var u=0,l=n;u<l.length;u++){l[u].dependents.push(s)}return s}var Gt={defs:{},instances:{}},Xt=function(){function e(){this.getKeysForEventDefs=Ye(this._getKeysForEventDefs),this.splitDateSelection=Ye(this._splitDateSpan),this.splitEventStore=Ye(this._splitEventStore),this.splitIndividualUi=Ye(this._splitIndividualUi),this.splitEventDrag=Ye(this._splitInteraction),this.splitEventResize=Ye(this._splitInteraction),this.eventUiBuilders={}}return e.prototype.splitProps=function(e){var t=this,n=this.getKeyInfo(e),r=this.getKeysForEventDefs(e.eventStore),i=this.splitDateSelection(e.dateSelection),o=this.splitIndividualUi(e.eventUiBases,r),a=this.splitEventStore(e.eventStore,r),s=this.splitEventDrag(e.eventDrag),u=this.splitEventResize(e.eventResize),l={};for(var c in this.eventUiBuilders=Re(n,function(e,n){return t.eventUiBuilders[n]||Ye(Jt)}),n){var d=n[c],f=a[c]||Gt,p=this.eventUiBuilders[c];l[c]={businessHours:d.businessHours||e.businessHours,dateSelection:i[c]||null,eventStore:f,eventUiBases:p(e.eventUiBases[""],d.ui,o[c]),eventSelection:f.instances[e.eventSelection]?e.eventSelection:"",eventDrag:s[c]||null,eventResize:u[c]||null}}return l},e.prototype._splitDateSpan=function(e){var t={};if(e)for(var n=0,r=this.getKeysForDateSpan(e);n<r.length;n++){t[r[n]]=e}return t},e.prototype._getKeysForEventDefs=function(e){var t=this;return Re(e.defs,function(e){return t.getKeysForEventDef(e)})},e.prototype._splitEventStore=function(e,t){var n=e.defs,r=e.instances,i={};for(var o in n)for(var a=0,s=t[o];a<s.length;a++){i[f=s[a]]||(i[f]={defs:{},instances:{}}),i[f].defs[o]=n[o]}for(var u in r)for(var l=r[u],c=0,d=t[l.defId];c<d.length;c++){var f;i[f=d[c]]&&(i[f].instances[u]=l)}return i},e.prototype._splitIndividualUi=function(e,t){var n={};for(var r in e)if(r)for(var i=0,o=t[r];i<o.length;i++){var a=o[i];n[a]||(n[a]={}),n[a][r]=e[r]}return n},e.prototype._splitInteraction=function(e){var t={};if(e){var n=this._splitEventStore(e.affectedEvents,this._getKeysForEventDefs(e.affectedEvents)),r=this._getKeysForEventDefs(e.mutatedEvents),i=this._splitEventStore(e.mutatedEvents,r),o=function(r){t[r]||(t[r]={affectedEvents:n[r]||Gt,mutatedEvents:i[r]||Gt,isEvent:e.isEvent,origSeg:e.origSeg})};for(var a in n)o(a);for(var a in i)o(a)}return t},e}();function Jt(e,t,n){var r=[];e&&r.push(e),t&&r.push(t);var i={"":Ut(r)};return n&&Se(i,n),i}function Kt(e,t,n,r){var i,o,a,s,u=e.dateEnv;return t instanceof Date?i=t:(i=t.date,o=t.type,a=t.forceOff),s={date:u.formatIso(i,{omitTime:!0}),type:o||"day"},"string"==typeof n&&(r=n,n=null),n=n?" "+function(e){var t=[];for(var n in e){var r=e[n];null!=r&&t.push(n+'="'+Ot(r)+'"')}return t.join(" ")}(n):"",r=r||"",!a&&e.opt("navLinks")?"<a"+n+' data-goto="'+Ot(JSON.stringify(s))+'">'+r+"</a>":"<span"+n+">"+r+"</span>"}function Qt(e,t,n,r){var i,o,a=n.calendar,s=n.view,u=n.theme,l=n.dateEnv,c=[];return Ze(t.activeRange,e)?(c.push("fc-"+P[e.getUTCDay()]),s.opt("monthMode")&&l.getMonth(e)!==l.getMonth(t.currentRange.start)&&c.push("fc-other-month"),o=x(i=B(a.getNow()),1),e<i?c.push("fc-past"):e>=o?c.push("fc-future"):(c.push("fc-today"),!0!==r&&c.push(u.getClass("today")))):c.push("fc-disabled-day"),c}function $t(e,t,n){var r=!1,i=function(){r||(r=!0,t.apply(this,arguments))},o=function(){r||(r=!0,n&&n.apply(this,arguments))},a=e(i,o);a&&"function"==typeof a.then&&a.then(i,o)}var en=function(){function e(){}return e.mixInto=function(e){this.mixIntoObj(e.prototype)},e.mixIntoObj=function(e){var t=this;Object.getOwnPropertyNames(this.prototype).forEach(function(n){e[n]||(e[n]=t.prototype[n])})},e.mixOver=function(e){var t=this;Object.getOwnPropertyNames(this.prototype).forEach(function(n){e.prototype[n]=t.prototype[n]})},e}(),tn=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return Ee(t,e),t.prototype.on=function(e,t){return nn(this._handlers||(this._handlers={}),e,t),this},t.prototype.one=function(e,t){return nn(this._oneHandlers||(this._oneHandlers={}),e,t),this},t.prototype.off=function(e,t){return this._handlers&&rn(this._handlers,e,t),this._oneHandlers&&rn(this._oneHandlers,e,t),this},t.prototype.trigger=function(e){for(var t=[],n=1;n<arguments.length;n++)t[n-1]=arguments[n];return this.triggerWith(e,this,t),this},t.prototype.triggerWith=function(e,t,n){return this._handlers&&de(this._handlers[e],t,n),this._oneHandlers&&(de(this._oneHandlers[e],t,n),delete this._oneHandlers[e]),this},t.prototype.hasHandlers=function(e){return this._handlers&&this._handlers[e]&&this._handlers[e].length||this._oneHandlers&&this._oneHandlers[e]&&this._oneHandlers[e].length},t}(en);function nn(e,t,n){(e[t]||(e[t]=[])).push(n)}function rn(e,t,n){n?e[t]&&(e[t]=e[t].filter(function(e){return e!==n})):delete e[t]}var on=function(){function e(e,t,n,r){this.originEl=e,this.els=t,this.isHorizontal=n,this.isVertical=r}return e.prototype.build=function(){var e=this.originEl,t=this.originClientRect=e.getBoundingClientRect();this.isHorizontal&&this.buildElHorizontals(t.left),this.isVertical&&this.buildElVerticals(t.top)},e.prototype.buildElHorizontals=function(e){for(var t=[],n=[],r=0,i=this.els;r<i.length;r++){var o=i[r].getBoundingClientRect();t.push(o.left-e),n.push(o.right-e)}this.lefts=t,this.rights=n},e.prototype.buildElVerticals=function(e){for(var t=[],n=[],r=0,i=this.els;r<i.length;r++){var o=i[r].getBoundingClientRect();t.push(o.top-e),n.push(o.bottom-e)}this.tops=t,this.bottoms=n},e.prototype.leftToIndex=function(e){var t,n=this.lefts,r=this.rights,i=n.length;for(t=0;t<i;t++)if(e>=n[t]&&e<r[t])return t},e.prototype.topToIndex=function(e){var t,n=this.tops,r=this.bottoms,i=n.length;for(t=0;t<i;t++)if(e>=n[t]&&e<r[t])return t},e.prototype.getWidth=function(e){return this.rights[e]-this.lefts[e]},e.prototype.getHeight=function(e){return this.bottoms[e]-this.tops[e]},e}(),an=function(){function e(){}return e.prototype.getMaxScrollTop=function(){return this.getScrollHeight()-this.getClientHeight()},e.prototype.getMaxScrollLeft=function(){return this.getScrollWidth()-this.getClientWidth()},e.prototype.canScrollVertically=function(){return this.getMaxScrollTop()>0},e.prototype.canScrollHorizontally=function(){return this.getMaxScrollLeft()>0},e.prototype.canScrollUp=function(){return this.getScrollTop()>0},e.prototype.canScrollDown=function(){return this.getScrollTop()<this.getMaxScrollTop()},e.prototype.canScrollLeft=function(){return this.getScrollLeft()>0},e.prototype.canScrollRight=function(){return this.getScrollLeft()<this.getMaxScrollLeft()},e}(),sn=function(e){function t(t){var n=e.call(this)||this;return n.el=t,n}return Ee(t,e),t.prototype.getScrollTop=function(){return this.el.scrollTop},t.prototype.getScrollLeft=function(){return this.el.scrollLeft},t.prototype.setScrollTop=function(e){this.el.scrollTop=e},t.prototype.setScrollLeft=function(e){this.el.scrollLeft=e},t.prototype.getScrollWidth=function(){return this.el.scrollWidth},t.prototype.getScrollHeight=function(){return this.el.scrollHeight},t.prototype.getClientHeight=function(){return this.el.clientHeight},t.prototype.getClientWidth=function(){return this.el.clientWidth},t}(an),un=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return Ee(t,e),t.prototype.getScrollTop=function(){return window.pageYOffset},t.prototype.getScrollLeft=function(){return window.pageXOffset},t.prototype.setScrollTop=function(e){window.scroll(window.pageXOffset,e)},t.prototype.setScrollLeft=function(e){window.scroll(e,window.pageYOffset)},t.prototype.getScrollWidth=function(){return document.documentElement.scrollWidth},t.prototype.getScrollHeight=function(){return document.documentElement.scrollHeight},t.prototype.getClientHeight=function(){return document.documentElement.clientHeight},t.prototype.getClientWidth=function(){return document.documentElement.clientWidth},t}(an),ln=function(e){function t(t,n){var i=e.call(this,r("div",{className:"fc-scroller"}))||this;return i.overflowX=t,i.overflowY=n,i.applyOverflow(),i}return Ee(t,e),t.prototype.clear=function(){this.setHeight("auto"),this.applyOverflow()},t.prototype.destroy=function(){c(this.el)},t.prototype.applyOverflow=function(){y(this.el,{overflowX:this.overflowX,overflowY:this.overflowY})},t.prototype.lockOverflow=function(e){var t=this.overflowX,n=this.overflowY;e=e||this.getScrollbarWidths(),"auto"===t&&(t=e.bottom||this.canScrollHorizontally()?"scroll":"hidden"),"auto"===n&&(n=e.left||e.right||this.canScrollVertically()?"scroll":"hidden"),y(this.el,{overflowX:t,overflowY:n})},t.prototype.setHeight=function(e){m(this.el,"height",e)},t.prototype.getScrollbarWidths=function(){var e=T(this.el);return{left:e.scrollbarLeft,right:e.scrollbarRight,bottom:e.scrollbarBottom}},t}(sn),cn=function(){function e(e){this.calendarOptions=e,this.processIconOverride()}return e.prototype.processIconOverride=function(){this.iconOverrideOption&&this.setIconOverride(this.calendarOptions[this.iconOverrideOption])},e.prototype.setIconOverride=function(e){var t,n;if("object"==typeof e&&e){for(n in t=Se({},this.iconClasses),e)t[n]=this.applyIconOverridePrefix(e[n]);this.iconClasses=t}else!1===e&&(this.iconClasses={})},e.prototype.applyIconOverridePrefix=function(e){var t=this.iconOverridePrefix;return t&&0!==e.indexOf(t)&&(e=t+e),e},e.prototype.getClass=function(e){return this.classes[e]||""},e.prototype.getIconClass=function(e){var t=this.iconClasses[e];return t?this.baseIconClass+" "+t:""},e.prototype.getCustomButtonIconClass=function(e){var t;return this.iconOverrideCustomButtonOption&&(t=e[this.iconOverrideCustomButtonOption])?this.baseIconClass+" "+this.applyIconOverridePrefix(t):""},e}();cn.prototype.classes={},cn.prototype.iconClasses={},cn.prototype.baseIconClass="",cn.prototype.iconOverridePrefix="";var dn=0,fn=function(){function e(e,t){t&&(e.view=this),this.uid=String(dn++),this.context=e,this.dateEnv=e.dateEnv,this.theme=e.theme,this.view=e.view,this.calendar=e.calendar,this.isRtl="rtl"===this.opt("dir")}return e.addEqualityFuncs=function(e){this.prototype.equalityFuncs=Se({},this.prototype.equalityFuncs,e)},e.prototype.opt=function(e){return this.context.options[e]},e.prototype.receiveProps=function(e){var t=function(e,t,n){var r={},i=!1;for(var o in t)o in e&&(e[o]===t[o]||n[o]&&n[o](e[o],t[o]))?r[o]=e[o]:(r[o]=t[o],i=!0);for(var o in e)if(!(o in t)){i=!0;break}return{anyChanges:i,comboProps:r}}(this.props||{},e,this.equalityFuncs),n=t.anyChanges,r=t.comboProps;this.props=r,n&&this.render(r)},e.prototype.render=function(e){},e.prototype.destroy=function(){},e}();fn.prototype.equalityFuncs={};var pn=function(e){function t(t,n,r){var i=e.call(this,t,r)||this;return i.el=n,i}return Ee(t,e),t.prototype.destroy=function(){e.prototype.destroy.call(this),c(this.el)},t.prototype.buildPositionCaches=function(){},t.prototype.queryHit=function(e,t,n,r){return null},t.prototype.isInteractionValid=function(e){var t=this.calendar,n=this.props.dateProfile,r=e.mutatedEvents.instances;if(n)for(var i in r)if(!We(n.validRange,r[i].range))return!1;return Tt(e,t)},t.prototype.isDateSelectionValid=function(e){var t,n,r=this.props.dateProfile;return!(r&&!We(r.validRange,e.range))&&(t=e,n=this.calendar,wt({dateSelection:t},n))},t.prototype.publiclyTrigger=function(e,t){return this.calendar.publiclyTrigger(e,t)},t.prototype.publiclyTriggerAfterSizing=function(e,t){return this.calendar.publiclyTriggerAfterSizing(e,t)},t.prototype.hasPublicHandlers=function(e){return this.calendar.hasPublicHandlers(e)},t.prototype.triggerRenderedSegs=function(e,t){var n=this.calendar;if(this.hasPublicHandlers("eventPositioned"))for(var r=0,i=e;r<i.length;r++){var o=i[r];this.publiclyTriggerAfterSizing("eventPositioned",[{event:new ct(n,o.eventRange.def,o.eventRange.instance),isMirror:t,isStart:o.isStart,isEnd:o.isEnd,el:o.el,view:this}])}n.state.loadingLevel||(n.afterSizingTriggers._eventsPositioned=[null])},t.prototype.triggerWillRemoveSegs=function(e,t){for(var n=this.calendar,r=0,i=e;r<i.length;r++){var o=i[r];n.trigger("eventElRemove",o.el)}if(this.hasPublicHandlers("eventDestroy"))for(var a=0,s=e;a<s.length;a++){o=s[a];this.publiclyTrigger("eventDestroy",[{event:new ct(n,o.eventRange.def,o.eventRange.instance),isMirror:t,el:o.el,view:this}])}},t.prototype.isValidSegDownEl=function(e){return!this.props.eventDrag&&!this.props.eventResize&&!p(e,".fc-mirror")&&(this.isPopover()||!this.isInPopover(e))},t.prototype.isValidDateDownEl=function(e){var t=p(e,this.fgSegSelector);return(!t||t.classList.contains("fc-mirror"))&&!p(e,".fc-more")&&!p(e,"a[data-goto]")&&!this.isInPopover(e)},t.prototype.isPopover=function(){return this.el.classList.contains("fc-popover")},t.prototype.isInPopover=function(e){return Boolean(p(e,".fc-popover"))},t}(fn);pn.prototype.fgSegSelector=".fc-event-container > *",pn.prototype.bgSegSelector=".fc-bgevent:not(.fc-nonbusiness)";var hn=0;function vn(e){return{id:String(hn++),deps:e.deps||[],reducers:e.reducers||[],eventDefParsers:e.eventDefParsers||[],isDraggableTransformers:e.isDraggableTransformers||[],eventDragMutationMassagers:e.eventDragMutationMassagers||[],eventDefMutationAppliers:e.eventDefMutationAppliers||[],dateSelectionTransformers:e.dateSelectionTransformers||[],datePointTransforms:e.datePointTransforms||[],dateSpanTransforms:e.dateSpanTransforms||[],views:e.views||{},viewPropsTransformers:e.viewPropsTransformers||[],isPropsValid:e.isPropsValid||null,externalDefTransforms:e.externalDefTransforms||[],eventResizeJoinTransforms:e.eventResizeJoinTransforms||[],viewContainerModifiers:e.viewContainerModifiers||[],eventDropTransformers:e.eventDropTransformers||[],componentInteractions:e.componentInteractions||[],calendarInteractions:e.calendarInteractions||[],themeClasses:e.themeClasses||{},eventSourceDefs:e.eventSourceDefs||[],cmdFormatter:e.cmdFormatter,recurringTypes:e.recurringTypes||[],namedTimeZonedImpl:e.namedTimeZonedImpl,defaultView:e.defaultView||"",elementDraggingImpl:e.elementDraggingImpl,optionChangeHandlers:e.optionChangeHandlers||{}}}var gn=function(){function e(){this.hooks={reducers:[],eventDefParsers:[],isDraggableTransformers:[],eventDragMutationMassagers:[],eventDefMutationAppliers:[],dateSelectionTransformers:[],datePointTransforms:[],dateSpanTransforms:[],views:{},viewPropsTransformers:[],isPropsValid:null,externalDefTransforms:[],eventResizeJoinTransforms:[],viewContainerModifiers:[],eventDropTransformers:[],componentInteractions:[],calendarInteractions:[],themeClasses:{},eventSourceDefs:[],cmdFormatter:null,recurringTypes:[],namedTimeZonedImpl:null,defaultView:"",elementDraggingImpl:null,optionChangeHandlers:{}},this.addedHash={}}return e.prototype.add=function(e){if(!this.addedHash[e.id]){this.addedHash[e.id]=!0;for(var t=0,n=e.deps;t<n.length;t++){var r=n[t];this.add(r)}this.hooks=(i=this.hooks,o=e,{reducers:i.reducers.concat(o.reducers),eventDefParsers:i.eventDefParsers.concat(o.eventDefParsers),isDraggableTransformers:i.isDraggableTransformers.concat(o.isDraggableTransformers),eventDragMutationMassagers:i.eventDragMutationMassagers.concat(o.eventDragMutationMassagers),eventDefMutationAppliers:i.eventDefMutationAppliers.concat(o.eventDefMutationAppliers),dateSelectionTransformers:i.dateSelectionTransformers.concat(o.dateSelectionTransformers),datePointTransforms:i.datePointTransforms.concat(o.datePointTransforms),dateSpanTransforms:i.dateSpanTransforms.concat(o.dateSpanTransforms),views:Se({},i.views,o.views),viewPropsTransformers:i.viewPropsTransformers.concat(o.viewPropsTransformers),isPropsValid:o.isPropsValid||i.isPropsValid,externalDefTransforms:i.externalDefTransforms.concat(o.externalDefTransforms),eventResizeJoinTransforms:i.eventResizeJoinTransforms.concat(o.eventResizeJoinTransforms),viewContainerModifiers:i.viewContainerModifiers.concat(o.viewContainerModifiers),eventDropTransformers:i.eventDropTransformers.concat(o.eventDropTransformers),calendarInteractions:i.calendarInteractions.concat(o.calendarInteractions),componentInteractions:i.componentInteractions.concat(o.componentInteractions),themeClasses:Se({},i.themeClasses,o.themeClasses),eventSourceDefs:i.eventSourceDefs.concat(o.eventSourceDefs),cmdFormatter:o.cmdFormatter||i.cmdFormatter,recurringTypes:i.recurringTypes.concat(o.recurringTypes),namedTimeZonedImpl:o.namedTimeZonedImpl||i.namedTimeZonedImpl,defaultView:i.defaultView||o.defaultView,elementDraggingImpl:i.elementDraggingImpl||o.elementDraggingImpl,optionChangeHandlers:Se({},i.optionChangeHandlers,o.optionChangeHandlers)})}var i,o},e}();var yn=vn({eventSourceDefs:[{ignoreRange:!0,parseMeta:function(e){return Array.isArray(e)?e:Array.isArray(e.events)?e.events:null},fetch:function(e,t){t({rawEvents:e.eventSource.meta})}}]}),mn=vn({eventSourceDefs:[{parseMeta:function(e){return"function"==typeof e?e:"function"==typeof e.events?e.events:null},fetch:function(e,t,n){var r=e.calendar.dateEnv;$t(e.eventSource.meta.bind(null,{start:r.toDate(e.range.start),end:r.toDate(e.range.end),startStr:r.formatIso(e.range.start),endStr:r.formatIso(e.range.end),timeZone:r.timeZone}),function(e){t({rawEvents:e})},n)}}]});function En(e,t,n,r,i){var o=null;"GET"===(e=e.toUpperCase())?t=function(e,t){return e+(-1===e.indexOf("?")?"?":"&")+Sn(t)}(t,n):o=Sn(n);var a=new XMLHttpRequest;a.open(e,t,!0),"GET"!==e&&a.setRequestHeader("Content-Type","application/x-www-form-urlencoded"),a.onload=function(){if(a.status>=200&&a.status<400)try{var e=JSON.parse(a.responseText);r(e,a)}catch(e){i("Failure parsing JSON",a)}else i("Request failed",a)},a.onerror=function(){i("Request failed",a)},a.send(o)}function Sn(e){var t=[];for(var n in e)t.push(encodeURIComponent(n)+"="+encodeURIComponent(e[n]));return t.join("&")}var bn=vn({eventSourceDefs:[{parseMeta:function(e){if("string"==typeof e)e={url:e};else if(!e||"object"!=typeof e||!e.url)return null;return{url:e.url,method:(e.method||"GET").toUpperCase(),extraParams:e.extraParams,startParam:e.startParam,endParam:e.endParam,timeZoneParam:e.timeZoneParam}},fetch:function(e,t,n){var r=e.eventSource.meta,i=function(e,t,n){var r,i,o,a,s=n.dateEnv,u={};null==(r=e.startParam)&&(r=n.opt("startParam"));null==(i=e.endParam)&&(i=n.opt("endParam"));null==(o=e.timeZoneParam)&&(o=n.opt("timeZoneParam"));a="function"==typeof e.extraParams?e.extraParams():e.extraParams||{};Se(u,a),u[r]=s.formatIso(t.start),u[i]=s.formatIso(t.end),"local"!==s.timeZone&&(u[o]=s.timeZone);return u}(r,e.range,e.calendar);En(r.method,r.url,i,function(e,n){t({rawEvents:e,xhr:n})},function(e,t){n({message:e,xhr:t})})}}]});var Dn=vn({recurringTypes:[{parse:function(e,t,n){var r,i,o=n.createMarker.bind(n),a=he(e,{daysOfWeek:null,startTime:J,endTime:J,startRecur:o,endRecur:o},{},t),s=!1;for(var u in a)if(null!=a[u]){s=!0;break}if(s){var l=null;return"duration"in t&&(l=J(t.duration),delete t.duration),!l&&a.startTime&&a.endTime&&(r=a.endTime,i=a.startTime,l={years:r.years-i.years,months:r.months-i.months,days:r.days-i.days,milliseconds:r.milliseconds-i.milliseconds}),{allDayGuess:Boolean(!a.startTime&&!a.endTime),duration:l,typeData:a}}return null},expand:function(e,t,n){var r=Ve(t,{start:e.startRecur,end:e.endRecur});return r?function(e,t,n,r){var i=e?Ie(e):null,o=B(n.start),a=n.end,s=[];for(;o<a;){var u=void 0;i&&!i[o.getUTCDay()]||(u=t?r.add(o,t):o,s.push(u)),o=x(o,1)}return s}(e.daysOfWeek,e.startTime,r,n):[]}}]});var Tn=vn({optionChangeHandlers:{events:function(e,t,n){wn([e],t,n)},eventSources:wn,plugins:function(e,t){t.addPluginInputs(e)}}});function wn(e,t,n){for(var r=Ce(t.state.eventSources),i=[],o=0,a=e;o<a.length;o++){for(var s=a[o],u=!1,l=0;l<r.length;l++)if(n(r[l]._raw,s)){r.splice(l,1),u=!0;break}u||i.push(s)}for(var c=0,d=r;c<d.length;c++){var f=d[c];t.dispatch({type:"REMOVE_EVENT_SOURCE",sourceId:f.sourceId})}for(var p=0,h=i;p<h.length;p++){var v=h[p];t.addEventSource(v)}}var Rn={defaultRangeSeparator:" - ",titleRangeSeparator:" – ",defaultTimedEventDuration:"01:00:00",defaultAllDayEventDuration:{day:1},forceEventDuration:!1,nextDayThreshold:"00:00:00",columnHeader:!0,defaultView:"",aspectRatio:1.35,header:{left:"title",center:"",right:"today prev,next"},weekends:!0,weekNumbers:!1,weekNumberCalculation:"local",editable:!1,scrollTime:"06:00:00",minTime:"00:00:00",maxTime:"24:00:00",showNonCurrentDates:!0,lazyFetching:!0,startParam:"start",endParam:"end",timeZoneParam:"timeZone",timeZone:"local",locales:[],locale:"",timeGridEventMinHeight:0,themeSystem:"standard",dragRevertDuration:500,dragScroll:!0,allDayMaintainDuration:!1,unselectAuto:!0,dropAccept:"*",eventOrder:"start,-duration,allDay,title",eventLimit:!1,eventLimitClick:"popover",dayPopoverFormat:{month:"long",day:"numeric",year:"numeric"},handleWindowResize:!0,windowResizeDelay:100,longPressDelay:1e3,eventDragMinDistance:5},In={header:{left:"next,prev today",center:"",right:"title"},buttonIcons:{prev:"fc-icon-chevron-right",next:"fc-icon-chevron-left",prevYear:"fc-icon-chevrons-right",nextYear:"fc-icon-chevrons-left"}},Cn=["header","footer","buttonText","buttonIcons"];var Mn=[yn,mn,bn,Dn,Tn];var kn={code:"en",week:{dow:0,doy:4},dir:"ltr",buttonText:{prev:"prev",next:"next",prevYear:"prev year",nextYear:"next year",year:"year",today:"today",month:"month",week:"week",day:"day",list:"list"},weekLabel:"W",allDayText:"all-day",eventLimitText:"more",noEventsMessage:"No events to display"};function On(e){for(var t=e.length>0?e[0].code:"en",n=window.FullCalendarLocalesAll||[],r=window.FullCalendarLocales||{},i=n.concat(Ce(r),e),o={en:kn},a=0,s=i;a<s.length;a++){var u=s[a];o[u.code]=u}return{map:o,defaultCode:t}}function _n(e,t){return"object"!=typeof e||Array.isArray(e)?function(e,t){var n=[].concat(e||[]),r=function(e,t){for(var n=0;n<e.length;n++)for(var r=e[n].toLocaleLowerCase().split("-"),i=r.length;i>0;i--){var o=r.slice(0,i).join("-");if(t[o])return t[o]}return null}(n,t)||kn;return Pn(e,n,r)}(e,t):Pn(e.code,[e.code],e)}function Pn(e,t,n){var r=Te([kn,n],["buttonText"]);delete r.code;var i=r.week;return delete r.week,{codeArg:e,codes:t,week:i,simpleNumberFormat:new Intl.NumberFormat(e),options:r}}var xn=function(){function e(e){this.overrides=Se({},e),this.dynamicOverrides={},this.compute()}return e.prototype.mutate=function(e,t,n){var r=n?this.dynamicOverrides:this.overrides;Se(r,e);for(var i=0,o=t;i<o.length;i++){delete r[o[i]]}this.compute()},e.prototype.compute=function(){var e=fe(this.dynamicOverrides.locales,this.overrides.locales,Rn.locales),t=fe(this.dynamicOverrides.locale,this.overrides.locale,Rn.locale),n=On(e),r=_n(t||n.defaultCode,n.map).options,i="rtl"===fe(this.dynamicOverrides.dir,this.overrides.dir,r.dir)?In:{};this.dirDefaults=i,this.localeDefaults=r,this.computed=Te([Rn,i,r,this.overrides,this.dynamicOverrides],Cn)},e}(),Hn={};var Nn,zn=function(){function e(){}return e.prototype.getMarkerYear=function(e){return e.getUTCFullYear()},e.prototype.getMarkerMonth=function(e){return e.getUTCMonth()},e.prototype.getMarkerDay=function(e){return e.getUTCDate()},e.prototype.arrayToMarker=function(e){return j(e)},e.prototype.markerToArray=function(e){return Z(e)},e}();Nn=zn,Hn["gregory"]=Nn;var Un=/^\s*(\d{4})(-(\d{2})(-(\d{2})([T ](\d{2}):(\d{2})(:(\d{2})(\.(\d+))?)?(Z|(([-+])(\d{2})(:?(\d{2}))?))?)?)?)?$/;function Ln(e){var t=Un.exec(e);if(t){var n=new Date(Date.UTC(Number(t[1]),t[3]?Number(t[3])-1:0,Number(t[5]||1),Number(t[7]||0),Number(t[8]||0),Number(t[10]||0),t[12]?1e3*Number("0."+t[12]):0));if(Y(n)){var r=null;return t[13]&&(r=("-"===t[15]?-1:1)*(60*Number(t[16]||0)+Number(t[18]||0))),{marker:n,isTimeUnspecified:!t[6],timeZoneOffset:r}}}return null}var Bn=function(){function e(e){var t=this.timeZone=e.timeZone,n="local"!==t&&"UTC"!==t;e.namedTimeZoneImpl&&n&&(this.namedTimeZoneImpl=new e.namedTimeZoneImpl(t)),this.canComputeOffset=Boolean(!n||this.namedTimeZoneImpl),this.calendarSystem=function(e){return new Hn[e]}(e.calendarSystem),this.locale=e.locale,this.weekDow=e.locale.week.dow,this.weekDoy=e.locale.week.doy,"ISO"===e.weekNumberCalculation&&(this.weekDow=1,this.weekDoy=4),"number"==typeof e.firstDay&&(this.weekDow=e.firstDay),"function"==typeof e.weekNumberCalculation&&(this.weekNumberFunc=e.weekNumberCalculation),this.weekLabel=null!=e.weekLabel?e.weekLabel:e.locale.options.weekLabel,this.cmdFormatter=e.cmdFormatter}return e.prototype.createMarker=function(e){var t=this.createMarkerMeta(e);return null===t?null:t.marker},e.prototype.createNowMarker=function(){return this.canComputeOffset?this.timestampToMarker((new Date).valueOf()):j(F(new Date))},e.prototype.createMarkerMeta=function(e){if("string"==typeof e)return this.parse(e);var t=null;return"number"==typeof e?t=this.timestampToMarker(e):e instanceof Date?(e=e.valueOf(),isNaN(e)||(t=this.timestampToMarker(e))):Array.isArray(e)&&(t=j(e)),null!==t&&Y(t)?{marker:t,isTimeUnspecified:!1,forcedTzo:null}:null},e.prototype.parse=function(e){var t=Ln(e);if(null===t)return null;var n=t.marker,r=null;return null!==t.timeZoneOffset&&(this.canComputeOffset?n=this.timestampToMarker(n.valueOf()-60*t.timeZoneOffset*1e3):r=t.timeZoneOffset),{marker:n,isTimeUnspecified:t.isTimeUnspecified,forcedTzo:r}},e.prototype.getYear=function(e){return this.calendarSystem.getMarkerYear(e)},e.prototype.getMonth=function(e){return this.calendarSystem.getMarkerMonth(e)},e.prototype.add=function(e,t){var n=this.calendarSystem.markerToArray(e);return n[0]+=t.years,n[1]+=t.months,n[2]+=t.days,n[6]+=t.milliseconds,this.calendarSystem.arrayToMarker(n)},e.prototype.subtract=function(e,t){var n=this.calendarSystem.markerToArray(e);return n[0]-=t.years,n[1]-=t.months,n[2]-=t.days,n[6]-=t.milliseconds,this.calendarSystem.arrayToMarker(n)},e.prototype.addYears=function(e,t){var n=this.calendarSystem.markerToArray(e);return n[0]+=t,this.calendarSystem.arrayToMarker(n)},e.prototype.addMonths=function(e,t){var n=this.calendarSystem.markerToArray(e);return n[1]+=t,this.calendarSystem.arrayToMarker(n)},e.prototype.diffWholeYears=function(e,t){var n=this.calendarSystem;return q(e)===q(t)&&n.getMarkerDay(e)===n.getMarkerDay(t)&&n.getMarkerMonth(e)===n.getMarkerMonth(t)?n.getMarkerYear(t)-n.getMarkerYear(e):null},e.prototype.diffWholeMonths=function(e,t){var n=this.calendarSystem;return q(e)===q(t)&&n.getMarkerDay(e)===n.getMarkerDay(t)?n.getMarkerMonth(t)-n.getMarkerMonth(e)+12*(n.getMarkerYear(t)-n.getMarkerYear(e)):null},e.prototype.greatestWholeUnit=function(e,t){var n=this.diffWholeYears(e,t);return null!==n?{unit:"year",value:n}:null!==(n=this.diffWholeMonths(e,t))?{unit:"month",value:n}:null!==(n=U(e,t))?{unit:"week",value:n}:null!==(n=L(e,t))?{unit:"day",value:n}:ce(n=function(e,t){return(t.valueOf()-e.valueOf())/36e5}(e,t))?{unit:"hour",value:n}:ce(n=function(e,t){return(t.valueOf()-e.valueOf())/6e4}(e,t))?{unit:"minute",value:n}:ce(n=function(e,t){return(t.valueOf()-e.valueOf())/1e3}(e,t))?{unit:"second",value:n}:{unit:"millisecond",value:t.valueOf()-e.valueOf()}},e.prototype.countDurationsBetween=function(e,t,n){var r;return n.years&&null!==(r=this.diffWholeYears(e,t))?r/(ee(n)/365):n.months&&null!==(r=this.diffWholeMonths(e,t))?r/function(e){return ee(e)/30}(n):n.days&&null!==(r=L(e,t))?r/ee(n):(t.valueOf()-e.valueOf())/te(n)},e.prototype.startOf=function(e,t){return"year"===t?this.startOfYear(e):"month"===t?this.startOfMonth(e):"week"===t?this.startOfWeek(e):"day"===t?B(e):"hour"===t?function(e){return j([e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate(),e.getUTCHours()])}(e):"minute"===t?function(e){return j([e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate(),e.getUTCHours(),e.getUTCMinutes()])}(e):"second"===t?function(e){return j([e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate(),e.getUTCHours(),e.getUTCMinutes(),e.getUTCSeconds()])}(e):void 0},e.prototype.startOfYear=function(e){return this.calendarSystem.arrayToMarker([this.calendarSystem.getMarkerYear(e)])},e.prototype.startOfMonth=function(e){return this.calendarSystem.arrayToMarker([this.calendarSystem.getMarkerYear(e),this.calendarSystem.getMarkerMonth(e)])},e.prototype.startOfWeek=function(e){return this.calendarSystem.arrayToMarker([this.calendarSystem.getMarkerYear(e),this.calendarSystem.getMarkerMonth(e),e.getUTCDate()-(e.getUTCDay()-this.weekDow+7)%7])},e.prototype.computeWeekNumber=function(e){return this.weekNumberFunc?this.weekNumberFunc(this.toDate(e)):function(e,t,n){var r=e.getUTCFullYear(),i=V(e,r,t,n);if(i<1)return V(e,r-1,t,n);var o=V(e,r+1,t,n);return o>=1?Math.min(i,o):i}(e,this.weekDow,this.weekDoy)},e.prototype.format=function(e,t,n){return void 0===n&&(n={}),t.format({marker:e,timeZoneOffset:null!=n.forcedTzo?n.forcedTzo:this.offsetForMarker(e)},this)},e.prototype.formatRange=function(e,t,n,r){return void 0===r&&(r={}),r.isEndExclusive&&(t=H(t,-1)),n.formatRange({marker:e,timeZoneOffset:null!=r.forcedStartTzo?r.forcedStartTzo:this.offsetForMarker(e)},{marker:t,timeZoneOffset:null!=r.forcedEndTzo?r.forcedEndTzo:this.offsetForMarker(t)},this)},e.prototype.formatIso=function(e,t){void 0===t&&(t={});var n=null;return t.omitTimeZoneOffset||(n=null!=t.forcedTzo?t.forcedTzo:this.offsetForMarker(e)),function(e,t,n){void 0===n&&(n=!1);var r=e.toISOString();return r=r.replace(".000",""),n&&(r=r.replace("T00:00:00Z","")),r.length>10&&(null==t?r=r.replace("Z",""):0!==t&&(r=r.replace("Z",at(t,!0)))),r}(e,n,t.omitTime)},e.prototype.timestampToMarker=function(e){return"local"===this.timeZone?j(F(new Date(e))):"UTC"!==this.timeZone&&this.namedTimeZoneImpl?j(this.namedTimeZoneImpl.timestampToArray(e)):new Date(e)},e.prototype.offsetForMarker=function(e){return"local"===this.timeZone?-W(Z(e)).getTimezoneOffset():"UTC"===this.timeZone?0:this.namedTimeZoneImpl?this.namedTimeZoneImpl.offsetForArray(Z(e)):null},e.prototype.toDate=function(e,t){return"local"===this.timeZone?W(Z(e)):"UTC"===this.timeZone?new Date(e.valueOf()):this.namedTimeZoneImpl?new Date(e.valueOf()-1e3*this.namedTimeZoneImpl.offsetForArray(Z(e))*60):new Date(e.valueOf()-(t||0))},e}(),Vn={id:String,allDayDefault:Boolean,eventDataTransform:Function,success:Function,failure:Function},An=0;function Fn(e,t){return!t.pluginSystem.hooks.eventSourceDefs[e.sourceDefId].ignoreRange}function Wn(e,t){for(var n=t.pluginSystem.hooks.eventSourceDefs,r=n.length-1;r>=0;r--){var i=n[r].parseMeta(e);if(i){var o=Zn("object"==typeof e?e:{},i,r,t);return o._raw=e,o}}return null}function Zn(e,t,n,r){var i={},o=he(e,Vn,{},i),a={},s=Ht(i,r,a);return o.isFetching=!1,o.latestFetchId="",o.fetchRange=null,o.publicId=String(e.id||""),o.sourceId=String(An++),o.sourceDefId=n,o.meta=t,o.ui=s,o.extendedProps=a,o}function jn(e,t,n,r){switch(t.type){case"ADD_EVENT_SOURCES":return function(e,t,n,r){for(var i={},o=0,a=t;o<a.length;o++){var s=a[o];i[s.sourceId]=s}n&&(i=qn(i,n,r));return Se({},e,i)}(e,t.sources,n?n.activeRange:null,r);case"REMOVE_EVENT_SOURCE":return i=e,o=t.sourceId,we(i,function(e){return e.sourceId!==o});case"PREV":case"NEXT":case"SET_DATE":case"SET_VIEW_TYPE":return n?qn(e,n.activeRange,r):e;case"FETCH_EVENT_SOURCES":case"CHANGE_TIMEZONE":return Gn(e,t.sourceIds?Ie(t.sourceIds):function(e,t){return we(e,function(e){return Fn(e,t)})}(e,r),n?n.activeRange:null,r);case"RECEIVE_EVENTS":case"RECEIVE_EVENT_ERROR":return function(e,t,n,r){var i,o=e[t];if(o&&n===o.latestFetchId)return Se({},e,((i={})[t]=Se({},o,{isFetching:!1,fetchRange:r}),i));return e}(e,t.sourceId,t.fetchId,t.fetchRange);case"REMOVE_ALL_EVENT_SOURCES":return{};default:return e}var i,o}var Yn=0;function qn(e,t,n){return Gn(e,we(e,function(e){return function(e,t,n){return Fn(e,n)?!n.opt("lazyFetching")||!e.fetchRange||t.start<e.fetchRange.start||t.end>e.fetchRange.end:!e.latestFetchId}(e,t,n)}),t,n)}function Gn(e,t,n,r){var i={};for(var o in e){var a=e[o];t[o]?i[o]=Xn(a,n,r):i[o]=a}return i}function Xn(e,t,n){var r=n.pluginSystem.hooks.eventSourceDefs[e.sourceDefId],i=String(Yn++);return r.fetch({eventSource:e,calendar:n,range:t},function(r){var o,a,s=r.rawEvents,u=n.opt("eventSourceSuccess");e.success&&(a=e.success(s,r.xhr)),u&&(o=u(s,r.xhr)),s=a||o||s,n.dispatch({type:"RECEIVE_EVENTS",sourceId:e.sourceId,fetchId:i,fetchRange:t,rawEvents:s})},function(r){var o=n.opt("eventSourceFailure");console.warn(r.message,r),e.failure&&e.failure(r),o&&o(r),n.dispatch({type:"RECEIVE_EVENT_ERROR",sourceId:e.sourceId,fetchId:i,fetchRange:t,error:r})}),Se({},e,{isFetching:!0,latestFetchId:i})}var Jn=function(){function e(e,t){this.viewSpec=e,this.options=e.options,this.dateEnv=t.dateEnv,this.calendar=t,this.initHiddenDays()}return e.prototype.buildPrev=function(e,t){var n=this.dateEnv,r=n.subtract(n.startOf(t,e.currentRangeUnit),e.dateIncrement);return this.build(r,-1)},e.prototype.buildNext=function(e,t){var n=this.dateEnv,r=n.add(n.startOf(t,e.currentRangeUnit),e.dateIncrement);return this.build(r,1)},e.prototype.build=function(e,t,n){var r;void 0===n&&(n=!1);var i,o,a,s,u,l,c,d,f;return r=this.buildValidRange(),r=this.trimHiddenDays(r),n&&(d=e,e=null!=(f=r).start&&d<f.start?f.start:null!=f.end&&d>=f.end?new Date(f.end.valueOf()-1):d),a=this.buildCurrentRangeInfo(e,t),s=/^(year|month|week|day)$/.test(a.unit),u=this.buildRenderRange(this.trimHiddenDays(a.range),a.unit,s),l=u=this.trimHiddenDays(u),this.options.showNonCurrentDates||(l=Ve(l,a.range)),i=J(this.options.minTime),o=J(this.options.maxTime),l=Ve(l=this.adjustActiveRange(l,i,o),r),c=Fe(a.range,r),{validRange:r,currentRange:a.range,currentRangeUnit:a.unit,isRangeAllDay:s,activeRange:l,renderRange:u,minTime:i,maxTime:o,isValid:c,dateIncrement:this.buildDateIncrement(a.duration)}},e.prototype.buildValidRange=function(){return this.getRangeOption("validRange",this.calendar.getNow())||{start:null,end:null}},e.prototype.buildCurrentRangeInfo=function(e,t){var n,r=this.viewSpec,i=this.dateEnv,o=null,a=null,s=null;return r.duration?(o=r.duration,a=r.durationUnit,s=this.buildRangeFromDuration(e,t,o,a)):(n=this.options.dayCount)?(a="day",s=this.buildRangeFromDayCount(e,t,n)):(s=this.buildCustomVisibleRange(e))?a=i.greatestWholeUnit(s.start,s.end).unit:(a=ne(o=this.getFallbackDuration()).unit,s=this.buildRangeFromDuration(e,t,o,a)),{duration:o,unit:a,range:s}},e.prototype.getFallbackDuration=function(){return J({day:1})},e.prototype.adjustActiveRange=function(e,t,n){var r=this.dateEnv,i=e.start,o=e.end;return this.viewSpec.class.prototype.usesMinMaxTime&&(ee(t)<0&&(i=B(i),i=r.add(i,t)),ee(n)>1&&(o=x(o=B(o),-1),o=r.add(o,n))),{start:i,end:o}},e.prototype.buildRangeFromDuration=function(e,t,n,r){var i,o,a,s,u,l=this.dateEnv,c=this.options.dateAlignment;function d(){a=l.startOf(e,c),s=l.add(a,n),u={start:a,end:s}}return c||((i=this.options.dateIncrement)?(o=J(i),c=te(o)<te(n)?ne(o,!Q(i)).unit:r):c=r),ee(n)<=1&&this.isHiddenDay(a)&&(a=B(a=this.skipHiddenDays(a,t))),d(),this.trimHiddenDays(u)||(e=this.skipHiddenDays(e,t),d()),u},e.prototype.buildRangeFromDayCount=function(e,t,n){var r,i=this.dateEnv,o=this.options.dateAlignment,a=0,s=e;o&&(s=i.startOf(s,o)),s=B(s),r=s=this.skipHiddenDays(s,t);do{r=x(r,1),this.isHiddenDay(r)||a++}while(a<n);return{start:s,end:r}},e.prototype.buildCustomVisibleRange=function(e){var t=this.dateEnv,n=this.getRangeOption("visibleRange",t.toDate(e));return!n||null!=n.start&&null!=n.end?n:null},e.prototype.buildRenderRange=function(e,t,n){return e},e.prototype.buildDateIncrement=function(e){var t,n=this.options.dateIncrement;return n?J(n):(t=this.options.dateAlignment)?J(1,t):e||J({days:1})},e.prototype.getRangeOption=function(e){for(var t=[],n=1;n<arguments.length;n++)t[n-1]=arguments[n];var r=this.options[e];return"function"==typeof r&&(r=r.apply(null,t)),r&&(r=Ue(r,this.dateEnv)),r&&(r=ge(r)),r},e.prototype.initHiddenDays=function(){var e,t=this.options.hiddenDays||[],n=[],r=0;for(!1===this.options.weekends&&t.push(0,6),e=0;e<7;e++)(n[e]=-1!==t.indexOf(e))||r++;if(!r)throw new Error("invalid hiddenDays");this.isHiddenDayHash=n},e.prototype.trimHiddenDays=function(e){var t=e.start,n=e.end;return t&&(t=this.skipHiddenDays(t)),n&&(n=this.skipHiddenDays(n,-1,!0)),null==t||null==n||t<n?{start:t,end:n}:null},e.prototype.isHiddenDay=function(e){return e instanceof Date&&(e=e.getUTCDay()),this.isHiddenDayHash[e]},e.prototype.skipHiddenDays=function(e,t,n){for(void 0===t&&(t=1),void 0===n&&(n=!1);this.isHiddenDayHash[(e.getUTCDay()+(n?t:0)+7)%7];)e=x(e,t);return e},e}();function Kn(e,t,n){for(var r=function(e,t){switch(t.type){case"SET_VIEW_TYPE":return t.viewType;default:return e}}(e.viewType,t),i=function(e,t,n,r,i){var o;switch(t.type){case"PREV":o=i.dateProfileGenerators[r].buildPrev(e,n);break;case"NEXT":o=i.dateProfileGenerators[r].buildNext(e,n);break;case"SET_DATE":e.activeRange&&Ze(e.currentRange,t.dateMarker)||(o=i.dateProfileGenerators[r].build(t.dateMarker,void 0,!0));break;case"SET_VIEW_TYPE":var a=i.dateProfileGenerators[r];if(!a)throw new Error(r?'The FullCalendar view "'+r+'" does not exist. Make sure your plugins are loaded correctly.':"No available FullCalendar view plugins.");o=a.build(t.dateMarker||n,void 0,!0)}return!o||!o.isValid||e&&(s=e,u=o,Ae(s.validRange,u.validRange)&&Ae(s.activeRange,u.activeRange)&&Ae(s.renderRange,u.renderRange)&&$(s.minTime,u.minTime)&&$(s.maxTime,u.maxTime))?e:o;var s,u}(e.dateProfile,t,e.currentDate,r,n),o=jn(e.eventSources,t,i,n),a=Se({},e,{viewType:r,dateProfile:i,currentDate:Qn(e.currentDate,t,i),eventSources:o,eventStore:St(e.eventStore,t,o,i,n),dateSelection:$n(e.dateSelection,t,n),eventSelection:er(e.eventSelection,t),eventDrag:tr(e.eventDrag,t,o,n),eventResize:nr(e.eventResize,t,o,n),eventSourceLoadingLevel:rr(o),loadingLevel:rr(o)}),s=0,u=n.pluginSystem.hooks.reducers;s<u.length;s++){a=(0,u[s])(a,t,n)}return a}function Qn(e,t,n){switch(t.type){case"PREV":case"NEXT":return Ze(n.currentRange,e)?e:n.currentRange.start;case"SET_DATE":case"SET_VIEW_TYPE":var r=t.dateMarker||e;return n.activeRange&&!Ze(n.activeRange,r)?n.currentRange.start:r;default:return e}}function $n(e,t,n){switch(t.type){case"SELECT_DATES":return t.selection;case"UNSELECT_DATES":return null;default:return e}}function er(e,t){switch(t.type){case"SELECT_EVENT":return t.eventInstanceId;case"UNSELECT_EVENT":return"";default:return e}}function tr(e,t,n,r){switch(t.type){case"SET_EVENT_DRAG":var i=t.state;return{affectedEvents:i.affectedEvents,mutatedEvents:i.mutatedEvents,isEvent:i.isEvent,origSeg:i.origSeg};case"UNSET_EVENT_DRAG":return null;default:return e}}function nr(e,t,n,r){switch(t.type){case"SET_EVENT_RESIZE":var i=t.state;return{affectedEvents:i.affectedEvents,mutatedEvents:i.mutatedEvents,isEvent:i.isEvent,origSeg:i.origSeg};case"UNSET_EVENT_RESIZE":return null;default:return e}}function rr(e){var t=0;for(var n in e)e[n].isFetching&&t++;return t}var ir={start:null,end:null,allDay:Boolean};function or(e,t,n){var r=function(e,t){var n={},r=he(e,ir,{},n),i=r.start?t.createMarkerMeta(r.start):null,o=r.end?t.createMarkerMeta(r.end):null,a=r.allDay;null==a&&(a=i&&i.isTimeUnspecified&&(!o||o.isTimeUnspecified));return n.range={start:i?i.marker:null,end:o?o.marker:null},n.allDay=a,n}(e,t),i=r.range;if(!i.start)return null;if(!i.end){if(null==n)return null;i.end=t.add(i.start,n)}return r}function ar(e,t,n){var r=Wt({editable:!1},"",e.allDay,!0,n);return{def:r,ui:gt(r,t),instance:Zt(r.defId,e.range),range:e.range,isStart:!0,isEnd:!0}}function sr(e,t,n,r){if(t[e])return t[e];var i=function(e,t,n,r){var i=n[e],o=r[e],a=function(e){return i&&null!==i[e]?i[e]:o&&null!==o[e]?o[e]:null},s=a("class"),u=a("superType");!u&&s&&(u=ur(s,r)||ur(s,n));var l=null;if(u){if(u===e)throw new Error("Can't have a custom view type that references itself");l=sr(u,t,n,r)}!s&&l&&(s=l.class);if(!s)return null;return{type:e,class:s,defaults:Se({},l?l.defaults:{},i?i.options:{}),overrides:Se({},l?l.overrides:{},o?o.options:{})}}(e,t,n,r);return i&&(t[e]=i),i}function ur(e,t){var n=Object.getPrototypeOf(e.prototype);for(var r in t){var i=t[r];if(i.class&&i.class.prototype===n)return r}return""}function lr(e){return Re(e,dr)}var cr={type:String,class:null};function dr(e){"function"==typeof e&&(e={class:e});var t={},n=he(e,cr,{},t);return{superType:n.type,class:n.class,options:t}}function fr(e,t){var n=lr(e),r=lr(t.overrides.views);return Re(function(e,t){var n,r={};for(n in e)sr(n,r,e,t);for(n in t)sr(n,r,e,t);return r}(n,r),function(e){return function(e,t,n){var r=e.overrides.duration||e.defaults.duration||n.dynamicOverrides.duration||n.overrides.duration,i=null,o="",a="",s={};if(r&&(i=J(r))){var u=ne(i,!Q(r));o=u.unit,1===u.value&&(a=o,s=t[o]?t[o].options:{})}var l=function(t){var n=t.buttonText||{},r=e.defaults.buttonTextKey;return null!=r&&null!=n[r]?n[r]:null!=n[e.type]?n[e.type]:null!=n[a]?n[a]:void 0};return{type:e.type,class:e.class,duration:i,durationUnit:o,singleUnit:a,options:Se({},Rn,e.defaults,n.dirDefaults,n.localeDefaults,n.overrides,s,e.overrides,n.dynamicOverrides),buttonTextOverride:l(n.dynamicOverrides)||l(n.overrides)||e.overrides.buttonText,buttonTextDefault:l(n.localeDefaults)||l(n.dirDefaults)||e.defaults.buttonText||l(Rn)||e.type}}(e,r,t)})}var pr=function(e){function t(t,n){var i=e.call(this,t)||this;return i._renderLayout=qt(i.renderLayout,i.unrenderLayout),i._updateTitle=qt(i.updateTitle,null,[i._renderLayout]),i._updateActiveButton=qt(i.updateActiveButton,null,[i._renderLayout]),i._updateToday=qt(i.updateToday,null,[i._renderLayout]),i._updatePrev=qt(i.updatePrev,null,[i._renderLayout]),i._updateNext=qt(i.updateNext,null,[i._renderLayout]),i.el=r("div",{className:"fc-toolbar "+n}),i}return Ee(t,e),t.prototype.destroy=function(){e.prototype.destroy.call(this),this._renderLayout.unrender(),c(this.el)},t.prototype.render=function(e){this._renderLayout(e.layout),this._updateTitle(e.title),this._updateActiveButton(e.activeButton),this._updateToday(e.isTodayEnabled),this._updatePrev(e.isPrevEnabled),this._updateNext(e.isNextEnabled)},t.prototype.renderLayout=function(e){var t=this.el;this.viewsWithButtons=[],s(t,this.renderSection("left",e.left)),s(t,this.renderSection("center",e.center)),s(t,this.renderSection("right",e.right))},t.prototype.unrenderLayout=function(){this.el.innerHTML=""},t.prototype.renderSection=function(e,t){var n=this,o=this.theme,a=this.calendar,u=a.optionsManager,l=a.viewSpecs,c=r("div",{className:"fc-"+e}),d=u.computed.customButtons||{},f=u.overrides.buttonText||{},p=u.computed.buttonText||{};return t&&t.split(" ").forEach(function(e,t){var r,u=[],h=!0;if(e.split(",").forEach(function(e,t){var r,s,c,v,g,y,m,E,S;"title"===e?(u.push(i("<h2>&nbsp;</h2>")),h=!1):((r=d[e])?(c=function(e){r.click&&r.click.call(E,e)},(v=o.getCustomButtonIconClass(r))||(v=o.getIconClass(e))||(g=r.text)):(s=l[e])?(n.viewsWithButtons.push(e),c=function(){a.changeView(e)},(g=s.buttonTextOverride)||(v=o.getIconClass(e))||(g=s.buttonTextDefault)):a[e]&&(c=function(){a[e]()},(g=f[e])||(v=o.getIconClass(e))||(g=p[e])),c&&(m=["fc-"+e+"-button",o.getClass("button")],g?(y=Ot(g),S=""):v&&(y="<span class='"+v+"'></span>",S=' aria-label="'+e+'"'),(E=i('<button type="button" class="'+m.join(" ")+'"'+S+">"+y+"</button>")).addEventListener("click",c),u.push(E)))}),u.length>1){r=document.createElement("div");var v=o.getClass("buttonGroup");h&&v&&r.classList.add(v),s(r,u),c.appendChild(r)}else s(c,u)}),c},t.prototype.updateToday=function(e){this.toggleButtonEnabled("today",e)},t.prototype.updatePrev=function(e){this.toggleButtonEnabled("prev",e)},t.prototype.updateNext=function(e){this.toggleButtonEnabled("next",e)},t.prototype.updateTitle=function(e){v(this.el,"h2").forEach(function(t){t.innerText=e})},t.prototype.updateActiveButton=function(e){var t=this.theme.getClass("buttonActive");v(this.el,"button").forEach(function(n){e&&n.classList.contains("fc-"+e+"-button")?n.classList.add(t):n.classList.remove(t)})},t.prototype.toggleButtonEnabled=function(e,t){v(this.el,".fc-"+e+"-button").forEach(function(e){e.disabled=!t})},t}(fn),hr=function(e){function t(t,n){var i=e.call(this,t)||this;i._renderToolbars=qt(i.renderToolbars),i.buildViewPropTransformers=Ye(gr),i.el=n,u(n,i.contentEl=r("div",{className:"fc-view-container"}));for(var o=i.calendar,a=0,s=o.pluginSystem.hooks.viewContainerModifiers;a<s.length;a++){(0,s[a])(i.contentEl,o)}return i.toggleElClassNames(!0),i.computeTitle=Ye(vr),i.parseBusinessHours=Ye(function(e){return Yt(e,i.calendar)}),i}return Ee(t,e),t.prototype.destroy=function(){this.header&&this.header.destroy(),this.footer&&this.footer.destroy(),this.view&&this.view.destroy(),c(this.contentEl),this.toggleElClassNames(!1),e.prototype.destroy.call(this)},t.prototype.toggleElClassNames=function(e){var t=this.el.classList,n="fc-"+this.opt("dir"),r=this.theme.getClass("widget");e?(t.add("fc"),t.add(n),t.add(r)):(t.remove("fc"),t.remove(n),t.remove(r))},t.prototype.render=function(e){this.freezeHeight();var t=this.computeTitle(e.dateProfile,e.viewSpec.options);this._renderToolbars(e.viewSpec,e.dateProfile,e.currentDate,e.dateProfileGenerator,t),this.renderView(e,t),this.updateSize(),this.thawHeight()},t.prototype.renderToolbars=function(e,t,n,r,i){var o=this.opt("header"),a=this.opt("footer"),l=this.calendar.getNow(),c=r.build(l),d=r.buildPrev(t,n),f=r.buildNext(t,n),p={title:i,activeButton:e.type,isTodayEnabled:c.isValid&&!Ze(t.currentRange,l),isPrevEnabled:d.isValid,isNextEnabled:f.isValid};o?(this.header||(this.header=new pr(this.context,"fc-header-toolbar"),u(this.el,this.header.el)),this.header.receiveProps(Se({layout:o},p))):this.header&&(this.header.destroy(),this.header=null),a?(this.footer||(this.footer=new pr(this.context,"fc-footer-toolbar"),s(this.el,this.footer.el)),this.footer.receiveProps(Se({layout:a},p))):this.footer&&(this.footer.destroy(),this.footer=null)},t.prototype.renderView=function(e,t){var n=this.view,r=e.viewSpec,i=e.dateProfileGenerator;n&&n.viewSpec===r?n.addScroll(n.queryScroll()):(n&&n.destroy(),n=this.view=new r.class({calendar:this.calendar,view:null,dateEnv:this.dateEnv,theme:this.theme,options:r.options},r,i,this.contentEl)),n.title=t;for(var o={dateProfile:e.dateProfile,businessHours:this.parseBusinessHours(r.options.businessHours),eventStore:e.eventStore,eventUiBases:e.eventUiBases,dateSelection:e.dateSelection,eventSelection:e.eventSelection,eventDrag:e.eventDrag,eventResize:e.eventResize},a=0,s=this.buildViewPropTransformers(this.calendar.pluginSystem.hooks.viewPropsTransformers);a<s.length;a++){var u=s[a];Se(o,u.transform(o,r,e,n))}n.receiveProps(o)},t.prototype.updateSize=function(e){void 0===e&&(e=!1);var t=this.view;e&&t.addScroll(t.queryScroll()),(e||null==this.isHeightAuto)&&this.computeHeightVars(),t.updateSize(e,this.viewHeight,this.isHeightAuto),t.updateNowIndicator(),t.popScroll(e)},t.prototype.computeHeightVars=function(){var e=this.calendar,t=e.opt("height"),n=e.opt("contentHeight");if(this.isHeightAuto="auto"===t||"auto"===n,"number"==typeof n)this.viewHeight=n;else if("function"==typeof n)this.viewHeight=n();else if("number"==typeof t)this.viewHeight=t-this.queryToolbarsHeight();else if("function"==typeof t)this.viewHeight=t()-this.queryToolbarsHeight();else if("parent"===t){var r=this.el.parentNode;this.viewHeight=r.getBoundingClientRect().height-this.queryToolbarsHeight()}else this.viewHeight=Math.round(this.contentEl.getBoundingClientRect().width/Math.max(e.opt("aspectRatio"),.5))},t.prototype.queryToolbarsHeight=function(){var e=0;return this.header&&(e+=I(this.header.el)),this.footer&&(e+=I(this.footer.el)),e},t.prototype.freezeHeight=function(){y(this.el,{height:this.el.getBoundingClientRect().height,overflow:"hidden"})},t.prototype.thawHeight=function(){y(this.el,{height:"",overflow:""})},t}(fn);function vr(e,t){var n;return n=/^(year|month)$/.test(e.currentRangeUnit)?e.currentRange:e.activeRange,this.dateEnv.formatRange(n.start,n.end,ot(t.titleFormat||function(e){var t=e.currentRangeUnit;if("year"===t)return{year:"numeric"};if("month"===t)return{year:"numeric",month:"long"};var n=L(e.currentRange.start,e.currentRange.end);return null!==n&&n>1?{year:"numeric",month:"short",day:"numeric"}:{year:"numeric",month:"long",day:"numeric"}}(e),t.titleRangeSeparator),{isEndExclusive:e.isRangeAllDay})}function gr(e){return e.map(function(e){return new e})}var yr=function(){function e(e){this.component=e.component}return e.prototype.destroy=function(){},e}();var mr={},Er=function(e){function t(t){var n=e.call(this,t)||this;n.handleSegClick=function(e,t){var r=n.component,i=ht(t);if(i&&r.isValidSegDownEl(e.target)){var o=p(e.target,".fc-has-url"),a=o?o.querySelector("a[href]").href:"";r.publiclyTrigger("eventClick",[{el:t,event:new ct(r.calendar,i.eventRange.def,i.eventRange.instance),jsEvent:e,view:r.view}]),a&&!e.defaultPrevented&&(window.location.href=a)}};var r=t.component;return n.destroy=O(r.el,"click",r.fgSegSelector+","+r.bgSegSelector,n.handleSegClick),n}return Ee(t,e),t}(yr),Sr=function(e){function t(t){var n=e.call(this,t)||this;n.handleEventElRemove=function(e){e===n.currentSegEl&&n.handleSegLeave(null,n.currentSegEl)},n.handleSegEnter=function(e,t){ht(t)&&(t.classList.add("fc-allow-mouse-resize"),n.currentSegEl=t,n.triggerEvent("eventMouseEnter",e,t))},n.handleSegLeave=function(e,t){n.currentSegEl&&(t.classList.remove("fc-allow-mouse-resize"),n.currentSegEl=null,n.triggerEvent("eventMouseLeave",e,t))};var r,i,o,a,s,u=t.component;return n.removeHoverListeners=(r=u.el,i=u.fgSegSelector+","+u.bgSegSelector,o=n.handleSegEnter,a=n.handleSegLeave,O(r,"mouseover",i,function(e,t){if(t!==s){s=t,o(e,t);var n=function(e){s=null,a(e,t),t.removeEventListener("mouseleave",n)};t.addEventListener("mouseleave",n)}})),u.calendar.on("eventElRemove",n.handleEventElRemove),n}return Ee(t,e),t.prototype.destroy=function(){this.removeHoverListeners(),this.component.calendar.off("eventElRemove",this.handleEventElRemove)},t.prototype.triggerEvent=function(e,t,n){var r=this.component,i=ht(n);t&&!r.isValidSegDownEl(t.target)||r.publiclyTrigger(e,[{el:n,event:new ct(this.component.calendar,i.eventRange.def,i.eventRange.instance),jsEvent:t,view:r.view}])},t}(yr),br=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return Ee(t,e),t}(cn);br.prototype.classes={widget:"fc-unthemed",widgetHeader:"fc-widget-header",widgetContent:"fc-widget-content",buttonGroup:"fc-button-group",button:"fc-button fc-button-primary",buttonActive:"fc-button-active",popoverHeader:"fc-widget-header",popoverContent:"fc-widget-content",headerRow:"fc-widget-header",dayRow:"fc-widget-content",listView:"fc-widget-content"},br.prototype.baseIconClass="fc-icon",br.prototype.iconClasses={close:"fc-icon-x",prev:"fc-icon-chevron-left",next:"fc-icon-chevron-right",prevYear:"fc-icon-chevrons-left",nextYear:"fc-icon-chevrons-right"},br.prototype.iconOverrideOption="buttonIcons",br.prototype.iconOverrideCustomButtonOption="icon",br.prototype.iconOverridePrefix="fc-icon-";var Dr=function(){function e(e,t){var n=this;this.parseRawLocales=Ye(On),this.buildLocale=Ye(_n),this.buildDateEnv=Ye(Tr),this.buildTheme=Ye(wr),this.buildEventUiSingleBase=Ye(this._buildEventUiSingleBase),this.buildSelectionConfig=Ye(this._buildSelectionConfig),this.buildEventUiBySource=qe(Ir,Me),this.buildEventUiBases=Ye(Cr),this.interactionsStore={},this.actionQueue=[],this.isReducing=!1,this.needsRerender=!1,this.needsFullRerender=!1,this.isRendering=!1,this.renderingPauseDepth=0,this.buildDelayedRerender=Ye(Rr),this.afterSizingTriggers={},this.isViewUpdated=!1,this.isDatesUpdated=!1,this.isEventsUpdated=!1,this.el=e,this.optionsManager=new xn(t||{}),this.pluginSystem=new gn,this.addPluginInputs(this.optionsManager.computed.plugins||[]),this.handleOptions(this.optionsManager.computed),this.publiclyTrigger("_init"),this.hydrate(),this.calendarInteractions=this.pluginSystem.hooks.calendarInteractions.map(function(e){return new e(n)})}return e.prototype.addPluginInputs=function(e){for(var t=function(e){for(var t=[],n=0,r=e;n<r.length;n++){var i=r[n];if("string"==typeof i){var o="FullCalendar"+ue(i);window[o]?t.push(window[o].default):console.warn("Plugin file not loaded for "+i)}else t.push(i)}return Mn.concat(t)}(e),n=0,r=t;n<r.length;n++){var i=r[n];this.pluginSystem.add(i)}},Object.defineProperty(e.prototype,"view",{get:function(){return this.component?this.component.view:null},enumerable:!0,configurable:!0}),e.prototype.render=function(){this.component?this.requestRerender(!0):(this.renderableEventStore={defs:{},instances:{}},this.bindHandlers(),this.executeRender())},e.prototype.destroy=function(){if(this.component){this.unbindHandlers(),this.component.destroy(),this.component=null;for(var e=0,t=this.calendarInteractions;e<t.length;e++){t[e].destroy()}this.publiclyTrigger("_destroyed")}},e.prototype.bindHandlers=function(){var e=this;this.removeNavLinkListener=O(this.el,"click","a[data-goto]",function(t,n){var r=n.getAttribute("data-goto");r=r?JSON.parse(r):{};var i=e.dateEnv,o=i.createMarker(r.date),a=r.type,s=e.viewOpt("navLink"+ue(a)+"Click");"function"==typeof s?s(i.toDate(o),t):("string"==typeof s&&(a=s),e.zoomTo(o,a))}),this.opt("handleWindowResize")&&window.addEventListener("resize",this.windowResizeProxy=pe(this.windowResize.bind(this),this.opt("windowResizeDelay")))},e.prototype.unbindHandlers=function(){this.removeNavLinkListener(),this.windowResizeProxy&&(window.removeEventListener("resize",this.windowResizeProxy),this.windowResizeProxy=null)},e.prototype.hydrate=function(){var e=this;this.state=this.buildInitialState();var t=this.opt("eventSources")||[],n=this.opt("events"),r=[];n&&t.unshift(n);for(var i=0,o=t;i<o.length;i++){var a=Wn(o[i],this);a&&r.push(a)}this.batchRendering(function(){e.dispatch({type:"INIT"}),e.dispatch({type:"ADD_EVENT_SOURCES",sources:r}),e.dispatch({type:"SET_VIEW_TYPE",viewType:e.opt("defaultView")||e.pluginSystem.hooks.defaultView})})},e.prototype.buildInitialState=function(){return{viewType:null,loadingLevel:0,eventSourceLoadingLevel:0,currentDate:this.getInitialDate(),dateProfile:null,eventSources:{},eventStore:{defs:{},instances:{}},dateSelection:null,eventSelection:"",eventDrag:null,eventResize:null}},e.prototype.dispatch=function(e){if(this.actionQueue.push(e),!this.isReducing){this.isReducing=!0;for(var t=this.state;this.actionQueue.length;)this.state=this.reduce(this.state,this.actionQueue.shift(),this);var n=this.state;this.isReducing=!1,!t.loadingLevel&&n.loadingLevel?this.publiclyTrigger("loading",[!0]):t.loadingLevel&&!n.loadingLevel&&this.publiclyTrigger("loading",[!1]);var r=this.component&&this.component.view;(t.eventStore!==n.eventStore||this.needsFullRerender)&&t.eventStore&&(this.isEventsUpdated=!0),(t.dateProfile!==n.dateProfile||this.needsFullRerender)&&(t.dateProfile&&r&&this.publiclyTrigger("datesDestroy",[{view:r,el:r.el}]),this.isDatesUpdated=!0),(t.viewType!==n.viewType||this.needsFullRerender)&&(t.viewType&&r&&this.publiclyTrigger("viewSkeletonDestroy",[{view:r,el:r.el}]),this.isViewUpdated=!0),this.requestRerender()}},e.prototype.reduce=function(e,t,n){return Kn(e,t,n)},e.prototype.requestRerender=function(e){void 0===e&&(e=!1),this.needsRerender=!0,this.needsFullRerender=this.needsFullRerender||e,this.delayedRerender()},e.prototype.tryRerender=function(){this.component&&this.needsRerender&&!this.renderingPauseDepth&&!this.isRendering&&this.executeRender()},e.prototype.batchRendering=function(e){this.renderingPauseDepth++,e(),this.renderingPauseDepth--,this.needsRerender&&this.requestRerender()},e.prototype.executeRender=function(){var e=this.needsFullRerender;this.needsRerender=!1,this.needsFullRerender=!1,this.isRendering=!0,this.renderComponent(e),this.isRendering=!1,this.needsRerender&&this.delayedRerender()},e.prototype.renderComponent=function(e){var t=this.state,n=this.component,r=t.viewType,i=this.viewSpecs[r],o=e&&n?n.view.queryScroll():null;if(!i)throw new Error('View type "'+r+'" is not valid');var a=this.renderableEventStore=t.eventSourceLoadingLevel&&!this.opt("progressiveEventRendering")?this.renderableEventStore:t.eventStore,s=this.buildEventUiSingleBase(i.options),u=this.buildEventUiBySource(t.eventSources),l=this.eventUiBases=this.buildEventUiBases(a.defs,s,u);!e&&n||(n&&(n.freezeHeight(),n.destroy()),n=this.component=new hr({calendar:this,view:null,dateEnv:this.dateEnv,theme:this.theme,options:this.optionsManager.computed},this.el),this.isViewUpdated=!0,this.isDatesUpdated=!0,this.isEventsUpdated=!0),n.receiveProps(Se({},t,{viewSpec:i,dateProfile:t.dateProfile,dateProfileGenerator:this.dateProfileGenerators[r],eventStore:a,eventUiBases:l,dateSelection:t.dateSelection,eventSelection:t.eventSelection,eventDrag:t.eventDrag,eventResize:t.eventResize})),o&&n.view.applyScroll(o,!1),this.isViewUpdated&&(this.isViewUpdated=!1,this.publiclyTrigger("viewSkeletonRender",[{view:n.view,el:n.view.el}])),this.isDatesUpdated&&(this.isDatesUpdated=!1,this.publiclyTrigger("datesRender",[{view:n.view,el:n.view.el}])),this.isEventsUpdated&&(this.isEventsUpdated=!1),this.releaseAfterSizingTriggers()},e.prototype.setOption=function(e,t){var n;this.mutateOptions(((n={})[e]=t,n),[],!0)},e.prototype.getOption=function(e){return this.optionsManager.computed[e]},e.prototype.opt=function(e){return this.optionsManager.computed[e]},e.prototype.viewOpt=function(e){return this.viewOpts()[e]},e.prototype.viewOpts=function(){return this.viewSpecs[this.state.viewType].options},e.prototype.mutateOptions=function(e,t,n,r){var i=this,o=this.pluginSystem.hooks.optionChangeHandlers,a={},s={},u=this.dateEnv,l=!1,c=!1,d=Boolean(t.length);for(var f in e)o[f]?s[f]=e[f]:a[f]=e[f];for(var p in a)/^(height|contentHeight|aspectRatio)$/.test(p)?c=!0:/^(defaultDate|defaultView)$/.test(p)||(d=!0,"timeZone"===p&&(l=!0));this.optionsManager.mutate(a,t,n),d&&(this.handleOptions(this.optionsManager.computed),this.needsFullRerender=!0),this.batchRendering(function(){if(d?(l&&i.dispatch({type:"CHANGE_TIMEZONE",oldDateEnv:u}),i.dispatch({type:"SET_VIEW_TYPE",viewType:i.state.viewType})):c&&i.updateSize(),r)for(var e in s)o[e](s[e],i,r)})},e.prototype.handleOptions=function(e){var t=this,n=this.pluginSystem.hooks;this.defaultAllDayEventDuration=J(e.defaultAllDayEventDuration),this.defaultTimedEventDuration=J(e.defaultTimedEventDuration),this.delayedRerender=this.buildDelayedRerender(e.rerenderDelay),this.theme=this.buildTheme(e);var r=this.parseRawLocales(e.locales);this.availableRawLocales=r.map;var i=this.buildLocale(e.locale||r.defaultCode,r.map);this.dateEnv=this.buildDateEnv(i,e.timeZone,n.namedTimeZonedImpl,e.firstDay,e.weekNumberCalculation,e.weekLabel,n.cmdFormatter),this.selectionConfig=this.buildSelectionConfig(e),this.viewSpecs=fr(n.views,this.optionsManager),this.dateProfileGenerators=Re(this.viewSpecs,function(e){return new e.class.prototype.dateProfileGeneratorClass(e,t)})},e.prototype.getAvailableLocaleCodes=function(){return Object.keys(this.availableRawLocales)},e.prototype._buildSelectionConfig=function(e){return Nt("select",e,this)},e.prototype._buildEventUiSingleBase=function(e){return e.editable&&(e=Se({},e,{eventEditable:!0})),Nt("event",e,this)},e.prototype.hasPublicHandlers=function(e){return this.hasHandlers(e)||this.opt(e)},e.prototype.publiclyTrigger=function(e,t){var n=this.opt(e);if(this.triggerWith(e,this,t),n)return n.apply(this,t)},e.prototype.publiclyTriggerAfterSizing=function(e,t){var n=this.afterSizingTriggers;(n[e]||(n[e]=[])).push(t)},e.prototype.releaseAfterSizingTriggers=function(){var e=this.afterSizingTriggers;for(var t in e)for(var n=0,r=e[t];n<r.length;n++){var i=r[n];this.publiclyTrigger(t,i)}this.afterSizingTriggers={}},e.prototype.isValidViewType=function(e){return Boolean(this.viewSpecs[e])},e.prototype.changeView=function(e,t){var n=null;t&&(t.start&&t.end?(this.optionsManager.mutate({visibleRange:t},[]),this.handleOptions(this.optionsManager.computed)):n=this.dateEnv.createMarker(t)),this.unselect(),this.dispatch({type:"SET_VIEW_TYPE",viewType:e,dateMarker:n})},e.prototype.zoomTo=function(e,t){var n;t=t||"day",n=this.viewSpecs[t]||this.getUnitViewSpec(t),this.unselect(),n?this.dispatch({type:"SET_VIEW_TYPE",viewType:n.type,dateMarker:e}):this.dispatch({type:"SET_DATE",dateMarker:e})},e.prototype.getUnitViewSpec=function(e){var t,n,r=this.component,i=[];for(var o in r.header&&i.push.apply(i,r.header.viewsWithButtons),r.footer&&i.push.apply(i,r.footer.viewsWithButtons),this.viewSpecs)i.push(o);for(t=0;t<i.length;t++)if((n=this.viewSpecs[i[t]])&&n.singleUnit===e)return n},e.prototype.getInitialDate=function(){var e=this.opt("defaultDate");return null!=e?this.dateEnv.createMarker(e):this.getNow()},e.prototype.prev=function(){this.unselect(),this.dispatch({type:"PREV"})},e.prototype.next=function(){this.unselect(),this.dispatch({type:"NEXT"})},e.prototype.prevYear=function(){this.unselect(),this.dispatch({type:"SET_DATE",dateMarker:this.dateEnv.addYears(this.state.currentDate,-1)})},e.prototype.nextYear=function(){this.unselect(),this.dispatch({type:"SET_DATE",dateMarker:this.dateEnv.addYears(this.state.currentDate,1)})},e.prototype.today=function(){this.unselect(),this.dispatch({type:"SET_DATE",dateMarker:this.getNow()})},e.prototype.gotoDate=function(e){this.unselect(),this.dispatch({type:"SET_DATE",dateMarker:this.dateEnv.createMarker(e)})},e.prototype.incrementDate=function(e){var t=J(e);t&&(this.unselect(),this.dispatch({type:"SET_DATE",dateMarker:this.dateEnv.add(this.state.currentDate,t)}))},e.prototype.getDate=function(){return this.dateEnv.toDate(this.state.currentDate)},e.prototype.formatDate=function(e,t){var n=this.dateEnv;return n.format(n.createMarker(e),ot(t))},e.prototype.formatRange=function(e,t,n){var r=this.dateEnv;return r.formatRange(r.createMarker(e),r.createMarker(t),ot(n,this.opt("defaultRangeSeparator")),n)},e.prototype.formatIso=function(e,t){var n=this.dateEnv;return n.formatIso(n.createMarker(e),{omitTime:t})},e.prototype.windowResize=function(e){!this.isHandlingWindowResize&&this.component&&e.target===window&&(this.isHandlingWindowResize=!0,this.updateSize(),this.publiclyTrigger("windowResize",[this.view]),this.isHandlingWindowResize=!1)},e.prototype.updateSize=function(){this.component&&this.component.updateSize(!0)},e.prototype.registerInteractiveComponent=function(e,t){var n=function(e,t){return{component:e,el:t.el,useEventCenter:null==t.useEventCenter||t.useEventCenter}}(e,t),r=[Er,Sr].concat(this.pluginSystem.hooks.componentInteractions).map(function(e){return new e(n)});this.interactionsStore[e.uid]=r,mr[e.uid]=n},e.prototype.unregisterInteractiveComponent=function(e){for(var t=0,n=this.interactionsStore[e.uid];t<n.length;t++){n[t].destroy()}delete this.interactionsStore[e.uid],delete mr[e.uid]},e.prototype.select=function(e,t){var n=or(null==t?null!=e.start?e:{start:e,end:null}:{start:e,end:t},this.dateEnv,J({days:1}));n&&(this.dispatch({type:"SELECT_DATES",selection:n}),this.triggerDateSelect(n))},e.prototype.unselect=function(e){this.state.dateSelection&&(this.dispatch({type:"UNSELECT_DATES"}),this.triggerDateUnselect(e))},e.prototype.triggerDateSelect=function(e,t){var n=Se({},this.buildDateSpanApi(e),{jsEvent:t?t.origEvent:null,view:this.view});this.publiclyTrigger("select",[n])},e.prototype.triggerDateUnselect=function(e){this.publiclyTrigger("unselect",[{jsEvent:e?e.origEvent:null,view:this.view}])},e.prototype.triggerDateClick=function(e,t,n,r){var i=Se({},this.buildDatePointApi(e),{dayEl:t,jsEvent:r,view:n});this.publiclyTrigger("dateClick",[i])},e.prototype.buildDatePointApi=function(e){for(var t,n,r={},i=0,o=this.pluginSystem.hooks.datePointTransforms;i<o.length;i++){var a=o[i];Se(r,a(e,this))}return Se(r,(t=e,{date:(n=this.dateEnv).toDate(t.range.start),dateStr:n.formatIso(t.range.start,{omitTime:t.allDay}),allDay:t.allDay})),r},e.prototype.buildDateSpanApi=function(e){for(var t,n,r={},i=0,o=this.pluginSystem.hooks.dateSpanTransforms;i<o.length;i++){var a=o[i];Se(r,a(e,this))}return Se(r,(t=e,{start:(n=this.dateEnv).toDate(t.range.start),end:n.toDate(t.range.end),startStr:n.formatIso(t.range.start,{omitTime:t.allDay}),endStr:n.formatIso(t.range.end,{omitTime:t.allDay}),allDay:t.allDay})),r},e.prototype.getNow=function(){var e=this.opt("now");return"function"==typeof e&&(e=e()),null==e?this.dateEnv.createNowMarker():this.dateEnv.createMarker(e)},e.prototype.getDefaultEventEnd=function(e,t){var n=t;return e?(n=B(n),n=this.dateEnv.add(n,this.defaultAllDayEventDuration)):n=this.dateEnv.add(n,this.defaultTimedEventDuration),n},e.prototype.addEvent=function(e,t){if(e instanceof ct){var n=e._def,r=e._instance;return this.state.eventStore.defs[n.defId]||this.dispatch({type:"ADD_EVENTS",eventStore:Oe({def:n,instance:r})}),e}var i;if(t instanceof lt)i=t.internalEventSource.sourceId;else if(null!=t){var o=this.getEventSourceById(t);if(!o)return console.warn('Could not find an event source with ID "'+t+'"'),null;i=o.internalEventSource.sourceId}var a=Ft(e,i,this);return a?(this.dispatch({type:"ADD_EVENTS",eventStore:Oe(a)}),new ct(this,a.def,a.def.recurringDef?null:a.instance)):null},e.prototype.getEventById=function(e){var t=this.state.eventStore,n=t.defs,r=t.instances;for(var i in e=String(e),n){var o=n[i];if(o.publicId===e){if(o.recurringDef)return new ct(this,o,null);for(var a in r){var s=r[a];if(s.defId===o.defId)return new ct(this,o,s)}}}return null},e.prototype.getEvents=function(){var e=this.state.eventStore,t=e.defs,n=e.instances,r=[];for(var i in n){var o=n[i],a=t[o.defId];r.push(new ct(this,a,o))}return r},e.prototype.removeAllEvents=function(){this.dispatch({type:"REMOVE_ALL_EVENTS"})},e.prototype.rerenderEvents=function(){this.dispatch({type:"RESET_EVENTS"})},e.prototype.getEventSources=function(){var e=this.state.eventSources,t=[];for(var n in e)t.push(new lt(this,e[n]));return t},e.prototype.getEventSourceById=function(e){var t=this.state.eventSources;for(var n in e=String(e),t)if(t[n].publicId===e)return new lt(this,t[n]);return null},e.prototype.addEventSource=function(e){if(e instanceof lt)return this.state.eventSources[e.internalEventSource.sourceId]||this.dispatch({type:"ADD_EVENT_SOURCES",sources:[e.internalEventSource]}),e;var t=Wn(e,this);return t?(this.dispatch({type:"ADD_EVENT_SOURCES",sources:[t]}),new lt(this,t)):null},e.prototype.removeAllEventSources=function(){this.dispatch({type:"REMOVE_ALL_EVENT_SOURCES"})},e.prototype.refetchEvents=function(){this.dispatch({type:"FETCH_EVENT_SOURCES"})},e.prototype.scrollToTime=function(e){var t=J(e);t&&this.component.view.scrollToDuration(t)},e}();function Tr(e,t,n,r,i,o,a){return new Bn({calendarSystem:"gregory",timeZone:t,namedTimeZoneImpl:n,locale:e,weekNumberCalculation:i,firstDay:r,weekLabel:o,cmdFormatter:a})}function wr(e){return new(this.pluginSystem.hooks.themeClasses[e.themeSystem]||br)(e)}function Rr(e){var t=this.tryRerender.bind(this);return null!=e&&(t=pe(t,e)),t}function Ir(e){return Re(e,function(e){return e.ui})}function Cr(e,t,n){var r={"":t};for(var i in e){var o=e[i];o.sourceId&&n[o.sourceId]&&(r[i]=n[o.sourceId])}return r}tn.mixInto(Dr);var Mr=function(e){function t(t,n,i,o){var a=e.call(this,t,r("div",{className:"fc-view fc-"+n.type+"-view"}),!0)||this;return a.renderDatesMem=qt(a.renderDatesWrap,a.unrenderDatesWrap),a.renderBusinessHoursMem=qt(a.renderBusinessHours,a.unrenderBusinessHours,[a.renderDatesMem]),a.renderDateSelectionMem=qt(a.renderDateSelectionWrap,a.unrenderDateSelectionWrap,[a.renderDatesMem]),a.renderEventsMem=qt(a.renderEvents,a.unrenderEvents,[a.renderDatesMem]),a.renderEventSelectionMem=qt(a.renderEventSelectionWrap,a.unrenderEventSelectionWrap,[a.renderEventsMem]),a.renderEventDragMem=qt(a.renderEventDragWrap,a.unrenderEventDragWrap,[a.renderDatesMem]),a.renderEventResizeMem=qt(a.renderEventResizeWrap,a.unrenderEventResizeWrap,[a.renderDatesMem]),a.viewSpec=n,a.dateProfileGenerator=i,a.type=n.type,a.eventOrderSpecs=ie(a.opt("eventOrder")),a.nextDayThreshold=J(a.opt("nextDayThreshold")),o.appendChild(a.el),a.initialize(),a}return Ee(t,e),t.prototype.initialize=function(){},Object.defineProperty(t.prototype,"activeStart",{get:function(){return this.dateEnv.toDate(this.props.dateProfile.activeRange.start)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"activeEnd",{get:function(){return this.dateEnv.toDate(this.props.dateProfile.activeRange.end)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"currentStart",{get:function(){return this.dateEnv.toDate(this.props.dateProfile.currentRange.start)},enumerable:!0,configurable:!0}),Object.defineProperty(t.prototype,"currentEnd",{get:function(){return this.dateEnv.toDate(this.props.dateProfile.currentRange.end)},enumerable:!0,configurable:!0}),t.prototype.render=function(e){this.renderDatesMem(e.dateProfile),this.renderBusinessHoursMem(e.businessHours),this.renderDateSelectionMem(e.dateSelection),this.renderEventsMem(e.eventStore),this.renderEventSelectionMem(e.eventSelection),this.renderEventDragMem(e.eventDrag),this.renderEventResizeMem(e.eventResize)},t.prototype.destroy=function(){e.prototype.destroy.call(this),this.renderDatesMem.unrender()},t.prototype.updateSize=function(e,t,n){var r=this.calendar;(e||r.isViewUpdated||r.isDatesUpdated||r.isEventsUpdated)&&this.updateBaseSize(e,t,n)},t.prototype.updateBaseSize=function(e,t,n){},t.prototype.renderDatesWrap=function(e){this.renderDates(e),this.addScroll({duration:J(this.opt("scrollTime"))}),this.startNowIndicator(e)},t.prototype.unrenderDatesWrap=function(){this.stopNowIndicator(),this.unrenderDates()},t.prototype.renderDates=function(e){},t.prototype.unrenderDates=function(){},t.prototype.renderBusinessHours=function(e){},t.prototype.unrenderBusinessHours=function(){},t.prototype.renderDateSelectionWrap=function(e){e&&this.renderDateSelection(e)},t.prototype.unrenderDateSelectionWrap=function(e){e&&this.unrenderDateSelection(e)},t.prototype.renderDateSelection=function(e){},t.prototype.unrenderDateSelection=function(e){},t.prototype.renderEvents=function(e){},t.prototype.unrenderEvents=function(){},t.prototype.sliceEvents=function(e,t){var n=this.props;return dt(e,n.eventUiBases,n.dateProfile.activeRange,t?this.nextDayThreshold:null).fg},t.prototype.computeEventDraggable=function(e,t){for(var n=this.calendar.pluginSystem.hooks.isDraggableTransformers,r=t.startEditable,i=0,o=n;i<o.length;i++){r=(0,o[i])(r,e,t,this)}return r},t.prototype.computeEventStartResizable=function(e,t){return t.durationEditable&&this.opt("eventResizableFromStart")},t.prototype.computeEventEndResizable=function(e,t){return t.durationEditable},t.prototype.renderEventSelectionWrap=function(e){e&&this.renderEventSelection(e)},t.prototype.unrenderEventSelectionWrap=function(e){e&&this.unrenderEventSelection(e)},t.prototype.renderEventSelection=function(e){},t.prototype.unrenderEventSelection=function(e){},t.prototype.renderEventDragWrap=function(e){e&&this.renderEventDrag(e)},t.prototype.unrenderEventDragWrap=function(e){e&&this.unrenderEventDrag(e)},t.prototype.renderEventDrag=function(e){},t.prototype.unrenderEventDrag=function(e){},t.prototype.renderEventResizeWrap=function(e){e&&this.renderEventResize(e)},t.prototype.unrenderEventResizeWrap=function(e){e&&this.unrenderEventResize(e)},t.prototype.renderEventResize=function(e){},t.prototype.unrenderEventResize=function(e){},t.prototype.startNowIndicator=function(e){var t,n,r,i=this,o=this.dateEnv;this.opt("nowIndicator")&&(t=this.getNowIndicatorUnit(e))&&(n=this.updateNowIndicator.bind(this),this.initialNowDate=this.calendar.getNow(),this.initialNowQueriedMs=(new Date).valueOf(),r=o.add(o.startOf(this.initialNowDate,t),J(1,t)).valueOf()-this.initialNowDate.valueOf(),this.nowIndicatorTimeoutID=setTimeout(function(){i.nowIndicatorTimeoutID=null,n(),r="second"===t?1e3:6e4,i.nowIndicatorIntervalID=setInterval(n,r)},r))},t.prototype.updateNowIndicator=function(){this.props.dateProfile&&this.initialNowDate&&(this.unrenderNowIndicator(),this.renderNowIndicator(H(this.initialNowDate,(new Date).valueOf()-this.initialNowQueriedMs)),this.isNowIndicatorRendered=!0)},t.prototype.stopNowIndicator=function(){this.isNowIndicatorRendered&&(this.nowIndicatorTimeoutID&&(clearTimeout(this.nowIndicatorTimeoutID),this.nowIndicatorTimeoutID=null),this.nowIndicatorIntervalID&&(clearInterval(this.nowIndicatorIntervalID),this.nowIndicatorIntervalID=null),this.unrenderNowIndicator(),this.isNowIndicatorRendered=!1)},t.prototype.getNowIndicatorUnit=function(e){},t.prototype.renderNowIndicator=function(e){},t.prototype.unrenderNowIndicator=function(){},t.prototype.addScroll=function(e){var t=this.queuedScroll||(this.queuedScroll={});Se(t,e)},t.prototype.popScroll=function(e){this.applyQueuedScroll(e),this.queuedScroll=null},t.prototype.applyQueuedScroll=function(e){this.applyScroll(this.queuedScroll||{},e)},t.prototype.queryScroll=function(){var e={};return this.props.dateProfile&&Se(e,this.queryDateScroll()),e},t.prototype.applyScroll=function(e,t){var n=e.duration;null!=n&&(delete e.duration,this.props.dateProfile&&Se(e,this.computeDateScroll(n))),this.props.dateProfile&&this.applyDateScroll(e)},t.prototype.computeDateScroll=function(e){return{}},t.prototype.queryDateScroll=function(){return{}},t.prototype.applyDateScroll=function(e){},t.prototype.scrollToDuration=function(e){this.applyScroll({duration:e},!1)},t}(pn);tn.mixInto(Mr),Mr.prototype.usesMinMaxTime=!1,Mr.prototype.dateProfileGeneratorClass=Jn;var kr=function(){function e(e){this.segs=[],this.isSizeDirty=!1,this.context=e}return e.prototype.renderSegs=function(e,t){this.rangeUpdated(),e=this.renderSegEls(e,t),this.segs=e,this.attachSegs(e,t),this.isSizeDirty=!0,this.context.view.triggerRenderedSegs(this.segs,Boolean(t))},e.prototype.unrender=function(e,t){this.context.view.triggerWillRemoveSegs(this.segs,Boolean(t)),this.detachSegs(this.segs),this.segs=[]},e.prototype.rangeUpdated=function(){var e,t,n=this.context.options;this.eventTimeFormat=ot(n.eventTimeFormat||this.computeEventTimeFormat(),n.defaultRangeSeparator),null==(e=n.displayEventTime)&&(e=this.computeDisplayEventTime()),null==(t=n.displayEventEnd)&&(t=this.computeDisplayEventEnd()),this.displayEventTime=e,this.displayEventEnd=t},e.prototype.renderSegEls=function(e,t){var n,r="";if(e.length){for(n=0;n<e.length;n++)r+=this.renderSegHtml(e[n],t);o(r).forEach(function(t,n){var r=e[n];t&&(r.el=t)}),e=ft(this.context.view,e,Boolean(t))}return e},e.prototype.getSegClasses=function(e,t,n,r){var i=["fc-event",e.isStart?"fc-start":"fc-not-start",e.isEnd?"fc-end":"fc-not-end"].concat(e.eventRange.ui.classNames);return t&&i.push("fc-draggable"),n&&i.push("fc-resizable"),r&&(i.push("fc-mirror"),r.isDragging&&i.push("fc-dragging"),r.isResizing&&i.push("fc-resizing")),i},e.prototype.getTimeText=function(e,t,n){var r=e.def,i=e.instance;return this._getTimeText(i.range.start,r.hasEnd?i.range.end:null,r.allDay,t,n,i.forcedStartTzo,i.forcedEndTzo)},e.prototype._getTimeText=function(e,t,n,r,i,o,a){var s=this.context.dateEnv;return null==r&&(r=this.eventTimeFormat),null==i&&(i=this.displayEventEnd),this.displayEventTime&&!n?i&&t?s.formatRange(e,t,r,{forcedStartTzo:o,forcedEndTzo:a}):s.format(e,r,{forcedTzo:o}):""},e.prototype.computeEventTimeFormat=function(){return{hour:"numeric",minute:"2-digit",omitZeroMinute:!0}},e.prototype.computeDisplayEventTime=function(){return!0},e.prototype.computeDisplayEventEnd=function(){return!0},e.prototype.getSkinCss=function(e){return{"background-color":e.backgroundColor,"border-color":e.borderColor,color:e.textColor}},e.prototype.sortEventSegs=function(e){var t=this.context.view.eventOrderSpecs,n=e.map(Or);return n.sort(function(e,n){return oe(e,n,t)}),n.map(function(e){return e._seg})},e.prototype.computeSizes=function(e){(e||this.isSizeDirty)&&this.computeSegSizes(this.segs)},e.prototype.assignSizes=function(e){(e||this.isSizeDirty)&&(this.assignSegSizes(this.segs),this.isSizeDirty=!1)},e.prototype.computeSegSizes=function(e){},e.prototype.assignSegSizes=function(e){},e.prototype.hideByHash=function(e){if(e)for(var t=0,n=this.segs;t<n.length;t++){var r=n[t];e[r.eventRange.instance.instanceId]&&(r.el.style.visibility="hidden")}},e.prototype.showByHash=function(e){if(e)for(var t=0,n=this.segs;t<n.length;t++){var r=n[t];e[r.eventRange.instance.instanceId]&&(r.el.style.visibility="")}},e.prototype.selectByInstanceId=function(e){if(e)for(var t=0,n=this.segs;t<n.length;t++){var r=n[t],i=r.eventRange.instance;i&&i.instanceId===e&&r.el&&r.el.classList.add("fc-selected")}},e.prototype.unselectByInstanceId=function(e){if(e)for(var t=0,n=this.segs;t<n.length;t++){var r=n[t];r.el&&r.el.classList.remove("fc-selected")}},e}();function Or(e){var t=e.eventRange.def,n=e.eventRange.instance.range,r=n.start?n.start.valueOf():0,i=n.end?n.end.valueOf():0;return Se({},t.extendedProps,t,{id:t.publicId,start:r,end:i,duration:i-r,allDay:Number(t.allDay),_seg:e})}var _r=function(){function e(e){this.fillSegTag="div",this.dirtySizeFlags={},this.context=e,this.containerElsByType={},this.segsByType={}}return e.prototype.getSegsByType=function(e){return this.segsByType[e]||[]},e.prototype.renderSegs=function(e,t){var n,r=this.renderSegEls(e,t),i=this.attachSegs(e,r);i&&(n=this.containerElsByType[e]||(this.containerElsByType[e]=[])).push.apply(n,i),this.segsByType[e]=r,"bgEvent"===e&&this.context.view.triggerRenderedSegs(r,!1),this.dirtySizeFlags[e]=!0},e.prototype.unrender=function(e){var t=this.segsByType[e];t&&("bgEvent"===e&&this.context.view.triggerWillRemoveSegs(t,!1),this.detachSegs(e,t))},e.prototype.renderSegEls=function(e,t){var n,r=this,i="";if(t.length){for(n=0;n<t.length;n++)i+=this.renderSegHtml(e,t[n]);o(i).forEach(function(e,n){var r=t[n];e&&(r.el=e)}),"bgEvent"===e&&(t=ft(this.context.view,t,!1)),t=t.filter(function(e){return h(e.el,r.fillSegTag)})}return t},e.prototype.renderSegHtml=function(e,t){var n=null,r=[];return"highlight"!==e&&"businessHours"!==e&&(n={"background-color":t.eventRange.ui.backgroundColor}),"highlight"!==e&&(r=r.concat(t.eventRange.ui.classNames)),"businessHours"===e?r.push("fc-bgevent"):r.push("fc-"+e.toLowerCase()),"<"+this.fillSegTag+(r.length?' class="'+r.join(" ")+'"':"")+(n?' style="'+_t(n)+'"':"")+"></"+this.fillSegTag+">"},e.prototype.detachSegs=function(e,t){var n=this.containerElsByType[e];n&&(n.forEach(c),delete this.containerElsByType[e])},e.prototype.computeSizes=function(e){for(var t in this.segsByType)(e||this.dirtySizeFlags[t])&&this.computeSegSizes(this.segsByType[t])},e.prototype.assignSizes=function(e){for(var t in this.segsByType)(e||this.dirtySizeFlags[t])&&this.assignSegSizes(this.segsByType[t]);this.dirtySizeFlags={}},e.prototype.computeSegSizes=function(e){},e.prototype.assignSegSizes=function(e){},e}(),Pr=function(e){this.timeZoneName=e},xr=function(){function e(e){this.emitter=new tn}return e.prototype.destroy=function(){},e.prototype.setMirrorIsVisible=function(e){},e.prototype.setMirrorNeedsRevert=function(e){},e.prototype.setAutoScrollEnabled=function(e){},e}();function Hr(e){var t=_n(e.locale||"en",On([]).map);return e=Se({timeZone:Rn.timeZone,calendarSystem:"gregory"},e,{locale:t}),new Bn(e)}var Nr={startTime:J,duration:J,create:Boolean,sourceId:String},zr={create:!0};function Ur(e,t){return!e||t>10?{weekday:"short"}:t>1?{weekday:"short",month:"numeric",day:"numeric",omitCommas:!0}:{weekday:"long"}}function Lr(e,t,n,r,i,o,a,s){var u,l=o.view,c=o.dateEnv,d=o.theme,f=o.options,p=Ze(t.activeRange,e),h=["fc-day-header",d.getClass("widgetHeader")];return u="function"==typeof f.columnHeaderHtml?f.columnHeaderHtml(c.toDate(e)):"function"==typeof f.columnHeaderText?Ot(f.columnHeaderText(c.toDate(e))):Ot(c.format(e,i)),n?h=h.concat(Qt(e,t,o,!0)):h.push("fc-"+P[e.getUTCDay()]),'<th class="'+h.join(" ")+'"'+(p&&n?' data-date="'+c.formatIso(e,{omitTime:!0})+'"':"")+(a>1?' colspan="'+a+'"':"")+(s?" "+s:"")+">"+(p?Kt(l,{date:e,forceOff:!n||1===r},u):u)+"</th>"}var Br=function(e){function t(t,n){var r=e.call(this,t)||this;return n.innerHTML="",n.appendChild(r.el=i('<div class="fc-row '+r.theme.getClass("headerRow")+'"><table class="'+r.theme.getClass("tableGrid")+'"><thead></thead></table></div>')),r.thead=r.el.querySelector("thead"),r}return Ee(t,e),t.prototype.destroy=function(){c(this.el)},t.prototype.render=function(e){var t=e.dates,n=e.datesRepDistinctDays,r=[];e.renderIntroHtml&&r.push(e.renderIntroHtml());for(var i=ot(this.opt("columnHeaderFormat")||Ur(n,t.length)),o=0,a=t;o<a.length;o++){var s=a[o];r.push(Lr(s,e.dateProfile,n,t.length,i,this.context))}this.isRtl&&r.reverse(),this.thead.innerHTML="<tr>"+r.join("")+"</tr>"},t}(fn),Vr=function(){function e(e,t){for(var n=e.start,r=e.end,i=[],o=[],a=-1;n<r;)t.isHiddenDay(n)?i.push(a+.5):(a++,i.push(a),o.push(n)),n=x(n,1);this.dates=o,this.indices=i,this.cnt=o.length}return e.prototype.sliceRange=function(e){var t=this.getDateDayIndex(e.start),n=this.getDateDayIndex(x(e.end,-1)),r=Math.max(0,t),i=Math.min(this.cnt-1,n);return(r=Math.ceil(r))<=(i=Math.floor(i))?{firstIndex:r,lastIndex:i,isStart:t===r,isEnd:n===i}:null},e.prototype.getDateDayIndex=function(e){var t=this.indices,n=Math.floor(N(this.dates[0],e));return n<0?t[0]-1:n>=t.length?t[t.length-1]+1:t[n]},e}(),Ar=function(){function e(e,t){var n,r,i,o=e.dates;if(t){for(r=o[0].getUTCDay(),n=1;n<o.length&&o[n].getUTCDay()!==r;n++);i=Math.ceil(o.length/n)}else i=1,n=o.length;this.rowCnt=i,this.colCnt=n,this.daySeries=e,this.cells=this.buildCells(),this.headerDates=this.buildHeaderDates()}return e.prototype.buildCells=function(){for(var e=[],t=0;t<this.rowCnt;t++){for(var n=[],r=0;r<this.colCnt;r++)n.push(this.buildCell(t,r));e.push(n)}return e},e.prototype.buildCell=function(e,t){return{date:this.daySeries.dates[e*this.colCnt+t]}},e.prototype.buildHeaderDates=function(){for(var e=[],t=0;t<this.colCnt;t++)e.push(this.cells[0][t].date);return e},e.prototype.sliceRange=function(e){var t=this.colCnt,n=this.daySeries.sliceRange(e),r=[];if(n)for(var i=n.firstIndex,o=n.lastIndex,a=i;a<=o;){var s=Math.floor(a/t),u=Math.min((s+1)*t,o+1);r.push({row:s,firstCol:a%t,lastCol:(u-1)%t,isStart:n.isStart&&a===i,isEnd:n.isEnd&&u-1===o}),a=u}return r},e}(),Fr=function(){function e(){this.sliceBusinessHours=Ye(this._sliceBusinessHours),this.sliceDateSelection=Ye(this._sliceDateSpan),this.sliceEventStore=Ye(this._sliceEventStore),this.sliceEventDrag=Ye(this._sliceInteraction),this.sliceEventResize=Ye(this._sliceInteraction)}return e.prototype.sliceProps=function(e,t,n,r){for(var i=[],o=4;o<arguments.length;o++)i[o-4]=arguments[o];var a=e.eventUiBases,s=this.sliceEventStore.apply(this,[e.eventStore,a,t,n,r].concat(i));return{dateSelectionSegs:this.sliceDateSelection.apply(this,[e.dateSelection,a,r].concat(i)),businessHourSegs:this.sliceBusinessHours.apply(this,[e.businessHours,t,n,r].concat(i)),fgEventSegs:s.fg,bgEventSegs:s.bg,eventDrag:this.sliceEventDrag.apply(this,[e.eventDrag,a,t,n,r].concat(i)),eventResize:this.sliceEventResize.apply(this,[e.eventResize,a,t,n,r].concat(i)),eventSelection:e.eventSelection}},e.prototype.sliceNowDate=function(e,t){for(var n=[],r=2;r<arguments.length;r++)n[r-2]=arguments[r];return this._sliceDateSpan.apply(this,[{range:{start:e,end:H(e,1)},allDay:!1},{},t].concat(n))},e.prototype._sliceBusinessHours=function(e,t,n,r){for(var i=[],o=4;o<arguments.length;o++)i[o-4]=arguments[o];return e?this._sliceEventStore.apply(this,[_e(e,Wr(t,Boolean(n)),r.calendar),{},t,n,r].concat(i)).bg:[]},e.prototype._sliceEventStore=function(e,t,n,r,i){for(var o=[],a=5;a<arguments.length;a++)o[a-5]=arguments[a];if(e){var s=dt(e,t,Wr(n,Boolean(r)),r);return{bg:this.sliceEventRanges(s.bg,i,o),fg:this.sliceEventRanges(s.fg,i,o)}}return{bg:[],fg:[]}},e.prototype._sliceInteraction=function(e,t,n,r,i){for(var o=[],a=5;a<arguments.length;a++)o[a-5]=arguments[a];if(!e)return null;var s=dt(e.mutatedEvents,t,Wr(n,Boolean(r)),r);return{segs:this.sliceEventRanges(s.fg,i,o),affectedInstances:e.affectedEvents.instances,isEvent:e.isEvent,sourceSeg:e.origSeg}},e.prototype._sliceDateSpan=function(e,t,n){for(var r=[],i=3;i<arguments.length;i++)r[i-3]=arguments[i];if(!e)return[];for(var o=ar(e,t,n.calendar),a=this.sliceRange.apply(this,[e.range].concat(r)),s=0,u=a;s<u.length;s++){var l=u[s];l.component=n,l.eventRange=o}return a},e.prototype.sliceEventRanges=function(e,t,n){for(var r=[],i=0,o=e;i<o.length;i++){var a=o[i];r.push.apply(r,this.sliceEventRange(a,t,n))}return r},e.prototype.sliceEventRange=function(e,t,n){for(var r=this.sliceRange.apply(this,[e.range].concat(n)),i=0,o=r;i<o.length;i++){var a=o[i];a.component=t,a.eventRange=e,a.isStart=e.isStart&&a.isStart,a.isEnd=e.isEnd&&a.isEnd}return r},e}();function Wr(e,t){var n=e.activeRange;return t?n:{start:H(n.start,e.minTime.milliseconds),end:H(n.end,e.maxTime.milliseconds-864e5)}}e.Calendar=Dr,e.Component=fn,e.DateComponent=pn,e.DateEnv=Bn,e.DateProfileGenerator=Jn,e.DayHeader=Br,e.DaySeries=Vr,e.DayTable=Ar,e.ElementDragging=xr,e.ElementScrollController=sn,e.EmitterMixin=tn,e.EventApi=ct,e.FgEventRenderer=kr,e.FillRenderer=_r,e.Interaction=yr,e.Mixin=en,e.NamedTimeZoneImpl=Pr,e.PositionCache=on,e.ScrollComponent=ln,e.ScrollController=an,e.Slicer=Fr,e.Splitter=Xt,e.Theme=cn,e.View=Mr,e.WindowScrollController=un,e.addDays=x,e.addDurations=function(e,t){return{years:e.years+t.years,months:e.months+t.months,days:e.days+t.days,milliseconds:e.milliseconds+t.milliseconds}},e.addMs=H,e.addWeeks=function(e,t){var n=Z(e);return n[2]+=7*t,j(n)},e.allowContextMenu=function(e){e.removeEventListener("contextmenu",k)},e.allowSelection=function(e){e.classList.remove("fc-unselectable"),e.removeEventListener("selectstart",k)},e.appendToElement=s,e.applyAll=de,e.applyMutationToEventStore=yt,e.applyStyle=y,e.applyStyleProp=m,e.asRoughMinutes=function(e){return te(e)/6e4},e.asRoughMs=te,e.asRoughSeconds=function(e){return te(e)/1e3},e.buildGotoAnchorHtml=Kt,e.buildSegCompareObj=Or,e.capitaliseFirstLetter=ue,e.combineEventUis=Ut,e.compareByFieldSpec=ae,e.compareByFieldSpecs=oe,e.compareNumbers=function(e,t){return e-t},e.compensateScroll=function(e,t){t.left&&y(e,{borderLeftWidth:1,marginLeft:t.left-1}),t.right&&y(e,{borderRightWidth:1,marginRight:t.right-1})},e.computeClippingRect=function(e){return M(e).map(function(e){return w(e)}).concat({left:window.pageXOffset,right:window.pageXOffset+document.documentElement.clientWidth,top:window.pageYOffset,bottom:window.pageYOffset+document.documentElement.clientHeight}).reduce(function(e,t){return E(e,t)||t})},e.computeEdges=T,e.computeFallbackHeaderFormat=Ur,e.computeHeightAndMargins=I,e.computeInnerRect=w,e.computeRect=R,e.computeVisibleDayRange=ge,e.config={},e.constrainPoint=function(e,t){return{left:Math.min(Math.max(e.left,t.left),t.right),top:Math.min(Math.max(e.top,t.top),t.bottom)}},e.createDuration=J,e.createElement=r,e.createEmptyEventStore=He,e.createEventInstance=Zt,e.createFormatter=ot,e.createPlugin=vn,e.cssToStr=_t,e.debounce=pe,e.diffDates=ye,e.diffDayAndTime=z,e.diffDays=N,e.diffPoints=function(e,t){return{left:e.left-t.left,top:e.top-t.top}},e.diffWeeks=function(e,t){return N(e,t)/7},e.diffWholeDays=L,e.diffWholeWeeks=U,e.disableCursor=function(){document.body.classList.add("fc-not-allowed")},e.distributeHeight=function(e,t,n){var r=Math.floor(t/e.length),i=Math.floor(t-r*(e.length-1)),o=[],a=[],s=[],u=0;re(e),e.forEach(function(t,n){var l=n===e.length-1?i:r,c=t.getBoundingClientRect().height,d=c+C(t);d<l?(o.push(t),a.push(d),s.push(c)):u+=d}),n&&(t-=u,r=Math.floor(t/o.length),i=Math.floor(t-r*(o.length-1))),o.forEach(function(e,t){var n=t===o.length-1?i:r,u=a[t],l=n-(u-s[t]);u<n&&(e.style.height=l+"px")})},e.elementClosest=p,e.elementMatches=h,e.enableCursor=function(){document.body.classList.remove("fc-not-allowed")},e.eventTupleToStore=Oe,e.filterEventStoreDefs=ze,e.filterHash=we,e.findChildren=function(e,t){for(var n=e instanceof HTMLElement?[e]:e,r=[],i=0;i<n.length;i++)for(var o=n[i].children,a=0;a<o.length;a++){var s=o[a];t&&!h(s,t)||r.push(s)}return r},e.findElements=v,e.flexibleCompare=se,e.forceClassName=function(e,t,n){n?e.classList.add(t):e.classList.remove(t)},e.formatDate=function(e,t){void 0===t&&(t={});var n=Hr(t),r=ot(t),i=n.createMarkerMeta(e);return i?n.format(i.marker,r,{forcedTzo:i.forcedTzo}):""},e.formatIsoTimeString=function(e){return le(e.getUTCHours(),2)+":"+le(e.getUTCMinutes(),2)+":"+le(e.getUTCSeconds(),2)},e.formatRange=function(e,t,n){var r=Hr("object"==typeof n&&n?n:{}),i=ot(n,Rn.defaultRangeSeparator),o=r.createMarkerMeta(e),a=r.createMarkerMeta(t);return o&&a?r.formatRange(o.marker,a.marker,i,{forcedStartTzo:o.forcedTzo,forcedEndTzo:a.forcedTzo,isEndExclusive:n.isEndExclusive}):""},e.getAllDayHtml=function(e){return e.opt("allDayHtml")||Ot(e.opt("allDayText"))},e.getClippingParents=M,e.getDayClasses=Qt,e.getElSeg=ht,e.getRectCenter=function(e){return{left:(e.left+e.right)/2,top:(e.top+e.bottom)/2}},e.getRelevantEvents=Pe,e.globalDefaults=Rn,e.greatestDurationDenominator=ne,e.hasBgRendering=function(e){return"background"===e.rendering||"inverse-background"===e.rendering},e.htmlEscape=Ot,e.htmlToElement=i,e.insertAfterElement=function(e,t){for(var n=l(t),r=e.nextSibling||null,i=0;i<n.length;i++)e.parentNode.insertBefore(n[i],r)},e.interactionSettingsStore=mr,e.interactionSettingsToStore=function(e){var t;return(t={})[e.component.uid]=e,t},e.intersectRanges=Ve,e.intersectRects=E,e.isArraysEqual=je,e.isDateSpansEqual=function(e,t){return Ae(e.range,t.range)&&e.allDay===t.allDay&&function(e,t){for(var n in t)if("range"!==n&&"allDay"!==n&&e[n]!==t[n])return!1;for(var n in e)if(!(n in t))return!1;return!0}(e,t)},e.isInt=ce,e.isInteractionValid=Tt,e.isMultiDayRange=function(e){var t=ge(e);return N(t.start,t.end)>1},e.isPropsEqual=Me,e.isPropsValid=Rt,e.isSingleDay=function(e){return 0===e.years&&0===e.months&&1===e.days&&0===e.milliseconds},e.isValidDate=Y,e.listenBySelector=O,e.mapHash=Re,e.matchCellWidths=function(e){var t=0;return e.forEach(function(e){var n=e.firstChild;if(n instanceof HTMLElement){var r=n.getBoundingClientRect().width;r>t&&(t=r)}}),t++,e.forEach(function(e){e.style.width=t+"px"}),t},e.memoize=Ye,e.memoizeOutput=qe,e.memoizeRendering=qt,e.mergeEventStores=Ne,e.multiplyDuration=function(e,t){return{years:e.years*t,months:e.months*t,days:e.days*t,milliseconds:e.milliseconds*t}},e.padStart=le,e.parseBusinessHours=Yt,e.parseDragMeta=function(e){var t={},n=he(e,Nr,zr,t);return n.leftoverProps=t,n},e.parseEventDef=Wt,e.parseFieldSpecs=ie,e.parseMarker=Ln,e.pointInsideRect=function(e,t){return e.left>=t.left&&e.left<t.right&&e.top>=t.top&&e.top<t.bottom},e.prependToElement=u,e.preventContextMenu=function(e){e.addEventListener("contextmenu",k)},e.preventDefault=k,e.preventSelection=function(e){e.classList.add("fc-unselectable"),e.addEventListener("selectstart",k)},e.processScopedUiProps=Nt,e.rangeContainsMarker=Ze,e.rangeContainsRange=We,e.rangesEqual=Ae,e.rangesIntersect=Fe,e.refineProps=he,e.removeElement=c,e.removeExact=function(e,t){for(var n=0,r=0;r<e.length;)e[r]===t?(e.splice(r,1),n++):r++;return n},e.renderDateCell=Lr,e.requestJson=En,e.sliceEventStore=dt,e.startOfDay=B,e.subtractInnerElHeight=function(e,t){var n={position:"relative",left:-1};y(e,n),y(t,n);var r=e.getBoundingClientRect().height-t.getBoundingClientRect().height,i={position:"",left:""};return y(e,i),y(t,i),r},e.translateRect=function(e,t,n){return{left:e.left+t,right:e.right+t,top:e.top+n,bottom:e.bottom+n}},e.uncompensateScroll=function(e){y(e,{marginLeft:"",marginRight:"",borderLeftWidth:"",borderRightWidth:""})},e.undistributeHeight=re,e.unpromisify=$t,e.version="4.3.1",e.whenTransitionDone=function(e,t){var n=function(r){t(r),_.forEach(function(t){e.removeEventListener(t,n)})};_.forEach(function(t){e.addEventListener(t,n)})},e.wholeDivideDurations=function(e,t){for(var n=null,r=0;r<G.length;r++){var i=G[r];if(t[i]){var o=e[i]/t[i];if(!ce(o)||null!==n&&n!==o)return null;n=o}else if(e[i])return null}return n},Object.defineProperty(e,"__esModule",{value:!0})});
\ No newline at end of file
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/core/package.json b/AKPlan/static/AKPlan/vendor/fullcalendar/core/package.json
deleted file mode 100644
index 67f976df5a7656e4e5a1f4379e710c961066d726..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/core/package.json
+++ /dev/null
@@ -1,30 +0,0 @@
-{
-  "name": "@fullcalendar/core",
-  "version": "4.3.1",
-  "title": "FullCalendar Core Package",
-  "description": "Provides core functionality, including the Calendar class",
-  "keywords": [
-    "calendar",
-    "event",
-    "full-sized"
-  ],
-  "homepage": "https://fullcalendar.io/",
-  "docs": "https://fullcalendar.io/docs/initialize-es6",
-  "bugs": "https://fullcalendar.io/reporting-bugs",
-  "repository": {
-    "type": "git",
-    "url": "https://github.com/fullcalendar/fullcalendar.git",
-    "homepage": "https://github.com/fullcalendar/fullcalendar"
-  },
-  "license": "MIT",
-  "author": {
-    "name": "Adam Shaw",
-    "email": "arshaw@arshaw.com",
-    "url": "http://arshaw.com/"
-  },
-  "copyright": "2019 Adam Shaw",
-  "main": "main.js",
-  "module": "main.esm.js",
-  "unpkg": "main.min.js",
-  "types": "main.d.ts"
-}
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/daygrid/LICENSE.txt b/AKPlan/static/AKPlan/vendor/fullcalendar/daygrid/LICENSE.txt
deleted file mode 100644
index 2149cfbeff4f2e3649bc950982aa72b894f7e521..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/daygrid/LICENSE.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-Copyright (c) 2019 Adam Shaw
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/daygrid/README.md b/AKPlan/static/AKPlan/vendor/fullcalendar/daygrid/README.md
deleted file mode 100644
index e00936542f3578a9099539227bfdac16008fa220..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/daygrid/README.md
+++ /dev/null
@@ -1,8 +0,0 @@
-
-# FullCalendar Day Grid Plugin
-
-Display events on Month view or DayGrid view
-
-[View the docs &raquo;](https://fullcalendar.io/docs/month-view)
-
-This package was created from the [FullCalendar monorepo &raquo;](https://github.com/fullcalendar/fullcalendar)
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/daygrid/main.css b/AKPlan/static/AKPlan/vendor/fullcalendar/daygrid/main.css
deleted file mode 100644
index 81f58955496b41ea5e151f26207e068e5b29698b..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/daygrid/main.css
+++ /dev/null
@@ -1,78 +0,0 @@
-/* DayGridView
---------------------------------------------------------------------------------------------------*/
-/* day row structure */
-.fc-dayGridWeek-view .fc-content-skeleton,
-.fc-dayGridDay-view .fc-content-skeleton {
-  /* there may be week numbers in these views, so no padding-top */
-  padding-bottom: 1em;
-  /* ensure a space at bottom of cell for user selecting/clicking */
-}
-
-.fc-dayGrid-view .fc-body .fc-row {
-  min-height: 4em;
-  /* ensure that all rows are at least this tall */
-}
-
-/* a "rigid" row will take up a constant amount of height because content-skeleton is absolute */
-.fc-row.fc-rigid {
-  overflow: hidden;
-}
-
-.fc-row.fc-rigid .fc-content-skeleton {
-  position: absolute;
-  top: 0;
-  left: 0;
-  right: 0;
-}
-
-/* week and day number styling */
-.fc-day-top.fc-other-month {
-  opacity: 0.3;
-}
-
-.fc-dayGrid-view .fc-week-number,
-.fc-dayGrid-view .fc-day-number {
-  padding: 2px;
-}
-
-.fc-dayGrid-view th.fc-week-number,
-.fc-dayGrid-view th.fc-day-number {
-  padding: 0 2px;
-  /* column headers can't have as much v space */
-}
-
-.fc-ltr .fc-dayGrid-view .fc-day-top .fc-day-number {
-  float: right;
-}
-
-.fc-rtl .fc-dayGrid-view .fc-day-top .fc-day-number {
-  float: left;
-}
-
-.fc-ltr .fc-dayGrid-view .fc-day-top .fc-week-number {
-  float: left;
-  border-radius: 0 0 3px 0;
-}
-
-.fc-rtl .fc-dayGrid-view .fc-day-top .fc-week-number {
-  float: right;
-  border-radius: 0 0 0 3px;
-}
-
-.fc-dayGrid-view .fc-day-top .fc-week-number {
-  min-width: 1.5em;
-  text-align: center;
-  background-color: #f2f2f2;
-  color: #808080;
-}
-
-/* when week/day number have own column */
-.fc-dayGrid-view td.fc-week-number {
-  text-align: center;
-}
-
-.fc-dayGrid-view td.fc-week-number > * {
-  /* work around the way we do column resizing and ensure a minimum width */
-  display: inline-block;
-  min-width: 1.25em;
-}
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/daygrid/main.d.ts b/AKPlan/static/AKPlan/vendor/fullcalendar/daygrid/main.d.ts
deleted file mode 100644
index 0513df97763dd222dfc21aa06b5742ffca357ac6..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/daygrid/main.d.ts
+++ /dev/null
@@ -1,358 +0,0 @@
-// Generated by dts-bundle v0.7.3-fork.1
-// Dependencies for this module:
-//   ../../../../../@fullcalendar/core
-
-declare module '@fullcalendar/daygrid' {
-    export { default as SimpleDayGrid, DayGridSlicer } from '@fullcalendar/daygrid/SimpleDayGrid';
-    export { default as DayGrid, DayGridSeg } from '@fullcalendar/daygrid/DayGrid';
-    export { default as AbstractDayGridView } from '@fullcalendar/daygrid/AbstractDayGridView';
-    export { default as DayGridView, buildDayTable as buildBasicDayTable } from '@fullcalendar/daygrid/DayGridView';
-    export { default as DayBgRow } from '@fullcalendar/daygrid/DayBgRow';
-    const _default: import("@fullcalendar/core").PluginDef;
-    export default _default;
-}
-
-declare module '@fullcalendar/daygrid/SimpleDayGrid' {
-    import {
-        ComponentContext,
-        DateComponent,
-        DateProfile,
-        DateRange,
-        DateSpan,
-        DayTable,
-        Duration,
-        EventInteractionState,
-        EventStore,
-        EventUiHash,
-        Hit,
-        Slicer
-    } from '@fullcalendar/core';
-    import {DayGridSeg, default as DayGrid} from '@fullcalendar/daygrid/DayGrid';
-
-    export interface SimpleDayGridProps {
-        dateProfile: DateProfile | null;
-        dayTable: DayTable;
-        nextDayThreshold: Duration;
-        businessHours: EventStore;
-        eventStore: EventStore;
-        eventUiBases: EventUiHash;
-        dateSelection: DateSpan | null;
-        eventSelection: string;
-        eventDrag: EventInteractionState | null;
-        eventResize: EventInteractionState | null;
-        isRigid: boolean;
-    }
-    export { SimpleDayGrid as default, SimpleDayGrid };
-    class SimpleDayGrid extends DateComponent<SimpleDayGridProps> {
-        dayGrid: DayGrid;
-        constructor(context: ComponentContext, dayGrid: DayGrid);
-        destroy(): void;
-        render(props: SimpleDayGridProps): void;
-        buildPositionCaches(): void;
-        queryHit(positionLeft: number, positionTop: number): Hit;
-    }
-    export class DayGridSlicer extends Slicer<DayGridSeg, [DayTable]> {
-        sliceRange(dateRange: DateRange, dayTable: DayTable): DayGridSeg[];
-    }
-}
-
-declare module '@fullcalendar/daygrid/DayGrid' {
-    import {
-        DateComponent,
-        DateMarker,
-        DateProfile,
-        EventSegUiInteractionState,
-        PositionCache,
-        Seg
-    } from '@fullcalendar/core';
-    import Popover from '@fullcalendar/daygrid/Popover';
-    import DayGridEventRenderer from '@fullcalendar/daygrid/DayGridEventRenderer';
-    import DayTile from '@fullcalendar/daygrid/DayTile';
-
-    export interface RenderProps {
-        renderNumberIntroHtml: (row: number, dayGrid: DayGrid) => string;
-        renderBgIntroHtml: () => string;
-        renderIntroHtml: () => string;
-        colWeekNumbersVisible: boolean;
-        cellWeekNumbersVisible: boolean;
-    }
-    export interface DayGridSeg extends Seg {
-        row: number;
-        firstCol: number;
-        lastCol: number;
-    }
-    export interface DayGridCell {
-        date: DateMarker;
-        htmlAttrs?: string;
-    }
-    export interface DayGridProps {
-        dateProfile: DateProfile;
-        cells: DayGridCell[][];
-        businessHourSegs: DayGridSeg[];
-        bgEventSegs: DayGridSeg[];
-        fgEventSegs: DayGridSeg[];
-        dateSelectionSegs: DayGridSeg[];
-        eventSelection: string;
-        eventDrag: EventSegUiInteractionState | null;
-        eventResize: EventSegUiInteractionState | null;
-        isRigid: boolean;
-    }
-    export { DayGrid as default, DayGrid };
-    class DayGrid extends DateComponent<DayGridProps> {
-        eventRenderer: DayGridEventRenderer;
-        renderProps: RenderProps;
-        rowCnt: number;
-        colCnt: number;
-        bottomCoordPadding: number;
-        rowEls: HTMLElement[];
-        cellEls: HTMLElement[];
-        isCellSizesDirty: boolean;
-        rowPositions: PositionCache;
-        colPositions: PositionCache;
-        segPopover: Popover;
-        segPopoverTile: DayTile;
-        constructor(context: any, el: any, renderProps: RenderProps);
-        render(props: DayGridProps): void;
-        destroy(): void;
-        getCellRange(row: any, col: any): {
-            start: Date;
-            end: Date;
-        };
-        updateSegPopoverTile(date?: any, segs?: any): void;
-        _renderCells(cells: DayGridCell[][], isRigid: boolean): void;
-        _unrenderCells(): void;
-        renderDayRowHtml(row: any, isRigid: any): string;
-        getIsNumbersVisible(): boolean;
-        getIsDayNumbersVisible(): boolean;
-        renderNumberTrHtml(row: number): string;
-        renderNumberCellsHtml(row: any): string;
-        renderNumberCellHtml(date: any): string;
-        updateSize(isResize: boolean): void;
-        buildPositionCaches(): void;
-        buildColPositions(): void;
-        buildRowPositions(): void;
-        positionToHit(leftPosition: any, topPosition: any): {
-            row: any;
-            col: any;
-            dateSpan: {
-                range: {
-                    start: Date;
-                    end: Date;
-                };
-                allDay: boolean;
-            };
-            dayEl: HTMLElement;
-            relativeRect: {
-                left: any;
-                right: any;
-                top: any;
-                bottom: any;
-            };
-        };
-        getCellEl(row: any, col: any): HTMLElement;
-        _renderEventDrag(state: EventSegUiInteractionState): void;
-        _unrenderEventDrag(state: EventSegUiInteractionState): void;
-        _renderEventResize(state: EventSegUiInteractionState): void;
-        _unrenderEventResize(state: EventSegUiInteractionState): void;
-        removeSegPopover(): void;
-        limitRows(levelLimit: any): void;
-        computeRowLevelLimit(row: any): (number | false);
-        limitRow(row: any, levelLimit: any): void;
-        unlimitRow(row: any): void;
-        renderMoreLink(row: any, col: any, hiddenSegs: any): HTMLElement;
-        showSegPopover(row: any, col: any, moreLink: HTMLElement, segs: any): void;
-        resliceDaySegs(segs: any, dayDate: any): any[];
-        getMoreLinkText(num: any): any;
-        getCellSegs(row: any, col: any, startLevel?: any): any[];
-    }
-}
-
-declare module '@fullcalendar/daygrid/AbstractDayGridView' {
-    import {
-        ComponentContext,
-        DateProfileGenerator,
-        Duration,
-        ScrollComponent,
-        View,
-        ViewSpec
-    } from '@fullcalendar/core';
-    import DayGrid from '@fullcalendar/daygrid/DayGrid';
-    export {DayGridView as default, DayGridView};
-
-    abstract class DayGridView extends View {
-        scroller: ScrollComponent;
-        dayGrid: DayGrid;
-        colWeekNumbersVisible: boolean;
-        weekNumberWidth: number;
-
-        constructor(context: ComponentContext, viewSpec: ViewSpec, dateProfileGenerator: DateProfileGenerator, parentEl: HTMLElement);
-
-        destroy(): void;
-
-        renderSkeletonHtml(): string;
-        weekNumberStyleAttr(): string;
-        hasRigidRows(): boolean;
-        updateSize(isResize: boolean, viewHeight: number, isAuto: boolean): void;
-        updateBaseSize(isResize: boolean, viewHeight: number, isAuto: boolean): void;
-        computeScrollerHeight(viewHeight: any): number;
-        setGridHeight(height: any, isAuto: any): void;
-        computeDateScroll(duration: Duration): {
-            top: number;
-        };
-        queryDateScroll(): {
-            top: number;
-        };
-        applyDateScroll(scroll: any): void;
-        renderHeadIntroHtml: () => string;
-        renderDayGridNumberIntroHtml: (row: number, dayGrid: DayGrid) => string;
-        renderDayGridBgIntroHtml: () => string;
-        renderDayGridIntroHtml: () => string;
-    }
-}
-
-declare module '@fullcalendar/daygrid/DayGridView' {
-    import {
-        ComponentContext,
-        DateProfile,
-        DateProfileGenerator,
-        DayHeader,
-        DayTable,
-        ViewProps,
-        ViewSpec
-    } from '@fullcalendar/core';
-    import AbstractDayGridView from '@fullcalendar/daygrid/AbstractDayGridView';
-    import SimpleDayGrid from '@fullcalendar/daygrid/SimpleDayGrid';
-    export {DayGridView as default, DayGridView};
-
-    class DayGridView extends AbstractDayGridView {
-        header: DayHeader;
-        simpleDayGrid: SimpleDayGrid;
-        dayTable: DayTable;
-
-        constructor(_context: ComponentContext, viewSpec: ViewSpec, dateProfileGenerator: DateProfileGenerator, parentEl: HTMLElement);
-
-        destroy(): void;
-
-        render(props: ViewProps): void;
-    }
-    export function buildDayTable(dateProfile: DateProfile, dateProfileGenerator: DateProfileGenerator): DayTable;
-}
-
-declare module '@fullcalendar/daygrid/DayBgRow' {
-    import {ComponentContext, DateMarker, DateProfile} from '@fullcalendar/core';
-
-    export interface DayBgCell {
-        date: DateMarker;
-        htmlAttrs?: string;
-    }
-
-    export interface DayBgRowProps {
-        cells: DayBgCell[];
-        dateProfile: DateProfile;
-        renderIntroHtml?: () => string;
-    }
-    export { DayBgRow as default, DayBgRow };
-    class DayBgRow {
-        context: ComponentContext;
-        constructor(context: ComponentContext);
-        renderHtml(props: DayBgRowProps): string;
-    }
-}
-
-declare module '@fullcalendar/daygrid/Popover' {
-    export interface PopoverOptions {
-        className?: string;
-        content?: (el: HTMLElement) => void;
-        parentEl: HTMLElement;
-        autoHide?: boolean;
-        top?: number;
-        left?: number;
-        right?: number;
-        viewportConstrain?: boolean;
-    }
-    export { Popover as default, Popover };
-    class Popover {
-        isHidden: boolean;
-        options: PopoverOptions;
-        el: HTMLElement;
-        margin: number;
-        constructor(options: PopoverOptions);
-        show(): void;
-        hide(): void;
-        render(): void;
-        documentMousedown: (ev: any) => void;
-        destroy(): void;
-        position(): void;
-        trigger(name: any): void;
-    }
-}
-
-declare module '@fullcalendar/daygrid/DayGridEventRenderer' {
-    import {Seg} from '@fullcalendar/core';
-    import DayGrid from '@fullcalendar/daygrid/DayGrid';
-    import SimpleDayGridEventRenderer from '@fullcalendar/daygrid/SimpleDayGridEventRenderer';
-    export { DayGridEventRenderer as default, DayGridEventRenderer };
-    class DayGridEventRenderer extends SimpleDayGridEventRenderer {
-        dayGrid: DayGrid;
-        rowStructs: any;
-        constructor(dayGrid: DayGrid);
-        attachSegs(segs: Seg[], mirrorInfo: any): void;
-        detachSegs(): void;
-        renderSegRows(segs: Seg[]): any[];
-        renderSegRow(row: any, rowSegs: any): {
-            row: any;
-            tbodyEl: HTMLTableSectionElement;
-            cellMatrix: any[];
-            segMatrix: any[];
-            segLevels: any[];
-            segs: any;
-        };
-        buildSegLevels(segs: Seg[]): any[];
-        groupSegRows(segs: Seg[]): any[];
-        computeDisplayEventEnd(): boolean;
-    }
-}
-
-declare module '@fullcalendar/daygrid/DayTile' {
-    import {ComponentContext, DateComponent, DateMarker, EventInstanceHash, Hit, Seg} from '@fullcalendar/core';
-    import SimpleDayGridEventRenderer from '@fullcalendar/daygrid/SimpleDayGridEventRenderer';
-
-    export interface DayTileProps {
-        date: DateMarker;
-        fgSegs: Seg[];
-        eventSelection: string;
-        eventDragInstances: EventInstanceHash;
-        eventResizeInstances: EventInstanceHash;
-    }
-    export { DayTile as default, DayTile };
-    class DayTile extends DateComponent<DayTileProps> {
-        segContainerEl: HTMLElement;
-        constructor(context: ComponentContext, el: HTMLElement);
-        render(props: DayTileProps): void;
-        destroy(): void;
-        _renderFrame(date: DateMarker): void;
-        queryHit(positionLeft: number, positionTop: number, elWidth: number, elHeight: number): Hit | null;
-    }
-    export class DayTileEventRenderer extends SimpleDayGridEventRenderer {
-        dayTile: DayTile;
-        constructor(dayTile: any);
-        attachSegs(segs: Seg[]): void;
-        detachSegs(segs: Seg[]): void;
-    }
-}
-
-declare module '@fullcalendar/daygrid/SimpleDayGridEventRenderer' {
-    import {FgEventRenderer, Seg} from '@fullcalendar/core';
-    export { SimpleDayGridEventRenderer as default, SimpleDayGridEventRenderer };
-    abstract class SimpleDayGridEventRenderer extends FgEventRenderer {
-        renderSegHtml(seg: Seg, mirrorInfo: any): string;
-        computeEventTimeFormat(): {
-            hour: string;
-            minute: string;
-            omitZeroMinute: boolean;
-            meridiem: string;
-        };
-        computeDisplayEventEnd(): boolean;
-    }
-}
-
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/daygrid/main.esm.js b/AKPlan/static/AKPlan/vendor/fullcalendar/daygrid/main.esm.js
deleted file mode 100644
index ca874f18daa3de115acfadfa2802e330c9e382db..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/daygrid/main.esm.js
+++ /dev/null
@@ -1,1670 +0,0 @@
-/*!
-FullCalendar Day Grid Plugin v4.3.0
-Docs & License: https://fullcalendar.io/
-(c) 2019 Adam Shaw
-*/
-
-import {
-    addDays,
-    addWeeks,
-    appendToElement,
-    applyStyle,
-    buildGotoAnchorHtml,
-    compensateScroll,
-    computeClippingRect,
-    computeRect,
-    createElement,
-    createFormatter,
-    createPlugin,
-    cssToStr,
-    DateComponent,
-    DateProfileGenerator,
-    DayHeader,
-    DaySeries,
-    DayTable,
-    diffWeeks,
-    distributeHeight,
-    FgEventRenderer,
-    FillRenderer,
-    findChildren,
-    findElements,
-    getDayClasses,
-    htmlEscape,
-    htmlToElement,
-    insertAfterElement,
-    intersectRanges,
-    listenBySelector,
-    matchCellWidths,
-    memoize,
-    memoizeRendering,
-    PositionCache,
-    prependToElement,
-    rangeContainsMarker,
-    removeElement,
-    ScrollComponent,
-    Slicer,
-    subtractInnerElHeight,
-    uncompensateScroll,
-    undistributeHeight,
-    View
-} from '@fullcalendar/core';
-
-/*! *****************************************************************************
-Copyright (c) Microsoft Corporation. All rights reserved.
-Licensed under the Apache License, Version 2.0 (the "License"); you may not use
-this file except in compliance with the License. You may obtain a copy of the
-License at http://www.apache.org/licenses/LICENSE-2.0
-
-THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
-WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
-MERCHANTABLITY OR NON-INFRINGEMENT.
-
-See the Apache Version 2.0 License for specific language governing permissions
-and limitations under the License.
-***************************************************************************** */
-/* global Reflect, Promise */
-
-var extendStatics = function(d, b) {
-    extendStatics = Object.setPrototypeOf ||
-        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-    return extendStatics(d, b);
-};
-
-function __extends(d, b) {
-    extendStatics(d, b);
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-}
-
-var __assign = function() {
-    __assign = Object.assign || function __assign(t) {
-        for (var s, i = 1, n = arguments.length; i < n; i++) {
-            s = arguments[i];
-            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
-        }
-        return t;
-    };
-    return __assign.apply(this, arguments);
-};
-
-var DayGridDateProfileGenerator = /** @class */ (function (_super) {
-    __extends(DayGridDateProfileGenerator, _super);
-    function DayGridDateProfileGenerator() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    // Computes the date range that will be rendered.
-    DayGridDateProfileGenerator.prototype.buildRenderRange = function (currentRange, currentRangeUnit, isRangeAllDay) {
-        var dateEnv = this.dateEnv;
-        var renderRange = _super.prototype.buildRenderRange.call(this, currentRange, currentRangeUnit, isRangeAllDay);
-        var start = renderRange.start;
-        var end = renderRange.end;
-        var endOfWeek;
-        // year and month views should be aligned with weeks. this is already done for week
-        if (/^(year|month)$/.test(currentRangeUnit)) {
-            start = dateEnv.startOfWeek(start);
-            // make end-of-week if not already
-            endOfWeek = dateEnv.startOfWeek(end);
-            if (endOfWeek.valueOf() !== end.valueOf()) {
-                end = addWeeks(endOfWeek, 1);
-            }
-        }
-        // ensure 6 weeks
-        if (this.options.monthMode &&
-            this.options.fixedWeekCount) {
-            var rowCnt = Math.ceil(// could be partial weeks due to hiddenDays
-            diffWeeks(start, end));
-            end = addWeeks(end, 6 - rowCnt);
-        }
-        return { start: start, end: end };
-    };
-    return DayGridDateProfileGenerator;
-}(DateProfileGenerator));
-
-/* A rectangular panel that is absolutely positioned over other content
-------------------------------------------------------------------------------------------------------------------------
-Options:
-  - className (string)
-  - content (HTML string, element, or element array)
-  - parentEl
-  - top
-  - left
-  - right (the x coord of where the right edge should be. not a "CSS" right)
-  - autoHide (boolean)
-  - show (callback)
-  - hide (callback)
-*/
-var Popover = /** @class */ (function () {
-    function Popover(options) {
-        var _this = this;
-        this.isHidden = true;
-        this.margin = 10; // the space required between the popover and the edges of the scroll container
-        // Triggered when the user clicks *anywhere* in the document, for the autoHide feature
-        this.documentMousedown = function (ev) {
-            // only hide the popover if the click happened outside the popover
-            if (_this.el && !_this.el.contains(ev.target)) {
-                _this.hide();
-            }
-        };
-        this.options = options;
-    }
-    // Shows the popover on the specified position. Renders it if not already
-    Popover.prototype.show = function () {
-        if (this.isHidden) {
-            if (!this.el) {
-                this.render();
-            }
-            this.el.style.display = '';
-            this.position();
-            this.isHidden = false;
-            this.trigger('show');
-        }
-    };
-    // Hides the popover, through CSS, but does not remove it from the DOM
-    Popover.prototype.hide = function () {
-        if (!this.isHidden) {
-            this.el.style.display = 'none';
-            this.isHidden = true;
-            this.trigger('hide');
-        }
-    };
-    // Creates `this.el` and renders content inside of it
-    Popover.prototype.render = function () {
-        var _this = this;
-        var options = this.options;
-        var el = this.el = createElement('div', {
-            className: 'fc-popover ' + (options.className || ''),
-            style: {
-                top: '0',
-                left: '0'
-            }
-        });
-        if (typeof options.content === 'function') {
-            options.content(el);
-        }
-        options.parentEl.appendChild(el);
-        // when a click happens on anything inside with a 'fc-close' className, hide the popover
-        listenBySelector(el, 'click', '.fc-close', function (ev) {
-            _this.hide();
-        });
-        if (options.autoHide) {
-            document.addEventListener('mousedown', this.documentMousedown);
-        }
-    };
-    // Hides and unregisters any handlers
-    Popover.prototype.destroy = function () {
-        this.hide();
-        if (this.el) {
-            removeElement(this.el);
-            this.el = null;
-        }
-        document.removeEventListener('mousedown', this.documentMousedown);
-    };
-    // Positions the popover optimally, using the top/left/right options
-    Popover.prototype.position = function () {
-        var options = this.options;
-        var el = this.el;
-        var elDims = el.getBoundingClientRect(); // only used for width,height
-        var origin = computeRect(el.offsetParent);
-        var clippingRect = computeClippingRect(options.parentEl);
-        var top; // the "position" (not "offset") values for the popover
-        var left; //
-        // compute top and left
-        top = options.top || 0;
-        if (options.left !== undefined) {
-            left = options.left;
-        }
-        else if (options.right !== undefined) {
-            left = options.right - elDims.width; // derive the left value from the right value
-        }
-        else {
-            left = 0;
-        }
-        // constrain to the view port. if constrained by two edges, give precedence to top/left
-        top = Math.min(top, clippingRect.bottom - elDims.height - this.margin);
-        top = Math.max(top, clippingRect.top + this.margin);
-        left = Math.min(left, clippingRect.right - elDims.width - this.margin);
-        left = Math.max(left, clippingRect.left + this.margin);
-        applyStyle(el, {
-            top: top - origin.top,
-            left: left - origin.left
-        });
-    };
-    // Triggers a callback. Calls a function in the option hash of the same name.
-    // Arguments beyond the first `name` are forwarded on.
-    // TODO: better code reuse for this. Repeat code
-    // can kill this???
-    Popover.prototype.trigger = function (name) {
-        if (this.options[name]) {
-            this.options[name].apply(this, Array.prototype.slice.call(arguments, 1));
-        }
-    };
-    return Popover;
-}());
-
-/* Event-rendering methods for the DayGrid class
-----------------------------------------------------------------------------------------------------------------------*/
-// "Simple" is bad a name. has nothing to do with SimpleDayGrid
-var SimpleDayGridEventRenderer = /** @class */ (function (_super) {
-    __extends(SimpleDayGridEventRenderer, _super);
-    function SimpleDayGridEventRenderer() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    // Builds the HTML to be used for the default element for an individual segment
-    SimpleDayGridEventRenderer.prototype.renderSegHtml = function (seg, mirrorInfo) {
-        var _a = this.context, view = _a.view, options = _a.options;
-        var eventRange = seg.eventRange;
-        var eventDef = eventRange.def;
-        var eventUi = eventRange.ui;
-        var allDay = eventDef.allDay;
-        var isDraggable = view.computeEventDraggable(eventDef, eventUi);
-        var isResizableFromStart = allDay && seg.isStart && view.computeEventStartResizable(eventDef, eventUi);
-        var isResizableFromEnd = allDay && seg.isEnd && view.computeEventEndResizable(eventDef, eventUi);
-        var classes = this.getSegClasses(seg, isDraggable, isResizableFromStart || isResizableFromEnd, mirrorInfo);
-        var skinCss = cssToStr(this.getSkinCss(eventUi));
-        var timeHtml = '';
-        var timeText;
-        var titleHtml;
-        classes.unshift('fc-day-grid-event', 'fc-h-event');
-        // Only display a timed events time if it is the starting segment
-        if (seg.isStart) {
-            timeText = this.getTimeText(eventRange);
-            if (timeText) {
-                timeHtml = '<span class="fc-time">' + htmlEscape(timeText) + '</span>';
-            }
-        }
-        titleHtml =
-            '<span class="fc-title">' +
-                (htmlEscape(eventDef.title || '') || '&nbsp;') + // we always want one line of height
-                '</span>';
-        return '<a class="' + classes.join(' ') + '"' +
-            (eventDef.url ?
-                ' href="' + htmlEscape(eventDef.url) + '"' :
-                '') +
-            (skinCss ?
-                ' style="' + skinCss + '"' :
-                '') +
-            '>' +
-            '<div class="fc-content">' +
-            (options.dir === 'rtl' ?
-                titleHtml + ' ' + timeHtml : // put a natural space in between
-                timeHtml + ' ' + titleHtml //
-            ) +
-            '</div>' +
-            (isResizableFromStart ?
-                '<div class="fc-resizer fc-start-resizer"></div>' :
-                '') +
-            (isResizableFromEnd ?
-                '<div class="fc-resizer fc-end-resizer"></div>' :
-                '') +
-            '</a>';
-    };
-    // Computes a default event time formatting string if `eventTimeFormat` is not explicitly defined
-    SimpleDayGridEventRenderer.prototype.computeEventTimeFormat = function () {
-        return {
-            hour: 'numeric',
-            minute: '2-digit',
-            omitZeroMinute: true,
-            meridiem: 'narrow'
-        };
-    };
-    SimpleDayGridEventRenderer.prototype.computeDisplayEventEnd = function () {
-        return false; // TODO: somehow consider the originating DayGrid's column count
-    };
-    return SimpleDayGridEventRenderer;
-}(FgEventRenderer));
-
-/* Event-rendering methods for the DayGrid class
-----------------------------------------------------------------------------------------------------------------------*/
-var DayGridEventRenderer = /** @class */ (function (_super) {
-    __extends(DayGridEventRenderer, _super);
-    function DayGridEventRenderer(dayGrid) {
-        var _this = _super.call(this, dayGrid.context) || this;
-        _this.dayGrid = dayGrid;
-        return _this;
-    }
-    // Renders the given foreground event segments onto the grid
-    DayGridEventRenderer.prototype.attachSegs = function (segs, mirrorInfo) {
-        var rowStructs = this.rowStructs = this.renderSegRows(segs);
-        // append to each row's content skeleton
-        this.dayGrid.rowEls.forEach(function (rowNode, i) {
-            rowNode.querySelector('.fc-content-skeleton > table').appendChild(rowStructs[i].tbodyEl);
-        });
-        // removes the "more.." events popover
-        if (!mirrorInfo) {
-            this.dayGrid.removeSegPopover();
-        }
-    };
-    // Unrenders all currently rendered foreground event segments
-    DayGridEventRenderer.prototype.detachSegs = function () {
-        var rowStructs = this.rowStructs || [];
-        var rowStruct;
-        while ((rowStruct = rowStructs.pop())) {
-            removeElement(rowStruct.tbodyEl);
-        }
-        this.rowStructs = null;
-    };
-    // Uses the given events array to generate <tbody> elements that should be appended to each row's content skeleton.
-    // Returns an array of rowStruct objects (see the bottom of `renderSegRow`).
-    // PRECONDITION: each segment shoud already have a rendered and assigned `.el`
-    DayGridEventRenderer.prototype.renderSegRows = function (segs) {
-        var rowStructs = [];
-        var segRows;
-        var row;
-        segRows = this.groupSegRows(segs); // group into nested arrays
-        // iterate each row of segment groupings
-        for (row = 0; row < segRows.length; row++) {
-            rowStructs.push(this.renderSegRow(row, segRows[row]));
-        }
-        return rowStructs;
-    };
-    // Given a row # and an array of segments all in the same row, render a <tbody> element, a skeleton that contains
-    // the segments. Returns object with a bunch of internal data about how the render was calculated.
-    // NOTE: modifies rowSegs
-    DayGridEventRenderer.prototype.renderSegRow = function (row, rowSegs) {
-        var dayGrid = this.dayGrid;
-        var colCnt = dayGrid.colCnt, isRtl = dayGrid.isRtl;
-        var segLevels = this.buildSegLevels(rowSegs); // group into sub-arrays of levels
-        var levelCnt = Math.max(1, segLevels.length); // ensure at least one level
-        var tbody = document.createElement('tbody');
-        var segMatrix = []; // lookup for which segments are rendered into which level+col cells
-        var cellMatrix = []; // lookup for all <td> elements of the level+col matrix
-        var loneCellMatrix = []; // lookup for <td> elements that only take up a single column
-        var i;
-        var levelSegs;
-        var col;
-        var tr;
-        var j;
-        var seg;
-        var td;
-        // populates empty cells from the current column (`col`) to `endCol`
-        function emptyCellsUntil(endCol) {
-            while (col < endCol) {
-                // try to grab a cell from the level above and extend its rowspan. otherwise, create a fresh cell
-                td = (loneCellMatrix[i - 1] || [])[col];
-                if (td) {
-                    td.rowSpan = (td.rowSpan || 1) + 1;
-                }
-                else {
-                    td = document.createElement('td');
-                    tr.appendChild(td);
-                }
-                cellMatrix[i][col] = td;
-                loneCellMatrix[i][col] = td;
-                col++;
-            }
-        }
-        for (i = 0; i < levelCnt; i++) { // iterate through all levels
-            levelSegs = segLevels[i];
-            col = 0;
-            tr = document.createElement('tr');
-            segMatrix.push([]);
-            cellMatrix.push([]);
-            loneCellMatrix.push([]);
-            // levelCnt might be 1 even though there are no actual levels. protect against this.
-            // this single empty row is useful for styling.
-            if (levelSegs) {
-                for (j = 0; j < levelSegs.length; j++) { // iterate through segments in level
-                    seg = levelSegs[j];
-                    var leftCol = isRtl ? (colCnt - 1 - seg.lastCol) : seg.firstCol;
-                    var rightCol = isRtl ? (colCnt - 1 - seg.firstCol) : seg.lastCol;
-                    emptyCellsUntil(leftCol);
-                    // create a container that occupies or more columns. append the event element.
-                    td = createElement('td', { className: 'fc-event-container' }, seg.el);
-                    if (leftCol !== rightCol) {
-                        td.colSpan = rightCol - leftCol + 1;
-                    }
-                    else { // a single-column segment
-                        loneCellMatrix[i][col] = td;
-                    }
-                    while (col <= rightCol) {
-                        cellMatrix[i][col] = td;
-                        segMatrix[i][col] = seg;
-                        col++;
-                    }
-                    tr.appendChild(td);
-                }
-            }
-            emptyCellsUntil(colCnt); // finish off the row
-            var introHtml = dayGrid.renderProps.renderIntroHtml();
-            if (introHtml) {
-                if (dayGrid.isRtl) {
-                    appendToElement(tr, introHtml);
-                }
-                else {
-                    prependToElement(tr, introHtml);
-                }
-            }
-            tbody.appendChild(tr);
-        }
-        return {
-            row: row,
-            tbodyEl: tbody,
-            cellMatrix: cellMatrix,
-            segMatrix: segMatrix,
-            segLevels: segLevels,
-            segs: rowSegs
-        };
-    };
-    // Stacks a flat array of segments, which are all assumed to be in the same row, into subarrays of vertical levels.
-    // NOTE: modifies segs
-    DayGridEventRenderer.prototype.buildSegLevels = function (segs) {
-        var _a = this.dayGrid, isRtl = _a.isRtl, colCnt = _a.colCnt;
-        var levels = [];
-        var i;
-        var seg;
-        var j;
-        // Give preference to elements with certain criteria, so they have
-        // a chance to be closer to the top.
-        segs = this.sortEventSegs(segs);
-        for (i = 0; i < segs.length; i++) {
-            seg = segs[i];
-            // loop through levels, starting with the topmost, until the segment doesn't collide with other segments
-            for (j = 0; j < levels.length; j++) {
-                if (!isDaySegCollision(seg, levels[j])) {
-                    break;
-                }
-            }
-            // `j` now holds the desired subrow index
-            seg.level = j;
-            seg.leftCol = isRtl ? (colCnt - 1 - seg.lastCol) : seg.firstCol; // for sorting only
-            seg.rightCol = isRtl ? (colCnt - 1 - seg.firstCol) : seg.lastCol // for sorting only
-            ;
-            (levels[j] || (levels[j] = [])).push(seg);
-        }
-        // order segments left-to-right. very important if calendar is RTL
-        for (j = 0; j < levels.length; j++) {
-            levels[j].sort(compareDaySegCols);
-        }
-        return levels;
-    };
-    // Given a flat array of segments, return an array of sub-arrays, grouped by each segment's row
-    DayGridEventRenderer.prototype.groupSegRows = function (segs) {
-        var segRows = [];
-        var i;
-        for (i = 0; i < this.dayGrid.rowCnt; i++) {
-            segRows.push([]);
-        }
-        for (i = 0; i < segs.length; i++) {
-            segRows[segs[i].row].push(segs[i]);
-        }
-        return segRows;
-    };
-    // Computes a default `displayEventEnd` value if one is not expliclty defined
-    DayGridEventRenderer.prototype.computeDisplayEventEnd = function () {
-        return this.dayGrid.colCnt === 1; // we'll likely have space if there's only one day
-    };
-    return DayGridEventRenderer;
-}(SimpleDayGridEventRenderer));
-// Computes whether two segments' columns collide. They are assumed to be in the same row.
-function isDaySegCollision(seg, otherSegs) {
-    var i;
-    var otherSeg;
-    for (i = 0; i < otherSegs.length; i++) {
-        otherSeg = otherSegs[i];
-        if (otherSeg.firstCol <= seg.lastCol &&
-            otherSeg.lastCol >= seg.firstCol) {
-            return true;
-        }
-    }
-    return false;
-}
-// A cmp function for determining the leftmost event
-function compareDaySegCols(a, b) {
-    return a.leftCol - b.leftCol;
-}
-
-var DayGridMirrorRenderer = /** @class */ (function (_super) {
-    __extends(DayGridMirrorRenderer, _super);
-    function DayGridMirrorRenderer() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    DayGridMirrorRenderer.prototype.attachSegs = function (segs, mirrorInfo) {
-        var sourceSeg = mirrorInfo.sourceSeg;
-        var rowStructs = this.rowStructs = this.renderSegRows(segs);
-        // inject each new event skeleton into each associated row
-        this.dayGrid.rowEls.forEach(function (rowNode, row) {
-            var skeletonEl = htmlToElement('<div class="fc-mirror-skeleton"><table></table></div>'); // will be absolutely positioned
-            var skeletonTopEl;
-            var skeletonTop;
-            // If there is an original segment, match the top position. Otherwise, put it at the row's top level
-            if (sourceSeg && sourceSeg.row === row) {
-                skeletonTopEl = sourceSeg.el;
-            }
-            else {
-                skeletonTopEl = rowNode.querySelector('.fc-content-skeleton tbody');
-                if (!skeletonTopEl) { // when no events
-                    skeletonTopEl = rowNode.querySelector('.fc-content-skeleton table');
-                }
-            }
-            skeletonTop = skeletonTopEl.getBoundingClientRect().top -
-                rowNode.getBoundingClientRect().top; // the offsetParent origin
-            skeletonEl.style.top = skeletonTop + 'px';
-            skeletonEl.querySelector('table').appendChild(rowStructs[row].tbodyEl);
-            rowNode.appendChild(skeletonEl);
-        });
-    };
-    return DayGridMirrorRenderer;
-}(DayGridEventRenderer));
-
-var EMPTY_CELL_HTML = '<td style="pointer-events:none"></td>';
-var DayGridFillRenderer = /** @class */ (function (_super) {
-    __extends(DayGridFillRenderer, _super);
-    function DayGridFillRenderer(dayGrid) {
-        var _this = _super.call(this, dayGrid.context) || this;
-        _this.fillSegTag = 'td'; // override the default tag name
-        _this.dayGrid = dayGrid;
-        return _this;
-    }
-    DayGridFillRenderer.prototype.renderSegs = function (type, segs) {
-        // don't render timed background events
-        if (type === 'bgEvent') {
-            segs = segs.filter(function (seg) {
-                return seg.eventRange.def.allDay;
-            });
-        }
-        _super.prototype.renderSegs.call(this, type, segs);
-    };
-    DayGridFillRenderer.prototype.attachSegs = function (type, segs) {
-        var els = [];
-        var i;
-        var seg;
-        var skeletonEl;
-        for (i = 0; i < segs.length; i++) {
-            seg = segs[i];
-            skeletonEl = this.renderFillRow(type, seg);
-            this.dayGrid.rowEls[seg.row].appendChild(skeletonEl);
-            els.push(skeletonEl);
-        }
-        return els;
-    };
-    // Generates the HTML needed for one row of a fill. Requires the seg's el to be rendered.
-    DayGridFillRenderer.prototype.renderFillRow = function (type, seg) {
-        var dayGrid = this.dayGrid;
-        var colCnt = dayGrid.colCnt, isRtl = dayGrid.isRtl;
-        var leftCol = isRtl ? (colCnt - 1 - seg.lastCol) : seg.firstCol;
-        var rightCol = isRtl ? (colCnt - 1 - seg.firstCol) : seg.lastCol;
-        var startCol = leftCol;
-        var endCol = rightCol + 1;
-        var className;
-        var skeletonEl;
-        var trEl;
-        if (type === 'businessHours') {
-            className = 'bgevent';
-        }
-        else {
-            className = type.toLowerCase();
-        }
-        skeletonEl = htmlToElement('<div class="fc-' + className + '-skeleton">' +
-            '<table><tr></tr></table>' +
-            '</div>');
-        trEl = skeletonEl.getElementsByTagName('tr')[0];
-        if (startCol > 0) {
-            appendToElement(trEl, 
-            // will create (startCol + 1) td's
-            new Array(startCol + 1).join(EMPTY_CELL_HTML));
-        }
-        seg.el.colSpan = endCol - startCol;
-        trEl.appendChild(seg.el);
-        if (endCol < colCnt) {
-            appendToElement(trEl, 
-            // will create (colCnt - endCol) td's
-            new Array(colCnt - endCol + 1).join(EMPTY_CELL_HTML));
-        }
-        var introHtml = dayGrid.renderProps.renderIntroHtml();
-        if (introHtml) {
-            if (dayGrid.isRtl) {
-                appendToElement(trEl, introHtml);
-            }
-            else {
-                prependToElement(trEl, introHtml);
-            }
-        }
-        return skeletonEl;
-    };
-    return DayGridFillRenderer;
-}(FillRenderer));
-
-var DayTile = /** @class */ (function (_super) {
-    __extends(DayTile, _super);
-    function DayTile(context, el) {
-        var _this = _super.call(this, context, el) || this;
-        var eventRenderer = _this.eventRenderer = new DayTileEventRenderer(_this);
-        var renderFrame = _this.renderFrame = memoizeRendering(_this._renderFrame);
-        _this.renderFgEvents = memoizeRendering(eventRenderer.renderSegs.bind(eventRenderer), eventRenderer.unrender.bind(eventRenderer), [renderFrame]);
-        _this.renderEventSelection = memoizeRendering(eventRenderer.selectByInstanceId.bind(eventRenderer), eventRenderer.unselectByInstanceId.bind(eventRenderer), [_this.renderFgEvents]);
-        _this.renderEventDrag = memoizeRendering(eventRenderer.hideByHash.bind(eventRenderer), eventRenderer.showByHash.bind(eventRenderer), [renderFrame]);
-        _this.renderEventResize = memoizeRendering(eventRenderer.hideByHash.bind(eventRenderer), eventRenderer.showByHash.bind(eventRenderer), [renderFrame]);
-        context.calendar.registerInteractiveComponent(_this, {
-            el: _this.el,
-            useEventCenter: false
-        });
-        return _this;
-    }
-    DayTile.prototype.render = function (props) {
-        this.renderFrame(props.date);
-        this.renderFgEvents(props.fgSegs);
-        this.renderEventSelection(props.eventSelection);
-        this.renderEventDrag(props.eventDragInstances);
-        this.renderEventResize(props.eventResizeInstances);
-    };
-    DayTile.prototype.destroy = function () {
-        _super.prototype.destroy.call(this);
-        this.renderFrame.unrender(); // should unrender everything else
-        this.calendar.unregisterInteractiveComponent(this);
-    };
-    DayTile.prototype._renderFrame = function (date) {
-        var _a = this, theme = _a.theme, dateEnv = _a.dateEnv;
-        var title = dateEnv.format(date, createFormatter(this.opt('dayPopoverFormat')) // TODO: cache
-        );
-        this.el.innerHTML =
-            '<div class="fc-header ' + theme.getClass('popoverHeader') + '">' +
-                '<span class="fc-title">' +
-                htmlEscape(title) +
-                '</span>' +
-                '<span class="fc-close ' + theme.getIconClass('close') + '"></span>' +
-                '</div>' +
-                '<div class="fc-body ' + theme.getClass('popoverContent') + '">' +
-                '<div class="fc-event-container"></div>' +
-                '</div>';
-        this.segContainerEl = this.el.querySelector('.fc-event-container');
-    };
-    DayTile.prototype.queryHit = function (positionLeft, positionTop, elWidth, elHeight) {
-        var date = this.props.date; // HACK
-        if (positionLeft < elWidth && positionTop < elHeight) {
-            return {
-                component: this,
-                dateSpan: {
-                    allDay: true,
-                    range: { start: date, end: addDays(date, 1) }
-                },
-                dayEl: this.el,
-                rect: {
-                    left: 0,
-                    top: 0,
-                    right: elWidth,
-                    bottom: elHeight
-                },
-                layer: 1
-            };
-        }
-    };
-    return DayTile;
-}(DateComponent));
-var DayTileEventRenderer = /** @class */ (function (_super) {
-    __extends(DayTileEventRenderer, _super);
-    function DayTileEventRenderer(dayTile) {
-        var _this = _super.call(this, dayTile.context) || this;
-        _this.dayTile = dayTile;
-        return _this;
-    }
-    DayTileEventRenderer.prototype.attachSegs = function (segs) {
-        for (var _i = 0, segs_1 = segs; _i < segs_1.length; _i++) {
-            var seg = segs_1[_i];
-            this.dayTile.segContainerEl.appendChild(seg.el);
-        }
-    };
-    DayTileEventRenderer.prototype.detachSegs = function (segs) {
-        for (var _i = 0, segs_2 = segs; _i < segs_2.length; _i++) {
-            var seg = segs_2[_i];
-            removeElement(seg.el);
-        }
-    };
-    return DayTileEventRenderer;
-}(SimpleDayGridEventRenderer));
-
-var DayBgRow = /** @class */ (function () {
-    function DayBgRow(context) {
-        this.context = context;
-    }
-    DayBgRow.prototype.renderHtml = function (props) {
-        var parts = [];
-        if (props.renderIntroHtml) {
-            parts.push(props.renderIntroHtml());
-        }
-        for (var _i = 0, _a = props.cells; _i < _a.length; _i++) {
-            var cell = _a[_i];
-            parts.push(renderCellHtml(cell.date, props.dateProfile, this.context, cell.htmlAttrs));
-        }
-        if (!props.cells.length) {
-            parts.push('<td class="fc-day ' + this.context.theme.getClass('widgetContent') + '"></td>');
-        }
-        if (this.context.options.dir === 'rtl') {
-            parts.reverse();
-        }
-        return '<tr>' + parts.join('') + '</tr>';
-    };
-    return DayBgRow;
-}());
-function renderCellHtml(date, dateProfile, context, otherAttrs) {
-    var dateEnv = context.dateEnv, theme = context.theme;
-    var isDateValid = rangeContainsMarker(dateProfile.activeRange, date); // TODO: called too frequently. cache somehow.
-    var classes = getDayClasses(date, dateProfile, context);
-    classes.unshift('fc-day', theme.getClass('widgetContent'));
-    return '<td class="' + classes.join(' ') + '"' +
-        (isDateValid ?
-            ' data-date="' + dateEnv.formatIso(date, { omitTime: true }) + '"' :
-            '') +
-        (otherAttrs ?
-            ' ' + otherAttrs :
-            '') +
-        '></td>';
-}
-
-var DAY_NUM_FORMAT = createFormatter({ day: 'numeric' });
-var WEEK_NUM_FORMAT = createFormatter({ week: 'numeric' });
-var DayGrid = /** @class */ (function (_super) {
-    __extends(DayGrid, _super);
-    function DayGrid(context, el, renderProps) {
-        var _this = _super.call(this, context, el) || this;
-        _this.bottomCoordPadding = 0; // hack for extending the hit area for the last row of the coordinate grid
-        _this.isCellSizesDirty = false;
-        var eventRenderer = _this.eventRenderer = new DayGridEventRenderer(_this);
-        var fillRenderer = _this.fillRenderer = new DayGridFillRenderer(_this);
-        _this.mirrorRenderer = new DayGridMirrorRenderer(_this);
-        var renderCells = _this.renderCells = memoizeRendering(_this._renderCells, _this._unrenderCells);
-        _this.renderBusinessHours = memoizeRendering(fillRenderer.renderSegs.bind(fillRenderer, 'businessHours'), fillRenderer.unrender.bind(fillRenderer, 'businessHours'), [renderCells]);
-        _this.renderDateSelection = memoizeRendering(fillRenderer.renderSegs.bind(fillRenderer, 'highlight'), fillRenderer.unrender.bind(fillRenderer, 'highlight'), [renderCells]);
-        _this.renderBgEvents = memoizeRendering(fillRenderer.renderSegs.bind(fillRenderer, 'bgEvent'), fillRenderer.unrender.bind(fillRenderer, 'bgEvent'), [renderCells]);
-        _this.renderFgEvents = memoizeRendering(eventRenderer.renderSegs.bind(eventRenderer), eventRenderer.unrender.bind(eventRenderer), [renderCells]);
-        _this.renderEventSelection = memoizeRendering(eventRenderer.selectByInstanceId.bind(eventRenderer), eventRenderer.unselectByInstanceId.bind(eventRenderer), [_this.renderFgEvents]);
-        _this.renderEventDrag = memoizeRendering(_this._renderEventDrag, _this._unrenderEventDrag, [renderCells]);
-        _this.renderEventResize = memoizeRendering(_this._renderEventResize, _this._unrenderEventResize, [renderCells]);
-        _this.renderProps = renderProps;
-        return _this;
-    }
-    DayGrid.prototype.render = function (props) {
-        var cells = props.cells;
-        this.rowCnt = cells.length;
-        this.colCnt = cells[0].length;
-        this.renderCells(cells, props.isRigid);
-        this.renderBusinessHours(props.businessHourSegs);
-        this.renderDateSelection(props.dateSelectionSegs);
-        this.renderBgEvents(props.bgEventSegs);
-        this.renderFgEvents(props.fgEventSegs);
-        this.renderEventSelection(props.eventSelection);
-        this.renderEventDrag(props.eventDrag);
-        this.renderEventResize(props.eventResize);
-        if (this.segPopoverTile) {
-            this.updateSegPopoverTile();
-        }
-    };
-    DayGrid.prototype.destroy = function () {
-        _super.prototype.destroy.call(this);
-        this.renderCells.unrender(); // will unrender everything else
-    };
-    DayGrid.prototype.getCellRange = function (row, col) {
-        var start = this.props.cells[row][col].date;
-        var end = addDays(start, 1);
-        return { start: start, end: end };
-    };
-    DayGrid.prototype.updateSegPopoverTile = function (date, segs) {
-        var ownProps = this.props;
-        this.segPopoverTile.receiveProps({
-            date: date || this.segPopoverTile.props.date,
-            fgSegs: segs || this.segPopoverTile.props.fgSegs,
-            eventSelection: ownProps.eventSelection,
-            eventDragInstances: ownProps.eventDrag ? ownProps.eventDrag.affectedInstances : null,
-            eventResizeInstances: ownProps.eventResize ? ownProps.eventResize.affectedInstances : null
-        });
-    };
-    /* Date Rendering
-    ------------------------------------------------------------------------------------------------------------------*/
-    DayGrid.prototype._renderCells = function (cells, isRigid) {
-        var _a = this, view = _a.view, dateEnv = _a.dateEnv;
-        var _b = this, rowCnt = _b.rowCnt, colCnt = _b.colCnt;
-        var html = '';
-        var row;
-        var col;
-        for (row = 0; row < rowCnt; row++) {
-            html += this.renderDayRowHtml(row, isRigid);
-        }
-        this.el.innerHTML = html;
-        this.rowEls = findElements(this.el, '.fc-row');
-        this.cellEls = findElements(this.el, '.fc-day, .fc-disabled-day');
-        if (this.isRtl) {
-            this.cellEls.reverse();
-        }
-        this.rowPositions = new PositionCache(this.el, this.rowEls, false, true // vertical
-        );
-        this.colPositions = new PositionCache(this.el, this.cellEls.slice(0, colCnt), // only the first row
-        true, false // horizontal
-        );
-        // trigger dayRender with each cell's element
-        for (row = 0; row < rowCnt; row++) {
-            for (col = 0; col < colCnt; col++) {
-                this.publiclyTrigger('dayRender', [
-                    {
-                        date: dateEnv.toDate(cells[row][col].date),
-                        el: this.getCellEl(row, col),
-                        view: view
-                    }
-                ]);
-            }
-        }
-        this.isCellSizesDirty = true;
-    };
-    DayGrid.prototype._unrenderCells = function () {
-        this.removeSegPopover();
-    };
-    // Generates the HTML for a single row, which is a div that wraps a table.
-    // `row` is the row number.
-    DayGrid.prototype.renderDayRowHtml = function (row, isRigid) {
-        var theme = this.theme;
-        var classes = ['fc-row', 'fc-week', theme.getClass('dayRow')];
-        if (isRigid) {
-            classes.push('fc-rigid');
-        }
-        var bgRow = new DayBgRow(this.context);
-        return '' +
-            '<div class="' + classes.join(' ') + '">' +
-            '<div class="fc-bg">' +
-            '<table class="' + theme.getClass('tableGrid') + '">' +
-            bgRow.renderHtml({
-                cells: this.props.cells[row],
-                dateProfile: this.props.dateProfile,
-                renderIntroHtml: this.renderProps.renderBgIntroHtml
-            }) +
-            '</table>' +
-            '</div>' +
-            '<div class="fc-content-skeleton">' +
-            '<table>' +
-            (this.getIsNumbersVisible() ?
-                '<thead>' +
-                    this.renderNumberTrHtml(row) +
-                    '</thead>' :
-                '') +
-            '</table>' +
-            '</div>' +
-            '</div>';
-    };
-    DayGrid.prototype.getIsNumbersVisible = function () {
-        return this.getIsDayNumbersVisible() ||
-            this.renderProps.cellWeekNumbersVisible ||
-            this.renderProps.colWeekNumbersVisible;
-    };
-    DayGrid.prototype.getIsDayNumbersVisible = function () {
-        return this.rowCnt > 1;
-    };
-    /* Grid Number Rendering
-    ------------------------------------------------------------------------------------------------------------------*/
-    DayGrid.prototype.renderNumberTrHtml = function (row) {
-        var intro = this.renderProps.renderNumberIntroHtml(row, this);
-        return '' +
-            '<tr>' +
-            (this.isRtl ? '' : intro) +
-            this.renderNumberCellsHtml(row) +
-            (this.isRtl ? intro : '') +
-            '</tr>';
-    };
-    DayGrid.prototype.renderNumberCellsHtml = function (row) {
-        var htmls = [];
-        var col;
-        var date;
-        for (col = 0; col < this.colCnt; col++) {
-            date = this.props.cells[row][col].date;
-            htmls.push(this.renderNumberCellHtml(date));
-        }
-        if (this.isRtl) {
-            htmls.reverse();
-        }
-        return htmls.join('');
-    };
-    // Generates the HTML for the <td>s of the "number" row in the DayGrid's content skeleton.
-    // The number row will only exist if either day numbers or week numbers are turned on.
-    DayGrid.prototype.renderNumberCellHtml = function (date) {
-        var _a = this, view = _a.view, dateEnv = _a.dateEnv;
-        var html = '';
-        var isDateValid = rangeContainsMarker(this.props.dateProfile.activeRange, date); // TODO: called too frequently. cache somehow.
-        var isDayNumberVisible = this.getIsDayNumbersVisible() && isDateValid;
-        var classes;
-        var weekCalcFirstDow;
-        if (!isDayNumberVisible && !this.renderProps.cellWeekNumbersVisible) {
-            // no numbers in day cell (week number must be along the side)
-            return '<td></td>'; //  will create an empty space above events :(
-        }
-        classes = getDayClasses(date, this.props.dateProfile, this.context);
-        classes.unshift('fc-day-top');
-        if (this.renderProps.cellWeekNumbersVisible) {
-            weekCalcFirstDow = dateEnv.weekDow;
-        }
-        html += '<td class="' + classes.join(' ') + '"' +
-            (isDateValid ?
-                ' data-date="' + dateEnv.formatIso(date, { omitTime: true }) + '"' :
-                '') +
-            '>';
-        if (this.renderProps.cellWeekNumbersVisible && (date.getUTCDay() === weekCalcFirstDow)) {
-            html += buildGotoAnchorHtml(view, { date: date, type: 'week' }, { 'class': 'fc-week-number' }, dateEnv.format(date, WEEK_NUM_FORMAT) // inner HTML
-            );
-        }
-        if (isDayNumberVisible) {
-            html += buildGotoAnchorHtml(view, date, { 'class': 'fc-day-number' }, dateEnv.format(date, DAY_NUM_FORMAT) // inner HTML
-            );
-        }
-        html += '</td>';
-        return html;
-    };
-    /* Sizing
-    ------------------------------------------------------------------------------------------------------------------*/
-    DayGrid.prototype.updateSize = function (isResize) {
-        var _a = this, fillRenderer = _a.fillRenderer, eventRenderer = _a.eventRenderer, mirrorRenderer = _a.mirrorRenderer;
-        if (isResize ||
-            this.isCellSizesDirty ||
-            this.view.calendar.isEventsUpdated // hack
-        ) {
-            this.buildPositionCaches();
-            this.isCellSizesDirty = false;
-        }
-        fillRenderer.computeSizes(isResize);
-        eventRenderer.computeSizes(isResize);
-        mirrorRenderer.computeSizes(isResize);
-        fillRenderer.assignSizes(isResize);
-        eventRenderer.assignSizes(isResize);
-        mirrorRenderer.assignSizes(isResize);
-    };
-    DayGrid.prototype.buildPositionCaches = function () {
-        this.buildColPositions();
-        this.buildRowPositions();
-    };
-    DayGrid.prototype.buildColPositions = function () {
-        this.colPositions.build();
-    };
-    DayGrid.prototype.buildRowPositions = function () {
-        this.rowPositions.build();
-        this.rowPositions.bottoms[this.rowCnt - 1] += this.bottomCoordPadding; // hack
-    };
-    /* Hit System
-    ------------------------------------------------------------------------------------------------------------------*/
-    DayGrid.prototype.positionToHit = function (leftPosition, topPosition) {
-        var _a = this, colPositions = _a.colPositions, rowPositions = _a.rowPositions;
-        var col = colPositions.leftToIndex(leftPosition);
-        var row = rowPositions.topToIndex(topPosition);
-        if (row != null && col != null) {
-            return {
-                row: row,
-                col: col,
-                dateSpan: {
-                    range: this.getCellRange(row, col),
-                    allDay: true
-                },
-                dayEl: this.getCellEl(row, col),
-                relativeRect: {
-                    left: colPositions.lefts[col],
-                    right: colPositions.rights[col],
-                    top: rowPositions.tops[row],
-                    bottom: rowPositions.bottoms[row]
-                }
-            };
-        }
-    };
-    /* Cell System
-    ------------------------------------------------------------------------------------------------------------------*/
-    // FYI: the first column is the leftmost column, regardless of date
-    DayGrid.prototype.getCellEl = function (row, col) {
-        return this.cellEls[row * this.colCnt + col];
-    };
-    /* Event Drag Visualization
-    ------------------------------------------------------------------------------------------------------------------*/
-    DayGrid.prototype._renderEventDrag = function (state) {
-        if (state) {
-            this.eventRenderer.hideByHash(state.affectedInstances);
-            this.fillRenderer.renderSegs('highlight', state.segs);
-        }
-    };
-    DayGrid.prototype._unrenderEventDrag = function (state) {
-        if (state) {
-            this.eventRenderer.showByHash(state.affectedInstances);
-            this.fillRenderer.unrender('highlight');
-        }
-    };
-    /* Event Resize Visualization
-    ------------------------------------------------------------------------------------------------------------------*/
-    DayGrid.prototype._renderEventResize = function (state) {
-        if (state) {
-            this.eventRenderer.hideByHash(state.affectedInstances);
-            this.fillRenderer.renderSegs('highlight', state.segs);
-            this.mirrorRenderer.renderSegs(state.segs, { isResizing: true, sourceSeg: state.sourceSeg });
-        }
-    };
-    DayGrid.prototype._unrenderEventResize = function (state) {
-        if (state) {
-            this.eventRenderer.showByHash(state.affectedInstances);
-            this.fillRenderer.unrender('highlight');
-            this.mirrorRenderer.unrender(state.segs, { isResizing: true, sourceSeg: state.sourceSeg });
-        }
-    };
-    /* More+ Link Popover
-    ------------------------------------------------------------------------------------------------------------------*/
-    DayGrid.prototype.removeSegPopover = function () {
-        if (this.segPopover) {
-            this.segPopover.hide(); // in handler, will call segPopover's removeElement
-        }
-    };
-    // Limits the number of "levels" (vertically stacking layers of events) for each row of the grid.
-    // `levelLimit` can be false (don't limit), a number, or true (should be computed).
-    DayGrid.prototype.limitRows = function (levelLimit) {
-        var rowStructs = this.eventRenderer.rowStructs || [];
-        var row; // row #
-        var rowLevelLimit;
-        for (row = 0; row < rowStructs.length; row++) {
-            this.unlimitRow(row);
-            if (!levelLimit) {
-                rowLevelLimit = false;
-            }
-            else if (typeof levelLimit === 'number') {
-                rowLevelLimit = levelLimit;
-            }
-            else {
-                rowLevelLimit = this.computeRowLevelLimit(row);
-            }
-            if (rowLevelLimit !== false) {
-                this.limitRow(row, rowLevelLimit);
-            }
-        }
-    };
-    // Computes the number of levels a row will accomodate without going outside its bounds.
-    // Assumes the row is "rigid" (maintains a constant height regardless of what is inside).
-    // `row` is the row number.
-    DayGrid.prototype.computeRowLevelLimit = function (row) {
-        var rowEl = this.rowEls[row]; // the containing "fake" row div
-        var rowBottom = rowEl.getBoundingClientRect().bottom; // relative to viewport!
-        var trEls = findChildren(this.eventRenderer.rowStructs[row].tbodyEl);
-        var i;
-        var trEl;
-        // Reveal one level <tr> at a time and stop when we find one out of bounds
-        for (i = 0; i < trEls.length; i++) {
-            trEl = trEls[i];
-            trEl.classList.remove('fc-limited'); // reset to original state (reveal)
-            if (trEl.getBoundingClientRect().bottom > rowBottom) {
-                return i;
-            }
-        }
-        return false; // should not limit at all
-    };
-    // Limits the given grid row to the maximum number of levels and injects "more" links if necessary.
-    // `row` is the row number.
-    // `levelLimit` is a number for the maximum (inclusive) number of levels allowed.
-    DayGrid.prototype.limitRow = function (row, levelLimit) {
-        var _this = this;
-        var _a = this, colCnt = _a.colCnt, isRtl = _a.isRtl;
-        var rowStruct = this.eventRenderer.rowStructs[row];
-        var moreNodes = []; // array of "more" <a> links and <td> DOM nodes
-        var col = 0; // col #, left-to-right (not chronologically)
-        var levelSegs; // array of segment objects in the last allowable level, ordered left-to-right
-        var cellMatrix; // a matrix (by level, then column) of all <td> elements in the row
-        var limitedNodes; // array of temporarily hidden level <tr> and segment <td> DOM nodes
-        var i;
-        var seg;
-        var segsBelow; // array of segment objects below `seg` in the current `col`
-        var totalSegsBelow; // total number of segments below `seg` in any of the columns `seg` occupies
-        var colSegsBelow; // array of segment arrays, below seg, one for each column (offset from segs's first column)
-        var td;
-        var rowSpan;
-        var segMoreNodes; // array of "more" <td> cells that will stand-in for the current seg's cell
-        var j;
-        var moreTd;
-        var moreWrap;
-        var moreLink;
-        // Iterates through empty level cells and places "more" links inside if need be
-        var emptyCellsUntil = function (endCol) {
-            while (col < endCol) {
-                segsBelow = _this.getCellSegs(row, col, levelLimit);
-                if (segsBelow.length) {
-                    td = cellMatrix[levelLimit - 1][col];
-                    moreLink = _this.renderMoreLink(row, col, segsBelow);
-                    moreWrap = createElement('div', null, moreLink);
-                    td.appendChild(moreWrap);
-                    moreNodes.push(moreWrap);
-                }
-                col++;
-            }
-        };
-        if (levelLimit && levelLimit < rowStruct.segLevels.length) { // is it actually over the limit?
-            levelSegs = rowStruct.segLevels[levelLimit - 1];
-            cellMatrix = rowStruct.cellMatrix;
-            limitedNodes = findChildren(rowStruct.tbodyEl).slice(levelLimit); // get level <tr> elements past the limit
-            limitedNodes.forEach(function (node) {
-                node.classList.add('fc-limited'); // hide elements and get a simple DOM-nodes array
-            });
-            // iterate though segments in the last allowable level
-            for (i = 0; i < levelSegs.length; i++) {
-                seg = levelSegs[i];
-                var leftCol = isRtl ? (colCnt - 1 - seg.lastCol) : seg.firstCol;
-                var rightCol = isRtl ? (colCnt - 1 - seg.firstCol) : seg.lastCol;
-                emptyCellsUntil(leftCol); // process empty cells before the segment
-                // determine *all* segments below `seg` that occupy the same columns
-                colSegsBelow = [];
-                totalSegsBelow = 0;
-                while (col <= rightCol) {
-                    segsBelow = this.getCellSegs(row, col, levelLimit);
-                    colSegsBelow.push(segsBelow);
-                    totalSegsBelow += segsBelow.length;
-                    col++;
-                }
-                if (totalSegsBelow) { // do we need to replace this segment with one or many "more" links?
-                    td = cellMatrix[levelLimit - 1][leftCol]; // the segment's parent cell
-                    rowSpan = td.rowSpan || 1;
-                    segMoreNodes = [];
-                    // make a replacement <td> for each column the segment occupies. will be one for each colspan
-                    for (j = 0; j < colSegsBelow.length; j++) {
-                        moreTd = createElement('td', { className: 'fc-more-cell', rowSpan: rowSpan });
-                        segsBelow = colSegsBelow[j];
-                        moreLink = this.renderMoreLink(row, leftCol + j, [seg].concat(segsBelow) // count seg as hidden too
-                        );
-                        moreWrap = createElement('div', null, moreLink);
-                        moreTd.appendChild(moreWrap);
-                        segMoreNodes.push(moreTd);
-                        moreNodes.push(moreTd);
-                    }
-                    td.classList.add('fc-limited');
-                    insertAfterElement(td, segMoreNodes);
-                    limitedNodes.push(td);
-                }
-            }
-            emptyCellsUntil(this.colCnt); // finish off the level
-            rowStruct.moreEls = moreNodes; // for easy undoing later
-            rowStruct.limitedEls = limitedNodes; // for easy undoing later
-        }
-    };
-    // Reveals all levels and removes all "more"-related elements for a grid's row.
-    // `row` is a row number.
-    DayGrid.prototype.unlimitRow = function (row) {
-        var rowStruct = this.eventRenderer.rowStructs[row];
-        if (rowStruct.moreEls) {
-            rowStruct.moreEls.forEach(removeElement);
-            rowStruct.moreEls = null;
-        }
-        if (rowStruct.limitedEls) {
-            rowStruct.limitedEls.forEach(function (limitedEl) {
-                limitedEl.classList.remove('fc-limited');
-            });
-            rowStruct.limitedEls = null;
-        }
-    };
-    // Renders an <a> element that represents hidden event element for a cell.
-    // Responsible for attaching click handler as well.
-    DayGrid.prototype.renderMoreLink = function (row, col, hiddenSegs) {
-        var _this = this;
-        var _a = this, view = _a.view, dateEnv = _a.dateEnv;
-        var a = createElement('a', { className: 'fc-more' });
-        a.innerText = this.getMoreLinkText(hiddenSegs.length);
-        a.addEventListener('click', function (ev) {
-            var clickOption = _this.opt('eventLimitClick');
-            var _col = _this.isRtl ? _this.colCnt - col - 1 : col; // HACK: props.cells has different dir system?
-            var date = _this.props.cells[row][_col].date;
-            var moreEl = ev.currentTarget;
-            var dayEl = _this.getCellEl(row, col);
-            var allSegs = _this.getCellSegs(row, col);
-            // rescope the segments to be within the cell's date
-            var reslicedAllSegs = _this.resliceDaySegs(allSegs, date);
-            var reslicedHiddenSegs = _this.resliceDaySegs(hiddenSegs, date);
-            if (typeof clickOption === 'function') {
-                // the returned value can be an atomic option
-                clickOption = _this.publiclyTrigger('eventLimitClick', [
-                    {
-                        date: dateEnv.toDate(date),
-                        allDay: true,
-                        dayEl: dayEl,
-                        moreEl: moreEl,
-                        segs: reslicedAllSegs,
-                        hiddenSegs: reslicedHiddenSegs,
-                        jsEvent: ev,
-                        view: view
-                    }
-                ]);
-            }
-            if (clickOption === 'popover') {
-                _this.showSegPopover(row, col, moreEl, reslicedAllSegs);
-            }
-            else if (typeof clickOption === 'string') { // a view name
-                view.calendar.zoomTo(date, clickOption);
-            }
-        });
-        return a;
-    };
-    // Reveals the popover that displays all events within a cell
-    DayGrid.prototype.showSegPopover = function (row, col, moreLink, segs) {
-        var _this = this;
-        var _a = this, calendar = _a.calendar, view = _a.view, theme = _a.theme;
-        var _col = this.isRtl ? this.colCnt - col - 1 : col; // HACK: props.cells has different dir system?
-        var moreWrap = moreLink.parentNode; // the <div> wrapper around the <a>
-        var topEl; // the element we want to match the top coordinate of
-        var options;
-        if (this.rowCnt === 1) {
-            topEl = view.el; // will cause the popover to cover any sort of header
-        }
-        else {
-            topEl = this.rowEls[row]; // will align with top of row
-        }
-        options = {
-            className: 'fc-more-popover ' + theme.getClass('popover'),
-            parentEl: view.el,
-            top: computeRect(topEl).top,
-            autoHide: true,
-            content: function (el) {
-                _this.segPopoverTile = new DayTile(_this.context, el);
-                _this.updateSegPopoverTile(_this.props.cells[row][_col].date, segs);
-            },
-            hide: function () {
-                _this.segPopoverTile.destroy();
-                _this.segPopoverTile = null;
-                _this.segPopover.destroy();
-                _this.segPopover = null;
-            }
-        };
-        // Determine horizontal coordinate.
-        // We use the moreWrap instead of the <td> to avoid border confusion.
-        if (this.isRtl) {
-            options.right = computeRect(moreWrap).right + 1; // +1 to be over cell border
-        }
-        else {
-            options.left = computeRect(moreWrap).left - 1; // -1 to be over cell border
-        }
-        this.segPopover = new Popover(options);
-        this.segPopover.show();
-        calendar.releaseAfterSizingTriggers(); // hack for eventPositioned
-    };
-    // Given the events within an array of segment objects, reslice them to be in a single day
-    DayGrid.prototype.resliceDaySegs = function (segs, dayDate) {
-        var dayStart = dayDate;
-        var dayEnd = addDays(dayStart, 1);
-        var dayRange = { start: dayStart, end: dayEnd };
-        var newSegs = [];
-        for (var _i = 0, segs_1 = segs; _i < segs_1.length; _i++) {
-            var seg = segs_1[_i];
-            var eventRange = seg.eventRange;
-            var origRange = eventRange.range;
-            var slicedRange = intersectRanges(origRange, dayRange);
-            if (slicedRange) {
-                newSegs.push(__assign({}, seg, { eventRange: {
-                        def: eventRange.def,
-                        ui: __assign({}, eventRange.ui, { durationEditable: false }),
-                        instance: eventRange.instance,
-                        range: slicedRange
-                    }, isStart: seg.isStart && slicedRange.start.valueOf() === origRange.start.valueOf(), isEnd: seg.isEnd && slicedRange.end.valueOf() === origRange.end.valueOf() }));
-            }
-        }
-        return newSegs;
-    };
-    // Generates the text that should be inside a "more" link, given the number of events it represents
-    DayGrid.prototype.getMoreLinkText = function (num) {
-        var opt = this.opt('eventLimitText');
-        if (typeof opt === 'function') {
-            return opt(num);
-        }
-        else {
-            return '+' + num + ' ' + opt;
-        }
-    };
-    // Returns segments within a given cell.
-    // If `startLevel` is specified, returns only events including and below that level. Otherwise returns all segs.
-    DayGrid.prototype.getCellSegs = function (row, col, startLevel) {
-        var segMatrix = this.eventRenderer.rowStructs[row].segMatrix;
-        var level = startLevel || 0;
-        var segs = [];
-        var seg;
-        while (level < segMatrix.length) {
-            seg = segMatrix[level][col];
-            if (seg) {
-                segs.push(seg);
-            }
-            level++;
-        }
-        return segs;
-    };
-    return DayGrid;
-}(DateComponent));
-
-var WEEK_NUM_FORMAT$1 = createFormatter({ week: 'numeric' });
-/* An abstract class for the daygrid views, as well as month view. Renders one or more rows of day cells.
-----------------------------------------------------------------------------------------------------------------------*/
-// It is a manager for a DayGrid subcomponent, which does most of the heavy lifting.
-// It is responsible for managing width/height.
-var DayGridView = /** @class */ (function (_super) {
-    __extends(DayGridView, _super);
-    function DayGridView(context, viewSpec, dateProfileGenerator, parentEl) {
-        var _this = _super.call(this, context, viewSpec, dateProfileGenerator, parentEl) || this;
-        /* Header Rendering
-        ------------------------------------------------------------------------------------------------------------------*/
-        // Generates the HTML that will go before the day-of week header cells
-        _this.renderHeadIntroHtml = function () {
-            var theme = _this.theme;
-            if (_this.colWeekNumbersVisible) {
-                return '' +
-                    '<th class="fc-week-number ' + theme.getClass('widgetHeader') + '" ' + _this.weekNumberStyleAttr() + '>' +
-                    '<span>' + // needed for matchCellWidths
-                    htmlEscape(_this.opt('weekLabel')) +
-                    '</span>' +
-                    '</th>';
-            }
-            return '';
-        };
-        /* Day Grid Rendering
-        ------------------------------------------------------------------------------------------------------------------*/
-        // Generates the HTML that will go before content-skeleton cells that display the day/week numbers
-        _this.renderDayGridNumberIntroHtml = function (row, dayGrid) {
-            var dateEnv = _this.dateEnv;
-            var weekStart = dayGrid.props.cells[row][0].date;
-            if (_this.colWeekNumbersVisible) {
-                return '' +
-                    '<td class="fc-week-number" ' + _this.weekNumberStyleAttr() + '>' +
-                    buildGotoAnchorHtml(// aside from link, important for matchCellWidths
-                    _this, { date: weekStart, type: 'week', forceOff: dayGrid.colCnt === 1 }, dateEnv.format(weekStart, WEEK_NUM_FORMAT$1) // inner HTML
-                    ) +
-                    '</td>';
-            }
-            return '';
-        };
-        // Generates the HTML that goes before the day bg cells for each day-row
-        _this.renderDayGridBgIntroHtml = function () {
-            var theme = _this.theme;
-            if (_this.colWeekNumbersVisible) {
-                return '<td class="fc-week-number ' + theme.getClass('widgetContent') + '" ' + _this.weekNumberStyleAttr() + '></td>';
-            }
-            return '';
-        };
-        // Generates the HTML that goes before every other type of row generated by DayGrid.
-        // Affects mirror-skeleton and highlight-skeleton rows.
-        _this.renderDayGridIntroHtml = function () {
-            if (_this.colWeekNumbersVisible) {
-                return '<td class="fc-week-number" ' + _this.weekNumberStyleAttr() + '></td>';
-            }
-            return '';
-        };
-        _this.el.classList.add('fc-dayGrid-view');
-        _this.el.innerHTML = _this.renderSkeletonHtml();
-        _this.scroller = new ScrollComponent('hidden', // overflow x
-        'auto' // overflow y
-        );
-        var dayGridContainerEl = _this.scroller.el;
-        _this.el.querySelector('.fc-body > tr > td').appendChild(dayGridContainerEl);
-        dayGridContainerEl.classList.add('fc-day-grid-container');
-        var dayGridEl = createElement('div', { className: 'fc-day-grid' });
-        dayGridContainerEl.appendChild(dayGridEl);
-        var cellWeekNumbersVisible;
-        if (_this.opt('weekNumbers')) {
-            if (_this.opt('weekNumbersWithinDays')) {
-                cellWeekNumbersVisible = true;
-                _this.colWeekNumbersVisible = false;
-            }
-            else {
-                cellWeekNumbersVisible = false;
-                _this.colWeekNumbersVisible = true;
-            }
-        }
-        else {
-            _this.colWeekNumbersVisible = false;
-            cellWeekNumbersVisible = false;
-        }
-        _this.dayGrid = new DayGrid(_this.context, dayGridEl, {
-            renderNumberIntroHtml: _this.renderDayGridNumberIntroHtml,
-            renderBgIntroHtml: _this.renderDayGridBgIntroHtml,
-            renderIntroHtml: _this.renderDayGridIntroHtml,
-            colWeekNumbersVisible: _this.colWeekNumbersVisible,
-            cellWeekNumbersVisible: cellWeekNumbersVisible
-        });
-        return _this;
-    }
-    DayGridView.prototype.destroy = function () {
-        _super.prototype.destroy.call(this);
-        this.dayGrid.destroy();
-        this.scroller.destroy();
-    };
-    // Builds the HTML skeleton for the view.
-    // The day-grid component will render inside of a container defined by this HTML.
-    DayGridView.prototype.renderSkeletonHtml = function () {
-        var theme = this.theme;
-        return '' +
-            '<table class="' + theme.getClass('tableGrid') + '">' +
-            (this.opt('columnHeader') ?
-                '<thead class="fc-head">' +
-                    '<tr>' +
-                    '<td class="fc-head-container ' + theme.getClass('widgetHeader') + '">&nbsp;</td>' +
-                    '</tr>' +
-                    '</thead>' :
-                '') +
-            '<tbody class="fc-body">' +
-            '<tr>' +
-            '<td class="' + theme.getClass('widgetContent') + '"></td>' +
-            '</tr>' +
-            '</tbody>' +
-            '</table>';
-    };
-    // Generates an HTML attribute string for setting the width of the week number column, if it is known
-    DayGridView.prototype.weekNumberStyleAttr = function () {
-        if (this.weekNumberWidth != null) {
-            return 'style="width:' + this.weekNumberWidth + 'px"';
-        }
-        return '';
-    };
-    // Determines whether each row should have a constant height
-    DayGridView.prototype.hasRigidRows = function () {
-        var eventLimit = this.opt('eventLimit');
-        return eventLimit && typeof eventLimit !== 'number';
-    };
-    /* Dimensions
-    ------------------------------------------------------------------------------------------------------------------*/
-    DayGridView.prototype.updateSize = function (isResize, viewHeight, isAuto) {
-        _super.prototype.updateSize.call(this, isResize, viewHeight, isAuto); // will call updateBaseSize. important that executes first
-        this.dayGrid.updateSize(isResize);
-    };
-    // Refreshes the horizontal dimensions of the view
-    DayGridView.prototype.updateBaseSize = function (isResize, viewHeight, isAuto) {
-        var dayGrid = this.dayGrid;
-        var eventLimit = this.opt('eventLimit');
-        var headRowEl = this.header ? this.header.el : null; // HACK
-        var scrollerHeight;
-        var scrollbarWidths;
-        // hack to give the view some height prior to dayGrid's columns being rendered
-        // TODO: separate setting height from scroller VS dayGrid.
-        if (!dayGrid.rowEls) {
-            if (!isAuto) {
-                scrollerHeight = this.computeScrollerHeight(viewHeight);
-                this.scroller.setHeight(scrollerHeight);
-            }
-            return;
-        }
-        if (this.colWeekNumbersVisible) {
-            // Make sure all week number cells running down the side have the same width.
-            this.weekNumberWidth = matchCellWidths(findElements(this.el, '.fc-week-number'));
-        }
-        // reset all heights to be natural
-        this.scroller.clear();
-        if (headRowEl) {
-            uncompensateScroll(headRowEl);
-        }
-        dayGrid.removeSegPopover(); // kill the "more" popover if displayed
-        // is the event limit a constant level number?
-        if (eventLimit && typeof eventLimit === 'number') {
-            dayGrid.limitRows(eventLimit); // limit the levels first so the height can redistribute after
-        }
-        // distribute the height to the rows
-        // (viewHeight is a "recommended" value if isAuto)
-        scrollerHeight = this.computeScrollerHeight(viewHeight);
-        this.setGridHeight(scrollerHeight, isAuto);
-        // is the event limit dynamically calculated?
-        if (eventLimit && typeof eventLimit !== 'number') {
-            dayGrid.limitRows(eventLimit); // limit the levels after the grid's row heights have been set
-        }
-        if (!isAuto) { // should we force dimensions of the scroll container?
-            this.scroller.setHeight(scrollerHeight);
-            scrollbarWidths = this.scroller.getScrollbarWidths();
-            if (scrollbarWidths.left || scrollbarWidths.right) { // using scrollbars?
-                if (headRowEl) {
-                    compensateScroll(headRowEl, scrollbarWidths);
-                }
-                // doing the scrollbar compensation might have created text overflow which created more height. redo
-                scrollerHeight = this.computeScrollerHeight(viewHeight);
-                this.scroller.setHeight(scrollerHeight);
-            }
-            // guarantees the same scrollbar widths
-            this.scroller.lockOverflow(scrollbarWidths);
-        }
-    };
-    // given a desired total height of the view, returns what the height of the scroller should be
-    DayGridView.prototype.computeScrollerHeight = function (viewHeight) {
-        return viewHeight -
-            subtractInnerElHeight(this.el, this.scroller.el); // everything that's NOT the scroller
-    };
-    // Sets the height of just the DayGrid component in this view
-    DayGridView.prototype.setGridHeight = function (height, isAuto) {
-        if (this.opt('monthMode')) {
-            // if auto, make the height of each row the height that it would be if there were 6 weeks
-            if (isAuto) {
-                height *= this.dayGrid.rowCnt / 6;
-            }
-            distributeHeight(this.dayGrid.rowEls, height, !isAuto); // if auto, don't compensate for height-hogging rows
-        }
-        else {
-            if (isAuto) {
-                undistributeHeight(this.dayGrid.rowEls); // let the rows be their natural height with no expanding
-            }
-            else {
-                distributeHeight(this.dayGrid.rowEls, height, true); // true = compensate for height-hogging rows
-            }
-        }
-    };
-    /* Scroll
-    ------------------------------------------------------------------------------------------------------------------*/
-    DayGridView.prototype.computeDateScroll = function (duration) {
-        return { top: 0 };
-    };
-    DayGridView.prototype.queryDateScroll = function () {
-        return { top: this.scroller.getScrollTop() };
-    };
-    DayGridView.prototype.applyDateScroll = function (scroll) {
-        if (scroll.top !== undefined) {
-            this.scroller.setScrollTop(scroll.top);
-        }
-    };
-    return DayGridView;
-}(View));
-DayGridView.prototype.dateProfileGeneratorClass = DayGridDateProfileGenerator;
-
-var SimpleDayGrid = /** @class */ (function (_super) {
-    __extends(SimpleDayGrid, _super);
-    function SimpleDayGrid(context, dayGrid) {
-        var _this = _super.call(this, context, dayGrid.el) || this;
-        _this.slicer = new DayGridSlicer();
-        _this.dayGrid = dayGrid;
-        context.calendar.registerInteractiveComponent(_this, { el: _this.dayGrid.el });
-        return _this;
-    }
-    SimpleDayGrid.prototype.destroy = function () {
-        _super.prototype.destroy.call(this);
-        this.calendar.unregisterInteractiveComponent(this);
-    };
-    SimpleDayGrid.prototype.render = function (props) {
-        var dayGrid = this.dayGrid;
-        var dateProfile = props.dateProfile, dayTable = props.dayTable;
-        dayGrid.receiveProps(__assign({}, this.slicer.sliceProps(props, dateProfile, props.nextDayThreshold, dayGrid, dayTable), { dateProfile: dateProfile, cells: dayTable.cells, isRigid: props.isRigid }));
-    };
-    SimpleDayGrid.prototype.buildPositionCaches = function () {
-        this.dayGrid.buildPositionCaches();
-    };
-    SimpleDayGrid.prototype.queryHit = function (positionLeft, positionTop) {
-        var rawHit = this.dayGrid.positionToHit(positionLeft, positionTop);
-        if (rawHit) {
-            return {
-                component: this.dayGrid,
-                dateSpan: rawHit.dateSpan,
-                dayEl: rawHit.dayEl,
-                rect: {
-                    left: rawHit.relativeRect.left,
-                    right: rawHit.relativeRect.right,
-                    top: rawHit.relativeRect.top,
-                    bottom: rawHit.relativeRect.bottom
-                },
-                layer: 0
-            };
-        }
-    };
-    return SimpleDayGrid;
-}(DateComponent));
-var DayGridSlicer = /** @class */ (function (_super) {
-    __extends(DayGridSlicer, _super);
-    function DayGridSlicer() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    DayGridSlicer.prototype.sliceRange = function (dateRange, dayTable) {
-        return dayTable.sliceRange(dateRange);
-    };
-    return DayGridSlicer;
-}(Slicer));
-
-var DayGridView$1 = /** @class */ (function (_super) {
-    __extends(DayGridView, _super);
-    function DayGridView(_context, viewSpec, dateProfileGenerator, parentEl) {
-        var _this = _super.call(this, _context, viewSpec, dateProfileGenerator, parentEl) || this;
-        _this.buildDayTable = memoize(buildDayTable);
-        if (_this.opt('columnHeader')) {
-            _this.header = new DayHeader(_this.context, _this.el.querySelector('.fc-head-container'));
-        }
-        _this.simpleDayGrid = new SimpleDayGrid(_this.context, _this.dayGrid);
-        return _this;
-    }
-    DayGridView.prototype.destroy = function () {
-        _super.prototype.destroy.call(this);
-        if (this.header) {
-            this.header.destroy();
-        }
-        this.simpleDayGrid.destroy();
-    };
-    DayGridView.prototype.render = function (props) {
-        _super.prototype.render.call(this, props);
-        var dateProfile = this.props.dateProfile;
-        var dayTable = this.dayTable =
-            this.buildDayTable(dateProfile, this.dateProfileGenerator);
-        if (this.header) {
-            this.header.receiveProps({
-                dateProfile: dateProfile,
-                dates: dayTable.headerDates,
-                datesRepDistinctDays: dayTable.rowCnt === 1,
-                renderIntroHtml: this.renderHeadIntroHtml
-            });
-        }
-        this.simpleDayGrid.receiveProps({
-            dateProfile: dateProfile,
-            dayTable: dayTable,
-            businessHours: props.businessHours,
-            dateSelection: props.dateSelection,
-            eventStore: props.eventStore,
-            eventUiBases: props.eventUiBases,
-            eventSelection: props.eventSelection,
-            eventDrag: props.eventDrag,
-            eventResize: props.eventResize,
-            isRigid: this.hasRigidRows(),
-            nextDayThreshold: this.nextDayThreshold
-        });
-    };
-    return DayGridView;
-}(DayGridView));
-function buildDayTable(dateProfile, dateProfileGenerator) {
-    var daySeries = new DaySeries(dateProfile.renderRange, dateProfileGenerator);
-    return new DayTable(daySeries, /year|month|week/.test(dateProfile.currentRangeUnit));
-}
-
-var main = createPlugin({
-    defaultView: 'dayGridMonth',
-    views: {
-        dayGrid: DayGridView$1,
-        dayGridDay: {
-            type: 'dayGrid',
-            duration: { days: 1 }
-        },
-        dayGridWeek: {
-            type: 'dayGrid',
-            duration: { weeks: 1 }
-        },
-        dayGridMonth: {
-            type: 'dayGrid',
-            duration: { months: 1 },
-            monthMode: true,
-            fixedWeekCount: true
-        }
-    }
-});
-
-export default main;
-export { DayGridView as AbstractDayGridView, DayBgRow, DayGrid, DayGridSlicer, DayGridView$1 as DayGridView, SimpleDayGrid, buildDayTable as buildBasicDayTable };
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/daygrid/main.js b/AKPlan/static/AKPlan/vendor/fullcalendar/daygrid/main.js
deleted file mode 100644
index d1cc407f11f50292b3c7e09b2fe07116f2f02768..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/daygrid/main.js
+++ /dev/null
@@ -1,1641 +0,0 @@
-/*!
-FullCalendar Day Grid Plugin v4.3.0
-Docs & License: https://fullcalendar.io/
-(c) 2019 Adam Shaw
-*/
-
-(function (global, factory) {
-    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@fullcalendar/core')) :
-    typeof define === 'function' && define.amd ? define(['exports', '@fullcalendar/core'], factory) :
-    (global = global || self, factory(global.FullCalendarDayGrid = {}, global.FullCalendar));
-}(this, function (exports, core) { 'use strict';
-
-    /*! *****************************************************************************
-    Copyright (c) Microsoft Corporation. All rights reserved.
-    Licensed under the Apache License, Version 2.0 (the "License"); you may not use
-    this file except in compliance with the License. You may obtain a copy of the
-    License at http://www.apache.org/licenses/LICENSE-2.0
-
-    THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-    KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
-    WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
-    MERCHANTABLITY OR NON-INFRINGEMENT.
-
-    See the Apache Version 2.0 License for specific language governing permissions
-    and limitations under the License.
-    ***************************************************************************** */
-    /* global Reflect, Promise */
-
-    var extendStatics = function(d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-
-    function __extends(d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    }
-
-    var __assign = function() {
-        __assign = Object.assign || function __assign(t) {
-            for (var s, i = 1, n = arguments.length; i < n; i++) {
-                s = arguments[i];
-                for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
-            }
-            return t;
-        };
-        return __assign.apply(this, arguments);
-    };
-
-    var DayGridDateProfileGenerator = /** @class */ (function (_super) {
-        __extends(DayGridDateProfileGenerator, _super);
-        function DayGridDateProfileGenerator() {
-            return _super !== null && _super.apply(this, arguments) || this;
-        }
-        // Computes the date range that will be rendered.
-        DayGridDateProfileGenerator.prototype.buildRenderRange = function (currentRange, currentRangeUnit, isRangeAllDay) {
-            var dateEnv = this.dateEnv;
-            var renderRange = _super.prototype.buildRenderRange.call(this, currentRange, currentRangeUnit, isRangeAllDay);
-            var start = renderRange.start;
-            var end = renderRange.end;
-            var endOfWeek;
-            // year and month views should be aligned with weeks. this is already done for week
-            if (/^(year|month)$/.test(currentRangeUnit)) {
-                start = dateEnv.startOfWeek(start);
-                // make end-of-week if not already
-                endOfWeek = dateEnv.startOfWeek(end);
-                if (endOfWeek.valueOf() !== end.valueOf()) {
-                    end = core.addWeeks(endOfWeek, 1);
-                }
-            }
-            // ensure 6 weeks
-            if (this.options.monthMode &&
-                this.options.fixedWeekCount) {
-                var rowCnt = Math.ceil(// could be partial weeks due to hiddenDays
-                core.diffWeeks(start, end));
-                end = core.addWeeks(end, 6 - rowCnt);
-            }
-            return { start: start, end: end };
-        };
-        return DayGridDateProfileGenerator;
-    }(core.DateProfileGenerator));
-
-    /* A rectangular panel that is absolutely positioned over other content
-    ------------------------------------------------------------------------------------------------------------------------
-    Options:
-      - className (string)
-      - content (HTML string, element, or element array)
-      - parentEl
-      - top
-      - left
-      - right (the x coord of where the right edge should be. not a "CSS" right)
-      - autoHide (boolean)
-      - show (callback)
-      - hide (callback)
-    */
-    var Popover = /** @class */ (function () {
-        function Popover(options) {
-            var _this = this;
-            this.isHidden = true;
-            this.margin = 10; // the space required between the popover and the edges of the scroll container
-            // Triggered when the user clicks *anywhere* in the document, for the autoHide feature
-            this.documentMousedown = function (ev) {
-                // only hide the popover if the click happened outside the popover
-                if (_this.el && !_this.el.contains(ev.target)) {
-                    _this.hide();
-                }
-            };
-            this.options = options;
-        }
-        // Shows the popover on the specified position. Renders it if not already
-        Popover.prototype.show = function () {
-            if (this.isHidden) {
-                if (!this.el) {
-                    this.render();
-                }
-                this.el.style.display = '';
-                this.position();
-                this.isHidden = false;
-                this.trigger('show');
-            }
-        };
-        // Hides the popover, through CSS, but does not remove it from the DOM
-        Popover.prototype.hide = function () {
-            if (!this.isHidden) {
-                this.el.style.display = 'none';
-                this.isHidden = true;
-                this.trigger('hide');
-            }
-        };
-        // Creates `this.el` and renders content inside of it
-        Popover.prototype.render = function () {
-            var _this = this;
-            var options = this.options;
-            var el = this.el = core.createElement('div', {
-                className: 'fc-popover ' + (options.className || ''),
-                style: {
-                    top: '0',
-                    left: '0'
-                }
-            });
-            if (typeof options.content === 'function') {
-                options.content(el);
-            }
-            options.parentEl.appendChild(el);
-            // when a click happens on anything inside with a 'fc-close' className, hide the popover
-            core.listenBySelector(el, 'click', '.fc-close', function (ev) {
-                _this.hide();
-            });
-            if (options.autoHide) {
-                document.addEventListener('mousedown', this.documentMousedown);
-            }
-        };
-        // Hides and unregisters any handlers
-        Popover.prototype.destroy = function () {
-            this.hide();
-            if (this.el) {
-                core.removeElement(this.el);
-                this.el = null;
-            }
-            document.removeEventListener('mousedown', this.documentMousedown);
-        };
-        // Positions the popover optimally, using the top/left/right options
-        Popover.prototype.position = function () {
-            var options = this.options;
-            var el = this.el;
-            var elDims = el.getBoundingClientRect(); // only used for width,height
-            var origin = core.computeRect(el.offsetParent);
-            var clippingRect = core.computeClippingRect(options.parentEl);
-            var top; // the "position" (not "offset") values for the popover
-            var left; //
-            // compute top and left
-            top = options.top || 0;
-            if (options.left !== undefined) {
-                left = options.left;
-            }
-            else if (options.right !== undefined) {
-                left = options.right - elDims.width; // derive the left value from the right value
-            }
-            else {
-                left = 0;
-            }
-            // constrain to the view port. if constrained by two edges, give precedence to top/left
-            top = Math.min(top, clippingRect.bottom - elDims.height - this.margin);
-            top = Math.max(top, clippingRect.top + this.margin);
-            left = Math.min(left, clippingRect.right - elDims.width - this.margin);
-            left = Math.max(left, clippingRect.left + this.margin);
-            core.applyStyle(el, {
-                top: top - origin.top,
-                left: left - origin.left
-            });
-        };
-        // Triggers a callback. Calls a function in the option hash of the same name.
-        // Arguments beyond the first `name` are forwarded on.
-        // TODO: better code reuse for this. Repeat code
-        // can kill this???
-        Popover.prototype.trigger = function (name) {
-            if (this.options[name]) {
-                this.options[name].apply(this, Array.prototype.slice.call(arguments, 1));
-            }
-        };
-        return Popover;
-    }());
-
-    /* Event-rendering methods for the DayGrid class
-    ----------------------------------------------------------------------------------------------------------------------*/
-    // "Simple" is bad a name. has nothing to do with SimpleDayGrid
-    var SimpleDayGridEventRenderer = /** @class */ (function (_super) {
-        __extends(SimpleDayGridEventRenderer, _super);
-        function SimpleDayGridEventRenderer() {
-            return _super !== null && _super.apply(this, arguments) || this;
-        }
-        // Builds the HTML to be used for the default element for an individual segment
-        SimpleDayGridEventRenderer.prototype.renderSegHtml = function (seg, mirrorInfo) {
-            var _a = this.context, view = _a.view, options = _a.options;
-            var eventRange = seg.eventRange;
-            var eventDef = eventRange.def;
-            var eventUi = eventRange.ui;
-            var allDay = eventDef.allDay;
-            var isDraggable = view.computeEventDraggable(eventDef, eventUi);
-            var isResizableFromStart = allDay && seg.isStart && view.computeEventStartResizable(eventDef, eventUi);
-            var isResizableFromEnd = allDay && seg.isEnd && view.computeEventEndResizable(eventDef, eventUi);
-            var classes = this.getSegClasses(seg, isDraggable, isResizableFromStart || isResizableFromEnd, mirrorInfo);
-            var skinCss = core.cssToStr(this.getSkinCss(eventUi));
-            var timeHtml = '';
-            var timeText;
-            var titleHtml;
-            classes.unshift('fc-day-grid-event', 'fc-h-event');
-            // Only display a timed events time if it is the starting segment
-            if (seg.isStart) {
-                timeText = this.getTimeText(eventRange);
-                if (timeText) {
-                    timeHtml = '<span class="fc-time">' + core.htmlEscape(timeText) + '</span>';
-                }
-            }
-            titleHtml =
-                '<span class="fc-title">' +
-                    (core.htmlEscape(eventDef.title || '') || '&nbsp;') + // we always want one line of height
-                    '</span>';
-            return '<a class="' + classes.join(' ') + '"' +
-                (eventDef.url ?
-                    ' href="' + core.htmlEscape(eventDef.url) + '"' :
-                    '') +
-                (skinCss ?
-                    ' style="' + skinCss + '"' :
-                    '') +
-                '>' +
-                '<div class="fc-content">' +
-                (options.dir === 'rtl' ?
-                    titleHtml + ' ' + timeHtml : // put a natural space in between
-                    timeHtml + ' ' + titleHtml //
-                ) +
-                '</div>' +
-                (isResizableFromStart ?
-                    '<div class="fc-resizer fc-start-resizer"></div>' :
-                    '') +
-                (isResizableFromEnd ?
-                    '<div class="fc-resizer fc-end-resizer"></div>' :
-                    '') +
-                '</a>';
-        };
-        // Computes a default event time formatting string if `eventTimeFormat` is not explicitly defined
-        SimpleDayGridEventRenderer.prototype.computeEventTimeFormat = function () {
-            return {
-                hour: 'numeric',
-                minute: '2-digit',
-                omitZeroMinute: true,
-                meridiem: 'narrow'
-            };
-        };
-        SimpleDayGridEventRenderer.prototype.computeDisplayEventEnd = function () {
-            return false; // TODO: somehow consider the originating DayGrid's column count
-        };
-        return SimpleDayGridEventRenderer;
-    }(core.FgEventRenderer));
-
-    /* Event-rendering methods for the DayGrid class
-    ----------------------------------------------------------------------------------------------------------------------*/
-    var DayGridEventRenderer = /** @class */ (function (_super) {
-        __extends(DayGridEventRenderer, _super);
-        function DayGridEventRenderer(dayGrid) {
-            var _this = _super.call(this, dayGrid.context) || this;
-            _this.dayGrid = dayGrid;
-            return _this;
-        }
-        // Renders the given foreground event segments onto the grid
-        DayGridEventRenderer.prototype.attachSegs = function (segs, mirrorInfo) {
-            var rowStructs = this.rowStructs = this.renderSegRows(segs);
-            // append to each row's content skeleton
-            this.dayGrid.rowEls.forEach(function (rowNode, i) {
-                rowNode.querySelector('.fc-content-skeleton > table').appendChild(rowStructs[i].tbodyEl);
-            });
-            // removes the "more.." events popover
-            if (!mirrorInfo) {
-                this.dayGrid.removeSegPopover();
-            }
-        };
-        // Unrenders all currently rendered foreground event segments
-        DayGridEventRenderer.prototype.detachSegs = function () {
-            var rowStructs = this.rowStructs || [];
-            var rowStruct;
-            while ((rowStruct = rowStructs.pop())) {
-                core.removeElement(rowStruct.tbodyEl);
-            }
-            this.rowStructs = null;
-        };
-        // Uses the given events array to generate <tbody> elements that should be appended to each row's content skeleton.
-        // Returns an array of rowStruct objects (see the bottom of `renderSegRow`).
-        // PRECONDITION: each segment shoud already have a rendered and assigned `.el`
-        DayGridEventRenderer.prototype.renderSegRows = function (segs) {
-            var rowStructs = [];
-            var segRows;
-            var row;
-            segRows = this.groupSegRows(segs); // group into nested arrays
-            // iterate each row of segment groupings
-            for (row = 0; row < segRows.length; row++) {
-                rowStructs.push(this.renderSegRow(row, segRows[row]));
-            }
-            return rowStructs;
-        };
-        // Given a row # and an array of segments all in the same row, render a <tbody> element, a skeleton that contains
-        // the segments. Returns object with a bunch of internal data about how the render was calculated.
-        // NOTE: modifies rowSegs
-        DayGridEventRenderer.prototype.renderSegRow = function (row, rowSegs) {
-            var dayGrid = this.dayGrid;
-            var colCnt = dayGrid.colCnt, isRtl = dayGrid.isRtl;
-            var segLevels = this.buildSegLevels(rowSegs); // group into sub-arrays of levels
-            var levelCnt = Math.max(1, segLevels.length); // ensure at least one level
-            var tbody = document.createElement('tbody');
-            var segMatrix = []; // lookup for which segments are rendered into which level+col cells
-            var cellMatrix = []; // lookup for all <td> elements of the level+col matrix
-            var loneCellMatrix = []; // lookup for <td> elements that only take up a single column
-            var i;
-            var levelSegs;
-            var col;
-            var tr;
-            var j;
-            var seg;
-            var td;
-            // populates empty cells from the current column (`col`) to `endCol`
-            function emptyCellsUntil(endCol) {
-                while (col < endCol) {
-                    // try to grab a cell from the level above and extend its rowspan. otherwise, create a fresh cell
-                    td = (loneCellMatrix[i - 1] || [])[col];
-                    if (td) {
-                        td.rowSpan = (td.rowSpan || 1) + 1;
-                    }
-                    else {
-                        td = document.createElement('td');
-                        tr.appendChild(td);
-                    }
-                    cellMatrix[i][col] = td;
-                    loneCellMatrix[i][col] = td;
-                    col++;
-                }
-            }
-            for (i = 0; i < levelCnt; i++) { // iterate through all levels
-                levelSegs = segLevels[i];
-                col = 0;
-                tr = document.createElement('tr');
-                segMatrix.push([]);
-                cellMatrix.push([]);
-                loneCellMatrix.push([]);
-                // levelCnt might be 1 even though there are no actual levels. protect against this.
-                // this single empty row is useful for styling.
-                if (levelSegs) {
-                    for (j = 0; j < levelSegs.length; j++) { // iterate through segments in level
-                        seg = levelSegs[j];
-                        var leftCol = isRtl ? (colCnt - 1 - seg.lastCol) : seg.firstCol;
-                        var rightCol = isRtl ? (colCnt - 1 - seg.firstCol) : seg.lastCol;
-                        emptyCellsUntil(leftCol);
-                        // create a container that occupies or more columns. append the event element.
-                        td = core.createElement('td', { className: 'fc-event-container' }, seg.el);
-                        if (leftCol !== rightCol) {
-                            td.colSpan = rightCol - leftCol + 1;
-                        }
-                        else { // a single-column segment
-                            loneCellMatrix[i][col] = td;
-                        }
-                        while (col <= rightCol) {
-                            cellMatrix[i][col] = td;
-                            segMatrix[i][col] = seg;
-                            col++;
-                        }
-                        tr.appendChild(td);
-                    }
-                }
-                emptyCellsUntil(colCnt); // finish off the row
-                var introHtml = dayGrid.renderProps.renderIntroHtml();
-                if (introHtml) {
-                    if (dayGrid.isRtl) {
-                        core.appendToElement(tr, introHtml);
-                    }
-                    else {
-                        core.prependToElement(tr, introHtml);
-                    }
-                }
-                tbody.appendChild(tr);
-            }
-            return {
-                row: row,
-                tbodyEl: tbody,
-                cellMatrix: cellMatrix,
-                segMatrix: segMatrix,
-                segLevels: segLevels,
-                segs: rowSegs
-            };
-        };
-        // Stacks a flat array of segments, which are all assumed to be in the same row, into subarrays of vertical levels.
-        // NOTE: modifies segs
-        DayGridEventRenderer.prototype.buildSegLevels = function (segs) {
-            var _a = this.dayGrid, isRtl = _a.isRtl, colCnt = _a.colCnt;
-            var levels = [];
-            var i;
-            var seg;
-            var j;
-            // Give preference to elements with certain criteria, so they have
-            // a chance to be closer to the top.
-            segs = this.sortEventSegs(segs);
-            for (i = 0; i < segs.length; i++) {
-                seg = segs[i];
-                // loop through levels, starting with the topmost, until the segment doesn't collide with other segments
-                for (j = 0; j < levels.length; j++) {
-                    if (!isDaySegCollision(seg, levels[j])) {
-                        break;
-                    }
-                }
-                // `j` now holds the desired subrow index
-                seg.level = j;
-                seg.leftCol = isRtl ? (colCnt - 1 - seg.lastCol) : seg.firstCol; // for sorting only
-                seg.rightCol = isRtl ? (colCnt - 1 - seg.firstCol) : seg.lastCol // for sorting only
-                ;
-                (levels[j] || (levels[j] = [])).push(seg);
-            }
-            // order segments left-to-right. very important if calendar is RTL
-            for (j = 0; j < levels.length; j++) {
-                levels[j].sort(compareDaySegCols);
-            }
-            return levels;
-        };
-        // Given a flat array of segments, return an array of sub-arrays, grouped by each segment's row
-        DayGridEventRenderer.prototype.groupSegRows = function (segs) {
-            var segRows = [];
-            var i;
-            for (i = 0; i < this.dayGrid.rowCnt; i++) {
-                segRows.push([]);
-            }
-            for (i = 0; i < segs.length; i++) {
-                segRows[segs[i].row].push(segs[i]);
-            }
-            return segRows;
-        };
-        // Computes a default `displayEventEnd` value if one is not expliclty defined
-        DayGridEventRenderer.prototype.computeDisplayEventEnd = function () {
-            return this.dayGrid.colCnt === 1; // we'll likely have space if there's only one day
-        };
-        return DayGridEventRenderer;
-    }(SimpleDayGridEventRenderer));
-    // Computes whether two segments' columns collide. They are assumed to be in the same row.
-    function isDaySegCollision(seg, otherSegs) {
-        var i;
-        var otherSeg;
-        for (i = 0; i < otherSegs.length; i++) {
-            otherSeg = otherSegs[i];
-            if (otherSeg.firstCol <= seg.lastCol &&
-                otherSeg.lastCol >= seg.firstCol) {
-                return true;
-            }
-        }
-        return false;
-    }
-    // A cmp function for determining the leftmost event
-    function compareDaySegCols(a, b) {
-        return a.leftCol - b.leftCol;
-    }
-
-    var DayGridMirrorRenderer = /** @class */ (function (_super) {
-        __extends(DayGridMirrorRenderer, _super);
-        function DayGridMirrorRenderer() {
-            return _super !== null && _super.apply(this, arguments) || this;
-        }
-        DayGridMirrorRenderer.prototype.attachSegs = function (segs, mirrorInfo) {
-            var sourceSeg = mirrorInfo.sourceSeg;
-            var rowStructs = this.rowStructs = this.renderSegRows(segs);
-            // inject each new event skeleton into each associated row
-            this.dayGrid.rowEls.forEach(function (rowNode, row) {
-                var skeletonEl = core.htmlToElement('<div class="fc-mirror-skeleton"><table></table></div>'); // will be absolutely positioned
-                var skeletonTopEl;
-                var skeletonTop;
-                // If there is an original segment, match the top position. Otherwise, put it at the row's top level
-                if (sourceSeg && sourceSeg.row === row) {
-                    skeletonTopEl = sourceSeg.el;
-                }
-                else {
-                    skeletonTopEl = rowNode.querySelector('.fc-content-skeleton tbody');
-                    if (!skeletonTopEl) { // when no events
-                        skeletonTopEl = rowNode.querySelector('.fc-content-skeleton table');
-                    }
-                }
-                skeletonTop = skeletonTopEl.getBoundingClientRect().top -
-                    rowNode.getBoundingClientRect().top; // the offsetParent origin
-                skeletonEl.style.top = skeletonTop + 'px';
-                skeletonEl.querySelector('table').appendChild(rowStructs[row].tbodyEl);
-                rowNode.appendChild(skeletonEl);
-            });
-        };
-        return DayGridMirrorRenderer;
-    }(DayGridEventRenderer));
-
-    var EMPTY_CELL_HTML = '<td style="pointer-events:none"></td>';
-    var DayGridFillRenderer = /** @class */ (function (_super) {
-        __extends(DayGridFillRenderer, _super);
-        function DayGridFillRenderer(dayGrid) {
-            var _this = _super.call(this, dayGrid.context) || this;
-            _this.fillSegTag = 'td'; // override the default tag name
-            _this.dayGrid = dayGrid;
-            return _this;
-        }
-        DayGridFillRenderer.prototype.renderSegs = function (type, segs) {
-            // don't render timed background events
-            if (type === 'bgEvent') {
-                segs = segs.filter(function (seg) {
-                    return seg.eventRange.def.allDay;
-                });
-            }
-            _super.prototype.renderSegs.call(this, type, segs);
-        };
-        DayGridFillRenderer.prototype.attachSegs = function (type, segs) {
-            var els = [];
-            var i;
-            var seg;
-            var skeletonEl;
-            for (i = 0; i < segs.length; i++) {
-                seg = segs[i];
-                skeletonEl = this.renderFillRow(type, seg);
-                this.dayGrid.rowEls[seg.row].appendChild(skeletonEl);
-                els.push(skeletonEl);
-            }
-            return els;
-        };
-        // Generates the HTML needed for one row of a fill. Requires the seg's el to be rendered.
-        DayGridFillRenderer.prototype.renderFillRow = function (type, seg) {
-            var dayGrid = this.dayGrid;
-            var colCnt = dayGrid.colCnt, isRtl = dayGrid.isRtl;
-            var leftCol = isRtl ? (colCnt - 1 - seg.lastCol) : seg.firstCol;
-            var rightCol = isRtl ? (colCnt - 1 - seg.firstCol) : seg.lastCol;
-            var startCol = leftCol;
-            var endCol = rightCol + 1;
-            var className;
-            var skeletonEl;
-            var trEl;
-            if (type === 'businessHours') {
-                className = 'bgevent';
-            }
-            else {
-                className = type.toLowerCase();
-            }
-            skeletonEl = core.htmlToElement('<div class="fc-' + className + '-skeleton">' +
-                '<table><tr></tr></table>' +
-                '</div>');
-            trEl = skeletonEl.getElementsByTagName('tr')[0];
-            if (startCol > 0) {
-                core.appendToElement(trEl, 
-                // will create (startCol + 1) td's
-                new Array(startCol + 1).join(EMPTY_CELL_HTML));
-            }
-            seg.el.colSpan = endCol - startCol;
-            trEl.appendChild(seg.el);
-            if (endCol < colCnt) {
-                core.appendToElement(trEl, 
-                // will create (colCnt - endCol) td's
-                new Array(colCnt - endCol + 1).join(EMPTY_CELL_HTML));
-            }
-            var introHtml = dayGrid.renderProps.renderIntroHtml();
-            if (introHtml) {
-                if (dayGrid.isRtl) {
-                    core.appendToElement(trEl, introHtml);
-                }
-                else {
-                    core.prependToElement(trEl, introHtml);
-                }
-            }
-            return skeletonEl;
-        };
-        return DayGridFillRenderer;
-    }(core.FillRenderer));
-
-    var DayTile = /** @class */ (function (_super) {
-        __extends(DayTile, _super);
-        function DayTile(context, el) {
-            var _this = _super.call(this, context, el) || this;
-            var eventRenderer = _this.eventRenderer = new DayTileEventRenderer(_this);
-            var renderFrame = _this.renderFrame = core.memoizeRendering(_this._renderFrame);
-            _this.renderFgEvents = core.memoizeRendering(eventRenderer.renderSegs.bind(eventRenderer), eventRenderer.unrender.bind(eventRenderer), [renderFrame]);
-            _this.renderEventSelection = core.memoizeRendering(eventRenderer.selectByInstanceId.bind(eventRenderer), eventRenderer.unselectByInstanceId.bind(eventRenderer), [_this.renderFgEvents]);
-            _this.renderEventDrag = core.memoizeRendering(eventRenderer.hideByHash.bind(eventRenderer), eventRenderer.showByHash.bind(eventRenderer), [renderFrame]);
-            _this.renderEventResize = core.memoizeRendering(eventRenderer.hideByHash.bind(eventRenderer), eventRenderer.showByHash.bind(eventRenderer), [renderFrame]);
-            context.calendar.registerInteractiveComponent(_this, {
-                el: _this.el,
-                useEventCenter: false
-            });
-            return _this;
-        }
-        DayTile.prototype.render = function (props) {
-            this.renderFrame(props.date);
-            this.renderFgEvents(props.fgSegs);
-            this.renderEventSelection(props.eventSelection);
-            this.renderEventDrag(props.eventDragInstances);
-            this.renderEventResize(props.eventResizeInstances);
-        };
-        DayTile.prototype.destroy = function () {
-            _super.prototype.destroy.call(this);
-            this.renderFrame.unrender(); // should unrender everything else
-            this.calendar.unregisterInteractiveComponent(this);
-        };
-        DayTile.prototype._renderFrame = function (date) {
-            var _a = this, theme = _a.theme, dateEnv = _a.dateEnv;
-            var title = dateEnv.format(date, core.createFormatter(this.opt('dayPopoverFormat')) // TODO: cache
-            );
-            this.el.innerHTML =
-                '<div class="fc-header ' + theme.getClass('popoverHeader') + '">' +
-                    '<span class="fc-title">' +
-                    core.htmlEscape(title) +
-                    '</span>' +
-                    '<span class="fc-close ' + theme.getIconClass('close') + '"></span>' +
-                    '</div>' +
-                    '<div class="fc-body ' + theme.getClass('popoverContent') + '">' +
-                    '<div class="fc-event-container"></div>' +
-                    '</div>';
-            this.segContainerEl = this.el.querySelector('.fc-event-container');
-        };
-        DayTile.prototype.queryHit = function (positionLeft, positionTop, elWidth, elHeight) {
-            var date = this.props.date; // HACK
-            if (positionLeft < elWidth && positionTop < elHeight) {
-                return {
-                    component: this,
-                    dateSpan: {
-                        allDay: true,
-                        range: { start: date, end: core.addDays(date, 1) }
-                    },
-                    dayEl: this.el,
-                    rect: {
-                        left: 0,
-                        top: 0,
-                        right: elWidth,
-                        bottom: elHeight
-                    },
-                    layer: 1
-                };
-            }
-        };
-        return DayTile;
-    }(core.DateComponent));
-    var DayTileEventRenderer = /** @class */ (function (_super) {
-        __extends(DayTileEventRenderer, _super);
-        function DayTileEventRenderer(dayTile) {
-            var _this = _super.call(this, dayTile.context) || this;
-            _this.dayTile = dayTile;
-            return _this;
-        }
-        DayTileEventRenderer.prototype.attachSegs = function (segs) {
-            for (var _i = 0, segs_1 = segs; _i < segs_1.length; _i++) {
-                var seg = segs_1[_i];
-                this.dayTile.segContainerEl.appendChild(seg.el);
-            }
-        };
-        DayTileEventRenderer.prototype.detachSegs = function (segs) {
-            for (var _i = 0, segs_2 = segs; _i < segs_2.length; _i++) {
-                var seg = segs_2[_i];
-                core.removeElement(seg.el);
-            }
-        };
-        return DayTileEventRenderer;
-    }(SimpleDayGridEventRenderer));
-
-    var DayBgRow = /** @class */ (function () {
-        function DayBgRow(context) {
-            this.context = context;
-        }
-        DayBgRow.prototype.renderHtml = function (props) {
-            var parts = [];
-            if (props.renderIntroHtml) {
-                parts.push(props.renderIntroHtml());
-            }
-            for (var _i = 0, _a = props.cells; _i < _a.length; _i++) {
-                var cell = _a[_i];
-                parts.push(renderCellHtml(cell.date, props.dateProfile, this.context, cell.htmlAttrs));
-            }
-            if (!props.cells.length) {
-                parts.push('<td class="fc-day ' + this.context.theme.getClass('widgetContent') + '"></td>');
-            }
-            if (this.context.options.dir === 'rtl') {
-                parts.reverse();
-            }
-            return '<tr>' + parts.join('') + '</tr>';
-        };
-        return DayBgRow;
-    }());
-    function renderCellHtml(date, dateProfile, context, otherAttrs) {
-        var dateEnv = context.dateEnv, theme = context.theme;
-        var isDateValid = core.rangeContainsMarker(dateProfile.activeRange, date); // TODO: called too frequently. cache somehow.
-        var classes = core.getDayClasses(date, dateProfile, context);
-        classes.unshift('fc-day', theme.getClass('widgetContent'));
-        return '<td class="' + classes.join(' ') + '"' +
-            (isDateValid ?
-                ' data-date="' + dateEnv.formatIso(date, { omitTime: true }) + '"' :
-                '') +
-            (otherAttrs ?
-                ' ' + otherAttrs :
-                '') +
-            '></td>';
-    }
-
-    var DAY_NUM_FORMAT = core.createFormatter({ day: 'numeric' });
-    var WEEK_NUM_FORMAT = core.createFormatter({ week: 'numeric' });
-    var DayGrid = /** @class */ (function (_super) {
-        __extends(DayGrid, _super);
-        function DayGrid(context, el, renderProps) {
-            var _this = _super.call(this, context, el) || this;
-            _this.bottomCoordPadding = 0; // hack for extending the hit area for the last row of the coordinate grid
-            _this.isCellSizesDirty = false;
-            var eventRenderer = _this.eventRenderer = new DayGridEventRenderer(_this);
-            var fillRenderer = _this.fillRenderer = new DayGridFillRenderer(_this);
-            _this.mirrorRenderer = new DayGridMirrorRenderer(_this);
-            var renderCells = _this.renderCells = core.memoizeRendering(_this._renderCells, _this._unrenderCells);
-            _this.renderBusinessHours = core.memoizeRendering(fillRenderer.renderSegs.bind(fillRenderer, 'businessHours'), fillRenderer.unrender.bind(fillRenderer, 'businessHours'), [renderCells]);
-            _this.renderDateSelection = core.memoizeRendering(fillRenderer.renderSegs.bind(fillRenderer, 'highlight'), fillRenderer.unrender.bind(fillRenderer, 'highlight'), [renderCells]);
-            _this.renderBgEvents = core.memoizeRendering(fillRenderer.renderSegs.bind(fillRenderer, 'bgEvent'), fillRenderer.unrender.bind(fillRenderer, 'bgEvent'), [renderCells]);
-            _this.renderFgEvents = core.memoizeRendering(eventRenderer.renderSegs.bind(eventRenderer), eventRenderer.unrender.bind(eventRenderer), [renderCells]);
-            _this.renderEventSelection = core.memoizeRendering(eventRenderer.selectByInstanceId.bind(eventRenderer), eventRenderer.unselectByInstanceId.bind(eventRenderer), [_this.renderFgEvents]);
-            _this.renderEventDrag = core.memoizeRendering(_this._renderEventDrag, _this._unrenderEventDrag, [renderCells]);
-            _this.renderEventResize = core.memoizeRendering(_this._renderEventResize, _this._unrenderEventResize, [renderCells]);
-            _this.renderProps = renderProps;
-            return _this;
-        }
-        DayGrid.prototype.render = function (props) {
-            var cells = props.cells;
-            this.rowCnt = cells.length;
-            this.colCnt = cells[0].length;
-            this.renderCells(cells, props.isRigid);
-            this.renderBusinessHours(props.businessHourSegs);
-            this.renderDateSelection(props.dateSelectionSegs);
-            this.renderBgEvents(props.bgEventSegs);
-            this.renderFgEvents(props.fgEventSegs);
-            this.renderEventSelection(props.eventSelection);
-            this.renderEventDrag(props.eventDrag);
-            this.renderEventResize(props.eventResize);
-            if (this.segPopoverTile) {
-                this.updateSegPopoverTile();
-            }
-        };
-        DayGrid.prototype.destroy = function () {
-            _super.prototype.destroy.call(this);
-            this.renderCells.unrender(); // will unrender everything else
-        };
-        DayGrid.prototype.getCellRange = function (row, col) {
-            var start = this.props.cells[row][col].date;
-            var end = core.addDays(start, 1);
-            return { start: start, end: end };
-        };
-        DayGrid.prototype.updateSegPopoverTile = function (date, segs) {
-            var ownProps = this.props;
-            this.segPopoverTile.receiveProps({
-                date: date || this.segPopoverTile.props.date,
-                fgSegs: segs || this.segPopoverTile.props.fgSegs,
-                eventSelection: ownProps.eventSelection,
-                eventDragInstances: ownProps.eventDrag ? ownProps.eventDrag.affectedInstances : null,
-                eventResizeInstances: ownProps.eventResize ? ownProps.eventResize.affectedInstances : null
-            });
-        };
-        /* Date Rendering
-        ------------------------------------------------------------------------------------------------------------------*/
-        DayGrid.prototype._renderCells = function (cells, isRigid) {
-            var _a = this, view = _a.view, dateEnv = _a.dateEnv;
-            var _b = this, rowCnt = _b.rowCnt, colCnt = _b.colCnt;
-            var html = '';
-            var row;
-            var col;
-            for (row = 0; row < rowCnt; row++) {
-                html += this.renderDayRowHtml(row, isRigid);
-            }
-            this.el.innerHTML = html;
-            this.rowEls = core.findElements(this.el, '.fc-row');
-            this.cellEls = core.findElements(this.el, '.fc-day, .fc-disabled-day');
-            if (this.isRtl) {
-                this.cellEls.reverse();
-            }
-            this.rowPositions = new core.PositionCache(this.el, this.rowEls, false, true // vertical
-            );
-            this.colPositions = new core.PositionCache(this.el, this.cellEls.slice(0, colCnt), // only the first row
-            true, false // horizontal
-            );
-            // trigger dayRender with each cell's element
-            for (row = 0; row < rowCnt; row++) {
-                for (col = 0; col < colCnt; col++) {
-                    this.publiclyTrigger('dayRender', [
-                        {
-                            date: dateEnv.toDate(cells[row][col].date),
-                            el: this.getCellEl(row, col),
-                            view: view
-                        }
-                    ]);
-                }
-            }
-            this.isCellSizesDirty = true;
-        };
-        DayGrid.prototype._unrenderCells = function () {
-            this.removeSegPopover();
-        };
-        // Generates the HTML for a single row, which is a div that wraps a table.
-        // `row` is the row number.
-        DayGrid.prototype.renderDayRowHtml = function (row, isRigid) {
-            var theme = this.theme;
-            var classes = ['fc-row', 'fc-week', theme.getClass('dayRow')];
-            if (isRigid) {
-                classes.push('fc-rigid');
-            }
-            var bgRow = new DayBgRow(this.context);
-            return '' +
-                '<div class="' + classes.join(' ') + '">' +
-                '<div class="fc-bg">' +
-                '<table class="' + theme.getClass('tableGrid') + '">' +
-                bgRow.renderHtml({
-                    cells: this.props.cells[row],
-                    dateProfile: this.props.dateProfile,
-                    renderIntroHtml: this.renderProps.renderBgIntroHtml
-                }) +
-                '</table>' +
-                '</div>' +
-                '<div class="fc-content-skeleton">' +
-                '<table>' +
-                (this.getIsNumbersVisible() ?
-                    '<thead>' +
-                        this.renderNumberTrHtml(row) +
-                        '</thead>' :
-                    '') +
-                '</table>' +
-                '</div>' +
-                '</div>';
-        };
-        DayGrid.prototype.getIsNumbersVisible = function () {
-            return this.getIsDayNumbersVisible() ||
-                this.renderProps.cellWeekNumbersVisible ||
-                this.renderProps.colWeekNumbersVisible;
-        };
-        DayGrid.prototype.getIsDayNumbersVisible = function () {
-            return this.rowCnt > 1;
-        };
-        /* Grid Number Rendering
-        ------------------------------------------------------------------------------------------------------------------*/
-        DayGrid.prototype.renderNumberTrHtml = function (row) {
-            var intro = this.renderProps.renderNumberIntroHtml(row, this);
-            return '' +
-                '<tr>' +
-                (this.isRtl ? '' : intro) +
-                this.renderNumberCellsHtml(row) +
-                (this.isRtl ? intro : '') +
-                '</tr>';
-        };
-        DayGrid.prototype.renderNumberCellsHtml = function (row) {
-            var htmls = [];
-            var col;
-            var date;
-            for (col = 0; col < this.colCnt; col++) {
-                date = this.props.cells[row][col].date;
-                htmls.push(this.renderNumberCellHtml(date));
-            }
-            if (this.isRtl) {
-                htmls.reverse();
-            }
-            return htmls.join('');
-        };
-        // Generates the HTML for the <td>s of the "number" row in the DayGrid's content skeleton.
-        // The number row will only exist if either day numbers or week numbers are turned on.
-        DayGrid.prototype.renderNumberCellHtml = function (date) {
-            var _a = this, view = _a.view, dateEnv = _a.dateEnv;
-            var html = '';
-            var isDateValid = core.rangeContainsMarker(this.props.dateProfile.activeRange, date); // TODO: called too frequently. cache somehow.
-            var isDayNumberVisible = this.getIsDayNumbersVisible() && isDateValid;
-            var classes;
-            var weekCalcFirstDow;
-            if (!isDayNumberVisible && !this.renderProps.cellWeekNumbersVisible) {
-                // no numbers in day cell (week number must be along the side)
-                return '<td></td>'; //  will create an empty space above events :(
-            }
-            classes = core.getDayClasses(date, this.props.dateProfile, this.context);
-            classes.unshift('fc-day-top');
-            if (this.renderProps.cellWeekNumbersVisible) {
-                weekCalcFirstDow = dateEnv.weekDow;
-            }
-            html += '<td class="' + classes.join(' ') + '"' +
-                (isDateValid ?
-                    ' data-date="' + dateEnv.formatIso(date, { omitTime: true }) + '"' :
-                    '') +
-                '>';
-            if (this.renderProps.cellWeekNumbersVisible && (date.getUTCDay() === weekCalcFirstDow)) {
-                html += core.buildGotoAnchorHtml(view, { date: date, type: 'week' }, { 'class': 'fc-week-number' }, dateEnv.format(date, WEEK_NUM_FORMAT) // inner HTML
-                );
-            }
-            if (isDayNumberVisible) {
-                html += core.buildGotoAnchorHtml(view, date, { 'class': 'fc-day-number' }, dateEnv.format(date, DAY_NUM_FORMAT) // inner HTML
-                );
-            }
-            html += '</td>';
-            return html;
-        };
-        /* Sizing
-        ------------------------------------------------------------------------------------------------------------------*/
-        DayGrid.prototype.updateSize = function (isResize) {
-            var _a = this, fillRenderer = _a.fillRenderer, eventRenderer = _a.eventRenderer, mirrorRenderer = _a.mirrorRenderer;
-            if (isResize ||
-                this.isCellSizesDirty ||
-                this.view.calendar.isEventsUpdated // hack
-            ) {
-                this.buildPositionCaches();
-                this.isCellSizesDirty = false;
-            }
-            fillRenderer.computeSizes(isResize);
-            eventRenderer.computeSizes(isResize);
-            mirrorRenderer.computeSizes(isResize);
-            fillRenderer.assignSizes(isResize);
-            eventRenderer.assignSizes(isResize);
-            mirrorRenderer.assignSizes(isResize);
-        };
-        DayGrid.prototype.buildPositionCaches = function () {
-            this.buildColPositions();
-            this.buildRowPositions();
-        };
-        DayGrid.prototype.buildColPositions = function () {
-            this.colPositions.build();
-        };
-        DayGrid.prototype.buildRowPositions = function () {
-            this.rowPositions.build();
-            this.rowPositions.bottoms[this.rowCnt - 1] += this.bottomCoordPadding; // hack
-        };
-        /* Hit System
-        ------------------------------------------------------------------------------------------------------------------*/
-        DayGrid.prototype.positionToHit = function (leftPosition, topPosition) {
-            var _a = this, colPositions = _a.colPositions, rowPositions = _a.rowPositions;
-            var col = colPositions.leftToIndex(leftPosition);
-            var row = rowPositions.topToIndex(topPosition);
-            if (row != null && col != null) {
-                return {
-                    row: row,
-                    col: col,
-                    dateSpan: {
-                        range: this.getCellRange(row, col),
-                        allDay: true
-                    },
-                    dayEl: this.getCellEl(row, col),
-                    relativeRect: {
-                        left: colPositions.lefts[col],
-                        right: colPositions.rights[col],
-                        top: rowPositions.tops[row],
-                        bottom: rowPositions.bottoms[row]
-                    }
-                };
-            }
-        };
-        /* Cell System
-        ------------------------------------------------------------------------------------------------------------------*/
-        // FYI: the first column is the leftmost column, regardless of date
-        DayGrid.prototype.getCellEl = function (row, col) {
-            return this.cellEls[row * this.colCnt + col];
-        };
-        /* Event Drag Visualization
-        ------------------------------------------------------------------------------------------------------------------*/
-        DayGrid.prototype._renderEventDrag = function (state) {
-            if (state) {
-                this.eventRenderer.hideByHash(state.affectedInstances);
-                this.fillRenderer.renderSegs('highlight', state.segs);
-            }
-        };
-        DayGrid.prototype._unrenderEventDrag = function (state) {
-            if (state) {
-                this.eventRenderer.showByHash(state.affectedInstances);
-                this.fillRenderer.unrender('highlight');
-            }
-        };
-        /* Event Resize Visualization
-        ------------------------------------------------------------------------------------------------------------------*/
-        DayGrid.prototype._renderEventResize = function (state) {
-            if (state) {
-                this.eventRenderer.hideByHash(state.affectedInstances);
-                this.fillRenderer.renderSegs('highlight', state.segs);
-                this.mirrorRenderer.renderSegs(state.segs, { isResizing: true, sourceSeg: state.sourceSeg });
-            }
-        };
-        DayGrid.prototype._unrenderEventResize = function (state) {
-            if (state) {
-                this.eventRenderer.showByHash(state.affectedInstances);
-                this.fillRenderer.unrender('highlight');
-                this.mirrorRenderer.unrender(state.segs, { isResizing: true, sourceSeg: state.sourceSeg });
-            }
-        };
-        /* More+ Link Popover
-        ------------------------------------------------------------------------------------------------------------------*/
-        DayGrid.prototype.removeSegPopover = function () {
-            if (this.segPopover) {
-                this.segPopover.hide(); // in handler, will call segPopover's removeElement
-            }
-        };
-        // Limits the number of "levels" (vertically stacking layers of events) for each row of the grid.
-        // `levelLimit` can be false (don't limit), a number, or true (should be computed).
-        DayGrid.prototype.limitRows = function (levelLimit) {
-            var rowStructs = this.eventRenderer.rowStructs || [];
-            var row; // row #
-            var rowLevelLimit;
-            for (row = 0; row < rowStructs.length; row++) {
-                this.unlimitRow(row);
-                if (!levelLimit) {
-                    rowLevelLimit = false;
-                }
-                else if (typeof levelLimit === 'number') {
-                    rowLevelLimit = levelLimit;
-                }
-                else {
-                    rowLevelLimit = this.computeRowLevelLimit(row);
-                }
-                if (rowLevelLimit !== false) {
-                    this.limitRow(row, rowLevelLimit);
-                }
-            }
-        };
-        // Computes the number of levels a row will accomodate without going outside its bounds.
-        // Assumes the row is "rigid" (maintains a constant height regardless of what is inside).
-        // `row` is the row number.
-        DayGrid.prototype.computeRowLevelLimit = function (row) {
-            var rowEl = this.rowEls[row]; // the containing "fake" row div
-            var rowBottom = rowEl.getBoundingClientRect().bottom; // relative to viewport!
-            var trEls = core.findChildren(this.eventRenderer.rowStructs[row].tbodyEl);
-            var i;
-            var trEl;
-            // Reveal one level <tr> at a time and stop when we find one out of bounds
-            for (i = 0; i < trEls.length; i++) {
-                trEl = trEls[i];
-                trEl.classList.remove('fc-limited'); // reset to original state (reveal)
-                if (trEl.getBoundingClientRect().bottom > rowBottom) {
-                    return i;
-                }
-            }
-            return false; // should not limit at all
-        };
-        // Limits the given grid row to the maximum number of levels and injects "more" links if necessary.
-        // `row` is the row number.
-        // `levelLimit` is a number for the maximum (inclusive) number of levels allowed.
-        DayGrid.prototype.limitRow = function (row, levelLimit) {
-            var _this = this;
-            var _a = this, colCnt = _a.colCnt, isRtl = _a.isRtl;
-            var rowStruct = this.eventRenderer.rowStructs[row];
-            var moreNodes = []; // array of "more" <a> links and <td> DOM nodes
-            var col = 0; // col #, left-to-right (not chronologically)
-            var levelSegs; // array of segment objects in the last allowable level, ordered left-to-right
-            var cellMatrix; // a matrix (by level, then column) of all <td> elements in the row
-            var limitedNodes; // array of temporarily hidden level <tr> and segment <td> DOM nodes
-            var i;
-            var seg;
-            var segsBelow; // array of segment objects below `seg` in the current `col`
-            var totalSegsBelow; // total number of segments below `seg` in any of the columns `seg` occupies
-            var colSegsBelow; // array of segment arrays, below seg, one for each column (offset from segs's first column)
-            var td;
-            var rowSpan;
-            var segMoreNodes; // array of "more" <td> cells that will stand-in for the current seg's cell
-            var j;
-            var moreTd;
-            var moreWrap;
-            var moreLink;
-            // Iterates through empty level cells and places "more" links inside if need be
-            var emptyCellsUntil = function (endCol) {
-                while (col < endCol) {
-                    segsBelow = _this.getCellSegs(row, col, levelLimit);
-                    if (segsBelow.length) {
-                        td = cellMatrix[levelLimit - 1][col];
-                        moreLink = _this.renderMoreLink(row, col, segsBelow);
-                        moreWrap = core.createElement('div', null, moreLink);
-                        td.appendChild(moreWrap);
-                        moreNodes.push(moreWrap);
-                    }
-                    col++;
-                }
-            };
-            if (levelLimit && levelLimit < rowStruct.segLevels.length) { // is it actually over the limit?
-                levelSegs = rowStruct.segLevels[levelLimit - 1];
-                cellMatrix = rowStruct.cellMatrix;
-                limitedNodes = core.findChildren(rowStruct.tbodyEl).slice(levelLimit); // get level <tr> elements past the limit
-                limitedNodes.forEach(function (node) {
-                    node.classList.add('fc-limited'); // hide elements and get a simple DOM-nodes array
-                });
-                // iterate though segments in the last allowable level
-                for (i = 0; i < levelSegs.length; i++) {
-                    seg = levelSegs[i];
-                    var leftCol = isRtl ? (colCnt - 1 - seg.lastCol) : seg.firstCol;
-                    var rightCol = isRtl ? (colCnt - 1 - seg.firstCol) : seg.lastCol;
-                    emptyCellsUntil(leftCol); // process empty cells before the segment
-                    // determine *all* segments below `seg` that occupy the same columns
-                    colSegsBelow = [];
-                    totalSegsBelow = 0;
-                    while (col <= rightCol) {
-                        segsBelow = this.getCellSegs(row, col, levelLimit);
-                        colSegsBelow.push(segsBelow);
-                        totalSegsBelow += segsBelow.length;
-                        col++;
-                    }
-                    if (totalSegsBelow) { // do we need to replace this segment with one or many "more" links?
-                        td = cellMatrix[levelLimit - 1][leftCol]; // the segment's parent cell
-                        rowSpan = td.rowSpan || 1;
-                        segMoreNodes = [];
-                        // make a replacement <td> for each column the segment occupies. will be one for each colspan
-                        for (j = 0; j < colSegsBelow.length; j++) {
-                            moreTd = core.createElement('td', { className: 'fc-more-cell', rowSpan: rowSpan });
-                            segsBelow = colSegsBelow[j];
-                            moreLink = this.renderMoreLink(row, leftCol + j, [seg].concat(segsBelow) // count seg as hidden too
-                            );
-                            moreWrap = core.createElement('div', null, moreLink);
-                            moreTd.appendChild(moreWrap);
-                            segMoreNodes.push(moreTd);
-                            moreNodes.push(moreTd);
-                        }
-                        td.classList.add('fc-limited');
-                        core.insertAfterElement(td, segMoreNodes);
-                        limitedNodes.push(td);
-                    }
-                }
-                emptyCellsUntil(this.colCnt); // finish off the level
-                rowStruct.moreEls = moreNodes; // for easy undoing later
-                rowStruct.limitedEls = limitedNodes; // for easy undoing later
-            }
-        };
-        // Reveals all levels and removes all "more"-related elements for a grid's row.
-        // `row` is a row number.
-        DayGrid.prototype.unlimitRow = function (row) {
-            var rowStruct = this.eventRenderer.rowStructs[row];
-            if (rowStruct.moreEls) {
-                rowStruct.moreEls.forEach(core.removeElement);
-                rowStruct.moreEls = null;
-            }
-            if (rowStruct.limitedEls) {
-                rowStruct.limitedEls.forEach(function (limitedEl) {
-                    limitedEl.classList.remove('fc-limited');
-                });
-                rowStruct.limitedEls = null;
-            }
-        };
-        // Renders an <a> element that represents hidden event element for a cell.
-        // Responsible for attaching click handler as well.
-        DayGrid.prototype.renderMoreLink = function (row, col, hiddenSegs) {
-            var _this = this;
-            var _a = this, view = _a.view, dateEnv = _a.dateEnv;
-            var a = core.createElement('a', { className: 'fc-more' });
-            a.innerText = this.getMoreLinkText(hiddenSegs.length);
-            a.addEventListener('click', function (ev) {
-                var clickOption = _this.opt('eventLimitClick');
-                var _col = _this.isRtl ? _this.colCnt - col - 1 : col; // HACK: props.cells has different dir system?
-                var date = _this.props.cells[row][_col].date;
-                var moreEl = ev.currentTarget;
-                var dayEl = _this.getCellEl(row, col);
-                var allSegs = _this.getCellSegs(row, col);
-                // rescope the segments to be within the cell's date
-                var reslicedAllSegs = _this.resliceDaySegs(allSegs, date);
-                var reslicedHiddenSegs = _this.resliceDaySegs(hiddenSegs, date);
-                if (typeof clickOption === 'function') {
-                    // the returned value can be an atomic option
-                    clickOption = _this.publiclyTrigger('eventLimitClick', [
-                        {
-                            date: dateEnv.toDate(date),
-                            allDay: true,
-                            dayEl: dayEl,
-                            moreEl: moreEl,
-                            segs: reslicedAllSegs,
-                            hiddenSegs: reslicedHiddenSegs,
-                            jsEvent: ev,
-                            view: view
-                        }
-                    ]);
-                }
-                if (clickOption === 'popover') {
-                    _this.showSegPopover(row, col, moreEl, reslicedAllSegs);
-                }
-                else if (typeof clickOption === 'string') { // a view name
-                    view.calendar.zoomTo(date, clickOption);
-                }
-            });
-            return a;
-        };
-        // Reveals the popover that displays all events within a cell
-        DayGrid.prototype.showSegPopover = function (row, col, moreLink, segs) {
-            var _this = this;
-            var _a = this, calendar = _a.calendar, view = _a.view, theme = _a.theme;
-            var _col = this.isRtl ? this.colCnt - col - 1 : col; // HACK: props.cells has different dir system?
-            var moreWrap = moreLink.parentNode; // the <div> wrapper around the <a>
-            var topEl; // the element we want to match the top coordinate of
-            var options;
-            if (this.rowCnt === 1) {
-                topEl = view.el; // will cause the popover to cover any sort of header
-            }
-            else {
-                topEl = this.rowEls[row]; // will align with top of row
-            }
-            options = {
-                className: 'fc-more-popover ' + theme.getClass('popover'),
-                parentEl: view.el,
-                top: core.computeRect(topEl).top,
-                autoHide: true,
-                content: function (el) {
-                    _this.segPopoverTile = new DayTile(_this.context, el);
-                    _this.updateSegPopoverTile(_this.props.cells[row][_col].date, segs);
-                },
-                hide: function () {
-                    _this.segPopoverTile.destroy();
-                    _this.segPopoverTile = null;
-                    _this.segPopover.destroy();
-                    _this.segPopover = null;
-                }
-            };
-            // Determine horizontal coordinate.
-            // We use the moreWrap instead of the <td> to avoid border confusion.
-            if (this.isRtl) {
-                options.right = core.computeRect(moreWrap).right + 1; // +1 to be over cell border
-            }
-            else {
-                options.left = core.computeRect(moreWrap).left - 1; // -1 to be over cell border
-            }
-            this.segPopover = new Popover(options);
-            this.segPopover.show();
-            calendar.releaseAfterSizingTriggers(); // hack for eventPositioned
-        };
-        // Given the events within an array of segment objects, reslice them to be in a single day
-        DayGrid.prototype.resliceDaySegs = function (segs, dayDate) {
-            var dayStart = dayDate;
-            var dayEnd = core.addDays(dayStart, 1);
-            var dayRange = { start: dayStart, end: dayEnd };
-            var newSegs = [];
-            for (var _i = 0, segs_1 = segs; _i < segs_1.length; _i++) {
-                var seg = segs_1[_i];
-                var eventRange = seg.eventRange;
-                var origRange = eventRange.range;
-                var slicedRange = core.intersectRanges(origRange, dayRange);
-                if (slicedRange) {
-                    newSegs.push(__assign({}, seg, { eventRange: {
-                            def: eventRange.def,
-                            ui: __assign({}, eventRange.ui, { durationEditable: false }),
-                            instance: eventRange.instance,
-                            range: slicedRange
-                        }, isStart: seg.isStart && slicedRange.start.valueOf() === origRange.start.valueOf(), isEnd: seg.isEnd && slicedRange.end.valueOf() === origRange.end.valueOf() }));
-                }
-            }
-            return newSegs;
-        };
-        // Generates the text that should be inside a "more" link, given the number of events it represents
-        DayGrid.prototype.getMoreLinkText = function (num) {
-            var opt = this.opt('eventLimitText');
-            if (typeof opt === 'function') {
-                return opt(num);
-            }
-            else {
-                return '+' + num + ' ' + opt;
-            }
-        };
-        // Returns segments within a given cell.
-        // If `startLevel` is specified, returns only events including and below that level. Otherwise returns all segs.
-        DayGrid.prototype.getCellSegs = function (row, col, startLevel) {
-            var segMatrix = this.eventRenderer.rowStructs[row].segMatrix;
-            var level = startLevel || 0;
-            var segs = [];
-            var seg;
-            while (level < segMatrix.length) {
-                seg = segMatrix[level][col];
-                if (seg) {
-                    segs.push(seg);
-                }
-                level++;
-            }
-            return segs;
-        };
-        return DayGrid;
-    }(core.DateComponent));
-
-    var WEEK_NUM_FORMAT$1 = core.createFormatter({ week: 'numeric' });
-    /* An abstract class for the daygrid views, as well as month view. Renders one or more rows of day cells.
-    ----------------------------------------------------------------------------------------------------------------------*/
-    // It is a manager for a DayGrid subcomponent, which does most of the heavy lifting.
-    // It is responsible for managing width/height.
-    var DayGridView = /** @class */ (function (_super) {
-        __extends(DayGridView, _super);
-        function DayGridView(context, viewSpec, dateProfileGenerator, parentEl) {
-            var _this = _super.call(this, context, viewSpec, dateProfileGenerator, parentEl) || this;
-            /* Header Rendering
-            ------------------------------------------------------------------------------------------------------------------*/
-            // Generates the HTML that will go before the day-of week header cells
-            _this.renderHeadIntroHtml = function () {
-                var theme = _this.theme;
-                if (_this.colWeekNumbersVisible) {
-                    return '' +
-                        '<th class="fc-week-number ' + theme.getClass('widgetHeader') + '" ' + _this.weekNumberStyleAttr() + '>' +
-                        '<span>' + // needed for matchCellWidths
-                        core.htmlEscape(_this.opt('weekLabel')) +
-                        '</span>' +
-                        '</th>';
-                }
-                return '';
-            };
-            /* Day Grid Rendering
-            ------------------------------------------------------------------------------------------------------------------*/
-            // Generates the HTML that will go before content-skeleton cells that display the day/week numbers
-            _this.renderDayGridNumberIntroHtml = function (row, dayGrid) {
-                var dateEnv = _this.dateEnv;
-                var weekStart = dayGrid.props.cells[row][0].date;
-                if (_this.colWeekNumbersVisible) {
-                    return '' +
-                        '<td class="fc-week-number" ' + _this.weekNumberStyleAttr() + '>' +
-                        core.buildGotoAnchorHtml(// aside from link, important for matchCellWidths
-                        _this, { date: weekStart, type: 'week', forceOff: dayGrid.colCnt === 1 }, dateEnv.format(weekStart, WEEK_NUM_FORMAT$1) // inner HTML
-                        ) +
-                        '</td>';
-                }
-                return '';
-            };
-            // Generates the HTML that goes before the day bg cells for each day-row
-            _this.renderDayGridBgIntroHtml = function () {
-                var theme = _this.theme;
-                if (_this.colWeekNumbersVisible) {
-                    return '<td class="fc-week-number ' + theme.getClass('widgetContent') + '" ' + _this.weekNumberStyleAttr() + '></td>';
-                }
-                return '';
-            };
-            // Generates the HTML that goes before every other type of row generated by DayGrid.
-            // Affects mirror-skeleton and highlight-skeleton rows.
-            _this.renderDayGridIntroHtml = function () {
-                if (_this.colWeekNumbersVisible) {
-                    return '<td class="fc-week-number" ' + _this.weekNumberStyleAttr() + '></td>';
-                }
-                return '';
-            };
-            _this.el.classList.add('fc-dayGrid-view');
-            _this.el.innerHTML = _this.renderSkeletonHtml();
-            _this.scroller = new core.ScrollComponent('hidden', // overflow x
-            'auto' // overflow y
-            );
-            var dayGridContainerEl = _this.scroller.el;
-            _this.el.querySelector('.fc-body > tr > td').appendChild(dayGridContainerEl);
-            dayGridContainerEl.classList.add('fc-day-grid-container');
-            var dayGridEl = core.createElement('div', { className: 'fc-day-grid' });
-            dayGridContainerEl.appendChild(dayGridEl);
-            var cellWeekNumbersVisible;
-            if (_this.opt('weekNumbers')) {
-                if (_this.opt('weekNumbersWithinDays')) {
-                    cellWeekNumbersVisible = true;
-                    _this.colWeekNumbersVisible = false;
-                }
-                else {
-                    cellWeekNumbersVisible = false;
-                    _this.colWeekNumbersVisible = true;
-                }
-            }
-            else {
-                _this.colWeekNumbersVisible = false;
-                cellWeekNumbersVisible = false;
-            }
-            _this.dayGrid = new DayGrid(_this.context, dayGridEl, {
-                renderNumberIntroHtml: _this.renderDayGridNumberIntroHtml,
-                renderBgIntroHtml: _this.renderDayGridBgIntroHtml,
-                renderIntroHtml: _this.renderDayGridIntroHtml,
-                colWeekNumbersVisible: _this.colWeekNumbersVisible,
-                cellWeekNumbersVisible: cellWeekNumbersVisible
-            });
-            return _this;
-        }
-        DayGridView.prototype.destroy = function () {
-            _super.prototype.destroy.call(this);
-            this.dayGrid.destroy();
-            this.scroller.destroy();
-        };
-        // Builds the HTML skeleton for the view.
-        // The day-grid component will render inside of a container defined by this HTML.
-        DayGridView.prototype.renderSkeletonHtml = function () {
-            var theme = this.theme;
-            return '' +
-                '<table class="' + theme.getClass('tableGrid') + '">' +
-                (this.opt('columnHeader') ?
-                    '<thead class="fc-head">' +
-                        '<tr>' +
-                        '<td class="fc-head-container ' + theme.getClass('widgetHeader') + '">&nbsp;</td>' +
-                        '</tr>' +
-                        '</thead>' :
-                    '') +
-                '<tbody class="fc-body">' +
-                '<tr>' +
-                '<td class="' + theme.getClass('widgetContent') + '"></td>' +
-                '</tr>' +
-                '</tbody>' +
-                '</table>';
-        };
-        // Generates an HTML attribute string for setting the width of the week number column, if it is known
-        DayGridView.prototype.weekNumberStyleAttr = function () {
-            if (this.weekNumberWidth != null) {
-                return 'style="width:' + this.weekNumberWidth + 'px"';
-            }
-            return '';
-        };
-        // Determines whether each row should have a constant height
-        DayGridView.prototype.hasRigidRows = function () {
-            var eventLimit = this.opt('eventLimit');
-            return eventLimit && typeof eventLimit !== 'number';
-        };
-        /* Dimensions
-        ------------------------------------------------------------------------------------------------------------------*/
-        DayGridView.prototype.updateSize = function (isResize, viewHeight, isAuto) {
-            _super.prototype.updateSize.call(this, isResize, viewHeight, isAuto); // will call updateBaseSize. important that executes first
-            this.dayGrid.updateSize(isResize);
-        };
-        // Refreshes the horizontal dimensions of the view
-        DayGridView.prototype.updateBaseSize = function (isResize, viewHeight, isAuto) {
-            var dayGrid = this.dayGrid;
-            var eventLimit = this.opt('eventLimit');
-            var headRowEl = this.header ? this.header.el : null; // HACK
-            var scrollerHeight;
-            var scrollbarWidths;
-            // hack to give the view some height prior to dayGrid's columns being rendered
-            // TODO: separate setting height from scroller VS dayGrid.
-            if (!dayGrid.rowEls) {
-                if (!isAuto) {
-                    scrollerHeight = this.computeScrollerHeight(viewHeight);
-                    this.scroller.setHeight(scrollerHeight);
-                }
-                return;
-            }
-            if (this.colWeekNumbersVisible) {
-                // Make sure all week number cells running down the side have the same width.
-                this.weekNumberWidth = core.matchCellWidths(core.findElements(this.el, '.fc-week-number'));
-            }
-            // reset all heights to be natural
-            this.scroller.clear();
-            if (headRowEl) {
-                core.uncompensateScroll(headRowEl);
-            }
-            dayGrid.removeSegPopover(); // kill the "more" popover if displayed
-            // is the event limit a constant level number?
-            if (eventLimit && typeof eventLimit === 'number') {
-                dayGrid.limitRows(eventLimit); // limit the levels first so the height can redistribute after
-            }
-            // distribute the height to the rows
-            // (viewHeight is a "recommended" value if isAuto)
-            scrollerHeight = this.computeScrollerHeight(viewHeight);
-            this.setGridHeight(scrollerHeight, isAuto);
-            // is the event limit dynamically calculated?
-            if (eventLimit && typeof eventLimit !== 'number') {
-                dayGrid.limitRows(eventLimit); // limit the levels after the grid's row heights have been set
-            }
-            if (!isAuto) { // should we force dimensions of the scroll container?
-                this.scroller.setHeight(scrollerHeight);
-                scrollbarWidths = this.scroller.getScrollbarWidths();
-                if (scrollbarWidths.left || scrollbarWidths.right) { // using scrollbars?
-                    if (headRowEl) {
-                        core.compensateScroll(headRowEl, scrollbarWidths);
-                    }
-                    // doing the scrollbar compensation might have created text overflow which created more height. redo
-                    scrollerHeight = this.computeScrollerHeight(viewHeight);
-                    this.scroller.setHeight(scrollerHeight);
-                }
-                // guarantees the same scrollbar widths
-                this.scroller.lockOverflow(scrollbarWidths);
-            }
-        };
-        // given a desired total height of the view, returns what the height of the scroller should be
-        DayGridView.prototype.computeScrollerHeight = function (viewHeight) {
-            return viewHeight -
-                core.subtractInnerElHeight(this.el, this.scroller.el); // everything that's NOT the scroller
-        };
-        // Sets the height of just the DayGrid component in this view
-        DayGridView.prototype.setGridHeight = function (height, isAuto) {
-            if (this.opt('monthMode')) {
-                // if auto, make the height of each row the height that it would be if there were 6 weeks
-                if (isAuto) {
-                    height *= this.dayGrid.rowCnt / 6;
-                }
-                core.distributeHeight(this.dayGrid.rowEls, height, !isAuto); // if auto, don't compensate for height-hogging rows
-            }
-            else {
-                if (isAuto) {
-                    core.undistributeHeight(this.dayGrid.rowEls); // let the rows be their natural height with no expanding
-                }
-                else {
-                    core.distributeHeight(this.dayGrid.rowEls, height, true); // true = compensate for height-hogging rows
-                }
-            }
-        };
-        /* Scroll
-        ------------------------------------------------------------------------------------------------------------------*/
-        DayGridView.prototype.computeDateScroll = function (duration) {
-            return { top: 0 };
-        };
-        DayGridView.prototype.queryDateScroll = function () {
-            return { top: this.scroller.getScrollTop() };
-        };
-        DayGridView.prototype.applyDateScroll = function (scroll) {
-            if (scroll.top !== undefined) {
-                this.scroller.setScrollTop(scroll.top);
-            }
-        };
-        return DayGridView;
-    }(core.View));
-    DayGridView.prototype.dateProfileGeneratorClass = DayGridDateProfileGenerator;
-
-    var SimpleDayGrid = /** @class */ (function (_super) {
-        __extends(SimpleDayGrid, _super);
-        function SimpleDayGrid(context, dayGrid) {
-            var _this = _super.call(this, context, dayGrid.el) || this;
-            _this.slicer = new DayGridSlicer();
-            _this.dayGrid = dayGrid;
-            context.calendar.registerInteractiveComponent(_this, { el: _this.dayGrid.el });
-            return _this;
-        }
-        SimpleDayGrid.prototype.destroy = function () {
-            _super.prototype.destroy.call(this);
-            this.calendar.unregisterInteractiveComponent(this);
-        };
-        SimpleDayGrid.prototype.render = function (props) {
-            var dayGrid = this.dayGrid;
-            var dateProfile = props.dateProfile, dayTable = props.dayTable;
-            dayGrid.receiveProps(__assign({}, this.slicer.sliceProps(props, dateProfile, props.nextDayThreshold, dayGrid, dayTable), { dateProfile: dateProfile, cells: dayTable.cells, isRigid: props.isRigid }));
-        };
-        SimpleDayGrid.prototype.buildPositionCaches = function () {
-            this.dayGrid.buildPositionCaches();
-        };
-        SimpleDayGrid.prototype.queryHit = function (positionLeft, positionTop) {
-            var rawHit = this.dayGrid.positionToHit(positionLeft, positionTop);
-            if (rawHit) {
-                return {
-                    component: this.dayGrid,
-                    dateSpan: rawHit.dateSpan,
-                    dayEl: rawHit.dayEl,
-                    rect: {
-                        left: rawHit.relativeRect.left,
-                        right: rawHit.relativeRect.right,
-                        top: rawHit.relativeRect.top,
-                        bottom: rawHit.relativeRect.bottom
-                    },
-                    layer: 0
-                };
-            }
-        };
-        return SimpleDayGrid;
-    }(core.DateComponent));
-    var DayGridSlicer = /** @class */ (function (_super) {
-        __extends(DayGridSlicer, _super);
-        function DayGridSlicer() {
-            return _super !== null && _super.apply(this, arguments) || this;
-        }
-        DayGridSlicer.prototype.sliceRange = function (dateRange, dayTable) {
-            return dayTable.sliceRange(dateRange);
-        };
-        return DayGridSlicer;
-    }(core.Slicer));
-
-    var DayGridView$1 = /** @class */ (function (_super) {
-        __extends(DayGridView, _super);
-        function DayGridView(_context, viewSpec, dateProfileGenerator, parentEl) {
-            var _this = _super.call(this, _context, viewSpec, dateProfileGenerator, parentEl) || this;
-            _this.buildDayTable = core.memoize(buildDayTable);
-            if (_this.opt('columnHeader')) {
-                _this.header = new core.DayHeader(_this.context, _this.el.querySelector('.fc-head-container'));
-            }
-            _this.simpleDayGrid = new SimpleDayGrid(_this.context, _this.dayGrid);
-            return _this;
-        }
-        DayGridView.prototype.destroy = function () {
-            _super.prototype.destroy.call(this);
-            if (this.header) {
-                this.header.destroy();
-            }
-            this.simpleDayGrid.destroy();
-        };
-        DayGridView.prototype.render = function (props) {
-            _super.prototype.render.call(this, props);
-            var dateProfile = this.props.dateProfile;
-            var dayTable = this.dayTable =
-                this.buildDayTable(dateProfile, this.dateProfileGenerator);
-            if (this.header) {
-                this.header.receiveProps({
-                    dateProfile: dateProfile,
-                    dates: dayTable.headerDates,
-                    datesRepDistinctDays: dayTable.rowCnt === 1,
-                    renderIntroHtml: this.renderHeadIntroHtml
-                });
-            }
-            this.simpleDayGrid.receiveProps({
-                dateProfile: dateProfile,
-                dayTable: dayTable,
-                businessHours: props.businessHours,
-                dateSelection: props.dateSelection,
-                eventStore: props.eventStore,
-                eventUiBases: props.eventUiBases,
-                eventSelection: props.eventSelection,
-                eventDrag: props.eventDrag,
-                eventResize: props.eventResize,
-                isRigid: this.hasRigidRows(),
-                nextDayThreshold: this.nextDayThreshold
-            });
-        };
-        return DayGridView;
-    }(DayGridView));
-    function buildDayTable(dateProfile, dateProfileGenerator) {
-        var daySeries = new core.DaySeries(dateProfile.renderRange, dateProfileGenerator);
-        return new core.DayTable(daySeries, /year|month|week/.test(dateProfile.currentRangeUnit));
-    }
-
-    var main = core.createPlugin({
-        defaultView: 'dayGridMonth',
-        views: {
-            dayGrid: DayGridView$1,
-            dayGridDay: {
-                type: 'dayGrid',
-                duration: { days: 1 }
-            },
-            dayGridWeek: {
-                type: 'dayGrid',
-                duration: { weeks: 1 }
-            },
-            dayGridMonth: {
-                type: 'dayGrid',
-                duration: { months: 1 },
-                monthMode: true,
-                fixedWeekCount: true
-            }
-        }
-    });
-
-    exports.AbstractDayGridView = DayGridView;
-    exports.DayBgRow = DayBgRow;
-    exports.DayGrid = DayGrid;
-    exports.DayGridSlicer = DayGridSlicer;
-    exports.DayGridView = DayGridView$1;
-    exports.SimpleDayGrid = SimpleDayGrid;
-    exports.buildBasicDayTable = buildDayTable;
-    exports.default = main;
-
-    Object.defineProperty(exports, '__esModule', { value: true });
-
-}));
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/daygrid/main.min.css b/AKPlan/static/AKPlan/vendor/fullcalendar/daygrid/main.min.css
deleted file mode 100644
index 55a5724128e7b4a119ad0873bdd48b1406c15a8c..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/daygrid/main.min.css
+++ /dev/null
@@ -1 +0,0 @@
-.fc-dayGridDay-view .fc-content-skeleton,.fc-dayGridWeek-view .fc-content-skeleton{padding-bottom:1em}.fc-dayGrid-view .fc-body .fc-row{min-height:4em}.fc-row.fc-rigid{overflow:hidden}.fc-row.fc-rigid .fc-content-skeleton{position:absolute;top:0;left:0;right:0}.fc-day-top.fc-other-month{opacity:.3}.fc-dayGrid-view .fc-day-number,.fc-dayGrid-view .fc-week-number{padding:2px}.fc-dayGrid-view th.fc-day-number,.fc-dayGrid-view th.fc-week-number{padding:0 2px}.fc-ltr .fc-dayGrid-view .fc-day-top .fc-day-number{float:right}.fc-rtl .fc-dayGrid-view .fc-day-top .fc-day-number{float:left}.fc-ltr .fc-dayGrid-view .fc-day-top .fc-week-number{float:left;border-radius:0 0 3px}.fc-rtl .fc-dayGrid-view .fc-day-top .fc-week-number{float:right;border-radius:0 0 0 3px}.fc-dayGrid-view .fc-day-top .fc-week-number{min-width:1.5em;text-align:center;background-color:#f2f2f2;color:grey}.fc-dayGrid-view td.fc-week-number{text-align:center}.fc-dayGrid-view td.fc-week-number>*{display:inline-block;min-width:1.25em}
\ No newline at end of file
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/daygrid/main.min.js b/AKPlan/static/AKPlan/vendor/fullcalendar/daygrid/main.min.js
deleted file mode 100644
index 2f4c0d45fea64ac338b7e5d41d542d0fe7afd1ec..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/daygrid/main.min.js
+++ /dev/null
@@ -1,6 +0,0 @@
-/*!
-FullCalendar Day Grid Plugin v4.3.0
-Docs & License: https://fullcalendar.io/
-(c) 2019 Adam Shaw
-*/
-!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("@fullcalendar/core")):"function"==typeof define&&define.amd?define(["exports","@fullcalendar/core"],t):t((e=e||self).FullCalendarDayGrid={},e.FullCalendar)}(this,function(e,t){"use strict";var r=function(e,t){return(r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])})(e,t)};function n(e,t){function n(){this.constructor=e}r(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}var i=function(){return(i=Object.assign||function(e){for(var t,r=1,n=arguments.length;r<n;r++)for(var i in t=arguments[r])Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i]);return e}).apply(this,arguments)},o=function(e){function r(){return null!==e&&e.apply(this,arguments)||this}return n(r,e),r.prototype.buildRenderRange=function(r,n,i){var o,s=this.dateEnv,l=e.prototype.buildRenderRange.call(this,r,n,i),a=l.start,d=l.end;if(/^(year|month)$/.test(n)&&(a=s.startOfWeek(a),(o=s.startOfWeek(d)).valueOf()!==d.valueOf()&&(d=t.addWeeks(o,1))),this.options.monthMode&&this.options.fixedWeekCount){var c=Math.ceil(t.diffWeeks(a,d));d=t.addWeeks(d,6-c)}return{start:a,end:d}},r}(t.DateProfileGenerator),s=function(){function e(e){var t=this;this.isHidden=!0,this.margin=10,this.documentMousedown=function(e){t.el&&!t.el.contains(e.target)&&t.hide()},this.options=e}return e.prototype.show=function(){this.isHidden&&(this.el||this.render(),this.el.style.display="",this.position(),this.isHidden=!1,this.trigger("show"))},e.prototype.hide=function(){this.isHidden||(this.el.style.display="none",this.isHidden=!0,this.trigger("hide"))},e.prototype.render=function(){var e=this,r=this.options,n=this.el=t.createElement("div",{className:"fc-popover "+(r.className||""),style:{top:"0",left:"0"}});"function"==typeof r.content&&r.content(n),r.parentEl.appendChild(n),t.listenBySelector(n,"click",".fc-close",function(t){e.hide()}),r.autoHide&&document.addEventListener("mousedown",this.documentMousedown)},e.prototype.destroy=function(){this.hide(),this.el&&(t.removeElement(this.el),this.el=null),document.removeEventListener("mousedown",this.documentMousedown)},e.prototype.position=function(){var e,r,n=this.options,i=this.el,o=i.getBoundingClientRect(),s=t.computeRect(i.offsetParent),l=t.computeClippingRect(n.parentEl);e=n.top||0,r=void 0!==n.left?n.left:void 0!==n.right?n.right-o.width:0,e=Math.min(e,l.bottom-o.height-this.margin),e=Math.max(e,l.top+this.margin),r=Math.min(r,l.right-o.width-this.margin),r=Math.max(r,l.left+this.margin),t.applyStyle(i,{top:e-s.top,left:r-s.left})},e.prototype.trigger=function(e){this.options[e]&&this.options[e].apply(this,Array.prototype.slice.call(arguments,1))},e}(),l=function(e){function r(){return null!==e&&e.apply(this,arguments)||this}return n(r,e),r.prototype.renderSegHtml=function(e,r){var n,i,o=this.context,s=o.view,l=o.options,a=e.eventRange,d=a.def,c=a.ui,h=d.allDay,p=s.computeEventDraggable(d,c),u=h&&e.isStart&&s.computeEventStartResizable(d,c),f=h&&e.isEnd&&s.computeEventEndResizable(d,c),g=this.getSegClasses(e,p,u||f,r),m=t.cssToStr(this.getSkinCss(c)),y="";return g.unshift("fc-day-grid-event","fc-h-event"),e.isStart&&(n=this.getTimeText(a))&&(y='<span class="fc-time">'+t.htmlEscape(n)+"</span>"),i='<span class="fc-title">'+(t.htmlEscape(d.title||"")||"&nbsp;")+"</span>",'<a class="'+g.join(" ")+'"'+(d.url?' href="'+t.htmlEscape(d.url)+'"':"")+(m?' style="'+m+'"':"")+'><div class="fc-content">'+("rtl"===l.dir?i+" "+y:y+" "+i)+"</div>"+(u?'<div class="fc-resizer fc-start-resizer"></div>':"")+(f?'<div class="fc-resizer fc-end-resizer"></div>':"")+"</a>"},r.prototype.computeEventTimeFormat=function(){return{hour:"numeric",minute:"2-digit",omitZeroMinute:!0,meridiem:"narrow"}},r.prototype.computeDisplayEventEnd=function(){return!1},r}(t.FgEventRenderer),a=function(e){function r(t){var r=e.call(this,t.context)||this;return r.dayGrid=t,r}return n(r,e),r.prototype.attachSegs=function(e,t){var r=this.rowStructs=this.renderSegRows(e);this.dayGrid.rowEls.forEach(function(e,t){e.querySelector(".fc-content-skeleton > table").appendChild(r[t].tbodyEl)}),t||this.dayGrid.removeSegPopover()},r.prototype.detachSegs=function(){for(var e,r=this.rowStructs||[];e=r.pop();)t.removeElement(e.tbodyEl);this.rowStructs=null},r.prototype.renderSegRows=function(e){var t,r,n=[];for(t=this.groupSegRows(e),r=0;r<t.length;r++)n.push(this.renderSegRow(r,t[r]));return n},r.prototype.renderSegRow=function(e,r){var n,i,o,s,l,a,d,c=this.dayGrid,h=c.colCnt,p=c.isRtl,u=this.buildSegLevels(r),f=Math.max(1,u.length),g=document.createElement("tbody"),m=[],y=[],v=[];function b(e){for(;o<e;)(d=(v[n-1]||[])[o])?d.rowSpan=(d.rowSpan||1)+1:(d=document.createElement("td"),s.appendChild(d)),y[n][o]=d,v[n][o]=d,o++}for(n=0;n<f;n++){if(i=u[n],o=0,s=document.createElement("tr"),m.push([]),y.push([]),v.push([]),i)for(l=0;l<i.length;l++){a=i[l];var w=p?h-1-a.lastCol:a.firstCol,S=p?h-1-a.firstCol:a.lastCol;for(b(w),d=t.createElement("td",{className:"fc-event-container"},a.el),w!==S?d.colSpan=S-w+1:v[n][o]=d;o<=S;)y[n][o]=d,m[n][o]=a,o++;s.appendChild(d)}b(h);var C=c.renderProps.renderIntroHtml();C&&(c.isRtl?t.appendToElement(s,C):t.prependToElement(s,C)),g.appendChild(s)}return{row:e,tbodyEl:g,cellMatrix:y,segMatrix:m,segLevels:u,segs:r}},r.prototype.buildSegLevels=function(e){var t,r,n,i=this.dayGrid,o=i.isRtl,s=i.colCnt,l=[];for(e=this.sortEventSegs(e),t=0;t<e.length;t++){for(r=e[t],n=0;n<l.length&&d(r,l[n]);n++);r.level=n,r.leftCol=o?s-1-r.lastCol:r.firstCol,r.rightCol=o?s-1-r.firstCol:r.lastCol,(l[n]||(l[n]=[])).push(r)}for(n=0;n<l.length;n++)l[n].sort(c);return l},r.prototype.groupSegRows=function(e){var t,r=[];for(t=0;t<this.dayGrid.rowCnt;t++)r.push([]);for(t=0;t<e.length;t++)r[e[t].row].push(e[t]);return r},r.prototype.computeDisplayEventEnd=function(){return 1===this.dayGrid.colCnt},r}(l);function d(e,t){var r,n;for(r=0;r<t.length;r++)if((n=t[r]).firstCol<=e.lastCol&&n.lastCol>=e.firstCol)return!0;return!1}function c(e,t){return e.leftCol-t.leftCol}var h=function(e){function r(){return null!==e&&e.apply(this,arguments)||this}return n(r,e),r.prototype.attachSegs=function(e,r){var n=r.sourceSeg,i=this.rowStructs=this.renderSegRows(e);this.dayGrid.rowEls.forEach(function(e,r){var o,s,l=t.htmlToElement('<div class="fc-mirror-skeleton"><table></table></div>');n&&n.row===r?o=n.el:(o=e.querySelector(".fc-content-skeleton tbody"))||(o=e.querySelector(".fc-content-skeleton table")),s=o.getBoundingClientRect().top-e.getBoundingClientRect().top,l.style.top=s+"px",l.querySelector("table").appendChild(i[r].tbodyEl),e.appendChild(l)})},r}(a),p=function(e){function r(t){var r=e.call(this,t.context)||this;return r.fillSegTag="td",r.dayGrid=t,r}return n(r,e),r.prototype.renderSegs=function(t,r){"bgEvent"===t&&(r=r.filter(function(e){return e.eventRange.def.allDay})),e.prototype.renderSegs.call(this,t,r)},r.prototype.attachSegs=function(e,t){var r,n,i,o=[];for(r=0;r<t.length;r++)n=t[r],i=this.renderFillRow(e,n),this.dayGrid.rowEls[n.row].appendChild(i),o.push(i);return o},r.prototype.renderFillRow=function(e,r){var n,i,o,s=this.dayGrid,l=s.colCnt,a=s.isRtl,d=a?l-1-r.lastCol:r.firstCol,c=(a?l-1-r.firstCol:r.lastCol)+1;n="businessHours"===e?"bgevent":e.toLowerCase(),o=(i=t.htmlToElement('<div class="fc-'+n+'-skeleton"><table><tr></tr></table></div>')).getElementsByTagName("tr")[0],d>0&&t.appendToElement(o,new Array(d+1).join('<td style="pointer-events:none"></td>')),r.el.colSpan=c-d,o.appendChild(r.el),c<l&&t.appendToElement(o,new Array(l-c+1).join('<td style="pointer-events:none"></td>'));var h=s.renderProps.renderIntroHtml();return h&&(s.isRtl?t.appendToElement(o,h):t.prependToElement(o,h)),i},r}(t.FillRenderer),u=function(e){function r(r,n){var i=e.call(this,r,n)||this,o=i.eventRenderer=new f(i),s=i.renderFrame=t.memoizeRendering(i._renderFrame);return i.renderFgEvents=t.memoizeRendering(o.renderSegs.bind(o),o.unrender.bind(o),[s]),i.renderEventSelection=t.memoizeRendering(o.selectByInstanceId.bind(o),o.unselectByInstanceId.bind(o),[i.renderFgEvents]),i.renderEventDrag=t.memoizeRendering(o.hideByHash.bind(o),o.showByHash.bind(o),[s]),i.renderEventResize=t.memoizeRendering(o.hideByHash.bind(o),o.showByHash.bind(o),[s]),r.calendar.registerInteractiveComponent(i,{el:i.el,useEventCenter:!1}),i}return n(r,e),r.prototype.render=function(e){this.renderFrame(e.date),this.renderFgEvents(e.fgSegs),this.renderEventSelection(e.eventSelection),this.renderEventDrag(e.eventDragInstances),this.renderEventResize(e.eventResizeInstances)},r.prototype.destroy=function(){e.prototype.destroy.call(this),this.renderFrame.unrender(),this.calendar.unregisterInteractiveComponent(this)},r.prototype._renderFrame=function(e){var r=this.theme,n=this.dateEnv.format(e,t.createFormatter(this.opt("dayPopoverFormat")));this.el.innerHTML='<div class="fc-header '+r.getClass("popoverHeader")+'"><span class="fc-title">'+t.htmlEscape(n)+'</span><span class="fc-close '+r.getIconClass("close")+'"></span></div><div class="fc-body '+r.getClass("popoverContent")+'"><div class="fc-event-container"></div></div>',this.segContainerEl=this.el.querySelector(".fc-event-container")},r.prototype.queryHit=function(e,r,n,i){var o=this.props.date;if(e<n&&r<i)return{component:this,dateSpan:{allDay:!0,range:{start:o,end:t.addDays(o,1)}},dayEl:this.el,rect:{left:0,top:0,right:n,bottom:i},layer:1}},r}(t.DateComponent),f=function(e){function r(t){var r=e.call(this,t.context)||this;return r.dayTile=t,r}return n(r,e),r.prototype.attachSegs=function(e){for(var t=0,r=e;t<r.length;t++){var n=r[t];this.dayTile.segContainerEl.appendChild(n.el)}},r.prototype.detachSegs=function(e){for(var r=0,n=e;r<n.length;r++){var i=n[r];t.removeElement(i.el)}},r}(l),g=function(){function e(e){this.context=e}return e.prototype.renderHtml=function(e){var t=[];e.renderIntroHtml&&t.push(e.renderIntroHtml());for(var r=0,n=e.cells;r<n.length;r++){var i=n[r];t.push(m(i.date,e.dateProfile,this.context,i.htmlAttrs))}return e.cells.length||t.push('<td class="fc-day '+this.context.theme.getClass("widgetContent")+'"></td>'),"rtl"===this.context.options.dir&&t.reverse(),"<tr>"+t.join("")+"</tr>"},e}();function m(e,r,n,i){var o=n.dateEnv,s=n.theme,l=t.rangeContainsMarker(r.activeRange,e),a=t.getDayClasses(e,r,n);return a.unshift("fc-day",s.getClass("widgetContent")),'<td class="'+a.join(" ")+'"'+(l?' data-date="'+o.formatIso(e,{omitTime:!0})+'"':"")+(i?" "+i:"")+"></td>"}var y=t.createFormatter({day:"numeric"}),v=t.createFormatter({week:"numeric"}),b=function(e){function r(r,n,i){var o=e.call(this,r,n)||this;o.bottomCoordPadding=0,o.isCellSizesDirty=!1;var s=o.eventRenderer=new a(o),l=o.fillRenderer=new p(o);o.mirrorRenderer=new h(o);var d=o.renderCells=t.memoizeRendering(o._renderCells,o._unrenderCells);return o.renderBusinessHours=t.memoizeRendering(l.renderSegs.bind(l,"businessHours"),l.unrender.bind(l,"businessHours"),[d]),o.renderDateSelection=t.memoizeRendering(l.renderSegs.bind(l,"highlight"),l.unrender.bind(l,"highlight"),[d]),o.renderBgEvents=t.memoizeRendering(l.renderSegs.bind(l,"bgEvent"),l.unrender.bind(l,"bgEvent"),[d]),o.renderFgEvents=t.memoizeRendering(s.renderSegs.bind(s),s.unrender.bind(s),[d]),o.renderEventSelection=t.memoizeRendering(s.selectByInstanceId.bind(s),s.unselectByInstanceId.bind(s),[o.renderFgEvents]),o.renderEventDrag=t.memoizeRendering(o._renderEventDrag,o._unrenderEventDrag,[d]),o.renderEventResize=t.memoizeRendering(o._renderEventResize,o._unrenderEventResize,[d]),o.renderProps=i,o}return n(r,e),r.prototype.render=function(e){var t=e.cells;this.rowCnt=t.length,this.colCnt=t[0].length,this.renderCells(t,e.isRigid),this.renderBusinessHours(e.businessHourSegs),this.renderDateSelection(e.dateSelectionSegs),this.renderBgEvents(e.bgEventSegs),this.renderFgEvents(e.fgEventSegs),this.renderEventSelection(e.eventSelection),this.renderEventDrag(e.eventDrag),this.renderEventResize(e.eventResize),this.segPopoverTile&&this.updateSegPopoverTile()},r.prototype.destroy=function(){e.prototype.destroy.call(this),this.renderCells.unrender()},r.prototype.getCellRange=function(e,r){var n=this.props.cells[e][r].date;return{start:n,end:t.addDays(n,1)}},r.prototype.updateSegPopoverTile=function(e,t){var r=this.props;this.segPopoverTile.receiveProps({date:e||this.segPopoverTile.props.date,fgSegs:t||this.segPopoverTile.props.fgSegs,eventSelection:r.eventSelection,eventDragInstances:r.eventDrag?r.eventDrag.affectedInstances:null,eventResizeInstances:r.eventResize?r.eventResize.affectedInstances:null})},r.prototype._renderCells=function(e,r){var n,i,o=this.view,s=this.dateEnv,l=this.rowCnt,a=this.colCnt,d="";for(n=0;n<l;n++)d+=this.renderDayRowHtml(n,r);for(this.el.innerHTML=d,this.rowEls=t.findElements(this.el,".fc-row"),this.cellEls=t.findElements(this.el,".fc-day, .fc-disabled-day"),this.isRtl&&this.cellEls.reverse(),this.rowPositions=new t.PositionCache(this.el,this.rowEls,!1,!0),this.colPositions=new t.PositionCache(this.el,this.cellEls.slice(0,a),!0,!1),n=0;n<l;n++)for(i=0;i<a;i++)this.publiclyTrigger("dayRender",[{date:s.toDate(e[n][i].date),el:this.getCellEl(n,i),view:o}]);this.isCellSizesDirty=!0},r.prototype._unrenderCells=function(){this.removeSegPopover()},r.prototype.renderDayRowHtml=function(e,t){var r=this.theme,n=["fc-row","fc-week",r.getClass("dayRow")];t&&n.push("fc-rigid");var i=new g(this.context);return'<div class="'+n.join(" ")+'"><div class="fc-bg"><table class="'+r.getClass("tableGrid")+'">'+i.renderHtml({cells:this.props.cells[e],dateProfile:this.props.dateProfile,renderIntroHtml:this.renderProps.renderBgIntroHtml})+'</table></div><div class="fc-content-skeleton"><table>'+(this.getIsNumbersVisible()?"<thead>"+this.renderNumberTrHtml(e)+"</thead>":"")+"</table></div></div>"},r.prototype.getIsNumbersVisible=function(){return this.getIsDayNumbersVisible()||this.renderProps.cellWeekNumbersVisible||this.renderProps.colWeekNumbersVisible},r.prototype.getIsDayNumbersVisible=function(){return this.rowCnt>1},r.prototype.renderNumberTrHtml=function(e){var t=this.renderProps.renderNumberIntroHtml(e,this);return"<tr>"+(this.isRtl?"":t)+this.renderNumberCellsHtml(e)+(this.isRtl?t:"")+"</tr>"},r.prototype.renderNumberCellsHtml=function(e){var t,r,n=[];for(t=0;t<this.colCnt;t++)r=this.props.cells[e][t].date,n.push(this.renderNumberCellHtml(r));return this.isRtl&&n.reverse(),n.join("")},r.prototype.renderNumberCellHtml=function(e){var r,n,i=this.view,o=this.dateEnv,s="",l=t.rangeContainsMarker(this.props.dateProfile.activeRange,e),a=this.getIsDayNumbersVisible()&&l;return a||this.renderProps.cellWeekNumbersVisible?((r=t.getDayClasses(e,this.props.dateProfile,this.context)).unshift("fc-day-top"),this.renderProps.cellWeekNumbersVisible&&(n=o.weekDow),s+='<td class="'+r.join(" ")+'"'+(l?' data-date="'+o.formatIso(e,{omitTime:!0})+'"':"")+">",this.renderProps.cellWeekNumbersVisible&&e.getUTCDay()===n&&(s+=t.buildGotoAnchorHtml(i,{date:e,type:"week"},{class:"fc-week-number"},o.format(e,v))),a&&(s+=t.buildGotoAnchorHtml(i,e,{class:"fc-day-number"},o.format(e,y))),s+="</td>"):"<td></td>"},r.prototype.updateSize=function(e){var t=this.fillRenderer,r=this.eventRenderer,n=this.mirrorRenderer;(e||this.isCellSizesDirty||this.view.calendar.isEventsUpdated)&&(this.buildPositionCaches(),this.isCellSizesDirty=!1),t.computeSizes(e),r.computeSizes(e),n.computeSizes(e),t.assignSizes(e),r.assignSizes(e),n.assignSizes(e)},r.prototype.buildPositionCaches=function(){this.buildColPositions(),this.buildRowPositions()},r.prototype.buildColPositions=function(){this.colPositions.build()},r.prototype.buildRowPositions=function(){this.rowPositions.build(),this.rowPositions.bottoms[this.rowCnt-1]+=this.bottomCoordPadding},r.prototype.positionToHit=function(e,t){var r=this.colPositions,n=this.rowPositions,i=r.leftToIndex(e),o=n.topToIndex(t);if(null!=o&&null!=i)return{row:o,col:i,dateSpan:{range:this.getCellRange(o,i),allDay:!0},dayEl:this.getCellEl(o,i),relativeRect:{left:r.lefts[i],right:r.rights[i],top:n.tops[o],bottom:n.bottoms[o]}}},r.prototype.getCellEl=function(e,t){return this.cellEls[e*this.colCnt+t]},r.prototype._renderEventDrag=function(e){e&&(this.eventRenderer.hideByHash(e.affectedInstances),this.fillRenderer.renderSegs("highlight",e.segs))},r.prototype._unrenderEventDrag=function(e){e&&(this.eventRenderer.showByHash(e.affectedInstances),this.fillRenderer.unrender("highlight"))},r.prototype._renderEventResize=function(e){e&&(this.eventRenderer.hideByHash(e.affectedInstances),this.fillRenderer.renderSegs("highlight",e.segs),this.mirrorRenderer.renderSegs(e.segs,{isResizing:!0,sourceSeg:e.sourceSeg}))},r.prototype._unrenderEventResize=function(e){e&&(this.eventRenderer.showByHash(e.affectedInstances),this.fillRenderer.unrender("highlight"),this.mirrorRenderer.unrender(e.segs,{isResizing:!0,sourceSeg:e.sourceSeg}))},r.prototype.removeSegPopover=function(){this.segPopover&&this.segPopover.hide()},r.prototype.limitRows=function(e){var t,r,n=this.eventRenderer.rowStructs||[];for(t=0;t<n.length;t++)this.unlimitRow(t),!1!==(r=!!e&&("number"==typeof e?e:this.computeRowLevelLimit(t)))&&this.limitRow(t,r)},r.prototype.computeRowLevelLimit=function(e){var r,n,i=this.rowEls[e].getBoundingClientRect().bottom,o=t.findChildren(this.eventRenderer.rowStructs[e].tbodyEl);for(r=0;r<o.length;r++)if((n=o[r]).classList.remove("fc-limited"),n.getBoundingClientRect().bottom>i)return r;return!1},r.prototype.limitRow=function(e,r){var n,i,o,s,l,a,d,c,h,p,u,f,g,m,y,v=this,b=this.colCnt,w=this.isRtl,S=this.eventRenderer.rowStructs[e],C=[],E=0,R=function(n){for(;E<n;)(a=v.getCellSegs(e,E,r)).length&&(h=i[r-1][E],y=v.renderMoreLink(e,E,a),m=t.createElement("div",null,y),h.appendChild(m),C.push(m)),E++};if(r&&r<S.segLevels.length){for(n=S.segLevels[r-1],i=S.cellMatrix,(o=t.findChildren(S.tbodyEl).slice(r)).forEach(function(e){e.classList.add("fc-limited")}),s=0;s<n.length;s++){l=n[s];var H=w?b-1-l.lastCol:l.firstCol,D=w?b-1-l.firstCol:l.lastCol;for(R(H),c=[],d=0;E<=D;)a=this.getCellSegs(e,E,r),c.push(a),d+=a.length,E++;if(d){for(p=(h=i[r-1][H]).rowSpan||1,u=[],f=0;f<c.length;f++)g=t.createElement("td",{className:"fc-more-cell",rowSpan:p}),a=c[f],y=this.renderMoreLink(e,H+f,[l].concat(a)),m=t.createElement("div",null,y),g.appendChild(m),u.push(g),C.push(g);h.classList.add("fc-limited"),t.insertAfterElement(h,u),o.push(h)}}R(this.colCnt),S.moreEls=C,S.limitedEls=o}},r.prototype.unlimitRow=function(e){var r=this.eventRenderer.rowStructs[e];r.moreEls&&(r.moreEls.forEach(t.removeElement),r.moreEls=null),r.limitedEls&&(r.limitedEls.forEach(function(e){e.classList.remove("fc-limited")}),r.limitedEls=null)},r.prototype.renderMoreLink=function(e,r,n){var i=this,o=this.view,s=this.dateEnv,l=t.createElement("a",{className:"fc-more"});return l.innerText=this.getMoreLinkText(n.length),l.addEventListener("click",function(t){var l=i.opt("eventLimitClick"),a=i.isRtl?i.colCnt-r-1:r,d=i.props.cells[e][a].date,c=t.currentTarget,h=i.getCellEl(e,r),p=i.getCellSegs(e,r),u=i.resliceDaySegs(p,d),f=i.resliceDaySegs(n,d);"function"==typeof l&&(l=i.publiclyTrigger("eventLimitClick",[{date:s.toDate(d),allDay:!0,dayEl:h,moreEl:c,segs:u,hiddenSegs:f,jsEvent:t,view:o}])),"popover"===l?i.showSegPopover(e,r,c,u):"string"==typeof l&&o.calendar.zoomTo(d,l)}),l},r.prototype.showSegPopover=function(e,r,n,i){var o,l,a=this,d=this.calendar,c=this.view,h=this.theme,p=this.isRtl?this.colCnt-r-1:r,f=n.parentNode;o=1===this.rowCnt?c.el:this.rowEls[e],l={className:"fc-more-popover "+h.getClass("popover"),parentEl:c.el,top:t.computeRect(o).top,autoHide:!0,content:function(t){a.segPopoverTile=new u(a.context,t),a.updateSegPopoverTile(a.props.cells[e][p].date,i)},hide:function(){a.segPopoverTile.destroy(),a.segPopoverTile=null,a.segPopover.destroy(),a.segPopover=null}},this.isRtl?l.right=t.computeRect(f).right+1:l.left=t.computeRect(f).left-1,this.segPopover=new s(l),this.segPopover.show(),d.releaseAfterSizingTriggers()},r.prototype.resliceDaySegs=function(e,r){for(var n=r,o={start:n,end:t.addDays(n,1)},s=[],l=0,a=e;l<a.length;l++){var d=a[l],c=d.eventRange,h=c.range,p=t.intersectRanges(h,o);p&&s.push(i({},d,{eventRange:{def:c.def,ui:i({},c.ui,{durationEditable:!1}),instance:c.instance,range:p},isStart:d.isStart&&p.start.valueOf()===h.start.valueOf(),isEnd:d.isEnd&&p.end.valueOf()===h.end.valueOf()}))}return s},r.prototype.getMoreLinkText=function(e){var t=this.opt("eventLimitText");return"function"==typeof t?t(e):"+"+e+" "+t},r.prototype.getCellSegs=function(e,t,r){for(var n,i=this.eventRenderer.rowStructs[e].segMatrix,o=r||0,s=[];o<i.length;)(n=i[o][t])&&s.push(n),o++;return s},r}(t.DateComponent),w=t.createFormatter({week:"numeric"}),S=function(e){function r(r,n,i,o){var s=e.call(this,r,n,i,o)||this;s.renderHeadIntroHtml=function(){var e=s.theme;return s.colWeekNumbersVisible?'<th class="fc-week-number '+e.getClass("widgetHeader")+'" '+s.weekNumberStyleAttr()+"><span>"+t.htmlEscape(s.opt("weekLabel"))+"</span></th>":""},s.renderDayGridNumberIntroHtml=function(e,r){var n=s.dateEnv,i=r.props.cells[e][0].date;return s.colWeekNumbersVisible?'<td class="fc-week-number" '+s.weekNumberStyleAttr()+">"+t.buildGotoAnchorHtml(s,{date:i,type:"week",forceOff:1===r.colCnt},n.format(i,w))+"</td>":""},s.renderDayGridBgIntroHtml=function(){var e=s.theme;return s.colWeekNumbersVisible?'<td class="fc-week-number '+e.getClass("widgetContent")+'" '+s.weekNumberStyleAttr()+"></td>":""},s.renderDayGridIntroHtml=function(){return s.colWeekNumbersVisible?'<td class="fc-week-number" '+s.weekNumberStyleAttr()+"></td>":""},s.el.classList.add("fc-dayGrid-view"),s.el.innerHTML=s.renderSkeletonHtml(),s.scroller=new t.ScrollComponent("hidden","auto");var l=s.scroller.el;s.el.querySelector(".fc-body > tr > td").appendChild(l),l.classList.add("fc-day-grid-container");var a,d=t.createElement("div",{className:"fc-day-grid"});return l.appendChild(d),s.opt("weekNumbers")?s.opt("weekNumbersWithinDays")?(a=!0,s.colWeekNumbersVisible=!1):(a=!1,s.colWeekNumbersVisible=!0):(s.colWeekNumbersVisible=!1,a=!1),s.dayGrid=new b(s.context,d,{renderNumberIntroHtml:s.renderDayGridNumberIntroHtml,renderBgIntroHtml:s.renderDayGridBgIntroHtml,renderIntroHtml:s.renderDayGridIntroHtml,colWeekNumbersVisible:s.colWeekNumbersVisible,cellWeekNumbersVisible:a}),s}return n(r,e),r.prototype.destroy=function(){e.prototype.destroy.call(this),this.dayGrid.destroy(),this.scroller.destroy()},r.prototype.renderSkeletonHtml=function(){var e=this.theme;return'<table class="'+e.getClass("tableGrid")+'">'+(this.opt("columnHeader")?'<thead class="fc-head"><tr><td class="fc-head-container '+e.getClass("widgetHeader")+'">&nbsp;</td></tr></thead>':"")+'<tbody class="fc-body"><tr><td class="'+e.getClass("widgetContent")+'"></td></tr></tbody></table>'},r.prototype.weekNumberStyleAttr=function(){return null!=this.weekNumberWidth?'style="width:'+this.weekNumberWidth+'px"':""},r.prototype.hasRigidRows=function(){var e=this.opt("eventLimit");return e&&"number"!=typeof e},r.prototype.updateSize=function(t,r,n){e.prototype.updateSize.call(this,t,r,n),this.dayGrid.updateSize(t)},r.prototype.updateBaseSize=function(e,r,n){var i,o,s=this.dayGrid,l=this.opt("eventLimit"),a=this.header?this.header.el:null;s.rowEls?(this.colWeekNumbersVisible&&(this.weekNumberWidth=t.matchCellWidths(t.findElements(this.el,".fc-week-number"))),this.scroller.clear(),a&&t.uncompensateScroll(a),s.removeSegPopover(),l&&"number"==typeof l&&s.limitRows(l),i=this.computeScrollerHeight(r),this.setGridHeight(i,n),l&&"number"!=typeof l&&s.limitRows(l),n||(this.scroller.setHeight(i),((o=this.scroller.getScrollbarWidths()).left||o.right)&&(a&&t.compensateScroll(a,o),i=this.computeScrollerHeight(r),this.scroller.setHeight(i)),this.scroller.lockOverflow(o))):n||(i=this.computeScrollerHeight(r),this.scroller.setHeight(i))},r.prototype.computeScrollerHeight=function(e){return e-t.subtractInnerElHeight(this.el,this.scroller.el)},r.prototype.setGridHeight=function(e,r){this.opt("monthMode")?(r&&(e*=this.dayGrid.rowCnt/6),t.distributeHeight(this.dayGrid.rowEls,e,!r)):r?t.undistributeHeight(this.dayGrid.rowEls):t.distributeHeight(this.dayGrid.rowEls,e,!0)},r.prototype.computeDateScroll=function(e){return{top:0}},r.prototype.queryDateScroll=function(){return{top:this.scroller.getScrollTop()}},r.prototype.applyDateScroll=function(e){void 0!==e.top&&this.scroller.setScrollTop(e.top)},r}(t.View);S.prototype.dateProfileGeneratorClass=o;var C=function(e){function t(t,r){var n=e.call(this,t,r.el)||this;return n.slicer=new E,n.dayGrid=r,t.calendar.registerInteractiveComponent(n,{el:n.dayGrid.el}),n}return n(t,e),t.prototype.destroy=function(){e.prototype.destroy.call(this),this.calendar.unregisterInteractiveComponent(this)},t.prototype.render=function(e){var t=this.dayGrid,r=e.dateProfile,n=e.dayTable;t.receiveProps(i({},this.slicer.sliceProps(e,r,e.nextDayThreshold,t,n),{dateProfile:r,cells:n.cells,isRigid:e.isRigid}))},t.prototype.buildPositionCaches=function(){this.dayGrid.buildPositionCaches()},t.prototype.queryHit=function(e,t){var r=this.dayGrid.positionToHit(e,t);if(r)return{component:this.dayGrid,dateSpan:r.dateSpan,dayEl:r.dayEl,rect:{left:r.relativeRect.left,right:r.relativeRect.right,top:r.relativeRect.top,bottom:r.relativeRect.bottom},layer:0}},t}(t.DateComponent),E=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.sliceRange=function(e,t){return t.sliceRange(e)},t}(t.Slicer),R=function(e){function r(r,n,i,o){var s=e.call(this,r,n,i,o)||this;return s.buildDayTable=t.memoize(H),s.opt("columnHeader")&&(s.header=new t.DayHeader(s.context,s.el.querySelector(".fc-head-container"))),s.simpleDayGrid=new C(s.context,s.dayGrid),s}return n(r,e),r.prototype.destroy=function(){e.prototype.destroy.call(this),this.header&&this.header.destroy(),this.simpleDayGrid.destroy()},r.prototype.render=function(t){e.prototype.render.call(this,t);var r=this.props.dateProfile,n=this.dayTable=this.buildDayTable(r,this.dateProfileGenerator);this.header&&this.header.receiveProps({dateProfile:r,dates:n.headerDates,datesRepDistinctDays:1===n.rowCnt,renderIntroHtml:this.renderHeadIntroHtml}),this.simpleDayGrid.receiveProps({dateProfile:r,dayTable:n,businessHours:t.businessHours,dateSelection:t.dateSelection,eventStore:t.eventStore,eventUiBases:t.eventUiBases,eventSelection:t.eventSelection,eventDrag:t.eventDrag,eventResize:t.eventResize,isRigid:this.hasRigidRows(),nextDayThreshold:this.nextDayThreshold})},r}(S);function H(e,r){var n=new t.DaySeries(e.renderRange,r);return new t.DayTable(n,/year|month|week/.test(e.currentRangeUnit))}var D=t.createPlugin({defaultView:"dayGridMonth",views:{dayGrid:R,dayGridDay:{type:"dayGrid",duration:{days:1}},dayGridWeek:{type:"dayGrid",duration:{weeks:1}},dayGridMonth:{type:"dayGrid",duration:{months:1},monthMode:!0,fixedWeekCount:!0}}});e.AbstractDayGridView=S,e.DayBgRow=g,e.DayGrid=b,e.DayGridSlicer=E,e.DayGridView=R,e.SimpleDayGrid=C,e.buildBasicDayTable=H,e.default=D,Object.defineProperty(e,"__esModule",{value:!0})});
\ No newline at end of file
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/daygrid/package.json b/AKPlan/static/AKPlan/vendor/fullcalendar/daygrid/package.json
deleted file mode 100644
index c6e16ce1fce594471df59aa7d4a3477c25082344..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/daygrid/package.json
+++ /dev/null
@@ -1,33 +0,0 @@
-{
-  "name": "@fullcalendar/daygrid",
-  "version": "4.3.0",
-  "title": "FullCalendar Day Grid Plugin",
-  "description": "Display events on Month view or DayGrid view",
-  "keywords": [
-    "calendar",
-    "event",
-    "full-sized"
-  ],
-  "homepage": "https://fullcalendar.io/",
-  "docs": "https://fullcalendar.io/docs/month-view",
-  "bugs": "https://fullcalendar.io/reporting-bugs",
-  "repository": {
-    "type": "git",
-    "url": "https://github.com/fullcalendar/fullcalendar.git",
-    "homepage": "https://github.com/fullcalendar/fullcalendar"
-  },
-  "license": "MIT",
-  "author": {
-    "name": "Adam Shaw",
-    "email": "arshaw@arshaw.com",
-    "url": "http://arshaw.com/"
-  },
-  "copyright": "2019 Adam Shaw",
-  "peerDependencies": {
-    "@fullcalendar/core": "~4.3.0"
-  },
-  "main": "main.js",
-  "module": "main.esm.js",
-  "unpkg": "main.min.js",
-  "types": "main.d.ts"
-}
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/google-calendar/LICENSE.txt b/AKPlan/static/AKPlan/vendor/fullcalendar/google-calendar/LICENSE.txt
deleted file mode 100644
index 2149cfbeff4f2e3649bc950982aa72b894f7e521..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/google-calendar/LICENSE.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-Copyright (c) 2019 Adam Shaw
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/google-calendar/README.md b/AKPlan/static/AKPlan/vendor/fullcalendar/google-calendar/README.md
deleted file mode 100644
index a4d6c5cc06dfad2280783ff825697733b73caae6..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/google-calendar/README.md
+++ /dev/null
@@ -1,8 +0,0 @@
-
-# FullCalendar Google Calendar Plugin
-
-Fetch events from a public Google Calendar feed
-
-[View the docs &raquo;](https://fullcalendar.io/docs/google-calendar)
-
-This package was created from the [FullCalendar monorepo &raquo;](https://github.com/fullcalendar/fullcalendar)
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/google-calendar/main.d.ts b/AKPlan/static/AKPlan/vendor/fullcalendar/google-calendar/main.d.ts
deleted file mode 100644
index 105a6c6d355b22305eb1954888af1d9194bc85d0..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/google-calendar/main.d.ts
+++ /dev/null
@@ -1,20 +0,0 @@
-// Generated by dts-bundle v0.7.3-fork.1
-// Dependencies for this module:
-//   main.d.ts
-
-declare module '@fullcalendar/google-calendar' {
-    module '@fullcalendar/core' {
-        interface OptionsInput {
-            googleCalendarApiKey?: string;
-        }
-    }
-    module '@fullcalendar/core/structs/event-source' {
-        interface ExtendedEventSourceInput {
-            googleCalendarApiKey?: string;
-            googleCalendarId?: string;
-        }
-    }
-    const _default: import("@fullcalendar/core").PluginDef;
-    export default _default;
-}
-
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/google-calendar/main.esm.js b/AKPlan/static/AKPlan/vendor/fullcalendar/google-calendar/main.esm.js
deleted file mode 100644
index 341151ce5c0bd9efab9f254aa13dcad1ec379c23..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/google-calendar/main.esm.js
+++ /dev/null
@@ -1,162 +0,0 @@
-/*!
-FullCalendar Google Calendar Plugin v4.3.0
-Docs & License: https://fullcalendar.io/
-(c) 2019 Adam Shaw
-*/
-
-import {addDays, createPlugin, refineProps, requestJson} from '@fullcalendar/core';
-
-/*! *****************************************************************************
-Copyright (c) Microsoft Corporation. All rights reserved.
-Licensed under the Apache License, Version 2.0 (the "License"); you may not use
-this file except in compliance with the License. You may obtain a copy of the
-License at http://www.apache.org/licenses/LICENSE-2.0
-
-THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
-WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
-MERCHANTABLITY OR NON-INFRINGEMENT.
-
-See the Apache Version 2.0 License for specific language governing permissions
-and limitations under the License.
-***************************************************************************** */
-
-var __assign = function() {
-    __assign = Object.assign || function __assign(t) {
-        for (var s, i = 1, n = arguments.length; i < n; i++) {
-            s = arguments[i];
-            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
-        }
-        return t;
-    };
-    return __assign.apply(this, arguments);
-};
-
-// TODO: expose somehow
-var API_BASE = 'https://www.googleapis.com/calendar/v3/calendars';
-var STANDARD_PROPS = {
-    url: String,
-    googleCalendarApiKey: String,
-    googleCalendarId: String,
-    data: null
-};
-var eventSourceDef = {
-    parseMeta: function (raw) {
-        if (typeof raw === 'string') {
-            raw = { url: raw };
-        }
-        if (typeof raw === 'object') {
-            var standardProps = refineProps(raw, STANDARD_PROPS);
-            if (!standardProps.googleCalendarId && standardProps.url) {
-                standardProps.googleCalendarId = parseGoogleCalendarId(standardProps.url);
-            }
-            delete standardProps.url;
-            if (standardProps.googleCalendarId) {
-                return standardProps;
-            }
-        }
-        return null;
-    },
-    fetch: function (arg, onSuccess, onFailure) {
-        var calendar = arg.calendar;
-        var meta = arg.eventSource.meta;
-        var apiKey = meta.googleCalendarApiKey || calendar.opt('googleCalendarApiKey');
-        if (!apiKey) {
-            onFailure({
-                message: 'Specify a googleCalendarApiKey. See http://fullcalendar.io/docs/google_calendar/'
-            });
-        }
-        else {
-            var url = buildUrl(meta);
-            var requestParams_1 = buildRequestParams(arg.range, apiKey, meta.data, calendar.dateEnv);
-            requestJson('GET', url, requestParams_1, function (body, xhr) {
-                if (body.error) {
-                    onFailure({
-                        message: 'Google Calendar API: ' + body.error.message,
-                        errors: body.error.errors,
-                        xhr: xhr
-                    });
-                }
-                else {
-                    onSuccess({
-                        rawEvents: gcalItemsToRawEventDefs(body.items, requestParams_1.timeZone),
-                        xhr: xhr
-                    });
-                }
-            }, function (message, xhr) {
-                onFailure({ message: message, xhr: xhr });
-            });
-        }
-    }
-};
-function parseGoogleCalendarId(url) {
-    var match;
-    // detect if the ID was specified as a single string.
-    // will match calendars like "asdf1234@calendar.google.com" in addition to person email calendars.
-    if (/^[^\/]+@([^\/\.]+\.)*(google|googlemail|gmail)\.com$/.test(url)) {
-        return url;
-    }
-    else if ((match = /^https:\/\/www.googleapis.com\/calendar\/v3\/calendars\/([^\/]*)/.exec(url)) ||
-        (match = /^https?:\/\/www.google.com\/calendar\/feeds\/([^\/]*)/.exec(url))) {
-        return decodeURIComponent(match[1]);
-    }
-}
-function buildUrl(meta) {
-    return API_BASE + '/' + encodeURIComponent(meta.googleCalendarId) + '/events';
-}
-function buildRequestParams(range, apiKey, extraParams, dateEnv) {
-    var params;
-    var startStr;
-    var endStr;
-    if (dateEnv.canComputeOffset) {
-        // strings will naturally have offsets, which GCal needs
-        startStr = dateEnv.formatIso(range.start);
-        endStr = dateEnv.formatIso(range.end);
-    }
-    else {
-        // when timezone isn't known, we don't know what the UTC offset should be, so ask for +/- 1 day
-        // from the UTC day-start to guarantee we're getting all the events
-        // (start/end will be UTC-coerced dates, so toISOString is okay)
-        startStr = addDays(range.start, -1).toISOString();
-        endStr = addDays(range.end, 1).toISOString();
-    }
-    params = __assign({}, (extraParams || {}), { key: apiKey, timeMin: startStr, timeMax: endStr, singleEvents: true, maxResults: 9999 });
-    if (dateEnv.timeZone !== 'local') {
-        params.timeZone = dateEnv.timeZone;
-    }
-    return params;
-}
-function gcalItemsToRawEventDefs(items, gcalTimezone) {
-    return items.map(function (item) {
-        return gcalItemToRawEventDef(item, gcalTimezone);
-    });
-}
-function gcalItemToRawEventDef(item, gcalTimezone) {
-    var url = item.htmlLink || null;
-    // make the URLs for each event show times in the correct timezone
-    if (url && gcalTimezone) {
-        url = injectQsComponent(url, 'ctz=' + gcalTimezone);
-    }
-    return {
-        id: item.id,
-        title: item.summary,
-        start: item.start.dateTime || item.start.date,
-        end: item.end.dateTime || item.end.date,
-        url: url,
-        location: item.location,
-        description: item.description
-    };
-}
-// Injects a string like "arg=value" into the querystring of a URL
-// TODO: move to a general util file?
-function injectQsComponent(url, component) {
-    // inject it after the querystring but before the fragment
-    return url.replace(/(\?.*?)?(#|$)/, function (whole, qs, hash) {
-        return (qs ? qs + '&' : '?') + component + hash;
-    });
-}
-var main = createPlugin({
-    eventSourceDefs: [eventSourceDef]
-});
-
-export default main;
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/google-calendar/main.js b/AKPlan/static/AKPlan/vendor/fullcalendar/google-calendar/main.js
deleted file mode 100644
index fca85d45e656a3a2a143694c5b0325e6bae5a7d9..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/google-calendar/main.js
+++ /dev/null
@@ -1,170 +0,0 @@
-/*!
-FullCalendar Google Calendar Plugin v4.3.0
-Docs & License: https://fullcalendar.io/
-(c) 2019 Adam Shaw
-*/
-
-(function (global, factory) {
-    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@fullcalendar/core')) :
-    typeof define === 'function' && define.amd ? define(['exports', '@fullcalendar/core'], factory) :
-    (global = global || self, factory(global.FullCalendarGoogleCalendar = {}, global.FullCalendar));
-}(this, function (exports, core) { 'use strict';
-
-    /*! *****************************************************************************
-    Copyright (c) Microsoft Corporation. All rights reserved.
-    Licensed under the Apache License, Version 2.0 (the "License"); you may not use
-    this file except in compliance with the License. You may obtain a copy of the
-    License at http://www.apache.org/licenses/LICENSE-2.0
-
-    THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-    KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
-    WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
-    MERCHANTABLITY OR NON-INFRINGEMENT.
-
-    See the Apache Version 2.0 License for specific language governing permissions
-    and limitations under the License.
-    ***************************************************************************** */
-
-    var __assign = function() {
-        __assign = Object.assign || function __assign(t) {
-            for (var s, i = 1, n = arguments.length; i < n; i++) {
-                s = arguments[i];
-                for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
-            }
-            return t;
-        };
-        return __assign.apply(this, arguments);
-    };
-
-    // TODO: expose somehow
-    var API_BASE = 'https://www.googleapis.com/calendar/v3/calendars';
-    var STANDARD_PROPS = {
-        url: String,
-        googleCalendarApiKey: String,
-        googleCalendarId: String,
-        data: null
-    };
-    var eventSourceDef = {
-        parseMeta: function (raw) {
-            if (typeof raw === 'string') {
-                raw = { url: raw };
-            }
-            if (typeof raw === 'object') {
-                var standardProps = core.refineProps(raw, STANDARD_PROPS);
-                if (!standardProps.googleCalendarId && standardProps.url) {
-                    standardProps.googleCalendarId = parseGoogleCalendarId(standardProps.url);
-                }
-                delete standardProps.url;
-                if (standardProps.googleCalendarId) {
-                    return standardProps;
-                }
-            }
-            return null;
-        },
-        fetch: function (arg, onSuccess, onFailure) {
-            var calendar = arg.calendar;
-            var meta = arg.eventSource.meta;
-            var apiKey = meta.googleCalendarApiKey || calendar.opt('googleCalendarApiKey');
-            if (!apiKey) {
-                onFailure({
-                    message: 'Specify a googleCalendarApiKey. See http://fullcalendar.io/docs/google_calendar/'
-                });
-            }
-            else {
-                var url = buildUrl(meta);
-                var requestParams_1 = buildRequestParams(arg.range, apiKey, meta.data, calendar.dateEnv);
-                core.requestJson('GET', url, requestParams_1, function (body, xhr) {
-                    if (body.error) {
-                        onFailure({
-                            message: 'Google Calendar API: ' + body.error.message,
-                            errors: body.error.errors,
-                            xhr: xhr
-                        });
-                    }
-                    else {
-                        onSuccess({
-                            rawEvents: gcalItemsToRawEventDefs(body.items, requestParams_1.timeZone),
-                            xhr: xhr
-                        });
-                    }
-                }, function (message, xhr) {
-                    onFailure({ message: message, xhr: xhr });
-                });
-            }
-        }
-    };
-    function parseGoogleCalendarId(url) {
-        var match;
-        // detect if the ID was specified as a single string.
-        // will match calendars like "asdf1234@calendar.google.com" in addition to person email calendars.
-        if (/^[^\/]+@([^\/\.]+\.)*(google|googlemail|gmail)\.com$/.test(url)) {
-            return url;
-        }
-        else if ((match = /^https:\/\/www.googleapis.com\/calendar\/v3\/calendars\/([^\/]*)/.exec(url)) ||
-            (match = /^https?:\/\/www.google.com\/calendar\/feeds\/([^\/]*)/.exec(url))) {
-            return decodeURIComponent(match[1]);
-        }
-    }
-    function buildUrl(meta) {
-        return API_BASE + '/' + encodeURIComponent(meta.googleCalendarId) + '/events';
-    }
-    function buildRequestParams(range, apiKey, extraParams, dateEnv) {
-        var params;
-        var startStr;
-        var endStr;
-        if (dateEnv.canComputeOffset) {
-            // strings will naturally have offsets, which GCal needs
-            startStr = dateEnv.formatIso(range.start);
-            endStr = dateEnv.formatIso(range.end);
-        }
-        else {
-            // when timezone isn't known, we don't know what the UTC offset should be, so ask for +/- 1 day
-            // from the UTC day-start to guarantee we're getting all the events
-            // (start/end will be UTC-coerced dates, so toISOString is okay)
-            startStr = core.addDays(range.start, -1).toISOString();
-            endStr = core.addDays(range.end, 1).toISOString();
-        }
-        params = __assign({}, (extraParams || {}), { key: apiKey, timeMin: startStr, timeMax: endStr, singleEvents: true, maxResults: 9999 });
-        if (dateEnv.timeZone !== 'local') {
-            params.timeZone = dateEnv.timeZone;
-        }
-        return params;
-    }
-    function gcalItemsToRawEventDefs(items, gcalTimezone) {
-        return items.map(function (item) {
-            return gcalItemToRawEventDef(item, gcalTimezone);
-        });
-    }
-    function gcalItemToRawEventDef(item, gcalTimezone) {
-        var url = item.htmlLink || null;
-        // make the URLs for each event show times in the correct timezone
-        if (url && gcalTimezone) {
-            url = injectQsComponent(url, 'ctz=' + gcalTimezone);
-        }
-        return {
-            id: item.id,
-            title: item.summary,
-            start: item.start.dateTime || item.start.date,
-            end: item.end.dateTime || item.end.date,
-            url: url,
-            location: item.location,
-            description: item.description
-        };
-    }
-    // Injects a string like "arg=value" into the querystring of a URL
-    // TODO: move to a general util file?
-    function injectQsComponent(url, component) {
-        // inject it after the querystring but before the fragment
-        return url.replace(/(\?.*?)?(#|$)/, function (whole, qs, hash) {
-            return (qs ? qs + '&' : '?') + component + hash;
-        });
-    }
-    var main = core.createPlugin({
-        eventSourceDefs: [eventSourceDef]
-    });
-
-    exports.default = main;
-
-    Object.defineProperty(exports, '__esModule', { value: true });
-
-}));
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/google-calendar/main.min.js b/AKPlan/static/AKPlan/vendor/fullcalendar/google-calendar/main.min.js
deleted file mode 100644
index e7626129e483209896e12bd208072405a96279d8..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/google-calendar/main.min.js
+++ /dev/null
@@ -1,6 +0,0 @@
-/*!
-FullCalendar Google Calendar Plugin v4.3.0
-Docs & License: https://fullcalendar.io/
-(c) 2019 Adam Shaw
-*/
-!function(e,r){"object"==typeof exports&&"undefined"!=typeof module?r(exports,require("@fullcalendar/core")):"function"==typeof define&&define.amd?define(["exports","@fullcalendar/core"],r):r((e=e||self).FullCalendarGoogleCalendar={},e.FullCalendar)}(this,function(e,r){"use strict";var t=function(){return(t=Object.assign||function(e){for(var r,t=1,n=arguments.length;t<n;t++)for(var o in r=arguments[t])Object.prototype.hasOwnProperty.call(r,o)&&(e[o]=r[o]);return e}).apply(this,arguments)},n="https://www.googleapis.com/calendar/v3/calendars",o={url:String,googleCalendarApiKey:String,googleCalendarId:String,data:null},a={parseMeta:function(e){if("string"==typeof e&&(e={url:e}),"object"==typeof e){var t=r.refineProps(e,o);if(!t.googleCalendarId&&t.url&&(t.googleCalendarId=function(e){var r;if(/^[^\/]+@([^\/\.]+\.)*(google|googlemail|gmail)\.com$/.test(e))return e;if((r=/^https:\/\/www.googleapis.com\/calendar\/v3\/calendars\/([^\/]*)/.exec(e))||(r=/^https?:\/\/www.google.com\/calendar\/feeds\/([^\/]*)/.exec(e)))return decodeURIComponent(r[1])}(t.url)),delete t.url,t.googleCalendarId)return t}return null},fetch:function(e,o,a){var l=e.calendar,i=e.eventSource.meta,d=i.googleCalendarApiKey||l.opt("googleCalendarApiKey");if(d){var s=function(e){return n+"/"+encodeURIComponent(e.googleCalendarId)+"/events"}(i),c=function(e,n,o,a){var l,i,d;a.canComputeOffset?(i=a.formatIso(e.start),d=a.formatIso(e.end)):(i=r.addDays(e.start,-1).toISOString(),d=r.addDays(e.end,1).toISOString());l=t({},o||{},{key:n,timeMin:i,timeMax:d,singleEvents:!0,maxResults:9999}),"local"!==a.timeZone&&(l.timeZone=a.timeZone);return l}(e.range,d,i.data,l.dateEnv);r.requestJson("GET",s,c,function(e,r){var t,n;e.error?a({message:"Google Calendar API: "+e.error.message,errors:e.error.errors,xhr:r}):o({rawEvents:(t=e.items,n=c.timeZone,t.map(function(e){return function(e,r){var t=e.htmlLink||null;t&&r&&(t=function(e,r){return e.replace(/(\?.*?)?(#|$)/,function(e,t,n){return(t?t+"&":"?")+r+n})}(t,"ctz="+r));return{id:e.id,title:e.summary,start:e.start.dateTime||e.start.date,end:e.end.dateTime||e.end.date,url:t,location:e.location,description:e.description}}(e,n)})),xhr:r})},function(e,r){a({message:e,xhr:r})})}else a({message:"Specify a googleCalendarApiKey. See http://fullcalendar.io/docs/google_calendar/"})}};var l=r.createPlugin({eventSourceDefs:[a]});e.default=l,Object.defineProperty(e,"__esModule",{value:!0})});
\ No newline at end of file
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/google-calendar/package.json b/AKPlan/static/AKPlan/vendor/fullcalendar/google-calendar/package.json
deleted file mode 100644
index 58b1dc6f3244029ae18376acd027dcbaa3e3dc36..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/google-calendar/package.json
+++ /dev/null
@@ -1,33 +0,0 @@
-{
-  "name": "@fullcalendar/google-calendar",
-  "version": "4.3.0",
-  "title": "FullCalendar Google Calendar Plugin",
-  "description": "Fetch events from a public Google Calendar feed",
-  "keywords": [
-    "calendar",
-    "event",
-    "full-sized"
-  ],
-  "homepage": "https://fullcalendar.io/",
-  "docs": "https://fullcalendar.io/docs/google-calendar",
-  "bugs": "https://fullcalendar.io/reporting-bugs",
-  "repository": {
-    "type": "git",
-    "url": "https://github.com/fullcalendar/fullcalendar.git",
-    "homepage": "https://github.com/fullcalendar/fullcalendar"
-  },
-  "license": "MIT",
-  "author": {
-    "name": "Adam Shaw",
-    "email": "arshaw@arshaw.com",
-    "url": "http://arshaw.com/"
-  },
-  "copyright": "2019 Adam Shaw",
-  "peerDependencies": {
-    "@fullcalendar/core": "~4.3.0"
-  },
-  "main": "main.js",
-  "module": "main.esm.js",
-  "unpkg": "main.min.js",
-  "types": "main.d.ts"
-}
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/interaction/LICENSE.txt b/AKPlan/static/AKPlan/vendor/fullcalendar/interaction/LICENSE.txt
deleted file mode 100644
index 2149cfbeff4f2e3649bc950982aa72b894f7e521..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/interaction/LICENSE.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-Copyright (c) 2019 Adam Shaw
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/interaction/README.md b/AKPlan/static/AKPlan/vendor/fullcalendar/interaction/README.md
deleted file mode 100644
index ee5c738abaaa64a9bd5cc58e67810cee00ecf5be..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/interaction/README.md
+++ /dev/null
@@ -1,8 +0,0 @@
-
-# FullCalendar Interaction Plugin
-
-Provides functionality for event drag-n-drop, resizing, dateClick, and selectable actions
-
-[View the docs &raquo;](https://fullcalendar.io/docs/editable)
-
-This package was created from the [FullCalendar monorepo &raquo;](https://github.com/fullcalendar/fullcalendar)
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/interaction/main.d.ts b/AKPlan/static/AKPlan/vendor/fullcalendar/interaction/main.d.ts
deleted file mode 100644
index 160479aac0cd3de86a6618e12255bfbb603f7c3a..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/interaction/main.d.ts
+++ /dev/null
@@ -1,356 +0,0 @@
-// Generated by dts-bundle v0.7.3-fork.1
-// Dependencies for this module:
-//   ../../../../../@fullcalendar/core
-
-declare module '@fullcalendar/interaction' {
-    import FeaturefulElementDragging from '@fullcalendar/interaction/dnd/FeaturefulElementDragging';
-    const _default: import("@fullcalendar/core").PluginDef;
-    export default _default;
-    export { FeaturefulElementDragging };
-    export { default as PointerDragging } from '@fullcalendar/interaction/dnd/PointerDragging';
-    export { default as Draggable } from '@fullcalendar/interaction/interactions-external/ExternalDraggable';
-    export { default as ThirdPartyDraggable } from '@fullcalendar/interaction/interactions-external/ThirdPartyDraggable';
-}
-
-declare module '@fullcalendar/interaction/dnd/FeaturefulElementDragging' {
-    import {ElementDragging, PointerDragEvent} from '@fullcalendar/core';
-    import PointerDragging from '@fullcalendar/interaction/dnd/PointerDragging';
-    import ElementMirror from '@fullcalendar/interaction/dnd/ElementMirror';
-    import AutoScroller from '@fullcalendar/interaction/dnd/AutoScroller';
-    export { FeaturefulElementDragging as default, FeaturefulElementDragging };
-    class FeaturefulElementDragging extends ElementDragging {
-        pointer: PointerDragging;
-        mirror: ElementMirror;
-        autoScroller: AutoScroller;
-        delay: number | null;
-        minDistance: number;
-        touchScrollAllowed: boolean;
-        mirrorNeedsRevert: boolean;
-        isInteracting: boolean;
-        isDragging: boolean;
-        isDelayEnded: boolean;
-        isDistanceSurpassed: boolean;
-        delayTimeoutId: number | null;
-        constructor(containerEl: HTMLElement);
-        destroy(): void;
-        onPointerDown: (ev: PointerDragEvent) => void;
-        onPointerMove: (ev: PointerDragEvent) => void;
-        onPointerUp: (ev: PointerDragEvent) => void;
-        startDelay(ev: PointerDragEvent): void;
-        handleDelayEnd(ev: PointerDragEvent): void;
-        handleDistanceSurpassed(ev: PointerDragEvent): void;
-        tryStartDrag(ev: PointerDragEvent): void;
-        tryStopDrag(ev: PointerDragEvent): void;
-        stopDrag(ev: PointerDragEvent): void;
-        setIgnoreMove(bool: boolean): void;
-        setMirrorIsVisible(bool: boolean): void;
-        setMirrorNeedsRevert(bool: boolean): void;
-        setAutoScrollEnabled(bool: boolean): void;
-    }
-}
-
-declare module '@fullcalendar/interaction/dnd/PointerDragging' {
-    import {EmitterMixin, PointerDragEvent} from '@fullcalendar/core';
-    export { PointerDragging as default, PointerDragging };
-    class PointerDragging {
-        containerEl: EventTarget;
-        subjectEl: HTMLElement | null;
-        downEl: HTMLElement | null;
-        emitter: EmitterMixin;
-        selector: string;
-        handleSelector: string;
-        shouldIgnoreMove: boolean;
-        shouldWatchScroll: boolean;
-        isDragging: boolean;
-        isTouchDragging: boolean;
-        wasTouchScroll: boolean;
-        origPageX: number;
-        origPageY: number;
-        prevPageX: number;
-        prevPageY: number;
-        prevScrollX: number;
-        prevScrollY: number;
-        constructor(containerEl: EventTarget);
-        destroy(): void;
-        tryStart(ev: UIEvent): boolean;
-        cleanup(): void;
-        querySubjectEl(ev: UIEvent): HTMLElement;
-        handleMouseDown: (ev: MouseEvent) => void;
-        handleMouseMove: (ev: MouseEvent) => void;
-        handleMouseUp: (ev: MouseEvent) => void;
-        shouldIgnoreMouse(): number | boolean;
-        handleTouchStart: (ev: TouchEvent) => void;
-        handleTouchMove: (ev: TouchEvent) => void;
-        handleTouchEnd: (ev: TouchEvent) => void;
-        handleTouchScroll: () => void;
-        cancelTouchScroll(): void;
-        initScrollWatch(ev: PointerDragEvent): void;
-        recordCoords(ev: PointerDragEvent): void;
-        handleScroll: (ev: UIEvent) => void;
-        destroyScrollWatch(): void;
-        createEventFromMouse(ev: MouseEvent, isFirst?: boolean): PointerDragEvent;
-        createEventFromTouch(ev: TouchEvent, isFirst?: boolean): PointerDragEvent;
-    }
-}
-
-declare module '@fullcalendar/interaction/interactions-external/ExternalDraggable' {
-    import {PointerDragEvent} from '@fullcalendar/core';
-    import FeaturefulElementDragging from '@fullcalendar/interaction/dnd/FeaturefulElementDragging';
-    import {DragMetaGenerator} from '@fullcalendar/interaction/interactions-external/ExternalElementDragging';
-
-    export interface ExternalDraggableSettings {
-        eventData?: DragMetaGenerator;
-        itemSelector?: string;
-        minDistance?: number;
-        longPressDelay?: number;
-        appendTo?: HTMLElement;
-    }
-
-    export {ExternalDraggable as default, ExternalDraggable};
-
-    class ExternalDraggable {
-        dragging: FeaturefulElementDragging;
-        settings: ExternalDraggableSettings;
-        constructor(el: HTMLElement, settings?: ExternalDraggableSettings);
-        handlePointerDown: (ev: PointerDragEvent) => void;
-        handleDragStart: (ev: PointerDragEvent) => void;
-        destroy(): void;
-    }
-}
-
-declare module '@fullcalendar/interaction/interactions-external/ThirdPartyDraggable' {
-    import {DragMetaGenerator} from '@fullcalendar/interaction/interactions-external/ExternalElementDragging';
-    import InferredElementDragging from '@fullcalendar/interaction/interactions-external/InferredElementDragging';
-
-    export interface ThirdPartyDraggableSettings {
-        eventData?: DragMetaGenerator;
-        itemSelector?: string;
-        mirrorSelector?: string;
-    }
-    export { ThirdPartyDraggable as default, ThirdPartyDraggable };
-    class ThirdPartyDraggable {
-        dragging: InferredElementDragging;
-        constructor(containerOrSettings?: EventTarget | ThirdPartyDraggableSettings, settings?: ThirdPartyDraggableSettings);
-        destroy(): void;
-    }
-}
-
-declare module '@fullcalendar/interaction/dnd/ElementMirror' {
-    import {Rect} from '@fullcalendar/core';
-    export { ElementMirror as default, ElementMirror };
-    class ElementMirror {
-        isVisible: boolean;
-        origScreenX?: number;
-        origScreenY?: number;
-        deltaX?: number;
-        deltaY?: number;
-        sourceEl: HTMLElement | null;
-        mirrorEl: HTMLElement | null;
-        sourceElRect: Rect | null;
-        parentNode: HTMLElement;
-        zIndex: number;
-        revertDuration: number;
-        start(sourceEl: HTMLElement, pageX: number, pageY: number): void;
-        handleMove(pageX: number, pageY: number): void;
-        setIsVisible(bool: boolean): void;
-        stop(needsRevertAnimation: boolean, callback: () => void): void;
-        doRevertAnimation(callback: () => void, revertDuration: number): void;
-        cleanup(): void;
-        updateElPosition(): void;
-        getMirrorEl(): HTMLElement;
-    }
-}
-
-declare module '@fullcalendar/interaction/dnd/AutoScroller' {
-    import {ScrollGeomCache} from '@fullcalendar/interaction/scroll-geom-cache';
-    export { AutoScroller as default, AutoScroller };
-    class AutoScroller {
-        isEnabled: boolean;
-        scrollQuery: (Window | string)[];
-        edgeThreshold: number;
-        maxVelocity: number;
-        pointerScreenX: number | null;
-        pointerScreenY: number | null;
-        isAnimating: boolean;
-        scrollCaches: ScrollGeomCache[] | null;
-        msSinceRequest?: number;
-        everMovedUp: boolean;
-        everMovedDown: boolean;
-        everMovedLeft: boolean;
-        everMovedRight: boolean;
-        start(pageX: number, pageY: number): void;
-        handleMove(pageX: number, pageY: number): void;
-        stop(): void;
-        requestAnimation(now: number): void;
-    }
-}
-
-declare module '@fullcalendar/interaction/interactions-external/ExternalElementDragging' {
-    import {
-        Calendar,
-        DatePointApi,
-        DragMeta,
-        DragMetaInput,
-        ElementDragging,
-        EventInteractionState,
-        EventTuple,
-        Hit,
-        PointerDragEvent,
-        View
-    } from '@fullcalendar/core';
-    import HitDragging from '@fullcalendar/interaction/interactions/HitDragging';
-    export type DragMetaGenerator = DragMetaInput | ((el: HTMLElement) => DragMetaInput);
-
-    export interface ExternalDropApi extends DatePointApi {
-        draggedEl: HTMLElement;
-        jsEvent: UIEvent;
-        view: View;
-    }
-
-    export {ExternalElementDragging as default, ExternalElementDragging};
-
-    class ExternalElementDragging {
-        hitDragging: HitDragging;
-        receivingCalendar: Calendar | null;
-        droppableEvent: EventTuple | null;
-        suppliedDragMeta: DragMetaGenerator | null;
-        dragMeta: DragMeta | null;
-        constructor(dragging: ElementDragging, suppliedDragMeta?: DragMetaGenerator);
-        handleDragStart: (ev: PointerDragEvent) => void;
-        buildDragMeta(subjectEl: HTMLElement): DragMeta;
-        handleHitUpdate: (hit: Hit, isFinal: boolean, ev: PointerDragEvent) => void;
-        handleDragEnd: (pev: PointerDragEvent) => void;
-        displayDrag(nextCalendar: Calendar | null, state: EventInteractionState): void;
-        clearDrag(): void;
-        canDropElOnCalendar(el: HTMLElement, receivingCalendar: Calendar): boolean;
-    }
-}
-
-declare module '@fullcalendar/interaction/interactions-external/InferredElementDragging' {
-    import {ElementDragging, PointerDragEvent} from '@fullcalendar/core';
-    import PointerDragging from '@fullcalendar/interaction/dnd/PointerDragging';
-    export { InferredElementDragging as default, InferredElementDragging };
-    class InferredElementDragging extends ElementDragging {
-        pointer: PointerDragging;
-        shouldIgnoreMove: boolean;
-        mirrorSelector: string;
-        currentMirrorEl: HTMLElement | null;
-        constructor(containerEl: HTMLElement);
-        destroy(): void;
-        handlePointerDown: (ev: PointerDragEvent) => void;
-        handlePointerMove: (ev: PointerDragEvent) => void;
-        handlePointerUp: (ev: PointerDragEvent) => void;
-        setIgnoreMove(bool: boolean): void;
-        setMirrorIsVisible(bool: boolean): void;
-    }
-}
-
-declare module '@fullcalendar/interaction/scroll-geom-cache' {
-    import {Rect, ScrollController} from '@fullcalendar/core';
-
-    export abstract class ScrollGeomCache extends ScrollController {
-        clientRect: Rect;
-        origScrollTop: number;
-        origScrollLeft: number;
-        protected scrollController: ScrollController;
-        protected doesListening: boolean;
-        protected scrollTop: number;
-        protected scrollLeft: number;
-        protected scrollWidth: number;
-        protected scrollHeight: number;
-        protected clientWidth: number;
-        protected clientHeight: number;
-        constructor(scrollController: ScrollController, doesListening: boolean);
-        abstract getEventTarget(): EventTarget;
-        abstract computeClientRect(): Rect;
-        destroy(): void;
-        handleScroll: () => void;
-        getScrollTop(): number;
-        getScrollLeft(): number;
-        setScrollTop(top: number): void;
-        setScrollLeft(top: number): void;
-        getClientWidth(): number;
-        getClientHeight(): number;
-        getScrollWidth(): number;
-        getScrollHeight(): number;
-        handleScrollChange(): void;
-    }
-    export class ElementScrollGeomCache extends ScrollGeomCache {
-        constructor(el: HTMLElement, doesListening: boolean);
-        getEventTarget(): EventTarget;
-        computeClientRect(): {
-            left: number;
-            right: number;
-            top: number;
-            bottom: number;
-        };
-    }
-    export class WindowScrollGeomCache extends ScrollGeomCache {
-        constructor(doesListening: boolean);
-        getEventTarget(): EventTarget;
-        computeClientRect(): Rect;
-        handleScrollChange(): void;
-    }
-}
-
-declare module '@fullcalendar/interaction/interactions/HitDragging' {
-    import {
-        ElementDragging,
-        EmitterMixin,
-        Hit,
-        InteractionSettingsStore,
-        Point,
-        PointerDragEvent
-    } from '@fullcalendar/core';
-    import OffsetTracker from '@fullcalendar/interaction/OffsetTracker';
-    export {HitDragging as default, HitDragging};
-
-    class HitDragging {
-        droppableStore: InteractionSettingsStore;
-        dragging: ElementDragging;
-        emitter: EmitterMixin;
-        useSubjectCenter: boolean;
-        requireInitial: boolean;
-        offsetTrackers: {
-            [componentUid: string]: OffsetTracker;
-        };
-        initialHit: Hit | null;
-        movingHit: Hit | null;
-        finalHit: Hit | null;
-        coordAdjust?: Point;
-        constructor(dragging: ElementDragging, droppableStore: InteractionSettingsStore);
-        handlePointerDown: (ev: PointerDragEvent) => void;
-        processFirstCoord(ev: PointerDragEvent): void;
-        handleDragStart: (ev: PointerDragEvent) => void;
-        handleDragMove: (ev: PointerDragEvent) => void;
-        handlePointerUp: (ev: PointerDragEvent) => void;
-        handleDragEnd: (ev: PointerDragEvent) => void;
-        handleMove(ev: PointerDragEvent, forceHandle?: boolean): void;
-        prepareHits(): void;
-        releaseHits(): void;
-        queryHitForOffset(offsetLeft: number, offsetTop: number): Hit | null;
-    }
-    export function isHitsEqual(hit0: Hit | null, hit1: Hit | null): boolean;
-}
-
-declare module '@fullcalendar/interaction/OffsetTracker' {
-    import {Rect} from '@fullcalendar/core';
-    import {ElementScrollGeomCache} from '@fullcalendar/interaction/scroll-geom-cache';
-    export {OffsetTracker as default, OffsetTracker};
-
-    class OffsetTracker {
-        scrollCaches: ElementScrollGeomCache[];
-        origRect: Rect;
-
-        constructor(el: HTMLElement);
-
-        destroy(): void;
-
-        computeLeft(): number;
-
-        computeTop(): number;
-
-        isWithinClipping(pageX: number, pageY: number): boolean;
-    }
-}
-
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/interaction/main.esm.js b/AKPlan/static/AKPlan/vendor/fullcalendar/interaction/main.esm.js
deleted file mode 100644
index 04608e6ae813297f9c512c46d12a7026b1e4fbcd..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/interaction/main.esm.js
+++ /dev/null
@@ -1,2180 +0,0 @@
-/*!
-FullCalendar Interaction Plugin v4.3.0
-Docs & License: https://fullcalendar.io/
-(c) 2019 Adam Shaw
-*/
-
-import {
-    allowContextMenu,
-    allowSelection,
-    applyMutationToEventStore,
-    applyStyle,
-    compareNumbers,
-    computeInnerRect,
-    computeRect,
-    config,
-    constrainPoint,
-    createDuration,
-    createEmptyEventStore,
-    createEventInstance,
-    createPlugin,
-    diffDates,
-    diffPoints,
-    disableCursor,
-    elementClosest,
-    ElementDragging,
-    elementMatches,
-    ElementScrollController,
-    EmitterMixin,
-    enableCursor,
-    EventApi,
-    eventTupleToStore,
-    getClippingParents,
-    getElSeg,
-    getRectCenter,
-    getRelevantEvents,
-    globalDefaults,
-    Interaction,
-    interactionSettingsStore,
-    interactionSettingsToStore,
-    intersectRects,
-    isDateSpansEqual,
-    isInteractionValid,
-    mapHash,
-    parseDragMeta,
-    parseEventDef,
-    pointInsideRect,
-    preventContextMenu,
-    preventSelection,
-    rangeContainsRange,
-    removeElement,
-    ScrollController,
-    startOfDay,
-    whenTransitionDone,
-    WindowScrollController
-} from '@fullcalendar/core';
-
-/*! *****************************************************************************
-Copyright (c) Microsoft Corporation. All rights reserved.
-Licensed under the Apache License, Version 2.0 (the "License"); you may not use
-this file except in compliance with the License. You may obtain a copy of the
-License at http://www.apache.org/licenses/LICENSE-2.0
-
-THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
-WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
-MERCHANTABLITY OR NON-INFRINGEMENT.
-
-See the Apache Version 2.0 License for specific language governing permissions
-and limitations under the License.
-***************************************************************************** */
-/* global Reflect, Promise */
-
-var extendStatics = function(d, b) {
-    extendStatics = Object.setPrototypeOf ||
-        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-    return extendStatics(d, b);
-};
-
-function __extends(d, b) {
-    extendStatics(d, b);
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-}
-
-var __assign = function() {
-    __assign = Object.assign || function __assign(t) {
-        for (var s, i = 1, n = arguments.length; i < n; i++) {
-            s = arguments[i];
-            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
-        }
-        return t;
-    };
-    return __assign.apply(this, arguments);
-};
-
-config.touchMouseIgnoreWait = 500;
-var ignoreMouseDepth = 0;
-var listenerCnt = 0;
-var isWindowTouchMoveCancelled = false;
-/*
-Uses a "pointer" abstraction, which monitors UI events for both mouse and touch.
-Tracks when the pointer "drags" on a certain element, meaning down+move+up.
-
-Also, tracks if there was touch-scrolling.
-Also, can prevent touch-scrolling from happening.
-Also, can fire pointermove events when scrolling happens underneath, even when no real pointer movement.
-
-emits:
-- pointerdown
-- pointermove
-- pointerup
-*/
-var PointerDragging = /** @class */ (function () {
-    function PointerDragging(containerEl) {
-        var _this = this;
-        this.subjectEl = null;
-        this.downEl = null;
-        // options that can be directly assigned by caller
-        this.selector = ''; // will cause subjectEl in all emitted events to be this element
-        this.handleSelector = '';
-        this.shouldIgnoreMove = false;
-        this.shouldWatchScroll = true; // for simulating pointermove on scroll
-        // internal states
-        this.isDragging = false;
-        this.isTouchDragging = false;
-        this.wasTouchScroll = false;
-        // Mouse
-        // ----------------------------------------------------------------------------------------------------
-        this.handleMouseDown = function (ev) {
-            if (!_this.shouldIgnoreMouse() &&
-                isPrimaryMouseButton(ev) &&
-                _this.tryStart(ev)) {
-                var pev = _this.createEventFromMouse(ev, true);
-                _this.emitter.trigger('pointerdown', pev);
-                _this.initScrollWatch(pev);
-                if (!_this.shouldIgnoreMove) {
-                    document.addEventListener('mousemove', _this.handleMouseMove);
-                }
-                document.addEventListener('mouseup', _this.handleMouseUp);
-            }
-        };
-        this.handleMouseMove = function (ev) {
-            var pev = _this.createEventFromMouse(ev);
-            _this.recordCoords(pev);
-            _this.emitter.trigger('pointermove', pev);
-        };
-        this.handleMouseUp = function (ev) {
-            document.removeEventListener('mousemove', _this.handleMouseMove);
-            document.removeEventListener('mouseup', _this.handleMouseUp);
-            _this.emitter.trigger('pointerup', _this.createEventFromMouse(ev));
-            _this.cleanup(); // call last so that pointerup has access to props
-        };
-        // Touch
-        // ----------------------------------------------------------------------------------------------------
-        this.handleTouchStart = function (ev) {
-            if (_this.tryStart(ev)) {
-                _this.isTouchDragging = true;
-                var pev = _this.createEventFromTouch(ev, true);
-                _this.emitter.trigger('pointerdown', pev);
-                _this.initScrollWatch(pev);
-                // unlike mouse, need to attach to target, not document
-                // https://stackoverflow.com/a/45760014
-                var target = ev.target;
-                if (!_this.shouldIgnoreMove) {
-                    target.addEventListener('touchmove', _this.handleTouchMove);
-                }
-                target.addEventListener('touchend', _this.handleTouchEnd);
-                target.addEventListener('touchcancel', _this.handleTouchEnd); // treat it as a touch end
-                // attach a handler to get called when ANY scroll action happens on the page.
-                // this was impossible to do with normal on/off because 'scroll' doesn't bubble.
-                // http://stackoverflow.com/a/32954565/96342
-                window.addEventListener('scroll', _this.handleTouchScroll, true // useCapture
-                );
-            }
-        };
-        this.handleTouchMove = function (ev) {
-            var pev = _this.createEventFromTouch(ev);
-            _this.recordCoords(pev);
-            _this.emitter.trigger('pointermove', pev);
-        };
-        this.handleTouchEnd = function (ev) {
-            if (_this.isDragging) { // done to guard against touchend followed by touchcancel
-                var target = ev.target;
-                target.removeEventListener('touchmove', _this.handleTouchMove);
-                target.removeEventListener('touchend', _this.handleTouchEnd);
-                target.removeEventListener('touchcancel', _this.handleTouchEnd);
-                window.removeEventListener('scroll', _this.handleTouchScroll, true); // useCaptured=true
-                _this.emitter.trigger('pointerup', _this.createEventFromTouch(ev));
-                _this.cleanup(); // call last so that pointerup has access to props
-                _this.isTouchDragging = false;
-                startIgnoringMouse();
-            }
-        };
-        this.handleTouchScroll = function () {
-            _this.wasTouchScroll = true;
-        };
-        this.handleScroll = function (ev) {
-            if (!_this.shouldIgnoreMove) {
-                var pageX = (window.pageXOffset - _this.prevScrollX) + _this.prevPageX;
-                var pageY = (window.pageYOffset - _this.prevScrollY) + _this.prevPageY;
-                _this.emitter.trigger('pointermove', {
-                    origEvent: ev,
-                    isTouch: _this.isTouchDragging,
-                    subjectEl: _this.subjectEl,
-                    pageX: pageX,
-                    pageY: pageY,
-                    deltaX: pageX - _this.origPageX,
-                    deltaY: pageY - _this.origPageY
-                });
-            }
-        };
-        this.containerEl = containerEl;
-        this.emitter = new EmitterMixin();
-        containerEl.addEventListener('mousedown', this.handleMouseDown);
-        containerEl.addEventListener('touchstart', this.handleTouchStart, { passive: true });
-        listenerCreated();
-    }
-    PointerDragging.prototype.destroy = function () {
-        this.containerEl.removeEventListener('mousedown', this.handleMouseDown);
-        this.containerEl.removeEventListener('touchstart', this.handleTouchStart, { passive: true });
-        listenerDestroyed();
-    };
-    PointerDragging.prototype.tryStart = function (ev) {
-        var subjectEl = this.querySubjectEl(ev);
-        var downEl = ev.target;
-        if (subjectEl &&
-            (!this.handleSelector || elementClosest(downEl, this.handleSelector))) {
-            this.subjectEl = subjectEl;
-            this.downEl = downEl;
-            this.isDragging = true; // do this first so cancelTouchScroll will work
-            this.wasTouchScroll = false;
-            return true;
-        }
-        return false;
-    };
-    PointerDragging.prototype.cleanup = function () {
-        isWindowTouchMoveCancelled = false;
-        this.isDragging = false;
-        this.subjectEl = null;
-        this.downEl = null;
-        // keep wasTouchScroll around for later access
-        this.destroyScrollWatch();
-    };
-    PointerDragging.prototype.querySubjectEl = function (ev) {
-        if (this.selector) {
-            return elementClosest(ev.target, this.selector);
-        }
-        else {
-            return this.containerEl;
-        }
-    };
-    PointerDragging.prototype.shouldIgnoreMouse = function () {
-        return ignoreMouseDepth || this.isTouchDragging;
-    };
-    // can be called by user of this class, to cancel touch-based scrolling for the current drag
-    PointerDragging.prototype.cancelTouchScroll = function () {
-        if (this.isDragging) {
-            isWindowTouchMoveCancelled = true;
-        }
-    };
-    // Scrolling that simulates pointermoves
-    // ----------------------------------------------------------------------------------------------------
-    PointerDragging.prototype.initScrollWatch = function (ev) {
-        if (this.shouldWatchScroll) {
-            this.recordCoords(ev);
-            window.addEventListener('scroll', this.handleScroll, true); // useCapture=true
-        }
-    };
-    PointerDragging.prototype.recordCoords = function (ev) {
-        if (this.shouldWatchScroll) {
-            this.prevPageX = ev.pageX;
-            this.prevPageY = ev.pageY;
-            this.prevScrollX = window.pageXOffset;
-            this.prevScrollY = window.pageYOffset;
-        }
-    };
-    PointerDragging.prototype.destroyScrollWatch = function () {
-        if (this.shouldWatchScroll) {
-            window.removeEventListener('scroll', this.handleScroll, true); // useCaptured=true
-        }
-    };
-    // Event Normalization
-    // ----------------------------------------------------------------------------------------------------
-    PointerDragging.prototype.createEventFromMouse = function (ev, isFirst) {
-        var deltaX = 0;
-        var deltaY = 0;
-        // TODO: repeat code
-        if (isFirst) {
-            this.origPageX = ev.pageX;
-            this.origPageY = ev.pageY;
-        }
-        else {
-            deltaX = ev.pageX - this.origPageX;
-            deltaY = ev.pageY - this.origPageY;
-        }
-        return {
-            origEvent: ev,
-            isTouch: false,
-            subjectEl: this.subjectEl,
-            pageX: ev.pageX,
-            pageY: ev.pageY,
-            deltaX: deltaX,
-            deltaY: deltaY
-        };
-    };
-    PointerDragging.prototype.createEventFromTouch = function (ev, isFirst) {
-        var touches = ev.touches;
-        var pageX;
-        var pageY;
-        var deltaX = 0;
-        var deltaY = 0;
-        // if touch coords available, prefer,
-        // because FF would give bad ev.pageX ev.pageY
-        if (touches && touches.length) {
-            pageX = touches[0].pageX;
-            pageY = touches[0].pageY;
-        }
-        else {
-            pageX = ev.pageX;
-            pageY = ev.pageY;
-        }
-        // TODO: repeat code
-        if (isFirst) {
-            this.origPageX = pageX;
-            this.origPageY = pageY;
-        }
-        else {
-            deltaX = pageX - this.origPageX;
-            deltaY = pageY - this.origPageY;
-        }
-        return {
-            origEvent: ev,
-            isTouch: true,
-            subjectEl: this.subjectEl,
-            pageX: pageX,
-            pageY: pageY,
-            deltaX: deltaX,
-            deltaY: deltaY
-        };
-    };
-    return PointerDragging;
-}());
-// Returns a boolean whether this was a left mouse click and no ctrl key (which means right click on Mac)
-function isPrimaryMouseButton(ev) {
-    return ev.button === 0 && !ev.ctrlKey;
-}
-// Ignoring fake mouse events generated by touch
-// ----------------------------------------------------------------------------------------------------
-function startIgnoringMouse() {
-    ignoreMouseDepth++;
-    setTimeout(function () {
-        ignoreMouseDepth--;
-    }, config.touchMouseIgnoreWait);
-}
-// We want to attach touchmove as early as possible for Safari
-// ----------------------------------------------------------------------------------------------------
-function listenerCreated() {
-    if (!(listenerCnt++)) {
-        window.addEventListener('touchmove', onWindowTouchMove, { passive: false });
-    }
-}
-function listenerDestroyed() {
-    if (!(--listenerCnt)) {
-        window.removeEventListener('touchmove', onWindowTouchMove, { passive: false });
-    }
-}
-function onWindowTouchMove(ev) {
-    if (isWindowTouchMoveCancelled) {
-        ev.preventDefault();
-    }
-}
-
-/*
-An effect in which an element follows the movement of a pointer across the screen.
-The moving element is a clone of some other element.
-Must call start + handleMove + stop.
-*/
-var ElementMirror = /** @class */ (function () {
-    function ElementMirror() {
-        this.isVisible = false; // must be explicitly enabled
-        this.sourceEl = null;
-        this.mirrorEl = null;
-        this.sourceElRect = null; // screen coords relative to viewport
-        // options that can be set directly by caller
-        this.parentNode = document.body;
-        this.zIndex = 9999;
-        this.revertDuration = 0;
-    }
-    ElementMirror.prototype.start = function (sourceEl, pageX, pageY) {
-        this.sourceEl = sourceEl;
-        this.sourceElRect = this.sourceEl.getBoundingClientRect();
-        this.origScreenX = pageX - window.pageXOffset;
-        this.origScreenY = pageY - window.pageYOffset;
-        this.deltaX = 0;
-        this.deltaY = 0;
-        this.updateElPosition();
-    };
-    ElementMirror.prototype.handleMove = function (pageX, pageY) {
-        this.deltaX = (pageX - window.pageXOffset) - this.origScreenX;
-        this.deltaY = (pageY - window.pageYOffset) - this.origScreenY;
-        this.updateElPosition();
-    };
-    // can be called before start
-    ElementMirror.prototype.setIsVisible = function (bool) {
-        if (bool) {
-            if (!this.isVisible) {
-                if (this.mirrorEl) {
-                    this.mirrorEl.style.display = '';
-                }
-                this.isVisible = bool; // needs to happen before updateElPosition
-                this.updateElPosition(); // because was not updating the position while invisible
-            }
-        }
-        else {
-            if (this.isVisible) {
-                if (this.mirrorEl) {
-                    this.mirrorEl.style.display = 'none';
-                }
-                this.isVisible = bool;
-            }
-        }
-    };
-    // always async
-    ElementMirror.prototype.stop = function (needsRevertAnimation, callback) {
-        var _this = this;
-        var done = function () {
-            _this.cleanup();
-            callback();
-        };
-        if (needsRevertAnimation &&
-            this.mirrorEl &&
-            this.isVisible &&
-            this.revertDuration && // if 0, transition won't work
-            (this.deltaX || this.deltaY) // if same coords, transition won't work
-        ) {
-            this.doRevertAnimation(done, this.revertDuration);
-        }
-        else {
-            setTimeout(done, 0);
-        }
-    };
-    ElementMirror.prototype.doRevertAnimation = function (callback, revertDuration) {
-        var mirrorEl = this.mirrorEl;
-        var finalSourceElRect = this.sourceEl.getBoundingClientRect(); // because autoscrolling might have happened
-        mirrorEl.style.transition =
-            'top ' + revertDuration + 'ms,' +
-                'left ' + revertDuration + 'ms';
-        applyStyle(mirrorEl, {
-            left: finalSourceElRect.left,
-            top: finalSourceElRect.top
-        });
-        whenTransitionDone(mirrorEl, function () {
-            mirrorEl.style.transition = '';
-            callback();
-        });
-    };
-    ElementMirror.prototype.cleanup = function () {
-        if (this.mirrorEl) {
-            removeElement(this.mirrorEl);
-            this.mirrorEl = null;
-        }
-        this.sourceEl = null;
-    };
-    ElementMirror.prototype.updateElPosition = function () {
-        if (this.sourceEl && this.isVisible) {
-            applyStyle(this.getMirrorEl(), {
-                left: this.sourceElRect.left + this.deltaX,
-                top: this.sourceElRect.top + this.deltaY
-            });
-        }
-    };
-    ElementMirror.prototype.getMirrorEl = function () {
-        var sourceElRect = this.sourceElRect;
-        var mirrorEl = this.mirrorEl;
-        if (!mirrorEl) {
-            mirrorEl = this.mirrorEl = this.sourceEl.cloneNode(true); // cloneChildren=true
-            // we don't want long taps or any mouse interaction causing selection/menus.
-            // would use preventSelection(), but that prevents selectstart, causing problems.
-            mirrorEl.classList.add('fc-unselectable');
-            mirrorEl.classList.add('fc-dragging');
-            applyStyle(mirrorEl, {
-                position: 'fixed',
-                zIndex: this.zIndex,
-                visibility: '',
-                boxSizing: 'border-box',
-                width: sourceElRect.right - sourceElRect.left,
-                height: sourceElRect.bottom - sourceElRect.top,
-                right: 'auto',
-                bottom: 'auto',
-                margin: 0
-            });
-            this.parentNode.appendChild(mirrorEl);
-        }
-        return mirrorEl;
-    };
-    return ElementMirror;
-}());
-
-/*
-Is a cache for a given element's scroll information (all the info that ScrollController stores)
-in addition the "client rectangle" of the element.. the area within the scrollbars.
-
-The cache can be in one of two modes:
-- doesListening:false - ignores when the container is scrolled by someone else
-- doesListening:true - watch for scrolling and update the cache
-*/
-var ScrollGeomCache = /** @class */ (function (_super) {
-    __extends(ScrollGeomCache, _super);
-    function ScrollGeomCache(scrollController, doesListening) {
-        var _this = _super.call(this) || this;
-        _this.handleScroll = function () {
-            _this.scrollTop = _this.scrollController.getScrollTop();
-            _this.scrollLeft = _this.scrollController.getScrollLeft();
-            _this.handleScrollChange();
-        };
-        _this.scrollController = scrollController;
-        _this.doesListening = doesListening;
-        _this.scrollTop = _this.origScrollTop = scrollController.getScrollTop();
-        _this.scrollLeft = _this.origScrollLeft = scrollController.getScrollLeft();
-        _this.scrollWidth = scrollController.getScrollWidth();
-        _this.scrollHeight = scrollController.getScrollHeight();
-        _this.clientWidth = scrollController.getClientWidth();
-        _this.clientHeight = scrollController.getClientHeight();
-        _this.clientRect = _this.computeClientRect(); // do last in case it needs cached values
-        if (_this.doesListening) {
-            _this.getEventTarget().addEventListener('scroll', _this.handleScroll);
-        }
-        return _this;
-    }
-    ScrollGeomCache.prototype.destroy = function () {
-        if (this.doesListening) {
-            this.getEventTarget().removeEventListener('scroll', this.handleScroll);
-        }
-    };
-    ScrollGeomCache.prototype.getScrollTop = function () {
-        return this.scrollTop;
-    };
-    ScrollGeomCache.prototype.getScrollLeft = function () {
-        return this.scrollLeft;
-    };
-    ScrollGeomCache.prototype.setScrollTop = function (top) {
-        this.scrollController.setScrollTop(top);
-        if (!this.doesListening) {
-            // we are not relying on the element to normalize out-of-bounds scroll values
-            // so we need to sanitize ourselves
-            this.scrollTop = Math.max(Math.min(top, this.getMaxScrollTop()), 0);
-            this.handleScrollChange();
-        }
-    };
-    ScrollGeomCache.prototype.setScrollLeft = function (top) {
-        this.scrollController.setScrollLeft(top);
-        if (!this.doesListening) {
-            // we are not relying on the element to normalize out-of-bounds scroll values
-            // so we need to sanitize ourselves
-            this.scrollLeft = Math.max(Math.min(top, this.getMaxScrollLeft()), 0);
-            this.handleScrollChange();
-        }
-    };
-    ScrollGeomCache.prototype.getClientWidth = function () {
-        return this.clientWidth;
-    };
-    ScrollGeomCache.prototype.getClientHeight = function () {
-        return this.clientHeight;
-    };
-    ScrollGeomCache.prototype.getScrollWidth = function () {
-        return this.scrollWidth;
-    };
-    ScrollGeomCache.prototype.getScrollHeight = function () {
-        return this.scrollHeight;
-    };
-    ScrollGeomCache.prototype.handleScrollChange = function () {
-    };
-    return ScrollGeomCache;
-}(ScrollController));
-var ElementScrollGeomCache = /** @class */ (function (_super) {
-    __extends(ElementScrollGeomCache, _super);
-    function ElementScrollGeomCache(el, doesListening) {
-        return _super.call(this, new ElementScrollController(el), doesListening) || this;
-    }
-    ElementScrollGeomCache.prototype.getEventTarget = function () {
-        return this.scrollController.el;
-    };
-    ElementScrollGeomCache.prototype.computeClientRect = function () {
-        return computeInnerRect(this.scrollController.el);
-    };
-    return ElementScrollGeomCache;
-}(ScrollGeomCache));
-var WindowScrollGeomCache = /** @class */ (function (_super) {
-    __extends(WindowScrollGeomCache, _super);
-    function WindowScrollGeomCache(doesListening) {
-        return _super.call(this, new WindowScrollController(), doesListening) || this;
-    }
-    WindowScrollGeomCache.prototype.getEventTarget = function () {
-        return window;
-    };
-    WindowScrollGeomCache.prototype.computeClientRect = function () {
-        return {
-            left: this.scrollLeft,
-            right: this.scrollLeft + this.clientWidth,
-            top: this.scrollTop,
-            bottom: this.scrollTop + this.clientHeight
-        };
-    };
-    // the window is the only scroll object that changes it's rectangle relative
-    // to the document's topleft as it scrolls
-    WindowScrollGeomCache.prototype.handleScrollChange = function () {
-        this.clientRect = this.computeClientRect();
-    };
-    return WindowScrollGeomCache;
-}(ScrollGeomCache));
-
-// If available we are using native "performance" API instead of "Date"
-// Read more about it on MDN:
-// https://developer.mozilla.org/en-US/docs/Web/API/Performance
-var getTime = typeof performance === 'function' ? performance.now : Date.now;
-/*
-For a pointer interaction, automatically scrolls certain scroll containers when the pointer
-approaches the edge.
-
-The caller must call start + handleMove + stop.
-*/
-var AutoScroller = /** @class */ (function () {
-    function AutoScroller() {
-        var _this = this;
-        // options that can be set by caller
-        this.isEnabled = true;
-        this.scrollQuery = [window, '.fc-scroller'];
-        this.edgeThreshold = 50; // pixels
-        this.maxVelocity = 300; // pixels per second
-        // internal state
-        this.pointerScreenX = null;
-        this.pointerScreenY = null;
-        this.isAnimating = false;
-        this.scrollCaches = null;
-        // protect against the initial pointerdown being too close to an edge and starting the scroll
-        this.everMovedUp = false;
-        this.everMovedDown = false;
-        this.everMovedLeft = false;
-        this.everMovedRight = false;
-        this.animate = function () {
-            if (_this.isAnimating) { // wasn't cancelled between animation calls
-                var edge = _this.computeBestEdge(_this.pointerScreenX + window.pageXOffset, _this.pointerScreenY + window.pageYOffset);
-                if (edge) {
-                    var now = getTime();
-                    _this.handleSide(edge, (now - _this.msSinceRequest) / 1000);
-                    _this.requestAnimation(now);
-                }
-                else {
-                    _this.isAnimating = false; // will stop animation
-                }
-            }
-        };
-    }
-    AutoScroller.prototype.start = function (pageX, pageY) {
-        if (this.isEnabled) {
-            this.scrollCaches = this.buildCaches();
-            this.pointerScreenX = null;
-            this.pointerScreenY = null;
-            this.everMovedUp = false;
-            this.everMovedDown = false;
-            this.everMovedLeft = false;
-            this.everMovedRight = false;
-            this.handleMove(pageX, pageY);
-        }
-    };
-    AutoScroller.prototype.handleMove = function (pageX, pageY) {
-        if (this.isEnabled) {
-            var pointerScreenX = pageX - window.pageXOffset;
-            var pointerScreenY = pageY - window.pageYOffset;
-            var yDelta = this.pointerScreenY === null ? 0 : pointerScreenY - this.pointerScreenY;
-            var xDelta = this.pointerScreenX === null ? 0 : pointerScreenX - this.pointerScreenX;
-            if (yDelta < 0) {
-                this.everMovedUp = true;
-            }
-            else if (yDelta > 0) {
-                this.everMovedDown = true;
-            }
-            if (xDelta < 0) {
-                this.everMovedLeft = true;
-            }
-            else if (xDelta > 0) {
-                this.everMovedRight = true;
-            }
-            this.pointerScreenX = pointerScreenX;
-            this.pointerScreenY = pointerScreenY;
-            if (!this.isAnimating) {
-                this.isAnimating = true;
-                this.requestAnimation(getTime());
-            }
-        }
-    };
-    AutoScroller.prototype.stop = function () {
-        if (this.isEnabled) {
-            this.isAnimating = false; // will stop animation
-            for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) {
-                var scrollCache = _a[_i];
-                scrollCache.destroy();
-            }
-            this.scrollCaches = null;
-        }
-    };
-    AutoScroller.prototype.requestAnimation = function (now) {
-        this.msSinceRequest = now;
-        requestAnimationFrame(this.animate);
-    };
-    AutoScroller.prototype.handleSide = function (edge, seconds) {
-        var scrollCache = edge.scrollCache;
-        var edgeThreshold = this.edgeThreshold;
-        var invDistance = edgeThreshold - edge.distance;
-        var velocity = // the closer to the edge, the faster we scroll
-         (invDistance * invDistance) / (edgeThreshold * edgeThreshold) * // quadratic
-            this.maxVelocity * seconds;
-        var sign = 1;
-        switch (edge.name) {
-            case 'left':
-                sign = -1;
-            // falls through
-            case 'right':
-                scrollCache.setScrollLeft(scrollCache.getScrollLeft() + velocity * sign);
-                break;
-            case 'top':
-                sign = -1;
-            // falls through
-            case 'bottom':
-                scrollCache.setScrollTop(scrollCache.getScrollTop() + velocity * sign);
-                break;
-        }
-    };
-    // left/top are relative to document topleft
-    AutoScroller.prototype.computeBestEdge = function (left, top) {
-        var edgeThreshold = this.edgeThreshold;
-        var bestSide = null;
-        for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) {
-            var scrollCache = _a[_i];
-            var rect = scrollCache.clientRect;
-            var leftDist = left - rect.left;
-            var rightDist = rect.right - left;
-            var topDist = top - rect.top;
-            var bottomDist = rect.bottom - top;
-            // completely within the rect?
-            if (leftDist >= 0 && rightDist >= 0 && topDist >= 0 && bottomDist >= 0) {
-                if (topDist <= edgeThreshold && this.everMovedUp && scrollCache.canScrollUp() &&
-                    (!bestSide || bestSide.distance > topDist)) {
-                    bestSide = { scrollCache: scrollCache, name: 'top', distance: topDist };
-                }
-                if (bottomDist <= edgeThreshold && this.everMovedDown && scrollCache.canScrollDown() &&
-                    (!bestSide || bestSide.distance > bottomDist)) {
-                    bestSide = { scrollCache: scrollCache, name: 'bottom', distance: bottomDist };
-                }
-                if (leftDist <= edgeThreshold && this.everMovedLeft && scrollCache.canScrollLeft() &&
-                    (!bestSide || bestSide.distance > leftDist)) {
-                    bestSide = { scrollCache: scrollCache, name: 'left', distance: leftDist };
-                }
-                if (rightDist <= edgeThreshold && this.everMovedRight && scrollCache.canScrollRight() &&
-                    (!bestSide || bestSide.distance > rightDist)) {
-                    bestSide = { scrollCache: scrollCache, name: 'right', distance: rightDist };
-                }
-            }
-        }
-        return bestSide;
-    };
-    AutoScroller.prototype.buildCaches = function () {
-        return this.queryScrollEls().map(function (el) {
-            if (el === window) {
-                return new WindowScrollGeomCache(false); // false = don't listen to user-generated scrolls
-            }
-            else {
-                return new ElementScrollGeomCache(el, false); // false = don't listen to user-generated scrolls
-            }
-        });
-    };
-    AutoScroller.prototype.queryScrollEls = function () {
-        var els = [];
-        for (var _i = 0, _a = this.scrollQuery; _i < _a.length; _i++) {
-            var query = _a[_i];
-            if (typeof query === 'object') {
-                els.push(query);
-            }
-            else {
-                els.push.apply(els, Array.prototype.slice.call(document.querySelectorAll(query)));
-            }
-        }
-        return els;
-    };
-    return AutoScroller;
-}());
-
-/*
-Monitors dragging on an element. Has a number of high-level features:
-- minimum distance required before dragging
-- minimum wait time ("delay") before dragging
-- a mirror element that follows the pointer
-*/
-var FeaturefulElementDragging = /** @class */ (function (_super) {
-    __extends(FeaturefulElementDragging, _super);
-    function FeaturefulElementDragging(containerEl) {
-        var _this = _super.call(this, containerEl) || this;
-        // options that can be directly set by caller
-        // the caller can also set the PointerDragging's options as well
-        _this.delay = null;
-        _this.minDistance = 0;
-        _this.touchScrollAllowed = true; // prevents drag from starting and blocks scrolling during drag
-        _this.mirrorNeedsRevert = false;
-        _this.isInteracting = false; // is the user validly moving the pointer? lasts until pointerup
-        _this.isDragging = false; // is it INTENTFULLY dragging? lasts until after revert animation
-        _this.isDelayEnded = false;
-        _this.isDistanceSurpassed = false;
-        _this.delayTimeoutId = null;
-        _this.onPointerDown = function (ev) {
-            if (!_this.isDragging) { // so new drag doesn't happen while revert animation is going
-                _this.isInteracting = true;
-                _this.isDelayEnded = false;
-                _this.isDistanceSurpassed = false;
-                preventSelection(document.body);
-                preventContextMenu(document.body);
-                // prevent links from being visited if there's an eventual drag.
-                // also prevents selection in older browsers (maybe?).
-                // not necessary for touch, besides, browser would complain about passiveness.
-                if (!ev.isTouch) {
-                    ev.origEvent.preventDefault();
-                }
-                _this.emitter.trigger('pointerdown', ev);
-                if (!_this.pointer.shouldIgnoreMove) {
-                    // actions related to initiating dragstart+dragmove+dragend...
-                    _this.mirror.setIsVisible(false); // reset. caller must set-visible
-                    _this.mirror.start(ev.subjectEl, ev.pageX, ev.pageY); // must happen on first pointer down
-                    _this.startDelay(ev);
-                    if (!_this.minDistance) {
-                        _this.handleDistanceSurpassed(ev);
-                    }
-                }
-            }
-        };
-        _this.onPointerMove = function (ev) {
-            if (_this.isInteracting) { // if false, still waiting for previous drag's revert
-                _this.emitter.trigger('pointermove', ev);
-                if (!_this.isDistanceSurpassed) {
-                    var minDistance = _this.minDistance;
-                    var distanceSq = void 0; // current distance from the origin, squared
-                    var deltaX = ev.deltaX, deltaY = ev.deltaY;
-                    distanceSq = deltaX * deltaX + deltaY * deltaY;
-                    if (distanceSq >= minDistance * minDistance) { // use pythagorean theorem
-                        _this.handleDistanceSurpassed(ev);
-                    }
-                }
-                if (_this.isDragging) {
-                    // a real pointer move? (not one simulated by scrolling)
-                    if (ev.origEvent.type !== 'scroll') {
-                        _this.mirror.handleMove(ev.pageX, ev.pageY);
-                        _this.autoScroller.handleMove(ev.pageX, ev.pageY);
-                    }
-                    _this.emitter.trigger('dragmove', ev);
-                }
-            }
-        };
-        _this.onPointerUp = function (ev) {
-            if (_this.isInteracting) { // if false, still waiting for previous drag's revert
-                _this.isInteracting = false;
-                allowSelection(document.body);
-                allowContextMenu(document.body);
-                _this.emitter.trigger('pointerup', ev); // can potentially set mirrorNeedsRevert
-                if (_this.isDragging) {
-                    _this.autoScroller.stop();
-                    _this.tryStopDrag(ev); // which will stop the mirror
-                }
-                if (_this.delayTimeoutId) {
-                    clearTimeout(_this.delayTimeoutId);
-                    _this.delayTimeoutId = null;
-                }
-            }
-        };
-        var pointer = _this.pointer = new PointerDragging(containerEl);
-        pointer.emitter.on('pointerdown', _this.onPointerDown);
-        pointer.emitter.on('pointermove', _this.onPointerMove);
-        pointer.emitter.on('pointerup', _this.onPointerUp);
-        _this.mirror = new ElementMirror();
-        _this.autoScroller = new AutoScroller();
-        return _this;
-    }
-    FeaturefulElementDragging.prototype.destroy = function () {
-        this.pointer.destroy();
-    };
-    FeaturefulElementDragging.prototype.startDelay = function (ev) {
-        var _this = this;
-        if (typeof this.delay === 'number') {
-            this.delayTimeoutId = setTimeout(function () {
-                _this.delayTimeoutId = null;
-                _this.handleDelayEnd(ev);
-            }, this.delay); // not assignable to number!
-        }
-        else {
-            this.handleDelayEnd(ev);
-        }
-    };
-    FeaturefulElementDragging.prototype.handleDelayEnd = function (ev) {
-        this.isDelayEnded = true;
-        this.tryStartDrag(ev);
-    };
-    FeaturefulElementDragging.prototype.handleDistanceSurpassed = function (ev) {
-        this.isDistanceSurpassed = true;
-        this.tryStartDrag(ev);
-    };
-    FeaturefulElementDragging.prototype.tryStartDrag = function (ev) {
-        if (this.isDelayEnded && this.isDistanceSurpassed) {
-            if (!this.pointer.wasTouchScroll || this.touchScrollAllowed) {
-                this.isDragging = true;
-                this.mirrorNeedsRevert = false;
-                this.autoScroller.start(ev.pageX, ev.pageY);
-                this.emitter.trigger('dragstart', ev);
-                if (this.touchScrollAllowed === false) {
-                    this.pointer.cancelTouchScroll();
-                }
-            }
-        }
-    };
-    FeaturefulElementDragging.prototype.tryStopDrag = function (ev) {
-        // .stop() is ALWAYS asynchronous, which we NEED because we want all pointerup events
-        // that come from the document to fire beforehand. much more convenient this way.
-        this.mirror.stop(this.mirrorNeedsRevert, this.stopDrag.bind(this, ev) // bound with args
-        );
-    };
-    FeaturefulElementDragging.prototype.stopDrag = function (ev) {
-        this.isDragging = false;
-        this.emitter.trigger('dragend', ev);
-    };
-    // fill in the implementations...
-    FeaturefulElementDragging.prototype.setIgnoreMove = function (bool) {
-        this.pointer.shouldIgnoreMove = bool;
-    };
-    FeaturefulElementDragging.prototype.setMirrorIsVisible = function (bool) {
-        this.mirror.setIsVisible(bool);
-    };
-    FeaturefulElementDragging.prototype.setMirrorNeedsRevert = function (bool) {
-        this.mirrorNeedsRevert = bool;
-    };
-    FeaturefulElementDragging.prototype.setAutoScrollEnabled = function (bool) {
-        this.autoScroller.isEnabled = bool;
-    };
-    return FeaturefulElementDragging;
-}(ElementDragging));
-
-/*
-When this class is instantiated, it records the offset of an element (relative to the document topleft),
-and continues to monitor scrolling, updating the cached coordinates if it needs to.
-Does not access the DOM after instantiation, so highly performant.
-
-Also keeps track of all scrolling/overflow:hidden containers that are parents of the given element
-and an determine if a given point is inside the combined clipping rectangle.
-*/
-var OffsetTracker = /** @class */ (function () {
-    function OffsetTracker(el) {
-        this.origRect = computeRect(el);
-        // will work fine for divs that have overflow:hidden
-        this.scrollCaches = getClippingParents(el).map(function (el) {
-            return new ElementScrollGeomCache(el, true); // listen=true
-        });
-    }
-    OffsetTracker.prototype.destroy = function () {
-        for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) {
-            var scrollCache = _a[_i];
-            scrollCache.destroy();
-        }
-    };
-    OffsetTracker.prototype.computeLeft = function () {
-        var left = this.origRect.left;
-        for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) {
-            var scrollCache = _a[_i];
-            left += scrollCache.origScrollLeft - scrollCache.getScrollLeft();
-        }
-        return left;
-    };
-    OffsetTracker.prototype.computeTop = function () {
-        var top = this.origRect.top;
-        for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) {
-            var scrollCache = _a[_i];
-            top += scrollCache.origScrollTop - scrollCache.getScrollTop();
-        }
-        return top;
-    };
-    OffsetTracker.prototype.isWithinClipping = function (pageX, pageY) {
-        var point = { left: pageX, top: pageY };
-        for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) {
-            var scrollCache = _a[_i];
-            if (!isIgnoredClipping(scrollCache.getEventTarget()) &&
-                !pointInsideRect(point, scrollCache.clientRect)) {
-                return false;
-            }
-        }
-        return true;
-    };
-    return OffsetTracker;
-}());
-// certain clipping containers should never constrain interactions, like <html> and <body>
-// https://github.com/fullcalendar/fullcalendar/issues/3615
-function isIgnoredClipping(node) {
-    var tagName = node.tagName;
-    return tagName === 'HTML' || tagName === 'BODY';
-}
-
-/*
-Tracks movement over multiple droppable areas (aka "hits")
-that exist in one or more DateComponents.
-Relies on an existing draggable.
-
-emits:
-- pointerdown
-- dragstart
-- hitchange - fires initially, even if not over a hit
-- pointerup
-- (hitchange - again, to null, if ended over a hit)
-- dragend
-*/
-var HitDragging = /** @class */ (function () {
-    function HitDragging(dragging, droppableStore) {
-        var _this = this;
-        // options that can be set by caller
-        this.useSubjectCenter = false;
-        this.requireInitial = true; // if doesn't start out on a hit, won't emit any events
-        this.initialHit = null;
-        this.movingHit = null;
-        this.finalHit = null; // won't ever be populated if shouldIgnoreMove
-        this.handlePointerDown = function (ev) {
-            var dragging = _this.dragging;
-            _this.initialHit = null;
-            _this.movingHit = null;
-            _this.finalHit = null;
-            _this.prepareHits();
-            _this.processFirstCoord(ev);
-            if (_this.initialHit || !_this.requireInitial) {
-                dragging.setIgnoreMove(false);
-                _this.emitter.trigger('pointerdown', ev); // TODO: fire this before computing processFirstCoord, so listeners can cancel. this gets fired by almost every handler :(
-            }
-            else {
-                dragging.setIgnoreMove(true);
-            }
-        };
-        this.handleDragStart = function (ev) {
-            _this.emitter.trigger('dragstart', ev);
-            _this.handleMove(ev, true); // force = fire even if initially null
-        };
-        this.handleDragMove = function (ev) {
-            _this.emitter.trigger('dragmove', ev);
-            _this.handleMove(ev);
-        };
-        this.handlePointerUp = function (ev) {
-            _this.releaseHits();
-            _this.emitter.trigger('pointerup', ev);
-        };
-        this.handleDragEnd = function (ev) {
-            if (_this.movingHit) {
-                _this.emitter.trigger('hitupdate', null, true, ev);
-            }
-            _this.finalHit = _this.movingHit;
-            _this.movingHit = null;
-            _this.emitter.trigger('dragend', ev);
-        };
-        this.droppableStore = droppableStore;
-        dragging.emitter.on('pointerdown', this.handlePointerDown);
-        dragging.emitter.on('dragstart', this.handleDragStart);
-        dragging.emitter.on('dragmove', this.handleDragMove);
-        dragging.emitter.on('pointerup', this.handlePointerUp);
-        dragging.emitter.on('dragend', this.handleDragEnd);
-        this.dragging = dragging;
-        this.emitter = new EmitterMixin();
-    }
-    // sets initialHit
-    // sets coordAdjust
-    HitDragging.prototype.processFirstCoord = function (ev) {
-        var origPoint = { left: ev.pageX, top: ev.pageY };
-        var adjustedPoint = origPoint;
-        var subjectEl = ev.subjectEl;
-        var subjectRect;
-        if (subjectEl !== document) {
-            subjectRect = computeRect(subjectEl);
-            adjustedPoint = constrainPoint(adjustedPoint, subjectRect);
-        }
-        var initialHit = this.initialHit = this.queryHitForOffset(adjustedPoint.left, adjustedPoint.top);
-        if (initialHit) {
-            if (this.useSubjectCenter && subjectRect) {
-                var slicedSubjectRect = intersectRects(subjectRect, initialHit.rect);
-                if (slicedSubjectRect) {
-                    adjustedPoint = getRectCenter(slicedSubjectRect);
-                }
-            }
-            this.coordAdjust = diffPoints(adjustedPoint, origPoint);
-        }
-        else {
-            this.coordAdjust = { left: 0, top: 0 };
-        }
-    };
-    HitDragging.prototype.handleMove = function (ev, forceHandle) {
-        var hit = this.queryHitForOffset(ev.pageX + this.coordAdjust.left, ev.pageY + this.coordAdjust.top);
-        if (forceHandle || !isHitsEqual(this.movingHit, hit)) {
-            this.movingHit = hit;
-            this.emitter.trigger('hitupdate', hit, false, ev);
-        }
-    };
-    HitDragging.prototype.prepareHits = function () {
-        this.offsetTrackers = mapHash(this.droppableStore, function (interactionSettings) {
-            interactionSettings.component.buildPositionCaches();
-            return new OffsetTracker(interactionSettings.el);
-        });
-    };
-    HitDragging.prototype.releaseHits = function () {
-        var offsetTrackers = this.offsetTrackers;
-        for (var id in offsetTrackers) {
-            offsetTrackers[id].destroy();
-        }
-        this.offsetTrackers = {};
-    };
-    HitDragging.prototype.queryHitForOffset = function (offsetLeft, offsetTop) {
-        var _a = this, droppableStore = _a.droppableStore, offsetTrackers = _a.offsetTrackers;
-        var bestHit = null;
-        for (var id in droppableStore) {
-            var component = droppableStore[id].component;
-            var offsetTracker = offsetTrackers[id];
-            if (offsetTracker.isWithinClipping(offsetLeft, offsetTop)) {
-                var originLeft = offsetTracker.computeLeft();
-                var originTop = offsetTracker.computeTop();
-                var positionLeft = offsetLeft - originLeft;
-                var positionTop = offsetTop - originTop;
-                var origRect = offsetTracker.origRect;
-                var width = origRect.right - origRect.left;
-                var height = origRect.bottom - origRect.top;
-                if (
-                // must be within the element's bounds
-                positionLeft >= 0 && positionLeft < width &&
-                    positionTop >= 0 && positionTop < height) {
-                    var hit = component.queryHit(positionLeft, positionTop, width, height);
-                    if (hit &&
-                        (
-                        // make sure the hit is within activeRange, meaning it's not a deal cell
-                        !component.props.dateProfile || // hack for DayTile
-                            rangeContainsRange(component.props.dateProfile.activeRange, hit.dateSpan.range)) &&
-                        (!bestHit || hit.layer > bestHit.layer)) {
-                        // TODO: better way to re-orient rectangle
-                        hit.rect.left += originLeft;
-                        hit.rect.right += originLeft;
-                        hit.rect.top += originTop;
-                        hit.rect.bottom += originTop;
-                        bestHit = hit;
-                    }
-                }
-            }
-        }
-        return bestHit;
-    };
-    return HitDragging;
-}());
-function isHitsEqual(hit0, hit1) {
-    if (!hit0 && !hit1) {
-        return true;
-    }
-    if (Boolean(hit0) !== Boolean(hit1)) {
-        return false;
-    }
-    return isDateSpansEqual(hit0.dateSpan, hit1.dateSpan);
-}
-
-/*
-Monitors when the user clicks on a specific date/time of a component.
-A pointerdown+pointerup on the same "hit" constitutes a click.
-*/
-var DateClicking = /** @class */ (function (_super) {
-    __extends(DateClicking, _super);
-    function DateClicking(settings) {
-        var _this = _super.call(this, settings) || this;
-        _this.handlePointerDown = function (ev) {
-            var dragging = _this.dragging;
-            // do this in pointerdown (not dragend) because DOM might be mutated by the time dragend is fired
-            dragging.setIgnoreMove(!_this.component.isValidDateDownEl(dragging.pointer.downEl));
-        };
-        // won't even fire if moving was ignored
-        _this.handleDragEnd = function (ev) {
-            var component = _this.component;
-            var pointer = _this.dragging.pointer;
-            if (!pointer.wasTouchScroll) {
-                var _a = _this.hitDragging, initialHit = _a.initialHit, finalHit = _a.finalHit;
-                if (initialHit && finalHit && isHitsEqual(initialHit, finalHit)) {
-                    component.calendar.triggerDateClick(initialHit.dateSpan, initialHit.dayEl, component.view, ev.origEvent);
-                }
-            }
-        };
-        var component = settings.component;
-        // we DO want to watch pointer moves because otherwise finalHit won't get populated
-        _this.dragging = new FeaturefulElementDragging(component.el);
-        _this.dragging.autoScroller.isEnabled = false;
-        var hitDragging = _this.hitDragging = new HitDragging(_this.dragging, interactionSettingsToStore(settings));
-        hitDragging.emitter.on('pointerdown', _this.handlePointerDown);
-        hitDragging.emitter.on('dragend', _this.handleDragEnd);
-        return _this;
-    }
-    DateClicking.prototype.destroy = function () {
-        this.dragging.destroy();
-    };
-    return DateClicking;
-}(Interaction));
-
-/*
-Tracks when the user selects a portion of time of a component,
-constituted by a drag over date cells, with a possible delay at the beginning of the drag.
-*/
-var DateSelecting = /** @class */ (function (_super) {
-    __extends(DateSelecting, _super);
-    function DateSelecting(settings) {
-        var _this = _super.call(this, settings) || this;
-        _this.dragSelection = null;
-        _this.handlePointerDown = function (ev) {
-            var _a = _this, component = _a.component, dragging = _a.dragging;
-            var canSelect = component.opt('selectable') &&
-                component.isValidDateDownEl(ev.origEvent.target);
-            // don't bother to watch expensive moves if component won't do selection
-            dragging.setIgnoreMove(!canSelect);
-            // if touch, require user to hold down
-            dragging.delay = ev.isTouch ? getComponentTouchDelay(component) : null;
-        };
-        _this.handleDragStart = function (ev) {
-            _this.component.calendar.unselect(ev); // unselect previous selections
-        };
-        _this.handleHitUpdate = function (hit, isFinal) {
-            var calendar = _this.component.calendar;
-            var dragSelection = null;
-            var isInvalid = false;
-            if (hit) {
-                dragSelection = joinHitsIntoSelection(_this.hitDragging.initialHit, hit, calendar.pluginSystem.hooks.dateSelectionTransformers);
-                if (!dragSelection || !_this.component.isDateSelectionValid(dragSelection)) {
-                    isInvalid = true;
-                    dragSelection = null;
-                }
-            }
-            if (dragSelection) {
-                calendar.dispatch({ type: 'SELECT_DATES', selection: dragSelection });
-            }
-            else if (!isFinal) { // only unselect if moved away while dragging
-                calendar.dispatch({ type: 'UNSELECT_DATES' });
-            }
-            if (!isInvalid) {
-                enableCursor();
-            }
-            else {
-                disableCursor();
-            }
-            if (!isFinal) {
-                _this.dragSelection = dragSelection; // only clear if moved away from all hits while dragging
-            }
-        };
-        _this.handlePointerUp = function (pev) {
-            if (_this.dragSelection) {
-                // selection is already rendered, so just need to report selection
-                _this.component.calendar.triggerDateSelect(_this.dragSelection, pev);
-                _this.dragSelection = null;
-            }
-        };
-        var component = settings.component;
-        var dragging = _this.dragging = new FeaturefulElementDragging(component.el);
-        dragging.touchScrollAllowed = false;
-        dragging.minDistance = component.opt('selectMinDistance') || 0;
-        dragging.autoScroller.isEnabled = component.opt('dragScroll');
-        var hitDragging = _this.hitDragging = new HitDragging(_this.dragging, interactionSettingsToStore(settings));
-        hitDragging.emitter.on('pointerdown', _this.handlePointerDown);
-        hitDragging.emitter.on('dragstart', _this.handleDragStart);
-        hitDragging.emitter.on('hitupdate', _this.handleHitUpdate);
-        hitDragging.emitter.on('pointerup', _this.handlePointerUp);
-        return _this;
-    }
-    DateSelecting.prototype.destroy = function () {
-        this.dragging.destroy();
-    };
-    return DateSelecting;
-}(Interaction));
-function getComponentTouchDelay(component) {
-    var delay = component.opt('selectLongPressDelay');
-    if (delay == null) {
-        delay = component.opt('longPressDelay');
-    }
-    return delay;
-}
-function joinHitsIntoSelection(hit0, hit1, dateSelectionTransformers) {
-    var dateSpan0 = hit0.dateSpan;
-    var dateSpan1 = hit1.dateSpan;
-    var ms = [
-        dateSpan0.range.start,
-        dateSpan0.range.end,
-        dateSpan1.range.start,
-        dateSpan1.range.end
-    ];
-    ms.sort(compareNumbers);
-    var props = {};
-    for (var _i = 0, dateSelectionTransformers_1 = dateSelectionTransformers; _i < dateSelectionTransformers_1.length; _i++) {
-        var transformer = dateSelectionTransformers_1[_i];
-        var res = transformer(hit0, hit1);
-        if (res === false) {
-            return null;
-        }
-        else if (res) {
-            __assign(props, res);
-        }
-    }
-    props.range = { start: ms[0], end: ms[3] };
-    props.allDay = dateSpan0.allDay;
-    return props;
-}
-
-var EventDragging = /** @class */ (function (_super) {
-    __extends(EventDragging, _super);
-    function EventDragging(settings) {
-        var _this = _super.call(this, settings) || this;
-        // internal state
-        _this.subjectSeg = null; // the seg being selected/dragged
-        _this.isDragging = false;
-        _this.eventRange = null;
-        _this.relevantEvents = null; // the events being dragged
-        _this.receivingCalendar = null;
-        _this.validMutation = null;
-        _this.mutatedRelevantEvents = null;
-        _this.handlePointerDown = function (ev) {
-            var origTarget = ev.origEvent.target;
-            var _a = _this, component = _a.component, dragging = _a.dragging;
-            var mirror = dragging.mirror;
-            var initialCalendar = component.calendar;
-            var subjectSeg = _this.subjectSeg = getElSeg(ev.subjectEl);
-            var eventRange = _this.eventRange = subjectSeg.eventRange;
-            var eventInstanceId = eventRange.instance.instanceId;
-            _this.relevantEvents = getRelevantEvents(initialCalendar.state.eventStore, eventInstanceId);
-            dragging.minDistance = ev.isTouch ? 0 : component.opt('eventDragMinDistance');
-            dragging.delay =
-                // only do a touch delay if touch and this event hasn't been selected yet
-                (ev.isTouch && eventInstanceId !== component.props.eventSelection) ?
-                    getComponentTouchDelay$1(component) :
-                    null;
-            mirror.parentNode = initialCalendar.el;
-            mirror.revertDuration = component.opt('dragRevertDuration');
-            var isValid = component.isValidSegDownEl(origTarget) &&
-                !elementClosest(origTarget, '.fc-resizer'); // NOT on a resizer
-            dragging.setIgnoreMove(!isValid);
-            // disable dragging for elements that are resizable (ie, selectable)
-            // but are not draggable
-            _this.isDragging = isValid &&
-                ev.subjectEl.classList.contains('fc-draggable');
-        };
-        _this.handleDragStart = function (ev) {
-            var initialCalendar = _this.component.calendar;
-            var eventRange = _this.eventRange;
-            var eventInstanceId = eventRange.instance.instanceId;
-            if (ev.isTouch) {
-                // need to select a different event?
-                if (eventInstanceId !== _this.component.props.eventSelection) {
-                    initialCalendar.dispatch({ type: 'SELECT_EVENT', eventInstanceId: eventInstanceId });
-                }
-            }
-            else {
-                // if now using mouse, but was previous touch interaction, clear selected event
-                initialCalendar.dispatch({ type: 'UNSELECT_EVENT' });
-            }
-            if (_this.isDragging) {
-                initialCalendar.unselect(ev); // unselect *date* selection
-                initialCalendar.publiclyTrigger('eventDragStart', [
-                    {
-                        el: _this.subjectSeg.el,
-                        event: new EventApi(initialCalendar, eventRange.def, eventRange.instance),
-                        jsEvent: ev.origEvent,
-                        view: _this.component.view
-                    }
-                ]);
-            }
-        };
-        _this.handleHitUpdate = function (hit, isFinal) {
-            if (!_this.isDragging) {
-                return;
-            }
-            var relevantEvents = _this.relevantEvents;
-            var initialHit = _this.hitDragging.initialHit;
-            var initialCalendar = _this.component.calendar;
-            // states based on new hit
-            var receivingCalendar = null;
-            var mutation = null;
-            var mutatedRelevantEvents = null;
-            var isInvalid = false;
-            var interaction = {
-                affectedEvents: relevantEvents,
-                mutatedEvents: createEmptyEventStore(),
-                isEvent: true,
-                origSeg: _this.subjectSeg
-            };
-            if (hit) {
-                var receivingComponent = hit.component;
-                receivingCalendar = receivingComponent.calendar;
-                if (initialCalendar === receivingCalendar ||
-                    receivingComponent.opt('editable') && receivingComponent.opt('droppable')) {
-                    mutation = computeEventMutation(initialHit, hit, receivingCalendar.pluginSystem.hooks.eventDragMutationMassagers);
-                    if (mutation) {
-                        mutatedRelevantEvents = applyMutationToEventStore(relevantEvents, receivingCalendar.eventUiBases, mutation, receivingCalendar);
-                        interaction.mutatedEvents = mutatedRelevantEvents;
-                        if (!receivingComponent.isInteractionValid(interaction)) {
-                            isInvalid = true;
-                            mutation = null;
-                            mutatedRelevantEvents = null;
-                            interaction.mutatedEvents = createEmptyEventStore();
-                        }
-                    }
-                }
-                else {
-                    receivingCalendar = null;
-                }
-            }
-            _this.displayDrag(receivingCalendar, interaction);
-            if (!isInvalid) {
-                enableCursor();
-            }
-            else {
-                disableCursor();
-            }
-            if (!isFinal) {
-                if (initialCalendar === receivingCalendar && // TODO: write test for this
-                    isHitsEqual(initialHit, hit)) {
-                    mutation = null;
-                }
-                _this.dragging.setMirrorNeedsRevert(!mutation);
-                // render the mirror if no already-rendered mirror
-                // TODO: wish we could somehow wait for dispatch to guarantee render
-                _this.dragging.setMirrorIsVisible(!hit || !document.querySelector('.fc-mirror'));
-                // assign states based on new hit
-                _this.receivingCalendar = receivingCalendar;
-                _this.validMutation = mutation;
-                _this.mutatedRelevantEvents = mutatedRelevantEvents;
-            }
-        };
-        _this.handlePointerUp = function () {
-            if (!_this.isDragging) {
-                _this.cleanup(); // because handleDragEnd won't fire
-            }
-        };
-        _this.handleDragEnd = function (ev) {
-            if (_this.isDragging) {
-                var initialCalendar_1 = _this.component.calendar;
-                var initialView = _this.component.view;
-                var _a = _this, receivingCalendar = _a.receivingCalendar, validMutation = _a.validMutation;
-                var eventDef = _this.eventRange.def;
-                var eventInstance = _this.eventRange.instance;
-                var eventApi = new EventApi(initialCalendar_1, eventDef, eventInstance);
-                var relevantEvents_1 = _this.relevantEvents;
-                var mutatedRelevantEvents = _this.mutatedRelevantEvents;
-                var finalHit = _this.hitDragging.finalHit;
-                _this.clearDrag(); // must happen after revert animation
-                initialCalendar_1.publiclyTrigger('eventDragStop', [
-                    {
-                        el: _this.subjectSeg.el,
-                        event: eventApi,
-                        jsEvent: ev.origEvent,
-                        view: initialView
-                    }
-                ]);
-                if (validMutation) {
-                    // dropped within same calendar
-                    if (receivingCalendar === initialCalendar_1) {
-                        initialCalendar_1.dispatch({
-                            type: 'MERGE_EVENTS',
-                            eventStore: mutatedRelevantEvents
-                        });
-                        var transformed = {};
-                        for (var _i = 0, _b = initialCalendar_1.pluginSystem.hooks.eventDropTransformers; _i < _b.length; _i++) {
-                            var transformer = _b[_i];
-                            __assign(transformed, transformer(validMutation, initialCalendar_1));
-                        }
-                        var eventDropArg = __assign({}, transformed, { el: ev.subjectEl, delta: validMutation.datesDelta, oldEvent: eventApi, event: new EventApi(// the data AFTER the mutation
-                            initialCalendar_1, mutatedRelevantEvents.defs[eventDef.defId], eventInstance ? mutatedRelevantEvents.instances[eventInstance.instanceId] : null), revert: function () {
-                                initialCalendar_1.dispatch({
-                                    type: 'MERGE_EVENTS',
-                                    eventStore: relevantEvents_1
-                                });
-                            }, jsEvent: ev.origEvent, view: initialView });
-                        initialCalendar_1.publiclyTrigger('eventDrop', [eventDropArg]);
-                        // dropped in different calendar
-                    }
-                    else if (receivingCalendar) {
-                        initialCalendar_1.publiclyTrigger('eventLeave', [
-                            {
-                                draggedEl: ev.subjectEl,
-                                event: eventApi,
-                                view: initialView
-                            }
-                        ]);
-                        initialCalendar_1.dispatch({
-                            type: 'REMOVE_EVENT_INSTANCES',
-                            instances: _this.mutatedRelevantEvents.instances
-                        });
-                        receivingCalendar.dispatch({
-                            type: 'MERGE_EVENTS',
-                            eventStore: _this.mutatedRelevantEvents
-                        });
-                        if (ev.isTouch) {
-                            receivingCalendar.dispatch({
-                                type: 'SELECT_EVENT',
-                                eventInstanceId: eventInstance.instanceId
-                            });
-                        }
-                        var dropArg = __assign({}, receivingCalendar.buildDatePointApi(finalHit.dateSpan), { draggedEl: ev.subjectEl, jsEvent: ev.origEvent, view: finalHit.component // should this be finalHit.component.view? See #4644
-                         });
-                        receivingCalendar.publiclyTrigger('drop', [dropArg]);
-                        receivingCalendar.publiclyTrigger('eventReceive', [
-                            {
-                                draggedEl: ev.subjectEl,
-                                event: new EventApi(// the data AFTER the mutation
-                                receivingCalendar, mutatedRelevantEvents.defs[eventDef.defId], mutatedRelevantEvents.instances[eventInstance.instanceId]),
-                                view: finalHit.component // should this be finalHit.component.view? See #4644
-                            }
-                        ]);
-                    }
-                }
-                else {
-                    initialCalendar_1.publiclyTrigger('_noEventDrop');
-                }
-            }
-            _this.cleanup();
-        };
-        var component = _this.component;
-        var dragging = _this.dragging = new FeaturefulElementDragging(component.el);
-        dragging.pointer.selector = EventDragging.SELECTOR;
-        dragging.touchScrollAllowed = false;
-        dragging.autoScroller.isEnabled = component.opt('dragScroll');
-        var hitDragging = _this.hitDragging = new HitDragging(_this.dragging, interactionSettingsStore);
-        hitDragging.useSubjectCenter = settings.useEventCenter;
-        hitDragging.emitter.on('pointerdown', _this.handlePointerDown);
-        hitDragging.emitter.on('dragstart', _this.handleDragStart);
-        hitDragging.emitter.on('hitupdate', _this.handleHitUpdate);
-        hitDragging.emitter.on('pointerup', _this.handlePointerUp);
-        hitDragging.emitter.on('dragend', _this.handleDragEnd);
-        return _this;
-    }
-    EventDragging.prototype.destroy = function () {
-        this.dragging.destroy();
-    };
-    // render a drag state on the next receivingCalendar
-    EventDragging.prototype.displayDrag = function (nextCalendar, state) {
-        var initialCalendar = this.component.calendar;
-        var prevCalendar = this.receivingCalendar;
-        // does the previous calendar need to be cleared?
-        if (prevCalendar && prevCalendar !== nextCalendar) {
-            // does the initial calendar need to be cleared?
-            // if so, don't clear all the way. we still need to to hide the affectedEvents
-            if (prevCalendar === initialCalendar) {
-                prevCalendar.dispatch({
-                    type: 'SET_EVENT_DRAG',
-                    state: {
-                        affectedEvents: state.affectedEvents,
-                        mutatedEvents: createEmptyEventStore(),
-                        isEvent: true,
-                        origSeg: state.origSeg
-                    }
-                });
-                // completely clear the old calendar if it wasn't the initial
-            }
-            else {
-                prevCalendar.dispatch({ type: 'UNSET_EVENT_DRAG' });
-            }
-        }
-        if (nextCalendar) {
-            nextCalendar.dispatch({ type: 'SET_EVENT_DRAG', state: state });
-        }
-    };
-    EventDragging.prototype.clearDrag = function () {
-        var initialCalendar = this.component.calendar;
-        var receivingCalendar = this.receivingCalendar;
-        if (receivingCalendar) {
-            receivingCalendar.dispatch({ type: 'UNSET_EVENT_DRAG' });
-        }
-        // the initial calendar might have an dummy drag state from displayDrag
-        if (initialCalendar !== receivingCalendar) {
-            initialCalendar.dispatch({ type: 'UNSET_EVENT_DRAG' });
-        }
-    };
-    EventDragging.prototype.cleanup = function () {
-        this.subjectSeg = null;
-        this.isDragging = false;
-        this.eventRange = null;
-        this.relevantEvents = null;
-        this.receivingCalendar = null;
-        this.validMutation = null;
-        this.mutatedRelevantEvents = null;
-    };
-    EventDragging.SELECTOR = '.fc-draggable, .fc-resizable'; // TODO: test this in IE11
-    return EventDragging;
-}(Interaction));
-function computeEventMutation(hit0, hit1, massagers) {
-    var dateSpan0 = hit0.dateSpan;
-    var dateSpan1 = hit1.dateSpan;
-    var date0 = dateSpan0.range.start;
-    var date1 = dateSpan1.range.start;
-    var standardProps = {};
-    if (dateSpan0.allDay !== dateSpan1.allDay) {
-        standardProps.allDay = dateSpan1.allDay;
-        standardProps.hasEnd = hit1.component.opt('allDayMaintainDuration');
-        if (dateSpan1.allDay) {
-            // means date1 is already start-of-day,
-            // but date0 needs to be converted
-            date0 = startOfDay(date0);
-        }
-    }
-    var delta = diffDates(date0, date1, hit0.component.dateEnv, hit0.component === hit1.component ?
-        hit0.component.largeUnit :
-        null);
-    if (delta.milliseconds) { // has hours/minutes/seconds
-        standardProps.allDay = false;
-    }
-    var mutation = {
-        datesDelta: delta,
-        standardProps: standardProps
-    };
-    for (var _i = 0, massagers_1 = massagers; _i < massagers_1.length; _i++) {
-        var massager = massagers_1[_i];
-        massager(mutation, hit0, hit1);
-    }
-    return mutation;
-}
-function getComponentTouchDelay$1(component) {
-    var delay = component.opt('eventLongPressDelay');
-    if (delay == null) {
-        delay = component.opt('longPressDelay');
-    }
-    return delay;
-}
-
-var EventDragging$1 = /** @class */ (function (_super) {
-    __extends(EventDragging, _super);
-    function EventDragging(settings) {
-        var _this = _super.call(this, settings) || this;
-        // internal state
-        _this.draggingSeg = null; // TODO: rename to resizingSeg? subjectSeg?
-        _this.eventRange = null;
-        _this.relevantEvents = null;
-        _this.validMutation = null;
-        _this.mutatedRelevantEvents = null;
-        _this.handlePointerDown = function (ev) {
-            var component = _this.component;
-            var seg = _this.querySeg(ev);
-            var eventRange = _this.eventRange = seg.eventRange;
-            _this.dragging.minDistance = component.opt('eventDragMinDistance');
-            // if touch, need to be working with a selected event
-            _this.dragging.setIgnoreMove(!_this.component.isValidSegDownEl(ev.origEvent.target) ||
-                (ev.isTouch && _this.component.props.eventSelection !== eventRange.instance.instanceId));
-        };
-        _this.handleDragStart = function (ev) {
-            var calendar = _this.component.calendar;
-            var eventRange = _this.eventRange;
-            _this.relevantEvents = getRelevantEvents(calendar.state.eventStore, _this.eventRange.instance.instanceId);
-            _this.draggingSeg = _this.querySeg(ev);
-            calendar.unselect();
-            calendar.publiclyTrigger('eventResizeStart', [
-                {
-                    el: _this.draggingSeg.el,
-                    event: new EventApi(calendar, eventRange.def, eventRange.instance),
-                    jsEvent: ev.origEvent,
-                    view: _this.component.view
-                }
-            ]);
-        };
-        _this.handleHitUpdate = function (hit, isFinal, ev) {
-            var calendar = _this.component.calendar;
-            var relevantEvents = _this.relevantEvents;
-            var initialHit = _this.hitDragging.initialHit;
-            var eventInstance = _this.eventRange.instance;
-            var mutation = null;
-            var mutatedRelevantEvents = null;
-            var isInvalid = false;
-            var interaction = {
-                affectedEvents: relevantEvents,
-                mutatedEvents: createEmptyEventStore(),
-                isEvent: true,
-                origSeg: _this.draggingSeg
-            };
-            if (hit) {
-                mutation = computeMutation(initialHit, hit, ev.subjectEl.classList.contains('fc-start-resizer'), eventInstance.range, calendar.pluginSystem.hooks.eventResizeJoinTransforms);
-            }
-            if (mutation) {
-                mutatedRelevantEvents = applyMutationToEventStore(relevantEvents, calendar.eventUiBases, mutation, calendar);
-                interaction.mutatedEvents = mutatedRelevantEvents;
-                if (!_this.component.isInteractionValid(interaction)) {
-                    isInvalid = true;
-                    mutation = null;
-                    mutatedRelevantEvents = null;
-                    interaction.mutatedEvents = null;
-                }
-            }
-            if (mutatedRelevantEvents) {
-                calendar.dispatch({
-                    type: 'SET_EVENT_RESIZE',
-                    state: interaction
-                });
-            }
-            else {
-                calendar.dispatch({ type: 'UNSET_EVENT_RESIZE' });
-            }
-            if (!isInvalid) {
-                enableCursor();
-            }
-            else {
-                disableCursor();
-            }
-            if (!isFinal) {
-                if (mutation && isHitsEqual(initialHit, hit)) {
-                    mutation = null;
-                }
-                _this.validMutation = mutation;
-                _this.mutatedRelevantEvents = mutatedRelevantEvents;
-            }
-        };
-        _this.handleDragEnd = function (ev) {
-            var calendar = _this.component.calendar;
-            var view = _this.component.view;
-            var eventDef = _this.eventRange.def;
-            var eventInstance = _this.eventRange.instance;
-            var eventApi = new EventApi(calendar, eventDef, eventInstance);
-            var relevantEvents = _this.relevantEvents;
-            var mutatedRelevantEvents = _this.mutatedRelevantEvents;
-            calendar.publiclyTrigger('eventResizeStop', [
-                {
-                    el: _this.draggingSeg.el,
-                    event: eventApi,
-                    jsEvent: ev.origEvent,
-                    view: view
-                }
-            ]);
-            if (_this.validMutation) {
-                calendar.dispatch({
-                    type: 'MERGE_EVENTS',
-                    eventStore: mutatedRelevantEvents
-                });
-                calendar.publiclyTrigger('eventResize', [
-                    {
-                        el: _this.draggingSeg.el,
-                        startDelta: _this.validMutation.startDelta || createDuration(0),
-                        endDelta: _this.validMutation.endDelta || createDuration(0),
-                        prevEvent: eventApi,
-                        event: new EventApi(// the data AFTER the mutation
-                        calendar, mutatedRelevantEvents.defs[eventDef.defId], eventInstance ? mutatedRelevantEvents.instances[eventInstance.instanceId] : null),
-                        revert: function () {
-                            calendar.dispatch({
-                                type: 'MERGE_EVENTS',
-                                eventStore: relevantEvents
-                            });
-                        },
-                        jsEvent: ev.origEvent,
-                        view: view
-                    }
-                ]);
-            }
-            else {
-                calendar.publiclyTrigger('_noEventResize');
-            }
-            // reset all internal state
-            _this.draggingSeg = null;
-            _this.relevantEvents = null;
-            _this.validMutation = null;
-            // okay to keep eventInstance around. useful to set it in handlePointerDown
-        };
-        var component = settings.component;
-        var dragging = _this.dragging = new FeaturefulElementDragging(component.el);
-        dragging.pointer.selector = '.fc-resizer';
-        dragging.touchScrollAllowed = false;
-        dragging.autoScroller.isEnabled = component.opt('dragScroll');
-        var hitDragging = _this.hitDragging = new HitDragging(_this.dragging, interactionSettingsToStore(settings));
-        hitDragging.emitter.on('pointerdown', _this.handlePointerDown);
-        hitDragging.emitter.on('dragstart', _this.handleDragStart);
-        hitDragging.emitter.on('hitupdate', _this.handleHitUpdate);
-        hitDragging.emitter.on('dragend', _this.handleDragEnd);
-        return _this;
-    }
-    EventDragging.prototype.destroy = function () {
-        this.dragging.destroy();
-    };
-    EventDragging.prototype.querySeg = function (ev) {
-        return getElSeg(elementClosest(ev.subjectEl, this.component.fgSegSelector));
-    };
-    return EventDragging;
-}(Interaction));
-function computeMutation(hit0, hit1, isFromStart, instanceRange, transforms) {
-    var dateEnv = hit0.component.dateEnv;
-    var date0 = hit0.dateSpan.range.start;
-    var date1 = hit1.dateSpan.range.start;
-    var delta = diffDates(date0, date1, dateEnv, hit0.component.largeUnit);
-    var props = {};
-    for (var _i = 0, transforms_1 = transforms; _i < transforms_1.length; _i++) {
-        var transform = transforms_1[_i];
-        var res = transform(hit0, hit1);
-        if (res === false) {
-            return null;
-        }
-        else if (res) {
-            __assign(props, res);
-        }
-    }
-    if (isFromStart) {
-        if (dateEnv.add(instanceRange.start, delta) < instanceRange.end) {
-            props.startDelta = delta;
-            return props;
-        }
-    }
-    else {
-        if (dateEnv.add(instanceRange.end, delta) > instanceRange.start) {
-            props.endDelta = delta;
-            return props;
-        }
-    }
-    return null;
-}
-
-var UnselectAuto = /** @class */ (function () {
-    function UnselectAuto(calendar) {
-        var _this = this;
-        this.isRecentPointerDateSelect = false; // wish we could use a selector to detect date selection, but uses hit system
-        this.onSelect = function (selectInfo) {
-            if (selectInfo.jsEvent) {
-                _this.isRecentPointerDateSelect = true;
-            }
-        };
-        this.onDocumentPointerUp = function (pev) {
-            var _a = _this, calendar = _a.calendar, documentPointer = _a.documentPointer;
-            var state = calendar.state;
-            // touch-scrolling should never unfocus any type of selection
-            if (!documentPointer.wasTouchScroll) {
-                if (state.dateSelection && // an existing date selection?
-                    !_this.isRecentPointerDateSelect // a new pointer-initiated date selection since last onDocumentPointerUp?
-                ) {
-                    var unselectAuto = calendar.viewOpt('unselectAuto');
-                    var unselectCancel = calendar.viewOpt('unselectCancel');
-                    if (unselectAuto && (!unselectAuto || !elementClosest(documentPointer.downEl, unselectCancel))) {
-                        calendar.unselect(pev);
-                    }
-                }
-                if (state.eventSelection && // an existing event selected?
-                    !elementClosest(documentPointer.downEl, EventDragging.SELECTOR) // interaction DIDN'T start on an event
-                ) {
-                    calendar.dispatch({ type: 'UNSELECT_EVENT' });
-                }
-            }
-            _this.isRecentPointerDateSelect = false;
-        };
-        this.calendar = calendar;
-        var documentPointer = this.documentPointer = new PointerDragging(document);
-        documentPointer.shouldIgnoreMove = true;
-        documentPointer.shouldWatchScroll = false;
-        documentPointer.emitter.on('pointerup', this.onDocumentPointerUp);
-        /*
-        TODO: better way to know about whether there was a selection with the pointer
-        */
-        calendar.on('select', this.onSelect);
-    }
-    UnselectAuto.prototype.destroy = function () {
-        this.calendar.off('select', this.onSelect);
-        this.documentPointer.destroy();
-    };
-    return UnselectAuto;
-}());
-
-/*
-Given an already instantiated draggable object for one-or-more elements,
-Interprets any dragging as an attempt to drag an events that lives outside
-of a calendar onto a calendar.
-*/
-var ExternalElementDragging = /** @class */ (function () {
-    function ExternalElementDragging(dragging, suppliedDragMeta) {
-        var _this = this;
-        this.receivingCalendar = null;
-        this.droppableEvent = null; // will exist for all drags, even if create:false
-        this.suppliedDragMeta = null;
-        this.dragMeta = null;
-        this.handleDragStart = function (ev) {
-            _this.dragMeta = _this.buildDragMeta(ev.subjectEl);
-        };
-        this.handleHitUpdate = function (hit, isFinal, ev) {
-            var dragging = _this.hitDragging.dragging;
-            var receivingCalendar = null;
-            var droppableEvent = null;
-            var isInvalid = false;
-            var interaction = {
-                affectedEvents: createEmptyEventStore(),
-                mutatedEvents: createEmptyEventStore(),
-                isEvent: _this.dragMeta.create,
-                origSeg: null
-            };
-            if (hit) {
-                receivingCalendar = hit.component.calendar;
-                if (_this.canDropElOnCalendar(ev.subjectEl, receivingCalendar)) {
-                    droppableEvent = computeEventForDateSpan(hit.dateSpan, _this.dragMeta, receivingCalendar);
-                    interaction.mutatedEvents = eventTupleToStore(droppableEvent);
-                    isInvalid = !isInteractionValid(interaction, receivingCalendar);
-                    if (isInvalid) {
-                        interaction.mutatedEvents = createEmptyEventStore();
-                        droppableEvent = null;
-                    }
-                }
-            }
-            _this.displayDrag(receivingCalendar, interaction);
-            // show mirror if no already-rendered mirror element OR if we are shutting down the mirror (?)
-            // TODO: wish we could somehow wait for dispatch to guarantee render
-            dragging.setMirrorIsVisible(isFinal || !droppableEvent || !document.querySelector('.fc-mirror'));
-            if (!isInvalid) {
-                enableCursor();
-            }
-            else {
-                disableCursor();
-            }
-            if (!isFinal) {
-                dragging.setMirrorNeedsRevert(!droppableEvent);
-                _this.receivingCalendar = receivingCalendar;
-                _this.droppableEvent = droppableEvent;
-            }
-        };
-        this.handleDragEnd = function (pev) {
-            var _a = _this, receivingCalendar = _a.receivingCalendar, droppableEvent = _a.droppableEvent;
-            _this.clearDrag();
-            if (receivingCalendar && droppableEvent) {
-                var finalHit = _this.hitDragging.finalHit;
-                var finalView = finalHit.component.view;
-                var dragMeta = _this.dragMeta;
-                var arg = __assign({}, receivingCalendar.buildDatePointApi(finalHit.dateSpan), { draggedEl: pev.subjectEl, jsEvent: pev.origEvent, view: finalView });
-                receivingCalendar.publiclyTrigger('drop', [arg]);
-                if (dragMeta.create) {
-                    receivingCalendar.dispatch({
-                        type: 'MERGE_EVENTS',
-                        eventStore: eventTupleToStore(droppableEvent)
-                    });
-                    if (pev.isTouch) {
-                        receivingCalendar.dispatch({
-                            type: 'SELECT_EVENT',
-                            eventInstanceId: droppableEvent.instance.instanceId
-                        });
-                    }
-                    // signal that an external event landed
-                    receivingCalendar.publiclyTrigger('eventReceive', [
-                        {
-                            draggedEl: pev.subjectEl,
-                            event: new EventApi(receivingCalendar, droppableEvent.def, droppableEvent.instance),
-                            view: finalView
-                        }
-                    ]);
-                }
-            }
-            _this.receivingCalendar = null;
-            _this.droppableEvent = null;
-        };
-        var hitDragging = this.hitDragging = new HitDragging(dragging, interactionSettingsStore);
-        hitDragging.requireInitial = false; // will start outside of a component
-        hitDragging.emitter.on('dragstart', this.handleDragStart);
-        hitDragging.emitter.on('hitupdate', this.handleHitUpdate);
-        hitDragging.emitter.on('dragend', this.handleDragEnd);
-        this.suppliedDragMeta = suppliedDragMeta;
-    }
-    ExternalElementDragging.prototype.buildDragMeta = function (subjectEl) {
-        if (typeof this.suppliedDragMeta === 'object') {
-            return parseDragMeta(this.suppliedDragMeta);
-        }
-        else if (typeof this.suppliedDragMeta === 'function') {
-            return parseDragMeta(this.suppliedDragMeta(subjectEl));
-        }
-        else {
-            return getDragMetaFromEl(subjectEl);
-        }
-    };
-    ExternalElementDragging.prototype.displayDrag = function (nextCalendar, state) {
-        var prevCalendar = this.receivingCalendar;
-        if (prevCalendar && prevCalendar !== nextCalendar) {
-            prevCalendar.dispatch({ type: 'UNSET_EVENT_DRAG' });
-        }
-        if (nextCalendar) {
-            nextCalendar.dispatch({ type: 'SET_EVENT_DRAG', state: state });
-        }
-    };
-    ExternalElementDragging.prototype.clearDrag = function () {
-        if (this.receivingCalendar) {
-            this.receivingCalendar.dispatch({ type: 'UNSET_EVENT_DRAG' });
-        }
-    };
-    ExternalElementDragging.prototype.canDropElOnCalendar = function (el, receivingCalendar) {
-        var dropAccept = receivingCalendar.opt('dropAccept');
-        if (typeof dropAccept === 'function') {
-            return dropAccept(el);
-        }
-        else if (typeof dropAccept === 'string' && dropAccept) {
-            return Boolean(elementMatches(el, dropAccept));
-        }
-        return true;
-    };
-    return ExternalElementDragging;
-}());
-// Utils for computing event store from the DragMeta
-// ----------------------------------------------------------------------------------------------------
-function computeEventForDateSpan(dateSpan, dragMeta, calendar) {
-    var defProps = __assign({}, dragMeta.leftoverProps);
-    for (var _i = 0, _a = calendar.pluginSystem.hooks.externalDefTransforms; _i < _a.length; _i++) {
-        var transform = _a[_i];
-        __assign(defProps, transform(dateSpan, dragMeta));
-    }
-    var def = parseEventDef(defProps, dragMeta.sourceId, dateSpan.allDay, calendar.opt('forceEventDuration') || Boolean(dragMeta.duration), // hasEnd
-    calendar);
-    var start = dateSpan.range.start;
-    // only rely on time info if drop zone is all-day,
-    // otherwise, we already know the time
-    if (dateSpan.allDay && dragMeta.startTime) {
-        start = calendar.dateEnv.add(start, dragMeta.startTime);
-    }
-    var end = dragMeta.duration ?
-        calendar.dateEnv.add(start, dragMeta.duration) :
-        calendar.getDefaultEventEnd(dateSpan.allDay, start);
-    var instance = createEventInstance(def.defId, { start: start, end: end });
-    return { def: def, instance: instance };
-}
-// Utils for extracting data from element
-// ----------------------------------------------------------------------------------------------------
-function getDragMetaFromEl(el) {
-    var str = getEmbeddedElData(el, 'event');
-    var obj = str ?
-        JSON.parse(str) :
-        { create: false }; // if no embedded data, assume no event creation
-    return parseDragMeta(obj);
-}
-config.dataAttrPrefix = '';
-function getEmbeddedElData(el, name) {
-    var prefix = config.dataAttrPrefix;
-    var prefixedName = (prefix ? prefix + '-' : '') + name;
-    return el.getAttribute('data-' + prefixedName) || '';
-}
-
-/*
-Makes an element (that is *external* to any calendar) draggable.
-Can pass in data that determines how an event will be created when dropped onto a calendar.
-Leverages FullCalendar's internal drag-n-drop functionality WITHOUT a third-party drag system.
-*/
-var ExternalDraggable = /** @class */ (function () {
-    function ExternalDraggable(el, settings) {
-        var _this = this;
-        if (settings === void 0) { settings = {}; }
-        this.handlePointerDown = function (ev) {
-            var dragging = _this.dragging;
-            var _a = _this.settings, minDistance = _a.minDistance, longPressDelay = _a.longPressDelay;
-            dragging.minDistance =
-                minDistance != null ?
-                    minDistance :
-                    (ev.isTouch ? 0 : globalDefaults.eventDragMinDistance);
-            dragging.delay =
-                ev.isTouch ? // TODO: eventually read eventLongPressDelay instead vvv
-                    (longPressDelay != null ? longPressDelay : globalDefaults.longPressDelay) :
-                    0;
-        };
-        this.handleDragStart = function (ev) {
-            if (ev.isTouch &&
-                _this.dragging.delay &&
-                ev.subjectEl.classList.contains('fc-event')) {
-                _this.dragging.mirror.getMirrorEl().classList.add('fc-selected');
-            }
-        };
-        this.settings = settings;
-        var dragging = this.dragging = new FeaturefulElementDragging(el);
-        dragging.touchScrollAllowed = false;
-        if (settings.itemSelector != null) {
-            dragging.pointer.selector = settings.itemSelector;
-        }
-        if (settings.appendTo != null) {
-            dragging.mirror.parentNode = settings.appendTo; // TODO: write tests
-        }
-        dragging.emitter.on('pointerdown', this.handlePointerDown);
-        dragging.emitter.on('dragstart', this.handleDragStart);
-        new ExternalElementDragging(dragging, settings.eventData);
-    }
-    ExternalDraggable.prototype.destroy = function () {
-        this.dragging.destroy();
-    };
-    return ExternalDraggable;
-}());
-
-/*
-Detects when a *THIRD-PARTY* drag-n-drop system interacts with elements.
-The third-party system is responsible for drawing the visuals effects of the drag.
-This class simply monitors for pointer movements and fires events.
-It also has the ability to hide the moving element (the "mirror") during the drag.
-*/
-var InferredElementDragging = /** @class */ (function (_super) {
-    __extends(InferredElementDragging, _super);
-    function InferredElementDragging(containerEl) {
-        var _this = _super.call(this, containerEl) || this;
-        _this.shouldIgnoreMove = false;
-        _this.mirrorSelector = '';
-        _this.currentMirrorEl = null;
-        _this.handlePointerDown = function (ev) {
-            _this.emitter.trigger('pointerdown', ev);
-            if (!_this.shouldIgnoreMove) {
-                // fire dragstart right away. does not support delay or min-distance
-                _this.emitter.trigger('dragstart', ev);
-            }
-        };
-        _this.handlePointerMove = function (ev) {
-            if (!_this.shouldIgnoreMove) {
-                _this.emitter.trigger('dragmove', ev);
-            }
-        };
-        _this.handlePointerUp = function (ev) {
-            _this.emitter.trigger('pointerup', ev);
-            if (!_this.shouldIgnoreMove) {
-                // fire dragend right away. does not support a revert animation
-                _this.emitter.trigger('dragend', ev);
-            }
-        };
-        var pointer = _this.pointer = new PointerDragging(containerEl);
-        pointer.emitter.on('pointerdown', _this.handlePointerDown);
-        pointer.emitter.on('pointermove', _this.handlePointerMove);
-        pointer.emitter.on('pointerup', _this.handlePointerUp);
-        return _this;
-    }
-    InferredElementDragging.prototype.destroy = function () {
-        this.pointer.destroy();
-    };
-    InferredElementDragging.prototype.setIgnoreMove = function (bool) {
-        this.shouldIgnoreMove = bool;
-    };
-    InferredElementDragging.prototype.setMirrorIsVisible = function (bool) {
-        if (bool) {
-            // restore a previously hidden element.
-            // use the reference in case the selector class has already been removed.
-            if (this.currentMirrorEl) {
-                this.currentMirrorEl.style.visibility = '';
-                this.currentMirrorEl = null;
-            }
-        }
-        else {
-            var mirrorEl = this.mirrorSelector ?
-                document.querySelector(this.mirrorSelector) :
-                null;
-            if (mirrorEl) {
-                this.currentMirrorEl = mirrorEl;
-                mirrorEl.style.visibility = 'hidden';
-            }
-        }
-    };
-    return InferredElementDragging;
-}(ElementDragging));
-
-/*
-Bridges third-party drag-n-drop systems with FullCalendar.
-Must be instantiated and destroyed by caller.
-*/
-var ThirdPartyDraggable = /** @class */ (function () {
-    function ThirdPartyDraggable(containerOrSettings, settings) {
-        var containerEl = document;
-        if (
-        // wish we could just test instanceof EventTarget, but doesn't work in IE11
-        containerOrSettings === document ||
-            containerOrSettings instanceof Element) {
-            containerEl = containerOrSettings;
-            settings = settings || {};
-        }
-        else {
-            settings = (containerOrSettings || {});
-        }
-        var dragging = this.dragging = new InferredElementDragging(containerEl);
-        if (typeof settings.itemSelector === 'string') {
-            dragging.pointer.selector = settings.itemSelector;
-        }
-        else if (containerEl === document) {
-            dragging.pointer.selector = '[data-event]';
-        }
-        if (typeof settings.mirrorSelector === 'string') {
-            dragging.mirrorSelector = settings.mirrorSelector;
-        }
-        new ExternalElementDragging(dragging, settings.eventData);
-    }
-    ThirdPartyDraggable.prototype.destroy = function () {
-        this.dragging.destroy();
-    };
-    return ThirdPartyDraggable;
-}());
-
-var main = createPlugin({
-    componentInteractions: [DateClicking, DateSelecting, EventDragging, EventDragging$1],
-    calendarInteractions: [UnselectAuto],
-    elementDraggingImpl: FeaturefulElementDragging
-});
-
-export default main;
-export { ExternalDraggable as Draggable, FeaturefulElementDragging, PointerDragging, ThirdPartyDraggable };
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/interaction/main.js b/AKPlan/static/AKPlan/vendor/fullcalendar/interaction/main.js
deleted file mode 100644
index 10589f28e354060df8481d16dd181830c1ebe787..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/interaction/main.js
+++ /dev/null
@@ -1,2143 +0,0 @@
-/*!
-FullCalendar Interaction Plugin v4.3.0
-Docs & License: https://fullcalendar.io/
-(c) 2019 Adam Shaw
-*/
-
-(function (global, factory) {
-    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@fullcalendar/core')) :
-    typeof define === 'function' && define.amd ? define(['exports', '@fullcalendar/core'], factory) :
-    (global = global || self, factory(global.FullCalendarInteraction = {}, global.FullCalendar));
-}(this, function (exports, core) { 'use strict';
-
-    /*! *****************************************************************************
-    Copyright (c) Microsoft Corporation. All rights reserved.
-    Licensed under the Apache License, Version 2.0 (the "License"); you may not use
-    this file except in compliance with the License. You may obtain a copy of the
-    License at http://www.apache.org/licenses/LICENSE-2.0
-
-    THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-    KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
-    WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
-    MERCHANTABLITY OR NON-INFRINGEMENT.
-
-    See the Apache Version 2.0 License for specific language governing permissions
-    and limitations under the License.
-    ***************************************************************************** */
-    /* global Reflect, Promise */
-
-    var extendStatics = function(d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-
-    function __extends(d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    }
-
-    var __assign = function() {
-        __assign = Object.assign || function __assign(t) {
-            for (var s, i = 1, n = arguments.length; i < n; i++) {
-                s = arguments[i];
-                for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
-            }
-            return t;
-        };
-        return __assign.apply(this, arguments);
-    };
-
-    core.config.touchMouseIgnoreWait = 500;
-    var ignoreMouseDepth = 0;
-    var listenerCnt = 0;
-    var isWindowTouchMoveCancelled = false;
-    /*
-    Uses a "pointer" abstraction, which monitors UI events for both mouse and touch.
-    Tracks when the pointer "drags" on a certain element, meaning down+move+up.
-
-    Also, tracks if there was touch-scrolling.
-    Also, can prevent touch-scrolling from happening.
-    Also, can fire pointermove events when scrolling happens underneath, even when no real pointer movement.
-
-    emits:
-    - pointerdown
-    - pointermove
-    - pointerup
-    */
-    var PointerDragging = /** @class */ (function () {
-        function PointerDragging(containerEl) {
-            var _this = this;
-            this.subjectEl = null;
-            this.downEl = null;
-            // options that can be directly assigned by caller
-            this.selector = ''; // will cause subjectEl in all emitted events to be this element
-            this.handleSelector = '';
-            this.shouldIgnoreMove = false;
-            this.shouldWatchScroll = true; // for simulating pointermove on scroll
-            // internal states
-            this.isDragging = false;
-            this.isTouchDragging = false;
-            this.wasTouchScroll = false;
-            // Mouse
-            // ----------------------------------------------------------------------------------------------------
-            this.handleMouseDown = function (ev) {
-                if (!_this.shouldIgnoreMouse() &&
-                    isPrimaryMouseButton(ev) &&
-                    _this.tryStart(ev)) {
-                    var pev = _this.createEventFromMouse(ev, true);
-                    _this.emitter.trigger('pointerdown', pev);
-                    _this.initScrollWatch(pev);
-                    if (!_this.shouldIgnoreMove) {
-                        document.addEventListener('mousemove', _this.handleMouseMove);
-                    }
-                    document.addEventListener('mouseup', _this.handleMouseUp);
-                }
-            };
-            this.handleMouseMove = function (ev) {
-                var pev = _this.createEventFromMouse(ev);
-                _this.recordCoords(pev);
-                _this.emitter.trigger('pointermove', pev);
-            };
-            this.handleMouseUp = function (ev) {
-                document.removeEventListener('mousemove', _this.handleMouseMove);
-                document.removeEventListener('mouseup', _this.handleMouseUp);
-                _this.emitter.trigger('pointerup', _this.createEventFromMouse(ev));
-                _this.cleanup(); // call last so that pointerup has access to props
-            };
-            // Touch
-            // ----------------------------------------------------------------------------------------------------
-            this.handleTouchStart = function (ev) {
-                if (_this.tryStart(ev)) {
-                    _this.isTouchDragging = true;
-                    var pev = _this.createEventFromTouch(ev, true);
-                    _this.emitter.trigger('pointerdown', pev);
-                    _this.initScrollWatch(pev);
-                    // unlike mouse, need to attach to target, not document
-                    // https://stackoverflow.com/a/45760014
-                    var target = ev.target;
-                    if (!_this.shouldIgnoreMove) {
-                        target.addEventListener('touchmove', _this.handleTouchMove);
-                    }
-                    target.addEventListener('touchend', _this.handleTouchEnd);
-                    target.addEventListener('touchcancel', _this.handleTouchEnd); // treat it as a touch end
-                    // attach a handler to get called when ANY scroll action happens on the page.
-                    // this was impossible to do with normal on/off because 'scroll' doesn't bubble.
-                    // http://stackoverflow.com/a/32954565/96342
-                    window.addEventListener('scroll', _this.handleTouchScroll, true // useCapture
-                    );
-                }
-            };
-            this.handleTouchMove = function (ev) {
-                var pev = _this.createEventFromTouch(ev);
-                _this.recordCoords(pev);
-                _this.emitter.trigger('pointermove', pev);
-            };
-            this.handleTouchEnd = function (ev) {
-                if (_this.isDragging) { // done to guard against touchend followed by touchcancel
-                    var target = ev.target;
-                    target.removeEventListener('touchmove', _this.handleTouchMove);
-                    target.removeEventListener('touchend', _this.handleTouchEnd);
-                    target.removeEventListener('touchcancel', _this.handleTouchEnd);
-                    window.removeEventListener('scroll', _this.handleTouchScroll, true); // useCaptured=true
-                    _this.emitter.trigger('pointerup', _this.createEventFromTouch(ev));
-                    _this.cleanup(); // call last so that pointerup has access to props
-                    _this.isTouchDragging = false;
-                    startIgnoringMouse();
-                }
-            };
-            this.handleTouchScroll = function () {
-                _this.wasTouchScroll = true;
-            };
-            this.handleScroll = function (ev) {
-                if (!_this.shouldIgnoreMove) {
-                    var pageX = (window.pageXOffset - _this.prevScrollX) + _this.prevPageX;
-                    var pageY = (window.pageYOffset - _this.prevScrollY) + _this.prevPageY;
-                    _this.emitter.trigger('pointermove', {
-                        origEvent: ev,
-                        isTouch: _this.isTouchDragging,
-                        subjectEl: _this.subjectEl,
-                        pageX: pageX,
-                        pageY: pageY,
-                        deltaX: pageX - _this.origPageX,
-                        deltaY: pageY - _this.origPageY
-                    });
-                }
-            };
-            this.containerEl = containerEl;
-            this.emitter = new core.EmitterMixin();
-            containerEl.addEventListener('mousedown', this.handleMouseDown);
-            containerEl.addEventListener('touchstart', this.handleTouchStart, { passive: true });
-            listenerCreated();
-        }
-        PointerDragging.prototype.destroy = function () {
-            this.containerEl.removeEventListener('mousedown', this.handleMouseDown);
-            this.containerEl.removeEventListener('touchstart', this.handleTouchStart, { passive: true });
-            listenerDestroyed();
-        };
-        PointerDragging.prototype.tryStart = function (ev) {
-            var subjectEl = this.querySubjectEl(ev);
-            var downEl = ev.target;
-            if (subjectEl &&
-                (!this.handleSelector || core.elementClosest(downEl, this.handleSelector))) {
-                this.subjectEl = subjectEl;
-                this.downEl = downEl;
-                this.isDragging = true; // do this first so cancelTouchScroll will work
-                this.wasTouchScroll = false;
-                return true;
-            }
-            return false;
-        };
-        PointerDragging.prototype.cleanup = function () {
-            isWindowTouchMoveCancelled = false;
-            this.isDragging = false;
-            this.subjectEl = null;
-            this.downEl = null;
-            // keep wasTouchScroll around for later access
-            this.destroyScrollWatch();
-        };
-        PointerDragging.prototype.querySubjectEl = function (ev) {
-            if (this.selector) {
-                return core.elementClosest(ev.target, this.selector);
-            }
-            else {
-                return this.containerEl;
-            }
-        };
-        PointerDragging.prototype.shouldIgnoreMouse = function () {
-            return ignoreMouseDepth || this.isTouchDragging;
-        };
-        // can be called by user of this class, to cancel touch-based scrolling for the current drag
-        PointerDragging.prototype.cancelTouchScroll = function () {
-            if (this.isDragging) {
-                isWindowTouchMoveCancelled = true;
-            }
-        };
-        // Scrolling that simulates pointermoves
-        // ----------------------------------------------------------------------------------------------------
-        PointerDragging.prototype.initScrollWatch = function (ev) {
-            if (this.shouldWatchScroll) {
-                this.recordCoords(ev);
-                window.addEventListener('scroll', this.handleScroll, true); // useCapture=true
-            }
-        };
-        PointerDragging.prototype.recordCoords = function (ev) {
-            if (this.shouldWatchScroll) {
-                this.prevPageX = ev.pageX;
-                this.prevPageY = ev.pageY;
-                this.prevScrollX = window.pageXOffset;
-                this.prevScrollY = window.pageYOffset;
-            }
-        };
-        PointerDragging.prototype.destroyScrollWatch = function () {
-            if (this.shouldWatchScroll) {
-                window.removeEventListener('scroll', this.handleScroll, true); // useCaptured=true
-            }
-        };
-        // Event Normalization
-        // ----------------------------------------------------------------------------------------------------
-        PointerDragging.prototype.createEventFromMouse = function (ev, isFirst) {
-            var deltaX = 0;
-            var deltaY = 0;
-            // TODO: repeat code
-            if (isFirst) {
-                this.origPageX = ev.pageX;
-                this.origPageY = ev.pageY;
-            }
-            else {
-                deltaX = ev.pageX - this.origPageX;
-                deltaY = ev.pageY - this.origPageY;
-            }
-            return {
-                origEvent: ev,
-                isTouch: false,
-                subjectEl: this.subjectEl,
-                pageX: ev.pageX,
-                pageY: ev.pageY,
-                deltaX: deltaX,
-                deltaY: deltaY
-            };
-        };
-        PointerDragging.prototype.createEventFromTouch = function (ev, isFirst) {
-            var touches = ev.touches;
-            var pageX;
-            var pageY;
-            var deltaX = 0;
-            var deltaY = 0;
-            // if touch coords available, prefer,
-            // because FF would give bad ev.pageX ev.pageY
-            if (touches && touches.length) {
-                pageX = touches[0].pageX;
-                pageY = touches[0].pageY;
-            }
-            else {
-                pageX = ev.pageX;
-                pageY = ev.pageY;
-            }
-            // TODO: repeat code
-            if (isFirst) {
-                this.origPageX = pageX;
-                this.origPageY = pageY;
-            }
-            else {
-                deltaX = pageX - this.origPageX;
-                deltaY = pageY - this.origPageY;
-            }
-            return {
-                origEvent: ev,
-                isTouch: true,
-                subjectEl: this.subjectEl,
-                pageX: pageX,
-                pageY: pageY,
-                deltaX: deltaX,
-                deltaY: deltaY
-            };
-        };
-        return PointerDragging;
-    }());
-    // Returns a boolean whether this was a left mouse click and no ctrl key (which means right click on Mac)
-    function isPrimaryMouseButton(ev) {
-        return ev.button === 0 && !ev.ctrlKey;
-    }
-    // Ignoring fake mouse events generated by touch
-    // ----------------------------------------------------------------------------------------------------
-    function startIgnoringMouse() {
-        ignoreMouseDepth++;
-        setTimeout(function () {
-            ignoreMouseDepth--;
-        }, core.config.touchMouseIgnoreWait);
-    }
-    // We want to attach touchmove as early as possible for Safari
-    // ----------------------------------------------------------------------------------------------------
-    function listenerCreated() {
-        if (!(listenerCnt++)) {
-            window.addEventListener('touchmove', onWindowTouchMove, { passive: false });
-        }
-    }
-    function listenerDestroyed() {
-        if (!(--listenerCnt)) {
-            window.removeEventListener('touchmove', onWindowTouchMove, { passive: false });
-        }
-    }
-    function onWindowTouchMove(ev) {
-        if (isWindowTouchMoveCancelled) {
-            ev.preventDefault();
-        }
-    }
-
-    /*
-    An effect in which an element follows the movement of a pointer across the screen.
-    The moving element is a clone of some other element.
-    Must call start + handleMove + stop.
-    */
-    var ElementMirror = /** @class */ (function () {
-        function ElementMirror() {
-            this.isVisible = false; // must be explicitly enabled
-            this.sourceEl = null;
-            this.mirrorEl = null;
-            this.sourceElRect = null; // screen coords relative to viewport
-            // options that can be set directly by caller
-            this.parentNode = document.body;
-            this.zIndex = 9999;
-            this.revertDuration = 0;
-        }
-        ElementMirror.prototype.start = function (sourceEl, pageX, pageY) {
-            this.sourceEl = sourceEl;
-            this.sourceElRect = this.sourceEl.getBoundingClientRect();
-            this.origScreenX = pageX - window.pageXOffset;
-            this.origScreenY = pageY - window.pageYOffset;
-            this.deltaX = 0;
-            this.deltaY = 0;
-            this.updateElPosition();
-        };
-        ElementMirror.prototype.handleMove = function (pageX, pageY) {
-            this.deltaX = (pageX - window.pageXOffset) - this.origScreenX;
-            this.deltaY = (pageY - window.pageYOffset) - this.origScreenY;
-            this.updateElPosition();
-        };
-        // can be called before start
-        ElementMirror.prototype.setIsVisible = function (bool) {
-            if (bool) {
-                if (!this.isVisible) {
-                    if (this.mirrorEl) {
-                        this.mirrorEl.style.display = '';
-                    }
-                    this.isVisible = bool; // needs to happen before updateElPosition
-                    this.updateElPosition(); // because was not updating the position while invisible
-                }
-            }
-            else {
-                if (this.isVisible) {
-                    if (this.mirrorEl) {
-                        this.mirrorEl.style.display = 'none';
-                    }
-                    this.isVisible = bool;
-                }
-            }
-        };
-        // always async
-        ElementMirror.prototype.stop = function (needsRevertAnimation, callback) {
-            var _this = this;
-            var done = function () {
-                _this.cleanup();
-                callback();
-            };
-            if (needsRevertAnimation &&
-                this.mirrorEl &&
-                this.isVisible &&
-                this.revertDuration && // if 0, transition won't work
-                (this.deltaX || this.deltaY) // if same coords, transition won't work
-            ) {
-                this.doRevertAnimation(done, this.revertDuration);
-            }
-            else {
-                setTimeout(done, 0);
-            }
-        };
-        ElementMirror.prototype.doRevertAnimation = function (callback, revertDuration) {
-            var mirrorEl = this.mirrorEl;
-            var finalSourceElRect = this.sourceEl.getBoundingClientRect(); // because autoscrolling might have happened
-            mirrorEl.style.transition =
-                'top ' + revertDuration + 'ms,' +
-                    'left ' + revertDuration + 'ms';
-            core.applyStyle(mirrorEl, {
-                left: finalSourceElRect.left,
-                top: finalSourceElRect.top
-            });
-            core.whenTransitionDone(mirrorEl, function () {
-                mirrorEl.style.transition = '';
-                callback();
-            });
-        };
-        ElementMirror.prototype.cleanup = function () {
-            if (this.mirrorEl) {
-                core.removeElement(this.mirrorEl);
-                this.mirrorEl = null;
-            }
-            this.sourceEl = null;
-        };
-        ElementMirror.prototype.updateElPosition = function () {
-            if (this.sourceEl && this.isVisible) {
-                core.applyStyle(this.getMirrorEl(), {
-                    left: this.sourceElRect.left + this.deltaX,
-                    top: this.sourceElRect.top + this.deltaY
-                });
-            }
-        };
-        ElementMirror.prototype.getMirrorEl = function () {
-            var sourceElRect = this.sourceElRect;
-            var mirrorEl = this.mirrorEl;
-            if (!mirrorEl) {
-                mirrorEl = this.mirrorEl = this.sourceEl.cloneNode(true); // cloneChildren=true
-                // we don't want long taps or any mouse interaction causing selection/menus.
-                // would use preventSelection(), but that prevents selectstart, causing problems.
-                mirrorEl.classList.add('fc-unselectable');
-                mirrorEl.classList.add('fc-dragging');
-                core.applyStyle(mirrorEl, {
-                    position: 'fixed',
-                    zIndex: this.zIndex,
-                    visibility: '',
-                    boxSizing: 'border-box',
-                    width: sourceElRect.right - sourceElRect.left,
-                    height: sourceElRect.bottom - sourceElRect.top,
-                    right: 'auto',
-                    bottom: 'auto',
-                    margin: 0
-                });
-                this.parentNode.appendChild(mirrorEl);
-            }
-            return mirrorEl;
-        };
-        return ElementMirror;
-    }());
-
-    /*
-    Is a cache for a given element's scroll information (all the info that ScrollController stores)
-    in addition the "client rectangle" of the element.. the area within the scrollbars.
-
-    The cache can be in one of two modes:
-    - doesListening:false - ignores when the container is scrolled by someone else
-    - doesListening:true - watch for scrolling and update the cache
-    */
-    var ScrollGeomCache = /** @class */ (function (_super) {
-        __extends(ScrollGeomCache, _super);
-        function ScrollGeomCache(scrollController, doesListening) {
-            var _this = _super.call(this) || this;
-            _this.handleScroll = function () {
-                _this.scrollTop = _this.scrollController.getScrollTop();
-                _this.scrollLeft = _this.scrollController.getScrollLeft();
-                _this.handleScrollChange();
-            };
-            _this.scrollController = scrollController;
-            _this.doesListening = doesListening;
-            _this.scrollTop = _this.origScrollTop = scrollController.getScrollTop();
-            _this.scrollLeft = _this.origScrollLeft = scrollController.getScrollLeft();
-            _this.scrollWidth = scrollController.getScrollWidth();
-            _this.scrollHeight = scrollController.getScrollHeight();
-            _this.clientWidth = scrollController.getClientWidth();
-            _this.clientHeight = scrollController.getClientHeight();
-            _this.clientRect = _this.computeClientRect(); // do last in case it needs cached values
-            if (_this.doesListening) {
-                _this.getEventTarget().addEventListener('scroll', _this.handleScroll);
-            }
-            return _this;
-        }
-        ScrollGeomCache.prototype.destroy = function () {
-            if (this.doesListening) {
-                this.getEventTarget().removeEventListener('scroll', this.handleScroll);
-            }
-        };
-        ScrollGeomCache.prototype.getScrollTop = function () {
-            return this.scrollTop;
-        };
-        ScrollGeomCache.prototype.getScrollLeft = function () {
-            return this.scrollLeft;
-        };
-        ScrollGeomCache.prototype.setScrollTop = function (top) {
-            this.scrollController.setScrollTop(top);
-            if (!this.doesListening) {
-                // we are not relying on the element to normalize out-of-bounds scroll values
-                // so we need to sanitize ourselves
-                this.scrollTop = Math.max(Math.min(top, this.getMaxScrollTop()), 0);
-                this.handleScrollChange();
-            }
-        };
-        ScrollGeomCache.prototype.setScrollLeft = function (top) {
-            this.scrollController.setScrollLeft(top);
-            if (!this.doesListening) {
-                // we are not relying on the element to normalize out-of-bounds scroll values
-                // so we need to sanitize ourselves
-                this.scrollLeft = Math.max(Math.min(top, this.getMaxScrollLeft()), 0);
-                this.handleScrollChange();
-            }
-        };
-        ScrollGeomCache.prototype.getClientWidth = function () {
-            return this.clientWidth;
-        };
-        ScrollGeomCache.prototype.getClientHeight = function () {
-            return this.clientHeight;
-        };
-        ScrollGeomCache.prototype.getScrollWidth = function () {
-            return this.scrollWidth;
-        };
-        ScrollGeomCache.prototype.getScrollHeight = function () {
-            return this.scrollHeight;
-        };
-        ScrollGeomCache.prototype.handleScrollChange = function () {
-        };
-        return ScrollGeomCache;
-    }(core.ScrollController));
-    var ElementScrollGeomCache = /** @class */ (function (_super) {
-        __extends(ElementScrollGeomCache, _super);
-        function ElementScrollGeomCache(el, doesListening) {
-            return _super.call(this, new core.ElementScrollController(el), doesListening) || this;
-        }
-        ElementScrollGeomCache.prototype.getEventTarget = function () {
-            return this.scrollController.el;
-        };
-        ElementScrollGeomCache.prototype.computeClientRect = function () {
-            return core.computeInnerRect(this.scrollController.el);
-        };
-        return ElementScrollGeomCache;
-    }(ScrollGeomCache));
-    var WindowScrollGeomCache = /** @class */ (function (_super) {
-        __extends(WindowScrollGeomCache, _super);
-        function WindowScrollGeomCache(doesListening) {
-            return _super.call(this, new core.WindowScrollController(), doesListening) || this;
-        }
-        WindowScrollGeomCache.prototype.getEventTarget = function () {
-            return window;
-        };
-        WindowScrollGeomCache.prototype.computeClientRect = function () {
-            return {
-                left: this.scrollLeft,
-                right: this.scrollLeft + this.clientWidth,
-                top: this.scrollTop,
-                bottom: this.scrollTop + this.clientHeight
-            };
-        };
-        // the window is the only scroll object that changes it's rectangle relative
-        // to the document's topleft as it scrolls
-        WindowScrollGeomCache.prototype.handleScrollChange = function () {
-            this.clientRect = this.computeClientRect();
-        };
-        return WindowScrollGeomCache;
-    }(ScrollGeomCache));
-
-    // If available we are using native "performance" API instead of "Date"
-    // Read more about it on MDN:
-    // https://developer.mozilla.org/en-US/docs/Web/API/Performance
-    var getTime = typeof performance === 'function' ? performance.now : Date.now;
-    /*
-    For a pointer interaction, automatically scrolls certain scroll containers when the pointer
-    approaches the edge.
-
-    The caller must call start + handleMove + stop.
-    */
-    var AutoScroller = /** @class */ (function () {
-        function AutoScroller() {
-            var _this = this;
-            // options that can be set by caller
-            this.isEnabled = true;
-            this.scrollQuery = [window, '.fc-scroller'];
-            this.edgeThreshold = 50; // pixels
-            this.maxVelocity = 300; // pixels per second
-            // internal state
-            this.pointerScreenX = null;
-            this.pointerScreenY = null;
-            this.isAnimating = false;
-            this.scrollCaches = null;
-            // protect against the initial pointerdown being too close to an edge and starting the scroll
-            this.everMovedUp = false;
-            this.everMovedDown = false;
-            this.everMovedLeft = false;
-            this.everMovedRight = false;
-            this.animate = function () {
-                if (_this.isAnimating) { // wasn't cancelled between animation calls
-                    var edge = _this.computeBestEdge(_this.pointerScreenX + window.pageXOffset, _this.pointerScreenY + window.pageYOffset);
-                    if (edge) {
-                        var now = getTime();
-                        _this.handleSide(edge, (now - _this.msSinceRequest) / 1000);
-                        _this.requestAnimation(now);
-                    }
-                    else {
-                        _this.isAnimating = false; // will stop animation
-                    }
-                }
-            };
-        }
-        AutoScroller.prototype.start = function (pageX, pageY) {
-            if (this.isEnabled) {
-                this.scrollCaches = this.buildCaches();
-                this.pointerScreenX = null;
-                this.pointerScreenY = null;
-                this.everMovedUp = false;
-                this.everMovedDown = false;
-                this.everMovedLeft = false;
-                this.everMovedRight = false;
-                this.handleMove(pageX, pageY);
-            }
-        };
-        AutoScroller.prototype.handleMove = function (pageX, pageY) {
-            if (this.isEnabled) {
-                var pointerScreenX = pageX - window.pageXOffset;
-                var pointerScreenY = pageY - window.pageYOffset;
-                var yDelta = this.pointerScreenY === null ? 0 : pointerScreenY - this.pointerScreenY;
-                var xDelta = this.pointerScreenX === null ? 0 : pointerScreenX - this.pointerScreenX;
-                if (yDelta < 0) {
-                    this.everMovedUp = true;
-                }
-                else if (yDelta > 0) {
-                    this.everMovedDown = true;
-                }
-                if (xDelta < 0) {
-                    this.everMovedLeft = true;
-                }
-                else if (xDelta > 0) {
-                    this.everMovedRight = true;
-                }
-                this.pointerScreenX = pointerScreenX;
-                this.pointerScreenY = pointerScreenY;
-                if (!this.isAnimating) {
-                    this.isAnimating = true;
-                    this.requestAnimation(getTime());
-                }
-            }
-        };
-        AutoScroller.prototype.stop = function () {
-            if (this.isEnabled) {
-                this.isAnimating = false; // will stop animation
-                for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) {
-                    var scrollCache = _a[_i];
-                    scrollCache.destroy();
-                }
-                this.scrollCaches = null;
-            }
-        };
-        AutoScroller.prototype.requestAnimation = function (now) {
-            this.msSinceRequest = now;
-            requestAnimationFrame(this.animate);
-        };
-        AutoScroller.prototype.handleSide = function (edge, seconds) {
-            var scrollCache = edge.scrollCache;
-            var edgeThreshold = this.edgeThreshold;
-            var invDistance = edgeThreshold - edge.distance;
-            var velocity = // the closer to the edge, the faster we scroll
-             (invDistance * invDistance) / (edgeThreshold * edgeThreshold) * // quadratic
-                this.maxVelocity * seconds;
-            var sign = 1;
-            switch (edge.name) {
-                case 'left':
-                    sign = -1;
-                // falls through
-                case 'right':
-                    scrollCache.setScrollLeft(scrollCache.getScrollLeft() + velocity * sign);
-                    break;
-                case 'top':
-                    sign = -1;
-                // falls through
-                case 'bottom':
-                    scrollCache.setScrollTop(scrollCache.getScrollTop() + velocity * sign);
-                    break;
-            }
-        };
-        // left/top are relative to document topleft
-        AutoScroller.prototype.computeBestEdge = function (left, top) {
-            var edgeThreshold = this.edgeThreshold;
-            var bestSide = null;
-            for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) {
-                var scrollCache = _a[_i];
-                var rect = scrollCache.clientRect;
-                var leftDist = left - rect.left;
-                var rightDist = rect.right - left;
-                var topDist = top - rect.top;
-                var bottomDist = rect.bottom - top;
-                // completely within the rect?
-                if (leftDist >= 0 && rightDist >= 0 && topDist >= 0 && bottomDist >= 0) {
-                    if (topDist <= edgeThreshold && this.everMovedUp && scrollCache.canScrollUp() &&
-                        (!bestSide || bestSide.distance > topDist)) {
-                        bestSide = { scrollCache: scrollCache, name: 'top', distance: topDist };
-                    }
-                    if (bottomDist <= edgeThreshold && this.everMovedDown && scrollCache.canScrollDown() &&
-                        (!bestSide || bestSide.distance > bottomDist)) {
-                        bestSide = { scrollCache: scrollCache, name: 'bottom', distance: bottomDist };
-                    }
-                    if (leftDist <= edgeThreshold && this.everMovedLeft && scrollCache.canScrollLeft() &&
-                        (!bestSide || bestSide.distance > leftDist)) {
-                        bestSide = { scrollCache: scrollCache, name: 'left', distance: leftDist };
-                    }
-                    if (rightDist <= edgeThreshold && this.everMovedRight && scrollCache.canScrollRight() &&
-                        (!bestSide || bestSide.distance > rightDist)) {
-                        bestSide = { scrollCache: scrollCache, name: 'right', distance: rightDist };
-                    }
-                }
-            }
-            return bestSide;
-        };
-        AutoScroller.prototype.buildCaches = function () {
-            return this.queryScrollEls().map(function (el) {
-                if (el === window) {
-                    return new WindowScrollGeomCache(false); // false = don't listen to user-generated scrolls
-                }
-                else {
-                    return new ElementScrollGeomCache(el, false); // false = don't listen to user-generated scrolls
-                }
-            });
-        };
-        AutoScroller.prototype.queryScrollEls = function () {
-            var els = [];
-            for (var _i = 0, _a = this.scrollQuery; _i < _a.length; _i++) {
-                var query = _a[_i];
-                if (typeof query === 'object') {
-                    els.push(query);
-                }
-                else {
-                    els.push.apply(els, Array.prototype.slice.call(document.querySelectorAll(query)));
-                }
-            }
-            return els;
-        };
-        return AutoScroller;
-    }());
-
-    /*
-    Monitors dragging on an element. Has a number of high-level features:
-    - minimum distance required before dragging
-    - minimum wait time ("delay") before dragging
-    - a mirror element that follows the pointer
-    */
-    var FeaturefulElementDragging = /** @class */ (function (_super) {
-        __extends(FeaturefulElementDragging, _super);
-        function FeaturefulElementDragging(containerEl) {
-            var _this = _super.call(this, containerEl) || this;
-            // options that can be directly set by caller
-            // the caller can also set the PointerDragging's options as well
-            _this.delay = null;
-            _this.minDistance = 0;
-            _this.touchScrollAllowed = true; // prevents drag from starting and blocks scrolling during drag
-            _this.mirrorNeedsRevert = false;
-            _this.isInteracting = false; // is the user validly moving the pointer? lasts until pointerup
-            _this.isDragging = false; // is it INTENTFULLY dragging? lasts until after revert animation
-            _this.isDelayEnded = false;
-            _this.isDistanceSurpassed = false;
-            _this.delayTimeoutId = null;
-            _this.onPointerDown = function (ev) {
-                if (!_this.isDragging) { // so new drag doesn't happen while revert animation is going
-                    _this.isInteracting = true;
-                    _this.isDelayEnded = false;
-                    _this.isDistanceSurpassed = false;
-                    core.preventSelection(document.body);
-                    core.preventContextMenu(document.body);
-                    // prevent links from being visited if there's an eventual drag.
-                    // also prevents selection in older browsers (maybe?).
-                    // not necessary for touch, besides, browser would complain about passiveness.
-                    if (!ev.isTouch) {
-                        ev.origEvent.preventDefault();
-                    }
-                    _this.emitter.trigger('pointerdown', ev);
-                    if (!_this.pointer.shouldIgnoreMove) {
-                        // actions related to initiating dragstart+dragmove+dragend...
-                        _this.mirror.setIsVisible(false); // reset. caller must set-visible
-                        _this.mirror.start(ev.subjectEl, ev.pageX, ev.pageY); // must happen on first pointer down
-                        _this.startDelay(ev);
-                        if (!_this.minDistance) {
-                            _this.handleDistanceSurpassed(ev);
-                        }
-                    }
-                }
-            };
-            _this.onPointerMove = function (ev) {
-                if (_this.isInteracting) { // if false, still waiting for previous drag's revert
-                    _this.emitter.trigger('pointermove', ev);
-                    if (!_this.isDistanceSurpassed) {
-                        var minDistance = _this.minDistance;
-                        var distanceSq = void 0; // current distance from the origin, squared
-                        var deltaX = ev.deltaX, deltaY = ev.deltaY;
-                        distanceSq = deltaX * deltaX + deltaY * deltaY;
-                        if (distanceSq >= minDistance * minDistance) { // use pythagorean theorem
-                            _this.handleDistanceSurpassed(ev);
-                        }
-                    }
-                    if (_this.isDragging) {
-                        // a real pointer move? (not one simulated by scrolling)
-                        if (ev.origEvent.type !== 'scroll') {
-                            _this.mirror.handleMove(ev.pageX, ev.pageY);
-                            _this.autoScroller.handleMove(ev.pageX, ev.pageY);
-                        }
-                        _this.emitter.trigger('dragmove', ev);
-                    }
-                }
-            };
-            _this.onPointerUp = function (ev) {
-                if (_this.isInteracting) { // if false, still waiting for previous drag's revert
-                    _this.isInteracting = false;
-                    core.allowSelection(document.body);
-                    core.allowContextMenu(document.body);
-                    _this.emitter.trigger('pointerup', ev); // can potentially set mirrorNeedsRevert
-                    if (_this.isDragging) {
-                        _this.autoScroller.stop();
-                        _this.tryStopDrag(ev); // which will stop the mirror
-                    }
-                    if (_this.delayTimeoutId) {
-                        clearTimeout(_this.delayTimeoutId);
-                        _this.delayTimeoutId = null;
-                    }
-                }
-            };
-            var pointer = _this.pointer = new PointerDragging(containerEl);
-            pointer.emitter.on('pointerdown', _this.onPointerDown);
-            pointer.emitter.on('pointermove', _this.onPointerMove);
-            pointer.emitter.on('pointerup', _this.onPointerUp);
-            _this.mirror = new ElementMirror();
-            _this.autoScroller = new AutoScroller();
-            return _this;
-        }
-        FeaturefulElementDragging.prototype.destroy = function () {
-            this.pointer.destroy();
-        };
-        FeaturefulElementDragging.prototype.startDelay = function (ev) {
-            var _this = this;
-            if (typeof this.delay === 'number') {
-                this.delayTimeoutId = setTimeout(function () {
-                    _this.delayTimeoutId = null;
-                    _this.handleDelayEnd(ev);
-                }, this.delay); // not assignable to number!
-            }
-            else {
-                this.handleDelayEnd(ev);
-            }
-        };
-        FeaturefulElementDragging.prototype.handleDelayEnd = function (ev) {
-            this.isDelayEnded = true;
-            this.tryStartDrag(ev);
-        };
-        FeaturefulElementDragging.prototype.handleDistanceSurpassed = function (ev) {
-            this.isDistanceSurpassed = true;
-            this.tryStartDrag(ev);
-        };
-        FeaturefulElementDragging.prototype.tryStartDrag = function (ev) {
-            if (this.isDelayEnded && this.isDistanceSurpassed) {
-                if (!this.pointer.wasTouchScroll || this.touchScrollAllowed) {
-                    this.isDragging = true;
-                    this.mirrorNeedsRevert = false;
-                    this.autoScroller.start(ev.pageX, ev.pageY);
-                    this.emitter.trigger('dragstart', ev);
-                    if (this.touchScrollAllowed === false) {
-                        this.pointer.cancelTouchScroll();
-                    }
-                }
-            }
-        };
-        FeaturefulElementDragging.prototype.tryStopDrag = function (ev) {
-            // .stop() is ALWAYS asynchronous, which we NEED because we want all pointerup events
-            // that come from the document to fire beforehand. much more convenient this way.
-            this.mirror.stop(this.mirrorNeedsRevert, this.stopDrag.bind(this, ev) // bound with args
-            );
-        };
-        FeaturefulElementDragging.prototype.stopDrag = function (ev) {
-            this.isDragging = false;
-            this.emitter.trigger('dragend', ev);
-        };
-        // fill in the implementations...
-        FeaturefulElementDragging.prototype.setIgnoreMove = function (bool) {
-            this.pointer.shouldIgnoreMove = bool;
-        };
-        FeaturefulElementDragging.prototype.setMirrorIsVisible = function (bool) {
-            this.mirror.setIsVisible(bool);
-        };
-        FeaturefulElementDragging.prototype.setMirrorNeedsRevert = function (bool) {
-            this.mirrorNeedsRevert = bool;
-        };
-        FeaturefulElementDragging.prototype.setAutoScrollEnabled = function (bool) {
-            this.autoScroller.isEnabled = bool;
-        };
-        return FeaturefulElementDragging;
-    }(core.ElementDragging));
-
-    /*
-    When this class is instantiated, it records the offset of an element (relative to the document topleft),
-    and continues to monitor scrolling, updating the cached coordinates if it needs to.
-    Does not access the DOM after instantiation, so highly performant.
-
-    Also keeps track of all scrolling/overflow:hidden containers that are parents of the given element
-    and an determine if a given point is inside the combined clipping rectangle.
-    */
-    var OffsetTracker = /** @class */ (function () {
-        function OffsetTracker(el) {
-            this.origRect = core.computeRect(el);
-            // will work fine for divs that have overflow:hidden
-            this.scrollCaches = core.getClippingParents(el).map(function (el) {
-                return new ElementScrollGeomCache(el, true); // listen=true
-            });
-        }
-        OffsetTracker.prototype.destroy = function () {
-            for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) {
-                var scrollCache = _a[_i];
-                scrollCache.destroy();
-            }
-        };
-        OffsetTracker.prototype.computeLeft = function () {
-            var left = this.origRect.left;
-            for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) {
-                var scrollCache = _a[_i];
-                left += scrollCache.origScrollLeft - scrollCache.getScrollLeft();
-            }
-            return left;
-        };
-        OffsetTracker.prototype.computeTop = function () {
-            var top = this.origRect.top;
-            for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) {
-                var scrollCache = _a[_i];
-                top += scrollCache.origScrollTop - scrollCache.getScrollTop();
-            }
-            return top;
-        };
-        OffsetTracker.prototype.isWithinClipping = function (pageX, pageY) {
-            var point = { left: pageX, top: pageY };
-            for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) {
-                var scrollCache = _a[_i];
-                if (!isIgnoredClipping(scrollCache.getEventTarget()) &&
-                    !core.pointInsideRect(point, scrollCache.clientRect)) {
-                    return false;
-                }
-            }
-            return true;
-        };
-        return OffsetTracker;
-    }());
-    // certain clipping containers should never constrain interactions, like <html> and <body>
-    // https://github.com/fullcalendar/fullcalendar/issues/3615
-    function isIgnoredClipping(node) {
-        var tagName = node.tagName;
-        return tagName === 'HTML' || tagName === 'BODY';
-    }
-
-    /*
-    Tracks movement over multiple droppable areas (aka "hits")
-    that exist in one or more DateComponents.
-    Relies on an existing draggable.
-
-    emits:
-    - pointerdown
-    - dragstart
-    - hitchange - fires initially, even if not over a hit
-    - pointerup
-    - (hitchange - again, to null, if ended over a hit)
-    - dragend
-    */
-    var HitDragging = /** @class */ (function () {
-        function HitDragging(dragging, droppableStore) {
-            var _this = this;
-            // options that can be set by caller
-            this.useSubjectCenter = false;
-            this.requireInitial = true; // if doesn't start out on a hit, won't emit any events
-            this.initialHit = null;
-            this.movingHit = null;
-            this.finalHit = null; // won't ever be populated if shouldIgnoreMove
-            this.handlePointerDown = function (ev) {
-                var dragging = _this.dragging;
-                _this.initialHit = null;
-                _this.movingHit = null;
-                _this.finalHit = null;
-                _this.prepareHits();
-                _this.processFirstCoord(ev);
-                if (_this.initialHit || !_this.requireInitial) {
-                    dragging.setIgnoreMove(false);
-                    _this.emitter.trigger('pointerdown', ev); // TODO: fire this before computing processFirstCoord, so listeners can cancel. this gets fired by almost every handler :(
-                }
-                else {
-                    dragging.setIgnoreMove(true);
-                }
-            };
-            this.handleDragStart = function (ev) {
-                _this.emitter.trigger('dragstart', ev);
-                _this.handleMove(ev, true); // force = fire even if initially null
-            };
-            this.handleDragMove = function (ev) {
-                _this.emitter.trigger('dragmove', ev);
-                _this.handleMove(ev);
-            };
-            this.handlePointerUp = function (ev) {
-                _this.releaseHits();
-                _this.emitter.trigger('pointerup', ev);
-            };
-            this.handleDragEnd = function (ev) {
-                if (_this.movingHit) {
-                    _this.emitter.trigger('hitupdate', null, true, ev);
-                }
-                _this.finalHit = _this.movingHit;
-                _this.movingHit = null;
-                _this.emitter.trigger('dragend', ev);
-            };
-            this.droppableStore = droppableStore;
-            dragging.emitter.on('pointerdown', this.handlePointerDown);
-            dragging.emitter.on('dragstart', this.handleDragStart);
-            dragging.emitter.on('dragmove', this.handleDragMove);
-            dragging.emitter.on('pointerup', this.handlePointerUp);
-            dragging.emitter.on('dragend', this.handleDragEnd);
-            this.dragging = dragging;
-            this.emitter = new core.EmitterMixin();
-        }
-        // sets initialHit
-        // sets coordAdjust
-        HitDragging.prototype.processFirstCoord = function (ev) {
-            var origPoint = { left: ev.pageX, top: ev.pageY };
-            var adjustedPoint = origPoint;
-            var subjectEl = ev.subjectEl;
-            var subjectRect;
-            if (subjectEl !== document) {
-                subjectRect = core.computeRect(subjectEl);
-                adjustedPoint = core.constrainPoint(adjustedPoint, subjectRect);
-            }
-            var initialHit = this.initialHit = this.queryHitForOffset(adjustedPoint.left, adjustedPoint.top);
-            if (initialHit) {
-                if (this.useSubjectCenter && subjectRect) {
-                    var slicedSubjectRect = core.intersectRects(subjectRect, initialHit.rect);
-                    if (slicedSubjectRect) {
-                        adjustedPoint = core.getRectCenter(slicedSubjectRect);
-                    }
-                }
-                this.coordAdjust = core.diffPoints(adjustedPoint, origPoint);
-            }
-            else {
-                this.coordAdjust = { left: 0, top: 0 };
-            }
-        };
-        HitDragging.prototype.handleMove = function (ev, forceHandle) {
-            var hit = this.queryHitForOffset(ev.pageX + this.coordAdjust.left, ev.pageY + this.coordAdjust.top);
-            if (forceHandle || !isHitsEqual(this.movingHit, hit)) {
-                this.movingHit = hit;
-                this.emitter.trigger('hitupdate', hit, false, ev);
-            }
-        };
-        HitDragging.prototype.prepareHits = function () {
-            this.offsetTrackers = core.mapHash(this.droppableStore, function (interactionSettings) {
-                interactionSettings.component.buildPositionCaches();
-                return new OffsetTracker(interactionSettings.el);
-            });
-        };
-        HitDragging.prototype.releaseHits = function () {
-            var offsetTrackers = this.offsetTrackers;
-            for (var id in offsetTrackers) {
-                offsetTrackers[id].destroy();
-            }
-            this.offsetTrackers = {};
-        };
-        HitDragging.prototype.queryHitForOffset = function (offsetLeft, offsetTop) {
-            var _a = this, droppableStore = _a.droppableStore, offsetTrackers = _a.offsetTrackers;
-            var bestHit = null;
-            for (var id in droppableStore) {
-                var component = droppableStore[id].component;
-                var offsetTracker = offsetTrackers[id];
-                if (offsetTracker.isWithinClipping(offsetLeft, offsetTop)) {
-                    var originLeft = offsetTracker.computeLeft();
-                    var originTop = offsetTracker.computeTop();
-                    var positionLeft = offsetLeft - originLeft;
-                    var positionTop = offsetTop - originTop;
-                    var origRect = offsetTracker.origRect;
-                    var width = origRect.right - origRect.left;
-                    var height = origRect.bottom - origRect.top;
-                    if (
-                    // must be within the element's bounds
-                    positionLeft >= 0 && positionLeft < width &&
-                        positionTop >= 0 && positionTop < height) {
-                        var hit = component.queryHit(positionLeft, positionTop, width, height);
-                        if (hit &&
-                            (
-                            // make sure the hit is within activeRange, meaning it's not a deal cell
-                            !component.props.dateProfile || // hack for DayTile
-                                core.rangeContainsRange(component.props.dateProfile.activeRange, hit.dateSpan.range)) &&
-                            (!bestHit || hit.layer > bestHit.layer)) {
-                            // TODO: better way to re-orient rectangle
-                            hit.rect.left += originLeft;
-                            hit.rect.right += originLeft;
-                            hit.rect.top += originTop;
-                            hit.rect.bottom += originTop;
-                            bestHit = hit;
-                        }
-                    }
-                }
-            }
-            return bestHit;
-        };
-        return HitDragging;
-    }());
-    function isHitsEqual(hit0, hit1) {
-        if (!hit0 && !hit1) {
-            return true;
-        }
-        if (Boolean(hit0) !== Boolean(hit1)) {
-            return false;
-        }
-        return core.isDateSpansEqual(hit0.dateSpan, hit1.dateSpan);
-    }
-
-    /*
-    Monitors when the user clicks on a specific date/time of a component.
-    A pointerdown+pointerup on the same "hit" constitutes a click.
-    */
-    var DateClicking = /** @class */ (function (_super) {
-        __extends(DateClicking, _super);
-        function DateClicking(settings) {
-            var _this = _super.call(this, settings) || this;
-            _this.handlePointerDown = function (ev) {
-                var dragging = _this.dragging;
-                // do this in pointerdown (not dragend) because DOM might be mutated by the time dragend is fired
-                dragging.setIgnoreMove(!_this.component.isValidDateDownEl(dragging.pointer.downEl));
-            };
-            // won't even fire if moving was ignored
-            _this.handleDragEnd = function (ev) {
-                var component = _this.component;
-                var pointer = _this.dragging.pointer;
-                if (!pointer.wasTouchScroll) {
-                    var _a = _this.hitDragging, initialHit = _a.initialHit, finalHit = _a.finalHit;
-                    if (initialHit && finalHit && isHitsEqual(initialHit, finalHit)) {
-                        component.calendar.triggerDateClick(initialHit.dateSpan, initialHit.dayEl, component.view, ev.origEvent);
-                    }
-                }
-            };
-            var component = settings.component;
-            // we DO want to watch pointer moves because otherwise finalHit won't get populated
-            _this.dragging = new FeaturefulElementDragging(component.el);
-            _this.dragging.autoScroller.isEnabled = false;
-            var hitDragging = _this.hitDragging = new HitDragging(_this.dragging, core.interactionSettingsToStore(settings));
-            hitDragging.emitter.on('pointerdown', _this.handlePointerDown);
-            hitDragging.emitter.on('dragend', _this.handleDragEnd);
-            return _this;
-        }
-        DateClicking.prototype.destroy = function () {
-            this.dragging.destroy();
-        };
-        return DateClicking;
-    }(core.Interaction));
-
-    /*
-    Tracks when the user selects a portion of time of a component,
-    constituted by a drag over date cells, with a possible delay at the beginning of the drag.
-    */
-    var DateSelecting = /** @class */ (function (_super) {
-        __extends(DateSelecting, _super);
-        function DateSelecting(settings) {
-            var _this = _super.call(this, settings) || this;
-            _this.dragSelection = null;
-            _this.handlePointerDown = function (ev) {
-                var _a = _this, component = _a.component, dragging = _a.dragging;
-                var canSelect = component.opt('selectable') &&
-                    component.isValidDateDownEl(ev.origEvent.target);
-                // don't bother to watch expensive moves if component won't do selection
-                dragging.setIgnoreMove(!canSelect);
-                // if touch, require user to hold down
-                dragging.delay = ev.isTouch ? getComponentTouchDelay(component) : null;
-            };
-            _this.handleDragStart = function (ev) {
-                _this.component.calendar.unselect(ev); // unselect previous selections
-            };
-            _this.handleHitUpdate = function (hit, isFinal) {
-                var calendar = _this.component.calendar;
-                var dragSelection = null;
-                var isInvalid = false;
-                if (hit) {
-                    dragSelection = joinHitsIntoSelection(_this.hitDragging.initialHit, hit, calendar.pluginSystem.hooks.dateSelectionTransformers);
-                    if (!dragSelection || !_this.component.isDateSelectionValid(dragSelection)) {
-                        isInvalid = true;
-                        dragSelection = null;
-                    }
-                }
-                if (dragSelection) {
-                    calendar.dispatch({ type: 'SELECT_DATES', selection: dragSelection });
-                }
-                else if (!isFinal) { // only unselect if moved away while dragging
-                    calendar.dispatch({ type: 'UNSELECT_DATES' });
-                }
-                if (!isInvalid) {
-                    core.enableCursor();
-                }
-                else {
-                    core.disableCursor();
-                }
-                if (!isFinal) {
-                    _this.dragSelection = dragSelection; // only clear if moved away from all hits while dragging
-                }
-            };
-            _this.handlePointerUp = function (pev) {
-                if (_this.dragSelection) {
-                    // selection is already rendered, so just need to report selection
-                    _this.component.calendar.triggerDateSelect(_this.dragSelection, pev);
-                    _this.dragSelection = null;
-                }
-            };
-            var component = settings.component;
-            var dragging = _this.dragging = new FeaturefulElementDragging(component.el);
-            dragging.touchScrollAllowed = false;
-            dragging.minDistance = component.opt('selectMinDistance') || 0;
-            dragging.autoScroller.isEnabled = component.opt('dragScroll');
-            var hitDragging = _this.hitDragging = new HitDragging(_this.dragging, core.interactionSettingsToStore(settings));
-            hitDragging.emitter.on('pointerdown', _this.handlePointerDown);
-            hitDragging.emitter.on('dragstart', _this.handleDragStart);
-            hitDragging.emitter.on('hitupdate', _this.handleHitUpdate);
-            hitDragging.emitter.on('pointerup', _this.handlePointerUp);
-            return _this;
-        }
-        DateSelecting.prototype.destroy = function () {
-            this.dragging.destroy();
-        };
-        return DateSelecting;
-    }(core.Interaction));
-    function getComponentTouchDelay(component) {
-        var delay = component.opt('selectLongPressDelay');
-        if (delay == null) {
-            delay = component.opt('longPressDelay');
-        }
-        return delay;
-    }
-    function joinHitsIntoSelection(hit0, hit1, dateSelectionTransformers) {
-        var dateSpan0 = hit0.dateSpan;
-        var dateSpan1 = hit1.dateSpan;
-        var ms = [
-            dateSpan0.range.start,
-            dateSpan0.range.end,
-            dateSpan1.range.start,
-            dateSpan1.range.end
-        ];
-        ms.sort(core.compareNumbers);
-        var props = {};
-        for (var _i = 0, dateSelectionTransformers_1 = dateSelectionTransformers; _i < dateSelectionTransformers_1.length; _i++) {
-            var transformer = dateSelectionTransformers_1[_i];
-            var res = transformer(hit0, hit1);
-            if (res === false) {
-                return null;
-            }
-            else if (res) {
-                __assign(props, res);
-            }
-        }
-        props.range = { start: ms[0], end: ms[3] };
-        props.allDay = dateSpan0.allDay;
-        return props;
-    }
-
-    var EventDragging = /** @class */ (function (_super) {
-        __extends(EventDragging, _super);
-        function EventDragging(settings) {
-            var _this = _super.call(this, settings) || this;
-            // internal state
-            _this.subjectSeg = null; // the seg being selected/dragged
-            _this.isDragging = false;
-            _this.eventRange = null;
-            _this.relevantEvents = null; // the events being dragged
-            _this.receivingCalendar = null;
-            _this.validMutation = null;
-            _this.mutatedRelevantEvents = null;
-            _this.handlePointerDown = function (ev) {
-                var origTarget = ev.origEvent.target;
-                var _a = _this, component = _a.component, dragging = _a.dragging;
-                var mirror = dragging.mirror;
-                var initialCalendar = component.calendar;
-                var subjectSeg = _this.subjectSeg = core.getElSeg(ev.subjectEl);
-                var eventRange = _this.eventRange = subjectSeg.eventRange;
-                var eventInstanceId = eventRange.instance.instanceId;
-                _this.relevantEvents = core.getRelevantEvents(initialCalendar.state.eventStore, eventInstanceId);
-                dragging.minDistance = ev.isTouch ? 0 : component.opt('eventDragMinDistance');
-                dragging.delay =
-                    // only do a touch delay if touch and this event hasn't been selected yet
-                    (ev.isTouch && eventInstanceId !== component.props.eventSelection) ?
-                        getComponentTouchDelay$1(component) :
-                        null;
-                mirror.parentNode = initialCalendar.el;
-                mirror.revertDuration = component.opt('dragRevertDuration');
-                var isValid = component.isValidSegDownEl(origTarget) &&
-                    !core.elementClosest(origTarget, '.fc-resizer'); // NOT on a resizer
-                dragging.setIgnoreMove(!isValid);
-                // disable dragging for elements that are resizable (ie, selectable)
-                // but are not draggable
-                _this.isDragging = isValid &&
-                    ev.subjectEl.classList.contains('fc-draggable');
-            };
-            _this.handleDragStart = function (ev) {
-                var initialCalendar = _this.component.calendar;
-                var eventRange = _this.eventRange;
-                var eventInstanceId = eventRange.instance.instanceId;
-                if (ev.isTouch) {
-                    // need to select a different event?
-                    if (eventInstanceId !== _this.component.props.eventSelection) {
-                        initialCalendar.dispatch({ type: 'SELECT_EVENT', eventInstanceId: eventInstanceId });
-                    }
-                }
-                else {
-                    // if now using mouse, but was previous touch interaction, clear selected event
-                    initialCalendar.dispatch({ type: 'UNSELECT_EVENT' });
-                }
-                if (_this.isDragging) {
-                    initialCalendar.unselect(ev); // unselect *date* selection
-                    initialCalendar.publiclyTrigger('eventDragStart', [
-                        {
-                            el: _this.subjectSeg.el,
-                            event: new core.EventApi(initialCalendar, eventRange.def, eventRange.instance),
-                            jsEvent: ev.origEvent,
-                            view: _this.component.view
-                        }
-                    ]);
-                }
-            };
-            _this.handleHitUpdate = function (hit, isFinal) {
-                if (!_this.isDragging) {
-                    return;
-                }
-                var relevantEvents = _this.relevantEvents;
-                var initialHit = _this.hitDragging.initialHit;
-                var initialCalendar = _this.component.calendar;
-                // states based on new hit
-                var receivingCalendar = null;
-                var mutation = null;
-                var mutatedRelevantEvents = null;
-                var isInvalid = false;
-                var interaction = {
-                    affectedEvents: relevantEvents,
-                    mutatedEvents: core.createEmptyEventStore(),
-                    isEvent: true,
-                    origSeg: _this.subjectSeg
-                };
-                if (hit) {
-                    var receivingComponent = hit.component;
-                    receivingCalendar = receivingComponent.calendar;
-                    if (initialCalendar === receivingCalendar ||
-                        receivingComponent.opt('editable') && receivingComponent.opt('droppable')) {
-                        mutation = computeEventMutation(initialHit, hit, receivingCalendar.pluginSystem.hooks.eventDragMutationMassagers);
-                        if (mutation) {
-                            mutatedRelevantEvents = core.applyMutationToEventStore(relevantEvents, receivingCalendar.eventUiBases, mutation, receivingCalendar);
-                            interaction.mutatedEvents = mutatedRelevantEvents;
-                            if (!receivingComponent.isInteractionValid(interaction)) {
-                                isInvalid = true;
-                                mutation = null;
-                                mutatedRelevantEvents = null;
-                                interaction.mutatedEvents = core.createEmptyEventStore();
-                            }
-                        }
-                    }
-                    else {
-                        receivingCalendar = null;
-                    }
-                }
-                _this.displayDrag(receivingCalendar, interaction);
-                if (!isInvalid) {
-                    core.enableCursor();
-                }
-                else {
-                    core.disableCursor();
-                }
-                if (!isFinal) {
-                    if (initialCalendar === receivingCalendar && // TODO: write test for this
-                        isHitsEqual(initialHit, hit)) {
-                        mutation = null;
-                    }
-                    _this.dragging.setMirrorNeedsRevert(!mutation);
-                    // render the mirror if no already-rendered mirror
-                    // TODO: wish we could somehow wait for dispatch to guarantee render
-                    _this.dragging.setMirrorIsVisible(!hit || !document.querySelector('.fc-mirror'));
-                    // assign states based on new hit
-                    _this.receivingCalendar = receivingCalendar;
-                    _this.validMutation = mutation;
-                    _this.mutatedRelevantEvents = mutatedRelevantEvents;
-                }
-            };
-            _this.handlePointerUp = function () {
-                if (!_this.isDragging) {
-                    _this.cleanup(); // because handleDragEnd won't fire
-                }
-            };
-            _this.handleDragEnd = function (ev) {
-                if (_this.isDragging) {
-                    var initialCalendar_1 = _this.component.calendar;
-                    var initialView = _this.component.view;
-                    var _a = _this, receivingCalendar = _a.receivingCalendar, validMutation = _a.validMutation;
-                    var eventDef = _this.eventRange.def;
-                    var eventInstance = _this.eventRange.instance;
-                    var eventApi = new core.EventApi(initialCalendar_1, eventDef, eventInstance);
-                    var relevantEvents_1 = _this.relevantEvents;
-                    var mutatedRelevantEvents = _this.mutatedRelevantEvents;
-                    var finalHit = _this.hitDragging.finalHit;
-                    _this.clearDrag(); // must happen after revert animation
-                    initialCalendar_1.publiclyTrigger('eventDragStop', [
-                        {
-                            el: _this.subjectSeg.el,
-                            event: eventApi,
-                            jsEvent: ev.origEvent,
-                            view: initialView
-                        }
-                    ]);
-                    if (validMutation) {
-                        // dropped within same calendar
-                        if (receivingCalendar === initialCalendar_1) {
-                            initialCalendar_1.dispatch({
-                                type: 'MERGE_EVENTS',
-                                eventStore: mutatedRelevantEvents
-                            });
-                            var transformed = {};
-                            for (var _i = 0, _b = initialCalendar_1.pluginSystem.hooks.eventDropTransformers; _i < _b.length; _i++) {
-                                var transformer = _b[_i];
-                                __assign(transformed, transformer(validMutation, initialCalendar_1));
-                            }
-                            var eventDropArg = __assign({}, transformed, { el: ev.subjectEl, delta: validMutation.datesDelta, oldEvent: eventApi, event: new core.EventApi(// the data AFTER the mutation
-                                initialCalendar_1, mutatedRelevantEvents.defs[eventDef.defId], eventInstance ? mutatedRelevantEvents.instances[eventInstance.instanceId] : null), revert: function () {
-                                    initialCalendar_1.dispatch({
-                                        type: 'MERGE_EVENTS',
-                                        eventStore: relevantEvents_1
-                                    });
-                                }, jsEvent: ev.origEvent, view: initialView });
-                            initialCalendar_1.publiclyTrigger('eventDrop', [eventDropArg]);
-                            // dropped in different calendar
-                        }
-                        else if (receivingCalendar) {
-                            initialCalendar_1.publiclyTrigger('eventLeave', [
-                                {
-                                    draggedEl: ev.subjectEl,
-                                    event: eventApi,
-                                    view: initialView
-                                }
-                            ]);
-                            initialCalendar_1.dispatch({
-                                type: 'REMOVE_EVENT_INSTANCES',
-                                instances: _this.mutatedRelevantEvents.instances
-                            });
-                            receivingCalendar.dispatch({
-                                type: 'MERGE_EVENTS',
-                                eventStore: _this.mutatedRelevantEvents
-                            });
-                            if (ev.isTouch) {
-                                receivingCalendar.dispatch({
-                                    type: 'SELECT_EVENT',
-                                    eventInstanceId: eventInstance.instanceId
-                                });
-                            }
-                            var dropArg = __assign({}, receivingCalendar.buildDatePointApi(finalHit.dateSpan), { draggedEl: ev.subjectEl, jsEvent: ev.origEvent, view: finalHit.component // should this be finalHit.component.view? See #4644
-                             });
-                            receivingCalendar.publiclyTrigger('drop', [dropArg]);
-                            receivingCalendar.publiclyTrigger('eventReceive', [
-                                {
-                                    draggedEl: ev.subjectEl,
-                                    event: new core.EventApi(// the data AFTER the mutation
-                                    receivingCalendar, mutatedRelevantEvents.defs[eventDef.defId], mutatedRelevantEvents.instances[eventInstance.instanceId]),
-                                    view: finalHit.component // should this be finalHit.component.view? See #4644
-                                }
-                            ]);
-                        }
-                    }
-                    else {
-                        initialCalendar_1.publiclyTrigger('_noEventDrop');
-                    }
-                }
-                _this.cleanup();
-            };
-            var component = _this.component;
-            var dragging = _this.dragging = new FeaturefulElementDragging(component.el);
-            dragging.pointer.selector = EventDragging.SELECTOR;
-            dragging.touchScrollAllowed = false;
-            dragging.autoScroller.isEnabled = component.opt('dragScroll');
-            var hitDragging = _this.hitDragging = new HitDragging(_this.dragging, core.interactionSettingsStore);
-            hitDragging.useSubjectCenter = settings.useEventCenter;
-            hitDragging.emitter.on('pointerdown', _this.handlePointerDown);
-            hitDragging.emitter.on('dragstart', _this.handleDragStart);
-            hitDragging.emitter.on('hitupdate', _this.handleHitUpdate);
-            hitDragging.emitter.on('pointerup', _this.handlePointerUp);
-            hitDragging.emitter.on('dragend', _this.handleDragEnd);
-            return _this;
-        }
-        EventDragging.prototype.destroy = function () {
-            this.dragging.destroy();
-        };
-        // render a drag state on the next receivingCalendar
-        EventDragging.prototype.displayDrag = function (nextCalendar, state) {
-            var initialCalendar = this.component.calendar;
-            var prevCalendar = this.receivingCalendar;
-            // does the previous calendar need to be cleared?
-            if (prevCalendar && prevCalendar !== nextCalendar) {
-                // does the initial calendar need to be cleared?
-                // if so, don't clear all the way. we still need to to hide the affectedEvents
-                if (prevCalendar === initialCalendar) {
-                    prevCalendar.dispatch({
-                        type: 'SET_EVENT_DRAG',
-                        state: {
-                            affectedEvents: state.affectedEvents,
-                            mutatedEvents: core.createEmptyEventStore(),
-                            isEvent: true,
-                            origSeg: state.origSeg
-                        }
-                    });
-                    // completely clear the old calendar if it wasn't the initial
-                }
-                else {
-                    prevCalendar.dispatch({ type: 'UNSET_EVENT_DRAG' });
-                }
-            }
-            if (nextCalendar) {
-                nextCalendar.dispatch({ type: 'SET_EVENT_DRAG', state: state });
-            }
-        };
-        EventDragging.prototype.clearDrag = function () {
-            var initialCalendar = this.component.calendar;
-            var receivingCalendar = this.receivingCalendar;
-            if (receivingCalendar) {
-                receivingCalendar.dispatch({ type: 'UNSET_EVENT_DRAG' });
-            }
-            // the initial calendar might have an dummy drag state from displayDrag
-            if (initialCalendar !== receivingCalendar) {
-                initialCalendar.dispatch({ type: 'UNSET_EVENT_DRAG' });
-            }
-        };
-        EventDragging.prototype.cleanup = function () {
-            this.subjectSeg = null;
-            this.isDragging = false;
-            this.eventRange = null;
-            this.relevantEvents = null;
-            this.receivingCalendar = null;
-            this.validMutation = null;
-            this.mutatedRelevantEvents = null;
-        };
-        EventDragging.SELECTOR = '.fc-draggable, .fc-resizable'; // TODO: test this in IE11
-        return EventDragging;
-    }(core.Interaction));
-    function computeEventMutation(hit0, hit1, massagers) {
-        var dateSpan0 = hit0.dateSpan;
-        var dateSpan1 = hit1.dateSpan;
-        var date0 = dateSpan0.range.start;
-        var date1 = dateSpan1.range.start;
-        var standardProps = {};
-        if (dateSpan0.allDay !== dateSpan1.allDay) {
-            standardProps.allDay = dateSpan1.allDay;
-            standardProps.hasEnd = hit1.component.opt('allDayMaintainDuration');
-            if (dateSpan1.allDay) {
-                // means date1 is already start-of-day,
-                // but date0 needs to be converted
-                date0 = core.startOfDay(date0);
-            }
-        }
-        var delta = core.diffDates(date0, date1, hit0.component.dateEnv, hit0.component === hit1.component ?
-            hit0.component.largeUnit :
-            null);
-        if (delta.milliseconds) { // has hours/minutes/seconds
-            standardProps.allDay = false;
-        }
-        var mutation = {
-            datesDelta: delta,
-            standardProps: standardProps
-        };
-        for (var _i = 0, massagers_1 = massagers; _i < massagers_1.length; _i++) {
-            var massager = massagers_1[_i];
-            massager(mutation, hit0, hit1);
-        }
-        return mutation;
-    }
-    function getComponentTouchDelay$1(component) {
-        var delay = component.opt('eventLongPressDelay');
-        if (delay == null) {
-            delay = component.opt('longPressDelay');
-        }
-        return delay;
-    }
-
-    var EventDragging$1 = /** @class */ (function (_super) {
-        __extends(EventDragging, _super);
-        function EventDragging(settings) {
-            var _this = _super.call(this, settings) || this;
-            // internal state
-            _this.draggingSeg = null; // TODO: rename to resizingSeg? subjectSeg?
-            _this.eventRange = null;
-            _this.relevantEvents = null;
-            _this.validMutation = null;
-            _this.mutatedRelevantEvents = null;
-            _this.handlePointerDown = function (ev) {
-                var component = _this.component;
-                var seg = _this.querySeg(ev);
-                var eventRange = _this.eventRange = seg.eventRange;
-                _this.dragging.minDistance = component.opt('eventDragMinDistance');
-                // if touch, need to be working with a selected event
-                _this.dragging.setIgnoreMove(!_this.component.isValidSegDownEl(ev.origEvent.target) ||
-                    (ev.isTouch && _this.component.props.eventSelection !== eventRange.instance.instanceId));
-            };
-            _this.handleDragStart = function (ev) {
-                var calendar = _this.component.calendar;
-                var eventRange = _this.eventRange;
-                _this.relevantEvents = core.getRelevantEvents(calendar.state.eventStore, _this.eventRange.instance.instanceId);
-                _this.draggingSeg = _this.querySeg(ev);
-                calendar.unselect();
-                calendar.publiclyTrigger('eventResizeStart', [
-                    {
-                        el: _this.draggingSeg.el,
-                        event: new core.EventApi(calendar, eventRange.def, eventRange.instance),
-                        jsEvent: ev.origEvent,
-                        view: _this.component.view
-                    }
-                ]);
-            };
-            _this.handleHitUpdate = function (hit, isFinal, ev) {
-                var calendar = _this.component.calendar;
-                var relevantEvents = _this.relevantEvents;
-                var initialHit = _this.hitDragging.initialHit;
-                var eventInstance = _this.eventRange.instance;
-                var mutation = null;
-                var mutatedRelevantEvents = null;
-                var isInvalid = false;
-                var interaction = {
-                    affectedEvents: relevantEvents,
-                    mutatedEvents: core.createEmptyEventStore(),
-                    isEvent: true,
-                    origSeg: _this.draggingSeg
-                };
-                if (hit) {
-                    mutation = computeMutation(initialHit, hit, ev.subjectEl.classList.contains('fc-start-resizer'), eventInstance.range, calendar.pluginSystem.hooks.eventResizeJoinTransforms);
-                }
-                if (mutation) {
-                    mutatedRelevantEvents = core.applyMutationToEventStore(relevantEvents, calendar.eventUiBases, mutation, calendar);
-                    interaction.mutatedEvents = mutatedRelevantEvents;
-                    if (!_this.component.isInteractionValid(interaction)) {
-                        isInvalid = true;
-                        mutation = null;
-                        mutatedRelevantEvents = null;
-                        interaction.mutatedEvents = null;
-                    }
-                }
-                if (mutatedRelevantEvents) {
-                    calendar.dispatch({
-                        type: 'SET_EVENT_RESIZE',
-                        state: interaction
-                    });
-                }
-                else {
-                    calendar.dispatch({ type: 'UNSET_EVENT_RESIZE' });
-                }
-                if (!isInvalid) {
-                    core.enableCursor();
-                }
-                else {
-                    core.disableCursor();
-                }
-                if (!isFinal) {
-                    if (mutation && isHitsEqual(initialHit, hit)) {
-                        mutation = null;
-                    }
-                    _this.validMutation = mutation;
-                    _this.mutatedRelevantEvents = mutatedRelevantEvents;
-                }
-            };
-            _this.handleDragEnd = function (ev) {
-                var calendar = _this.component.calendar;
-                var view = _this.component.view;
-                var eventDef = _this.eventRange.def;
-                var eventInstance = _this.eventRange.instance;
-                var eventApi = new core.EventApi(calendar, eventDef, eventInstance);
-                var relevantEvents = _this.relevantEvents;
-                var mutatedRelevantEvents = _this.mutatedRelevantEvents;
-                calendar.publiclyTrigger('eventResizeStop', [
-                    {
-                        el: _this.draggingSeg.el,
-                        event: eventApi,
-                        jsEvent: ev.origEvent,
-                        view: view
-                    }
-                ]);
-                if (_this.validMutation) {
-                    calendar.dispatch({
-                        type: 'MERGE_EVENTS',
-                        eventStore: mutatedRelevantEvents
-                    });
-                    calendar.publiclyTrigger('eventResize', [
-                        {
-                            el: _this.draggingSeg.el,
-                            startDelta: _this.validMutation.startDelta || core.createDuration(0),
-                            endDelta: _this.validMutation.endDelta || core.createDuration(0),
-                            prevEvent: eventApi,
-                            event: new core.EventApi(// the data AFTER the mutation
-                            calendar, mutatedRelevantEvents.defs[eventDef.defId], eventInstance ? mutatedRelevantEvents.instances[eventInstance.instanceId] : null),
-                            revert: function () {
-                                calendar.dispatch({
-                                    type: 'MERGE_EVENTS',
-                                    eventStore: relevantEvents
-                                });
-                            },
-                            jsEvent: ev.origEvent,
-                            view: view
-                        }
-                    ]);
-                }
-                else {
-                    calendar.publiclyTrigger('_noEventResize');
-                }
-                // reset all internal state
-                _this.draggingSeg = null;
-                _this.relevantEvents = null;
-                _this.validMutation = null;
-                // okay to keep eventInstance around. useful to set it in handlePointerDown
-            };
-            var component = settings.component;
-            var dragging = _this.dragging = new FeaturefulElementDragging(component.el);
-            dragging.pointer.selector = '.fc-resizer';
-            dragging.touchScrollAllowed = false;
-            dragging.autoScroller.isEnabled = component.opt('dragScroll');
-            var hitDragging = _this.hitDragging = new HitDragging(_this.dragging, core.interactionSettingsToStore(settings));
-            hitDragging.emitter.on('pointerdown', _this.handlePointerDown);
-            hitDragging.emitter.on('dragstart', _this.handleDragStart);
-            hitDragging.emitter.on('hitupdate', _this.handleHitUpdate);
-            hitDragging.emitter.on('dragend', _this.handleDragEnd);
-            return _this;
-        }
-        EventDragging.prototype.destroy = function () {
-            this.dragging.destroy();
-        };
-        EventDragging.prototype.querySeg = function (ev) {
-            return core.getElSeg(core.elementClosest(ev.subjectEl, this.component.fgSegSelector));
-        };
-        return EventDragging;
-    }(core.Interaction));
-    function computeMutation(hit0, hit1, isFromStart, instanceRange, transforms) {
-        var dateEnv = hit0.component.dateEnv;
-        var date0 = hit0.dateSpan.range.start;
-        var date1 = hit1.dateSpan.range.start;
-        var delta = core.diffDates(date0, date1, dateEnv, hit0.component.largeUnit);
-        var props = {};
-        for (var _i = 0, transforms_1 = transforms; _i < transforms_1.length; _i++) {
-            var transform = transforms_1[_i];
-            var res = transform(hit0, hit1);
-            if (res === false) {
-                return null;
-            }
-            else if (res) {
-                __assign(props, res);
-            }
-        }
-        if (isFromStart) {
-            if (dateEnv.add(instanceRange.start, delta) < instanceRange.end) {
-                props.startDelta = delta;
-                return props;
-            }
-        }
-        else {
-            if (dateEnv.add(instanceRange.end, delta) > instanceRange.start) {
-                props.endDelta = delta;
-                return props;
-            }
-        }
-        return null;
-    }
-
-    var UnselectAuto = /** @class */ (function () {
-        function UnselectAuto(calendar) {
-            var _this = this;
-            this.isRecentPointerDateSelect = false; // wish we could use a selector to detect date selection, but uses hit system
-            this.onSelect = function (selectInfo) {
-                if (selectInfo.jsEvent) {
-                    _this.isRecentPointerDateSelect = true;
-                }
-            };
-            this.onDocumentPointerUp = function (pev) {
-                var _a = _this, calendar = _a.calendar, documentPointer = _a.documentPointer;
-                var state = calendar.state;
-                // touch-scrolling should never unfocus any type of selection
-                if (!documentPointer.wasTouchScroll) {
-                    if (state.dateSelection && // an existing date selection?
-                        !_this.isRecentPointerDateSelect // a new pointer-initiated date selection since last onDocumentPointerUp?
-                    ) {
-                        var unselectAuto = calendar.viewOpt('unselectAuto');
-                        var unselectCancel = calendar.viewOpt('unselectCancel');
-                        if (unselectAuto && (!unselectAuto || !core.elementClosest(documentPointer.downEl, unselectCancel))) {
-                            calendar.unselect(pev);
-                        }
-                    }
-                    if (state.eventSelection && // an existing event selected?
-                        !core.elementClosest(documentPointer.downEl, EventDragging.SELECTOR) // interaction DIDN'T start on an event
-                    ) {
-                        calendar.dispatch({ type: 'UNSELECT_EVENT' });
-                    }
-                }
-                _this.isRecentPointerDateSelect = false;
-            };
-            this.calendar = calendar;
-            var documentPointer = this.documentPointer = new PointerDragging(document);
-            documentPointer.shouldIgnoreMove = true;
-            documentPointer.shouldWatchScroll = false;
-            documentPointer.emitter.on('pointerup', this.onDocumentPointerUp);
-            /*
-            TODO: better way to know about whether there was a selection with the pointer
-            */
-            calendar.on('select', this.onSelect);
-        }
-        UnselectAuto.prototype.destroy = function () {
-            this.calendar.off('select', this.onSelect);
-            this.documentPointer.destroy();
-        };
-        return UnselectAuto;
-    }());
-
-    /*
-    Given an already instantiated draggable object for one-or-more elements,
-    Interprets any dragging as an attempt to drag an events that lives outside
-    of a calendar onto a calendar.
-    */
-    var ExternalElementDragging = /** @class */ (function () {
-        function ExternalElementDragging(dragging, suppliedDragMeta) {
-            var _this = this;
-            this.receivingCalendar = null;
-            this.droppableEvent = null; // will exist for all drags, even if create:false
-            this.suppliedDragMeta = null;
-            this.dragMeta = null;
-            this.handleDragStart = function (ev) {
-                _this.dragMeta = _this.buildDragMeta(ev.subjectEl);
-            };
-            this.handleHitUpdate = function (hit, isFinal, ev) {
-                var dragging = _this.hitDragging.dragging;
-                var receivingCalendar = null;
-                var droppableEvent = null;
-                var isInvalid = false;
-                var interaction = {
-                    affectedEvents: core.createEmptyEventStore(),
-                    mutatedEvents: core.createEmptyEventStore(),
-                    isEvent: _this.dragMeta.create,
-                    origSeg: null
-                };
-                if (hit) {
-                    receivingCalendar = hit.component.calendar;
-                    if (_this.canDropElOnCalendar(ev.subjectEl, receivingCalendar)) {
-                        droppableEvent = computeEventForDateSpan(hit.dateSpan, _this.dragMeta, receivingCalendar);
-                        interaction.mutatedEvents = core.eventTupleToStore(droppableEvent);
-                        isInvalid = !core.isInteractionValid(interaction, receivingCalendar);
-                        if (isInvalid) {
-                            interaction.mutatedEvents = core.createEmptyEventStore();
-                            droppableEvent = null;
-                        }
-                    }
-                }
-                _this.displayDrag(receivingCalendar, interaction);
-                // show mirror if no already-rendered mirror element OR if we are shutting down the mirror (?)
-                // TODO: wish we could somehow wait for dispatch to guarantee render
-                dragging.setMirrorIsVisible(isFinal || !droppableEvent || !document.querySelector('.fc-mirror'));
-                if (!isInvalid) {
-                    core.enableCursor();
-                }
-                else {
-                    core.disableCursor();
-                }
-                if (!isFinal) {
-                    dragging.setMirrorNeedsRevert(!droppableEvent);
-                    _this.receivingCalendar = receivingCalendar;
-                    _this.droppableEvent = droppableEvent;
-                }
-            };
-            this.handleDragEnd = function (pev) {
-                var _a = _this, receivingCalendar = _a.receivingCalendar, droppableEvent = _a.droppableEvent;
-                _this.clearDrag();
-                if (receivingCalendar && droppableEvent) {
-                    var finalHit = _this.hitDragging.finalHit;
-                    var finalView = finalHit.component.view;
-                    var dragMeta = _this.dragMeta;
-                    var arg = __assign({}, receivingCalendar.buildDatePointApi(finalHit.dateSpan), { draggedEl: pev.subjectEl, jsEvent: pev.origEvent, view: finalView });
-                    receivingCalendar.publiclyTrigger('drop', [arg]);
-                    if (dragMeta.create) {
-                        receivingCalendar.dispatch({
-                            type: 'MERGE_EVENTS',
-                            eventStore: core.eventTupleToStore(droppableEvent)
-                        });
-                        if (pev.isTouch) {
-                            receivingCalendar.dispatch({
-                                type: 'SELECT_EVENT',
-                                eventInstanceId: droppableEvent.instance.instanceId
-                            });
-                        }
-                        // signal that an external event landed
-                        receivingCalendar.publiclyTrigger('eventReceive', [
-                            {
-                                draggedEl: pev.subjectEl,
-                                event: new core.EventApi(receivingCalendar, droppableEvent.def, droppableEvent.instance),
-                                view: finalView
-                            }
-                        ]);
-                    }
-                }
-                _this.receivingCalendar = null;
-                _this.droppableEvent = null;
-            };
-            var hitDragging = this.hitDragging = new HitDragging(dragging, core.interactionSettingsStore);
-            hitDragging.requireInitial = false; // will start outside of a component
-            hitDragging.emitter.on('dragstart', this.handleDragStart);
-            hitDragging.emitter.on('hitupdate', this.handleHitUpdate);
-            hitDragging.emitter.on('dragend', this.handleDragEnd);
-            this.suppliedDragMeta = suppliedDragMeta;
-        }
-        ExternalElementDragging.prototype.buildDragMeta = function (subjectEl) {
-            if (typeof this.suppliedDragMeta === 'object') {
-                return core.parseDragMeta(this.suppliedDragMeta);
-            }
-            else if (typeof this.suppliedDragMeta === 'function') {
-                return core.parseDragMeta(this.suppliedDragMeta(subjectEl));
-            }
-            else {
-                return getDragMetaFromEl(subjectEl);
-            }
-        };
-        ExternalElementDragging.prototype.displayDrag = function (nextCalendar, state) {
-            var prevCalendar = this.receivingCalendar;
-            if (prevCalendar && prevCalendar !== nextCalendar) {
-                prevCalendar.dispatch({ type: 'UNSET_EVENT_DRAG' });
-            }
-            if (nextCalendar) {
-                nextCalendar.dispatch({ type: 'SET_EVENT_DRAG', state: state });
-            }
-        };
-        ExternalElementDragging.prototype.clearDrag = function () {
-            if (this.receivingCalendar) {
-                this.receivingCalendar.dispatch({ type: 'UNSET_EVENT_DRAG' });
-            }
-        };
-        ExternalElementDragging.prototype.canDropElOnCalendar = function (el, receivingCalendar) {
-            var dropAccept = receivingCalendar.opt('dropAccept');
-            if (typeof dropAccept === 'function') {
-                return dropAccept(el);
-            }
-            else if (typeof dropAccept === 'string' && dropAccept) {
-                return Boolean(core.elementMatches(el, dropAccept));
-            }
-            return true;
-        };
-        return ExternalElementDragging;
-    }());
-    // Utils for computing event store from the DragMeta
-    // ----------------------------------------------------------------------------------------------------
-    function computeEventForDateSpan(dateSpan, dragMeta, calendar) {
-        var defProps = __assign({}, dragMeta.leftoverProps);
-        for (var _i = 0, _a = calendar.pluginSystem.hooks.externalDefTransforms; _i < _a.length; _i++) {
-            var transform = _a[_i];
-            __assign(defProps, transform(dateSpan, dragMeta));
-        }
-        var def = core.parseEventDef(defProps, dragMeta.sourceId, dateSpan.allDay, calendar.opt('forceEventDuration') || Boolean(dragMeta.duration), // hasEnd
-        calendar);
-        var start = dateSpan.range.start;
-        // only rely on time info if drop zone is all-day,
-        // otherwise, we already know the time
-        if (dateSpan.allDay && dragMeta.startTime) {
-            start = calendar.dateEnv.add(start, dragMeta.startTime);
-        }
-        var end = dragMeta.duration ?
-            calendar.dateEnv.add(start, dragMeta.duration) :
-            calendar.getDefaultEventEnd(dateSpan.allDay, start);
-        var instance = core.createEventInstance(def.defId, { start: start, end: end });
-        return { def: def, instance: instance };
-    }
-    // Utils for extracting data from element
-    // ----------------------------------------------------------------------------------------------------
-    function getDragMetaFromEl(el) {
-        var str = getEmbeddedElData(el, 'event');
-        var obj = str ?
-            JSON.parse(str) :
-            { create: false }; // if no embedded data, assume no event creation
-        return core.parseDragMeta(obj);
-    }
-    core.config.dataAttrPrefix = '';
-    function getEmbeddedElData(el, name) {
-        var prefix = core.config.dataAttrPrefix;
-        var prefixedName = (prefix ? prefix + '-' : '') + name;
-        return el.getAttribute('data-' + prefixedName) || '';
-    }
-
-    /*
-    Makes an element (that is *external* to any calendar) draggable.
-    Can pass in data that determines how an event will be created when dropped onto a calendar.
-    Leverages FullCalendar's internal drag-n-drop functionality WITHOUT a third-party drag system.
-    */
-    var ExternalDraggable = /** @class */ (function () {
-        function ExternalDraggable(el, settings) {
-            var _this = this;
-            if (settings === void 0) { settings = {}; }
-            this.handlePointerDown = function (ev) {
-                var dragging = _this.dragging;
-                var _a = _this.settings, minDistance = _a.minDistance, longPressDelay = _a.longPressDelay;
-                dragging.minDistance =
-                    minDistance != null ?
-                        minDistance :
-                        (ev.isTouch ? 0 : core.globalDefaults.eventDragMinDistance);
-                dragging.delay =
-                    ev.isTouch ? // TODO: eventually read eventLongPressDelay instead vvv
-                        (longPressDelay != null ? longPressDelay : core.globalDefaults.longPressDelay) :
-                        0;
-            };
-            this.handleDragStart = function (ev) {
-                if (ev.isTouch &&
-                    _this.dragging.delay &&
-                    ev.subjectEl.classList.contains('fc-event')) {
-                    _this.dragging.mirror.getMirrorEl().classList.add('fc-selected');
-                }
-            };
-            this.settings = settings;
-            var dragging = this.dragging = new FeaturefulElementDragging(el);
-            dragging.touchScrollAllowed = false;
-            if (settings.itemSelector != null) {
-                dragging.pointer.selector = settings.itemSelector;
-            }
-            if (settings.appendTo != null) {
-                dragging.mirror.parentNode = settings.appendTo; // TODO: write tests
-            }
-            dragging.emitter.on('pointerdown', this.handlePointerDown);
-            dragging.emitter.on('dragstart', this.handleDragStart);
-            new ExternalElementDragging(dragging, settings.eventData);
-        }
-        ExternalDraggable.prototype.destroy = function () {
-            this.dragging.destroy();
-        };
-        return ExternalDraggable;
-    }());
-
-    /*
-    Detects when a *THIRD-PARTY* drag-n-drop system interacts with elements.
-    The third-party system is responsible for drawing the visuals effects of the drag.
-    This class simply monitors for pointer movements and fires events.
-    It also has the ability to hide the moving element (the "mirror") during the drag.
-    */
-    var InferredElementDragging = /** @class */ (function (_super) {
-        __extends(InferredElementDragging, _super);
-        function InferredElementDragging(containerEl) {
-            var _this = _super.call(this, containerEl) || this;
-            _this.shouldIgnoreMove = false;
-            _this.mirrorSelector = '';
-            _this.currentMirrorEl = null;
-            _this.handlePointerDown = function (ev) {
-                _this.emitter.trigger('pointerdown', ev);
-                if (!_this.shouldIgnoreMove) {
-                    // fire dragstart right away. does not support delay or min-distance
-                    _this.emitter.trigger('dragstart', ev);
-                }
-            };
-            _this.handlePointerMove = function (ev) {
-                if (!_this.shouldIgnoreMove) {
-                    _this.emitter.trigger('dragmove', ev);
-                }
-            };
-            _this.handlePointerUp = function (ev) {
-                _this.emitter.trigger('pointerup', ev);
-                if (!_this.shouldIgnoreMove) {
-                    // fire dragend right away. does not support a revert animation
-                    _this.emitter.trigger('dragend', ev);
-                }
-            };
-            var pointer = _this.pointer = new PointerDragging(containerEl);
-            pointer.emitter.on('pointerdown', _this.handlePointerDown);
-            pointer.emitter.on('pointermove', _this.handlePointerMove);
-            pointer.emitter.on('pointerup', _this.handlePointerUp);
-            return _this;
-        }
-        InferredElementDragging.prototype.destroy = function () {
-            this.pointer.destroy();
-        };
-        InferredElementDragging.prototype.setIgnoreMove = function (bool) {
-            this.shouldIgnoreMove = bool;
-        };
-        InferredElementDragging.prototype.setMirrorIsVisible = function (bool) {
-            if (bool) {
-                // restore a previously hidden element.
-                // use the reference in case the selector class has already been removed.
-                if (this.currentMirrorEl) {
-                    this.currentMirrorEl.style.visibility = '';
-                    this.currentMirrorEl = null;
-                }
-            }
-            else {
-                var mirrorEl = this.mirrorSelector ?
-                    document.querySelector(this.mirrorSelector) :
-                    null;
-                if (mirrorEl) {
-                    this.currentMirrorEl = mirrorEl;
-                    mirrorEl.style.visibility = 'hidden';
-                }
-            }
-        };
-        return InferredElementDragging;
-    }(core.ElementDragging));
-
-    /*
-    Bridges third-party drag-n-drop systems with FullCalendar.
-    Must be instantiated and destroyed by caller.
-    */
-    var ThirdPartyDraggable = /** @class */ (function () {
-        function ThirdPartyDraggable(containerOrSettings, settings) {
-            var containerEl = document;
-            if (
-            // wish we could just test instanceof EventTarget, but doesn't work in IE11
-            containerOrSettings === document ||
-                containerOrSettings instanceof Element) {
-                containerEl = containerOrSettings;
-                settings = settings || {};
-            }
-            else {
-                settings = (containerOrSettings || {});
-            }
-            var dragging = this.dragging = new InferredElementDragging(containerEl);
-            if (typeof settings.itemSelector === 'string') {
-                dragging.pointer.selector = settings.itemSelector;
-            }
-            else if (containerEl === document) {
-                dragging.pointer.selector = '[data-event]';
-            }
-            if (typeof settings.mirrorSelector === 'string') {
-                dragging.mirrorSelector = settings.mirrorSelector;
-            }
-            new ExternalElementDragging(dragging, settings.eventData);
-        }
-        ThirdPartyDraggable.prototype.destroy = function () {
-            this.dragging.destroy();
-        };
-        return ThirdPartyDraggable;
-    }());
-
-    var main = core.createPlugin({
-        componentInteractions: [DateClicking, DateSelecting, EventDragging, EventDragging$1],
-        calendarInteractions: [UnselectAuto],
-        elementDraggingImpl: FeaturefulElementDragging
-    });
-
-    exports.Draggable = ExternalDraggable;
-    exports.FeaturefulElementDragging = FeaturefulElementDragging;
-    exports.PointerDragging = PointerDragging;
-    exports.ThirdPartyDraggable = ThirdPartyDraggable;
-    exports.default = main;
-
-    Object.defineProperty(exports, '__esModule', { value: true });
-
-}));
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/interaction/main.min.js b/AKPlan/static/AKPlan/vendor/fullcalendar/interaction/main.min.js
deleted file mode 100644
index 7a36731f3e7281da1e3d396cfbaef58c3573f703..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/interaction/main.min.js
+++ /dev/null
@@ -1,6 +0,0 @@
-/*!
-FullCalendar Interaction Plugin v4.3.0
-Docs & License: https://fullcalendar.io/
-(c) 2019 Adam Shaw
-*/
-!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("@fullcalendar/core")):"function"==typeof define&&define.amd?define(["exports","@fullcalendar/core"],t):t((e=e||self).FullCalendarInteraction={},e.FullCalendar)}(this,function(e,t){"use strict";var n=function(e,t){return(n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])})(e,t)};function r(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}var i=function(){return(i=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var i in t=arguments[n])Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i]);return e}).apply(this,arguments)};t.config.touchMouseIgnoreWait=500;var o=0,a=0,l=!1,s=function(){function e(e){var n=this;this.subjectEl=null,this.downEl=null,this.selector="",this.handleSelector="",this.shouldIgnoreMove=!1,this.shouldWatchScroll=!0,this.isDragging=!1,this.isTouchDragging=!1,this.wasTouchScroll=!1,this.handleMouseDown=function(e){if(!n.shouldIgnoreMouse()&&function(e){return 0===e.button&&!e.ctrlKey}(e)&&n.tryStart(e)){var t=n.createEventFromMouse(e,!0);n.emitter.trigger("pointerdown",t),n.initScrollWatch(t),n.shouldIgnoreMove||document.addEventListener("mousemove",n.handleMouseMove),document.addEventListener("mouseup",n.handleMouseUp)}},this.handleMouseMove=function(e){var t=n.createEventFromMouse(e);n.recordCoords(t),n.emitter.trigger("pointermove",t)},this.handleMouseUp=function(e){document.removeEventListener("mousemove",n.handleMouseMove),document.removeEventListener("mouseup",n.handleMouseUp),n.emitter.trigger("pointerup",n.createEventFromMouse(e)),n.cleanup()},this.handleTouchStart=function(e){if(n.tryStart(e)){n.isTouchDragging=!0;var t=n.createEventFromTouch(e,!0);n.emitter.trigger("pointerdown",t),n.initScrollWatch(t);var r=e.target;n.shouldIgnoreMove||r.addEventListener("touchmove",n.handleTouchMove),r.addEventListener("touchend",n.handleTouchEnd),r.addEventListener("touchcancel",n.handleTouchEnd),window.addEventListener("scroll",n.handleTouchScroll,!0)}},this.handleTouchMove=function(e){var t=n.createEventFromTouch(e);n.recordCoords(t),n.emitter.trigger("pointermove",t)},this.handleTouchEnd=function(e){if(n.isDragging){var r=e.target;r.removeEventListener("touchmove",n.handleTouchMove),r.removeEventListener("touchend",n.handleTouchEnd),r.removeEventListener("touchcancel",n.handleTouchEnd),window.removeEventListener("scroll",n.handleTouchScroll,!0),n.emitter.trigger("pointerup",n.createEventFromTouch(e)),n.cleanup(),n.isTouchDragging=!1,o++,setTimeout(function(){o--},t.config.touchMouseIgnoreWait)}},this.handleTouchScroll=function(){n.wasTouchScroll=!0},this.handleScroll=function(e){if(!n.shouldIgnoreMove){var t=window.pageXOffset-n.prevScrollX+n.prevPageX,r=window.pageYOffset-n.prevScrollY+n.prevPageY;n.emitter.trigger("pointermove",{origEvent:e,isTouch:n.isTouchDragging,subjectEl:n.subjectEl,pageX:t,pageY:r,deltaX:t-n.origPageX,deltaY:r-n.origPageY})}},this.containerEl=e,this.emitter=new t.EmitterMixin,e.addEventListener("mousedown",this.handleMouseDown),e.addEventListener("touchstart",this.handleTouchStart,{passive:!0}),a++||window.addEventListener("touchmove",c,{passive:!1})}return e.prototype.destroy=function(){this.containerEl.removeEventListener("mousedown",this.handleMouseDown),this.containerEl.removeEventListener("touchstart",this.handleTouchStart,{passive:!0}),--a||window.removeEventListener("touchmove",c,{passive:!1})},e.prototype.tryStart=function(e){var n=this.querySubjectEl(e),r=e.target;return!(!n||this.handleSelector&&!t.elementClosest(r,this.handleSelector))&&(this.subjectEl=n,this.downEl=r,this.isDragging=!0,this.wasTouchScroll=!1,!0)},e.prototype.cleanup=function(){l=!1,this.isDragging=!1,this.subjectEl=null,this.downEl=null,this.destroyScrollWatch()},e.prototype.querySubjectEl=function(e){return this.selector?t.elementClosest(e.target,this.selector):this.containerEl},e.prototype.shouldIgnoreMouse=function(){return o||this.isTouchDragging},e.prototype.cancelTouchScroll=function(){this.isDragging&&(l=!0)},e.prototype.initScrollWatch=function(e){this.shouldWatchScroll&&(this.recordCoords(e),window.addEventListener("scroll",this.handleScroll,!0))},e.prototype.recordCoords=function(e){this.shouldWatchScroll&&(this.prevPageX=e.pageX,this.prevPageY=e.pageY,this.prevScrollX=window.pageXOffset,this.prevScrollY=window.pageYOffset)},e.prototype.destroyScrollWatch=function(){this.shouldWatchScroll&&window.removeEventListener("scroll",this.handleScroll,!0)},e.prototype.createEventFromMouse=function(e,t){var n=0,r=0;return t?(this.origPageX=e.pageX,this.origPageY=e.pageY):(n=e.pageX-this.origPageX,r=e.pageY-this.origPageY),{origEvent:e,isTouch:!1,subjectEl:this.subjectEl,pageX:e.pageX,pageY:e.pageY,deltaX:n,deltaY:r}},e.prototype.createEventFromTouch=function(e,t){var n,r,i=e.touches,o=0,a=0;return i&&i.length?(n=i[0].pageX,r=i[0].pageY):(n=e.pageX,r=e.pageY),t?(this.origPageX=n,this.origPageY=r):(o=n-this.origPageX,a=r-this.origPageY),{origEvent:e,isTouch:!0,subjectEl:this.subjectEl,pageX:n,pageY:r,deltaX:o,deltaY:a}},e}();function c(e){l&&e.preventDefault()}var d=function(){function e(){this.isVisible=!1,this.sourceEl=null,this.mirrorEl=null,this.sourceElRect=null,this.parentNode=document.body,this.zIndex=9999,this.revertDuration=0}return e.prototype.start=function(e,t,n){this.sourceEl=e,this.sourceElRect=this.sourceEl.getBoundingClientRect(),this.origScreenX=t-window.pageXOffset,this.origScreenY=n-window.pageYOffset,this.deltaX=0,this.deltaY=0,this.updateElPosition()},e.prototype.handleMove=function(e,t){this.deltaX=e-window.pageXOffset-this.origScreenX,this.deltaY=t-window.pageYOffset-this.origScreenY,this.updateElPosition()},e.prototype.setIsVisible=function(e){e?this.isVisible||(this.mirrorEl&&(this.mirrorEl.style.display=""),this.isVisible=e,this.updateElPosition()):this.isVisible&&(this.mirrorEl&&(this.mirrorEl.style.display="none"),this.isVisible=e)},e.prototype.stop=function(e,t){var n=this,r=function(){n.cleanup(),t()};e&&this.mirrorEl&&this.isVisible&&this.revertDuration&&(this.deltaX||this.deltaY)?this.doRevertAnimation(r,this.revertDuration):setTimeout(r,0)},e.prototype.doRevertAnimation=function(e,n){var r=this.mirrorEl,i=this.sourceEl.getBoundingClientRect();r.style.transition="top "+n+"ms,left "+n+"ms",t.applyStyle(r,{left:i.left,top:i.top}),t.whenTransitionDone(r,function(){r.style.transition="",e()})},e.prototype.cleanup=function(){this.mirrorEl&&(t.removeElement(this.mirrorEl),this.mirrorEl=null),this.sourceEl=null},e.prototype.updateElPosition=function(){this.sourceEl&&this.isVisible&&t.applyStyle(this.getMirrorEl(),{left:this.sourceElRect.left+this.deltaX,top:this.sourceElRect.top+this.deltaY})},e.prototype.getMirrorEl=function(){var e=this.sourceElRect,n=this.mirrorEl;return n||((n=this.mirrorEl=this.sourceEl.cloneNode(!0)).classList.add("fc-unselectable"),n.classList.add("fc-dragging"),t.applyStyle(n,{position:"fixed",zIndex:this.zIndex,visibility:"",boxSizing:"border-box",width:e.right-e.left,height:e.bottom-e.top,right:"auto",bottom:"auto",margin:0}),this.parentNode.appendChild(n)),n},e}(),g=function(e){function t(t,n){var r=e.call(this)||this;return r.handleScroll=function(){r.scrollTop=r.scrollController.getScrollTop(),r.scrollLeft=r.scrollController.getScrollLeft(),r.handleScrollChange()},r.scrollController=t,r.doesListening=n,r.scrollTop=r.origScrollTop=t.getScrollTop(),r.scrollLeft=r.origScrollLeft=t.getScrollLeft(),r.scrollWidth=t.getScrollWidth(),r.scrollHeight=t.getScrollHeight(),r.clientWidth=t.getClientWidth(),r.clientHeight=t.getClientHeight(),r.clientRect=r.computeClientRect(),r.doesListening&&r.getEventTarget().addEventListener("scroll",r.handleScroll),r}return r(t,e),t.prototype.destroy=function(){this.doesListening&&this.getEventTarget().removeEventListener("scroll",this.handleScroll)},t.prototype.getScrollTop=function(){return this.scrollTop},t.prototype.getScrollLeft=function(){return this.scrollLeft},t.prototype.setScrollTop=function(e){this.scrollController.setScrollTop(e),this.doesListening||(this.scrollTop=Math.max(Math.min(e,this.getMaxScrollTop()),0),this.handleScrollChange())},t.prototype.setScrollLeft=function(e){this.scrollController.setScrollLeft(e),this.doesListening||(this.scrollLeft=Math.max(Math.min(e,this.getMaxScrollLeft()),0),this.handleScrollChange())},t.prototype.getClientWidth=function(){return this.clientWidth},t.prototype.getClientHeight=function(){return this.clientHeight},t.prototype.getScrollWidth=function(){return this.scrollWidth},t.prototype.getScrollHeight=function(){return this.scrollHeight},t.prototype.handleScrollChange=function(){},t}(t.ScrollController),u=function(e){function n(n,r){return e.call(this,new t.ElementScrollController(n),r)||this}return r(n,e),n.prototype.getEventTarget=function(){return this.scrollController.el},n.prototype.computeClientRect=function(){return t.computeInnerRect(this.scrollController.el)},n}(g),h=function(e){function n(n){return e.call(this,new t.WindowScrollController,n)||this}return r(n,e),n.prototype.getEventTarget=function(){return window},n.prototype.computeClientRect=function(){return{left:this.scrollLeft,right:this.scrollLeft+this.clientWidth,top:this.scrollTop,bottom:this.scrollTop+this.clientHeight}},n.prototype.handleScrollChange=function(){this.clientRect=this.computeClientRect()},n}(g),p="function"==typeof performance?performance.now:Date.now,v=function(){function e(){var e=this;this.isEnabled=!0,this.scrollQuery=[window,".fc-scroller"],this.edgeThreshold=50,this.maxVelocity=300,this.pointerScreenX=null,this.pointerScreenY=null,this.isAnimating=!1,this.scrollCaches=null,this.everMovedUp=!1,this.everMovedDown=!1,this.everMovedLeft=!1,this.everMovedRight=!1,this.animate=function(){if(e.isAnimating){var t=e.computeBestEdge(e.pointerScreenX+window.pageXOffset,e.pointerScreenY+window.pageYOffset);if(t){var n=p();e.handleSide(t,(n-e.msSinceRequest)/1e3),e.requestAnimation(n)}else e.isAnimating=!1}}}return e.prototype.start=function(e,t){this.isEnabled&&(this.scrollCaches=this.buildCaches(),this.pointerScreenX=null,this.pointerScreenY=null,this.everMovedUp=!1,this.everMovedDown=!1,this.everMovedLeft=!1,this.everMovedRight=!1,this.handleMove(e,t))},e.prototype.handleMove=function(e,t){if(this.isEnabled){var n=e-window.pageXOffset,r=t-window.pageYOffset,i=null===this.pointerScreenY?0:r-this.pointerScreenY,o=null===this.pointerScreenX?0:n-this.pointerScreenX;i<0?this.everMovedUp=!0:i>0&&(this.everMovedDown=!0),o<0?this.everMovedLeft=!0:o>0&&(this.everMovedRight=!0),this.pointerScreenX=n,this.pointerScreenY=r,this.isAnimating||(this.isAnimating=!0,this.requestAnimation(p()))}},e.prototype.stop=function(){if(this.isEnabled){this.isAnimating=!1;for(var e=0,t=this.scrollCaches;e<t.length;e++){t[e].destroy()}this.scrollCaches=null}},e.prototype.requestAnimation=function(e){this.msSinceRequest=e,requestAnimationFrame(this.animate)},e.prototype.handleSide=function(e,t){var n=e.scrollCache,r=this.edgeThreshold,i=r-e.distance,o=i*i/(r*r)*this.maxVelocity*t,a=1;switch(e.name){case"left":a=-1;case"right":n.setScrollLeft(n.getScrollLeft()+o*a);break;case"top":a=-1;case"bottom":n.setScrollTop(n.getScrollTop()+o*a)}},e.prototype.computeBestEdge=function(e,t){for(var n=this.edgeThreshold,r=null,i=0,o=this.scrollCaches;i<o.length;i++){var a=o[i],l=a.clientRect,s=e-l.left,c=l.right-e,d=t-l.top,g=l.bottom-t;s>=0&&c>=0&&d>=0&&g>=0&&(d<=n&&this.everMovedUp&&a.canScrollUp()&&(!r||r.distance>d)&&(r={scrollCache:a,name:"top",distance:d}),g<=n&&this.everMovedDown&&a.canScrollDown()&&(!r||r.distance>g)&&(r={scrollCache:a,name:"bottom",distance:g}),s<=n&&this.everMovedLeft&&a.canScrollLeft()&&(!r||r.distance>s)&&(r={scrollCache:a,name:"left",distance:s}),c<=n&&this.everMovedRight&&a.canScrollRight()&&(!r||r.distance>c)&&(r={scrollCache:a,name:"right",distance:c}))}return r},e.prototype.buildCaches=function(){return this.queryScrollEls().map(function(e){return e===window?new h(!1):new u(e,!1)})},e.prototype.queryScrollEls=function(){for(var e=[],t=0,n=this.scrollQuery;t<n.length;t++){var r=n[t];"object"==typeof r?e.push(r):e.push.apply(e,Array.prototype.slice.call(document.querySelectorAll(r)))}return e},e}(),f=function(e){function n(n){var r=e.call(this,n)||this;r.delay=null,r.minDistance=0,r.touchScrollAllowed=!0,r.mirrorNeedsRevert=!1,r.isInteracting=!1,r.isDragging=!1,r.isDelayEnded=!1,r.isDistanceSurpassed=!1,r.delayTimeoutId=null,r.onPointerDown=function(e){r.isDragging||(r.isInteracting=!0,r.isDelayEnded=!1,r.isDistanceSurpassed=!1,t.preventSelection(document.body),t.preventContextMenu(document.body),e.isTouch||e.origEvent.preventDefault(),r.emitter.trigger("pointerdown",e),r.pointer.shouldIgnoreMove||(r.mirror.setIsVisible(!1),r.mirror.start(e.subjectEl,e.pageX,e.pageY),r.startDelay(e),r.minDistance||r.handleDistanceSurpassed(e)))},r.onPointerMove=function(e){if(r.isInteracting){if(r.emitter.trigger("pointermove",e),!r.isDistanceSurpassed){var t=r.minDistance,n=e.deltaX,i=e.deltaY;n*n+i*i>=t*t&&r.handleDistanceSurpassed(e)}r.isDragging&&("scroll"!==e.origEvent.type&&(r.mirror.handleMove(e.pageX,e.pageY),r.autoScroller.handleMove(e.pageX,e.pageY)),r.emitter.trigger("dragmove",e))}},r.onPointerUp=function(e){r.isInteracting&&(r.isInteracting=!1,t.allowSelection(document.body),t.allowContextMenu(document.body),r.emitter.trigger("pointerup",e),r.isDragging&&(r.autoScroller.stop(),r.tryStopDrag(e)),r.delayTimeoutId&&(clearTimeout(r.delayTimeoutId),r.delayTimeoutId=null))};var i=r.pointer=new s(n);return i.emitter.on("pointerdown",r.onPointerDown),i.emitter.on("pointermove",r.onPointerMove),i.emitter.on("pointerup",r.onPointerUp),r.mirror=new d,r.autoScroller=new v,r}return r(n,e),n.prototype.destroy=function(){this.pointer.destroy()},n.prototype.startDelay=function(e){var t=this;"number"==typeof this.delay?this.delayTimeoutId=setTimeout(function(){t.delayTimeoutId=null,t.handleDelayEnd(e)},this.delay):this.handleDelayEnd(e)},n.prototype.handleDelayEnd=function(e){this.isDelayEnded=!0,this.tryStartDrag(e)},n.prototype.handleDistanceSurpassed=function(e){this.isDistanceSurpassed=!0,this.tryStartDrag(e)},n.prototype.tryStartDrag=function(e){this.isDelayEnded&&this.isDistanceSurpassed&&(this.pointer.wasTouchScroll&&!this.touchScrollAllowed||(this.isDragging=!0,this.mirrorNeedsRevert=!1,this.autoScroller.start(e.pageX,e.pageY),this.emitter.trigger("dragstart",e),!1===this.touchScrollAllowed&&this.pointer.cancelTouchScroll()))},n.prototype.tryStopDrag=function(e){this.mirror.stop(this.mirrorNeedsRevert,this.stopDrag.bind(this,e))},n.prototype.stopDrag=function(e){this.isDragging=!1,this.emitter.trigger("dragend",e)},n.prototype.setIgnoreMove=function(e){this.pointer.shouldIgnoreMove=e},n.prototype.setMirrorIsVisible=function(e){this.mirror.setIsVisible(e)},n.prototype.setMirrorNeedsRevert=function(e){this.mirrorNeedsRevert=e},n.prototype.setAutoScrollEnabled=function(e){this.autoScroller.isEnabled=e},n}(t.ElementDragging),E=function(){function e(e){this.origRect=t.computeRect(e),this.scrollCaches=t.getClippingParents(e).map(function(e){return new u(e,!0)})}return e.prototype.destroy=function(){for(var e=0,t=this.scrollCaches;e<t.length;e++){t[e].destroy()}},e.prototype.computeLeft=function(){for(var e=this.origRect.left,t=0,n=this.scrollCaches;t<n.length;t++){var r=n[t];e+=r.origScrollLeft-r.getScrollLeft()}return e},e.prototype.computeTop=function(){for(var e=this.origRect.top,t=0,n=this.scrollCaches;t<n.length;t++){var r=n[t];e+=r.origScrollTop-r.getScrollTop()}return e},e.prototype.isWithinClipping=function(e,n){for(var r,i,o={left:e,top:n},a=0,l=this.scrollCaches;a<l.length;a++){var s=l[a];if(r=s.getEventTarget(),i=void 0,"HTML"!==(i=r.tagName)&&"BODY"!==i&&!t.pointInsideRect(o,s.clientRect))return!1}return!0},e}();var m=function(){function e(e,n){var r=this;this.useSubjectCenter=!1,this.requireInitial=!0,this.initialHit=null,this.movingHit=null,this.finalHit=null,this.handlePointerDown=function(e){var t=r.dragging;r.initialHit=null,r.movingHit=null,r.finalHit=null,r.prepareHits(),r.processFirstCoord(e),r.initialHit||!r.requireInitial?(t.setIgnoreMove(!1),r.emitter.trigger("pointerdown",e)):t.setIgnoreMove(!0)},this.handleDragStart=function(e){r.emitter.trigger("dragstart",e),r.handleMove(e,!0)},this.handleDragMove=function(e){r.emitter.trigger("dragmove",e),r.handleMove(e)},this.handlePointerUp=function(e){r.releaseHits(),r.emitter.trigger("pointerup",e)},this.handleDragEnd=function(e){r.movingHit&&r.emitter.trigger("hitupdate",null,!0,e),r.finalHit=r.movingHit,r.movingHit=null,r.emitter.trigger("dragend",e)},this.droppableStore=n,e.emitter.on("pointerdown",this.handlePointerDown),e.emitter.on("dragstart",this.handleDragStart),e.emitter.on("dragmove",this.handleDragMove),e.emitter.on("pointerup",this.handlePointerUp),e.emitter.on("dragend",this.handleDragEnd),this.dragging=e,this.emitter=new t.EmitterMixin}return e.prototype.processFirstCoord=function(e){var n,r={left:e.pageX,top:e.pageY},i=r,o=e.subjectEl;o!==document&&(n=t.computeRect(o),i=t.constrainPoint(i,n));var a=this.initialHit=this.queryHitForOffset(i.left,i.top);if(a){if(this.useSubjectCenter&&n){var l=t.intersectRects(n,a.rect);l&&(i=t.getRectCenter(l))}this.coordAdjust=t.diffPoints(i,r)}else this.coordAdjust={left:0,top:0}},e.prototype.handleMove=function(e,t){var n=this.queryHitForOffset(e.pageX+this.coordAdjust.left,e.pageY+this.coordAdjust.top);!t&&S(this.movingHit,n)||(this.movingHit=n,this.emitter.trigger("hitupdate",n,!1,e))},e.prototype.prepareHits=function(){this.offsetTrackers=t.mapHash(this.droppableStore,function(e){return e.component.buildPositionCaches(),new E(e.el)})},e.prototype.releaseHits=function(){var e=this.offsetTrackers;for(var t in e)e[t].destroy();this.offsetTrackers={}},e.prototype.queryHitForOffset=function(e,n){var r=this.droppableStore,i=this.offsetTrackers,o=null;for(var a in r){var l=r[a].component,s=i[a];if(s.isWithinClipping(e,n)){var c=s.computeLeft(),d=s.computeTop(),g=e-c,u=n-d,h=s.origRect,p=h.right-h.left,v=h.bottom-h.top;if(g>=0&&g<p&&u>=0&&u<v){var f=l.queryHit(g,u,p,v);!f||l.props.dateProfile&&!t.rangeContainsRange(l.props.dateProfile.activeRange,f.dateSpan.range)||o&&!(f.layer>o.layer)||(f.rect.left+=c,f.rect.right+=c,f.rect.top+=d,f.rect.bottom+=d,o=f)}}}return o},e}();function S(e,n){return!e&&!n||Boolean(e)===Boolean(n)&&t.isDateSpansEqual(e.dateSpan,n.dateSpan)}var y=function(e){function n(n){var r=e.call(this,n)||this;r.handlePointerDown=function(e){var t=r.dragging;t.setIgnoreMove(!r.component.isValidDateDownEl(t.pointer.downEl))},r.handleDragEnd=function(e){var t=r.component;if(!r.dragging.pointer.wasTouchScroll){var n=r.hitDragging,i=n.initialHit,o=n.finalHit;i&&o&&S(i,o)&&t.calendar.triggerDateClick(i.dateSpan,i.dayEl,t.view,e.origEvent)}};var i=n.component;r.dragging=new f(i.el),r.dragging.autoScroller.isEnabled=!1;var o=r.hitDragging=new m(r.dragging,t.interactionSettingsToStore(n));return o.emitter.on("pointerdown",r.handlePointerDown),o.emitter.on("dragend",r.handleDragEnd),r}return r(n,e),n.prototype.destroy=function(){this.dragging.destroy()},n}(t.Interaction),D=function(e){function n(n){var r=e.call(this,n)||this;r.dragSelection=null,r.handlePointerDown=function(e){var t=r,n=t.component,i=t.dragging,o=n.opt("selectable")&&n.isValidDateDownEl(e.origEvent.target);i.setIgnoreMove(!o),i.delay=e.isTouch?function(e){var t=e.opt("selectLongPressDelay");null==t&&(t=e.opt("longPressDelay"));return t}(n):null},r.handleDragStart=function(e){r.component.calendar.unselect(e)},r.handleHitUpdate=function(e,n){var o=r.component.calendar,a=null,l=!1;e&&((a=function(e,n,r){var o=e.dateSpan,a=n.dateSpan,l=[o.range.start,o.range.end,a.range.start,a.range.end];l.sort(t.compareNumbers);for(var s={},c=0,d=r;c<d.length;c++){var g=d[c],u=g(e,n);if(!1===u)return null;u&&i(s,u)}return s.range={start:l[0],end:l[3]},s.allDay=o.allDay,s}(r.hitDragging.initialHit,e,o.pluginSystem.hooks.dateSelectionTransformers))&&r.component.isDateSelectionValid(a)||(l=!0,a=null)),a?o.dispatch({type:"SELECT_DATES",selection:a}):n||o.dispatch({type:"UNSELECT_DATES"}),l?t.disableCursor():t.enableCursor(),n||(r.dragSelection=a)},r.handlePointerUp=function(e){r.dragSelection&&(r.component.calendar.triggerDateSelect(r.dragSelection,e),r.dragSelection=null)};var o=n.component,a=r.dragging=new f(o.el);a.touchScrollAllowed=!1,a.minDistance=o.opt("selectMinDistance")||0,a.autoScroller.isEnabled=o.opt("dragScroll");var l=r.hitDragging=new m(r.dragging,t.interactionSettingsToStore(n));return l.emitter.on("pointerdown",r.handlePointerDown),l.emitter.on("dragstart",r.handleDragStart),l.emitter.on("hitupdate",r.handleHitUpdate),l.emitter.on("pointerup",r.handlePointerUp),r}return r(n,e),n.prototype.destroy=function(){this.dragging.destroy()},n}(t.Interaction);var w=function(e){function n(r){var o=e.call(this,r)||this;o.subjectSeg=null,o.isDragging=!1,o.eventRange=null,o.relevantEvents=null,o.receivingCalendar=null,o.validMutation=null,o.mutatedRelevantEvents=null,o.handlePointerDown=function(e){var n=e.origEvent.target,r=o,i=r.component,a=r.dragging,l=a.mirror,s=i.calendar,c=o.subjectSeg=t.getElSeg(e.subjectEl),d=(o.eventRange=c.eventRange).instance.instanceId;o.relevantEvents=t.getRelevantEvents(s.state.eventStore,d),a.minDistance=e.isTouch?0:i.opt("eventDragMinDistance"),a.delay=e.isTouch&&d!==i.props.eventSelection?function(e){var t=e.opt("eventLongPressDelay");null==t&&(t=e.opt("longPressDelay"));return t}(i):null,l.parentNode=s.el,l.revertDuration=i.opt("dragRevertDuration");var g=i.isValidSegDownEl(n)&&!t.elementClosest(n,".fc-resizer");a.setIgnoreMove(!g),o.isDragging=g&&e.subjectEl.classList.contains("fc-draggable")},o.handleDragStart=function(e){var n=o.component.calendar,r=o.eventRange,i=r.instance.instanceId;e.isTouch?i!==o.component.props.eventSelection&&n.dispatch({type:"SELECT_EVENT",eventInstanceId:i}):n.dispatch({type:"UNSELECT_EVENT"}),o.isDragging&&(n.unselect(e),n.publiclyTrigger("eventDragStart",[{el:o.subjectSeg.el,event:new t.EventApi(n,r.def,r.instance),jsEvent:e.origEvent,view:o.component.view}]))},o.handleHitUpdate=function(e,n){if(o.isDragging){var r=o.relevantEvents,i=o.hitDragging.initialHit,a=o.component.calendar,l=null,s=null,c=null,d=!1,g={affectedEvents:r,mutatedEvents:t.createEmptyEventStore(),isEvent:!0,origSeg:o.subjectSeg};if(e){var u=e.component;a===(l=u.calendar)||u.opt("editable")&&u.opt("droppable")?(s=function(e,n,r){var i=e.dateSpan,o=n.dateSpan,a=i.range.start,l=o.range.start,s={};i.allDay!==o.allDay&&(s.allDay=o.allDay,s.hasEnd=n.component.opt("allDayMaintainDuration"),o.allDay&&(a=t.startOfDay(a)));var c=t.diffDates(a,l,e.component.dateEnv,e.component===n.component?e.component.largeUnit:null);c.milliseconds&&(s.allDay=!1);for(var d={datesDelta:c,standardProps:s},g=0,u=r;g<u.length;g++){var h=u[g];h(d,e,n)}return d}(i,e,l.pluginSystem.hooks.eventDragMutationMassagers))&&(c=t.applyMutationToEventStore(r,l.eventUiBases,s,l),g.mutatedEvents=c,u.isInteractionValid(g)||(d=!0,s=null,c=null,g.mutatedEvents=t.createEmptyEventStore())):l=null}o.displayDrag(l,g),d?t.disableCursor():t.enableCursor(),n||(a===l&&S(i,e)&&(s=null),o.dragging.setMirrorNeedsRevert(!s),o.dragging.setMirrorIsVisible(!e||!document.querySelector(".fc-mirror")),o.receivingCalendar=l,o.validMutation=s,o.mutatedRelevantEvents=c)}},o.handlePointerUp=function(){o.isDragging||o.cleanup()},o.handleDragEnd=function(e){if(o.isDragging){var n=o.component.calendar,r=o.component.view,a=o,l=a.receivingCalendar,s=a.validMutation,c=o.eventRange.def,d=o.eventRange.instance,g=new t.EventApi(n,c,d),u=o.relevantEvents,h=o.mutatedRelevantEvents,p=o.hitDragging.finalHit;if(o.clearDrag(),n.publiclyTrigger("eventDragStop",[{el:o.subjectSeg.el,event:g,jsEvent:e.origEvent,view:r}]),s){if(l===n){n.dispatch({type:"MERGE_EVENTS",eventStore:h});for(var v={},f=0,E=n.pluginSystem.hooks.eventDropTransformers;f<E.length;f++){var m=E[f];i(v,m(s,n))}var S=i({},v,{el:e.subjectEl,delta:s.datesDelta,oldEvent:g,event:new t.EventApi(n,h.defs[c.defId],d?h.instances[d.instanceId]:null),revert:function(){n.dispatch({type:"MERGE_EVENTS",eventStore:u})},jsEvent:e.origEvent,view:r});n.publiclyTrigger("eventDrop",[S])}else if(l){n.publiclyTrigger("eventLeave",[{draggedEl:e.subjectEl,event:g,view:r}]),n.dispatch({type:"REMOVE_EVENT_INSTANCES",instances:o.mutatedRelevantEvents.instances}),l.dispatch({type:"MERGE_EVENTS",eventStore:o.mutatedRelevantEvents}),e.isTouch&&l.dispatch({type:"SELECT_EVENT",eventInstanceId:d.instanceId});var y=i({},l.buildDatePointApi(p.dateSpan),{draggedEl:e.subjectEl,jsEvent:e.origEvent,view:p.component});l.publiclyTrigger("drop",[y]),l.publiclyTrigger("eventReceive",[{draggedEl:e.subjectEl,event:new t.EventApi(l,h.defs[c.defId],h.instances[d.instanceId]),view:p.component}])}}else n.publiclyTrigger("_noEventDrop")}o.cleanup()};var a=o.component,l=o.dragging=new f(a.el);l.pointer.selector=n.SELECTOR,l.touchScrollAllowed=!1,l.autoScroller.isEnabled=a.opt("dragScroll");var s=o.hitDragging=new m(o.dragging,t.interactionSettingsStore);return s.useSubjectCenter=r.useEventCenter,s.emitter.on("pointerdown",o.handlePointerDown),s.emitter.on("dragstart",o.handleDragStart),s.emitter.on("hitupdate",o.handleHitUpdate),s.emitter.on("pointerup",o.handlePointerUp),s.emitter.on("dragend",o.handleDragEnd),o}return r(n,e),n.prototype.destroy=function(){this.dragging.destroy()},n.prototype.displayDrag=function(e,n){var r=this.component.calendar,i=this.receivingCalendar;i&&i!==e&&(i===r?i.dispatch({type:"SET_EVENT_DRAG",state:{affectedEvents:n.affectedEvents,mutatedEvents:t.createEmptyEventStore(),isEvent:!0,origSeg:n.origSeg}}):i.dispatch({type:"UNSET_EVENT_DRAG"})),e&&e.dispatch({type:"SET_EVENT_DRAG",state:n})},n.prototype.clearDrag=function(){var e=this.component.calendar,t=this.receivingCalendar;t&&t.dispatch({type:"UNSET_EVENT_DRAG"}),e!==t&&e.dispatch({type:"UNSET_EVENT_DRAG"})},n.prototype.cleanup=function(){this.subjectSeg=null,this.isDragging=!1,this.eventRange=null,this.relevantEvents=null,this.receivingCalendar=null,this.validMutation=null,this.mutatedRelevantEvents=null},n.SELECTOR=".fc-draggable, .fc-resizable",n}(t.Interaction);var T=function(e){function n(n){var r=e.call(this,n)||this;r.draggingSeg=null,r.eventRange=null,r.relevantEvents=null,r.validMutation=null,r.mutatedRelevantEvents=null,r.handlePointerDown=function(e){var t=r.component,n=r.querySeg(e),i=r.eventRange=n.eventRange;r.dragging.minDistance=t.opt("eventDragMinDistance"),r.dragging.setIgnoreMove(!r.component.isValidSegDownEl(e.origEvent.target)||e.isTouch&&r.component.props.eventSelection!==i.instance.instanceId)},r.handleDragStart=function(e){var n=r.component.calendar,i=r.eventRange;r.relevantEvents=t.getRelevantEvents(n.state.eventStore,r.eventRange.instance.instanceId),r.draggingSeg=r.querySeg(e),n.unselect(),n.publiclyTrigger("eventResizeStart",[{el:r.draggingSeg.el,event:new t.EventApi(n,i.def,i.instance),jsEvent:e.origEvent,view:r.component.view}])},r.handleHitUpdate=function(e,n,o){var a=r.component.calendar,l=r.relevantEvents,s=r.hitDragging.initialHit,c=r.eventRange.instance,d=null,g=null,u=!1,h={affectedEvents:l,mutatedEvents:t.createEmptyEventStore(),isEvent:!0,origSeg:r.draggingSeg};e&&(d=function(e,n,r,o,a){for(var l=e.component.dateEnv,s=e.dateSpan.range.start,c=n.dateSpan.range.start,d=t.diffDates(s,c,l,e.component.largeUnit),g={},u=0,h=a;u<h.length;u++){var p=h[u],v=p(e,n);if(!1===v)return null;v&&i(g,v)}if(r){if(l.add(o.start,d)<o.end)return g.startDelta=d,g}else if(l.add(o.end,d)>o.start)return g.endDelta=d,g;return null}(s,e,o.subjectEl.classList.contains("fc-start-resizer"),c.range,a.pluginSystem.hooks.eventResizeJoinTransforms)),d&&(g=t.applyMutationToEventStore(l,a.eventUiBases,d,a),h.mutatedEvents=g,r.component.isInteractionValid(h)||(u=!0,d=null,g=null,h.mutatedEvents=null)),g?a.dispatch({type:"SET_EVENT_RESIZE",state:h}):a.dispatch({type:"UNSET_EVENT_RESIZE"}),u?t.disableCursor():t.enableCursor(),n||(d&&S(s,e)&&(d=null),r.validMutation=d,r.mutatedRelevantEvents=g)},r.handleDragEnd=function(e){var n=r.component.calendar,i=r.component.view,o=r.eventRange.def,a=r.eventRange.instance,l=new t.EventApi(n,o,a),s=r.relevantEvents,c=r.mutatedRelevantEvents;n.publiclyTrigger("eventResizeStop",[{el:r.draggingSeg.el,event:l,jsEvent:e.origEvent,view:i}]),r.validMutation?(n.dispatch({type:"MERGE_EVENTS",eventStore:c}),n.publiclyTrigger("eventResize",[{el:r.draggingSeg.el,startDelta:r.validMutation.startDelta||t.createDuration(0),endDelta:r.validMutation.endDelta||t.createDuration(0),prevEvent:l,event:new t.EventApi(n,c.defs[o.defId],a?c.instances[a.instanceId]:null),revert:function(){n.dispatch({type:"MERGE_EVENTS",eventStore:s})},jsEvent:e.origEvent,view:i}])):n.publiclyTrigger("_noEventResize"),r.draggingSeg=null,r.relevantEvents=null,r.validMutation=null};var o=n.component,a=r.dragging=new f(o.el);a.pointer.selector=".fc-resizer",a.touchScrollAllowed=!1,a.autoScroller.isEnabled=o.opt("dragScroll");var l=r.hitDragging=new m(r.dragging,t.interactionSettingsToStore(n));return l.emitter.on("pointerdown",r.handlePointerDown),l.emitter.on("dragstart",r.handleDragStart),l.emitter.on("hitupdate",r.handleHitUpdate),l.emitter.on("dragend",r.handleDragEnd),r}return r(n,e),n.prototype.destroy=function(){this.dragging.destroy()},n.prototype.querySeg=function(e){return t.getElSeg(t.elementClosest(e.subjectEl,this.component.fgSegSelector))},n}(t.Interaction);var M=function(){function e(e){var n=this;this.isRecentPointerDateSelect=!1,this.onSelect=function(e){e.jsEvent&&(n.isRecentPointerDateSelect=!0)},this.onDocumentPointerUp=function(e){var r=n,i=r.calendar,o=r.documentPointer,a=i.state;if(!o.wasTouchScroll){if(a.dateSelection&&!n.isRecentPointerDateSelect){var l=i.viewOpt("unselectAuto"),s=i.viewOpt("unselectCancel");!l||l&&t.elementClosest(o.downEl,s)||i.unselect(e)}a.eventSelection&&!t.elementClosest(o.downEl,w.SELECTOR)&&i.dispatch({type:"UNSELECT_EVENT"})}n.isRecentPointerDateSelect=!1},this.calendar=e;var r=this.documentPointer=new s(document);r.shouldIgnoreMove=!0,r.shouldWatchScroll=!1,r.emitter.on("pointerup",this.onDocumentPointerUp),e.on("select",this.onSelect)}return e.prototype.destroy=function(){this.calendar.off("select",this.onSelect),this.documentPointer.destroy()},e}(),b=function(){function e(e,n){var r=this;this.receivingCalendar=null,this.droppableEvent=null,this.suppliedDragMeta=null,this.dragMeta=null,this.handleDragStart=function(e){r.dragMeta=r.buildDragMeta(e.subjectEl)},this.handleHitUpdate=function(e,n,o){var a=r.hitDragging.dragging,l=null,s=null,c=!1,d={affectedEvents:t.createEmptyEventStore(),mutatedEvents:t.createEmptyEventStore(),isEvent:r.dragMeta.create,origSeg:null};e&&(l=e.component.calendar,r.canDropElOnCalendar(o.subjectEl,l)&&(s=function(e,n,r){for(var o=i({},n.leftoverProps),a=0,l=r.pluginSystem.hooks.externalDefTransforms;a<l.length;a++){var s=l[a];i(o,s(e,n))}var c=t.parseEventDef(o,n.sourceId,e.allDay,r.opt("forceEventDuration")||Boolean(n.duration),r),d=e.range.start;e.allDay&&n.startTime&&(d=r.dateEnv.add(d,n.startTime));var g=n.duration?r.dateEnv.add(d,n.duration):r.getDefaultEventEnd(e.allDay,d),u=t.createEventInstance(c.defId,{start:d,end:g});return{def:c,instance:u}}(e.dateSpan,r.dragMeta,l),d.mutatedEvents=t.eventTupleToStore(s),(c=!t.isInteractionValid(d,l))&&(d.mutatedEvents=t.createEmptyEventStore(),s=null))),r.displayDrag(l,d),a.setMirrorIsVisible(n||!s||!document.querySelector(".fc-mirror")),c?t.disableCursor():t.enableCursor(),n||(a.setMirrorNeedsRevert(!s),r.receivingCalendar=l,r.droppableEvent=s)},this.handleDragEnd=function(e){var n=r,o=n.receivingCalendar,a=n.droppableEvent;if(r.clearDrag(),o&&a){var l=r.hitDragging.finalHit,s=l.component.view,c=r.dragMeta,d=i({},o.buildDatePointApi(l.dateSpan),{draggedEl:e.subjectEl,jsEvent:e.origEvent,view:s});o.publiclyTrigger("drop",[d]),c.create&&(o.dispatch({type:"MERGE_EVENTS",eventStore:t.eventTupleToStore(a)}),e.isTouch&&o.dispatch({type:"SELECT_EVENT",eventInstanceId:a.instance.instanceId}),o.publiclyTrigger("eventReceive",[{draggedEl:e.subjectEl,event:new t.EventApi(o,a.def,a.instance),view:s}]))}r.receivingCalendar=null,r.droppableEvent=null};var o=this.hitDragging=new m(e,t.interactionSettingsStore);o.requireInitial=!1,o.emitter.on("dragstart",this.handleDragStart),o.emitter.on("hitupdate",this.handleHitUpdate),o.emitter.on("dragend",this.handleDragEnd),this.suppliedDragMeta=n}return e.prototype.buildDragMeta=function(e){return"object"==typeof this.suppliedDragMeta?t.parseDragMeta(this.suppliedDragMeta):"function"==typeof this.suppliedDragMeta?t.parseDragMeta(this.suppliedDragMeta(e)):(n=function(e,n){var r=t.config.dataAttrPrefix,i=(r?r+"-":"")+n;return e.getAttribute("data-"+i)||""}(e,"event"),r=n?JSON.parse(n):{create:!1},t.parseDragMeta(r));var n,r},e.prototype.displayDrag=function(e,t){var n=this.receivingCalendar;n&&n!==e&&n.dispatch({type:"UNSET_EVENT_DRAG"}),e&&e.dispatch({type:"SET_EVENT_DRAG",state:t})},e.prototype.clearDrag=function(){this.receivingCalendar&&this.receivingCalendar.dispatch({type:"UNSET_EVENT_DRAG"})},e.prototype.canDropElOnCalendar=function(e,n){var r=n.opt("dropAccept");return"function"==typeof r?r(e):"string"!=typeof r||!r||Boolean(t.elementMatches(e,r))},e}();t.config.dataAttrPrefix="";var C=function(){function e(e,n){var r=this;void 0===n&&(n={}),this.handlePointerDown=function(e){var n=r.dragging,i=r.settings,o=i.minDistance,a=i.longPressDelay;n.minDistance=null!=o?o:e.isTouch?0:t.globalDefaults.eventDragMinDistance,n.delay=e.isTouch?null!=a?a:t.globalDefaults.longPressDelay:0},this.handleDragStart=function(e){e.isTouch&&r.dragging.delay&&e.subjectEl.classList.contains("fc-event")&&r.dragging.mirror.getMirrorEl().classList.add("fc-selected")},this.settings=n;var i=this.dragging=new f(e);i.touchScrollAllowed=!1,null!=n.itemSelector&&(i.pointer.selector=n.itemSelector),null!=n.appendTo&&(i.mirror.parentNode=n.appendTo),i.emitter.on("pointerdown",this.handlePointerDown),i.emitter.on("dragstart",this.handleDragStart),new b(i,n.eventData)}return e.prototype.destroy=function(){this.dragging.destroy()},e}(),R=function(e){function t(t){var n=e.call(this,t)||this;n.shouldIgnoreMove=!1,n.mirrorSelector="",n.currentMirrorEl=null,n.handlePointerDown=function(e){n.emitter.trigger("pointerdown",e),n.shouldIgnoreMove||n.emitter.trigger("dragstart",e)},n.handlePointerMove=function(e){n.shouldIgnoreMove||n.emitter.trigger("dragmove",e)},n.handlePointerUp=function(e){n.emitter.trigger("pointerup",e),n.shouldIgnoreMove||n.emitter.trigger("dragend",e)};var r=n.pointer=new s(t);return r.emitter.on("pointerdown",n.handlePointerDown),r.emitter.on("pointermove",n.handlePointerMove),r.emitter.on("pointerup",n.handlePointerUp),n}return r(t,e),t.prototype.destroy=function(){this.pointer.destroy()},t.prototype.setIgnoreMove=function(e){this.shouldIgnoreMove=e},t.prototype.setMirrorIsVisible=function(e){if(e)this.currentMirrorEl&&(this.currentMirrorEl.style.visibility="",this.currentMirrorEl=null);else{var t=this.mirrorSelector?document.querySelector(this.mirrorSelector):null;t&&(this.currentMirrorEl=t,t.style.visibility="hidden")}},t}(t.ElementDragging),I=function(){function e(e,t){var n=document;e===document||e instanceof Element?(n=e,t=t||{}):t=e||{};var r=this.dragging=new R(n);"string"==typeof t.itemSelector?r.pointer.selector=t.itemSelector:n===document&&(r.pointer.selector="[data-event]"),"string"==typeof t.mirrorSelector&&(r.mirrorSelector=t.mirrorSelector),new b(r,t.eventData)}return e.prototype.destroy=function(){this.dragging.destroy()},e}(),P=t.createPlugin({componentInteractions:[y,D,w,T],calendarInteractions:[M],elementDraggingImpl:f});e.Draggable=C,e.FeaturefulElementDragging=f,e.PointerDragging=s,e.ThirdPartyDraggable=I,e.default=P,Object.defineProperty(e,"__esModule",{value:!0})});
\ No newline at end of file
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/interaction/package.json b/AKPlan/static/AKPlan/vendor/fullcalendar/interaction/package.json
deleted file mode 100644
index 812a7b4e6bdd0e8cf752cc34863dc998c5b92f9c..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/interaction/package.json
+++ /dev/null
@@ -1,33 +0,0 @@
-{
-  "name": "@fullcalendar/interaction",
-  "version": "4.3.0",
-  "title": "FullCalendar Interaction Plugin",
-  "description": "Provides functionality for event drag-n-drop, resizing, dateClick, and selectable actions",
-  "keywords": [
-    "calendar",
-    "event",
-    "full-sized"
-  ],
-  "homepage": "https://fullcalendar.io/",
-  "docs": "https://fullcalendar.io/docs/editable",
-  "bugs": "https://fullcalendar.io/reporting-bugs",
-  "repository": {
-    "type": "git",
-    "url": "https://github.com/fullcalendar/fullcalendar.git",
-    "homepage": "https://github.com/fullcalendar/fullcalendar"
-  },
-  "license": "MIT",
-  "author": {
-    "name": "Adam Shaw",
-    "email": "arshaw@arshaw.com",
-    "url": "http://arshaw.com/"
-  },
-  "copyright": "2019 Adam Shaw",
-  "peerDependencies": {
-    "@fullcalendar/core": "~4.3.0"
-  },
-  "main": "main.js",
-  "module": "main.esm.js",
-  "unpkg": "main.min.js",
-  "types": "main.d.ts"
-}
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/list/LICENSE.txt b/AKPlan/static/AKPlan/vendor/fullcalendar/list/LICENSE.txt
deleted file mode 100644
index 2149cfbeff4f2e3649bc950982aa72b894f7e521..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/list/LICENSE.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-Copyright (c) 2019 Adam Shaw
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/list/README.md b/AKPlan/static/AKPlan/vendor/fullcalendar/list/README.md
deleted file mode 100644
index 1122d7f9db8b210f0d7c3440898b3ea1e5e4c7c1..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/list/README.md
+++ /dev/null
@@ -1,8 +0,0 @@
-
-# FullCalendar List View Plugin
-
-View your events as a bulleted list
-
-[View the docs &raquo;](https://fullcalendar.io/docs/list-view)
-
-This package was created from the [FullCalendar monorepo &raquo;](https://github.com/fullcalendar/fullcalendar)
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/list/main.css b/AKPlan/static/AKPlan/vendor/fullcalendar/list/main.css
deleted file mode 100644
index 6af9bb70c3dbc67755c085bfb5a3013759218f83..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/list/main.css
+++ /dev/null
@@ -1,118 +0,0 @@
-/* List View
---------------------------------------------------------------------------------------------------*/
-/* possibly reusable */
-.fc-event-dot {
-  display: inline-block;
-  width: 10px;
-  height: 10px;
-  border-radius: 5px;
-}
-
-/* view wrapper */
-.fc-rtl .fc-list-view {
-  direction: rtl;
-  /* unlike core views, leverage browser RTL */
-}
-
-.fc-list-view {
-  border-width: 1px;
-  border-style: solid;
-}
-
-/* table resets */
-.fc .fc-list-table {
-  table-layout: auto;
-  /* for shrinkwrapping cell content */
-}
-
-.fc-list-table td {
-  border-width: 1px 0 0;
-  padding: 8px 14px;
-}
-
-.fc-list-table tr:first-child td {
-  border-top-width: 0;
-}
-
-/* day headings with the list */
-.fc-list-heading {
-  border-bottom-width: 1px;
-}
-
-.fc-list-heading td {
-  font-weight: bold;
-}
-
-.fc-ltr .fc-list-heading-main {
-  float: left;
-}
-
-.fc-ltr .fc-list-heading-alt {
-  float: right;
-}
-
-.fc-rtl .fc-list-heading-main {
-  float: right;
-}
-
-.fc-rtl .fc-list-heading-alt {
-  float: left;
-}
-
-/* event list items */
-.fc-list-item.fc-has-url {
-  cursor: pointer;
-  /* whole row will be clickable */
-}
-
-.fc-list-item-marker,
-.fc-list-item-time {
-  white-space: nowrap;
-  width: 1px;
-}
-
-/* make the dot closer to the event title */
-.fc-ltr .fc-list-item-marker {
-  padding-right: 0;
-}
-
-.fc-rtl .fc-list-item-marker {
-  padding-left: 0;
-}
-
-.fc-list-item-title a {
-  /* every event title cell has an <a> tag */
-  text-decoration: none;
-  color: inherit;
-}
-
-.fc-list-item-title a[href]:hover {
-  /* hover effect only on titles with hrefs */
-  text-decoration: underline;
-}
-
-/* message when no events */
-.fc-list-empty-wrap2 {
-  position: absolute;
-  top: 0;
-  left: 0;
-  right: 0;
-  bottom: 0;
-}
-
-.fc-list-empty-wrap1 {
-  width: 100%;
-  height: 100%;
-  display: table;
-}
-
-.fc-list-empty {
-  display: table-cell;
-  vertical-align: middle;
-  text-align: center;
-}
-
-.fc-unthemed .fc-list-empty {
-  /* theme will provide own background */
-  background-color: #eee;
-}
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/list/main.d.ts b/AKPlan/static/AKPlan/vendor/fullcalendar/list/main.d.ts
deleted file mode 100644
index a0497099fc45f78f71f71da2feaeaa3438051b61..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/list/main.d.ts
+++ /dev/null
@@ -1,52 +0,0 @@
-// Generated by dts-bundle v0.7.3-fork.1
-// Dependencies for this module:
-//   ../../../../../@fullcalendar/core
-
-declare module '@fullcalendar/list' {
-    import ListView from '@fullcalendar/list/ListView';
-    export { ListView };
-    const _default: import("@fullcalendar/core").PluginDef;
-    export default _default;
-}
-
-declare module '@fullcalendar/list/ListView' {
-    import {
-        ComponentContext,
-        DateMarker,
-        DateProfileGenerator,
-        DateRange,
-        EventRenderRange,
-        EventStore,
-        EventUiHash,
-        ScrollComponent,
-        Seg,
-        View,
-        ViewProps,
-        ViewSpec
-    } from '@fullcalendar/core';
-    export {ListView as default, ListView};
-
-    class ListView extends View {
-        scroller: ScrollComponent;
-        contentEl: HTMLElement;
-        dayDates: DateMarker[];
-
-        constructor(context: ComponentContext, viewSpec: ViewSpec, dateProfileGenerator: DateProfileGenerator, parentEl: HTMLElement);
-
-        render(props: ViewProps): void;
-
-        destroy(): void;
-
-        updateSize(isResize: any, viewHeight: any, isAuto: any): void;
-
-        computeScrollerHeight(viewHeight: any): number;
-        _eventStoreToSegs(eventStore: EventStore, eventUiBases: EventUiHash, dayRanges: DateRange[]): Seg[];
-        eventRangesToSegs(eventRanges: EventRenderRange[], dayRanges: DateRange[]): any[];
-        eventRangeToSegs(eventRange: EventRenderRange, dayRanges: DateRange[]): any[];
-        renderEmptyMessage(): void;
-        renderSegList(allSegs: any): void;
-        groupSegsByDay(segs: any): any[];
-        buildDayHeaderRow(dayDate: any): HTMLTableRowElement;
-    }
-}
-
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/list/main.esm.js b/AKPlan/static/AKPlan/vendor/fullcalendar/list/main.esm.js
deleted file mode 100644
index 8162c1d3f3ffbd5093931e15ac3eb823ab804ab6..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/list/main.esm.js
+++ /dev/null
@@ -1,354 +0,0 @@
-/*!
-FullCalendar List View Plugin v4.3.0
-Docs & License: https://fullcalendar.io/
-(c) 2019 Adam Shaw
-*/
-
-import {
-    addDays,
-    buildGotoAnchorHtml,
-    createElement,
-    createFormatter,
-    createPlugin,
-    FgEventRenderer,
-    getAllDayHtml,
-    htmlEscape,
-    htmlToElement,
-    intersectRanges,
-    isMultiDayRange,
-    memoize,
-    memoizeRendering,
-    ScrollComponent,
-    sliceEventStore,
-    startOfDay,
-    subtractInnerElHeight,
-    View
-} from '@fullcalendar/core';
-
-/*! *****************************************************************************
-Copyright (c) Microsoft Corporation. All rights reserved.
-Licensed under the Apache License, Version 2.0 (the "License"); you may not use
-this file except in compliance with the License. You may obtain a copy of the
-License at http://www.apache.org/licenses/LICENSE-2.0
-
-THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
-WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
-MERCHANTABLITY OR NON-INFRINGEMENT.
-
-See the Apache Version 2.0 License for specific language governing permissions
-and limitations under the License.
-***************************************************************************** */
-/* global Reflect, Promise */
-
-var extendStatics = function(d, b) {
-    extendStatics = Object.setPrototypeOf ||
-        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-    return extendStatics(d, b);
-};
-
-function __extends(d, b) {
-    extendStatics(d, b);
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-}
-
-var ListEventRenderer = /** @class */ (function (_super) {
-    __extends(ListEventRenderer, _super);
-    function ListEventRenderer(listView) {
-        var _this = _super.call(this, listView.context) || this;
-        _this.listView = listView;
-        return _this;
-    }
-    ListEventRenderer.prototype.attachSegs = function (segs) {
-        if (!segs.length) {
-            this.listView.renderEmptyMessage();
-        }
-        else {
-            this.listView.renderSegList(segs);
-        }
-    };
-    ListEventRenderer.prototype.detachSegs = function () {
-    };
-    // generates the HTML for a single event row
-    ListEventRenderer.prototype.renderSegHtml = function (seg) {
-        var _a = this.context, view = _a.view, theme = _a.theme;
-        var eventRange = seg.eventRange;
-        var eventDef = eventRange.def;
-        var eventInstance = eventRange.instance;
-        var eventUi = eventRange.ui;
-        var url = eventDef.url;
-        var classes = ['fc-list-item'].concat(eventUi.classNames);
-        var bgColor = eventUi.backgroundColor;
-        var timeHtml;
-        if (eventDef.allDay) {
-            timeHtml = getAllDayHtml(view);
-        }
-        else if (isMultiDayRange(eventRange.range)) {
-            if (seg.isStart) {
-                timeHtml = htmlEscape(this._getTimeText(eventInstance.range.start, seg.end, false // allDay
-                ));
-            }
-            else if (seg.isEnd) {
-                timeHtml = htmlEscape(this._getTimeText(seg.start, eventInstance.range.end, false // allDay
-                ));
-            }
-            else { // inner segment that lasts the whole day
-                timeHtml = getAllDayHtml(view);
-            }
-        }
-        else {
-            // Display the normal time text for the *event's* times
-            timeHtml = htmlEscape(this.getTimeText(eventRange));
-        }
-        if (url) {
-            classes.push('fc-has-url');
-        }
-        return '<tr class="' + classes.join(' ') + '">' +
-            (this.displayEventTime ?
-                '<td class="fc-list-item-time ' + theme.getClass('widgetContent') + '">' +
-                    (timeHtml || '') +
-                    '</td>' :
-                '') +
-            '<td class="fc-list-item-marker ' + theme.getClass('widgetContent') + '">' +
-            '<span class="fc-event-dot"' +
-            (bgColor ?
-                ' style="background-color:' + bgColor + '"' :
-                '') +
-            '></span>' +
-            '</td>' +
-            '<td class="fc-list-item-title ' + theme.getClass('widgetContent') + '">' +
-            '<a' + (url ? ' href="' + htmlEscape(url) + '"' : '') + '>' +
-            htmlEscape(eventDef.title || '') +
-            '</a>' +
-            '</td>' +
-            '</tr>';
-    };
-    // like "4:00am"
-    ListEventRenderer.prototype.computeEventTimeFormat = function () {
-        return {
-            hour: 'numeric',
-            minute: '2-digit',
-            meridiem: 'short'
-        };
-    };
-    return ListEventRenderer;
-}(FgEventRenderer));
-
-/*
-Responsible for the scroller, and forwarding event-related actions into the "grid".
-*/
-var ListView = /** @class */ (function (_super) {
-    __extends(ListView, _super);
-    function ListView(context, viewSpec, dateProfileGenerator, parentEl) {
-        var _this = _super.call(this, context, viewSpec, dateProfileGenerator, parentEl) || this;
-        _this.computeDateVars = memoize(computeDateVars);
-        _this.eventStoreToSegs = memoize(_this._eventStoreToSegs);
-        var eventRenderer = _this.eventRenderer = new ListEventRenderer(_this);
-        _this.renderContent = memoizeRendering(eventRenderer.renderSegs.bind(eventRenderer), eventRenderer.unrender.bind(eventRenderer));
-        _this.el.classList.add('fc-list-view');
-        var listViewClassNames = (_this.theme.getClass('listView') || '').split(' '); // wish we didn't have to do this
-        for (var _i = 0, listViewClassNames_1 = listViewClassNames; _i < listViewClassNames_1.length; _i++) {
-            var listViewClassName = listViewClassNames_1[_i];
-            if (listViewClassName) { // in case input was empty string
-                _this.el.classList.add(listViewClassName);
-            }
-        }
-        _this.scroller = new ScrollComponent('hidden', // overflow x
-        'auto' // overflow y
-        );
-        _this.el.appendChild(_this.scroller.el);
-        _this.contentEl = _this.scroller.el; // shortcut
-        context.calendar.registerInteractiveComponent(_this, {
-            el: _this.el
-            // TODO: make aware that it doesn't do Hits
-        });
-        return _this;
-    }
-    ListView.prototype.render = function (props) {
-        var _a = this.computeDateVars(props.dateProfile), dayDates = _a.dayDates, dayRanges = _a.dayRanges;
-        this.dayDates = dayDates;
-        this.renderContent(this.eventStoreToSegs(props.eventStore, props.eventUiBases, dayRanges));
-    };
-    ListView.prototype.destroy = function () {
-        _super.prototype.destroy.call(this);
-        this.renderContent.unrender();
-        this.scroller.destroy(); // will remove the Grid too
-        this.calendar.unregisterInteractiveComponent(this);
-    };
-    ListView.prototype.updateSize = function (isResize, viewHeight, isAuto) {
-        _super.prototype.updateSize.call(this, isResize, viewHeight, isAuto);
-        this.eventRenderer.computeSizes(isResize);
-        this.eventRenderer.assignSizes(isResize);
-        this.scroller.clear(); // sets height to 'auto' and clears overflow
-        if (!isAuto) {
-            this.scroller.setHeight(this.computeScrollerHeight(viewHeight));
-        }
-    };
-    ListView.prototype.computeScrollerHeight = function (viewHeight) {
-        return viewHeight -
-            subtractInnerElHeight(this.el, this.scroller.el); // everything that's NOT the scroller
-    };
-    ListView.prototype._eventStoreToSegs = function (eventStore, eventUiBases, dayRanges) {
-        return this.eventRangesToSegs(sliceEventStore(eventStore, eventUiBases, this.props.dateProfile.activeRange, this.nextDayThreshold).fg, dayRanges);
-    };
-    ListView.prototype.eventRangesToSegs = function (eventRanges, dayRanges) {
-        var segs = [];
-        for (var _i = 0, eventRanges_1 = eventRanges; _i < eventRanges_1.length; _i++) {
-            var eventRange = eventRanges_1[_i];
-            segs.push.apply(segs, this.eventRangeToSegs(eventRange, dayRanges));
-        }
-        return segs;
-    };
-    ListView.prototype.eventRangeToSegs = function (eventRange, dayRanges) {
-        var _a = this, dateEnv = _a.dateEnv, nextDayThreshold = _a.nextDayThreshold;
-        var range = eventRange.range;
-        var allDay = eventRange.def.allDay;
-        var dayIndex;
-        var segRange;
-        var seg;
-        var segs = [];
-        for (dayIndex = 0; dayIndex < dayRanges.length; dayIndex++) {
-            segRange = intersectRanges(range, dayRanges[dayIndex]);
-            if (segRange) {
-                seg = {
-                    component: this,
-                    eventRange: eventRange,
-                    start: segRange.start,
-                    end: segRange.end,
-                    isStart: eventRange.isStart && segRange.start.valueOf() === range.start.valueOf(),
-                    isEnd: eventRange.isEnd && segRange.end.valueOf() === range.end.valueOf(),
-                    dayIndex: dayIndex
-                };
-                segs.push(seg);
-                // detect when range won't go fully into the next day,
-                // and mutate the latest seg to the be the end.
-                if (!seg.isEnd && !allDay &&
-                    dayIndex + 1 < dayRanges.length &&
-                    range.end <
-                        dateEnv.add(dayRanges[dayIndex + 1].start, nextDayThreshold)) {
-                    seg.end = range.end;
-                    seg.isEnd = true;
-                    break;
-                }
-            }
-        }
-        return segs;
-    };
-    ListView.prototype.renderEmptyMessage = function () {
-        this.contentEl.innerHTML =
-            '<div class="fc-list-empty-wrap2">' + // TODO: try less wraps
-                '<div class="fc-list-empty-wrap1">' +
-                '<div class="fc-list-empty">' +
-                htmlEscape(this.opt('noEventsMessage')) +
-                '</div>' +
-                '</div>' +
-                '</div>';
-    };
-    // called by ListEventRenderer
-    ListView.prototype.renderSegList = function (allSegs) {
-        var segsByDay = this.groupSegsByDay(allSegs); // sparse array
-        var dayIndex;
-        var daySegs;
-        var i;
-        var tableEl = htmlToElement('<table class="fc-list-table ' + this.calendar.theme.getClass('tableList') + '"><tbody></tbody></table>');
-        var tbodyEl = tableEl.querySelector('tbody');
-        for (dayIndex = 0; dayIndex < segsByDay.length; dayIndex++) {
-            daySegs = segsByDay[dayIndex];
-            if (daySegs) { // sparse array, so might be undefined
-                // append a day header
-                tbodyEl.appendChild(this.buildDayHeaderRow(this.dayDates[dayIndex]));
-                daySegs = this.eventRenderer.sortEventSegs(daySegs);
-                for (i = 0; i < daySegs.length; i++) {
-                    tbodyEl.appendChild(daySegs[i].el); // append event row
-                }
-            }
-        }
-        this.contentEl.innerHTML = '';
-        this.contentEl.appendChild(tableEl);
-    };
-    // Returns a sparse array of arrays, segs grouped by their dayIndex
-    ListView.prototype.groupSegsByDay = function (segs) {
-        var segsByDay = []; // sparse array
-        var i;
-        var seg;
-        for (i = 0; i < segs.length; i++) {
-            seg = segs[i];
-            (segsByDay[seg.dayIndex] || (segsByDay[seg.dayIndex] = []))
-                .push(seg);
-        }
-        return segsByDay;
-    };
-    // generates the HTML for the day headers that live amongst the event rows
-    ListView.prototype.buildDayHeaderRow = function (dayDate) {
-        var dateEnv = this.dateEnv;
-        var mainFormat = createFormatter(this.opt('listDayFormat')); // TODO: cache
-        var altFormat = createFormatter(this.opt('listDayAltFormat')); // TODO: cache
-        return createElement('tr', {
-            className: 'fc-list-heading',
-            'data-date': dateEnv.formatIso(dayDate, { omitTime: true })
-        }, '<td class="' + (this.calendar.theme.getClass('tableListHeading') ||
-            this.calendar.theme.getClass('widgetHeader')) + '" colspan="3">' +
-            (mainFormat ?
-                buildGotoAnchorHtml(this, dayDate, { 'class': 'fc-list-heading-main' }, htmlEscape(dateEnv.format(dayDate, mainFormat)) // inner HTML
-                ) :
-                '') +
-            (altFormat ?
-                buildGotoAnchorHtml(this, dayDate, { 'class': 'fc-list-heading-alt' }, htmlEscape(dateEnv.format(dayDate, altFormat)) // inner HTML
-                ) :
-                '') +
-            '</td>');
-    };
-    return ListView;
-}(View));
-ListView.prototype.fgSegSelector = '.fc-list-item'; // which elements accept event actions
-function computeDateVars(dateProfile) {
-    var dayStart = startOfDay(dateProfile.renderRange.start);
-    var viewEnd = dateProfile.renderRange.end;
-    var dayDates = [];
-    var dayRanges = [];
-    while (dayStart < viewEnd) {
-        dayDates.push(dayStart);
-        dayRanges.push({
-            start: dayStart,
-            end: addDays(dayStart, 1)
-        });
-        dayStart = addDays(dayStart, 1);
-    }
-    return { dayDates: dayDates, dayRanges: dayRanges };
-}
-
-var main = createPlugin({
-    views: {
-        list: {
-            class: ListView,
-            buttonTextKey: 'list',
-            listDayFormat: { month: 'long', day: 'numeric', year: 'numeric' } // like "January 1, 2016"
-        },
-        listDay: {
-            type: 'list',
-            duration: { days: 1 },
-            listDayFormat: { weekday: 'long' } // day-of-week is all we need. full date is probably in header
-        },
-        listWeek: {
-            type: 'list',
-            duration: { weeks: 1 },
-            listDayFormat: { weekday: 'long' },
-            listDayAltFormat: { month: 'long', day: 'numeric', year: 'numeric' }
-        },
-        listMonth: {
-            type: 'list',
-            duration: { month: 1 },
-            listDayAltFormat: { weekday: 'long' } // day-of-week is nice-to-have
-        },
-        listYear: {
-            type: 'list',
-            duration: { year: 1 },
-            listDayAltFormat: { weekday: 'long' } // day-of-week is nice-to-have
-        }
-    }
-});
-
-export default main;
-export { ListView };
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/list/main.js b/AKPlan/static/AKPlan/vendor/fullcalendar/list/main.js
deleted file mode 100644
index b855e4e0e6a36b27e28a2e73e013b814a81d567b..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/list/main.js
+++ /dev/null
@@ -1,343 +0,0 @@
-/*!
-FullCalendar List View Plugin v4.3.0
-Docs & License: https://fullcalendar.io/
-(c) 2019 Adam Shaw
-*/
-
-(function (global, factory) {
-    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@fullcalendar/core')) :
-    typeof define === 'function' && define.amd ? define(['exports', '@fullcalendar/core'], factory) :
-    (global = global || self, factory(global.FullCalendarList = {}, global.FullCalendar));
-}(this, function (exports, core) { 'use strict';
-
-    /*! *****************************************************************************
-    Copyright (c) Microsoft Corporation. All rights reserved.
-    Licensed under the Apache License, Version 2.0 (the "License"); you may not use
-    this file except in compliance with the License. You may obtain a copy of the
-    License at http://www.apache.org/licenses/LICENSE-2.0
-
-    THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-    KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
-    WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
-    MERCHANTABLITY OR NON-INFRINGEMENT.
-
-    See the Apache Version 2.0 License for specific language governing permissions
-    and limitations under the License.
-    ***************************************************************************** */
-    /* global Reflect, Promise */
-
-    var extendStatics = function(d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-
-    function __extends(d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    }
-
-    var ListEventRenderer = /** @class */ (function (_super) {
-        __extends(ListEventRenderer, _super);
-        function ListEventRenderer(listView) {
-            var _this = _super.call(this, listView.context) || this;
-            _this.listView = listView;
-            return _this;
-        }
-        ListEventRenderer.prototype.attachSegs = function (segs) {
-            if (!segs.length) {
-                this.listView.renderEmptyMessage();
-            }
-            else {
-                this.listView.renderSegList(segs);
-            }
-        };
-        ListEventRenderer.prototype.detachSegs = function () {
-        };
-        // generates the HTML for a single event row
-        ListEventRenderer.prototype.renderSegHtml = function (seg) {
-            var _a = this.context, view = _a.view, theme = _a.theme;
-            var eventRange = seg.eventRange;
-            var eventDef = eventRange.def;
-            var eventInstance = eventRange.instance;
-            var eventUi = eventRange.ui;
-            var url = eventDef.url;
-            var classes = ['fc-list-item'].concat(eventUi.classNames);
-            var bgColor = eventUi.backgroundColor;
-            var timeHtml;
-            if (eventDef.allDay) {
-                timeHtml = core.getAllDayHtml(view);
-            }
-            else if (core.isMultiDayRange(eventRange.range)) {
-                if (seg.isStart) {
-                    timeHtml = core.htmlEscape(this._getTimeText(eventInstance.range.start, seg.end, false // allDay
-                    ));
-                }
-                else if (seg.isEnd) {
-                    timeHtml = core.htmlEscape(this._getTimeText(seg.start, eventInstance.range.end, false // allDay
-                    ));
-                }
-                else { // inner segment that lasts the whole day
-                    timeHtml = core.getAllDayHtml(view);
-                }
-            }
-            else {
-                // Display the normal time text for the *event's* times
-                timeHtml = core.htmlEscape(this.getTimeText(eventRange));
-            }
-            if (url) {
-                classes.push('fc-has-url');
-            }
-            return '<tr class="' + classes.join(' ') + '">' +
-                (this.displayEventTime ?
-                    '<td class="fc-list-item-time ' + theme.getClass('widgetContent') + '">' +
-                        (timeHtml || '') +
-                        '</td>' :
-                    '') +
-                '<td class="fc-list-item-marker ' + theme.getClass('widgetContent') + '">' +
-                '<span class="fc-event-dot"' +
-                (bgColor ?
-                    ' style="background-color:' + bgColor + '"' :
-                    '') +
-                '></span>' +
-                '</td>' +
-                '<td class="fc-list-item-title ' + theme.getClass('widgetContent') + '">' +
-                '<a' + (url ? ' href="' + core.htmlEscape(url) + '"' : '') + '>' +
-                core.htmlEscape(eventDef.title || '') +
-                '</a>' +
-                '</td>' +
-                '</tr>';
-        };
-        // like "4:00am"
-        ListEventRenderer.prototype.computeEventTimeFormat = function () {
-            return {
-                hour: 'numeric',
-                minute: '2-digit',
-                meridiem: 'short'
-            };
-        };
-        return ListEventRenderer;
-    }(core.FgEventRenderer));
-
-    /*
-    Responsible for the scroller, and forwarding event-related actions into the "grid".
-    */
-    var ListView = /** @class */ (function (_super) {
-        __extends(ListView, _super);
-        function ListView(context, viewSpec, dateProfileGenerator, parentEl) {
-            var _this = _super.call(this, context, viewSpec, dateProfileGenerator, parentEl) || this;
-            _this.computeDateVars = core.memoize(computeDateVars);
-            _this.eventStoreToSegs = core.memoize(_this._eventStoreToSegs);
-            var eventRenderer = _this.eventRenderer = new ListEventRenderer(_this);
-            _this.renderContent = core.memoizeRendering(eventRenderer.renderSegs.bind(eventRenderer), eventRenderer.unrender.bind(eventRenderer));
-            _this.el.classList.add('fc-list-view');
-            var listViewClassNames = (_this.theme.getClass('listView') || '').split(' '); // wish we didn't have to do this
-            for (var _i = 0, listViewClassNames_1 = listViewClassNames; _i < listViewClassNames_1.length; _i++) {
-                var listViewClassName = listViewClassNames_1[_i];
-                if (listViewClassName) { // in case input was empty string
-                    _this.el.classList.add(listViewClassName);
-                }
-            }
-            _this.scroller = new core.ScrollComponent('hidden', // overflow x
-            'auto' // overflow y
-            );
-            _this.el.appendChild(_this.scroller.el);
-            _this.contentEl = _this.scroller.el; // shortcut
-            context.calendar.registerInteractiveComponent(_this, {
-                el: _this.el
-                // TODO: make aware that it doesn't do Hits
-            });
-            return _this;
-        }
-        ListView.prototype.render = function (props) {
-            var _a = this.computeDateVars(props.dateProfile), dayDates = _a.dayDates, dayRanges = _a.dayRanges;
-            this.dayDates = dayDates;
-            this.renderContent(this.eventStoreToSegs(props.eventStore, props.eventUiBases, dayRanges));
-        };
-        ListView.prototype.destroy = function () {
-            _super.prototype.destroy.call(this);
-            this.renderContent.unrender();
-            this.scroller.destroy(); // will remove the Grid too
-            this.calendar.unregisterInteractiveComponent(this);
-        };
-        ListView.prototype.updateSize = function (isResize, viewHeight, isAuto) {
-            _super.prototype.updateSize.call(this, isResize, viewHeight, isAuto);
-            this.eventRenderer.computeSizes(isResize);
-            this.eventRenderer.assignSizes(isResize);
-            this.scroller.clear(); // sets height to 'auto' and clears overflow
-            if (!isAuto) {
-                this.scroller.setHeight(this.computeScrollerHeight(viewHeight));
-            }
-        };
-        ListView.prototype.computeScrollerHeight = function (viewHeight) {
-            return viewHeight -
-                core.subtractInnerElHeight(this.el, this.scroller.el); // everything that's NOT the scroller
-        };
-        ListView.prototype._eventStoreToSegs = function (eventStore, eventUiBases, dayRanges) {
-            return this.eventRangesToSegs(core.sliceEventStore(eventStore, eventUiBases, this.props.dateProfile.activeRange, this.nextDayThreshold).fg, dayRanges);
-        };
-        ListView.prototype.eventRangesToSegs = function (eventRanges, dayRanges) {
-            var segs = [];
-            for (var _i = 0, eventRanges_1 = eventRanges; _i < eventRanges_1.length; _i++) {
-                var eventRange = eventRanges_1[_i];
-                segs.push.apply(segs, this.eventRangeToSegs(eventRange, dayRanges));
-            }
-            return segs;
-        };
-        ListView.prototype.eventRangeToSegs = function (eventRange, dayRanges) {
-            var _a = this, dateEnv = _a.dateEnv, nextDayThreshold = _a.nextDayThreshold;
-            var range = eventRange.range;
-            var allDay = eventRange.def.allDay;
-            var dayIndex;
-            var segRange;
-            var seg;
-            var segs = [];
-            for (dayIndex = 0; dayIndex < dayRanges.length; dayIndex++) {
-                segRange = core.intersectRanges(range, dayRanges[dayIndex]);
-                if (segRange) {
-                    seg = {
-                        component: this,
-                        eventRange: eventRange,
-                        start: segRange.start,
-                        end: segRange.end,
-                        isStart: eventRange.isStart && segRange.start.valueOf() === range.start.valueOf(),
-                        isEnd: eventRange.isEnd && segRange.end.valueOf() === range.end.valueOf(),
-                        dayIndex: dayIndex
-                    };
-                    segs.push(seg);
-                    // detect when range won't go fully into the next day,
-                    // and mutate the latest seg to the be the end.
-                    if (!seg.isEnd && !allDay &&
-                        dayIndex + 1 < dayRanges.length &&
-                        range.end <
-                            dateEnv.add(dayRanges[dayIndex + 1].start, nextDayThreshold)) {
-                        seg.end = range.end;
-                        seg.isEnd = true;
-                        break;
-                    }
-                }
-            }
-            return segs;
-        };
-        ListView.prototype.renderEmptyMessage = function () {
-            this.contentEl.innerHTML =
-                '<div class="fc-list-empty-wrap2">' + // TODO: try less wraps
-                    '<div class="fc-list-empty-wrap1">' +
-                    '<div class="fc-list-empty">' +
-                    core.htmlEscape(this.opt('noEventsMessage')) +
-                    '</div>' +
-                    '</div>' +
-                    '</div>';
-        };
-        // called by ListEventRenderer
-        ListView.prototype.renderSegList = function (allSegs) {
-            var segsByDay = this.groupSegsByDay(allSegs); // sparse array
-            var dayIndex;
-            var daySegs;
-            var i;
-            var tableEl = core.htmlToElement('<table class="fc-list-table ' + this.calendar.theme.getClass('tableList') + '"><tbody></tbody></table>');
-            var tbodyEl = tableEl.querySelector('tbody');
-            for (dayIndex = 0; dayIndex < segsByDay.length; dayIndex++) {
-                daySegs = segsByDay[dayIndex];
-                if (daySegs) { // sparse array, so might be undefined
-                    // append a day header
-                    tbodyEl.appendChild(this.buildDayHeaderRow(this.dayDates[dayIndex]));
-                    daySegs = this.eventRenderer.sortEventSegs(daySegs);
-                    for (i = 0; i < daySegs.length; i++) {
-                        tbodyEl.appendChild(daySegs[i].el); // append event row
-                    }
-                }
-            }
-            this.contentEl.innerHTML = '';
-            this.contentEl.appendChild(tableEl);
-        };
-        // Returns a sparse array of arrays, segs grouped by their dayIndex
-        ListView.prototype.groupSegsByDay = function (segs) {
-            var segsByDay = []; // sparse array
-            var i;
-            var seg;
-            for (i = 0; i < segs.length; i++) {
-                seg = segs[i];
-                (segsByDay[seg.dayIndex] || (segsByDay[seg.dayIndex] = []))
-                    .push(seg);
-            }
-            return segsByDay;
-        };
-        // generates the HTML for the day headers that live amongst the event rows
-        ListView.prototype.buildDayHeaderRow = function (dayDate) {
-            var dateEnv = this.dateEnv;
-            var mainFormat = core.createFormatter(this.opt('listDayFormat')); // TODO: cache
-            var altFormat = core.createFormatter(this.opt('listDayAltFormat')); // TODO: cache
-            return core.createElement('tr', {
-                className: 'fc-list-heading',
-                'data-date': dateEnv.formatIso(dayDate, { omitTime: true })
-            }, '<td class="' + (this.calendar.theme.getClass('tableListHeading') ||
-                this.calendar.theme.getClass('widgetHeader')) + '" colspan="3">' +
-                (mainFormat ?
-                    core.buildGotoAnchorHtml(this, dayDate, { 'class': 'fc-list-heading-main' }, core.htmlEscape(dateEnv.format(dayDate, mainFormat)) // inner HTML
-                    ) :
-                    '') +
-                (altFormat ?
-                    core.buildGotoAnchorHtml(this, dayDate, { 'class': 'fc-list-heading-alt' }, core.htmlEscape(dateEnv.format(dayDate, altFormat)) // inner HTML
-                    ) :
-                    '') +
-                '</td>');
-        };
-        return ListView;
-    }(core.View));
-    ListView.prototype.fgSegSelector = '.fc-list-item'; // which elements accept event actions
-    function computeDateVars(dateProfile) {
-        var dayStart = core.startOfDay(dateProfile.renderRange.start);
-        var viewEnd = dateProfile.renderRange.end;
-        var dayDates = [];
-        var dayRanges = [];
-        while (dayStart < viewEnd) {
-            dayDates.push(dayStart);
-            dayRanges.push({
-                start: dayStart,
-                end: core.addDays(dayStart, 1)
-            });
-            dayStart = core.addDays(dayStart, 1);
-        }
-        return { dayDates: dayDates, dayRanges: dayRanges };
-    }
-
-    var main = core.createPlugin({
-        views: {
-            list: {
-                class: ListView,
-                buttonTextKey: 'list',
-                listDayFormat: { month: 'long', day: 'numeric', year: 'numeric' } // like "January 1, 2016"
-            },
-            listDay: {
-                type: 'list',
-                duration: { days: 1 },
-                listDayFormat: { weekday: 'long' } // day-of-week is all we need. full date is probably in header
-            },
-            listWeek: {
-                type: 'list',
-                duration: { weeks: 1 },
-                listDayFormat: { weekday: 'long' },
-                listDayAltFormat: { month: 'long', day: 'numeric', year: 'numeric' }
-            },
-            listMonth: {
-                type: 'list',
-                duration: { month: 1 },
-                listDayAltFormat: { weekday: 'long' } // day-of-week is nice-to-have
-            },
-            listYear: {
-                type: 'list',
-                duration: { year: 1 },
-                listDayAltFormat: { weekday: 'long' } // day-of-week is nice-to-have
-            }
-        }
-    });
-
-    exports.ListView = ListView;
-    exports.default = main;
-
-    Object.defineProperty(exports, '__esModule', { value: true });
-
-}));
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/list/main.min.css b/AKPlan/static/AKPlan/vendor/fullcalendar/list/main.min.css
deleted file mode 100644
index 18446f442da015ae8fdc3c91c8f10685cf3353f2..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/list/main.min.css
+++ /dev/null
@@ -1 +0,0 @@
-.fc-event-dot{display:inline-block;width:10px;height:10px;border-radius:5px}.fc-rtl .fc-list-view{direction:rtl}.fc-list-view{border-width:1px;border-style:solid}.fc .fc-list-table{table-layout:auto}.fc-list-table td{border-width:1px 0 0;padding:8px 14px}.fc-list-table tr:first-child td{border-top-width:0}.fc-list-heading{border-bottom-width:1px}.fc-list-heading td{font-weight:700}.fc-ltr .fc-list-heading-main{float:left}.fc-ltr .fc-list-heading-alt,.fc-rtl .fc-list-heading-main{float:right}.fc-rtl .fc-list-heading-alt{float:left}.fc-list-item.fc-has-url{cursor:pointer}.fc-list-item-marker,.fc-list-item-time{white-space:nowrap;width:1px}.fc-ltr .fc-list-item-marker{padding-right:0}.fc-rtl .fc-list-item-marker{padding-left:0}.fc-list-item-title a{text-decoration:none;color:inherit}.fc-list-item-title a[href]:hover{text-decoration:underline}.fc-list-empty-wrap2{position:absolute;top:0;left:0;right:0;bottom:0}.fc-list-empty-wrap1{width:100%;height:100%;display:table}.fc-list-empty{display:table-cell;vertical-align:middle;text-align:center}.fc-unthemed .fc-list-empty{background-color:#eee}
\ No newline at end of file
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/list/main.min.js b/AKPlan/static/AKPlan/vendor/fullcalendar/list/main.min.js
deleted file mode 100644
index f954aac89a8a85462e31747bd7943b94311183c7..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/list/main.min.js
+++ /dev/null
@@ -1,6 +0,0 @@
-/*!
-FullCalendar List View Plugin v4.3.0
-Docs & License: https://fullcalendar.io/
-(c) 2019 Adam Shaw
-*/
-!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("@fullcalendar/core")):"function"==typeof define&&define.amd?define(["exports","@fullcalendar/core"],t):t((e=e||self).FullCalendarList={},e.FullCalendar)}(this,function(e,t){"use strict";var n=function(e,t){return(n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])})(e,t)};function r(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}var s=function(e){function n(t){var n=e.call(this,t.context)||this;return n.listView=t,n}return r(n,e),n.prototype.attachSegs=function(e){e.length?this.listView.renderSegList(e):this.listView.renderEmptyMessage()},n.prototype.detachSegs=function(){},n.prototype.renderSegHtml=function(e){var n,r=this.context,s=r.view,a=r.theme,i=e.eventRange,o=i.def,l=i.instance,d=i.ui,c=o.url,p=["fc-list-item"].concat(d.classNames),h=d.backgroundColor;return n=o.allDay?t.getAllDayHtml(s):t.isMultiDayRange(i.range)?e.isStart?t.htmlEscape(this._getTimeText(l.range.start,e.end,!1)):e.isEnd?t.htmlEscape(this._getTimeText(e.start,l.range.end,!1)):t.getAllDayHtml(s):t.htmlEscape(this.getTimeText(i)),c&&p.push("fc-has-url"),'<tr class="'+p.join(" ")+'">'+(this.displayEventTime?'<td class="fc-list-item-time '+a.getClass("widgetContent")+'">'+(n||"")+"</td>":"")+'<td class="fc-list-item-marker '+a.getClass("widgetContent")+'"><span class="fc-event-dot"'+(h?' style="background-color:'+h+'"':"")+'></span></td><td class="fc-list-item-title '+a.getClass("widgetContent")+'"><a'+(c?' href="'+t.htmlEscape(c)+'"':"")+">"+t.htmlEscape(o.title||"")+"</a></td></tr>"},n.prototype.computeEventTimeFormat=function(){return{hour:"numeric",minute:"2-digit",meridiem:"short"}},n}(t.FgEventRenderer),a=function(e){function n(n,r,a,o){var l=e.call(this,n,r,a,o)||this;l.computeDateVars=t.memoize(i),l.eventStoreToSegs=t.memoize(l._eventStoreToSegs);var d=l.eventRenderer=new s(l);l.renderContent=t.memoizeRendering(d.renderSegs.bind(d),d.unrender.bind(d)),l.el.classList.add("fc-list-view");for(var c=0,p=(l.theme.getClass("listView")||"").split(" ");c<p.length;c++){var h=p[c];h&&l.el.classList.add(h)}return l.scroller=new t.ScrollComponent("hidden","auto"),l.el.appendChild(l.scroller.el),l.contentEl=l.scroller.el,n.calendar.registerInteractiveComponent(l,{el:l.el}),l}return r(n,e),n.prototype.render=function(e){var t=this.computeDateVars(e.dateProfile),n=t.dayDates,r=t.dayRanges;this.dayDates=n,this.renderContent(this.eventStoreToSegs(e.eventStore,e.eventUiBases,r))},n.prototype.destroy=function(){e.prototype.destroy.call(this),this.renderContent.unrender(),this.scroller.destroy(),this.calendar.unregisterInteractiveComponent(this)},n.prototype.updateSize=function(t,n,r){e.prototype.updateSize.call(this,t,n,r),this.eventRenderer.computeSizes(t),this.eventRenderer.assignSizes(t),this.scroller.clear(),r||this.scroller.setHeight(this.computeScrollerHeight(n))},n.prototype.computeScrollerHeight=function(e){return e-t.subtractInnerElHeight(this.el,this.scroller.el)},n.prototype._eventStoreToSegs=function(e,n,r){return this.eventRangesToSegs(t.sliceEventStore(e,n,this.props.dateProfile.activeRange,this.nextDayThreshold).fg,r)},n.prototype.eventRangesToSegs=function(e,t){for(var n=[],r=0,s=e;r<s.length;r++){var a=s[r];n.push.apply(n,this.eventRangeToSegs(a,t))}return n},n.prototype.eventRangeToSegs=function(e,n){var r,s,a,i=this.dateEnv,o=this.nextDayThreshold,l=e.range,d=e.def.allDay,c=[];for(r=0;r<n.length;r++)if((s=t.intersectRanges(l,n[r]))&&(a={component:this,eventRange:e,start:s.start,end:s.end,isStart:e.isStart&&s.start.valueOf()===l.start.valueOf(),isEnd:e.isEnd&&s.end.valueOf()===l.end.valueOf(),dayIndex:r},c.push(a),!a.isEnd&&!d&&r+1<n.length&&l.end<i.add(n[r+1].start,o))){a.end=l.end,a.isEnd=!0;break}return c},n.prototype.renderEmptyMessage=function(){this.contentEl.innerHTML='<div class="fc-list-empty-wrap2"><div class="fc-list-empty-wrap1"><div class="fc-list-empty">'+t.htmlEscape(this.opt("noEventsMessage"))+"</div></div></div>"},n.prototype.renderSegList=function(e){var n,r,s,a=this.groupSegsByDay(e),i=t.htmlToElement('<table class="fc-list-table '+this.calendar.theme.getClass("tableList")+'"><tbody></tbody></table>'),o=i.querySelector("tbody");for(n=0;n<a.length;n++)if(r=a[n])for(o.appendChild(this.buildDayHeaderRow(this.dayDates[n])),r=this.eventRenderer.sortEventSegs(r),s=0;s<r.length;s++)o.appendChild(r[s].el);this.contentEl.innerHTML="",this.contentEl.appendChild(i)},n.prototype.groupSegsByDay=function(e){var t,n,r=[];for(t=0;t<e.length;t++)(r[(n=e[t]).dayIndex]||(r[n.dayIndex]=[])).push(n);return r},n.prototype.buildDayHeaderRow=function(e){var n=this.dateEnv,r=t.createFormatter(this.opt("listDayFormat")),s=t.createFormatter(this.opt("listDayAltFormat"));return t.createElement("tr",{className:"fc-list-heading","data-date":n.formatIso(e,{omitTime:!0})},'<td class="'+(this.calendar.theme.getClass("tableListHeading")||this.calendar.theme.getClass("widgetHeader"))+'" colspan="3">'+(r?t.buildGotoAnchorHtml(this,e,{class:"fc-list-heading-main"},t.htmlEscape(n.format(e,r))):"")+(s?t.buildGotoAnchorHtml(this,e,{class:"fc-list-heading-alt"},t.htmlEscape(n.format(e,s))):"")+"</td>")},n}(t.View);function i(e){for(var n=t.startOfDay(e.renderRange.start),r=e.renderRange.end,s=[],a=[];n<r;)s.push(n),a.push({start:n,end:t.addDays(n,1)}),n=t.addDays(n,1);return{dayDates:s,dayRanges:a}}a.prototype.fgSegSelector=".fc-list-item";var o=t.createPlugin({views:{list:{class:a,buttonTextKey:"list",listDayFormat:{month:"long",day:"numeric",year:"numeric"}},listDay:{type:"list",duration:{days:1},listDayFormat:{weekday:"long"}},listWeek:{type:"list",duration:{weeks:1},listDayFormat:{weekday:"long"},listDayAltFormat:{month:"long",day:"numeric",year:"numeric"}},listMonth:{type:"list",duration:{month:1},listDayAltFormat:{weekday:"long"}},listYear:{type:"list",duration:{year:1},listDayAltFormat:{weekday:"long"}}}});e.ListView=a,e.default=o,Object.defineProperty(e,"__esModule",{value:!0})});
\ No newline at end of file
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/list/package.json b/AKPlan/static/AKPlan/vendor/fullcalendar/list/package.json
deleted file mode 100644
index 83cc13e4039680aba1f2a96f8f27b1abd30831ab..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/list/package.json
+++ /dev/null
@@ -1,33 +0,0 @@
-{
-  "name": "@fullcalendar/list",
-  "version": "4.3.0",
-  "title": "FullCalendar List View Plugin",
-  "description": "View your events as a bulleted list",
-  "keywords": [
-    "calendar",
-    "event",
-    "full-sized"
-  ],
-  "homepage": "https://fullcalendar.io/",
-  "docs": "https://fullcalendar.io/docs/list-view",
-  "bugs": "https://fullcalendar.io/reporting-bugs",
-  "repository": {
-    "type": "git",
-    "url": "https://github.com/fullcalendar/fullcalendar.git",
-    "homepage": "https://github.com/fullcalendar/fullcalendar"
-  },
-  "license": "MIT",
-  "author": {
-    "name": "Adam Shaw",
-    "email": "arshaw@arshaw.com",
-    "url": "http://arshaw.com/"
-  },
-  "copyright": "2019 Adam Shaw",
-  "peerDependencies": {
-    "@fullcalendar/core": "~4.3.0"
-  },
-  "main": "main.js",
-  "module": "main.esm.js",
-  "unpkg": "main.min.js",
-  "types": "main.d.ts"
-}
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/luxon/LICENSE.txt b/AKPlan/static/AKPlan/vendor/fullcalendar/luxon/LICENSE.txt
deleted file mode 100644
index 2149cfbeff4f2e3649bc950982aa72b894f7e521..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/luxon/LICENSE.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-Copyright (c) 2019 Adam Shaw
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/luxon/README.md b/AKPlan/static/AKPlan/vendor/fullcalendar/luxon/README.md
deleted file mode 100644
index 4c42b505ec1c8a0c9569cef26e153e116665d479..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/luxon/README.md
+++ /dev/null
@@ -1,8 +0,0 @@
-
-# FullCalendar Luxon Plugin
-
-A connector to the Luxon date library
-
-[View the docs &raquo;](https://fullcalendar.io/docs/luxon-plugin)
-
-This package was created from the [FullCalendar monorepo &raquo;](https://github.com/fullcalendar/fullcalendar)
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/luxon/main.d.ts b/AKPlan/static/AKPlan/vendor/fullcalendar/luxon/main.d.ts
deleted file mode 100644
index 582279eb027484fb9e07ffbc1d879bdc688c96f3..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/luxon/main.d.ts
+++ /dev/null
@@ -1,17 +0,0 @@
-// Generated by dts-bundle v0.7.3-fork.1
-// Dependencies for this module:
-//   ../../../../../luxon
-//   ../../../../../@fullcalendar/core
-
-declare module '@fullcalendar/luxon' {
-    import {DateTime as LuxonDateTime, Duration as LuxonDuration} from 'luxon';
-    import {Calendar, Duration} from '@fullcalendar/core';
-
-    export function toDateTime(date: Date, calendar: Calendar): LuxonDateTime;
-
-    export function toDuration(duration: Duration, calendar: Calendar): LuxonDuration;
-
-    const _default: import("@fullcalendar/core").PluginDef;
-    export default _default;
-}
-
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/luxon/main.esm.js b/AKPlan/static/AKPlan/vendor/fullcalendar/luxon/main.esm.js
deleted file mode 100644
index b343faad753e8d78bde8323470975e4b6b713ba5..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/luxon/main.esm.js
+++ /dev/null
@@ -1,162 +0,0 @@
-/*!
-FullCalendar Luxon Plugin v4.3.0
-Docs & License: https://fullcalendar.io/
-(c) 2019 Adam Shaw
-*/
-
-import {DateTime, Duration} from 'luxon';
-import {Calendar, createPlugin, NamedTimeZoneImpl} from '@fullcalendar/core';
-
-/*! *****************************************************************************
-Copyright (c) Microsoft Corporation. All rights reserved.
-Licensed under the Apache License, Version 2.0 (the "License"); you may not use
-this file except in compliance with the License. You may obtain a copy of the
-License at http://www.apache.org/licenses/LICENSE-2.0
-
-THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
-WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
-MERCHANTABLITY OR NON-INFRINGEMENT.
-
-See the Apache Version 2.0 License for specific language governing permissions
-and limitations under the License.
-***************************************************************************** */
-/* global Reflect, Promise */
-
-var extendStatics = function(d, b) {
-    extendStatics = Object.setPrototypeOf ||
-        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-    return extendStatics(d, b);
-};
-
-function __extends(d, b) {
-    extendStatics(d, b);
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-}
-
-var __assign = function() {
-    __assign = Object.assign || function __assign(t) {
-        for (var s, i = 1, n = arguments.length; i < n; i++) {
-            s = arguments[i];
-            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
-        }
-        return t;
-    };
-    return __assign.apply(this, arguments);
-};
-
-function toDateTime(date, calendar) {
-    if (!(calendar instanceof Calendar)) {
-        throw new Error('must supply a Calendar instance');
-    }
-    return DateTime.fromJSDate(date, {
-        zone: calendar.dateEnv.timeZone,
-        locale: calendar.dateEnv.locale.codes[0]
-    });
-}
-function toDuration(duration, calendar) {
-    if (!(calendar instanceof Calendar)) {
-        throw new Error('must supply a Calendar instance');
-    }
-    return Duration.fromObject(__assign({}, duration, { locale: calendar.dateEnv.locale.codes[0] }));
-}
-var LuxonNamedTimeZone = /** @class */ (function (_super) {
-    __extends(LuxonNamedTimeZone, _super);
-    function LuxonNamedTimeZone() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    LuxonNamedTimeZone.prototype.offsetForArray = function (a) {
-        return arrayToLuxon(a, this.timeZoneName).offset;
-    };
-    LuxonNamedTimeZone.prototype.timestampToArray = function (ms) {
-        return luxonToArray(DateTime.fromMillis(ms, {
-            zone: this.timeZoneName
-        }));
-    };
-    return LuxonNamedTimeZone;
-}(NamedTimeZoneImpl));
-function formatWithCmdStr(cmdStr, arg) {
-    var cmd = parseCmdStr(cmdStr);
-    if (arg.end) {
-        var start = arrayToLuxon(arg.start.array, arg.timeZone, arg.localeCodes[0]);
-        var end = arrayToLuxon(arg.end.array, arg.timeZone, arg.localeCodes[0]);
-        return formatRange(cmd, start.toFormat.bind(start), end.toFormat.bind(end), arg.separator);
-    }
-    return arrayToLuxon(arg.date.array, arg.timeZone, arg.localeCodes[0]).toFormat(cmd.whole);
-}
-var main = createPlugin({
-    cmdFormatter: formatWithCmdStr,
-    namedTimeZonedImpl: LuxonNamedTimeZone
-});
-function luxonToArray(datetime) {
-    return [
-        datetime.year,
-        datetime.month - 1,
-        datetime.day,
-        datetime.hour,
-        datetime.minute,
-        datetime.second,
-        datetime.millisecond
-    ];
-}
-function arrayToLuxon(arr, timeZone, locale) {
-    return DateTime.fromObject({
-        zone: timeZone,
-        locale: locale,
-        year: arr[0],
-        month: arr[1] + 1,
-        day: arr[2],
-        hour: arr[3],
-        minute: arr[4],
-        second: arr[5],
-        millisecond: arr[6]
-    });
-}
-function parseCmdStr(cmdStr) {
-    var parts = cmdStr.match(/^(.*?)\{(.*)\}(.*)$/); // TODO: lookbehinds for escape characters
-    if (parts) {
-        var middle = parseCmdStr(parts[2]);
-        return {
-            head: parts[1],
-            middle: middle,
-            tail: parts[3],
-            whole: parts[1] + middle.whole + parts[3]
-        };
-    }
-    else {
-        return {
-            head: null,
-            middle: null,
-            tail: null,
-            whole: cmdStr
-        };
-    }
-}
-function formatRange(cmd, formatStart, formatEnd, separator) {
-    if (cmd.middle) {
-        var startHead = formatStart(cmd.head);
-        var startMiddle = formatRange(cmd.middle, formatStart, formatEnd, separator);
-        var startTail = formatStart(cmd.tail);
-        var endHead = formatEnd(cmd.head);
-        var endMiddle = formatRange(cmd.middle, formatStart, formatEnd, separator);
-        var endTail = formatEnd(cmd.tail);
-        if (startHead === endHead && startTail === endTail) {
-            return startHead +
-                (startMiddle === endMiddle ? startMiddle : startMiddle + separator + endMiddle) +
-                startTail;
-        }
-    }
-    var startWhole = formatStart(cmd.whole);
-    var endWhole = formatEnd(cmd.whole);
-    if (startWhole === endWhole) {
-        return startWhole;
-    }
-    else {
-        return startWhole + separator + endWhole;
-    }
-}
-
-export default main;
-export { toDateTime, toDuration };
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/luxon/main.js b/AKPlan/static/AKPlan/vendor/fullcalendar/luxon/main.js
deleted file mode 100644
index 000c77211e35b2b4c602c12f53ce47344f49b0bc..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/luxon/main.js
+++ /dev/null
@@ -1,170 +0,0 @@
-/*!
-FullCalendar Luxon Plugin v4.3.0
-Docs & License: https://fullcalendar.io/
-(c) 2019 Adam Shaw
-*/
-
-(function (global, factory) {
-    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('luxon'), require('@fullcalendar/core')) :
-    typeof define === 'function' && define.amd ? define(['exports', 'luxon', '@fullcalendar/core'], factory) :
-    (global = global || self, factory(global.FullCalendarLuxon = {}, global.luxon, global.FullCalendar));
-}(this, function (exports, luxon, core) { 'use strict';
-
-    /*! *****************************************************************************
-    Copyright (c) Microsoft Corporation. All rights reserved.
-    Licensed under the Apache License, Version 2.0 (the "License"); you may not use
-    this file except in compliance with the License. You may obtain a copy of the
-    License at http://www.apache.org/licenses/LICENSE-2.0
-
-    THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-    KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
-    WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
-    MERCHANTABLITY OR NON-INFRINGEMENT.
-
-    See the Apache Version 2.0 License for specific language governing permissions
-    and limitations under the License.
-    ***************************************************************************** */
-    /* global Reflect, Promise */
-
-    var extendStatics = function(d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-
-    function __extends(d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    }
-
-    var __assign = function() {
-        __assign = Object.assign || function __assign(t) {
-            for (var s, i = 1, n = arguments.length; i < n; i++) {
-                s = arguments[i];
-                for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
-            }
-            return t;
-        };
-        return __assign.apply(this, arguments);
-    };
-
-    function toDateTime(date, calendar) {
-        if (!(calendar instanceof core.Calendar)) {
-            throw new Error('must supply a Calendar instance');
-        }
-        return luxon.DateTime.fromJSDate(date, {
-            zone: calendar.dateEnv.timeZone,
-            locale: calendar.dateEnv.locale.codes[0]
-        });
-    }
-    function toDuration(duration, calendar) {
-        if (!(calendar instanceof core.Calendar)) {
-            throw new Error('must supply a Calendar instance');
-        }
-        return luxon.Duration.fromObject(__assign({}, duration, { locale: calendar.dateEnv.locale.codes[0] }));
-    }
-    var LuxonNamedTimeZone = /** @class */ (function (_super) {
-        __extends(LuxonNamedTimeZone, _super);
-        function LuxonNamedTimeZone() {
-            return _super !== null && _super.apply(this, arguments) || this;
-        }
-        LuxonNamedTimeZone.prototype.offsetForArray = function (a) {
-            return arrayToLuxon(a, this.timeZoneName).offset;
-        };
-        LuxonNamedTimeZone.prototype.timestampToArray = function (ms) {
-            return luxonToArray(luxon.DateTime.fromMillis(ms, {
-                zone: this.timeZoneName
-            }));
-        };
-        return LuxonNamedTimeZone;
-    }(core.NamedTimeZoneImpl));
-    function formatWithCmdStr(cmdStr, arg) {
-        var cmd = parseCmdStr(cmdStr);
-        if (arg.end) {
-            var start = arrayToLuxon(arg.start.array, arg.timeZone, arg.localeCodes[0]);
-            var end = arrayToLuxon(arg.end.array, arg.timeZone, arg.localeCodes[0]);
-            return formatRange(cmd, start.toFormat.bind(start), end.toFormat.bind(end), arg.separator);
-        }
-        return arrayToLuxon(arg.date.array, arg.timeZone, arg.localeCodes[0]).toFormat(cmd.whole);
-    }
-    var main = core.createPlugin({
-        cmdFormatter: formatWithCmdStr,
-        namedTimeZonedImpl: LuxonNamedTimeZone
-    });
-    function luxonToArray(datetime) {
-        return [
-            datetime.year,
-            datetime.month - 1,
-            datetime.day,
-            datetime.hour,
-            datetime.minute,
-            datetime.second,
-            datetime.millisecond
-        ];
-    }
-    function arrayToLuxon(arr, timeZone, locale) {
-        return luxon.DateTime.fromObject({
-            zone: timeZone,
-            locale: locale,
-            year: arr[0],
-            month: arr[1] + 1,
-            day: arr[2],
-            hour: arr[3],
-            minute: arr[4],
-            second: arr[5],
-            millisecond: arr[6]
-        });
-    }
-    function parseCmdStr(cmdStr) {
-        var parts = cmdStr.match(/^(.*?)\{(.*)\}(.*)$/); // TODO: lookbehinds for escape characters
-        if (parts) {
-            var middle = parseCmdStr(parts[2]);
-            return {
-                head: parts[1],
-                middle: middle,
-                tail: parts[3],
-                whole: parts[1] + middle.whole + parts[3]
-            };
-        }
-        else {
-            return {
-                head: null,
-                middle: null,
-                tail: null,
-                whole: cmdStr
-            };
-        }
-    }
-    function formatRange(cmd, formatStart, formatEnd, separator) {
-        if (cmd.middle) {
-            var startHead = formatStart(cmd.head);
-            var startMiddle = formatRange(cmd.middle, formatStart, formatEnd, separator);
-            var startTail = formatStart(cmd.tail);
-            var endHead = formatEnd(cmd.head);
-            var endMiddle = formatRange(cmd.middle, formatStart, formatEnd, separator);
-            var endTail = formatEnd(cmd.tail);
-            if (startHead === endHead && startTail === endTail) {
-                return startHead +
-                    (startMiddle === endMiddle ? startMiddle : startMiddle + separator + endMiddle) +
-                    startTail;
-            }
-        }
-        var startWhole = formatStart(cmd.whole);
-        var endWhole = formatEnd(cmd.whole);
-        if (startWhole === endWhole) {
-            return startWhole;
-        }
-        else {
-            return startWhole + separator + endWhole;
-        }
-    }
-
-    exports.default = main;
-    exports.toDateTime = toDateTime;
-    exports.toDuration = toDuration;
-
-    Object.defineProperty(exports, '__esModule', { value: true });
-
-}));
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/luxon/main.min.js b/AKPlan/static/AKPlan/vendor/fullcalendar/luxon/main.min.js
deleted file mode 100644
index bc8b9f7c184b6a1ecf58e7c5579bb391623ba00d..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/luxon/main.min.js
+++ /dev/null
@@ -1,6 +0,0 @@
-/*!
-FullCalendar Luxon Plugin v4.3.0
-Docs & License: https://fullcalendar.io/
-(c) 2019 Adam Shaw
-*/
-!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("luxon"),require("@fullcalendar/core")):"function"==typeof define&&define.amd?define(["exports","luxon","@fullcalendar/core"],t):t((e=e||self).FullCalendarLuxon={},e.luxon,e.FullCalendar)}(this,function(e,t,n){"use strict";var o=function(e,t){return(o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])})(e,t)};var r=function(){return(r=Object.assign||function(e){for(var t,n=1,o=arguments.length;n<o;n++)for(var r in t=arguments[n])Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r]);return e}).apply(this,arguments)};var a=function(e){function n(){return null!==e&&e.apply(this,arguments)||this}return function(e,t){function n(){this.constructor=e}o(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}(n,e),n.prototype.offsetForArray=function(e){return l(e,this.timeZoneName).offset},n.prototype.timestampToArray=function(e){return[(n=t.DateTime.fromMillis(e,{zone:this.timeZoneName})).year,n.month-1,n.day,n.hour,n.minute,n.second,n.millisecond];var n},n}(n.NamedTimeZoneImpl);var i=n.createPlugin({cmdFormatter:function(e,t){var n=function e(t){var n=t.match(/^(.*?)\{(.*)\}(.*)$/);if(n){var o=e(n[2]);return{head:n[1],middle:o,tail:n[3],whole:n[1]+o.whole+n[3]}}return{head:null,middle:null,tail:null,whole:t}}(e);if(t.end){var o=l(t.start.array,t.timeZone,t.localeCodes[0]),r=l(t.end.array,t.timeZone,t.localeCodes[0]);return function e(t,n,o,r){if(t.middle){var a=n(t.head),i=e(t.middle,n,o,r),l=n(t.tail),u=o(t.head),c=e(t.middle,n,o,r),d=o(t.tail);if(a===u&&l===d)return a+(i===c?i:i+r+c)+l}var f=n(t.whole),m=o(t.whole);return f===m?f:f+r+m}(n,o.toFormat.bind(o),r.toFormat.bind(r),t.separator)}return l(t.date.array,t.timeZone,t.localeCodes[0]).toFormat(n.whole)},namedTimeZonedImpl:a});function l(e,n,o){return t.DateTime.fromObject({zone:n,locale:o,year:e[0],month:e[1]+1,day:e[2],hour:e[3],minute:e[4],second:e[5],millisecond:e[6]})}e.default=i,e.toDateTime=function(e,o){if(!(o instanceof n.Calendar))throw new Error("must supply a Calendar instance");return t.DateTime.fromJSDate(e,{zone:o.dateEnv.timeZone,locale:o.dateEnv.locale.codes[0]})},e.toDuration=function(e,o){if(!(o instanceof n.Calendar))throw new Error("must supply a Calendar instance");return t.Duration.fromObject(r({},e,{locale:o.dateEnv.locale.codes[0]}))},Object.defineProperty(e,"__esModule",{value:!0})});
\ No newline at end of file
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/luxon/package.json b/AKPlan/static/AKPlan/vendor/fullcalendar/luxon/package.json
deleted file mode 100644
index 4cf344fd8930fdcba3e8c8ac7367f697f60691e7..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/luxon/package.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
-  "name": "@fullcalendar/luxon",
-  "version": "4.3.0",
-  "title": "FullCalendar Luxon Plugin",
-  "description": "A connector to the Luxon date library",
-  "keywords": [
-    "calendar",
-    "event",
-    "full-sized"
-  ],
-  "homepage": "https://fullcalendar.io/",
-  "docs": "https://fullcalendar.io/docs/luxon-plugin",
-  "bugs": "https://fullcalendar.io/reporting-bugs",
-  "repository": {
-    "type": "git",
-    "url": "https://github.com/fullcalendar/fullcalendar.git",
-    "homepage": "https://github.com/fullcalendar/fullcalendar"
-  },
-  "license": "MIT",
-  "author": {
-    "name": "Adam Shaw",
-    "email": "arshaw@arshaw.com",
-    "url": "http://arshaw.com/"
-  },
-  "copyright": "2019 Adam Shaw",
-  "peerDependencies": {
-    "@fullcalendar/core": "~4.3.0",
-    "luxon": "^1.12.1"
-  },
-  "main": "main.js",
-  "module": "main.esm.js",
-  "unpkg": "main.min.js",
-  "types": "main.d.ts"
-}
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/moment-timezone/LICENSE.txt b/AKPlan/static/AKPlan/vendor/fullcalendar/moment-timezone/LICENSE.txt
deleted file mode 100644
index 2149cfbeff4f2e3649bc950982aa72b894f7e521..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/moment-timezone/LICENSE.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-Copyright (c) 2019 Adam Shaw
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/moment-timezone/README.md b/AKPlan/static/AKPlan/vendor/fullcalendar/moment-timezone/README.md
deleted file mode 100644
index e84412a2acf9820fb431d8d28654666c60259e47..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/moment-timezone/README.md
+++ /dev/null
@@ -1,8 +0,0 @@
-
-# FullCalendar Moment Timezone Plugin
-
-A connector to the moment-timezone library
-
-[View the docs &raquo;](https://fullcalendar.io/docs/moment-plugins#moment-timezone)
-
-This package was created from the [FullCalendar monorepo &raquo;](https://github.com/fullcalendar/fullcalendar)
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/moment-timezone/main.d.ts b/AKPlan/static/AKPlan/vendor/fullcalendar/moment-timezone/main.d.ts
deleted file mode 100644
index eb0a165b1b5bb8ce16f6f74af84bd73cbbc477f7..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/moment-timezone/main.d.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-// Generated by dts-bundle v0.7.3-fork.1
-// Dependencies for this module:
-//   ../../../../../moment-timezone/builds/moment-timezone-with-data
-//   ../../../../../@fullcalendar/core
-
-declare module '@fullcalendar/moment-timezone' {
-    import 'moment-timezone/builds/moment-timezone-with-data';
-    const _default: import("@fullcalendar/core").PluginDef;
-    export default _default;
-}
-
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/moment-timezone/main.esm.js b/AKPlan/static/AKPlan/vendor/fullcalendar/moment-timezone/main.esm.js
deleted file mode 100644
index 79edd407ff250ff32329f5e9291804ab4ce3af23..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/moment-timezone/main.esm.js
+++ /dev/null
@@ -1,58 +0,0 @@
-/*!
-FullCalendar Moment Timezone Plugin v4.3.0
-Docs & License: https://fullcalendar.io/
-(c) 2019 Adam Shaw
-*/
-
-import * as momentNs from 'moment';
-import 'moment-timezone/builds/moment-timezone-with-data';
-import {createPlugin, NamedTimeZoneImpl} from '@fullcalendar/core';
-
-/*! *****************************************************************************
-Copyright (c) Microsoft Corporation. All rights reserved.
-Licensed under the Apache License, Version 2.0 (the "License"); you may not use
-this file except in compliance with the License. You may obtain a copy of the
-License at http://www.apache.org/licenses/LICENSE-2.0
-
-THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
-WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
-MERCHANTABLITY OR NON-INFRINGEMENT.
-
-See the Apache Version 2.0 License for specific language governing permissions
-and limitations under the License.
-***************************************************************************** */
-/* global Reflect, Promise */
-
-var extendStatics = function(d, b) {
-    extendStatics = Object.setPrototypeOf ||
-        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-    return extendStatics(d, b);
-};
-
-function __extends(d, b) {
-    extendStatics(d, b);
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-}
-
-var moment = momentNs; // the directly callable function
-var MomentNamedTimeZone = /** @class */ (function (_super) {
-    __extends(MomentNamedTimeZone, _super);
-    function MomentNamedTimeZone() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    MomentNamedTimeZone.prototype.offsetForArray = function (a) {
-        return moment.tz(a, this.timeZoneName).utcOffset();
-    };
-    MomentNamedTimeZone.prototype.timestampToArray = function (ms) {
-        return moment.tz(ms, this.timeZoneName).toArray();
-    };
-    return MomentNamedTimeZone;
-}(NamedTimeZoneImpl));
-var main = createPlugin({
-    namedTimeZonedImpl: MomentNamedTimeZone
-});
-
-export default main;
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/moment-timezone/main.js b/AKPlan/static/AKPlan/vendor/fullcalendar/moment-timezone/main.js
deleted file mode 100644
index b5d2897c27c9836eaddf410cc88e34085eec4971..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/moment-timezone/main.js
+++ /dev/null
@@ -1,64 +0,0 @@
-/*!
-FullCalendar Moment Timezone Plugin v4.3.0
-Docs & License: https://fullcalendar.io/
-(c) 2019 Adam Shaw
-*/
-
-(function (global, factory) {
-    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('moment'), require('moment-timezone/builds/moment-timezone-with-data'), require('@fullcalendar/core')) :
-    typeof define === 'function' && define.amd ? define(['exports', 'moment', 'moment-timezone/builds/moment-timezone-with-data', '@fullcalendar/core'], factory) :
-    (global = global || self, factory(global.FullCalendarMomentTimezone = {}, global.moment, global.moment, global.FullCalendar));
-}(this, function (exports, momentNs, momentTimezoneWithData, core) { 'use strict';
-
-    /*! *****************************************************************************
-    Copyright (c) Microsoft Corporation. All rights reserved.
-    Licensed under the Apache License, Version 2.0 (the "License"); you may not use
-    this file except in compliance with the License. You may obtain a copy of the
-    License at http://www.apache.org/licenses/LICENSE-2.0
-
-    THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-    KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
-    WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
-    MERCHANTABLITY OR NON-INFRINGEMENT.
-
-    See the Apache Version 2.0 License for specific language governing permissions
-    and limitations under the License.
-    ***************************************************************************** */
-    /* global Reflect, Promise */
-
-    var extendStatics = function(d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-
-    function __extends(d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    }
-
-    var moment = momentNs; // the directly callable function
-    var MomentNamedTimeZone = /** @class */ (function (_super) {
-        __extends(MomentNamedTimeZone, _super);
-        function MomentNamedTimeZone() {
-            return _super !== null && _super.apply(this, arguments) || this;
-        }
-        MomentNamedTimeZone.prototype.offsetForArray = function (a) {
-            return moment.tz(a, this.timeZoneName).utcOffset();
-        };
-        MomentNamedTimeZone.prototype.timestampToArray = function (ms) {
-            return moment.tz(ms, this.timeZoneName).toArray();
-        };
-        return MomentNamedTimeZone;
-    }(core.NamedTimeZoneImpl));
-    var main = core.createPlugin({
-        namedTimeZonedImpl: MomentNamedTimeZone
-    });
-
-    exports.default = main;
-
-    Object.defineProperty(exports, '__esModule', { value: true });
-
-}));
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/moment-timezone/main.min.js b/AKPlan/static/AKPlan/vendor/fullcalendar/moment-timezone/main.min.js
deleted file mode 100644
index d9ee66c023275c07686668cf9b3f4f9b6c897aa7..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/moment-timezone/main.min.js
+++ /dev/null
@@ -1,6 +0,0 @@
-/*!
-FullCalendar Moment Timezone Plugin v4.3.0
-Docs & License: https://fullcalendar.io/
-(c) 2019 Adam Shaw
-*/
-!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("moment"),require("moment-timezone/builds/moment-timezone-with-data"),require("@fullcalendar/core")):"function"==typeof define&&define.amd?define(["exports","moment","moment-timezone/builds/moment-timezone-with-data","@fullcalendar/core"],t):t((e=e||self).FullCalendarMomentTimezone={},e.moment,e.moment,e.FullCalendar)}(this,function(e,t,n,o){"use strict";var r=function(e,t){return(r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])})(e,t)};var i=t,u=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return function(e,t){function n(){this.constructor=e}r(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}(t,e),t.prototype.offsetForArray=function(e){return i.tz(e,this.timeZoneName).utcOffset()},t.prototype.timestampToArray=function(e){return i.tz(e,this.timeZoneName).toArray()},t}(o.NamedTimeZoneImpl),m=o.createPlugin({namedTimeZonedImpl:u});e.default=m,Object.defineProperty(e,"__esModule",{value:!0})});
\ No newline at end of file
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/moment-timezone/package.json b/AKPlan/static/AKPlan/vendor/fullcalendar/moment-timezone/package.json
deleted file mode 100644
index b875029cc4b7333d845dc19df4c9fea800fc41cf..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/moment-timezone/package.json
+++ /dev/null
@@ -1,35 +0,0 @@
-{
-  "name": "@fullcalendar/moment-timezone",
-  "version": "4.3.0",
-  "title": "FullCalendar Moment Timezone Plugin",
-  "description": "A connector to the moment-timezone library",
-  "keywords": [
-    "calendar",
-    "event",
-    "full-sized"
-  ],
-  "homepage": "https://fullcalendar.io/",
-  "docs": "https://fullcalendar.io/docs/moment-plugins#moment-timezone",
-  "bugs": "https://fullcalendar.io/reporting-bugs",
-  "repository": {
-    "type": "git",
-    "url": "https://github.com/fullcalendar/fullcalendar.git",
-    "homepage": "https://github.com/fullcalendar/fullcalendar"
-  },
-  "license": "MIT",
-  "author": {
-    "name": "Adam Shaw",
-    "email": "arshaw@arshaw.com",
-    "url": "http://arshaw.com/"
-  },
-  "copyright": "2019 Adam Shaw",
-  "peerDependencies": {
-    "@fullcalendar/core": "~4.3.0",
-    "moment": "^2.24.0",
-    "moment-timezone": "^0.5.25"
-  },
-  "main": "main.js",
-  "module": "main.esm.js",
-  "unpkg": "main.min.js",
-  "types": "main.d.ts"
-}
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/moment/LICENSE.txt b/AKPlan/static/AKPlan/vendor/fullcalendar/moment/LICENSE.txt
deleted file mode 100644
index 2149cfbeff4f2e3649bc950982aa72b894f7e521..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/moment/LICENSE.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-Copyright (c) 2019 Adam Shaw
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/moment/README.md b/AKPlan/static/AKPlan/vendor/fullcalendar/moment/README.md
deleted file mode 100644
index 854e4367f15a5928effd2c42c29fd1180975e05f..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/moment/README.md
+++ /dev/null
@@ -1,8 +0,0 @@
-
-# FullCalendar Moment Plugin
-
-A connector to the MomentJS date library
-
-[View the docs &raquo;](https://fullcalendar.io/docs/moment-plugins)
-
-This package was created from the [FullCalendar monorepo &raquo;](https://github.com/fullcalendar/fullcalendar)
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/moment/main.d.ts b/AKPlan/static/AKPlan/vendor/fullcalendar/moment/main.d.ts
deleted file mode 100644
index 11e373fc02a56e74f5406ad9371c4cdae3ca3c45..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/moment/main.d.ts
+++ /dev/null
@@ -1,17 +0,0 @@
-// Generated by dts-bundle v0.7.3-fork.1
-// Dependencies for this module:
-//   ../../../../../moment
-//   ../../../../../@fullcalendar/core
-
-declare module '@fullcalendar/moment' {
-    import * as momentNs from 'moment';
-    import {Calendar, Duration} from '@fullcalendar/core';
-
-    export function toMoment(date: Date, calendar: Calendar): momentNs.Moment;
-
-    export function toDuration(fcDuration: Duration): momentNs.Duration;
-
-    const _default: import("@fullcalendar/core").PluginDef;
-    export default _default;
-}
-
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/moment/main.esm.js b/AKPlan/static/AKPlan/vendor/fullcalendar/moment/main.esm.js
deleted file mode 100644
index 56154462c65a6297a27802d87881b8061210cc3b..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/moment/main.esm.js
+++ /dev/null
@@ -1,102 +0,0 @@
-/*!
-FullCalendar Moment Plugin v4.3.0
-Docs & License: https://fullcalendar.io/
-(c) 2019 Adam Shaw
-*/
-
-import * as momentNs from 'moment';
-import {Calendar, createPlugin} from '@fullcalendar/core';
-
-var moment = momentNs; // the directly callable function
-function toMoment(date, calendar) {
-    if (!(calendar instanceof Calendar)) {
-        throw new Error('must supply a Calendar instance');
-    }
-    return convertToMoment(date, calendar.dateEnv.timeZone, null, calendar.dateEnv.locale.codes[0]);
-}
-function toDuration(fcDuration) {
-    return moment.duration(fcDuration); // moment accepts all the props that fc.Duration already has!
-}
-function formatWithCmdStr(cmdStr, arg) {
-    var cmd = parseCmdStr(cmdStr);
-    if (arg.end) {
-        var startMom = convertToMoment(arg.start.array, arg.timeZone, arg.start.timeZoneOffset, arg.localeCodes[0]);
-        var endMom = convertToMoment(arg.end.array, arg.timeZone, arg.end.timeZoneOffset, arg.localeCodes[0]);
-        return formatRange(cmd, createMomentFormatFunc(startMom), createMomentFormatFunc(endMom), arg.separator);
-    }
-    return convertToMoment(arg.date.array, arg.timeZone, arg.date.timeZoneOffset, arg.localeCodes[0]).format(cmd.whole); // TODO: test for this
-}
-var main = createPlugin({
-    cmdFormatter: formatWithCmdStr
-});
-function createMomentFormatFunc(mom) {
-    return function (cmdStr) {
-        return cmdStr ? mom.format(cmdStr) : ''; // because calling with blank string results in ISO8601 :(
-    };
-}
-function convertToMoment(input, timeZone, timeZoneOffset, locale) {
-    var mom;
-    if (timeZone === 'local') {
-        mom = moment(input);
-    }
-    else if (timeZone === 'UTC') {
-        mom = moment.utc(input);
-    }
-    else if (moment.tz) {
-        mom = moment.tz(input, timeZone);
-    }
-    else {
-        mom = moment.utc(input);
-        if (timeZoneOffset != null) {
-            mom.utcOffset(timeZoneOffset);
-        }
-    }
-    mom.locale(locale);
-    return mom;
-}
-function parseCmdStr(cmdStr) {
-    var parts = cmdStr.match(/^(.*?)\{(.*)\}(.*)$/); // TODO: lookbehinds for escape characters
-    if (parts) {
-        var middle = parseCmdStr(parts[2]);
-        return {
-            head: parts[1],
-            middle: middle,
-            tail: parts[3],
-            whole: parts[1] + middle.whole + parts[3]
-        };
-    }
-    else {
-        return {
-            head: null,
-            middle: null,
-            tail: null,
-            whole: cmdStr
-        };
-    }
-}
-function formatRange(cmd, formatStart, formatEnd, separator) {
-    if (cmd.middle) {
-        var startHead = formatStart(cmd.head);
-        var startMiddle = formatRange(cmd.middle, formatStart, formatEnd, separator);
-        var startTail = formatStart(cmd.tail);
-        var endHead = formatEnd(cmd.head);
-        var endMiddle = formatRange(cmd.middle, formatStart, formatEnd, separator);
-        var endTail = formatEnd(cmd.tail);
-        if (startHead === endHead && startTail === endTail) {
-            return startHead +
-                (startMiddle === endMiddle ? startMiddle : startMiddle + separator + endMiddle) +
-                startTail;
-        }
-    }
-    var startWhole = formatStart(cmd.whole);
-    var endWhole = formatEnd(cmd.whole);
-    if (startWhole === endWhole) {
-        return startWhole;
-    }
-    else {
-        return startWhole + separator + endWhole;
-    }
-}
-
-export default main;
-export { toDuration, toMoment };
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/moment/main.js b/AKPlan/static/AKPlan/vendor/fullcalendar/moment/main.js
deleted file mode 100644
index aa8677c36404e4eaa1a75243610345c9a59c14d8..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/moment/main.js
+++ /dev/null
@@ -1,110 +0,0 @@
-/*!
-FullCalendar Moment Plugin v4.3.0
-Docs & License: https://fullcalendar.io/
-(c) 2019 Adam Shaw
-*/
-
-(function (global, factory) {
-    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('moment'), require('@fullcalendar/core')) :
-    typeof define === 'function' && define.amd ? define(['exports', 'moment', '@fullcalendar/core'], factory) :
-    (global = global || self, factory(global.FullCalendarMoment = {}, global.moment, global.FullCalendar));
-}(this, function (exports, momentNs, core) { 'use strict';
-
-    var moment = momentNs; // the directly callable function
-    function toMoment(date, calendar) {
-        if (!(calendar instanceof core.Calendar)) {
-            throw new Error('must supply a Calendar instance');
-        }
-        return convertToMoment(date, calendar.dateEnv.timeZone, null, calendar.dateEnv.locale.codes[0]);
-    }
-    function toDuration(fcDuration) {
-        return moment.duration(fcDuration); // moment accepts all the props that fc.Duration already has!
-    }
-    function formatWithCmdStr(cmdStr, arg) {
-        var cmd = parseCmdStr(cmdStr);
-        if (arg.end) {
-            var startMom = convertToMoment(arg.start.array, arg.timeZone, arg.start.timeZoneOffset, arg.localeCodes[0]);
-            var endMom = convertToMoment(arg.end.array, arg.timeZone, arg.end.timeZoneOffset, arg.localeCodes[0]);
-            return formatRange(cmd, createMomentFormatFunc(startMom), createMomentFormatFunc(endMom), arg.separator);
-        }
-        return convertToMoment(arg.date.array, arg.timeZone, arg.date.timeZoneOffset, arg.localeCodes[0]).format(cmd.whole); // TODO: test for this
-    }
-    var main = core.createPlugin({
-        cmdFormatter: formatWithCmdStr
-    });
-    function createMomentFormatFunc(mom) {
-        return function (cmdStr) {
-            return cmdStr ? mom.format(cmdStr) : ''; // because calling with blank string results in ISO8601 :(
-        };
-    }
-    function convertToMoment(input, timeZone, timeZoneOffset, locale) {
-        var mom;
-        if (timeZone === 'local') {
-            mom = moment(input);
-        }
-        else if (timeZone === 'UTC') {
-            mom = moment.utc(input);
-        }
-        else if (moment.tz) {
-            mom = moment.tz(input, timeZone);
-        }
-        else {
-            mom = moment.utc(input);
-            if (timeZoneOffset != null) {
-                mom.utcOffset(timeZoneOffset);
-            }
-        }
-        mom.locale(locale);
-        return mom;
-    }
-    function parseCmdStr(cmdStr) {
-        var parts = cmdStr.match(/^(.*?)\{(.*)\}(.*)$/); // TODO: lookbehinds for escape characters
-        if (parts) {
-            var middle = parseCmdStr(parts[2]);
-            return {
-                head: parts[1],
-                middle: middle,
-                tail: parts[3],
-                whole: parts[1] + middle.whole + parts[3]
-            };
-        }
-        else {
-            return {
-                head: null,
-                middle: null,
-                tail: null,
-                whole: cmdStr
-            };
-        }
-    }
-    function formatRange(cmd, formatStart, formatEnd, separator) {
-        if (cmd.middle) {
-            var startHead = formatStart(cmd.head);
-            var startMiddle = formatRange(cmd.middle, formatStart, formatEnd, separator);
-            var startTail = formatStart(cmd.tail);
-            var endHead = formatEnd(cmd.head);
-            var endMiddle = formatRange(cmd.middle, formatStart, formatEnd, separator);
-            var endTail = formatEnd(cmd.tail);
-            if (startHead === endHead && startTail === endTail) {
-                return startHead +
-                    (startMiddle === endMiddle ? startMiddle : startMiddle + separator + endMiddle) +
-                    startTail;
-            }
-        }
-        var startWhole = formatStart(cmd.whole);
-        var endWhole = formatEnd(cmd.whole);
-        if (startWhole === endWhole) {
-            return startWhole;
-        }
-        else {
-            return startWhole + separator + endWhole;
-        }
-    }
-
-    exports.default = main;
-    exports.toDuration = toDuration;
-    exports.toMoment = toMoment;
-
-    Object.defineProperty(exports, '__esModule', { value: true });
-
-}));
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/moment/main.min.js b/AKPlan/static/AKPlan/vendor/fullcalendar/moment/main.min.js
deleted file mode 100644
index 4dd2cadbc5f45f762293f71bc560a084a839b7d5..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/moment/main.min.js
+++ /dev/null
@@ -1,6 +0,0 @@
-/*!
-FullCalendar Moment Plugin v4.3.0
-Docs & License: https://fullcalendar.io/
-(c) 2019 Adam Shaw
-*/
-!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("moment"),require("@fullcalendar/core")):"function"==typeof define&&define.amd?define(["exports","moment","@fullcalendar/core"],t):t((e=e||self).FullCalendarMoment={},e.moment,e.FullCalendar)}(this,function(e,t,n){"use strict";var r=t;var a=n.createPlugin({cmdFormatter:function(e,t){var n=function e(t){var n=t.match(/^(.*?)\{(.*)\}(.*)$/);if(n){var r=e(n[2]);return{head:n[1],middle:r,tail:n[3],whole:n[1]+r.whole+n[3]}}return{head:null,middle:null,tail:null,whole:t}}(e);if(t.end){var r=l(t.start.array,t.timeZone,t.start.timeZoneOffset,t.localeCodes[0]),a=l(t.end.array,t.timeZone,t.end.timeZoneOffset,t.localeCodes[0]);return function e(t,n,r,a){if(t.middle){var o=n(t.head),l=e(t.middle,n,r,a),u=n(t.tail),i=r(t.head),d=e(t.middle,n,r,a),f=r(t.tail);if(o===i&&u===f)return o+(l===d?l:l+a+d)+u}var c=n(t.whole),m=r(t.whole);return c===m?c:c+a+m}(n,o(r),o(a),t.separator)}return l(t.date.array,t.timeZone,t.date.timeZoneOffset,t.localeCodes[0]).format(n.whole)}});function o(e){return function(t){return t?e.format(t):""}}function l(e,t,n,a){var o;return"local"===t?o=r(e):"UTC"===t?o=r.utc(e):r.tz?o=r.tz(e,t):(o=r.utc(e),null!=n&&o.utcOffset(n)),o.locale(a),o}e.default=a,e.toDuration=function(e){return r.duration(e)},e.toMoment=function(e,t){if(!(t instanceof n.Calendar))throw new Error("must supply a Calendar instance");return l(e,t.dateEnv.timeZone,null,t.dateEnv.locale.codes[0])},Object.defineProperty(e,"__esModule",{value:!0})});
\ No newline at end of file
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/moment/package.json b/AKPlan/static/AKPlan/vendor/fullcalendar/moment/package.json
deleted file mode 100644
index 741d178d3c8aaeb0ad3096647245de475c9537e0..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/moment/package.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
-  "name": "@fullcalendar/moment",
-  "version": "4.3.0",
-  "title": "FullCalendar Moment Plugin",
-  "description": "A connector to the MomentJS date library",
-  "keywords": [
-    "calendar",
-    "event",
-    "full-sized"
-  ],
-  "homepage": "https://fullcalendar.io/",
-  "docs": "https://fullcalendar.io/docs/moment-plugins",
-  "bugs": "https://fullcalendar.io/reporting-bugs",
-  "repository": {
-    "type": "git",
-    "url": "https://github.com/fullcalendar/fullcalendar.git",
-    "homepage": "https://github.com/fullcalendar/fullcalendar"
-  },
-  "license": "MIT",
-  "author": {
-    "name": "Adam Shaw",
-    "email": "arshaw@arshaw.com",
-    "url": "http://arshaw.com/"
-  },
-  "copyright": "2019 Adam Shaw",
-  "peerDependencies": {
-    "@fullcalendar/core": "~4.3.0",
-    "moment": "^2.24.0"
-  },
-  "main": "main.js",
-  "module": "main.esm.js",
-  "unpkg": "main.min.js",
-  "types": "main.d.ts"
-}
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/resource-common/LICENSE.md b/AKPlan/static/AKPlan/vendor/fullcalendar/resource-common/LICENSE.md
deleted file mode 100644
index 52296639f8117dd1cd8c5a9e629fed87e5b32cfc..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/resource-common/LICENSE.md
+++ /dev/null
@@ -1,18 +0,0 @@
-
-For complete licensing information, visit:
-http://fullcalendar.io/scheduler/license
-
-FullCalendar Scheduler is tri-licensed, meaning you must choose
-one of three licenses to use. Here is a summary of those licenses:
-
-- Commercial License
-  (a paid license, meant for commercial use)
-  http://fullcalendar.io/scheduler/license-details
-
-- Creative Commons Non-Commercial No-Derivatives
-  (meant for trial and non-commercial use)
-  https://creativecommons.org/licenses/by-nc-nd/4.0/
-
-- GPLv3 License
-  (meant for open-source projects)
-  http://www.gnu.org/licenses/gpl-3.0.en.html
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/resource-common/README.md b/AKPlan/static/AKPlan/vendor/fullcalendar/resource-common/README.md
deleted file mode 100644
index ddc4db04731944dd9567f96eee144902be227a41..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/resource-common/README.md
+++ /dev/null
@@ -1,8 +0,0 @@
-
-# FullCalendar Resources Common Plugin
-
-Offers base support for resources. Required for all resource-related plugins.
-
-[View the docs &raquo;](https://fullcalendar.io/docs/scheduler)
-
-This package was created from the [FullCalendar monorepo &raquo;](https://github.com/fullcalendar/fullcalendar-scheduler)
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/resource-common/main.d.ts b/AKPlan/static/AKPlan/vendor/fullcalendar/resource-common/main.d.ts
deleted file mode 100644
index 4135178b644e16c343f531bbe469d09f27803426..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/resource-common/main.d.ts
+++ /dev/null
@@ -1,538 +0,0 @@
-// Generated by dts-bundle v0.7.3-fork.1
-// Dependencies for this module:
-//   ambient.d.ts
-
-declare module '@fullcalendar/resource-common' {
-    import '@fullcalendar/resource-common/ambient';
-    import '@fullcalendar/resource-common/api/EventApi';
-    import '@fullcalendar/resource-common/resource-sources/resource-array';
-    import '@fullcalendar/resource-common/resource-sources/resource-func';
-    import '@fullcalendar/resource-common/resource-sources/resource-json-feed';
-    const _default: import("@fullcalendar/core").PluginDef;
-    export default _default;
-    export { default as ResourceDayHeader } from '@fullcalendar/resource-common/common/ResourceDayHeader';
-    export { VResourceJoiner, AbstractResourceDayTable, ResourceDayTable, DayResourceTable, VResourceSplitter } from '@fullcalendar/resource-common/common/resource-day-table';
-    export { Resource, ResourceHash } from '@fullcalendar/resource-common/structs/resource';
-    export { ResourceViewProps } from '@fullcalendar/resource-common/View';
-    export { flattenResources, Group, isGroupsEqual, GroupNode, ResourceNode, buildRowNodes, buildResourceFields } from '@fullcalendar/resource-common/common/resource-hierarchy';
-    export { buildResourceTextFunc } from '@fullcalendar/resource-common/common/resource-rendering';
-    export { default as ResourceApi } from '@fullcalendar/resource-common/api/ResourceApi';
-    export { default as ResourceSplitter } from '@fullcalendar/resource-common/common/ResourceSplitter';
-}
-
-declare module '@fullcalendar/resource-common/ambient' {
-    import ResourceApi from '@fullcalendar/resource-common/api/ResourceApi';
-    import {ResourceSource, ResourceSourceInput} from '@fullcalendar/resource-common/structs/resource-source';
-    import {View} from '@fullcalendar/core';
-    import {ResourceHash} from '@fullcalendar/resource-common/structs/resource';
-    import {ResourceEntityExpansions} from '@fullcalendar/resource-common/reducers/resourceEntityExpansions';
-    import {ResourceAction} from '@fullcalendar/resource-common/reducers/resources';
-    module '@fullcalendar/core' {
-        interface Calendar {
-            addResource(input: ResourceSourceInput): ResourceApi;
-
-            getResourceById(id: string): ResourceApi | null;
-
-            getResources(): ResourceApi[];
-
-            getTopLevelResources(): ResourceApi[];
-
-            rerenderResources(): void;
-
-            refetchResources(): void;
-        }
-
-        interface Calendar {
-            dispatch(action: ResourceAction): any;
-        }
-        interface CalendarState {
-            resourceSource?: ResourceSource | null;
-            resourceStore?: ResourceHash;
-            resourceEntityExpansions?: ResourceEntityExpansions;
-        }
-        interface OptionsInput {
-            schedulerLicenseKey?: string;
-            resources?: ResourceSourceInput;
-            resourceLabelText?: string;
-            resourceOrder?: any;
-            filterResourcesWithEvents?: any;
-            resourceText?: any;
-            resourceGroupField?: any;
-            resourceGroupText?: any;
-            resourceAreaWidth?: any;
-            resourceColumns?: any;
-            resourcesInitiallyExpanded?: any;
-            slotWidth?: any;
-            datesAboveResources?: any;
-            eventResourceEditable?: boolean;
-            refetchResourcesOnNavigate?: boolean;
-            resourceRender?(arg: {
-                resource: ResourceApi;
-                el: HTMLElement;
-                view: View;
-            }): void;
-        }
-        interface DatePointApi {
-            resource?: ResourceApi;
-        }
-        interface DateSpanApi {
-            resource?: ResourceApi;
-        }
-        interface EventMutation {
-            resourceMutation?: {
-                matchResourceId: string;
-                setResourceId: string;
-            };
-        }
-        interface EventApi {
-            getResources: () => ResourceApi[];
-            setResources: (resources: (string | ResourceApi)[]) => void;
-        }
-        interface EventDef {
-            resourceIds: string[];
-            resourceEditable: boolean;
-        }
-    }
-}
-
-declare module '@fullcalendar/resource-common/api/EventApi' {
-    import '@fullcalendar/resource-common/ambient';
-}
-
-declare module '@fullcalendar/resource-common/resource-sources/resource-array' {
-    export {};
-}
-
-declare module '@fullcalendar/resource-common/resource-sources/resource-func' {
-    import {ResourceSourceError} from '@fullcalendar/resource-common/structs/resource-source';
-    import {ResourceInput} from '@fullcalendar/resource-common/structs/resource';
-    export type ResourceFunc = (arg: {
-        start: Date;
-        end: Date;
-        timeZone: string;
-    }, successCallback: (events: ResourceInput[]) => void, failureCallback: (errorObj: ResourceSourceError) => void) => any;
-}
-
-declare module '@fullcalendar/resource-common/resource-sources/resource-json-feed' {
-    export {};
-}
-
-declare module '@fullcalendar/resource-common/common/ResourceDayHeader' {
-    import {Component, ComponentContext, DateFormatter, DateMarker, DateProfile} from '@fullcalendar/core';
-    import {Resource} from '@fullcalendar/resource-common/structs/resource';
-
-    export interface ResourceDayHeaderProps {
-        dates: DateMarker[];
-        dateProfile: DateProfile;
-        datesRepDistinctDays: boolean;
-        resources: Resource[];
-        renderIntroHtml?: () => string;
-    }
-
-    export {ResourceDayHeader as default, ResourceDayHeader};
-
-    class ResourceDayHeader extends Component<ResourceDayHeaderProps> {
-        datesAboveResources: boolean;
-        resourceTextFunc: (resource: Resource) => string;
-        dateFormat: DateFormatter;
-        el: HTMLElement;
-        thead: HTMLElement;
-        constructor(context: ComponentContext, parentEl: HTMLElement);
-        destroy(): void;
-        render(props: ResourceDayHeaderProps): void;
-        renderResourceRow(resources: Resource[]): string;
-        renderDayAndResourceRows(dates: DateMarker[], resources: Resource[]): string;
-        renderResourceAndDayRows(resources: Resource[], dates: DateMarker[]): string;
-        renderResourceCell(resource: Resource, colspan: number, date?: DateMarker): string;
-        renderDateCell(date: DateMarker, colspan: number, resource?: Resource): string;
-        buildTr(cellHtmls: string[]): string;
-        processResourceEls(resources: Resource[]): void;
-    }
-}
-
-declare module '@fullcalendar/resource-common/common/resource-day-table' {
-    import {
-        DateSpan,
-        DayTable,
-        DayTableCell,
-        EventDef,
-        EventSegUiInteractionState,
-        Seg,
-        SlicedProps,
-        SplittableProps,
-        Splitter
-    } from '@fullcalendar/core';
-    import {Resource} from '@fullcalendar/resource-common/structs/resource';
-
-    export interface ResourceDayTableCell extends DayTableCell {
-        resource: Resource;
-    }
-
-    export abstract class AbstractResourceDayTable {
-        cells: ResourceDayTableCell[][];
-        rowCnt: number;
-        colCnt: number;
-        dayTable: DayTable;
-        resources: Resource[];
-        resourceIndex: ResourceIndex;
-        constructor(dayTable: DayTable, resources: Resource[]);
-        abstract computeCol(dateI: any, resourceI: any): number;
-        abstract computeColRanges(dateStartI: any, dateEndI: any, resourceI: any): {
-            firstCol: number;
-            lastCol: number;
-            isStart: boolean;
-            isEnd: boolean;
-        }[];
-        buildCells(): ResourceDayTableCell[][];
-    }
-    export class ResourceDayTable extends AbstractResourceDayTable {
-        computeCol(dateI: any, resourceI: any): any;
-        computeColRanges(dateStartI: any, dateEndI: any, resourceI: any): {
-            firstCol: any;
-            lastCol: any;
-            isStart: boolean;
-            isEnd: boolean;
-        }[];
-    }
-    export class DayResourceTable extends AbstractResourceDayTable {
-        computeCol(dateI: any, resourceI: any): any;
-        computeColRanges(dateStartI: any, dateEndI: any, resourceI: any): any[];
-    }
-    export class ResourceIndex {
-        indicesById: {
-            [resourceId: string]: number;
-        };
-        ids: string[];
-        length: number;
-        constructor(resources: Resource[]);
-    }
-    export interface VResourceProps extends SplittableProps {
-        resourceDayTable: AbstractResourceDayTable;
-    }
-    export class VResourceSplitter extends Splitter<VResourceProps> {
-        getKeyInfo(props: VResourceProps): any;
-        getKeysForDateSpan(dateSpan: DateSpan): string[];
-        getKeysForEventDef(eventDef: EventDef): string[];
-    }
-    export abstract class VResourceJoiner<SegType extends Seg> {
-        joinProps(propSets: {
-            [resourceId: string]: SlicedProps<SegType>;
-        }, resourceDayTable: AbstractResourceDayTable): SlicedProps<SegType>;
-        joinSegs(resourceDayTable: AbstractResourceDayTable, ...segGroups: SegType[][]): SegType[];
-        expandSegs(resourceDayTable: AbstractResourceDayTable, segs: SegType[]): any[];
-        joinInteractions(resourceDayTable: AbstractResourceDayTable, ...interactions: EventSegUiInteractionState[]): EventSegUiInteractionState;
-        abstract transformSeg(seg: SegType, resourceDayTable: AbstractResourceDayTable, resourceI: number): SegType[];
-    }
-}
-
-declare module '@fullcalendar/resource-common/structs/resource' {
-    import {AllowFunc, BusinessHoursInput, Calendar, ConstraintInput, EventStore, EventUi} from '@fullcalendar/core';
-
-    export interface ResourceInput {
-        id?: string;
-        parentId?: string;
-        children?: ResourceInput[];
-        title?: string;
-        businessHours?: BusinessHoursInput;
-        eventEditable?: boolean;
-        eventStartEditable?: boolean;
-        eventDurationEditable?: boolean;
-        eventConstraint?: ConstraintInput;
-        eventOverlap?: boolean;
-        eventAllow?: AllowFunc;
-        eventClassName?: string[] | string;
-        eventClassNames?: string[] | string;
-        eventBackgroundColor?: string;
-        eventBorderColor?: string;
-        eventTextColor?: string;
-        eventColor?: string;
-        extendedProps?: {
-            [extendedProp: string]: any;
-        };
-        [otherProp: string]: any;
-    }
-    export interface Resource {
-        id: string;
-        parentId: string;
-        title: string;
-        businessHours: EventStore | null;
-        ui: EventUi;
-        extendedProps: {
-            [extendedProp: string]: any;
-        };
-    }
-    export type ResourceHash = {
-        [resourceId: string]: Resource;
-    };
-    export function parseResource(input: ResourceInput, parentId: string, store: ResourceHash, calendar: Calendar): Resource;
-    export function getPublicId(id: string): string;
-}
-
-declare module '@fullcalendar/resource-common/View' {
-    import {
-        CalendarComponentProps,
-        DateRange,
-        EventDef,
-        EventDefHash,
-        EventStore,
-        EventUi,
-        EventUiHash,
-        View,
-        ViewProps,
-        ViewPropsTransformer,
-        ViewSpec
-    } from '@fullcalendar/core';
-    import {ResourceHash} from '@fullcalendar/resource-common/structs/resource';
-    import {ResourceEntityExpansions} from '@fullcalendar/resource-common/reducers/resourceEntityExpansions';
-
-    export interface ResourceViewProps extends ViewProps {
-        resourceStore: ResourceHash;
-        resourceEntityExpansions: ResourceEntityExpansions;
-    }
-
-    export class ResourceDataAdder implements ViewPropsTransformer {
-        filterResources: typeof filterResources;
-
-        transform(viewProps: ViewProps, viewSpec: ViewSpec, calendarProps: CalendarComponentProps, view: View): {
-            resourceStore: ResourceHash;
-            resourceEntityExpansions: ResourceEntityExpansions;
-        };
-    }
-    function filterResources(resourceStore: ResourceHash, doFilterResourcesWithEvents: boolean, eventStore: EventStore, activeRange: DateRange): ResourceHash;
-    export class ResourceEventConfigAdder implements ViewPropsTransformer {
-        buildResourceEventUis: typeof buildResourceEventUis;
-        injectResourceEventUis: typeof injectResourceEventUis;
-        transform(viewProps: ViewProps, viewSpec: ViewSpec, calendarProps: CalendarComponentProps): {
-            eventUiBases: {
-                [key: string]: EventUi;
-            };
-        };
-    }
-    function buildResourceEventUis(resourceStore: ResourceHash): {
-        [key: string]: EventUi;
-    };
-    function injectResourceEventUis(eventUiBases: EventUiHash, eventDefs: EventDefHash, resourceEventUis: EventUiHash): {
-        [key: string]: EventUi;
-    };
-    export function transformIsDraggable(val: boolean, eventDef: EventDef, eventUi: EventUi, view: View): boolean;
-    export {};
-}
-
-declare module '@fullcalendar/resource-common/common/resource-hierarchy' {
-    import {Resource, ResourceHash} from '@fullcalendar/resource-common/structs/resource';
-    import {ResourceEntityExpansions} from '@fullcalendar/resource-common/reducers/resourceEntityExpansions';
-
-    export interface Group {
-        value: any;
-        spec: any;
-    }
-
-    export interface GroupNode {
-        id: string;
-        isExpanded: boolean;
-        group: Group;
-    }
-    export interface ResourceNode {
-        id: string;
-        rowSpans: number[];
-        depth: number;
-        isExpanded: boolean;
-        hasChildren: boolean;
-        resource: Resource;
-        resourceFields: any;
-    }
-    export function flattenResources(resourceStore: ResourceHash, orderSpecs: any): Resource[];
-    export function buildRowNodes(resourceStore: ResourceHash, groupSpecs: any, orderSpecs: any, isVGrouping: boolean, expansions: ResourceEntityExpansions, expansionDefault: boolean): (GroupNode | ResourceNode)[];
-    export function buildResourceFields(resource: Resource): {
-        id: string;
-        parentId: string;
-        title: string;
-        businessHours: import("@fullcalendar/core").EventStore;
-        ui: import("@fullcalendar/core").EventUi;
-        extendedProps: {
-            [extendedProp: string]: any;
-        };
-        startEditable: boolean;
-        durationEditable: boolean;
-        constraints: import("@fullcalendar/core").Constraint[];
-        overlap: boolean;
-        allows: import("@fullcalendar/core").AllowFunc[];
-        backgroundColor: string;
-        borderColor: string;
-        textColor: string;
-        classNames: string[];
-    };
-    export function isGroupsEqual(group0: Group, group1: Group): boolean;
-}
-
-declare module '@fullcalendar/resource-common/common/resource-rendering' {
-    import {Resource} from '@fullcalendar/resource-common/structs/resource';
-
-    export function buildResourceTextFunc(resourceTextSetting: any, calendar: any): (resource: Resource) => any;
-}
-
-declare module '@fullcalendar/resource-common/api/ResourceApi' {
-    import {Calendar, EventApi} from '@fullcalendar/core';
-    import {Resource} from '@fullcalendar/resource-common/structs/resource';
-    export {ResourceApi as default, ResourceApi};
-
-    class ResourceApi {
-        _calendar: Calendar;
-        _resource: Resource;
-
-        constructor(calendar: Calendar, rawResource: Resource);
-
-        setProp(name: string, value: any): void;
-
-        remove(): void;
-
-        getParent(): ResourceApi | null;
-
-        getChildren(): ResourceApi[];
-
-        getEvents(): EventApi[];
-        readonly id: string;
-        readonly title: string;
-        readonly eventConstraint: any;
-        readonly eventOverlap: any;
-        readonly eventAllow: any;
-        readonly eventBackgroundColor: string;
-        readonly eventBorderColor: string;
-        readonly eventTextColor: string;
-        readonly eventClassNames: string[];
-        readonly extendedProps: any;
-    }
-}
-
-declare module '@fullcalendar/resource-common/common/ResourceSplitter' {
-    import {DateSpan, EventDef, SplittableProps, Splitter} from '@fullcalendar/core';
-    import {ResourceHash} from '@fullcalendar/resource-common/structs/resource';
-
-    export interface SplittableResourceProps extends SplittableProps {
-        resourceStore: ResourceHash;
-    }
-
-    export {ResourceSplitter as default, ResourceSplitter};
-
-    class ResourceSplitter extends Splitter<SplittableResourceProps> {
-        getKeyInfo(props: SplittableResourceProps): {
-            '': {};
-        };
-
-        getKeysForDateSpan(dateSpan: DateSpan): string[];
-        getKeysForEventDef(eventDef: EventDef): string[];
-    }
-}
-
-declare module '@fullcalendar/resource-common/structs/resource-source' {
-    import {Calendar, DateRange} from '@fullcalendar/core';
-    import {ResourceInput} from '@fullcalendar/resource-common/structs/resource';
-    import {ResourceFunc} from '@fullcalendar/resource-common/resource-sources/resource-func';
-    export type ResourceSourceError = {
-        message: string;
-        xhr?: XMLHttpRequest;
-        [otherProp: string]: any;
-    };
-    export type ResourceFetcher = (arg: {
-        resourceSource: ResourceSource;
-        calendar: Calendar;
-        range: DateRange | null;
-    }, success: (res: {
-        rawResources: ResourceInput[];
-        xhr?: XMLHttpRequest;
-    }) => void, failure: (error: ResourceSourceError) => void) => void;
-    export interface ExtendedResourceSourceInput {
-        id?: string;
-        resources?: ResourceInput[];
-        url?: string;
-        method?: string;
-        extraParams?: object | (() => object);
-    }
-    export type ResourceSourceInput = ResourceInput[] | ExtendedResourceSourceInput | ResourceFunc | string;
-    export interface ResourceSource {
-        _raw: any;
-        sourceId: string;
-        sourceDefId: number;
-        meta: any;
-        publicId: string;
-        isFetching: boolean;
-        latestFetchId: string;
-        fetchRange: DateRange | null;
-    }
-    export interface ResourceSourceDef {
-        ignoreRange?: boolean;
-        parseMeta: (raw: ResourceSourceInput) => object | null;
-        fetch: ResourceFetcher;
-    }
-    export function registerResourceSourceDef(def: ResourceSourceDef): void;
-    export function getResourceSourceDef(id: number): ResourceSourceDef;
-    export function doesSourceIgnoreRange(source: ResourceSource): boolean;
-    export function parseResourceSource(input: ResourceSourceInput): ResourceSource;
-}
-
-declare module '@fullcalendar/resource-common/reducers/resourceEntityExpansions' {
-    import {ResourceAction} from '@fullcalendar/resource-common/reducers/resources';
-    export type ResourceEntityExpansions = {
-        [id: string]: boolean;
-    };
-    export function reduceResourceEntityExpansions(expansions: ResourceEntityExpansions, action: ResourceAction): ResourceEntityExpansions;
-}
-
-declare module '@fullcalendar/resource-common/reducers/resources' {
-    import {Action, Calendar, CalendarState, DateRange} from '@fullcalendar/core';
-    import {ResourceSourceError} from '@fullcalendar/resource-common/structs/resource-source';
-    import {ResourceHash, ResourceInput} from '@fullcalendar/resource-common/structs/resource';
-    export type ResourceAction = Action | {
-        type: 'FETCH_RESOURCE';
-    } | {
-        type: 'RECEIVE_RESOURCES';
-        rawResources: ResourceInput[];
-        fetchId: string;
-        fetchRange: DateRange | null;
-    } | {
-        type: 'RECEIVE_RESOURCE_ERROR';
-        error: ResourceSourceError;
-        fetchId: string;
-        fetchRange: DateRange | null;
-    } | {
-        type: 'ADD_RESOURCE';
-        resourceHash: ResourceHash;
-    } | // use a hash because needs to accept children
-    {
-        type: 'REMOVE_RESOURCE';
-        resourceId: string;
-    } | {
-        type: 'SET_RESOURCE_PROP';
-        resourceId: string;
-        propName: string;
-        propValue: any;
-    } | {
-        type: 'SET_RESOURCE_ENTITY_EXPANDED';
-        id: string;
-        isExpanded: boolean;
-    } | {
-        type: 'RESET_RESOURCES';
-    } | {
-        type: 'RESET_RESOURCE_SOURCE';
-        resourceSourceInput: any;
-    } | {
-        type: 'REFETCH_RESOURCES';
-    };
-    export default function (state: CalendarState, action: ResourceAction, calendar: Calendar): {
-        resourceSource: import("@fullcalendar/resource-common/structs/resource-source").ResourceSource;
-        resourceStore: ResourceHash;
-        resourceEntityExpansions: import("@fullcalendar/resource-common/reducers/resourceEntityExpansions").ResourceEntityExpansions;
-        eventSources: import("@fullcalendar/core").EventSourceHash;
-        eventSourceLoadingLevel: number;
-        loadingLevel: number;
-        viewType: string;
-        currentDate: Date;
-        dateProfile: import("@fullcalendar/core").DateProfile;
-        eventStore: import("@fullcalendar/core").EventStore;
-        dateSelection: import("@fullcalendar/core").DateSpan;
-        eventSelection: string;
-        eventDrag: import("@fullcalendar/core").EventInteractionState;
-        eventResize: import("@fullcalendar/core").EventInteractionState;
-    };
-}
-
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/resource-common/main.esm.js b/AKPlan/static/AKPlan/vendor/fullcalendar/resource-common/main.esm.js
deleted file mode 100644
index aa4fe9e7255299fd9e80eeead8d12d59e9570a35..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/resource-common/main.esm.js
+++ /dev/null
@@ -1,1597 +0,0 @@
-/*!
-FullCalendar Resources Common Plugin v4.3.1
-Docs & License: https://fullcalendar.io/scheduler
-(c) 2019 Adam Shaw
-*/
-
-import {
-    addDays,
-    appendToElement,
-    Calendar,
-    combineEventUis,
-    compareByFieldSpecs,
-    Component,
-    computeFallbackHeaderFormat,
-    config,
-    createFormatter,
-    createPlugin,
-    cssToStr,
-    EventApi,
-    filterHash,
-    findElements,
-    flexibleCompare,
-    htmlEscape,
-    htmlToElement,
-    isPropsEqual,
-    isPropsValid,
-    isValidDate,
-    mapHash,
-    memoize,
-    memoizeOutput,
-    mergeEventStores,
-    parseBusinessHours,
-    processScopedUiProps,
-    rangesEqual,
-    rangesIntersect,
-    refineProps,
-    removeElement,
-    renderDateCell,
-    requestJson,
-    Splitter,
-    unpromisify
-} from '@fullcalendar/core';
-
-/*! *****************************************************************************
-Copyright (c) Microsoft Corporation. All rights reserved.
-Licensed under the Apache License, Version 2.0 (the "License"); you may not use
-this file except in compliance with the License. You may obtain a copy of the
-License at http://www.apache.org/licenses/LICENSE-2.0
-
-THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
-WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
-MERCHANTABLITY OR NON-INFRINGEMENT.
-
-See the Apache Version 2.0 License for specific language governing permissions
-and limitations under the License.
-***************************************************************************** */
-/* global Reflect, Promise */
-
-var extendStatics = function(d, b) {
-    extendStatics = Object.setPrototypeOf ||
-        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-    return extendStatics(d, b);
-};
-
-function __extends(d, b) {
-    extendStatics(d, b);
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-}
-
-var __assign = function() {
-    __assign = Object.assign || function __assign(t) {
-        for (var s, i = 1, n = arguments.length; i < n; i++) {
-            s = arguments[i];
-            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
-        }
-        return t;
-    };
-    return __assign.apply(this, arguments);
-};
-
-function massageEventDragMutation(eventMutation, hit0, hit1) {
-    var resource0 = hit0.dateSpan.resourceId;
-    var resource1 = hit1.dateSpan.resourceId;
-    if (resource0 && resource1 &&
-        resource0 !== resource1) {
-        eventMutation.resourceMutation = {
-            matchResourceId: resource0,
-            setResourceId: resource1
-        };
-    }
-}
-/*
-TODO: all this would be much easier if we were using a hash!
-*/
-function applyEventDefMutation(eventDef, mutation, calendar) {
-    var resourceMutation = mutation.resourceMutation;
-    if (resourceMutation && computeResourceEditable(eventDef, calendar)) {
-        var index = eventDef.resourceIds.indexOf(resourceMutation.matchResourceId);
-        if (index !== -1) {
-            var resourceIds = eventDef.resourceIds.slice(); // copy
-            resourceIds.splice(index, 1); // remove
-            if (resourceIds.indexOf(resourceMutation.setResourceId) === -1) { // not already in there
-                resourceIds.push(resourceMutation.setResourceId); // add
-            }
-            eventDef.resourceIds = resourceIds;
-        }
-    }
-}
-/*
-HACK
-TODO: use EventUi system instead of this
-*/
-function computeResourceEditable(eventDef, calendar) {
-    var resourceEditable = eventDef.resourceEditable;
-    if (resourceEditable == null) {
-        var source = eventDef.sourceId && calendar.state.eventSources[eventDef.sourceId];
-        if (source) {
-            resourceEditable = source.extendedProps.resourceEditable; // used the Source::extendedProps hack
-        }
-        if (resourceEditable == null) {
-            resourceEditable = calendar.opt('eventResourceEditable');
-            if (resourceEditable == null) {
-                resourceEditable = calendar.opt('editable'); // TODO: use defaults system instead
-            }
-        }
-    }
-    return resourceEditable;
-}
-function transformEventDrop(mutation, calendar) {
-    var resourceMutation = mutation.resourceMutation;
-    if (resourceMutation) {
-        return {
-            oldResource: calendar.getResourceById(resourceMutation.matchResourceId),
-            newResource: calendar.getResourceById(resourceMutation.setResourceId)
-        };
-    }
-    else {
-        return {
-            oldResource: null,
-            newResource: null
-        };
-    }
-}
-
-var ResourceDataAdder = /** @class */ (function () {
-    function ResourceDataAdder() {
-        this.filterResources = memoize(filterResources);
-    }
-    ResourceDataAdder.prototype.transform = function (viewProps, viewSpec, calendarProps, view) {
-        if (viewSpec.class.needsResourceData) {
-            return {
-                resourceStore: this.filterResources(calendarProps.resourceStore, view.opt('filterResourcesWithEvents'), calendarProps.eventStore, calendarProps.dateProfile.activeRange),
-                resourceEntityExpansions: calendarProps.resourceEntityExpansions
-            };
-        }
-    };
-    return ResourceDataAdder;
-}());
-function filterResources(resourceStore, doFilterResourcesWithEvents, eventStore, activeRange) {
-    if (doFilterResourcesWithEvents) {
-        var instancesInRange = filterEventInstancesInRange(eventStore.instances, activeRange);
-        var hasEvents_1 = computeHasEvents(instancesInRange, eventStore.defs);
-        __assign(hasEvents_1, computeAncestorHasEvents(hasEvents_1, resourceStore));
-        return filterHash(resourceStore, function (resource, resourceId) {
-            return hasEvents_1[resourceId];
-        });
-    }
-    else {
-        return resourceStore;
-    }
-}
-function filterEventInstancesInRange(eventInstances, activeRange) {
-    return filterHash(eventInstances, function (eventInstance) {
-        return rangesIntersect(eventInstance.range, activeRange);
-    });
-}
-function computeHasEvents(eventInstances, eventDefs) {
-    var hasEvents = {};
-    for (var instanceId in eventInstances) {
-        var instance = eventInstances[instanceId];
-        for (var _i = 0, _a = eventDefs[instance.defId].resourceIds; _i < _a.length; _i++) {
-            var resourceId = _a[_i];
-            hasEvents[resourceId] = true;
-        }
-    }
-    return hasEvents;
-}
-/*
-mark resources as having events if any of their ancestors have them
-NOTE: resourceStore might not have all the resources that hasEvents{} has keyed
-*/
-function computeAncestorHasEvents(hasEvents, resourceStore) {
-    var res = {};
-    for (var resourceId in hasEvents) {
-        var resource = void 0;
-        while ((resource = resourceStore[resourceId])) {
-            resourceId = resource.parentId; // now functioning as the parentId
-            if (resourceId) {
-                res[resourceId] = true;
-            }
-            else {
-                break;
-            }
-        }
-    }
-    return res;
-}
-// for when non-resource view should be given EventUi info (for event coloring/constraints based off of resource data)
-var ResourceEventConfigAdder = /** @class */ (function () {
-    function ResourceEventConfigAdder() {
-        this.buildResourceEventUis = memoizeOutput(buildResourceEventUis, isPropsEqual);
-        this.injectResourceEventUis = memoize(injectResourceEventUis);
-    }
-    ResourceEventConfigAdder.prototype.transform = function (viewProps, viewSpec, calendarProps) {
-        if (!viewSpec.class.needsResourceData) { // is a non-resource view?
-            return {
-                eventUiBases: this.injectResourceEventUis(viewProps.eventUiBases, viewProps.eventStore.defs, this.buildResourceEventUis(calendarProps.resourceStore))
-            };
-        }
-    };
-    return ResourceEventConfigAdder;
-}());
-function buildResourceEventUis(resourceStore) {
-    return mapHash(resourceStore, function (resource) {
-        return resource.ui;
-    });
-}
-function injectResourceEventUis(eventUiBases, eventDefs, resourceEventUis) {
-    return mapHash(eventUiBases, function (eventUi, defId) {
-        if (defId) { // not the '' key
-            return injectResourceEventUi(eventUi, eventDefs[defId], resourceEventUis);
-        }
-        else {
-            return eventUi;
-        }
-    });
-}
-function injectResourceEventUi(origEventUi, eventDef, resourceEventUis) {
-    var parts = [];
-    // first resource takes precedence, which fights with the ordering of combineEventUis, thus the unshifts
-    for (var _i = 0, _a = eventDef.resourceIds; _i < _a.length; _i++) {
-        var resourceId = _a[_i];
-        if (resourceEventUis[resourceId]) {
-            parts.unshift(resourceEventUis[resourceId]);
-        }
-    }
-    parts.unshift(origEventUi);
-    return combineEventUis(parts);
-}
-// for making sure events that have editable resources are always draggable in resource views
-function transformIsDraggable(val, eventDef, eventUi, view) {
-    if (!val) {
-        if (view.viewSpec.class.needsResourceData) {
-            if (computeResourceEditable(eventDef, view.calendar)) {
-                return true;
-            }
-        }
-    }
-    return val;
-}
-
-var RESOURCE_SOURCE_PROPS = {
-    id: String
-};
-var defs = [];
-var uid = 0;
-function registerResourceSourceDef(def) {
-    defs.push(def);
-}
-function getResourceSourceDef(id) {
-    return defs[id];
-}
-function doesSourceIgnoreRange(source) {
-    return Boolean(defs[source.sourceDefId].ignoreRange);
-}
-function parseResourceSource(input) {
-    for (var i = defs.length - 1; i >= 0; i--) { // later-added plugins take precedence
-        var def = defs[i];
-        var meta = def.parseMeta(input);
-        if (meta) {
-            var res = parseResourceSourceProps((typeof input === 'object' && input) ? input : {}, meta, i);
-            res._raw = input;
-            return res;
-        }
-    }
-    return null;
-}
-function parseResourceSourceProps(input, meta, sourceDefId) {
-    var props = refineProps(input, RESOURCE_SOURCE_PROPS);
-    props.sourceId = String(uid++);
-    props.sourceDefId = sourceDefId;
-    props.meta = meta;
-    props.publicId = props.id;
-    props.isFetching = false;
-    props.latestFetchId = '';
-    props.fetchRange = null;
-    delete props.id;
-    return props;
-}
-
-function reduceResourceSource (source, action, dateProfile, calendar) {
-    switch (action.type) {
-        case 'INIT':
-            return createSource(calendar.opt('resources'), calendar);
-        case 'RESET_RESOURCE_SOURCE':
-            return createSource(action.resourceSourceInput, calendar, true);
-        case 'PREV': // TODO: how do we track all actions that affect dateProfile :(
-        case 'NEXT':
-        case 'SET_DATE':
-        case 'SET_VIEW_TYPE':
-            return handleRange(source, dateProfile.activeRange, calendar);
-        case 'RECEIVE_RESOURCES':
-        case 'RECEIVE_RESOURCE_ERROR':
-            return receiveResponse(source, action.fetchId, action.fetchRange);
-        case 'REFETCH_RESOURCES':
-            return fetchSource(source, dateProfile.activeRange, calendar);
-        default:
-            return source;
-    }
-}
-var uid$1 = 0;
-function createSource(input, calendar, forceFetch) {
-    if (input) {
-        var source = parseResourceSource(input);
-        if (forceFetch || !calendar.opt('refetchResourcesOnNavigate')) { // because assumes handleRange will do it later
-            source = fetchSource(source, null, calendar);
-        }
-        return source;
-    }
-    return null;
-}
-function handleRange(source, activeRange, calendar) {
-    if (calendar.opt('refetchResourcesOnNavigate') &&
-        !doesSourceIgnoreRange(source) &&
-        (!source.fetchRange || !rangesEqual(source.fetchRange, activeRange))) {
-        return fetchSource(source, activeRange, calendar);
-    }
-    else {
-        return source;
-    }
-}
-function fetchSource(source, fetchRange, calendar) {
-    var sourceDef = getResourceSourceDef(source.sourceDefId);
-    var fetchId = String(uid$1++);
-    sourceDef.fetch({
-        resourceSource: source,
-        calendar: calendar,
-        range: fetchRange
-    }, function (res) {
-        // HACK
-        // do before calling dispatch in case dispatch renders synchronously
-        calendar.afterSizingTriggers._resourcesRendered = [null]; // fire once
-        calendar.dispatch({
-            type: 'RECEIVE_RESOURCES',
-            fetchId: fetchId,
-            fetchRange: fetchRange,
-            rawResources: res.rawResources
-        });
-    }, function (error) {
-        calendar.dispatch({
-            type: 'RECEIVE_RESOURCE_ERROR',
-            fetchId: fetchId,
-            fetchRange: fetchRange,
-            error: error
-        });
-    });
-    return __assign({}, source, { isFetching: true, latestFetchId: fetchId });
-}
-function receiveResponse(source, fetchId, fetchRange) {
-    if (fetchId === source.latestFetchId) {
-        return __assign({}, source, { isFetching: false, fetchRange: fetchRange });
-    }
-    return source;
-}
-
-var RESOURCE_PROPS = {
-    id: String,
-    title: String,
-    parentId: String,
-    businessHours: null,
-    children: null,
-    extendedProps: null
-};
-var PRIVATE_ID_PREFIX = '_fc:';
-var uid$2 = 0;
-/*
-needs a full store so that it can populate children too
-*/
-function parseResource(input, parentId, store, calendar) {
-    if (parentId === void 0) { parentId = ''; }
-    var leftovers0 = {};
-    var props = refineProps(input, RESOURCE_PROPS, {}, leftovers0);
-    var leftovers1 = {};
-    var ui = processScopedUiProps('event', leftovers0, calendar, leftovers1);
-    if (!props.id) {
-        props.id = PRIVATE_ID_PREFIX + (uid$2++);
-    }
-    if (!props.parentId) { // give precedence to the parentId property
-        props.parentId = parentId;
-    }
-    props.businessHours = props.businessHours ? parseBusinessHours(props.businessHours, calendar) : null;
-    props.ui = ui;
-    props.extendedProps = __assign({}, leftovers1, props.extendedProps);
-    // help out ResourceApi from having user modify props
-    Object.freeze(ui.classNames);
-    Object.freeze(props.extendedProps);
-    if (store[props.id]) ;
-    else {
-        store[props.id] = props;
-        if (props.children) {
-            for (var _i = 0, _a = props.children; _i < _a.length; _i++) {
-                var childInput = _a[_i];
-                parseResource(childInput, props.id, store, calendar);
-            }
-            delete props.children;
-        }
-    }
-    return props;
-}
-/*
-TODO: use this in more places
-*/
-function getPublicId(id) {
-    if (id.indexOf(PRIVATE_ID_PREFIX) === 0) {
-        return '';
-    }
-    return id;
-}
-
-function reduceResourceStore (store, action, source, calendar) {
-    switch (action.type) {
-        case 'INIT':
-            return {};
-        case 'RECEIVE_RESOURCES':
-            return receiveRawResources(store, action.rawResources, action.fetchId, source, calendar);
-        case 'ADD_RESOURCE':
-            return addResource(store, action.resourceHash);
-        case 'REMOVE_RESOURCE':
-            return removeResource(store, action.resourceId);
-        case 'SET_RESOURCE_PROP':
-            return setResourceProp(store, action.resourceId, action.propName, action.propValue);
-        case 'RESET_RESOURCES':
-            // must make the calendar think each resource is a new object :/
-            return mapHash(store, function (resource) {
-                return __assign({}, resource);
-            });
-        default:
-            return store;
-    }
-}
-function receiveRawResources(existingStore, inputs, fetchId, source, calendar) {
-    if (source.latestFetchId === fetchId) {
-        var nextStore = {};
-        for (var _i = 0, inputs_1 = inputs; _i < inputs_1.length; _i++) {
-            var input = inputs_1[_i];
-            parseResource(input, '', nextStore, calendar);
-        }
-        return nextStore;
-    }
-    else {
-        return existingStore;
-    }
-}
-function addResource(existingStore, additions) {
-    // TODO: warn about duplicate IDs
-    return __assign({}, existingStore, additions);
-}
-function removeResource(existingStore, resourceId) {
-    var newStore = __assign({}, existingStore);
-    delete newStore[resourceId];
-    // promote children
-    for (var childResourceId in newStore) { // a child, *maybe* but probably not
-        if (newStore[childResourceId].parentId === resourceId) {
-            newStore[childResourceId] = __assign({}, newStore[childResourceId], { parentId: '' });
-        }
-    }
-    return newStore;
-}
-function setResourceProp(existingStore, resourceId, name, value) {
-    var _a, _b;
-    var existingResource = existingStore[resourceId];
-    // TODO: sanitization
-    if (existingResource) {
-        return __assign({}, existingStore, (_a = {}, _a[resourceId] = __assign({}, existingResource, (_b = {}, _b[name] = value, _b)), _a));
-    }
-    else {
-        return existingStore;
-    }
-}
-
-function reduceResourceEntityExpansions(expansions, action) {
-    var _a;
-    switch (action.type) {
-        case 'INIT':
-            return {};
-        case 'SET_RESOURCE_ENTITY_EXPANDED':
-            return __assign({}, expansions, (_a = {}, _a[action.id] = action.isExpanded, _a));
-        default:
-            return expansions;
-    }
-}
-
-function resourcesReducers (state, action, calendar) {
-    var resourceSource = reduceResourceSource(state.resourceSource, action, state.dateProfile, calendar);
-    var resourceStore = reduceResourceStore(state.resourceStore, action, resourceSource, calendar);
-    var resourceEntityExpansions = reduceResourceEntityExpansions(state.resourceEntityExpansions, action);
-    return __assign({}, state, { resourceSource: resourceSource,
-        resourceStore: resourceStore,
-        resourceEntityExpansions: resourceEntityExpansions });
-}
-
-var RESOURCE_RELATED_PROPS = {
-    resourceId: String,
-    resourceIds: function (items) {
-        return (items || []).map(function (item) {
-            return String(item);
-        });
-    },
-    resourceEditable: Boolean
-};
-function parseEventDef(def, props, leftovers) {
-    var resourceRelatedProps = refineProps(props, RESOURCE_RELATED_PROPS, {}, leftovers);
-    var resourceIds = resourceRelatedProps.resourceIds;
-    if (resourceRelatedProps.resourceId) {
-        resourceIds.push(resourceRelatedProps.resourceId);
-    }
-    def.resourceIds = resourceIds;
-    def.resourceEditable = resourceRelatedProps.resourceEditable;
-}
-
-function transformDateSelectionJoin(hit0, hit1) {
-    var resourceId0 = hit0.dateSpan.resourceId;
-    var resourceId1 = hit1.dateSpan.resourceId;
-    if (resourceId0 && resourceId1) {
-        if (hit0.component.allowAcrossResources === false &&
-            resourceId0 !== resourceId1) {
-            return false;
-        }
-        else {
-            return { resourceId: resourceId0 };
-        }
-    }
-}
-
-var ResourceApi = /** @class */ (function () {
-    function ResourceApi(calendar, rawResource) {
-        this._calendar = calendar;
-        this._resource = rawResource;
-    }
-    ResourceApi.prototype.setProp = function (name, value) {
-        this._calendar.dispatch({
-            type: 'SET_RESOURCE_PROP',
-            resourceId: this._resource.id,
-            propName: name,
-            propValue: value
-        });
-    };
-    ResourceApi.prototype.remove = function () {
-        this._calendar.dispatch({
-            type: 'REMOVE_RESOURCE',
-            resourceId: this._resource.id
-        });
-    };
-    ResourceApi.prototype.getParent = function () {
-        var calendar = this._calendar;
-        var parentId = this._resource.parentId;
-        if (parentId) {
-            return new ResourceApi(calendar, calendar.state.resourceSource[parentId]);
-        }
-        else {
-            return null;
-        }
-    };
-    ResourceApi.prototype.getChildren = function () {
-        var thisResourceId = this._resource.id;
-        var calendar = this._calendar;
-        var resourceStore = calendar.state.resourceStore;
-        var childApis = [];
-        for (var resourceId in resourceStore) {
-            if (resourceStore[resourceId].parentId === thisResourceId) {
-                childApis.push(new ResourceApi(calendar, resourceStore[resourceId]));
-            }
-        }
-        return childApis;
-    };
-    /*
-    this is really inefficient!
-    TODO: make EventApi::resourceIds a hash or keep an index in the Calendar's state
-    */
-    ResourceApi.prototype.getEvents = function () {
-        var thisResourceId = this._resource.id;
-        var calendar = this._calendar;
-        var _a = calendar.state.eventStore, defs = _a.defs, instances = _a.instances;
-        var eventApis = [];
-        for (var instanceId in instances) {
-            var instance = instances[instanceId];
-            var def = defs[instance.defId];
-            if (def.resourceIds.indexOf(thisResourceId) !== -1) { // inefficient!!!
-                eventApis.push(new EventApi(calendar, def, instance));
-            }
-        }
-        return eventApis;
-    };
-    Object.defineProperty(ResourceApi.prototype, "id", {
-        get: function () { return this._resource.id; },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(ResourceApi.prototype, "title", {
-        get: function () { return this._resource.title; },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(ResourceApi.prototype, "eventConstraint", {
-        get: function () { return this._resource.ui.constraints[0] || null; },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(ResourceApi.prototype, "eventOverlap", {
-        get: function () { return this._resource.ui.overlap; },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(ResourceApi.prototype, "eventAllow", {
-        get: function () { return this._resource.ui.allows[0] || null; },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(ResourceApi.prototype, "eventBackgroundColor", {
-        get: function () { return this._resource.ui.backgroundColor; },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(ResourceApi.prototype, "eventBorderColor", {
-        get: function () { return this._resource.ui.borderColor; },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(ResourceApi.prototype, "eventTextColor", {
-        get: function () { return this._resource.ui.textColor; },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(ResourceApi.prototype, "eventClassNames", {
-        // NOTE: user can't modify these because Object.freeze was called in event-def parsing
-        get: function () { return this._resource.ui.classNames; },
-        enumerable: true,
-        configurable: true
-    });
-    Object.defineProperty(ResourceApi.prototype, "extendedProps", {
-        get: function () { return this._resource.extendedProps; },
-        enumerable: true,
-        configurable: true
-    });
-    return ResourceApi;
-}());
-
-Calendar.prototype.addResource = function (input, scrollTo) {
-    var _a;
-    if (scrollTo === void 0) { scrollTo = true; }
-    var resourceHash;
-    var resource;
-    if (input instanceof ResourceApi) {
-        resource = input._resource;
-        resourceHash = (_a = {}, _a[resource.id] = resource, _a);
-    }
-    else {
-        resourceHash = {};
-        resource = parseResource(input, '', resourceHash, this);
-    }
-    // HACK
-    if (scrollTo) {
-        this.component.view.addScroll({ forcedRowId: resource.id });
-    }
-    this.dispatch({
-        type: 'ADD_RESOURCE',
-        resourceHash: resourceHash
-    });
-    return new ResourceApi(this, resource);
-};
-Calendar.prototype.getResourceById = function (id) {
-    id = String(id);
-    if (this.state.resourceStore) { // guard against calendar with no resource functionality
-        var rawResource = this.state.resourceStore[id];
-        if (rawResource) {
-            return new ResourceApi(this, rawResource);
-        }
-    }
-    return null;
-};
-Calendar.prototype.getResources = function () {
-    var resourceStore = this.state.resourceStore;
-    var resourceApis = [];
-    if (resourceStore) { // guard against calendar with no resource functionality
-        for (var resourceId in resourceStore) {
-            resourceApis.push(new ResourceApi(this, resourceStore[resourceId]));
-        }
-    }
-    return resourceApis;
-};
-Calendar.prototype.getTopLevelResources = function () {
-    var resourceStore = this.state.resourceStore;
-    var resourceApis = [];
-    if (resourceStore) { // guard against calendar with no resource functionality
-        for (var resourceId in resourceStore) {
-            if (!resourceStore[resourceId].parentId) {
-                resourceApis.push(new ResourceApi(this, resourceStore[resourceId]));
-            }
-        }
-    }
-    return resourceApis;
-};
-Calendar.prototype.rerenderResources = function () {
-    this.dispatch({
-        type: 'RESET_RESOURCES'
-    });
-};
-Calendar.prototype.refetchResources = function () {
-    this.dispatch({
-        type: 'REFETCH_RESOURCES'
-    });
-};
-function transformDatePoint(dateSpan, calendar) {
-    return dateSpan.resourceId ?
-        { resource: calendar.getResourceById(dateSpan.resourceId) } :
-        {};
-}
-function transformDateSpan(dateSpan, calendar) {
-    return dateSpan.resourceId ?
-        { resource: calendar.getResourceById(dateSpan.resourceId) } :
-        {};
-}
-
-/*
-splits things BASED OFF OF which resources they are associated with.
-creates a '' entry which is when something has NO resource.
-*/
-var ResourceSplitter = /** @class */ (function (_super) {
-    __extends(ResourceSplitter, _super);
-    function ResourceSplitter() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    ResourceSplitter.prototype.getKeyInfo = function (props) {
-        return __assign({ '': {} }, props.resourceStore // already has `ui` and `businessHours` keys!
-        );
-    };
-    ResourceSplitter.prototype.getKeysForDateSpan = function (dateSpan) {
-        return [dateSpan.resourceId || ''];
-    };
-    ResourceSplitter.prototype.getKeysForEventDef = function (eventDef) {
-        var resourceIds = eventDef.resourceIds;
-        if (!resourceIds.length) {
-            return [''];
-        }
-        return resourceIds;
-    };
-    return ResourceSplitter;
-}(Splitter));
-
-function isPropsValidWithResources(props, calendar) {
-    var splitter = new ResourceSplitter();
-    var sets = splitter.splitProps(__assign({}, props, { resourceStore: calendar.state.resourceStore }));
-    for (var resourceId in sets) {
-        var props_1 = sets[resourceId];
-        // merge in event data from the non-resource segment
-        if (resourceId && sets['']) { // current segment is not the non-resource one, and there IS a non-resource one
-            props_1 = __assign({}, props_1, { eventStore: mergeEventStores(sets[''].eventStore, props_1.eventStore), eventUiBases: __assign({}, sets[''].eventUiBases, props_1.eventUiBases) });
-        }
-        if (!isPropsValid(props_1, calendar, { resourceId: resourceId }, filterConfig.bind(null, resourceId))) {
-            return false;
-        }
-    }
-    return true;
-}
-function filterConfig(resourceId, config) {
-    return __assign({}, config, { constraints: filterConstraints(resourceId, config.constraints) });
-}
-function filterConstraints(resourceId, constraints) {
-    return constraints.map(function (constraint) {
-        var defs = constraint.defs;
-        if (defs) { // we are dealing with an EventStore
-            // if any of the events define constraints to resources that are NOT this resource,
-            // then this resource is unconditionally prohibited, which is what a `false` value does.
-            for (var defId in defs) {
-                var resourceIds = defs[defId].resourceIds;
-                if (resourceIds.length && resourceIds.indexOf(resourceId) === -1) { // TODO: use a hash?!!! (for other reasons too)
-                    return false;
-                }
-            }
-        }
-        return constraint;
-    });
-}
-
-function transformExternalDef(dateSpan) {
-    return dateSpan.resourceId ?
-        { resourceId: dateSpan.resourceId } :
-        {};
-}
-
-function transformEventResizeJoin(hit0, hit1) {
-    var component = hit0.component;
-    if (component.allowAcrossResources === false &&
-        hit0.dateSpan.resourceId !== hit1.dateSpan.resourceId) {
-        return false;
-    }
-}
-
-EventApi.prototype.getResources = function () {
-    var calendar = this._calendar;
-    return this._def.resourceIds.map(function (resourceId) {
-        return calendar.getResourceById(resourceId);
-    });
-};
-EventApi.prototype.setResources = function (resources) {
-    var resourceIds = [];
-    // massage resources -> resourceIds
-    for (var _i = 0, resources_1 = resources; _i < resources_1.length; _i++) {
-        var resource = resources_1[_i];
-        var resourceId = null;
-        if (typeof resource === 'string') {
-            resourceId = resource;
-        }
-        else if (typeof resource === 'number') {
-            resourceId = String(resource);
-        }
-        else if (resource instanceof ResourceApi) {
-            resourceId = resource.id; // guaranteed to always have an ID. hmmm
-        }
-        else {
-            console.warn('unknown resource type: ' + resource);
-        }
-        if (resourceId) {
-            resourceIds.push(resourceId);
-        }
-    }
-    this.mutate({
-        standardProps: {
-            resourceIds: resourceIds
-        }
-    });
-};
-
-var RELEASE_DATE = '2019-08-10'; // for Scheduler
-var UPGRADE_WINDOW = 365 + 7; // days. 1 week leeway, for tz shift reasons too
-var LICENSE_INFO_URL = 'http://fullcalendar.io/scheduler/license/';
-var PRESET_LICENSE_KEYS = [
-    'GPL-My-Project-Is-Open-Source',
-    'CC-Attribution-NonCommercial-NoDerivatives'
-];
-var CSS = {
-    position: 'absolute',
-    'z-index': 99999,
-    bottom: '1px',
-    left: '1px',
-    background: '#eee',
-    'border-color': '#ddd',
-    'border-style': 'solid',
-    'border-width': '1px 1px 0 0',
-    padding: '2px 4px',
-    'font-size': '12px',
-    'border-top-right-radius': '3px'
-};
-function injectLicenseWarning(containerEl, calendar) {
-    var key = calendar.opt('schedulerLicenseKey');
-    if (!isImmuneUrl(window.location.href) && !isValidKey(key)) {
-        appendToElement(containerEl, '<div class="fc-license-message" style="' + htmlEscape(cssToStr(CSS)) + '">' +
-            'Please use a valid license key. <a href="' + LICENSE_INFO_URL + '">More Info</a>' +
-            '</div>');
-    }
-}
-/*
-This decryption is not meant to be bulletproof. Just a way to remind about an upgrade.
-*/
-function isValidKey(key) {
-    if (PRESET_LICENSE_KEYS.indexOf(key) !== -1) {
-        return true;
-    }
-    var parts = (key || '').match(/^(\d+)\-fcs\-(\d+)$/);
-    if (parts && (parts[1].length === 10)) {
-        var purchaseDate = new Date(parseInt(parts[2], 10) * 1000);
-        var releaseDate = new Date(config.mockSchedulerReleaseDate || RELEASE_DATE);
-        if (isValidDate(releaseDate)) { // token won't be replaced in dev mode
-            var minPurchaseDate = addDays(releaseDate, -UPGRADE_WINDOW);
-            if (minPurchaseDate < purchaseDate) {
-                return true;
-            }
-        }
-    }
-    return false;
-}
-function isImmuneUrl(url) {
-    return /\w+\:\/\/fullcalendar\.io\/|\/examples\/[\w-]+\.html$/.test(url);
-}
-
-var optionChangeHandlers = {
-    resources: handleResources
-};
-function handleResources(newSourceInput, calendar, deepEqual) {
-    var oldSourceInput = calendar.state.resourceSource._raw;
-    if (!deepEqual(oldSourceInput, newSourceInput)) {
-        calendar.dispatch({
-            type: 'RESET_RESOURCE_SOURCE',
-            resourceSourceInput: newSourceInput
-        });
-    }
-}
-
-registerResourceSourceDef({
-    ignoreRange: true,
-    parseMeta: function (raw) {
-        if (Array.isArray(raw)) {
-            return raw;
-        }
-        else if (Array.isArray(raw.resources)) {
-            return raw.resources;
-        }
-        return null;
-    },
-    fetch: function (arg, successCallback) {
-        successCallback({
-            rawResources: arg.resourceSource.meta
-        });
-    }
-});
-
-registerResourceSourceDef({
-    parseMeta: function (raw) {
-        if (typeof raw === 'function') {
-            return raw;
-        }
-        else if (typeof raw.resources === 'function') {
-            return raw.resources;
-        }
-        return null;
-    },
-    fetch: function (arg, success, failure) {
-        var dateEnv = arg.calendar.dateEnv;
-        var func = arg.resourceSource.meta;
-        var publicArg = {};
-        if (arg.range) {
-            publicArg = {
-                start: dateEnv.toDate(arg.range.start),
-                end: dateEnv.toDate(arg.range.end),
-                startStr: dateEnv.formatIso(arg.range.start),
-                endStr: dateEnv.formatIso(arg.range.end),
-                timeZone: dateEnv.timeZone
-            };
-        }
-        // TODO: make more dry with EventSourceFunc
-        // TODO: accept a response?
-        unpromisify(func.bind(null, publicArg), function (rawResources) {
-            success({ rawResources: rawResources }); // needs an object response
-        }, failure // send errorObj directly to failure callback
-        );
-    }
-});
-
-registerResourceSourceDef({
-    parseMeta: function (raw) {
-        if (typeof raw === 'string') {
-            raw = { url: raw };
-        }
-        else if (!raw || typeof raw !== 'object' || !raw.url) {
-            return null;
-        }
-        return {
-            url: raw.url,
-            method: (raw.method || 'GET').toUpperCase(),
-            extraParams: raw.extraParams
-        };
-    },
-    fetch: function (arg, successCallback, failureCallback) {
-        var meta = arg.resourceSource.meta;
-        var requestParams = buildRequestParams(meta, arg.range, arg.calendar);
-        requestJson(meta.method, meta.url, requestParams, function (rawResources, xhr) {
-            successCallback({ rawResources: rawResources, xhr: xhr });
-        }, function (message, xhr) {
-            failureCallback({ message: message, xhr: xhr });
-        });
-    }
-});
-// TODO: somehow consolidate with event json feed
-function buildRequestParams(meta, range, calendar) {
-    var dateEnv = calendar.dateEnv;
-    var startParam;
-    var endParam;
-    var timeZoneParam;
-    var customRequestParams;
-    var params = {};
-    if (range) {
-        // startParam = meta.startParam
-        // if (startParam == null) {
-        startParam = calendar.opt('startParam');
-        // }
-        // endParam = meta.endParam
-        // if (endParam == null) {
-        endParam = calendar.opt('endParam');
-        // }
-        // timeZoneParam = meta.timeZoneParam
-        // if (timeZoneParam == null) {
-        timeZoneParam = calendar.opt('timeZoneParam');
-        // }
-        params[startParam] = dateEnv.formatIso(range.start);
-        params[endParam] = dateEnv.formatIso(range.end);
-        if (dateEnv.timeZone !== 'local') {
-            params[timeZoneParam] = dateEnv.timeZone;
-        }
-    }
-    // retrieve any outbound GET/POST data from the options
-    if (typeof meta.extraParams === 'function') {
-        // supplied as a function that returns a key/value object
-        customRequestParams = meta.extraParams();
-    }
-    else {
-        // probably supplied as a straight key/value object
-        customRequestParams = meta.extraParams || {};
-    }
-    __assign(params, customRequestParams);
-    return params;
-}
-
-function buildResourceTextFunc(resourceTextSetting, calendar) {
-    if (typeof resourceTextSetting === 'function') {
-        return function (resource) {
-            return resourceTextSetting(new ResourceApi(calendar, resource));
-        };
-    }
-    else {
-        return function (resource) {
-            return resource.title || getPublicId(resource.id);
-        };
-    }
-}
-
-var ResourceDayHeader = /** @class */ (function (_super) {
-    __extends(ResourceDayHeader, _super);
-    function ResourceDayHeader(context, parentEl) {
-        var _this = _super.call(this, context) || this;
-        _this.datesAboveResources = _this.opt('datesAboveResources');
-        _this.resourceTextFunc = buildResourceTextFunc(_this.opt('resourceText'), _this.calendar);
-        parentEl.innerHTML = ''; // because might be nbsp
-        parentEl.appendChild(_this.el = htmlToElement('<div class="fc-row ' + _this.theme.getClass('headerRow') + '">' +
-            '<table class="' + _this.theme.getClass('tableGrid') + '">' +
-            '<thead></thead>' +
-            '</table>' +
-            '</div>'));
-        _this.thead = _this.el.querySelector('thead');
-        return _this;
-    }
-    ResourceDayHeader.prototype.destroy = function () {
-        removeElement(this.el);
-    };
-    ResourceDayHeader.prototype.render = function (props) {
-        var html;
-        this.dateFormat = createFormatter(this.opt('columnHeaderFormat') ||
-            computeFallbackHeaderFormat(props.datesRepDistinctDays, props.dates.length));
-        if (props.dates.length === 1) {
-            html = this.renderResourceRow(props.resources);
-        }
-        else {
-            if (this.datesAboveResources) {
-                html = this.renderDayAndResourceRows(props.dates, props.resources);
-            }
-            else {
-                html = this.renderResourceAndDayRows(props.resources, props.dates);
-            }
-        }
-        this.thead.innerHTML = html;
-        this.processResourceEls(props.resources);
-    };
-    ResourceDayHeader.prototype.renderResourceRow = function (resources) {
-        var _this = this;
-        var cellHtmls = resources.map(function (resource) {
-            return _this.renderResourceCell(resource, 1);
-        });
-        return this.buildTr(cellHtmls);
-    };
-    ResourceDayHeader.prototype.renderDayAndResourceRows = function (dates, resources) {
-        var dateHtmls = [];
-        var resourceHtmls = [];
-        for (var _i = 0, dates_1 = dates; _i < dates_1.length; _i++) {
-            var date = dates_1[_i];
-            dateHtmls.push(this.renderDateCell(date, resources.length));
-            for (var _a = 0, resources_1 = resources; _a < resources_1.length; _a++) {
-                var resource = resources_1[_a];
-                resourceHtmls.push(this.renderResourceCell(resource, 1, date));
-            }
-        }
-        return this.buildTr(dateHtmls) +
-            this.buildTr(resourceHtmls);
-    };
-    ResourceDayHeader.prototype.renderResourceAndDayRows = function (resources, dates) {
-        var resourceHtmls = [];
-        var dateHtmls = [];
-        for (var _i = 0, resources_2 = resources; _i < resources_2.length; _i++) {
-            var resource = resources_2[_i];
-            resourceHtmls.push(this.renderResourceCell(resource, dates.length));
-            for (var _a = 0, dates_2 = dates; _a < dates_2.length; _a++) {
-                var date = dates_2[_a];
-                dateHtmls.push(this.renderDateCell(date, 1, resource));
-            }
-        }
-        return this.buildTr(resourceHtmls) +
-            this.buildTr(dateHtmls);
-    };
-    // Cell Rendering Utils
-    // ----------------------------------------------------------------------------------------------
-    // a cell with the resource name. might be associated with a specific day
-    ResourceDayHeader.prototype.renderResourceCell = function (resource, colspan, date) {
-        var dateEnv = this.dateEnv;
-        return '<th class="fc-resource-cell"' +
-            ' data-resource-id="' + resource.id + '"' +
-            (date ?
-                ' data-date="' + dateEnv.formatIso(date, { omitTime: true }) + '"' :
-                '') +
-            (colspan > 1 ?
-                ' colspan="' + colspan + '"' :
-                '') +
-            '>' +
-            htmlEscape(this.resourceTextFunc(resource)) +
-            '</th>';
-    };
-    // a cell with date text. might have a resource associated with it
-    ResourceDayHeader.prototype.renderDateCell = function (date, colspan, resource) {
-        var props = this.props;
-        return renderDateCell(date, props.dateProfile, props.datesRepDistinctDays, props.dates.length * props.resources.length, this.dateFormat, this.context, colspan, resource ? 'data-resource-id="' + resource.id + '"' : '');
-    };
-    ResourceDayHeader.prototype.buildTr = function (cellHtmls) {
-        if (!cellHtmls.length) {
-            cellHtmls = ['<td>&nbsp;</td>'];
-        }
-        if (this.props.renderIntroHtml) {
-            cellHtmls = [this.props.renderIntroHtml()].concat(cellHtmls);
-        }
-        if (this.isRtl) {
-            cellHtmls.reverse();
-        }
-        return '<tr>' +
-            cellHtmls.join('') +
-            '</tr>';
-    };
-    // Post-rendering
-    // ----------------------------------------------------------------------------------------------
-    // given a container with already rendered resource cells
-    ResourceDayHeader.prototype.processResourceEls = function (resources) {
-        var _this = this;
-        var view = this.view;
-        findElements(this.thead, '.fc-resource-cell').forEach(function (node, col) {
-            col = col % resources.length;
-            if (_this.isRtl) {
-                col = resources.length - 1 - col;
-            }
-            var resource = resources[col];
-            view.publiclyTrigger('resourceRender', [
-                {
-                    resource: new ResourceApi(_this.calendar, resource),
-                    el: node,
-                    view: view
-                }
-            ]);
-        });
-    };
-    return ResourceDayHeader;
-}(Component));
-
-var AbstractResourceDayTable = /** @class */ (function () {
-    function AbstractResourceDayTable(dayTable, resources) {
-        this.dayTable = dayTable;
-        this.resources = resources;
-        this.resourceIndex = new ResourceIndex(resources);
-        this.rowCnt = dayTable.rowCnt;
-        this.colCnt = dayTable.colCnt * resources.length;
-        this.cells = this.buildCells();
-    }
-    AbstractResourceDayTable.prototype.buildCells = function () {
-        var _a = this, rowCnt = _a.rowCnt, dayTable = _a.dayTable, resources = _a.resources;
-        var rows = [];
-        for (var row = 0; row < rowCnt; row++) {
-            var rowCells = [];
-            for (var dateCol = 0; dateCol < dayTable.colCnt; dateCol++) {
-                for (var resourceCol = 0; resourceCol < resources.length; resourceCol++) {
-                    var resource = resources[resourceCol];
-                    var htmlAttrs = 'data-resource-id="' + resource.id + '"';
-                    rowCells[this.computeCol(dateCol, resourceCol)] = {
-                        date: dayTable.cells[row][dateCol].date,
-                        resource: resource,
-                        htmlAttrs: htmlAttrs
-                    };
-                }
-            }
-            rows.push(rowCells);
-        }
-        return rows;
-    };
-    return AbstractResourceDayTable;
-}());
-/*
-resources over dates
-*/
-var ResourceDayTable = /** @class */ (function (_super) {
-    __extends(ResourceDayTable, _super);
-    function ResourceDayTable() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    ResourceDayTable.prototype.computeCol = function (dateI, resourceI) {
-        return resourceI * this.dayTable.colCnt + dateI;
-    };
-    /*
-    all date ranges are intact
-    */
-    ResourceDayTable.prototype.computeColRanges = function (dateStartI, dateEndI, resourceI) {
-        return [
-            {
-                firstCol: this.computeCol(dateStartI, resourceI),
-                lastCol: this.computeCol(dateEndI, resourceI),
-                isStart: true,
-                isEnd: true
-            }
-        ];
-    };
-    return ResourceDayTable;
-}(AbstractResourceDayTable));
-/*
-dates over resources
-*/
-var DayResourceTable = /** @class */ (function (_super) {
-    __extends(DayResourceTable, _super);
-    function DayResourceTable() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    DayResourceTable.prototype.computeCol = function (dateI, resourceI) {
-        return dateI * this.resources.length + resourceI;
-    };
-    /*
-    every single day is broken up
-    */
-    DayResourceTable.prototype.computeColRanges = function (dateStartI, dateEndI, resourceI) {
-        var segs = [];
-        for (var i = dateStartI; i <= dateEndI; i++) {
-            var col = this.computeCol(i, resourceI);
-            segs.push({
-                firstCol: col,
-                lastCol: col,
-                isStart: i === dateStartI,
-                isEnd: i === dateEndI
-            });
-        }
-        return segs;
-    };
-    return DayResourceTable;
-}(AbstractResourceDayTable));
-var ResourceIndex = /** @class */ (function () {
-    function ResourceIndex(resources) {
-        var indicesById = {};
-        var ids = [];
-        for (var i = 0; i < resources.length; i++) {
-            var id = resources[i].id;
-            ids.push(id);
-            indicesById[id] = i;
-        }
-        this.ids = ids;
-        this.indicesById = indicesById;
-        this.length = resources.length;
-    }
-    return ResourceIndex;
-}());
-/*
-TODO: just use ResourceHash somehow? could then use the generic ResourceSplitter
-*/
-var VResourceSplitter = /** @class */ (function (_super) {
-    __extends(VResourceSplitter, _super);
-    function VResourceSplitter() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    VResourceSplitter.prototype.getKeyInfo = function (props) {
-        var resourceDayTable = props.resourceDayTable;
-        var hash = mapHash(resourceDayTable.resourceIndex.indicesById, function (i) {
-            return resourceDayTable.resources[i]; // has `ui` AND `businessHours` keys!
-        }); // :(
-        hash[''] = {};
-        return hash;
-    };
-    VResourceSplitter.prototype.getKeysForDateSpan = function (dateSpan) {
-        return [dateSpan.resourceId || ''];
-    };
-    VResourceSplitter.prototype.getKeysForEventDef = function (eventDef) {
-        var resourceIds = eventDef.resourceIds;
-        if (!resourceIds.length) {
-            return [''];
-        }
-        return resourceIds;
-    };
-    return VResourceSplitter;
-}(Splitter));
-// joiner
-var NO_SEGS = []; // for memoizing
-var VResourceJoiner = /** @class */ (function () {
-    function VResourceJoiner() {
-        this.joinDateSelection = memoize(this.joinSegs);
-        this.joinBusinessHours = memoize(this.joinSegs);
-        this.joinFgEvents = memoize(this.joinSegs);
-        this.joinBgEvents = memoize(this.joinSegs);
-        this.joinEventDrags = memoize(this.joinInteractions);
-        this.joinEventResizes = memoize(this.joinInteractions);
-    }
-    /*
-    propSets also has a '' key for things with no resource
-    */
-    VResourceJoiner.prototype.joinProps = function (propSets, resourceDayTable) {
-        var dateSelectionSets = [];
-        var businessHoursSets = [];
-        var fgEventSets = [];
-        var bgEventSets = [];
-        var eventDrags = [];
-        var eventResizes = [];
-        var eventSelection = '';
-        var keys = resourceDayTable.resourceIndex.ids.concat(['']); // add in the all-resource key
-        for (var _i = 0, keys_1 = keys; _i < keys_1.length; _i++) {
-            var key = keys_1[_i];
-            var props = propSets[key];
-            dateSelectionSets.push(props.dateSelectionSegs);
-            businessHoursSets.push(key ? props.businessHourSegs : NO_SEGS); // don't include redundant all-resource businesshours
-            fgEventSets.push(key ? props.fgEventSegs : NO_SEGS); // don't include fg all-resource segs
-            bgEventSets.push(props.bgEventSegs);
-            eventDrags.push(props.eventDrag);
-            eventResizes.push(props.eventResize);
-            eventSelection = eventSelection || props.eventSelection;
-        }
-        return {
-            dateSelectionSegs: this.joinDateSelection.apply(this, [resourceDayTable].concat(dateSelectionSets)),
-            businessHourSegs: this.joinBusinessHours.apply(this, [resourceDayTable].concat(businessHoursSets)),
-            fgEventSegs: this.joinFgEvents.apply(this, [resourceDayTable].concat(fgEventSets)),
-            bgEventSegs: this.joinBgEvents.apply(this, [resourceDayTable].concat(bgEventSets)),
-            eventDrag: this.joinEventDrags.apply(this, [resourceDayTable].concat(eventDrags)),
-            eventResize: this.joinEventResizes.apply(this, [resourceDayTable].concat(eventResizes)),
-            eventSelection: eventSelection
-        };
-    };
-    VResourceJoiner.prototype.joinSegs = function (resourceDayTable) {
-        var segGroups = [];
-        for (var _i = 1; _i < arguments.length; _i++) {
-            segGroups[_i - 1] = arguments[_i];
-        }
-        var resourceCnt = resourceDayTable.resources.length;
-        var transformedSegs = [];
-        for (var i = 0; i < resourceCnt; i++) {
-            for (var _a = 0, _b = segGroups[i]; _a < _b.length; _a++) {
-                var seg = _b[_a];
-                transformedSegs.push.apply(transformedSegs, this.transformSeg(seg, resourceDayTable, i));
-            }
-            for (var _c = 0, _d = segGroups[resourceCnt]; _c < _d.length; _c++) { // one beyond. the all-resource
-                var seg = _d[_c];
-                transformedSegs.push.apply(// one beyond. the all-resource
-                transformedSegs, this.transformSeg(seg, resourceDayTable, i));
-            }
-        }
-        return transformedSegs;
-    };
-    /*
-    for expanding non-resource segs to all resources.
-    only for public use.
-    no memoizing.
-    */
-    VResourceJoiner.prototype.expandSegs = function (resourceDayTable, segs) {
-        var resourceCnt = resourceDayTable.resources.length;
-        var transformedSegs = [];
-        for (var i = 0; i < resourceCnt; i++) {
-            for (var _i = 0, segs_1 = segs; _i < segs_1.length; _i++) {
-                var seg = segs_1[_i];
-                transformedSegs.push.apply(transformedSegs, this.transformSeg(seg, resourceDayTable, i));
-            }
-        }
-        return transformedSegs;
-    };
-    VResourceJoiner.prototype.joinInteractions = function (resourceDayTable) {
-        var interactions = [];
-        for (var _i = 1; _i < arguments.length; _i++) {
-            interactions[_i - 1] = arguments[_i];
-        }
-        var resourceCnt = resourceDayTable.resources.length;
-        var affectedInstances = {};
-        var transformedSegs = [];
-        var isEvent = false;
-        var sourceSeg = null;
-        for (var i = 0; i < resourceCnt; i++) {
-            var interaction = interactions[i];
-            if (interaction) {
-                for (var _a = 0, _b = interaction.segs; _a < _b.length; _a++) {
-                    var seg = _b[_a];
-                    transformedSegs.push.apply(transformedSegs, this.transformSeg(seg, resourceDayTable, i) // TODO: templateify Interaction::segs
-                    );
-                }
-                __assign(affectedInstances, interaction.affectedInstances);
-                isEvent = isEvent || interaction.isEvent;
-                sourceSeg = sourceSeg || interaction.sourceSeg;
-            }
-            if (interactions[resourceCnt]) { // one beyond. the all-resource
-                for (var _c = 0, _d = interactions[resourceCnt].segs; _c < _d.length; _c++) {
-                    var seg = _d[_c];
-                    transformedSegs.push.apply(transformedSegs, this.transformSeg(seg, resourceDayTable, i) // TODO: templateify Interaction::segs
-                    );
-                }
-            }
-        }
-        return {
-            affectedInstances: affectedInstances,
-            segs: transformedSegs,
-            isEvent: isEvent,
-            sourceSeg: sourceSeg
-        };
-    };
-    return VResourceJoiner;
-}());
-
-/*
-doesn't accept grouping
-*/
-function flattenResources(resourceStore, orderSpecs) {
-    return buildRowNodes(resourceStore, [], orderSpecs, false, {}, true)
-        .map(function (node) {
-        return node.resource;
-    });
-}
-function buildRowNodes(resourceStore, groupSpecs, orderSpecs, isVGrouping, expansions, expansionDefault) {
-    var complexNodes = buildHierarchy(resourceStore, isVGrouping ? -1 : 1, groupSpecs, orderSpecs);
-    var flatNodes = [];
-    flattenNodes(complexNodes, flatNodes, isVGrouping, [], 0, expansions, expansionDefault);
-    return flatNodes;
-}
-function flattenNodes(complexNodes, res, isVGrouping, rowSpans, depth, expansions, expansionDefault) {
-    for (var i = 0; i < complexNodes.length; i++) {
-        var complexNode = complexNodes[i];
-        var group = complexNode.group;
-        if (group) {
-            if (isVGrouping) {
-                var firstRowIndex = res.length;
-                var rowSpanIndex = rowSpans.length;
-                flattenNodes(complexNode.children, res, isVGrouping, rowSpans.concat(0), depth, expansions, expansionDefault);
-                if (firstRowIndex < res.length) {
-                    var firstRow = res[firstRowIndex];
-                    var firstRowSpans = firstRow.rowSpans = firstRow.rowSpans.slice();
-                    firstRowSpans[rowSpanIndex] = res.length - firstRowIndex;
-                }
-            }
-            else {
-                var id = group.spec.field + ':' + group.value;
-                var isExpanded = expansions[id] != null ? expansions[id] : expansionDefault;
-                res.push({ id: id, group: group, isExpanded: isExpanded });
-                if (isExpanded) {
-                    flattenNodes(complexNode.children, res, isVGrouping, rowSpans, depth + 1, expansions, expansionDefault);
-                }
-            }
-        }
-        else if (complexNode.resource) {
-            var id = complexNode.resource.id;
-            var isExpanded = expansions[id] != null ? expansions[id] : expansionDefault;
-            res.push({
-                id: id,
-                rowSpans: rowSpans,
-                depth: depth,
-                isExpanded: isExpanded,
-                hasChildren: Boolean(complexNode.children.length),
-                resource: complexNode.resource,
-                resourceFields: complexNode.resourceFields
-            });
-            if (isExpanded) {
-                flattenNodes(complexNode.children, res, isVGrouping, rowSpans, depth + 1, expansions, expansionDefault);
-            }
-        }
-    }
-}
-function buildHierarchy(resourceStore, maxDepth, groupSpecs, orderSpecs) {
-    var resourceNodes = buildResourceNodes(resourceStore, orderSpecs);
-    var builtNodes = [];
-    for (var resourceId in resourceNodes) {
-        var resourceNode = resourceNodes[resourceId];
-        if (!resourceNode.resource.parentId) {
-            insertResourceNode(resourceNode, builtNodes, groupSpecs, 0, maxDepth, orderSpecs);
-        }
-    }
-    return builtNodes;
-}
-function buildResourceNodes(resourceStore, orderSpecs) {
-    var nodeHash = {};
-    for (var resourceId in resourceStore) {
-        var resource = resourceStore[resourceId];
-        nodeHash[resourceId] = {
-            resource: resource,
-            resourceFields: buildResourceFields(resource),
-            children: []
-        };
-    }
-    for (var resourceId in resourceStore) {
-        var resource = resourceStore[resourceId];
-        if (resource.parentId) {
-            var parentNode = nodeHash[resource.parentId];
-            if (parentNode) {
-                insertResourceNodeInSiblings(nodeHash[resourceId], parentNode.children, orderSpecs);
-            }
-        }
-    }
-    return nodeHash;
-}
-function insertResourceNode(resourceNode, nodes, groupSpecs, depth, maxDepth, orderSpecs) {
-    if (groupSpecs.length && (maxDepth === -1 || depth <= maxDepth)) {
-        var groupNode = ensureGroupNodes(resourceNode, nodes, groupSpecs[0]);
-        insertResourceNode(resourceNode, groupNode.children, groupSpecs.slice(1), depth + 1, maxDepth, orderSpecs);
-    }
-    else {
-        insertResourceNodeInSiblings(resourceNode, nodes, orderSpecs);
-    }
-}
-function ensureGroupNodes(resourceNode, nodes, groupSpec) {
-    var groupValue = resourceNode.resourceFields[groupSpec.field];
-    var groupNode;
-    var newGroupIndex;
-    // find an existing group that matches, or determine the position for a new group
-    if (groupSpec.order) {
-        for (newGroupIndex = 0; newGroupIndex < nodes.length; newGroupIndex++) {
-            var node = nodes[newGroupIndex];
-            if (node.group) {
-                var cmp = flexibleCompare(groupValue, node.group.value) * groupSpec.order;
-                if (cmp === 0) {
-                    groupNode = node;
-                    break;
-                }
-                else if (cmp < 0) {
-                    break;
-                }
-            }
-        }
-    }
-    else { // the groups are unordered
-        for (newGroupIndex = 0; newGroupIndex < nodes.length; newGroupIndex++) {
-            var node = nodes[newGroupIndex];
-            if (node.group && groupValue === node.group.value) {
-                groupNode = node;
-                break;
-            }
-        }
-    }
-    if (!groupNode) {
-        groupNode = {
-            group: {
-                value: groupValue,
-                spec: groupSpec
-            },
-            children: []
-        };
-        nodes.splice(newGroupIndex, 0, groupNode);
-    }
-    return groupNode;
-}
-function insertResourceNodeInSiblings(resourceNode, siblings, orderSpecs) {
-    var i;
-    for (i = 0; i < siblings.length; i++) {
-        var cmp = compareByFieldSpecs(siblings[i].resourceFields, resourceNode.resourceFields, orderSpecs);
-        if (cmp > 0) { // went 1 past. insert at i
-            break;
-        }
-    }
-    siblings.splice(i, 0, resourceNode);
-}
-function buildResourceFields(resource) {
-    var obj = __assign({}, resource.extendedProps, resource.ui, resource);
-    delete obj.ui;
-    delete obj.extendedProps;
-    return obj;
-}
-function isGroupsEqual(group0, group1) {
-    return group0.spec === group1.spec && group0.value === group1.value;
-}
-
-var main = createPlugin({
-    reducers: [resourcesReducers],
-    eventDefParsers: [parseEventDef],
-    isDraggableTransformers: [transformIsDraggable],
-    eventDragMutationMassagers: [massageEventDragMutation],
-    eventDefMutationAppliers: [applyEventDefMutation],
-    dateSelectionTransformers: [transformDateSelectionJoin],
-    datePointTransforms: [transformDatePoint],
-    dateSpanTransforms: [transformDateSpan],
-    viewPropsTransformers: [ResourceDataAdder, ResourceEventConfigAdder],
-    isPropsValid: isPropsValidWithResources,
-    externalDefTransforms: [transformExternalDef],
-    eventResizeJoinTransforms: [transformEventResizeJoin],
-    viewContainerModifiers: [injectLicenseWarning],
-    eventDropTransformers: [transformEventDrop],
-    optionChangeHandlers: optionChangeHandlers
-});
-
-export default main;
-export { AbstractResourceDayTable, DayResourceTable, ResourceApi, ResourceDayHeader, ResourceDayTable, ResourceSplitter, VResourceJoiner, VResourceSplitter, buildResourceFields, buildResourceTextFunc, buildRowNodes, flattenResources, isGroupsEqual };
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/resource-common/main.js b/AKPlan/static/AKPlan/vendor/fullcalendar/resource-common/main.js
deleted file mode 100644
index eaa626d7265fcb438157d76df9a55e576a7c7764..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/resource-common/main.js
+++ /dev/null
@@ -1,1582 +0,0 @@
-/*!
-FullCalendar Resources Common Plugin v4.3.1
-Docs & License: https://fullcalendar.io/scheduler
-(c) 2019 Adam Shaw
-*/
-
-(function (global, factory) {
-    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@fullcalendar/core')) :
-    typeof define === 'function' && define.amd ? define(['exports', '@fullcalendar/core'], factory) :
-    (global = global || self, factory(global.FullCalendarResourceCommon = {}, global.FullCalendar));
-}(this, function (exports, core) { 'use strict';
-
-    /*! *****************************************************************************
-    Copyright (c) Microsoft Corporation. All rights reserved.
-    Licensed under the Apache License, Version 2.0 (the "License"); you may not use
-    this file except in compliance with the License. You may obtain a copy of the
-    License at http://www.apache.org/licenses/LICENSE-2.0
-
-    THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-    KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
-    WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
-    MERCHANTABLITY OR NON-INFRINGEMENT.
-
-    See the Apache Version 2.0 License for specific language governing permissions
-    and limitations under the License.
-    ***************************************************************************** */
-    /* global Reflect, Promise */
-
-    var extendStatics = function(d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-
-    function __extends(d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    }
-
-    var __assign = function() {
-        __assign = Object.assign || function __assign(t) {
-            for (var s, i = 1, n = arguments.length; i < n; i++) {
-                s = arguments[i];
-                for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
-            }
-            return t;
-        };
-        return __assign.apply(this, arguments);
-    };
-
-    function massageEventDragMutation(eventMutation, hit0, hit1) {
-        var resource0 = hit0.dateSpan.resourceId;
-        var resource1 = hit1.dateSpan.resourceId;
-        if (resource0 && resource1 &&
-            resource0 !== resource1) {
-            eventMutation.resourceMutation = {
-                matchResourceId: resource0,
-                setResourceId: resource1
-            };
-        }
-    }
-    /*
-    TODO: all this would be much easier if we were using a hash!
-    */
-    function applyEventDefMutation(eventDef, mutation, calendar) {
-        var resourceMutation = mutation.resourceMutation;
-        if (resourceMutation && computeResourceEditable(eventDef, calendar)) {
-            var index = eventDef.resourceIds.indexOf(resourceMutation.matchResourceId);
-            if (index !== -1) {
-                var resourceIds = eventDef.resourceIds.slice(); // copy
-                resourceIds.splice(index, 1); // remove
-                if (resourceIds.indexOf(resourceMutation.setResourceId) === -1) { // not already in there
-                    resourceIds.push(resourceMutation.setResourceId); // add
-                }
-                eventDef.resourceIds = resourceIds;
-            }
-        }
-    }
-    /*
-    HACK
-    TODO: use EventUi system instead of this
-    */
-    function computeResourceEditable(eventDef, calendar) {
-        var resourceEditable = eventDef.resourceEditable;
-        if (resourceEditable == null) {
-            var source = eventDef.sourceId && calendar.state.eventSources[eventDef.sourceId];
-            if (source) {
-                resourceEditable = source.extendedProps.resourceEditable; // used the Source::extendedProps hack
-            }
-            if (resourceEditable == null) {
-                resourceEditable = calendar.opt('eventResourceEditable');
-                if (resourceEditable == null) {
-                    resourceEditable = calendar.opt('editable'); // TODO: use defaults system instead
-                }
-            }
-        }
-        return resourceEditable;
-    }
-    function transformEventDrop(mutation, calendar) {
-        var resourceMutation = mutation.resourceMutation;
-        if (resourceMutation) {
-            return {
-                oldResource: calendar.getResourceById(resourceMutation.matchResourceId),
-                newResource: calendar.getResourceById(resourceMutation.setResourceId)
-            };
-        }
-        else {
-            return {
-                oldResource: null,
-                newResource: null
-            };
-        }
-    }
-
-    var ResourceDataAdder = /** @class */ (function () {
-        function ResourceDataAdder() {
-            this.filterResources = core.memoize(filterResources);
-        }
-        ResourceDataAdder.prototype.transform = function (viewProps, viewSpec, calendarProps, view) {
-            if (viewSpec.class.needsResourceData) {
-                return {
-                    resourceStore: this.filterResources(calendarProps.resourceStore, view.opt('filterResourcesWithEvents'), calendarProps.eventStore, calendarProps.dateProfile.activeRange),
-                    resourceEntityExpansions: calendarProps.resourceEntityExpansions
-                };
-            }
-        };
-        return ResourceDataAdder;
-    }());
-    function filterResources(resourceStore, doFilterResourcesWithEvents, eventStore, activeRange) {
-        if (doFilterResourcesWithEvents) {
-            var instancesInRange = filterEventInstancesInRange(eventStore.instances, activeRange);
-            var hasEvents_1 = computeHasEvents(instancesInRange, eventStore.defs);
-            __assign(hasEvents_1, computeAncestorHasEvents(hasEvents_1, resourceStore));
-            return core.filterHash(resourceStore, function (resource, resourceId) {
-                return hasEvents_1[resourceId];
-            });
-        }
-        else {
-            return resourceStore;
-        }
-    }
-    function filterEventInstancesInRange(eventInstances, activeRange) {
-        return core.filterHash(eventInstances, function (eventInstance) {
-            return core.rangesIntersect(eventInstance.range, activeRange);
-        });
-    }
-    function computeHasEvents(eventInstances, eventDefs) {
-        var hasEvents = {};
-        for (var instanceId in eventInstances) {
-            var instance = eventInstances[instanceId];
-            for (var _i = 0, _a = eventDefs[instance.defId].resourceIds; _i < _a.length; _i++) {
-                var resourceId = _a[_i];
-                hasEvents[resourceId] = true;
-            }
-        }
-        return hasEvents;
-    }
-    /*
-    mark resources as having events if any of their ancestors have them
-    NOTE: resourceStore might not have all the resources that hasEvents{} has keyed
-    */
-    function computeAncestorHasEvents(hasEvents, resourceStore) {
-        var res = {};
-        for (var resourceId in hasEvents) {
-            var resource = void 0;
-            while ((resource = resourceStore[resourceId])) {
-                resourceId = resource.parentId; // now functioning as the parentId
-                if (resourceId) {
-                    res[resourceId] = true;
-                }
-                else {
-                    break;
-                }
-            }
-        }
-        return res;
-    }
-    // for when non-resource view should be given EventUi info (for event coloring/constraints based off of resource data)
-    var ResourceEventConfigAdder = /** @class */ (function () {
-        function ResourceEventConfigAdder() {
-            this.buildResourceEventUis = core.memoizeOutput(buildResourceEventUis, core.isPropsEqual);
-            this.injectResourceEventUis = core.memoize(injectResourceEventUis);
-        }
-        ResourceEventConfigAdder.prototype.transform = function (viewProps, viewSpec, calendarProps) {
-            if (!viewSpec.class.needsResourceData) { // is a non-resource view?
-                return {
-                    eventUiBases: this.injectResourceEventUis(viewProps.eventUiBases, viewProps.eventStore.defs, this.buildResourceEventUis(calendarProps.resourceStore))
-                };
-            }
-        };
-        return ResourceEventConfigAdder;
-    }());
-    function buildResourceEventUis(resourceStore) {
-        return core.mapHash(resourceStore, function (resource) {
-            return resource.ui;
-        });
-    }
-    function injectResourceEventUis(eventUiBases, eventDefs, resourceEventUis) {
-        return core.mapHash(eventUiBases, function (eventUi, defId) {
-            if (defId) { // not the '' key
-                return injectResourceEventUi(eventUi, eventDefs[defId], resourceEventUis);
-            }
-            else {
-                return eventUi;
-            }
-        });
-    }
-    function injectResourceEventUi(origEventUi, eventDef, resourceEventUis) {
-        var parts = [];
-        // first resource takes precedence, which fights with the ordering of combineEventUis, thus the unshifts
-        for (var _i = 0, _a = eventDef.resourceIds; _i < _a.length; _i++) {
-            var resourceId = _a[_i];
-            if (resourceEventUis[resourceId]) {
-                parts.unshift(resourceEventUis[resourceId]);
-            }
-        }
-        parts.unshift(origEventUi);
-        return core.combineEventUis(parts);
-    }
-    // for making sure events that have editable resources are always draggable in resource views
-    function transformIsDraggable(val, eventDef, eventUi, view) {
-        if (!val) {
-            if (view.viewSpec.class.needsResourceData) {
-                if (computeResourceEditable(eventDef, view.calendar)) {
-                    return true;
-                }
-            }
-        }
-        return val;
-    }
-
-    var RESOURCE_SOURCE_PROPS = {
-        id: String
-    };
-    var defs = [];
-    var uid = 0;
-    function registerResourceSourceDef(def) {
-        defs.push(def);
-    }
-    function getResourceSourceDef(id) {
-        return defs[id];
-    }
-    function doesSourceIgnoreRange(source) {
-        return Boolean(defs[source.sourceDefId].ignoreRange);
-    }
-    function parseResourceSource(input) {
-        for (var i = defs.length - 1; i >= 0; i--) { // later-added plugins take precedence
-            var def = defs[i];
-            var meta = def.parseMeta(input);
-            if (meta) {
-                var res = parseResourceSourceProps((typeof input === 'object' && input) ? input : {}, meta, i);
-                res._raw = input;
-                return res;
-            }
-        }
-        return null;
-    }
-    function parseResourceSourceProps(input, meta, sourceDefId) {
-        var props = core.refineProps(input, RESOURCE_SOURCE_PROPS);
-        props.sourceId = String(uid++);
-        props.sourceDefId = sourceDefId;
-        props.meta = meta;
-        props.publicId = props.id;
-        props.isFetching = false;
-        props.latestFetchId = '';
-        props.fetchRange = null;
-        delete props.id;
-        return props;
-    }
-
-    function reduceResourceSource (source, action, dateProfile, calendar) {
-        switch (action.type) {
-            case 'INIT':
-                return createSource(calendar.opt('resources'), calendar);
-            case 'RESET_RESOURCE_SOURCE':
-                return createSource(action.resourceSourceInput, calendar, true);
-            case 'PREV': // TODO: how do we track all actions that affect dateProfile :(
-            case 'NEXT':
-            case 'SET_DATE':
-            case 'SET_VIEW_TYPE':
-                return handleRange(source, dateProfile.activeRange, calendar);
-            case 'RECEIVE_RESOURCES':
-            case 'RECEIVE_RESOURCE_ERROR':
-                return receiveResponse(source, action.fetchId, action.fetchRange);
-            case 'REFETCH_RESOURCES':
-                return fetchSource(source, dateProfile.activeRange, calendar);
-            default:
-                return source;
-        }
-    }
-    var uid$1 = 0;
-    function createSource(input, calendar, forceFetch) {
-        if (input) {
-            var source = parseResourceSource(input);
-            if (forceFetch || !calendar.opt('refetchResourcesOnNavigate')) { // because assumes handleRange will do it later
-                source = fetchSource(source, null, calendar);
-            }
-            return source;
-        }
-        return null;
-    }
-    function handleRange(source, activeRange, calendar) {
-        if (calendar.opt('refetchResourcesOnNavigate') &&
-            !doesSourceIgnoreRange(source) &&
-            (!source.fetchRange || !core.rangesEqual(source.fetchRange, activeRange))) {
-            return fetchSource(source, activeRange, calendar);
-        }
-        else {
-            return source;
-        }
-    }
-    function fetchSource(source, fetchRange, calendar) {
-        var sourceDef = getResourceSourceDef(source.sourceDefId);
-        var fetchId = String(uid$1++);
-        sourceDef.fetch({
-            resourceSource: source,
-            calendar: calendar,
-            range: fetchRange
-        }, function (res) {
-            // HACK
-            // do before calling dispatch in case dispatch renders synchronously
-            calendar.afterSizingTriggers._resourcesRendered = [null]; // fire once
-            calendar.dispatch({
-                type: 'RECEIVE_RESOURCES',
-                fetchId: fetchId,
-                fetchRange: fetchRange,
-                rawResources: res.rawResources
-            });
-        }, function (error) {
-            calendar.dispatch({
-                type: 'RECEIVE_RESOURCE_ERROR',
-                fetchId: fetchId,
-                fetchRange: fetchRange,
-                error: error
-            });
-        });
-        return __assign({}, source, { isFetching: true, latestFetchId: fetchId });
-    }
-    function receiveResponse(source, fetchId, fetchRange) {
-        if (fetchId === source.latestFetchId) {
-            return __assign({}, source, { isFetching: false, fetchRange: fetchRange });
-        }
-        return source;
-    }
-
-    var RESOURCE_PROPS = {
-        id: String,
-        title: String,
-        parentId: String,
-        businessHours: null,
-        children: null,
-        extendedProps: null
-    };
-    var PRIVATE_ID_PREFIX = '_fc:';
-    var uid$2 = 0;
-    /*
-    needs a full store so that it can populate children too
-    */
-    function parseResource(input, parentId, store, calendar) {
-        if (parentId === void 0) { parentId = ''; }
-        var leftovers0 = {};
-        var props = core.refineProps(input, RESOURCE_PROPS, {}, leftovers0);
-        var leftovers1 = {};
-        var ui = core.processScopedUiProps('event', leftovers0, calendar, leftovers1);
-        if (!props.id) {
-            props.id = PRIVATE_ID_PREFIX + (uid$2++);
-        }
-        if (!props.parentId) { // give precedence to the parentId property
-            props.parentId = parentId;
-        }
-        props.businessHours = props.businessHours ? core.parseBusinessHours(props.businessHours, calendar) : null;
-        props.ui = ui;
-        props.extendedProps = __assign({}, leftovers1, props.extendedProps);
-        // help out ResourceApi from having user modify props
-        Object.freeze(ui.classNames);
-        Object.freeze(props.extendedProps);
-        if (store[props.id]) ;
-        else {
-            store[props.id] = props;
-            if (props.children) {
-                for (var _i = 0, _a = props.children; _i < _a.length; _i++) {
-                    var childInput = _a[_i];
-                    parseResource(childInput, props.id, store, calendar);
-                }
-                delete props.children;
-            }
-        }
-        return props;
-    }
-    /*
-    TODO: use this in more places
-    */
-    function getPublicId(id) {
-        if (id.indexOf(PRIVATE_ID_PREFIX) === 0) {
-            return '';
-        }
-        return id;
-    }
-
-    function reduceResourceStore (store, action, source, calendar) {
-        switch (action.type) {
-            case 'INIT':
-                return {};
-            case 'RECEIVE_RESOURCES':
-                return receiveRawResources(store, action.rawResources, action.fetchId, source, calendar);
-            case 'ADD_RESOURCE':
-                return addResource(store, action.resourceHash);
-            case 'REMOVE_RESOURCE':
-                return removeResource(store, action.resourceId);
-            case 'SET_RESOURCE_PROP':
-                return setResourceProp(store, action.resourceId, action.propName, action.propValue);
-            case 'RESET_RESOURCES':
-                // must make the calendar think each resource is a new object :/
-                return core.mapHash(store, function (resource) {
-                    return __assign({}, resource);
-                });
-            default:
-                return store;
-        }
-    }
-    function receiveRawResources(existingStore, inputs, fetchId, source, calendar) {
-        if (source.latestFetchId === fetchId) {
-            var nextStore = {};
-            for (var _i = 0, inputs_1 = inputs; _i < inputs_1.length; _i++) {
-                var input = inputs_1[_i];
-                parseResource(input, '', nextStore, calendar);
-            }
-            return nextStore;
-        }
-        else {
-            return existingStore;
-        }
-    }
-    function addResource(existingStore, additions) {
-        // TODO: warn about duplicate IDs
-        return __assign({}, existingStore, additions);
-    }
-    function removeResource(existingStore, resourceId) {
-        var newStore = __assign({}, existingStore);
-        delete newStore[resourceId];
-        // promote children
-        for (var childResourceId in newStore) { // a child, *maybe* but probably not
-            if (newStore[childResourceId].parentId === resourceId) {
-                newStore[childResourceId] = __assign({}, newStore[childResourceId], { parentId: '' });
-            }
-        }
-        return newStore;
-    }
-    function setResourceProp(existingStore, resourceId, name, value) {
-        var _a, _b;
-        var existingResource = existingStore[resourceId];
-        // TODO: sanitization
-        if (existingResource) {
-            return __assign({}, existingStore, (_a = {}, _a[resourceId] = __assign({}, existingResource, (_b = {}, _b[name] = value, _b)), _a));
-        }
-        else {
-            return existingStore;
-        }
-    }
-
-    function reduceResourceEntityExpansions(expansions, action) {
-        var _a;
-        switch (action.type) {
-            case 'INIT':
-                return {};
-            case 'SET_RESOURCE_ENTITY_EXPANDED':
-                return __assign({}, expansions, (_a = {}, _a[action.id] = action.isExpanded, _a));
-            default:
-                return expansions;
-        }
-    }
-
-    function resourcesReducers (state, action, calendar) {
-        var resourceSource = reduceResourceSource(state.resourceSource, action, state.dateProfile, calendar);
-        var resourceStore = reduceResourceStore(state.resourceStore, action, resourceSource, calendar);
-        var resourceEntityExpansions = reduceResourceEntityExpansions(state.resourceEntityExpansions, action);
-        return __assign({}, state, { resourceSource: resourceSource,
-            resourceStore: resourceStore,
-            resourceEntityExpansions: resourceEntityExpansions });
-    }
-
-    var RESOURCE_RELATED_PROPS = {
-        resourceId: String,
-        resourceIds: function (items) {
-            return (items || []).map(function (item) {
-                return String(item);
-            });
-        },
-        resourceEditable: Boolean
-    };
-    function parseEventDef(def, props, leftovers) {
-        var resourceRelatedProps = core.refineProps(props, RESOURCE_RELATED_PROPS, {}, leftovers);
-        var resourceIds = resourceRelatedProps.resourceIds;
-        if (resourceRelatedProps.resourceId) {
-            resourceIds.push(resourceRelatedProps.resourceId);
-        }
-        def.resourceIds = resourceIds;
-        def.resourceEditable = resourceRelatedProps.resourceEditable;
-    }
-
-    function transformDateSelectionJoin(hit0, hit1) {
-        var resourceId0 = hit0.dateSpan.resourceId;
-        var resourceId1 = hit1.dateSpan.resourceId;
-        if (resourceId0 && resourceId1) {
-            if (hit0.component.allowAcrossResources === false &&
-                resourceId0 !== resourceId1) {
-                return false;
-            }
-            else {
-                return { resourceId: resourceId0 };
-            }
-        }
-    }
-
-    var ResourceApi = /** @class */ (function () {
-        function ResourceApi(calendar, rawResource) {
-            this._calendar = calendar;
-            this._resource = rawResource;
-        }
-        ResourceApi.prototype.setProp = function (name, value) {
-            this._calendar.dispatch({
-                type: 'SET_RESOURCE_PROP',
-                resourceId: this._resource.id,
-                propName: name,
-                propValue: value
-            });
-        };
-        ResourceApi.prototype.remove = function () {
-            this._calendar.dispatch({
-                type: 'REMOVE_RESOURCE',
-                resourceId: this._resource.id
-            });
-        };
-        ResourceApi.prototype.getParent = function () {
-            var calendar = this._calendar;
-            var parentId = this._resource.parentId;
-            if (parentId) {
-                return new ResourceApi(calendar, calendar.state.resourceSource[parentId]);
-            }
-            else {
-                return null;
-            }
-        };
-        ResourceApi.prototype.getChildren = function () {
-            var thisResourceId = this._resource.id;
-            var calendar = this._calendar;
-            var resourceStore = calendar.state.resourceStore;
-            var childApis = [];
-            for (var resourceId in resourceStore) {
-                if (resourceStore[resourceId].parentId === thisResourceId) {
-                    childApis.push(new ResourceApi(calendar, resourceStore[resourceId]));
-                }
-            }
-            return childApis;
-        };
-        /*
-        this is really inefficient!
-        TODO: make EventApi::resourceIds a hash or keep an index in the Calendar's state
-        */
-        ResourceApi.prototype.getEvents = function () {
-            var thisResourceId = this._resource.id;
-            var calendar = this._calendar;
-            var _a = calendar.state.eventStore, defs = _a.defs, instances = _a.instances;
-            var eventApis = [];
-            for (var instanceId in instances) {
-                var instance = instances[instanceId];
-                var def = defs[instance.defId];
-                if (def.resourceIds.indexOf(thisResourceId) !== -1) { // inefficient!!!
-                    eventApis.push(new core.EventApi(calendar, def, instance));
-                }
-            }
-            return eventApis;
-        };
-        Object.defineProperty(ResourceApi.prototype, "id", {
-            get: function () { return this._resource.id; },
-            enumerable: true,
-            configurable: true
-        });
-        Object.defineProperty(ResourceApi.prototype, "title", {
-            get: function () { return this._resource.title; },
-            enumerable: true,
-            configurable: true
-        });
-        Object.defineProperty(ResourceApi.prototype, "eventConstraint", {
-            get: function () { return this._resource.ui.constraints[0] || null; },
-            enumerable: true,
-            configurable: true
-        });
-        Object.defineProperty(ResourceApi.prototype, "eventOverlap", {
-            get: function () { return this._resource.ui.overlap; },
-            enumerable: true,
-            configurable: true
-        });
-        Object.defineProperty(ResourceApi.prototype, "eventAllow", {
-            get: function () { return this._resource.ui.allows[0] || null; },
-            enumerable: true,
-            configurable: true
-        });
-        Object.defineProperty(ResourceApi.prototype, "eventBackgroundColor", {
-            get: function () { return this._resource.ui.backgroundColor; },
-            enumerable: true,
-            configurable: true
-        });
-        Object.defineProperty(ResourceApi.prototype, "eventBorderColor", {
-            get: function () { return this._resource.ui.borderColor; },
-            enumerable: true,
-            configurable: true
-        });
-        Object.defineProperty(ResourceApi.prototype, "eventTextColor", {
-            get: function () { return this._resource.ui.textColor; },
-            enumerable: true,
-            configurable: true
-        });
-        Object.defineProperty(ResourceApi.prototype, "eventClassNames", {
-            // NOTE: user can't modify these because Object.freeze was called in event-def parsing
-            get: function () { return this._resource.ui.classNames; },
-            enumerable: true,
-            configurable: true
-        });
-        Object.defineProperty(ResourceApi.prototype, "extendedProps", {
-            get: function () { return this._resource.extendedProps; },
-            enumerable: true,
-            configurable: true
-        });
-        return ResourceApi;
-    }());
-
-    core.Calendar.prototype.addResource = function (input, scrollTo) {
-        var _a;
-        if (scrollTo === void 0) { scrollTo = true; }
-        var resourceHash;
-        var resource;
-        if (input instanceof ResourceApi) {
-            resource = input._resource;
-            resourceHash = (_a = {}, _a[resource.id] = resource, _a);
-        }
-        else {
-            resourceHash = {};
-            resource = parseResource(input, '', resourceHash, this);
-        }
-        // HACK
-        if (scrollTo) {
-            this.component.view.addScroll({ forcedRowId: resource.id });
-        }
-        this.dispatch({
-            type: 'ADD_RESOURCE',
-            resourceHash: resourceHash
-        });
-        return new ResourceApi(this, resource);
-    };
-    core.Calendar.prototype.getResourceById = function (id) {
-        id = String(id);
-        if (this.state.resourceStore) { // guard against calendar with no resource functionality
-            var rawResource = this.state.resourceStore[id];
-            if (rawResource) {
-                return new ResourceApi(this, rawResource);
-            }
-        }
-        return null;
-    };
-    core.Calendar.prototype.getResources = function () {
-        var resourceStore = this.state.resourceStore;
-        var resourceApis = [];
-        if (resourceStore) { // guard against calendar with no resource functionality
-            for (var resourceId in resourceStore) {
-                resourceApis.push(new ResourceApi(this, resourceStore[resourceId]));
-            }
-        }
-        return resourceApis;
-    };
-    core.Calendar.prototype.getTopLevelResources = function () {
-        var resourceStore = this.state.resourceStore;
-        var resourceApis = [];
-        if (resourceStore) { // guard against calendar with no resource functionality
-            for (var resourceId in resourceStore) {
-                if (!resourceStore[resourceId].parentId) {
-                    resourceApis.push(new ResourceApi(this, resourceStore[resourceId]));
-                }
-            }
-        }
-        return resourceApis;
-    };
-    core.Calendar.prototype.rerenderResources = function () {
-        this.dispatch({
-            type: 'RESET_RESOURCES'
-        });
-    };
-    core.Calendar.prototype.refetchResources = function () {
-        this.dispatch({
-            type: 'REFETCH_RESOURCES'
-        });
-    };
-    function transformDatePoint(dateSpan, calendar) {
-        return dateSpan.resourceId ?
-            { resource: calendar.getResourceById(dateSpan.resourceId) } :
-            {};
-    }
-    function transformDateSpan(dateSpan, calendar) {
-        return dateSpan.resourceId ?
-            { resource: calendar.getResourceById(dateSpan.resourceId) } :
-            {};
-    }
-
-    /*
-    splits things BASED OFF OF which resources they are associated with.
-    creates a '' entry which is when something has NO resource.
-    */
-    var ResourceSplitter = /** @class */ (function (_super) {
-        __extends(ResourceSplitter, _super);
-        function ResourceSplitter() {
-            return _super !== null && _super.apply(this, arguments) || this;
-        }
-        ResourceSplitter.prototype.getKeyInfo = function (props) {
-            return __assign({ '': {} }, props.resourceStore // already has `ui` and `businessHours` keys!
-            );
-        };
-        ResourceSplitter.prototype.getKeysForDateSpan = function (dateSpan) {
-            return [dateSpan.resourceId || ''];
-        };
-        ResourceSplitter.prototype.getKeysForEventDef = function (eventDef) {
-            var resourceIds = eventDef.resourceIds;
-            if (!resourceIds.length) {
-                return [''];
-            }
-            return resourceIds;
-        };
-        return ResourceSplitter;
-    }(core.Splitter));
-
-    function isPropsValidWithResources(props, calendar) {
-        var splitter = new ResourceSplitter();
-        var sets = splitter.splitProps(__assign({}, props, { resourceStore: calendar.state.resourceStore }));
-        for (var resourceId in sets) {
-            var props_1 = sets[resourceId];
-            // merge in event data from the non-resource segment
-            if (resourceId && sets['']) { // current segment is not the non-resource one, and there IS a non-resource one
-                props_1 = __assign({}, props_1, { eventStore: core.mergeEventStores(sets[''].eventStore, props_1.eventStore), eventUiBases: __assign({}, sets[''].eventUiBases, props_1.eventUiBases) });
-            }
-            if (!core.isPropsValid(props_1, calendar, { resourceId: resourceId }, filterConfig.bind(null, resourceId))) {
-                return false;
-            }
-        }
-        return true;
-    }
-    function filterConfig(resourceId, config) {
-        return __assign({}, config, { constraints: filterConstraints(resourceId, config.constraints) });
-    }
-    function filterConstraints(resourceId, constraints) {
-        return constraints.map(function (constraint) {
-            var defs = constraint.defs;
-            if (defs) { // we are dealing with an EventStore
-                // if any of the events define constraints to resources that are NOT this resource,
-                // then this resource is unconditionally prohibited, which is what a `false` value does.
-                for (var defId in defs) {
-                    var resourceIds = defs[defId].resourceIds;
-                    if (resourceIds.length && resourceIds.indexOf(resourceId) === -1) { // TODO: use a hash?!!! (for other reasons too)
-                        return false;
-                    }
-                }
-            }
-            return constraint;
-        });
-    }
-
-    function transformExternalDef(dateSpan) {
-        return dateSpan.resourceId ?
-            { resourceId: dateSpan.resourceId } :
-            {};
-    }
-
-    function transformEventResizeJoin(hit0, hit1) {
-        var component = hit0.component;
-        if (component.allowAcrossResources === false &&
-            hit0.dateSpan.resourceId !== hit1.dateSpan.resourceId) {
-            return false;
-        }
-    }
-
-    core.EventApi.prototype.getResources = function () {
-        var calendar = this._calendar;
-        return this._def.resourceIds.map(function (resourceId) {
-            return calendar.getResourceById(resourceId);
-        });
-    };
-    core.EventApi.prototype.setResources = function (resources) {
-        var resourceIds = [];
-        // massage resources -> resourceIds
-        for (var _i = 0, resources_1 = resources; _i < resources_1.length; _i++) {
-            var resource = resources_1[_i];
-            var resourceId = null;
-            if (typeof resource === 'string') {
-                resourceId = resource;
-            }
-            else if (typeof resource === 'number') {
-                resourceId = String(resource);
-            }
-            else if (resource instanceof ResourceApi) {
-                resourceId = resource.id; // guaranteed to always have an ID. hmmm
-            }
-            else {
-                console.warn('unknown resource type: ' + resource);
-            }
-            if (resourceId) {
-                resourceIds.push(resourceId);
-            }
-        }
-        this.mutate({
-            standardProps: {
-                resourceIds: resourceIds
-            }
-        });
-    };
-
-    var RELEASE_DATE = '2019-08-10'; // for Scheduler
-    var UPGRADE_WINDOW = 365 + 7; // days. 1 week leeway, for tz shift reasons too
-    var LICENSE_INFO_URL = 'http://fullcalendar.io/scheduler/license/';
-    var PRESET_LICENSE_KEYS = [
-        'GPL-My-Project-Is-Open-Source',
-        'CC-Attribution-NonCommercial-NoDerivatives'
-    ];
-    var CSS = {
-        position: 'absolute',
-        'z-index': 99999,
-        bottom: '1px',
-        left: '1px',
-        background: '#eee',
-        'border-color': '#ddd',
-        'border-style': 'solid',
-        'border-width': '1px 1px 0 0',
-        padding: '2px 4px',
-        'font-size': '12px',
-        'border-top-right-radius': '3px'
-    };
-    function injectLicenseWarning(containerEl, calendar) {
-        var key = calendar.opt('schedulerLicenseKey');
-        if (!isImmuneUrl(window.location.href) && !isValidKey(key)) {
-            core.appendToElement(containerEl, '<div class="fc-license-message" style="' + core.htmlEscape(core.cssToStr(CSS)) + '">' +
-                'Please use a valid license key. <a href="' + LICENSE_INFO_URL + '">More Info</a>' +
-                '</div>');
-        }
-    }
-    /*
-    This decryption is not meant to be bulletproof. Just a way to remind about an upgrade.
-    */
-    function isValidKey(key) {
-        if (PRESET_LICENSE_KEYS.indexOf(key) !== -1) {
-            return true;
-        }
-        var parts = (key || '').match(/^(\d+)\-fcs\-(\d+)$/);
-        if (parts && (parts[1].length === 10)) {
-            var purchaseDate = new Date(parseInt(parts[2], 10) * 1000);
-            var releaseDate = new Date(core.config.mockSchedulerReleaseDate || RELEASE_DATE);
-            if (core.isValidDate(releaseDate)) { // token won't be replaced in dev mode
-                var minPurchaseDate = core.addDays(releaseDate, -UPGRADE_WINDOW);
-                if (minPurchaseDate < purchaseDate) {
-                    return true;
-                }
-            }
-        }
-        return false;
-    }
-    function isImmuneUrl(url) {
-        return /\w+\:\/\/fullcalendar\.io\/|\/examples\/[\w-]+\.html$/.test(url);
-    }
-
-    var optionChangeHandlers = {
-        resources: handleResources
-    };
-    function handleResources(newSourceInput, calendar, deepEqual) {
-        var oldSourceInput = calendar.state.resourceSource._raw;
-        if (!deepEqual(oldSourceInput, newSourceInput)) {
-            calendar.dispatch({
-                type: 'RESET_RESOURCE_SOURCE',
-                resourceSourceInput: newSourceInput
-            });
-        }
-    }
-
-    registerResourceSourceDef({
-        ignoreRange: true,
-        parseMeta: function (raw) {
-            if (Array.isArray(raw)) {
-                return raw;
-            }
-            else if (Array.isArray(raw.resources)) {
-                return raw.resources;
-            }
-            return null;
-        },
-        fetch: function (arg, successCallback) {
-            successCallback({
-                rawResources: arg.resourceSource.meta
-            });
-        }
-    });
-
-    registerResourceSourceDef({
-        parseMeta: function (raw) {
-            if (typeof raw === 'function') {
-                return raw;
-            }
-            else if (typeof raw.resources === 'function') {
-                return raw.resources;
-            }
-            return null;
-        },
-        fetch: function (arg, success, failure) {
-            var dateEnv = arg.calendar.dateEnv;
-            var func = arg.resourceSource.meta;
-            var publicArg = {};
-            if (arg.range) {
-                publicArg = {
-                    start: dateEnv.toDate(arg.range.start),
-                    end: dateEnv.toDate(arg.range.end),
-                    startStr: dateEnv.formatIso(arg.range.start),
-                    endStr: dateEnv.formatIso(arg.range.end),
-                    timeZone: dateEnv.timeZone
-                };
-            }
-            // TODO: make more dry with EventSourceFunc
-            // TODO: accept a response?
-            core.unpromisify(func.bind(null, publicArg), function (rawResources) {
-                success({ rawResources: rawResources }); // needs an object response
-            }, failure // send errorObj directly to failure callback
-            );
-        }
-    });
-
-    registerResourceSourceDef({
-        parseMeta: function (raw) {
-            if (typeof raw === 'string') {
-                raw = { url: raw };
-            }
-            else if (!raw || typeof raw !== 'object' || !raw.url) {
-                return null;
-            }
-            return {
-                url: raw.url,
-                method: (raw.method || 'GET').toUpperCase(),
-                extraParams: raw.extraParams
-            };
-        },
-        fetch: function (arg, successCallback, failureCallback) {
-            var meta = arg.resourceSource.meta;
-            var requestParams = buildRequestParams(meta, arg.range, arg.calendar);
-            core.requestJson(meta.method, meta.url, requestParams, function (rawResources, xhr) {
-                successCallback({ rawResources: rawResources, xhr: xhr });
-            }, function (message, xhr) {
-                failureCallback({ message: message, xhr: xhr });
-            });
-        }
-    });
-    // TODO: somehow consolidate with event json feed
-    function buildRequestParams(meta, range, calendar) {
-        var dateEnv = calendar.dateEnv;
-        var startParam;
-        var endParam;
-        var timeZoneParam;
-        var customRequestParams;
-        var params = {};
-        if (range) {
-            // startParam = meta.startParam
-            // if (startParam == null) {
-            startParam = calendar.opt('startParam');
-            // }
-            // endParam = meta.endParam
-            // if (endParam == null) {
-            endParam = calendar.opt('endParam');
-            // }
-            // timeZoneParam = meta.timeZoneParam
-            // if (timeZoneParam == null) {
-            timeZoneParam = calendar.opt('timeZoneParam');
-            // }
-            params[startParam] = dateEnv.formatIso(range.start);
-            params[endParam] = dateEnv.formatIso(range.end);
-            if (dateEnv.timeZone !== 'local') {
-                params[timeZoneParam] = dateEnv.timeZone;
-            }
-        }
-        // retrieve any outbound GET/POST data from the options
-        if (typeof meta.extraParams === 'function') {
-            // supplied as a function that returns a key/value object
-            customRequestParams = meta.extraParams();
-        }
-        else {
-            // probably supplied as a straight key/value object
-            customRequestParams = meta.extraParams || {};
-        }
-        __assign(params, customRequestParams);
-        return params;
-    }
-
-    function buildResourceTextFunc(resourceTextSetting, calendar) {
-        if (typeof resourceTextSetting === 'function') {
-            return function (resource) {
-                return resourceTextSetting(new ResourceApi(calendar, resource));
-            };
-        }
-        else {
-            return function (resource) {
-                return resource.title || getPublicId(resource.id);
-            };
-        }
-    }
-
-    var ResourceDayHeader = /** @class */ (function (_super) {
-        __extends(ResourceDayHeader, _super);
-        function ResourceDayHeader(context, parentEl) {
-            var _this = _super.call(this, context) || this;
-            _this.datesAboveResources = _this.opt('datesAboveResources');
-            _this.resourceTextFunc = buildResourceTextFunc(_this.opt('resourceText'), _this.calendar);
-            parentEl.innerHTML = ''; // because might be nbsp
-            parentEl.appendChild(_this.el = core.htmlToElement('<div class="fc-row ' + _this.theme.getClass('headerRow') + '">' +
-                '<table class="' + _this.theme.getClass('tableGrid') + '">' +
-                '<thead></thead>' +
-                '</table>' +
-                '</div>'));
-            _this.thead = _this.el.querySelector('thead');
-            return _this;
-        }
-        ResourceDayHeader.prototype.destroy = function () {
-            core.removeElement(this.el);
-        };
-        ResourceDayHeader.prototype.render = function (props) {
-            var html;
-            this.dateFormat = core.createFormatter(this.opt('columnHeaderFormat') ||
-                core.computeFallbackHeaderFormat(props.datesRepDistinctDays, props.dates.length));
-            if (props.dates.length === 1) {
-                html = this.renderResourceRow(props.resources);
-            }
-            else {
-                if (this.datesAboveResources) {
-                    html = this.renderDayAndResourceRows(props.dates, props.resources);
-                }
-                else {
-                    html = this.renderResourceAndDayRows(props.resources, props.dates);
-                }
-            }
-            this.thead.innerHTML = html;
-            this.processResourceEls(props.resources);
-        };
-        ResourceDayHeader.prototype.renderResourceRow = function (resources) {
-            var _this = this;
-            var cellHtmls = resources.map(function (resource) {
-                return _this.renderResourceCell(resource, 1);
-            });
-            return this.buildTr(cellHtmls);
-        };
-        ResourceDayHeader.prototype.renderDayAndResourceRows = function (dates, resources) {
-            var dateHtmls = [];
-            var resourceHtmls = [];
-            for (var _i = 0, dates_1 = dates; _i < dates_1.length; _i++) {
-                var date = dates_1[_i];
-                dateHtmls.push(this.renderDateCell(date, resources.length));
-                for (var _a = 0, resources_1 = resources; _a < resources_1.length; _a++) {
-                    var resource = resources_1[_a];
-                    resourceHtmls.push(this.renderResourceCell(resource, 1, date));
-                }
-            }
-            return this.buildTr(dateHtmls) +
-                this.buildTr(resourceHtmls);
-        };
-        ResourceDayHeader.prototype.renderResourceAndDayRows = function (resources, dates) {
-            var resourceHtmls = [];
-            var dateHtmls = [];
-            for (var _i = 0, resources_2 = resources; _i < resources_2.length; _i++) {
-                var resource = resources_2[_i];
-                resourceHtmls.push(this.renderResourceCell(resource, dates.length));
-                for (var _a = 0, dates_2 = dates; _a < dates_2.length; _a++) {
-                    var date = dates_2[_a];
-                    dateHtmls.push(this.renderDateCell(date, 1, resource));
-                }
-            }
-            return this.buildTr(resourceHtmls) +
-                this.buildTr(dateHtmls);
-        };
-        // Cell Rendering Utils
-        // ----------------------------------------------------------------------------------------------
-        // a cell with the resource name. might be associated with a specific day
-        ResourceDayHeader.prototype.renderResourceCell = function (resource, colspan, date) {
-            var dateEnv = this.dateEnv;
-            return '<th class="fc-resource-cell"' +
-                ' data-resource-id="' + resource.id + '"' +
-                (date ?
-                    ' data-date="' + dateEnv.formatIso(date, { omitTime: true }) + '"' :
-                    '') +
-                (colspan > 1 ?
-                    ' colspan="' + colspan + '"' :
-                    '') +
-                '>' +
-                core.htmlEscape(this.resourceTextFunc(resource)) +
-                '</th>';
-        };
-        // a cell with date text. might have a resource associated with it
-        ResourceDayHeader.prototype.renderDateCell = function (date, colspan, resource) {
-            var props = this.props;
-            return core.renderDateCell(date, props.dateProfile, props.datesRepDistinctDays, props.dates.length * props.resources.length, this.dateFormat, this.context, colspan, resource ? 'data-resource-id="' + resource.id + '"' : '');
-        };
-        ResourceDayHeader.prototype.buildTr = function (cellHtmls) {
-            if (!cellHtmls.length) {
-                cellHtmls = ['<td>&nbsp;</td>'];
-            }
-            if (this.props.renderIntroHtml) {
-                cellHtmls = [this.props.renderIntroHtml()].concat(cellHtmls);
-            }
-            if (this.isRtl) {
-                cellHtmls.reverse();
-            }
-            return '<tr>' +
-                cellHtmls.join('') +
-                '</tr>';
-        };
-        // Post-rendering
-        // ----------------------------------------------------------------------------------------------
-        // given a container with already rendered resource cells
-        ResourceDayHeader.prototype.processResourceEls = function (resources) {
-            var _this = this;
-            var view = this.view;
-            core.findElements(this.thead, '.fc-resource-cell').forEach(function (node, col) {
-                col = col % resources.length;
-                if (_this.isRtl) {
-                    col = resources.length - 1 - col;
-                }
-                var resource = resources[col];
-                view.publiclyTrigger('resourceRender', [
-                    {
-                        resource: new ResourceApi(_this.calendar, resource),
-                        el: node,
-                        view: view
-                    }
-                ]);
-            });
-        };
-        return ResourceDayHeader;
-    }(core.Component));
-
-    var AbstractResourceDayTable = /** @class */ (function () {
-        function AbstractResourceDayTable(dayTable, resources) {
-            this.dayTable = dayTable;
-            this.resources = resources;
-            this.resourceIndex = new ResourceIndex(resources);
-            this.rowCnt = dayTable.rowCnt;
-            this.colCnt = dayTable.colCnt * resources.length;
-            this.cells = this.buildCells();
-        }
-        AbstractResourceDayTable.prototype.buildCells = function () {
-            var _a = this, rowCnt = _a.rowCnt, dayTable = _a.dayTable, resources = _a.resources;
-            var rows = [];
-            for (var row = 0; row < rowCnt; row++) {
-                var rowCells = [];
-                for (var dateCol = 0; dateCol < dayTable.colCnt; dateCol++) {
-                    for (var resourceCol = 0; resourceCol < resources.length; resourceCol++) {
-                        var resource = resources[resourceCol];
-                        var htmlAttrs = 'data-resource-id="' + resource.id + '"';
-                        rowCells[this.computeCol(dateCol, resourceCol)] = {
-                            date: dayTable.cells[row][dateCol].date,
-                            resource: resource,
-                            htmlAttrs: htmlAttrs
-                        };
-                    }
-                }
-                rows.push(rowCells);
-            }
-            return rows;
-        };
-        return AbstractResourceDayTable;
-    }());
-    /*
-    resources over dates
-    */
-    var ResourceDayTable = /** @class */ (function (_super) {
-        __extends(ResourceDayTable, _super);
-        function ResourceDayTable() {
-            return _super !== null && _super.apply(this, arguments) || this;
-        }
-        ResourceDayTable.prototype.computeCol = function (dateI, resourceI) {
-            return resourceI * this.dayTable.colCnt + dateI;
-        };
-        /*
-        all date ranges are intact
-        */
-        ResourceDayTable.prototype.computeColRanges = function (dateStartI, dateEndI, resourceI) {
-            return [
-                {
-                    firstCol: this.computeCol(dateStartI, resourceI),
-                    lastCol: this.computeCol(dateEndI, resourceI),
-                    isStart: true,
-                    isEnd: true
-                }
-            ];
-        };
-        return ResourceDayTable;
-    }(AbstractResourceDayTable));
-    /*
-    dates over resources
-    */
-    var DayResourceTable = /** @class */ (function (_super) {
-        __extends(DayResourceTable, _super);
-        function DayResourceTable() {
-            return _super !== null && _super.apply(this, arguments) || this;
-        }
-        DayResourceTable.prototype.computeCol = function (dateI, resourceI) {
-            return dateI * this.resources.length + resourceI;
-        };
-        /*
-        every single day is broken up
-        */
-        DayResourceTable.prototype.computeColRanges = function (dateStartI, dateEndI, resourceI) {
-            var segs = [];
-            for (var i = dateStartI; i <= dateEndI; i++) {
-                var col = this.computeCol(i, resourceI);
-                segs.push({
-                    firstCol: col,
-                    lastCol: col,
-                    isStart: i === dateStartI,
-                    isEnd: i === dateEndI
-                });
-            }
-            return segs;
-        };
-        return DayResourceTable;
-    }(AbstractResourceDayTable));
-    var ResourceIndex = /** @class */ (function () {
-        function ResourceIndex(resources) {
-            var indicesById = {};
-            var ids = [];
-            for (var i = 0; i < resources.length; i++) {
-                var id = resources[i].id;
-                ids.push(id);
-                indicesById[id] = i;
-            }
-            this.ids = ids;
-            this.indicesById = indicesById;
-            this.length = resources.length;
-        }
-        return ResourceIndex;
-    }());
-    /*
-    TODO: just use ResourceHash somehow? could then use the generic ResourceSplitter
-    */
-    var VResourceSplitter = /** @class */ (function (_super) {
-        __extends(VResourceSplitter, _super);
-        function VResourceSplitter() {
-            return _super !== null && _super.apply(this, arguments) || this;
-        }
-        VResourceSplitter.prototype.getKeyInfo = function (props) {
-            var resourceDayTable = props.resourceDayTable;
-            var hash = core.mapHash(resourceDayTable.resourceIndex.indicesById, function (i) {
-                return resourceDayTable.resources[i]; // has `ui` AND `businessHours` keys!
-            }); // :(
-            hash[''] = {};
-            return hash;
-        };
-        VResourceSplitter.prototype.getKeysForDateSpan = function (dateSpan) {
-            return [dateSpan.resourceId || ''];
-        };
-        VResourceSplitter.prototype.getKeysForEventDef = function (eventDef) {
-            var resourceIds = eventDef.resourceIds;
-            if (!resourceIds.length) {
-                return [''];
-            }
-            return resourceIds;
-        };
-        return VResourceSplitter;
-    }(core.Splitter));
-    // joiner
-    var NO_SEGS = []; // for memoizing
-    var VResourceJoiner = /** @class */ (function () {
-        function VResourceJoiner() {
-            this.joinDateSelection = core.memoize(this.joinSegs);
-            this.joinBusinessHours = core.memoize(this.joinSegs);
-            this.joinFgEvents = core.memoize(this.joinSegs);
-            this.joinBgEvents = core.memoize(this.joinSegs);
-            this.joinEventDrags = core.memoize(this.joinInteractions);
-            this.joinEventResizes = core.memoize(this.joinInteractions);
-        }
-        /*
-        propSets also has a '' key for things with no resource
-        */
-        VResourceJoiner.prototype.joinProps = function (propSets, resourceDayTable) {
-            var dateSelectionSets = [];
-            var businessHoursSets = [];
-            var fgEventSets = [];
-            var bgEventSets = [];
-            var eventDrags = [];
-            var eventResizes = [];
-            var eventSelection = '';
-            var keys = resourceDayTable.resourceIndex.ids.concat(['']); // add in the all-resource key
-            for (var _i = 0, keys_1 = keys; _i < keys_1.length; _i++) {
-                var key = keys_1[_i];
-                var props = propSets[key];
-                dateSelectionSets.push(props.dateSelectionSegs);
-                businessHoursSets.push(key ? props.businessHourSegs : NO_SEGS); // don't include redundant all-resource businesshours
-                fgEventSets.push(key ? props.fgEventSegs : NO_SEGS); // don't include fg all-resource segs
-                bgEventSets.push(props.bgEventSegs);
-                eventDrags.push(props.eventDrag);
-                eventResizes.push(props.eventResize);
-                eventSelection = eventSelection || props.eventSelection;
-            }
-            return {
-                dateSelectionSegs: this.joinDateSelection.apply(this, [resourceDayTable].concat(dateSelectionSets)),
-                businessHourSegs: this.joinBusinessHours.apply(this, [resourceDayTable].concat(businessHoursSets)),
-                fgEventSegs: this.joinFgEvents.apply(this, [resourceDayTable].concat(fgEventSets)),
-                bgEventSegs: this.joinBgEvents.apply(this, [resourceDayTable].concat(bgEventSets)),
-                eventDrag: this.joinEventDrags.apply(this, [resourceDayTable].concat(eventDrags)),
-                eventResize: this.joinEventResizes.apply(this, [resourceDayTable].concat(eventResizes)),
-                eventSelection: eventSelection
-            };
-        };
-        VResourceJoiner.prototype.joinSegs = function (resourceDayTable) {
-            var segGroups = [];
-            for (var _i = 1; _i < arguments.length; _i++) {
-                segGroups[_i - 1] = arguments[_i];
-            }
-            var resourceCnt = resourceDayTable.resources.length;
-            var transformedSegs = [];
-            for (var i = 0; i < resourceCnt; i++) {
-                for (var _a = 0, _b = segGroups[i]; _a < _b.length; _a++) {
-                    var seg = _b[_a];
-                    transformedSegs.push.apply(transformedSegs, this.transformSeg(seg, resourceDayTable, i));
-                }
-                for (var _c = 0, _d = segGroups[resourceCnt]; _c < _d.length; _c++) { // one beyond. the all-resource
-                    var seg = _d[_c];
-                    transformedSegs.push.apply(// one beyond. the all-resource
-                    transformedSegs, this.transformSeg(seg, resourceDayTable, i));
-                }
-            }
-            return transformedSegs;
-        };
-        /*
-        for expanding non-resource segs to all resources.
-        only for public use.
-        no memoizing.
-        */
-        VResourceJoiner.prototype.expandSegs = function (resourceDayTable, segs) {
-            var resourceCnt = resourceDayTable.resources.length;
-            var transformedSegs = [];
-            for (var i = 0; i < resourceCnt; i++) {
-                for (var _i = 0, segs_1 = segs; _i < segs_1.length; _i++) {
-                    var seg = segs_1[_i];
-                    transformedSegs.push.apply(transformedSegs, this.transformSeg(seg, resourceDayTable, i));
-                }
-            }
-            return transformedSegs;
-        };
-        VResourceJoiner.prototype.joinInteractions = function (resourceDayTable) {
-            var interactions = [];
-            for (var _i = 1; _i < arguments.length; _i++) {
-                interactions[_i - 1] = arguments[_i];
-            }
-            var resourceCnt = resourceDayTable.resources.length;
-            var affectedInstances = {};
-            var transformedSegs = [];
-            var isEvent = false;
-            var sourceSeg = null;
-            for (var i = 0; i < resourceCnt; i++) {
-                var interaction = interactions[i];
-                if (interaction) {
-                    for (var _a = 0, _b = interaction.segs; _a < _b.length; _a++) {
-                        var seg = _b[_a];
-                        transformedSegs.push.apply(transformedSegs, this.transformSeg(seg, resourceDayTable, i) // TODO: templateify Interaction::segs
-                        );
-                    }
-                    __assign(affectedInstances, interaction.affectedInstances);
-                    isEvent = isEvent || interaction.isEvent;
-                    sourceSeg = sourceSeg || interaction.sourceSeg;
-                }
-                if (interactions[resourceCnt]) { // one beyond. the all-resource
-                    for (var _c = 0, _d = interactions[resourceCnt].segs; _c < _d.length; _c++) {
-                        var seg = _d[_c];
-                        transformedSegs.push.apply(transformedSegs, this.transformSeg(seg, resourceDayTable, i) // TODO: templateify Interaction::segs
-                        );
-                    }
-                }
-            }
-            return {
-                affectedInstances: affectedInstances,
-                segs: transformedSegs,
-                isEvent: isEvent,
-                sourceSeg: sourceSeg
-            };
-        };
-        return VResourceJoiner;
-    }());
-
-    /*
-    doesn't accept grouping
-    */
-    function flattenResources(resourceStore, orderSpecs) {
-        return buildRowNodes(resourceStore, [], orderSpecs, false, {}, true)
-            .map(function (node) {
-            return node.resource;
-        });
-    }
-    function buildRowNodes(resourceStore, groupSpecs, orderSpecs, isVGrouping, expansions, expansionDefault) {
-        var complexNodes = buildHierarchy(resourceStore, isVGrouping ? -1 : 1, groupSpecs, orderSpecs);
-        var flatNodes = [];
-        flattenNodes(complexNodes, flatNodes, isVGrouping, [], 0, expansions, expansionDefault);
-        return flatNodes;
-    }
-    function flattenNodes(complexNodes, res, isVGrouping, rowSpans, depth, expansions, expansionDefault) {
-        for (var i = 0; i < complexNodes.length; i++) {
-            var complexNode = complexNodes[i];
-            var group = complexNode.group;
-            if (group) {
-                if (isVGrouping) {
-                    var firstRowIndex = res.length;
-                    var rowSpanIndex = rowSpans.length;
-                    flattenNodes(complexNode.children, res, isVGrouping, rowSpans.concat(0), depth, expansions, expansionDefault);
-                    if (firstRowIndex < res.length) {
-                        var firstRow = res[firstRowIndex];
-                        var firstRowSpans = firstRow.rowSpans = firstRow.rowSpans.slice();
-                        firstRowSpans[rowSpanIndex] = res.length - firstRowIndex;
-                    }
-                }
-                else {
-                    var id = group.spec.field + ':' + group.value;
-                    var isExpanded = expansions[id] != null ? expansions[id] : expansionDefault;
-                    res.push({ id: id, group: group, isExpanded: isExpanded });
-                    if (isExpanded) {
-                        flattenNodes(complexNode.children, res, isVGrouping, rowSpans, depth + 1, expansions, expansionDefault);
-                    }
-                }
-            }
-            else if (complexNode.resource) {
-                var id = complexNode.resource.id;
-                var isExpanded = expansions[id] != null ? expansions[id] : expansionDefault;
-                res.push({
-                    id: id,
-                    rowSpans: rowSpans,
-                    depth: depth,
-                    isExpanded: isExpanded,
-                    hasChildren: Boolean(complexNode.children.length),
-                    resource: complexNode.resource,
-                    resourceFields: complexNode.resourceFields
-                });
-                if (isExpanded) {
-                    flattenNodes(complexNode.children, res, isVGrouping, rowSpans, depth + 1, expansions, expansionDefault);
-                }
-            }
-        }
-    }
-    function buildHierarchy(resourceStore, maxDepth, groupSpecs, orderSpecs) {
-        var resourceNodes = buildResourceNodes(resourceStore, orderSpecs);
-        var builtNodes = [];
-        for (var resourceId in resourceNodes) {
-            var resourceNode = resourceNodes[resourceId];
-            if (!resourceNode.resource.parentId) {
-                insertResourceNode(resourceNode, builtNodes, groupSpecs, 0, maxDepth, orderSpecs);
-            }
-        }
-        return builtNodes;
-    }
-    function buildResourceNodes(resourceStore, orderSpecs) {
-        var nodeHash = {};
-        for (var resourceId in resourceStore) {
-            var resource = resourceStore[resourceId];
-            nodeHash[resourceId] = {
-                resource: resource,
-                resourceFields: buildResourceFields(resource),
-                children: []
-            };
-        }
-        for (var resourceId in resourceStore) {
-            var resource = resourceStore[resourceId];
-            if (resource.parentId) {
-                var parentNode = nodeHash[resource.parentId];
-                if (parentNode) {
-                    insertResourceNodeInSiblings(nodeHash[resourceId], parentNode.children, orderSpecs);
-                }
-            }
-        }
-        return nodeHash;
-    }
-    function insertResourceNode(resourceNode, nodes, groupSpecs, depth, maxDepth, orderSpecs) {
-        if (groupSpecs.length && (maxDepth === -1 || depth <= maxDepth)) {
-            var groupNode = ensureGroupNodes(resourceNode, nodes, groupSpecs[0]);
-            insertResourceNode(resourceNode, groupNode.children, groupSpecs.slice(1), depth + 1, maxDepth, orderSpecs);
-        }
-        else {
-            insertResourceNodeInSiblings(resourceNode, nodes, orderSpecs);
-        }
-    }
-    function ensureGroupNodes(resourceNode, nodes, groupSpec) {
-        var groupValue = resourceNode.resourceFields[groupSpec.field];
-        var groupNode;
-        var newGroupIndex;
-        // find an existing group that matches, or determine the position for a new group
-        if (groupSpec.order) {
-            for (newGroupIndex = 0; newGroupIndex < nodes.length; newGroupIndex++) {
-                var node = nodes[newGroupIndex];
-                if (node.group) {
-                    var cmp = core.flexibleCompare(groupValue, node.group.value) * groupSpec.order;
-                    if (cmp === 0) {
-                        groupNode = node;
-                        break;
-                    }
-                    else if (cmp < 0) {
-                        break;
-                    }
-                }
-            }
-        }
-        else { // the groups are unordered
-            for (newGroupIndex = 0; newGroupIndex < nodes.length; newGroupIndex++) {
-                var node = nodes[newGroupIndex];
-                if (node.group && groupValue === node.group.value) {
-                    groupNode = node;
-                    break;
-                }
-            }
-        }
-        if (!groupNode) {
-            groupNode = {
-                group: {
-                    value: groupValue,
-                    spec: groupSpec
-                },
-                children: []
-            };
-            nodes.splice(newGroupIndex, 0, groupNode);
-        }
-        return groupNode;
-    }
-    function insertResourceNodeInSiblings(resourceNode, siblings, orderSpecs) {
-        var i;
-        for (i = 0; i < siblings.length; i++) {
-            var cmp = core.compareByFieldSpecs(siblings[i].resourceFields, resourceNode.resourceFields, orderSpecs);
-            if (cmp > 0) { // went 1 past. insert at i
-                break;
-            }
-        }
-        siblings.splice(i, 0, resourceNode);
-    }
-    function buildResourceFields(resource) {
-        var obj = __assign({}, resource.extendedProps, resource.ui, resource);
-        delete obj.ui;
-        delete obj.extendedProps;
-        return obj;
-    }
-    function isGroupsEqual(group0, group1) {
-        return group0.spec === group1.spec && group0.value === group1.value;
-    }
-
-    var main = core.createPlugin({
-        reducers: [resourcesReducers],
-        eventDefParsers: [parseEventDef],
-        isDraggableTransformers: [transformIsDraggable],
-        eventDragMutationMassagers: [massageEventDragMutation],
-        eventDefMutationAppliers: [applyEventDefMutation],
-        dateSelectionTransformers: [transformDateSelectionJoin],
-        datePointTransforms: [transformDatePoint],
-        dateSpanTransforms: [transformDateSpan],
-        viewPropsTransformers: [ResourceDataAdder, ResourceEventConfigAdder],
-        isPropsValid: isPropsValidWithResources,
-        externalDefTransforms: [transformExternalDef],
-        eventResizeJoinTransforms: [transformEventResizeJoin],
-        viewContainerModifiers: [injectLicenseWarning],
-        eventDropTransformers: [transformEventDrop],
-        optionChangeHandlers: optionChangeHandlers
-    });
-
-    exports.AbstractResourceDayTable = AbstractResourceDayTable;
-    exports.DayResourceTable = DayResourceTable;
-    exports.ResourceApi = ResourceApi;
-    exports.ResourceDayHeader = ResourceDayHeader;
-    exports.ResourceDayTable = ResourceDayTable;
-    exports.ResourceSplitter = ResourceSplitter;
-    exports.VResourceJoiner = VResourceJoiner;
-    exports.VResourceSplitter = VResourceSplitter;
-    exports.buildResourceFields = buildResourceFields;
-    exports.buildResourceTextFunc = buildResourceTextFunc;
-    exports.buildRowNodes = buildRowNodes;
-    exports.default = main;
-    exports.flattenResources = flattenResources;
-    exports.isGroupsEqual = isGroupsEqual;
-
-    Object.defineProperty(exports, '__esModule', { value: true });
-
-}));
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/resource-common/main.min.js b/AKPlan/static/AKPlan/vendor/fullcalendar/resource-common/main.min.js
deleted file mode 100644
index a3a3cb8a49d5660cd5e245374f60d2b83e20f6fc..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/resource-common/main.min.js
+++ /dev/null
@@ -1,6 +0,0 @@
-/*!
-FullCalendar Resources Common Plugin v4.3.1
-Docs & License: https://fullcalendar.io/scheduler
-(c) 2019 Adam Shaw
-*/
-!function(e,r){"object"==typeof exports&&"undefined"!=typeof module?r(exports,require("@fullcalendar/core")):"function"==typeof define&&define.amd?define(["exports","@fullcalendar/core"],r):r((e=e||self).FullCalendarResourceCommon={},e.FullCalendar)}(this,function(e,r){"use strict";var t=function(e,r){return(t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,r){e.__proto__=r}||function(e,r){for(var t in r)r.hasOwnProperty(t)&&(e[t]=r[t])})(e,r)};function n(e,r){function n(){this.constructor=e}t(e,r),e.prototype=null===r?Object.create(r):(n.prototype=r.prototype,new n)}var o=function(){return(o=Object.assign||function(e){for(var r,t=1,n=arguments.length;t<n;t++)for(var o in r=arguments[t])Object.prototype.hasOwnProperty.call(r,o)&&(e[o]=r[o]);return e}).apply(this,arguments)};function s(e,r){var t=e.resourceEditable;if(null==t){var n=e.sourceId&&r.state.eventSources[e.sourceId];n&&(t=n.extendedProps.resourceEditable),null==t&&null==(t=r.opt("eventResourceEditable"))&&(t=r.opt("editable"))}return t}var u=function(){function e(){this.filterResources=r.memoize(i)}return e.prototype.transform=function(e,r,t,n){if(r.class.needsResourceData)return{resourceStore:this.filterResources(t.resourceStore,n.opt("filterResourcesWithEvents"),t.eventStore,t.dateProfile.activeRange),resourceEntityExpansions:t.resourceEntityExpansions}},e}();function i(e,t,n,s){if(t){var u=function(e,r){var t={};for(var n in e)for(var o=e[n],s=0,u=r[o.defId].resourceIds;s<u.length;s++){var i=u[s];t[i]=!0}return t}(function(e,t){return r.filterHash(e,function(e){return r.rangesIntersect(e.range,t)})}(n.instances,s),n.defs);return o(u,function(e,r){var t={};for(var n in e)for(var o=void 0;(o=r[n])&&(n=o.parentId);)t[n]=!0;return t}(u,e)),r.filterHash(e,function(e,r){return u[r]})}return e}var a=function(){function e(){this.buildResourceEventUis=r.memoizeOutput(c,r.isPropsEqual),this.injectResourceEventUis=r.memoize(l)}return e.prototype.transform=function(e,r,t){if(!r.class.needsResourceData)return{eventUiBases:this.injectResourceEventUis(e.eventUiBases,e.eventStore.defs,this.buildResourceEventUis(t.resourceStore))}},e}();function c(e){return r.mapHash(e,function(e){return e.ui})}function l(e,t,n){return r.mapHash(e,function(e,o){return o?function(e,t,n){for(var o=[],s=0,u=t.resourceIds;s<u.length;s++){var i=u[s];n[i]&&o.unshift(n[i])}return o.unshift(e),r.combineEventUis(o)}(e,t[o],n):e})}var d={id:String},f=[],p=0;function h(e){f.push(e)}function v(e,t,n){var o=r.refineProps(e,d);return o.sourceId=String(p++),o.sourceDefId=n,o.meta=t,o.publicId=o.id,o.isFetching=!1,o.latestFetchId="",o.fetchRange=null,delete o.id,o}function g(e,t,n,s){switch(t.type){case"INIT":return y(s.opt("resources"),s);case"RESET_RESOURCE_SOURCE":return y(t.resourceSourceInput,s,!0);case"PREV":case"NEXT":case"SET_DATE":case"SET_VIEW_TYPE":return function(e,t,n){return!n.opt("refetchResourcesOnNavigate")||function(e){return Boolean(f[e.sourceDefId].ignoreRange)}(e)||e.fetchRange&&r.rangesEqual(e.fetchRange,t)?e:E(e,t,n)}(e,n.activeRange,s);case"RECEIVE_RESOURCES":case"RECEIVE_RESOURCE_ERROR":return function(e,r,t){if(r===e.latestFetchId)return o({},e,{isFetching:!1,fetchRange:t});return e}(e,t.fetchId,t.fetchRange);case"REFETCH_RESOURCES":return E(e,n.activeRange,s);default:return e}}var R=0;function y(e,r,t){if(e){var n=function(e){for(var r=f.length-1;r>=0;r--){var t=f[r].parseMeta(e);if(t){var n=v("object"==typeof e&&e?e:{},t,r);return n._raw=e,n}}return null}(e);return!t&&r.opt("refetchResourcesOnNavigate")||(n=E(n,null,r)),n}return null}function E(e,r,t){var n,s=(n=e.sourceDefId,f[n]),u=String(R++);return s.fetch({resourceSource:e,calendar:t,range:r},function(e){t.afterSizingTriggers._resourcesRendered=[null],t.dispatch({type:"RECEIVE_RESOURCES",fetchId:u,fetchRange:r,rawResources:e.rawResources})},function(e){t.dispatch({type:"RECEIVE_RESOURCE_ERROR",fetchId:u,fetchRange:r,error:e})}),o({},e,{isFetching:!0,latestFetchId:u})}var m={id:String,title:String,parentId:String,businessHours:null,children:null,extendedProps:null},S="_fc:",I=0;function b(e,t,n,s){void 0===t&&(t="");var u={},i=r.refineProps(e,m,{},u),a={},c=r.processScopedUiProps("event",u,s,a);if(i.id||(i.id=S+I++),i.parentId||(i.parentId=t),i.businessHours=i.businessHours?r.parseBusinessHours(i.businessHours,s):null,i.ui=c,i.extendedProps=o({},a,i.extendedProps),Object.freeze(c.classNames),Object.freeze(i.extendedProps),n[i.id]);else if(n[i.id]=i,i.children){for(var l=0,d=i.children;l<d.length;l++){b(d[l],i.id,n,s)}delete i.children}return i}function C(e,t,n,s){switch(t.type){case"INIT":return{};case"RECEIVE_RESOURCES":return function(e,r,t,n,o){if(n.latestFetchId===t){for(var s={},u=0,i=r;u<i.length;u++){var a=i[u];b(a,"",s,o)}return s}return e}(e,t.rawResources,t.fetchId,n,s);case"ADD_RESOURCE":return u=e,i=t.resourceHash,o({},u,i);case"REMOVE_RESOURCE":return function(e,r){var t=o({},e);for(var n in delete t[r],t)t[n].parentId===r&&(t[n]=o({},t[n],{parentId:""}));return t}(e,t.resourceId);case"SET_RESOURCE_PROP":return function(e,r,t,n){var s,u,i=e[r];return i?o({},e,((s={})[r]=o({},i,((u={})[t]=n,u)),s)):e}(e,t.resourceId,t.propName,t.propValue);case"RESET_RESOURCES":return r.mapHash(e,function(e){return o({},e)});default:return e}var u,i}var _={resourceId:String,resourceIds:function(e){return(e||[]).map(function(e){return String(e)})},resourceEditable:Boolean};var w=function(){function e(e,r){this._calendar=e,this._resource=r}return e.prototype.setProp=function(e,r){this._calendar.dispatch({type:"SET_RESOURCE_PROP",resourceId:this._resource.id,propName:e,propValue:r})},e.prototype.remove=function(){this._calendar.dispatch({type:"REMOVE_RESOURCE",resourceId:this._resource.id})},e.prototype.getParent=function(){var r=this._calendar,t=this._resource.parentId;return t?new e(r,r.state.resourceSource[t]):null},e.prototype.getChildren=function(){var r=this._resource.id,t=this._calendar,n=t.state.resourceStore,o=[];for(var s in n)n[s].parentId===r&&o.push(new e(t,n[s]));return o},e.prototype.getEvents=function(){var e=this._resource.id,t=this._calendar,n=t.state.eventStore,o=n.defs,s=n.instances,u=[];for(var i in s){var a=s[i],c=o[a.defId];-1!==c.resourceIds.indexOf(e)&&u.push(new r.EventApi(t,c,a))}return u},Object.defineProperty(e.prototype,"id",{get:function(){return this._resource.id},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"title",{get:function(){return this._resource.title},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"eventConstraint",{get:function(){return this._resource.ui.constraints[0]||null},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"eventOverlap",{get:function(){return this._resource.ui.overlap},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"eventAllow",{get:function(){return this._resource.ui.allows[0]||null},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"eventBackgroundColor",{get:function(){return this._resource.ui.backgroundColor},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"eventBorderColor",{get:function(){return this._resource.ui.borderColor},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"eventTextColor",{get:function(){return this._resource.ui.textColor},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"eventClassNames",{get:function(){return this._resource.ui.classNames},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"extendedProps",{get:function(){return this._resource.extendedProps},enumerable:!0,configurable:!0}),e}();r.Calendar.prototype.addResource=function(e,r){var t,n,o;return void 0===r&&(r=!0),e instanceof w?((t={})[(o=e._resource).id]=o,n=t):o=b(e,"",n={},this),r&&this.component.view.addScroll({forcedRowId:o.id}),this.dispatch({type:"ADD_RESOURCE",resourceHash:n}),new w(this,o)},r.Calendar.prototype.getResourceById=function(e){if(e=String(e),this.state.resourceStore){var r=this.state.resourceStore[e];if(r)return new w(this,r)}return null},r.Calendar.prototype.getResources=function(){var e=this.state.resourceStore,r=[];if(e)for(var t in e)r.push(new w(this,e[t]));return r},r.Calendar.prototype.getTopLevelResources=function(){var e=this.state.resourceStore,r=[];if(e)for(var t in e)e[t].parentId||r.push(new w(this,e[t]));return r},r.Calendar.prototype.rerenderResources=function(){this.dispatch({type:"RESET_RESOURCES"})},r.Calendar.prototype.refetchResources=function(){this.dispatch({type:"REFETCH_RESOURCES"})};var P=function(e){function r(){return null!==e&&e.apply(this,arguments)||this}return n(r,e),r.prototype.getKeyInfo=function(e){return o({"":{}},e.resourceStore)},r.prototype.getKeysForDateSpan=function(e){return[e.resourceId||""]},r.prototype.getKeysForEventDef=function(e){var r=e.resourceIds;return r.length?r:[""]},r}(r.Splitter);function O(e,r){return o({},r,{constraints:x(e,r.constraints)})}function x(e,r){return r.map(function(r){var t=r.defs;if(t)for(var n in t){var o=t[n].resourceIds;if(o.length&&-1===o.indexOf(e))return!1}return r})}r.EventApi.prototype.getResources=function(){var e=this._calendar;return this._def.resourceIds.map(function(r){return e.getResourceById(r)})},r.EventApi.prototype.setResources=function(e){for(var r=[],t=0,n=e;t<n.length;t++){var o=n[t],s=null;"string"==typeof o?s=o:"number"==typeof o?s=String(o):o instanceof w?s=o.id:console.warn("unknown resource type: "+o),s&&r.push(s)}this.mutate({standardProps:{resourceIds:r}})};var T="2019-08-10",D=372,j="http://fullcalendar.io/scheduler/license/",F=["GPL-My-Project-Is-Open-Source","CC-Attribution-NonCommercial-NoDerivatives"],U={position:"absolute","z-index":99999,bottom:"1px",left:"1px",background:"#eee","border-color":"#ddd","border-style":"solid","border-width":"1px 1px 0 0",padding:"2px 4px","font-size":"12px","border-top-right-radius":"3px"};var A={resources:function(e,r,t){var n=r.state.resourceSource._raw;t(n,e)||r.dispatch({type:"RESET_RESOURCE_SOURCE",resourceSourceInput:e})}};function H(e,r){return"function"==typeof e?function(t){return e(new w(r,t))}:function(e){return e.title||(0===(r=e.id).indexOf(S)?"":r);var r}}h({ignoreRange:!0,parseMeta:function(e){return Array.isArray(e)?e:Array.isArray(e.resources)?e.resources:null},fetch:function(e,r){r({rawResources:e.resourceSource.meta})}}),h({parseMeta:function(e){return"function"==typeof e?e:"function"==typeof e.resources?e.resources:null},fetch:function(e,t,n){var o=e.calendar.dateEnv,s=e.resourceSource.meta,u={};e.range&&(u={start:o.toDate(e.range.start),end:o.toDate(e.range.end),startStr:o.formatIso(e.range.start),endStr:o.formatIso(e.range.end),timeZone:o.timeZone}),r.unpromisify(s.bind(null,u),function(e){t({rawResources:e})},n)}}),h({parseMeta:function(e){if("string"==typeof e)e={url:e};else if(!e||"object"!=typeof e||!e.url)return null;return{url:e.url,method:(e.method||"GET").toUpperCase(),extraParams:e.extraParams}},fetch:function(e,t,n){var s=e.resourceSource.meta,u=function(e,r,t){var n,s,u,i,a=t.dateEnv,c={};r&&(n=t.opt("startParam"),s=t.opt("endParam"),u=t.opt("timeZoneParam"),c[n]=a.formatIso(r.start),c[s]=a.formatIso(r.end),"local"!==a.timeZone&&(c[u]=a.timeZone));i="function"==typeof e.extraParams?e.extraParams():e.extraParams||{};return o(c,i),c}(s,e.range,e.calendar);r.requestJson(s.method,s.url,u,function(e,r){t({rawResources:e,xhr:r})},function(e,r){n({message:e,xhr:r})})}});var B=function(e){function t(t,n){var o=e.call(this,t)||this;return o.datesAboveResources=o.opt("datesAboveResources"),o.resourceTextFunc=H(o.opt("resourceText"),o.calendar),n.innerHTML="",n.appendChild(o.el=r.htmlToElement('<div class="fc-row '+o.theme.getClass("headerRow")+'"><table class="'+o.theme.getClass("tableGrid")+'"><thead></thead></table></div>')),o.thead=o.el.querySelector("thead"),o}return n(t,e),t.prototype.destroy=function(){r.removeElement(this.el)},t.prototype.render=function(e){var t;this.dateFormat=r.createFormatter(this.opt("columnHeaderFormat")||r.computeFallbackHeaderFormat(e.datesRepDistinctDays,e.dates.length)),t=1===e.dates.length?this.renderResourceRow(e.resources):this.datesAboveResources?this.renderDayAndResourceRows(e.dates,e.resources):this.renderResourceAndDayRows(e.resources,e.dates),this.thead.innerHTML=t,this.processResourceEls(e.resources)},t.prototype.renderResourceRow=function(e){var r=this,t=e.map(function(e){return r.renderResourceCell(e,1)});return this.buildTr(t)},t.prototype.renderDayAndResourceRows=function(e,r){for(var t=[],n=[],o=0,s=e;o<s.length;o++){var u=s[o];t.push(this.renderDateCell(u,r.length));for(var i=0,a=r;i<a.length;i++){var c=a[i];n.push(this.renderResourceCell(c,1,u))}}return this.buildTr(t)+this.buildTr(n)},t.prototype.renderResourceAndDayRows=function(e,r){for(var t=[],n=[],o=0,s=e;o<s.length;o++){var u=s[o];t.push(this.renderResourceCell(u,r.length));for(var i=0,a=r;i<a.length;i++){var c=a[i];n.push(this.renderDateCell(c,1,u))}}return this.buildTr(t)+this.buildTr(n)},t.prototype.renderResourceCell=function(e,t,n){var o=this.dateEnv;return'<th class="fc-resource-cell" data-resource-id="'+e.id+'"'+(n?' data-date="'+o.formatIso(n,{omitTime:!0})+'"':"")+(t>1?' colspan="'+t+'"':"")+">"+r.htmlEscape(this.resourceTextFunc(e))+"</th>"},t.prototype.renderDateCell=function(e,t,n){var o=this.props;return r.renderDateCell(e,o.dateProfile,o.datesRepDistinctDays,o.dates.length*o.resources.length,this.dateFormat,this.context,t,n?'data-resource-id="'+n.id+'"':"")},t.prototype.buildTr=function(e){return e.length||(e=["<td>&nbsp;</td>"]),this.props.renderIntroHtml&&(e=[this.props.renderIntroHtml()].concat(e)),this.isRtl&&e.reverse(),"<tr>"+e.join("")+"</tr>"},t.prototype.processResourceEls=function(e){var t=this,n=this.view;r.findElements(this.thead,".fc-resource-cell").forEach(function(r,o){o%=e.length,t.isRtl&&(o=e.length-1-o);var s=e[o];n.publiclyTrigger("resourceRender",[{resource:new w(t.calendar,s),el:r,view:n}])})},t}(r.Component),z=function(){function e(e,r){this.dayTable=e,this.resources=r,this.resourceIndex=new V(r),this.rowCnt=e.rowCnt,this.colCnt=e.colCnt*r.length,this.cells=this.buildCells()}return e.prototype.buildCells=function(){for(var e=this.rowCnt,r=this.dayTable,t=this.resources,n=[],o=0;o<e;o++){for(var s=[],u=0;u<r.colCnt;u++)for(var i=0;i<t.length;i++){var a=t[i],c='data-resource-id="'+a.id+'"';s[this.computeCol(u,i)]={date:r.cells[o][u].date,resource:a,htmlAttrs:c}}n.push(s)}return n},e}(),M=function(e){function r(){return null!==e&&e.apply(this,arguments)||this}return n(r,e),r.prototype.computeCol=function(e,r){return r*this.dayTable.colCnt+e},r.prototype.computeColRanges=function(e,r,t){return[{firstCol:this.computeCol(e,t),lastCol:this.computeCol(r,t),isStart:!0,isEnd:!0}]},r}(z),N=function(e){function r(){return null!==e&&e.apply(this,arguments)||this}return n(r,e),r.prototype.computeCol=function(e,r){return e*this.resources.length+r},r.prototype.computeColRanges=function(e,r,t){for(var n=[],o=e;o<=r;o++){var s=this.computeCol(o,t);n.push({firstCol:s,lastCol:s,isStart:o===e,isEnd:o===r})}return n},r}(z),V=function(e){for(var r={},t=[],n=0;n<e.length;n++){var o=e[n].id;t.push(o),r[o]=n}this.ids=t,this.indicesById=r,this.length=e.length},k=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.getKeyInfo=function(e){var t=e.resourceDayTable,n=r.mapHash(t.resourceIndex.indicesById,function(e){return t.resources[e]});return n[""]={},n},t.prototype.getKeysForDateSpan=function(e){return[e.resourceId||""]},t.prototype.getKeysForEventDef=function(e){var r=e.resourceIds;return r.length?r:[""]},t}(r.Splitter),K=[],q=function(){function e(){this.joinDateSelection=r.memoize(this.joinSegs),this.joinBusinessHours=r.memoize(this.joinSegs),this.joinFgEvents=r.memoize(this.joinSegs),this.joinBgEvents=r.memoize(this.joinSegs),this.joinEventDrags=r.memoize(this.joinInteractions),this.joinEventResizes=r.memoize(this.joinInteractions)}return e.prototype.joinProps=function(e,r){for(var t=[],n=[],o=[],s=[],u=[],i=[],a="",c=0,l=r.resourceIndex.ids.concat([""]);c<l.length;c++){var d=l[c],f=e[d];t.push(f.dateSelectionSegs),n.push(d?f.businessHourSegs:K),o.push(d?f.fgEventSegs:K),s.push(f.bgEventSegs),u.push(f.eventDrag),i.push(f.eventResize),a=a||f.eventSelection}return{dateSelectionSegs:this.joinDateSelection.apply(this,[r].concat(t)),businessHourSegs:this.joinBusinessHours.apply(this,[r].concat(n)),fgEventSegs:this.joinFgEvents.apply(this,[r].concat(o)),bgEventSegs:this.joinBgEvents.apply(this,[r].concat(s)),eventDrag:this.joinEventDrags.apply(this,[r].concat(u)),eventResize:this.joinEventResizes.apply(this,[r].concat(i)),eventSelection:a}},e.prototype.joinSegs=function(e){for(var r=[],t=1;t<arguments.length;t++)r[t-1]=arguments[t];for(var n=e.resources.length,o=[],s=0;s<n;s++){for(var u=0,i=r[s];u<i.length;u++){var a=i[u];o.push.apply(o,this.transformSeg(a,e,s))}for(var c=0,l=r[n];c<l.length;c++){a=l[c];o.push.apply(o,this.transformSeg(a,e,s))}}return o},e.prototype.expandSegs=function(e,r){for(var t=e.resources.length,n=[],o=0;o<t;o++)for(var s=0,u=r;s<u.length;s++){var i=u[s];n.push.apply(n,this.transformSeg(i,e,o))}return n},e.prototype.joinInteractions=function(e){for(var r=[],t=1;t<arguments.length;t++)r[t-1]=arguments[t];for(var n=e.resources.length,s={},u=[],i=!1,a=null,c=0;c<n;c++){var l=r[c];if(l){for(var d=0,f=l.segs;d<f.length;d++){var p=f[d];u.push.apply(u,this.transformSeg(p,e,c))}o(s,l.affectedInstances),i=i||l.isEvent,a=a||l.sourceSeg}if(r[n])for(var h=0,v=r[n].segs;h<v.length;h++){p=v[h];u.push.apply(u,this.transformSeg(p,e,c))}}return{affectedInstances:s,segs:u,isEvent:i,sourceSeg:a}},e}();function L(e,r,t,n,o,s){var u=[];return function e(r,t,n,o,s,u,i){for(var a=0;a<r.length;a++){var c=r[a],l=c.group;if(l)if(n){var d=t.length,f=o.length;if(e(c.children,t,n,o.concat(0),s,u,i),d<t.length){var p=t[d],h=p.rowSpans=p.rowSpans.slice();h[f]=t.length-d}}else{var v=l.spec.field+":"+l.value,g=null!=u[v]?u[v]:i;t.push({id:v,group:l,isExpanded:g}),g&&e(c.children,t,n,o,s+1,u,i)}else if(c.resource){var v=c.resource.id,g=null!=u[v]?u[v]:i;t.push({id:v,rowSpans:o,depth:s,isExpanded:g,hasChildren:Boolean(c.children.length),resource:c.resource,resourceFields:c.resourceFields}),g&&e(c.children,t,n,o,s+1,u,i)}}}(function(e,r,t,n){var o=function(e,r){var t={};for(var n in e){var o=e[n];t[n]={resource:o,resourceFields:J(o),children:[]}}for(var n in e){var o=e[n];if(o.parentId){var s=t[o.parentId];s&&G(t[n],s.children,r)}}return t}(e,n),s=[];for(var u in o){var i=o[u];i.resource.parentId||Z(i,s,t,0,r,n)}return s}(e,n?-1:1,r,t),u,n,[],0,o,s),u}function Z(e,t,n,o,s,u){n.length&&(-1===s||o<=s)?Z(e,function(e,t,n){var o,s,u=e.resourceFields[n.field];if(n.order)for(s=0;s<t.length;s++){var i=t[s];if(i.group){var a=r.flexibleCompare(u,i.group.value)*n.order;if(0===a){o=i;break}if(a<0)break}}else for(s=0;s<t.length;s++){var i=t[s];if(i.group&&u===i.group.value){o=i;break}}o||(o={group:{value:u,spec:n},children:[]},t.splice(s,0,o));return o}(e,t,n[0]).children,n.slice(1),o+1,s,u):G(e,t,u)}function G(e,t,n){var o;for(o=0;o<t.length;o++){if(r.compareByFieldSpecs(t[o].resourceFields,e.resourceFields,n)>0)break}t.splice(o,0,e)}function J(e){var r=o({},e.extendedProps,e.ui,e);return delete r.ui,delete r.extendedProps,r}var W=r.createPlugin({reducers:[function(e,r,t){var n=g(e.resourceSource,r,e.dateProfile,t),s=C(e.resourceStore,r,n,t),u=function(e,r){var t;switch(r.type){case"INIT":return{};case"SET_RESOURCE_ENTITY_EXPANDED":return o({},e,((t={})[r.id]=r.isExpanded,t));default:return e}}(e.resourceEntityExpansions,r);return o({},e,{resourceSource:n,resourceStore:s,resourceEntityExpansions:u})}],eventDefParsers:[function(e,t,n){var o=r.refineProps(t,_,{},n),s=o.resourceIds;o.resourceId&&s.push(o.resourceId),e.resourceIds=s,e.resourceEditable=o.resourceEditable}],isDraggableTransformers:[function(e,r,t,n){return!(e||!n.viewSpec.class.needsResourceData||!s(r,n.calendar))||e}],eventDragMutationMassagers:[function(e,r,t){var n=r.dateSpan.resourceId,o=t.dateSpan.resourceId;n&&o&&n!==o&&(e.resourceMutation={matchResourceId:n,setResourceId:o})}],eventDefMutationAppliers:[function(e,r,t){var n=r.resourceMutation;if(n&&s(e,t)){var o=e.resourceIds.indexOf(n.matchResourceId);if(-1!==o){var u=e.resourceIds.slice();u.splice(o,1),-1===u.indexOf(n.setResourceId)&&u.push(n.setResourceId),e.resourceIds=u}}}],dateSelectionTransformers:[function(e,r){var t=e.dateSpan.resourceId,n=r.dateSpan.resourceId;if(t&&n)return(!1!==e.component.allowAcrossResources||t===n)&&{resourceId:t}}],datePointTransforms:[function(e,r){return e.resourceId?{resource:r.getResourceById(e.resourceId)}:{}}],dateSpanTransforms:[function(e,r){return e.resourceId?{resource:r.getResourceById(e.resourceId)}:{}}],viewPropsTransformers:[u,a],isPropsValid:function(e,t){var n=(new P).splitProps(o({},e,{resourceStore:t.state.resourceStore}));for(var s in n){var u=n[s];if(s&&n[""]&&(u=o({},u,{eventStore:r.mergeEventStores(n[""].eventStore,u.eventStore),eventUiBases:o({},n[""].eventUiBases,u.eventUiBases)})),!r.isPropsValid(u,t,{resourceId:s},O.bind(null,s)))return!1}return!0},externalDefTransforms:[function(e){return e.resourceId?{resourceId:e.resourceId}:{}}],eventResizeJoinTransforms:[function(e,r){if(!1===e.component.allowAcrossResources&&e.dateSpan.resourceId!==r.dateSpan.resourceId)return!1}],viewContainerModifiers:[function(e,t){var n,o=t.opt("schedulerLicenseKey");n=window.location.href,/\w+\:\/\/fullcalendar\.io\/|\/examples\/[\w-]+\.html$/.test(n)||function(e){if(-1!==F.indexOf(e))return!0;var t=(e||"").match(/^(\d+)\-fcs\-(\d+)$/);if(t&&10===t[1].length){var n=new Date(1e3*parseInt(t[2],10)),o=new Date(r.config.mockSchedulerReleaseDate||T);if(r.isValidDate(o)){var s=r.addDays(o,-D);if(s<n)return!0}}return!1}(o)||r.appendToElement(e,'<div class="fc-license-message" style="'+r.htmlEscape(r.cssToStr(U))+'">Please use a valid license key. <a href="'+j+'">More Info</a></div>')}],eventDropTransformers:[function(e,r){var t=e.resourceMutation;return t?{oldResource:r.getResourceById(t.matchResourceId),newResource:r.getResourceById(t.setResourceId)}:{oldResource:null,newResource:null}}],optionChangeHandlers:A});e.AbstractResourceDayTable=z,e.DayResourceTable=N,e.ResourceApi=w,e.ResourceDayHeader=B,e.ResourceDayTable=M,e.ResourceSplitter=P,e.VResourceJoiner=q,e.VResourceSplitter=k,e.buildResourceFields=J,e.buildResourceTextFunc=H,e.buildRowNodes=L,e.default=W,e.flattenResources=function(e,r){return L(e,[],r,!1,{},!0).map(function(e){return e.resource})},e.isGroupsEqual=function(e,r){return e.spec===r.spec&&e.value===r.value},Object.defineProperty(e,"__esModule",{value:!0})});
\ No newline at end of file
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/resource-common/package.json b/AKPlan/static/AKPlan/vendor/fullcalendar/resource-common/package.json
deleted file mode 100644
index 0af6409e12a51f30757f91596e4b8fb6f24a0cad..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/resource-common/package.json
+++ /dev/null
@@ -1,33 +0,0 @@
-{
-  "name": "@fullcalendar/resource-common",
-  "version": "4.3.1",
-  "title": "FullCalendar Resources Common Plugin",
-  "description": "Offers base support for resources. Required for all resource-related plugins.",
-  "keywords": [
-    "calendar",
-    "event",
-    "full-sized"
-  ],
-  "homepage": "https://fullcalendar.io/scheduler",
-  "docs": "https://fullcalendar.io/docs/scheduler",
-  "bugs": "https://fullcalendar.io/reporting-bugs",
-  "repository": {
-    "type": "git",
-    "url": "https://github.com/fullcalendar/fullcalendar-scheduler.git",
-    "homepage": "https://github.com/fullcalendar/fullcalendar-scheduler"
-  },
-  "license": "SEE LICENSE IN LICENSE.md",
-  "author": {
-    "name": "Adam Shaw",
-    "email": "arshaw@arshaw.com",
-    "url": "http://arshaw.com/"
-  },
-  "copyright": "2019 Adam Shaw",
-  "peerDependencies": {
-    "@fullcalendar/core": "~4.3.0"
-  },
-  "main": "main.js",
-  "module": "main.esm.js",
-  "unpkg": "main.min.js",
-  "types": "main.d.ts"
-}
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/resource-daygrid/LICENSE.md b/AKPlan/static/AKPlan/vendor/fullcalendar/resource-daygrid/LICENSE.md
deleted file mode 100644
index 52296639f8117dd1cd8c5a9e629fed87e5b32cfc..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/resource-daygrid/LICENSE.md
+++ /dev/null
@@ -1,18 +0,0 @@
-
-For complete licensing information, visit:
-http://fullcalendar.io/scheduler/license
-
-FullCalendar Scheduler is tri-licensed, meaning you must choose
-one of three licenses to use. Here is a summary of those licenses:
-
-- Commercial License
-  (a paid license, meant for commercial use)
-  http://fullcalendar.io/scheduler/license-details
-
-- Creative Commons Non-Commercial No-Derivatives
-  (meant for trial and non-commercial use)
-  https://creativecommons.org/licenses/by-nc-nd/4.0/
-
-- GPLv3 License
-  (meant for open-source projects)
-  http://www.gnu.org/licenses/gpl-3.0.en.html
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/resource-daygrid/README.md b/AKPlan/static/AKPlan/vendor/fullcalendar/resource-daygrid/README.md
deleted file mode 100644
index c56092c0a7fbc9633ccaf0ce857410adb5d2952d..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/resource-daygrid/README.md
+++ /dev/null
@@ -1,8 +0,0 @@
-
-# FullCalendar Resource Day Grid Plugin
-
-Displays events in individual columns for days and resources
-
-[View the docs &raquo;](https://fullcalendar.io/docs/resource-daygrid-view)
-
-This package was created from the [FullCalendar monorepo &raquo;](https://github.com/fullcalendar/fullcalendar-scheduler)
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/resource-daygrid/main.d.ts b/AKPlan/static/AKPlan/vendor/fullcalendar/resource-daygrid/main.d.ts
deleted file mode 100644
index ac6d82153ed4ba26f667342bf6c53e83243b8d81..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/resource-daygrid/main.d.ts
+++ /dev/null
@@ -1,74 +0,0 @@
-// Generated by dts-bundle v0.7.3-fork.1
-// Dependencies for this module:
-//   ../../../../../@fullcalendar/core
-//   ../../../../../@fullcalendar/daygrid
-//   ../../../../../@fullcalendar/resource-common
-
-declare module '@fullcalendar/resource-daygrid' {
-    import ResourceDayGridView from '@fullcalendar/resource-daygrid/ResourceDayGridView';
-    export { ResourceDayGridView };
-    export { default as ResourceDayGrid } from '@fullcalendar/resource-daygrid/ResourceDayGrid';
-    const _default: import("@fullcalendar/core").PluginDef;
-    export default _default;
-}
-
-declare module '@fullcalendar/resource-daygrid/ResourceDayGridView' {
-    import {ComponentContext, DateProfileGenerator, ViewSpec} from '@fullcalendar/core';
-    import {AbstractDayGridView} from '@fullcalendar/daygrid';
-    import {ResourceDayHeader, ResourceViewProps} from '@fullcalendar/resource-common';
-    import ResourceDayGrid from '@fullcalendar/resource-daygrid/ResourceDayGrid';
-    export {ResourceDayGridView as default, ResourceDayGridView};
-
-    class ResourceDayGridView extends AbstractDayGridView {
-        static needsResourceData: boolean;
-        props: ResourceViewProps;
-        header: ResourceDayHeader;
-        resourceDayGrid: ResourceDayGrid;
-
-        constructor(context: ComponentContext, viewSpec: ViewSpec, dateProfileGenerator: DateProfileGenerator, parentEl: HTMLElement);
-
-        destroy(): void;
-
-        render(props: ResourceViewProps): void;
-    }
-}
-
-declare module '@fullcalendar/resource-daygrid/ResourceDayGrid' {
-    import {
-        ComponentContext,
-        DateComponent,
-        DateProfile,
-        DateSpan,
-        Duration,
-        EventInteractionState,
-        EventStore,
-        EventUiHash,
-        Hit
-    } from '@fullcalendar/core';
-    import {DayGrid} from '@fullcalendar/daygrid';
-    import {AbstractResourceDayTable} from '@fullcalendar/resource-common';
-
-    export interface ResourceDayGridProps {
-        dateProfile: DateProfile | null;
-        resourceDayTable: AbstractResourceDayTable;
-        businessHours: EventStore;
-        eventStore: EventStore;
-        eventUiBases: EventUiHash;
-        dateSelection: DateSpan | null;
-        eventSelection: string;
-        eventDrag: EventInteractionState | null;
-        eventResize: EventInteractionState | null;
-        isRigid: boolean;
-        nextDayThreshold: Duration;
-    }
-    export { ResourceDayGrid as default, ResourceDayGrid };
-    class ResourceDayGrid extends DateComponent<ResourceDayGridProps> {
-        dayGrid: DayGrid;
-        constructor(context: ComponentContext, dayGrid: DayGrid);
-        destroy(): void;
-        render(props: ResourceDayGridProps): void;
-        buildPositionCaches(): void;
-        queryHit(positionLeft: number, positionTop: number): Hit;
-    }
-}
-
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/resource-daygrid/main.esm.js b/AKPlan/static/AKPlan/vendor/fullcalendar/resource-daygrid/main.esm.js
deleted file mode 100644
index 9afb148797473b9a21ebecd051dc5a02f797c47f..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/resource-daygrid/main.esm.js
+++ /dev/null
@@ -1,210 +0,0 @@
-/*!
-FullCalendar Resource Day Grid Plugin v4.3.0
-Docs & License: https://fullcalendar.io/scheduler
-(c) 2019 Adam Shaw
-*/
-
-import {createPlugin, DateComponent, mapHash, memoize, parseFieldSpecs} from '@fullcalendar/core';
-import ResourceCommonPlugin, {
-    DayResourceTable,
-    flattenResources,
-    ResourceDayHeader,
-    ResourceDayTable,
-    VResourceJoiner,
-    VResourceSplitter
-} from '@fullcalendar/resource-common';
-import DayGridPlugin, {AbstractDayGridView, buildBasicDayTable, DayGridSlicer} from '@fullcalendar/daygrid';
-
-/*! *****************************************************************************
-Copyright (c) Microsoft Corporation. All rights reserved.
-Licensed under the Apache License, Version 2.0 (the "License"); you may not use
-this file except in compliance with the License. You may obtain a copy of the
-License at http://www.apache.org/licenses/LICENSE-2.0
-
-THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
-WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
-MERCHANTABLITY OR NON-INFRINGEMENT.
-
-See the Apache Version 2.0 License for specific language governing permissions
-and limitations under the License.
-***************************************************************************** */
-/* global Reflect, Promise */
-
-var extendStatics = function(d, b) {
-    extendStatics = Object.setPrototypeOf ||
-        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-    return extendStatics(d, b);
-};
-
-function __extends(d, b) {
-    extendStatics(d, b);
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-}
-
-var __assign = function() {
-    __assign = Object.assign || function __assign(t) {
-        for (var s, i = 1, n = arguments.length; i < n; i++) {
-            s = arguments[i];
-            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
-        }
-        return t;
-    };
-    return __assign.apply(this, arguments);
-};
-
-var ResourceDayGrid = /** @class */ (function (_super) {
-    __extends(ResourceDayGrid, _super);
-    function ResourceDayGrid(context, dayGrid) {
-        var _this = _super.call(this, context, dayGrid.el) || this;
-        _this.splitter = new VResourceSplitter();
-        _this.slicers = {};
-        _this.joiner = new ResourceDayGridJoiner();
-        _this.dayGrid = dayGrid;
-        context.calendar.registerInteractiveComponent(_this, {
-            el: _this.dayGrid.el
-        });
-        return _this;
-    }
-    ResourceDayGrid.prototype.destroy = function () {
-        _super.prototype.destroy.call(this);
-        this.calendar.unregisterInteractiveComponent(this);
-    };
-    ResourceDayGrid.prototype.render = function (props) {
-        var _this = this;
-        var dayGrid = this.dayGrid;
-        var dateProfile = props.dateProfile, resourceDayTable = props.resourceDayTable, nextDayThreshold = props.nextDayThreshold;
-        var splitProps = this.splitter.splitProps(props);
-        this.slicers = mapHash(splitProps, function (split, resourceId) {
-            return _this.slicers[resourceId] || new DayGridSlicer();
-        });
-        var slicedProps = mapHash(this.slicers, function (slicer, resourceId) {
-            return slicer.sliceProps(splitProps[resourceId], dateProfile, nextDayThreshold, dayGrid, resourceDayTable.dayTable);
-        });
-        dayGrid.allowAcrossResources = resourceDayTable.dayTable.colCnt === 1;
-        dayGrid.receiveProps(__assign({}, this.joiner.joinProps(slicedProps, resourceDayTable), { dateProfile: dateProfile, cells: resourceDayTable.cells, isRigid: props.isRigid }));
-    };
-    ResourceDayGrid.prototype.buildPositionCaches = function () {
-        this.dayGrid.buildPositionCaches();
-    };
-    ResourceDayGrid.prototype.queryHit = function (positionLeft, positionTop) {
-        var rawHit = this.dayGrid.positionToHit(positionLeft, positionTop);
-        if (rawHit) {
-            return {
-                component: this.dayGrid,
-                dateSpan: {
-                    range: rawHit.dateSpan.range,
-                    allDay: rawHit.dateSpan.allDay,
-                    resourceId: this.props.resourceDayTable.cells[rawHit.row][rawHit.col].resource.id
-                },
-                dayEl: rawHit.dayEl,
-                rect: {
-                    left: rawHit.relativeRect.left,
-                    right: rawHit.relativeRect.right,
-                    top: rawHit.relativeRect.top,
-                    bottom: rawHit.relativeRect.bottom
-                },
-                layer: 0
-            };
-        }
-    };
-    return ResourceDayGrid;
-}(DateComponent));
-var ResourceDayGridJoiner = /** @class */ (function (_super) {
-    __extends(ResourceDayGridJoiner, _super);
-    function ResourceDayGridJoiner() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    ResourceDayGridJoiner.prototype.transformSeg = function (seg, resourceDayTable, resourceI) {
-        var colRanges = resourceDayTable.computeColRanges(seg.firstCol, seg.lastCol, resourceI);
-        return colRanges.map(function (colRange) {
-            return __assign({}, seg, colRange, { isStart: seg.isStart && colRange.isStart, isEnd: seg.isEnd && colRange.isEnd });
-        });
-    };
-    return ResourceDayGridJoiner;
-}(VResourceJoiner));
-
-var ResourceDayGridView = /** @class */ (function (_super) {
-    __extends(ResourceDayGridView, _super);
-    function ResourceDayGridView(context, viewSpec, dateProfileGenerator, parentEl) {
-        var _this = _super.call(this, context, viewSpec, dateProfileGenerator, parentEl) || this;
-        _this.flattenResources = memoize(flattenResources);
-        _this.buildResourceDayTable = memoize(buildResourceDayTable);
-        _this.resourceOrderSpecs = parseFieldSpecs(_this.opt('resourceOrder'));
-        if (_this.opt('columnHeader')) {
-            _this.header = new ResourceDayHeader(_this.context, _this.el.querySelector('.fc-head-container'));
-        }
-        _this.resourceDayGrid = new ResourceDayGrid(context, _this.dayGrid);
-        return _this;
-    }
-    ResourceDayGridView.prototype.destroy = function () {
-        _super.prototype.destroy.call(this);
-        if (this.header) {
-            this.header.destroy();
-        }
-        this.resourceDayGrid.destroy();
-    };
-    ResourceDayGridView.prototype.render = function (props) {
-        _super.prototype.render.call(this, props); // for flags for updateSize
-        var resources = this.flattenResources(props.resourceStore, this.resourceOrderSpecs);
-        var resourceDayTable = this.buildResourceDayTable(this.props.dateProfile, this.dateProfileGenerator, resources, this.opt('datesAboveResources'));
-        if (this.header) {
-            this.header.receiveProps({
-                resources: resources,
-                dates: resourceDayTable.dayTable.headerDates,
-                dateProfile: props.dateProfile,
-                datesRepDistinctDays: true,
-                renderIntroHtml: this.renderHeadIntroHtml
-            });
-        }
-        this.resourceDayGrid.receiveProps({
-            dateProfile: props.dateProfile,
-            resourceDayTable: resourceDayTable,
-            businessHours: props.businessHours,
-            eventStore: props.eventStore,
-            eventUiBases: props.eventUiBases,
-            dateSelection: props.dateSelection,
-            eventSelection: props.eventSelection,
-            eventDrag: props.eventDrag,
-            eventResize: props.eventResize,
-            isRigid: this.hasRigidRows(),
-            nextDayThreshold: this.nextDayThreshold
-        });
-    };
-    ResourceDayGridView.needsResourceData = true; // for ResourceViewProps
-    return ResourceDayGridView;
-}(AbstractDayGridView));
-function buildResourceDayTable(dateProfile, dateProfileGenerator, resources, datesAboveResources) {
-    var dayTable = buildBasicDayTable(dateProfile, dateProfileGenerator);
-    return datesAboveResources ?
-        new DayResourceTable(dayTable, resources) :
-        new ResourceDayTable(dayTable, resources);
-}
-
-var main = createPlugin({
-    deps: [ResourceCommonPlugin, DayGridPlugin],
-    defaultView: 'resourceDayGridDay',
-    views: {
-        resourceDayGrid: ResourceDayGridView,
-        resourceDayGridDay: {
-            type: 'resourceDayGrid',
-            duration: { days: 1 }
-        },
-        resourceDayGridWeek: {
-            type: 'resourceDayGrid',
-            duration: { weeks: 1 }
-        },
-        resourceDayGridMonth: {
-            type: 'resourceDayGrid',
-            duration: { months: 1 },
-            // TODO: wish we didn't have to C&P from dayGrid's file
-            monthMode: true,
-            fixedWeekCount: true
-        }
-    }
-});
-
-export default main;
-export { ResourceDayGrid, ResourceDayGridView };
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/resource-daygrid/main.js b/AKPlan/static/AKPlan/vendor/fullcalendar/resource-daygrid/main.js
deleted file mode 100644
index 6b4464110aa4ebd5088d916e97071a4de76e2e6f..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/resource-daygrid/main.js
+++ /dev/null
@@ -1,213 +0,0 @@
-/*!
-FullCalendar Resource Day Grid Plugin v4.3.0
-Docs & License: https://fullcalendar.io/scheduler
-(c) 2019 Adam Shaw
-*/
-
-(function (global, factory) {
-    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@fullcalendar/core'), require('@fullcalendar/resource-common'), require('@fullcalendar/daygrid')) :
-    typeof define === 'function' && define.amd ? define(['exports', '@fullcalendar/core', '@fullcalendar/resource-common', '@fullcalendar/daygrid'], factory) :
-    (global = global || self, factory(global.FullCalendarResourceDayGrid = {}, global.FullCalendar, global.FullCalendarResourceCommon, global.FullCalendarDayGrid));
-}(this, function (exports, core, ResourceCommonPlugin, DayGridPlugin) { 'use strict';
-
-    var ResourceCommonPlugin__default = 'default' in ResourceCommonPlugin ? ResourceCommonPlugin['default'] : ResourceCommonPlugin;
-    var DayGridPlugin__default = 'default' in DayGridPlugin ? DayGridPlugin['default'] : DayGridPlugin;
-
-    /*! *****************************************************************************
-    Copyright (c) Microsoft Corporation. All rights reserved.
-    Licensed under the Apache License, Version 2.0 (the "License"); you may not use
-    this file except in compliance with the License. You may obtain a copy of the
-    License at http://www.apache.org/licenses/LICENSE-2.0
-
-    THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-    KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
-    WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
-    MERCHANTABLITY OR NON-INFRINGEMENT.
-
-    See the Apache Version 2.0 License for specific language governing permissions
-    and limitations under the License.
-    ***************************************************************************** */
-    /* global Reflect, Promise */
-
-    var extendStatics = function(d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-
-    function __extends(d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    }
-
-    var __assign = function() {
-        __assign = Object.assign || function __assign(t) {
-            for (var s, i = 1, n = arguments.length; i < n; i++) {
-                s = arguments[i];
-                for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
-            }
-            return t;
-        };
-        return __assign.apply(this, arguments);
-    };
-
-    var ResourceDayGrid = /** @class */ (function (_super) {
-        __extends(ResourceDayGrid, _super);
-        function ResourceDayGrid(context, dayGrid) {
-            var _this = _super.call(this, context, dayGrid.el) || this;
-            _this.splitter = new ResourceCommonPlugin.VResourceSplitter();
-            _this.slicers = {};
-            _this.joiner = new ResourceDayGridJoiner();
-            _this.dayGrid = dayGrid;
-            context.calendar.registerInteractiveComponent(_this, {
-                el: _this.dayGrid.el
-            });
-            return _this;
-        }
-        ResourceDayGrid.prototype.destroy = function () {
-            _super.prototype.destroy.call(this);
-            this.calendar.unregisterInteractiveComponent(this);
-        };
-        ResourceDayGrid.prototype.render = function (props) {
-            var _this = this;
-            var dayGrid = this.dayGrid;
-            var dateProfile = props.dateProfile, resourceDayTable = props.resourceDayTable, nextDayThreshold = props.nextDayThreshold;
-            var splitProps = this.splitter.splitProps(props);
-            this.slicers = core.mapHash(splitProps, function (split, resourceId) {
-                return _this.slicers[resourceId] || new DayGridPlugin.DayGridSlicer();
-            });
-            var slicedProps = core.mapHash(this.slicers, function (slicer, resourceId) {
-                return slicer.sliceProps(splitProps[resourceId], dateProfile, nextDayThreshold, dayGrid, resourceDayTable.dayTable);
-            });
-            dayGrid.allowAcrossResources = resourceDayTable.dayTable.colCnt === 1;
-            dayGrid.receiveProps(__assign({}, this.joiner.joinProps(slicedProps, resourceDayTable), { dateProfile: dateProfile, cells: resourceDayTable.cells, isRigid: props.isRigid }));
-        };
-        ResourceDayGrid.prototype.buildPositionCaches = function () {
-            this.dayGrid.buildPositionCaches();
-        };
-        ResourceDayGrid.prototype.queryHit = function (positionLeft, positionTop) {
-            var rawHit = this.dayGrid.positionToHit(positionLeft, positionTop);
-            if (rawHit) {
-                return {
-                    component: this.dayGrid,
-                    dateSpan: {
-                        range: rawHit.dateSpan.range,
-                        allDay: rawHit.dateSpan.allDay,
-                        resourceId: this.props.resourceDayTable.cells[rawHit.row][rawHit.col].resource.id
-                    },
-                    dayEl: rawHit.dayEl,
-                    rect: {
-                        left: rawHit.relativeRect.left,
-                        right: rawHit.relativeRect.right,
-                        top: rawHit.relativeRect.top,
-                        bottom: rawHit.relativeRect.bottom
-                    },
-                    layer: 0
-                };
-            }
-        };
-        return ResourceDayGrid;
-    }(core.DateComponent));
-    var ResourceDayGridJoiner = /** @class */ (function (_super) {
-        __extends(ResourceDayGridJoiner, _super);
-        function ResourceDayGridJoiner() {
-            return _super !== null && _super.apply(this, arguments) || this;
-        }
-        ResourceDayGridJoiner.prototype.transformSeg = function (seg, resourceDayTable, resourceI) {
-            var colRanges = resourceDayTable.computeColRanges(seg.firstCol, seg.lastCol, resourceI);
-            return colRanges.map(function (colRange) {
-                return __assign({}, seg, colRange, { isStart: seg.isStart && colRange.isStart, isEnd: seg.isEnd && colRange.isEnd });
-            });
-        };
-        return ResourceDayGridJoiner;
-    }(ResourceCommonPlugin.VResourceJoiner));
-
-    var ResourceDayGridView = /** @class */ (function (_super) {
-        __extends(ResourceDayGridView, _super);
-        function ResourceDayGridView(context, viewSpec, dateProfileGenerator, parentEl) {
-            var _this = _super.call(this, context, viewSpec, dateProfileGenerator, parentEl) || this;
-            _this.flattenResources = core.memoize(ResourceCommonPlugin.flattenResources);
-            _this.buildResourceDayTable = core.memoize(buildResourceDayTable);
-            _this.resourceOrderSpecs = core.parseFieldSpecs(_this.opt('resourceOrder'));
-            if (_this.opt('columnHeader')) {
-                _this.header = new ResourceCommonPlugin.ResourceDayHeader(_this.context, _this.el.querySelector('.fc-head-container'));
-            }
-            _this.resourceDayGrid = new ResourceDayGrid(context, _this.dayGrid);
-            return _this;
-        }
-        ResourceDayGridView.prototype.destroy = function () {
-            _super.prototype.destroy.call(this);
-            if (this.header) {
-                this.header.destroy();
-            }
-            this.resourceDayGrid.destroy();
-        };
-        ResourceDayGridView.prototype.render = function (props) {
-            _super.prototype.render.call(this, props); // for flags for updateSize
-            var resources = this.flattenResources(props.resourceStore, this.resourceOrderSpecs);
-            var resourceDayTable = this.buildResourceDayTable(this.props.dateProfile, this.dateProfileGenerator, resources, this.opt('datesAboveResources'));
-            if (this.header) {
-                this.header.receiveProps({
-                    resources: resources,
-                    dates: resourceDayTable.dayTable.headerDates,
-                    dateProfile: props.dateProfile,
-                    datesRepDistinctDays: true,
-                    renderIntroHtml: this.renderHeadIntroHtml
-                });
-            }
-            this.resourceDayGrid.receiveProps({
-                dateProfile: props.dateProfile,
-                resourceDayTable: resourceDayTable,
-                businessHours: props.businessHours,
-                eventStore: props.eventStore,
-                eventUiBases: props.eventUiBases,
-                dateSelection: props.dateSelection,
-                eventSelection: props.eventSelection,
-                eventDrag: props.eventDrag,
-                eventResize: props.eventResize,
-                isRigid: this.hasRigidRows(),
-                nextDayThreshold: this.nextDayThreshold
-            });
-        };
-        ResourceDayGridView.needsResourceData = true; // for ResourceViewProps
-        return ResourceDayGridView;
-    }(DayGridPlugin.AbstractDayGridView));
-    function buildResourceDayTable(dateProfile, dateProfileGenerator, resources, datesAboveResources) {
-        var dayTable = DayGridPlugin.buildBasicDayTable(dateProfile, dateProfileGenerator);
-        return datesAboveResources ?
-            new ResourceCommonPlugin.DayResourceTable(dayTable, resources) :
-            new ResourceCommonPlugin.ResourceDayTable(dayTable, resources);
-    }
-
-    var main = core.createPlugin({
-        deps: [ResourceCommonPlugin__default, DayGridPlugin__default],
-        defaultView: 'resourceDayGridDay',
-        views: {
-            resourceDayGrid: ResourceDayGridView,
-            resourceDayGridDay: {
-                type: 'resourceDayGrid',
-                duration: { days: 1 }
-            },
-            resourceDayGridWeek: {
-                type: 'resourceDayGrid',
-                duration: { weeks: 1 }
-            },
-            resourceDayGridMonth: {
-                type: 'resourceDayGrid',
-                duration: { months: 1 },
-                // TODO: wish we didn't have to C&P from dayGrid's file
-                monthMode: true,
-                fixedWeekCount: true
-            }
-        }
-    });
-
-    exports.ResourceDayGrid = ResourceDayGrid;
-    exports.ResourceDayGridView = ResourceDayGridView;
-    exports.default = main;
-
-    Object.defineProperty(exports, '__esModule', { value: true });
-
-}));
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/resource-daygrid/main.min.js b/AKPlan/static/AKPlan/vendor/fullcalendar/resource-daygrid/main.min.js
deleted file mode 100644
index cfc82d0c9ab4ab023b2755ab30d4cb6fd9891c1a..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/resource-daygrid/main.min.js
+++ /dev/null
@@ -1,6 +0,0 @@
-/*!
-FullCalendar Resource Day Grid Plugin v4.3.0
-Docs & License: https://fullcalendar.io/scheduler
-(c) 2019 Adam Shaw
-*/
-!function(e,r){"object"==typeof exports&&"undefined"!=typeof module?r(exports,require("@fullcalendar/core"),require("@fullcalendar/resource-common"),require("@fullcalendar/daygrid")):"function"==typeof define&&define.amd?define(["exports","@fullcalendar/core","@fullcalendar/resource-common","@fullcalendar/daygrid"],r):r((e=e||self).FullCalendarResourceDayGrid={},e.FullCalendar,e.FullCalendarResourceCommon,e.FullCalendarDayGrid)}(this,function(e,r,t,o){"use strict";var i="default"in t?t.default:t,a="default"in o?o.default:o,s=function(e,r){return(s=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,r){e.__proto__=r}||function(e,r){for(var t in r)r.hasOwnProperty(t)&&(e[t]=r[t])})(e,r)};function n(e,r){function t(){this.constructor=e}s(e,r),e.prototype=null===r?Object.create(r):(t.prototype=r.prototype,new t)}var l=function(){return(l=Object.assign||function(e){for(var r,t=1,o=arguments.length;t<o;t++)for(var i in r=arguments[t])Object.prototype.hasOwnProperty.call(r,i)&&(e[i]=r[i]);return e}).apply(this,arguments)},c=function(e){function i(r,o){var i=e.call(this,r,o.el)||this;return i.splitter=new t.VResourceSplitter,i.slicers={},i.joiner=new d,i.dayGrid=o,r.calendar.registerInteractiveComponent(i,{el:i.dayGrid.el}),i}return n(i,e),i.prototype.destroy=function(){e.prototype.destroy.call(this),this.calendar.unregisterInteractiveComponent(this)},i.prototype.render=function(e){var t=this,i=this.dayGrid,a=e.dateProfile,s=e.resourceDayTable,n=e.nextDayThreshold,c=this.splitter.splitProps(e);this.slicers=r.mapHash(c,function(e,r){return t.slicers[r]||new o.DayGridSlicer});var d=r.mapHash(this.slicers,function(e,r){return e.sliceProps(c[r],a,n,i,s.dayTable)});i.allowAcrossResources=1===s.dayTable.colCnt,i.receiveProps(l({},this.joiner.joinProps(d,s),{dateProfile:a,cells:s.cells,isRigid:e.isRigid}))},i.prototype.buildPositionCaches=function(){this.dayGrid.buildPositionCaches()},i.prototype.queryHit=function(e,r){var t=this.dayGrid.positionToHit(e,r);if(t)return{component:this.dayGrid,dateSpan:{range:t.dateSpan.range,allDay:t.dateSpan.allDay,resourceId:this.props.resourceDayTable.cells[t.row][t.col].resource.id},dayEl:t.dayEl,rect:{left:t.relativeRect.left,right:t.relativeRect.right,top:t.relativeRect.top,bottom:t.relativeRect.bottom},layer:0}},i}(r.DateComponent),d=function(e){function r(){return null!==e&&e.apply(this,arguments)||this}return n(r,e),r.prototype.transformSeg=function(e,r,t){return r.computeColRanges(e.firstCol,e.lastCol,t).map(function(r){return l({},e,r,{isStart:e.isStart&&r.isStart,isEnd:e.isEnd&&r.isEnd})})},r}(t.VResourceJoiner),u=function(e){function o(o,i,a,s){var n=e.call(this,o,i,a,s)||this;return n.flattenResources=r.memoize(t.flattenResources),n.buildResourceDayTable=r.memoize(y),n.resourceOrderSpecs=r.parseFieldSpecs(n.opt("resourceOrder")),n.opt("columnHeader")&&(n.header=new t.ResourceDayHeader(n.context,n.el.querySelector(".fc-head-container"))),n.resourceDayGrid=new c(o,n.dayGrid),n}return n(o,e),o.prototype.destroy=function(){e.prototype.destroy.call(this),this.header&&this.header.destroy(),this.resourceDayGrid.destroy()},o.prototype.render=function(r){e.prototype.render.call(this,r);var t=this.flattenResources(r.resourceStore,this.resourceOrderSpecs),o=this.buildResourceDayTable(this.props.dateProfile,this.dateProfileGenerator,t,this.opt("datesAboveResources"));this.header&&this.header.receiveProps({resources:t,dates:o.dayTable.headerDates,dateProfile:r.dateProfile,datesRepDistinctDays:!0,renderIntroHtml:this.renderHeadIntroHtml}),this.resourceDayGrid.receiveProps({dateProfile:r.dateProfile,resourceDayTable:o,businessHours:r.businessHours,eventStore:r.eventStore,eventUiBases:r.eventUiBases,dateSelection:r.dateSelection,eventSelection:r.eventSelection,eventDrag:r.eventDrag,eventResize:r.eventResize,isRigid:this.hasRigidRows(),nextDayThreshold:this.nextDayThreshold})},o.needsResourceData=!0,o}(o.AbstractDayGridView);function y(e,r,i,a){var s=o.buildBasicDayTable(e,r);return a?new t.DayResourceTable(s,i):new t.ResourceDayTable(s,i)}var p=r.createPlugin({deps:[i,a],defaultView:"resourceDayGridDay",views:{resourceDayGrid:u,resourceDayGridDay:{type:"resourceDayGrid",duration:{days:1}},resourceDayGridWeek:{type:"resourceDayGrid",duration:{weeks:1}},resourceDayGridMonth:{type:"resourceDayGrid",duration:{months:1},monthMode:!0,fixedWeekCount:!0}}});e.ResourceDayGrid=c,e.ResourceDayGridView=u,e.default=p,Object.defineProperty(e,"__esModule",{value:!0})});
\ No newline at end of file
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/resource-daygrid/package.json b/AKPlan/static/AKPlan/vendor/fullcalendar/resource-daygrid/package.json
deleted file mode 100644
index 4c9676d7a3d1a5b21160109b4f135a07eccef1b8..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/resource-daygrid/package.json
+++ /dev/null
@@ -1,37 +0,0 @@
-{
-  "name": "@fullcalendar/resource-daygrid",
-  "version": "4.3.0",
-  "title": "FullCalendar Resource Day Grid Plugin",
-  "description": "Displays events in individual columns for days and resources",
-  "keywords": [
-    "calendar",
-    "event",
-    "full-sized"
-  ],
-  "homepage": "https://fullcalendar.io/scheduler",
-  "docs": "https://fullcalendar.io/docs/resource-daygrid-view",
-  "bugs": "https://fullcalendar.io/reporting-bugs",
-  "repository": {
-    "type": "git",
-    "url": "https://github.com/fullcalendar/fullcalendar-scheduler.git",
-    "homepage": "https://github.com/fullcalendar/fullcalendar-scheduler"
-  },
-  "license": "SEE LICENSE IN LICENSE.md",
-  "author": {
-    "name": "Adam Shaw",
-    "email": "arshaw@arshaw.com",
-    "url": "http://arshaw.com/"
-  },
-  "copyright": "2019 Adam Shaw",
-  "dependencies": {
-    "@fullcalendar/resource-common": "~4.3.0",
-    "@fullcalendar/daygrid": "~4.3.0"
-  },
-  "peerDependencies": {
-    "@fullcalendar/core": "~4.3.0"
-  },
-  "main": "main.js",
-  "module": "main.esm.js",
-  "unpkg": "main.min.js",
-  "types": "main.d.ts"
-}
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/resource-timegrid/LICENSE.md b/AKPlan/static/AKPlan/vendor/fullcalendar/resource-timegrid/LICENSE.md
deleted file mode 100644
index 52296639f8117dd1cd8c5a9e629fed87e5b32cfc..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/resource-timegrid/LICENSE.md
+++ /dev/null
@@ -1,18 +0,0 @@
-
-For complete licensing information, visit:
-http://fullcalendar.io/scheduler/license
-
-FullCalendar Scheduler is tri-licensed, meaning you must choose
-one of three licenses to use. Here is a summary of those licenses:
-
-- Commercial License
-  (a paid license, meant for commercial use)
-  http://fullcalendar.io/scheduler/license-details
-
-- Creative Commons Non-Commercial No-Derivatives
-  (meant for trial and non-commercial use)
-  https://creativecommons.org/licenses/by-nc-nd/4.0/
-
-- GPLv3 License
-  (meant for open-source projects)
-  http://www.gnu.org/licenses/gpl-3.0.en.html
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/resource-timegrid/README.md b/AKPlan/static/AKPlan/vendor/fullcalendar/resource-timegrid/README.md
deleted file mode 100644
index f011ad540fc2b80784038dec7e50c5b4415953a4..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/resource-timegrid/README.md
+++ /dev/null
@@ -1,8 +0,0 @@
-
-# FullCalendar Resource Time Grid Plugin
-
-Displays events on a vertical resource view with time slots
-
-[View the docs &raquo;](https://fullcalendar.io/docs/vertical-resource-view)
-
-This package was created from the [FullCalendar monorepo &raquo;](https://github.com/fullcalendar/fullcalendar-scheduler)
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/resource-timegrid/main.d.ts b/AKPlan/static/AKPlan/vendor/fullcalendar/resource-timegrid/main.d.ts
deleted file mode 100644
index 0568a484eea293779f3423bcac069ebc54fc7c02..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/resource-timegrid/main.d.ts
+++ /dev/null
@@ -1,76 +0,0 @@
-// Generated by dts-bundle v0.7.3-fork.1
-// Dependencies for this module:
-//   ../../../../../@fullcalendar/core
-//   ../../../../../@fullcalendar/timegrid
-//   ../../../../../@fullcalendar/resource-common
-//   ../../../../../@fullcalendar/resource-daygrid
-
-declare module '@fullcalendar/resource-timegrid' {
-    import ResourceTimeGridView from '@fullcalendar/resource-timegrid/ResourceTimeGridView';
-    export { ResourceTimeGridView };
-    export { default as ResourceTimeGrid } from '@fullcalendar/resource-timegrid/ResourceTimeGrid';
-    const _default: import("@fullcalendar/core").PluginDef;
-    export default _default;
-}
-
-declare module '@fullcalendar/resource-timegrid/ResourceTimeGridView' {
-    import {ComponentContext, DateProfileGenerator, ViewSpec} from '@fullcalendar/core';
-    import {AbstractTimeGridView} from '@fullcalendar/timegrid';
-    import {ResourceDayHeader, ResourceViewProps} from '@fullcalendar/resource-common';
-    import {ResourceDayGrid} from '@fullcalendar/resource-daygrid';
-    import ResourceTimeGrid from '@fullcalendar/resource-timegrid/ResourceTimeGrid';
-    export {ResourceTimeGridView as default, ResourceTimeGridView};
-
-    class ResourceTimeGridView extends AbstractTimeGridView {
-        static needsResourceData: boolean;
-        props: ResourceViewProps;
-        header: ResourceDayHeader;
-        resourceTimeGrid: ResourceTimeGrid;
-        resourceDayGrid: ResourceDayGrid;
-
-        constructor(context: ComponentContext, viewSpec: ViewSpec, dateProfileGenerator: DateProfileGenerator, parentEl: HTMLElement);
-
-        destroy(): void;
-        render(props: ResourceViewProps): void;
-        renderNowIndicator(date: any): void;
-    }
-}
-
-declare module '@fullcalendar/resource-timegrid/ResourceTimeGrid' {
-    import {
-        ComponentContext,
-        DateComponent,
-        DateMarker,
-        DateProfile,
-        DateSpan,
-        EventInteractionState,
-        EventStore,
-        EventUiHash,
-        Hit
-    } from '@fullcalendar/core';
-    import {TimeGrid} from '@fullcalendar/timegrid';
-    import {AbstractResourceDayTable} from '@fullcalendar/resource-common';
-
-    export interface ResourceTimeGridProps {
-        dateProfile: DateProfile | null;
-        resourceDayTable: AbstractResourceDayTable;
-        businessHours: EventStore;
-        eventStore: EventStore;
-        eventUiBases: EventUiHash;
-        dateSelection: DateSpan | null;
-        eventSelection: string;
-        eventDrag: EventInteractionState | null;
-        eventResize: EventInteractionState | null;
-    }
-    export { ResourceTimeGrid as default, ResourceTimeGrid };
-    class ResourceTimeGrid extends DateComponent<ResourceTimeGridProps> {
-        timeGrid: TimeGrid;
-        constructor(context: ComponentContext, timeGrid: TimeGrid);
-        destroy(): void;
-        render(props: ResourceTimeGridProps): void;
-        renderNowIndicator(date: DateMarker): void;
-        buildPositionCaches(): void;
-        queryHit(positionLeft: number, positionTop: number): Hit;
-    }
-}
-
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/resource-timegrid/main.esm.js b/AKPlan/static/AKPlan/vendor/fullcalendar/resource-timegrid/main.esm.js
deleted file mode 100644
index 3dc440d8ee74b63cc56fc9b7ba090b3643d16fbf..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/resource-timegrid/main.esm.js
+++ /dev/null
@@ -1,223 +0,0 @@
-/*!
-FullCalendar Resource Time Grid Plugin v4.3.0
-Docs & License: https://fullcalendar.io/scheduler
-(c) 2019 Adam Shaw
-*/
-
-import {createPlugin, DateComponent, mapHash, memoize, parseFieldSpecs} from '@fullcalendar/core';
-import ResourceCommonPlugin, {
-    DayResourceTable,
-    flattenResources,
-    ResourceDayHeader,
-    ResourceDayTable,
-    VResourceJoiner,
-    VResourceSplitter
-} from '@fullcalendar/resource-common';
-import TimeGridPlugin, {
-    AbstractTimeGridView,
-    buildDayRanges,
-    buildDayTable,
-    TimeGridSlicer
-} from '@fullcalendar/timegrid';
-import {ResourceDayGrid} from '@fullcalendar/resource-daygrid';
-
-/*! *****************************************************************************
-Copyright (c) Microsoft Corporation. All rights reserved.
-Licensed under the Apache License, Version 2.0 (the "License"); you may not use
-this file except in compliance with the License. You may obtain a copy of the
-License at http://www.apache.org/licenses/LICENSE-2.0
-
-THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
-WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
-MERCHANTABLITY OR NON-INFRINGEMENT.
-
-See the Apache Version 2.0 License for specific language governing permissions
-and limitations under the License.
-***************************************************************************** */
-/* global Reflect, Promise */
-
-var extendStatics = function(d, b) {
-    extendStatics = Object.setPrototypeOf ||
-        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-    return extendStatics(d, b);
-};
-
-function __extends(d, b) {
-    extendStatics(d, b);
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-}
-
-var __assign = function() {
-    __assign = Object.assign || function __assign(t) {
-        for (var s, i = 1, n = arguments.length; i < n; i++) {
-            s = arguments[i];
-            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
-        }
-        return t;
-    };
-    return __assign.apply(this, arguments);
-};
-
-var ResourceTimeGrid = /** @class */ (function (_super) {
-    __extends(ResourceTimeGrid, _super);
-    function ResourceTimeGrid(context, timeGrid) {
-        var _this = _super.call(this, context, timeGrid.el) || this;
-        _this.buildDayRanges = memoize(buildDayRanges);
-        _this.splitter = new VResourceSplitter();
-        _this.slicers = {};
-        _this.joiner = new ResourceTimeGridJoiner();
-        _this.timeGrid = timeGrid;
-        context.calendar.registerInteractiveComponent(_this, {
-            el: _this.timeGrid.el
-        });
-        return _this;
-    }
-    ResourceTimeGrid.prototype.destroy = function () {
-        this.calendar.unregisterInteractiveComponent(this);
-    };
-    ResourceTimeGrid.prototype.render = function (props) {
-        var _this = this;
-        var timeGrid = this.timeGrid;
-        var dateProfile = props.dateProfile, resourceDayTable = props.resourceDayTable;
-        var dayRanges = this.dayRanges = this.buildDayRanges(resourceDayTable.dayTable, dateProfile, this.dateEnv);
-        var splitProps = this.splitter.splitProps(props);
-        this.slicers = mapHash(splitProps, function (split, resourceId) {
-            return _this.slicers[resourceId] || new TimeGridSlicer();
-        });
-        var slicedProps = mapHash(this.slicers, function (slicer, resourceId) {
-            return slicer.sliceProps(splitProps[resourceId], dateProfile, null, timeGrid, dayRanges);
-        });
-        timeGrid.allowAcrossResources = dayRanges.length === 1;
-        timeGrid.receiveProps(__assign({}, this.joiner.joinProps(slicedProps, resourceDayTable), { dateProfile: dateProfile, cells: resourceDayTable.cells[0] }));
-    };
-    ResourceTimeGrid.prototype.renderNowIndicator = function (date) {
-        var timeGrid = this.timeGrid;
-        var resourceDayTable = this.props.resourceDayTable;
-        var nonResourceSegs = this.slicers[''].sliceNowDate(date, timeGrid, this.dayRanges);
-        var segs = this.joiner.expandSegs(resourceDayTable, nonResourceSegs);
-        timeGrid.renderNowIndicator(segs, date);
-    };
-    ResourceTimeGrid.prototype.buildPositionCaches = function () {
-        this.timeGrid.buildPositionCaches();
-    };
-    ResourceTimeGrid.prototype.queryHit = function (positionLeft, positionTop) {
-        var rawHit = this.timeGrid.positionToHit(positionLeft, positionTop);
-        if (rawHit) {
-            return {
-                component: this.timeGrid,
-                dateSpan: {
-                    range: rawHit.dateSpan.range,
-                    allDay: rawHit.dateSpan.allDay,
-                    resourceId: this.props.resourceDayTable.cells[0][rawHit.col].resource.id
-                },
-                dayEl: rawHit.dayEl,
-                rect: {
-                    left: rawHit.relativeRect.left,
-                    right: rawHit.relativeRect.right,
-                    top: rawHit.relativeRect.top,
-                    bottom: rawHit.relativeRect.bottom
-                },
-                layer: 0
-            };
-        }
-    };
-    return ResourceTimeGrid;
-}(DateComponent));
-var ResourceTimeGridJoiner = /** @class */ (function (_super) {
-    __extends(ResourceTimeGridJoiner, _super);
-    function ResourceTimeGridJoiner() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    ResourceTimeGridJoiner.prototype.transformSeg = function (seg, resourceDayTable, resourceI) {
-        return [
-            __assign({}, seg, { col: resourceDayTable.computeCol(seg.col, resourceI) })
-        ];
-    };
-    return ResourceTimeGridJoiner;
-}(VResourceJoiner));
-
-var ResourceTimeGridView = /** @class */ (function (_super) {
-    __extends(ResourceTimeGridView, _super);
-    function ResourceTimeGridView(context, viewSpec, dateProfileGenerator, parentEl) {
-        var _this = _super.call(this, context, viewSpec, dateProfileGenerator, parentEl) || this;
-        _this.flattenResources = memoize(flattenResources);
-        _this.buildResourceDayTable = memoize(buildResourceDayTable);
-        _this.resourceOrderSpecs = parseFieldSpecs(_this.opt('resourceOrder'));
-        if (_this.opt('columnHeader')) {
-            _this.header = new ResourceDayHeader(_this.context, _this.el.querySelector('.fc-head-container'));
-        }
-        _this.resourceTimeGrid = new ResourceTimeGrid(context, _this.timeGrid);
-        if (_this.dayGrid) {
-            _this.resourceDayGrid = new ResourceDayGrid(context, _this.dayGrid);
-        }
-        return _this;
-    }
-    ResourceTimeGridView.prototype.destroy = function () {
-        _super.prototype.destroy.call(this);
-        if (this.header) {
-            this.header.destroy();
-        }
-        this.resourceTimeGrid.destroy();
-        if (this.resourceDayGrid) {
-            this.resourceDayGrid.destroy();
-        }
-    };
-    ResourceTimeGridView.prototype.render = function (props) {
-        _super.prototype.render.call(this, props); // for flags for updateSize
-        var splitProps = this.splitter.splitProps(props);
-        var resources = this.flattenResources(props.resourceStore, this.resourceOrderSpecs);
-        var resourceDayTable = this.buildResourceDayTable(this.props.dateProfile, this.dateProfileGenerator, resources, this.opt('datesAboveResources'));
-        if (this.header) {
-            this.header.receiveProps({
-                resources: resources,
-                dates: resourceDayTable.dayTable.headerDates,
-                dateProfile: props.dateProfile,
-                datesRepDistinctDays: true,
-                renderIntroHtml: this.renderHeadIntroHtml
-            });
-        }
-        this.resourceTimeGrid.receiveProps(__assign({}, splitProps['timed'], { dateProfile: props.dateProfile, resourceDayTable: resourceDayTable }));
-        if (this.resourceDayGrid) {
-            this.resourceDayGrid.receiveProps(__assign({}, splitProps['allDay'], { dateProfile: props.dateProfile, resourceDayTable: resourceDayTable, isRigid: false, nextDayThreshold: this.nextDayThreshold }));
-        }
-    };
-    ResourceTimeGridView.prototype.renderNowIndicator = function (date) {
-        this.resourceTimeGrid.renderNowIndicator(date);
-    };
-    ResourceTimeGridView.needsResourceData = true; // for ResourceViewProps
-    return ResourceTimeGridView;
-}(AbstractTimeGridView));
-function buildResourceDayTable(dateProfile, dateProfileGenerator, resources, datesAboveResources) {
-    var dayTable = buildDayTable(dateProfile, dateProfileGenerator);
-    return datesAboveResources ?
-        new DayResourceTable(dayTable, resources) :
-        new ResourceDayTable(dayTable, resources);
-}
-
-var main = createPlugin({
-    deps: [ResourceCommonPlugin, TimeGridPlugin],
-    defaultView: 'resourceTimeGridDay',
-    views: {
-        resourceTimeGrid: {
-            class: ResourceTimeGridView,
-            // TODO: wish we didn't have to C&P from timeGrid's file
-            allDaySlot: true,
-            slotDuration: '00:30:00',
-            slotEventOverlap: true // a bad name. confused with overlap/constraint system
-        },
-        resourceTimeGridDay: {
-            type: 'resourceTimeGrid',
-            duration: { days: 1 }
-        },
-        resourceTimeGridWeek: {
-            type: 'resourceTimeGrid',
-            duration: { weeks: 1 }
-        }
-    }
-});
-
-export default main;
-export { ResourceTimeGrid, ResourceTimeGridView };
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/resource-timegrid/main.js b/AKPlan/static/AKPlan/vendor/fullcalendar/resource-timegrid/main.js
deleted file mode 100644
index c00b37eaa2d5e7c9b034932a4f94d90e56bb7593..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/resource-timegrid/main.js
+++ /dev/null
@@ -1,220 +0,0 @@
-/*!
-FullCalendar Resource Time Grid Plugin v4.3.0
-Docs & License: https://fullcalendar.io/scheduler
-(c) 2019 Adam Shaw
-*/
-
-(function (global, factory) {
-    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@fullcalendar/core'), require('@fullcalendar/resource-common'), require('@fullcalendar/timegrid'), require('@fullcalendar/resource-daygrid')) :
-    typeof define === 'function' && define.amd ? define(['exports', '@fullcalendar/core', '@fullcalendar/resource-common', '@fullcalendar/timegrid', '@fullcalendar/resource-daygrid'], factory) :
-    (global = global || self, factory(global.FullCalendarResourceTimeGrid = {}, global.FullCalendar, global.FullCalendarResourceCommon, global.FullCalendarTimeGrid, global.FullCalendarResourceDayGrid));
-}(this, function (exports, core, ResourceCommonPlugin, TimeGridPlugin, resourceDaygrid) { 'use strict';
-
-    var ResourceCommonPlugin__default = 'default' in ResourceCommonPlugin ? ResourceCommonPlugin['default'] : ResourceCommonPlugin;
-    var TimeGridPlugin__default = 'default' in TimeGridPlugin ? TimeGridPlugin['default'] : TimeGridPlugin;
-
-    /*! *****************************************************************************
-    Copyright (c) Microsoft Corporation. All rights reserved.
-    Licensed under the Apache License, Version 2.0 (the "License"); you may not use
-    this file except in compliance with the License. You may obtain a copy of the
-    License at http://www.apache.org/licenses/LICENSE-2.0
-
-    THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-    KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
-    WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
-    MERCHANTABLITY OR NON-INFRINGEMENT.
-
-    See the Apache Version 2.0 License for specific language governing permissions
-    and limitations under the License.
-    ***************************************************************************** */
-    /* global Reflect, Promise */
-
-    var extendStatics = function(d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-
-    function __extends(d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    }
-
-    var __assign = function() {
-        __assign = Object.assign || function __assign(t) {
-            for (var s, i = 1, n = arguments.length; i < n; i++) {
-                s = arguments[i];
-                for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
-            }
-            return t;
-        };
-        return __assign.apply(this, arguments);
-    };
-
-    var ResourceTimeGrid = /** @class */ (function (_super) {
-        __extends(ResourceTimeGrid, _super);
-        function ResourceTimeGrid(context, timeGrid) {
-            var _this = _super.call(this, context, timeGrid.el) || this;
-            _this.buildDayRanges = core.memoize(TimeGridPlugin.buildDayRanges);
-            _this.splitter = new ResourceCommonPlugin.VResourceSplitter();
-            _this.slicers = {};
-            _this.joiner = new ResourceTimeGridJoiner();
-            _this.timeGrid = timeGrid;
-            context.calendar.registerInteractiveComponent(_this, {
-                el: _this.timeGrid.el
-            });
-            return _this;
-        }
-        ResourceTimeGrid.prototype.destroy = function () {
-            this.calendar.unregisterInteractiveComponent(this);
-        };
-        ResourceTimeGrid.prototype.render = function (props) {
-            var _this = this;
-            var timeGrid = this.timeGrid;
-            var dateProfile = props.dateProfile, resourceDayTable = props.resourceDayTable;
-            var dayRanges = this.dayRanges = this.buildDayRanges(resourceDayTable.dayTable, dateProfile, this.dateEnv);
-            var splitProps = this.splitter.splitProps(props);
-            this.slicers = core.mapHash(splitProps, function (split, resourceId) {
-                return _this.slicers[resourceId] || new TimeGridPlugin.TimeGridSlicer();
-            });
-            var slicedProps = core.mapHash(this.slicers, function (slicer, resourceId) {
-                return slicer.sliceProps(splitProps[resourceId], dateProfile, null, timeGrid, dayRanges);
-            });
-            timeGrid.allowAcrossResources = dayRanges.length === 1;
-            timeGrid.receiveProps(__assign({}, this.joiner.joinProps(slicedProps, resourceDayTable), { dateProfile: dateProfile, cells: resourceDayTable.cells[0] }));
-        };
-        ResourceTimeGrid.prototype.renderNowIndicator = function (date) {
-            var timeGrid = this.timeGrid;
-            var resourceDayTable = this.props.resourceDayTable;
-            var nonResourceSegs = this.slicers[''].sliceNowDate(date, timeGrid, this.dayRanges);
-            var segs = this.joiner.expandSegs(resourceDayTable, nonResourceSegs);
-            timeGrid.renderNowIndicator(segs, date);
-        };
-        ResourceTimeGrid.prototype.buildPositionCaches = function () {
-            this.timeGrid.buildPositionCaches();
-        };
-        ResourceTimeGrid.prototype.queryHit = function (positionLeft, positionTop) {
-            var rawHit = this.timeGrid.positionToHit(positionLeft, positionTop);
-            if (rawHit) {
-                return {
-                    component: this.timeGrid,
-                    dateSpan: {
-                        range: rawHit.dateSpan.range,
-                        allDay: rawHit.dateSpan.allDay,
-                        resourceId: this.props.resourceDayTable.cells[0][rawHit.col].resource.id
-                    },
-                    dayEl: rawHit.dayEl,
-                    rect: {
-                        left: rawHit.relativeRect.left,
-                        right: rawHit.relativeRect.right,
-                        top: rawHit.relativeRect.top,
-                        bottom: rawHit.relativeRect.bottom
-                    },
-                    layer: 0
-                };
-            }
-        };
-        return ResourceTimeGrid;
-    }(core.DateComponent));
-    var ResourceTimeGridJoiner = /** @class */ (function (_super) {
-        __extends(ResourceTimeGridJoiner, _super);
-        function ResourceTimeGridJoiner() {
-            return _super !== null && _super.apply(this, arguments) || this;
-        }
-        ResourceTimeGridJoiner.prototype.transformSeg = function (seg, resourceDayTable, resourceI) {
-            return [
-                __assign({}, seg, { col: resourceDayTable.computeCol(seg.col, resourceI) })
-            ];
-        };
-        return ResourceTimeGridJoiner;
-    }(ResourceCommonPlugin.VResourceJoiner));
-
-    var ResourceTimeGridView = /** @class */ (function (_super) {
-        __extends(ResourceTimeGridView, _super);
-        function ResourceTimeGridView(context, viewSpec, dateProfileGenerator, parentEl) {
-            var _this = _super.call(this, context, viewSpec, dateProfileGenerator, parentEl) || this;
-            _this.flattenResources = core.memoize(ResourceCommonPlugin.flattenResources);
-            _this.buildResourceDayTable = core.memoize(buildResourceDayTable);
-            _this.resourceOrderSpecs = core.parseFieldSpecs(_this.opt('resourceOrder'));
-            if (_this.opt('columnHeader')) {
-                _this.header = new ResourceCommonPlugin.ResourceDayHeader(_this.context, _this.el.querySelector('.fc-head-container'));
-            }
-            _this.resourceTimeGrid = new ResourceTimeGrid(context, _this.timeGrid);
-            if (_this.dayGrid) {
-                _this.resourceDayGrid = new resourceDaygrid.ResourceDayGrid(context, _this.dayGrid);
-            }
-            return _this;
-        }
-        ResourceTimeGridView.prototype.destroy = function () {
-            _super.prototype.destroy.call(this);
-            if (this.header) {
-                this.header.destroy();
-            }
-            this.resourceTimeGrid.destroy();
-            if (this.resourceDayGrid) {
-                this.resourceDayGrid.destroy();
-            }
-        };
-        ResourceTimeGridView.prototype.render = function (props) {
-            _super.prototype.render.call(this, props); // for flags for updateSize
-            var splitProps = this.splitter.splitProps(props);
-            var resources = this.flattenResources(props.resourceStore, this.resourceOrderSpecs);
-            var resourceDayTable = this.buildResourceDayTable(this.props.dateProfile, this.dateProfileGenerator, resources, this.opt('datesAboveResources'));
-            if (this.header) {
-                this.header.receiveProps({
-                    resources: resources,
-                    dates: resourceDayTable.dayTable.headerDates,
-                    dateProfile: props.dateProfile,
-                    datesRepDistinctDays: true,
-                    renderIntroHtml: this.renderHeadIntroHtml
-                });
-            }
-            this.resourceTimeGrid.receiveProps(__assign({}, splitProps['timed'], { dateProfile: props.dateProfile, resourceDayTable: resourceDayTable }));
-            if (this.resourceDayGrid) {
-                this.resourceDayGrid.receiveProps(__assign({}, splitProps['allDay'], { dateProfile: props.dateProfile, resourceDayTable: resourceDayTable, isRigid: false, nextDayThreshold: this.nextDayThreshold }));
-            }
-        };
-        ResourceTimeGridView.prototype.renderNowIndicator = function (date) {
-            this.resourceTimeGrid.renderNowIndicator(date);
-        };
-        ResourceTimeGridView.needsResourceData = true; // for ResourceViewProps
-        return ResourceTimeGridView;
-    }(TimeGridPlugin.AbstractTimeGridView));
-    function buildResourceDayTable(dateProfile, dateProfileGenerator, resources, datesAboveResources) {
-        var dayTable = TimeGridPlugin.buildDayTable(dateProfile, dateProfileGenerator);
-        return datesAboveResources ?
-            new ResourceCommonPlugin.DayResourceTable(dayTable, resources) :
-            new ResourceCommonPlugin.ResourceDayTable(dayTable, resources);
-    }
-
-    var main = core.createPlugin({
-        deps: [ResourceCommonPlugin__default, TimeGridPlugin__default],
-        defaultView: 'resourceTimeGridDay',
-        views: {
-            resourceTimeGrid: {
-                class: ResourceTimeGridView,
-                // TODO: wish we didn't have to C&P from timeGrid's file
-                allDaySlot: true,
-                slotDuration: '00:30:00',
-                slotEventOverlap: true // a bad name. confused with overlap/constraint system
-            },
-            resourceTimeGridDay: {
-                type: 'resourceTimeGrid',
-                duration: { days: 1 }
-            },
-            resourceTimeGridWeek: {
-                type: 'resourceTimeGrid',
-                duration: { weeks: 1 }
-            }
-        }
-    });
-
-    exports.ResourceTimeGrid = ResourceTimeGrid;
-    exports.ResourceTimeGridView = ResourceTimeGridView;
-    exports.default = main;
-
-    Object.defineProperty(exports, '__esModule', { value: true });
-
-}));
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/resource-timegrid/main.min.js b/AKPlan/static/AKPlan/vendor/fullcalendar/resource-timegrid/main.min.js
deleted file mode 100644
index 27621fea52b1899919a95c8dcd575199999f1983..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/resource-timegrid/main.min.js
+++ /dev/null
@@ -1,6 +0,0 @@
-/*!
-FullCalendar Resource Time Grid Plugin v4.3.0
-Docs & License: https://fullcalendar.io/scheduler
-(c) 2019 Adam Shaw
-*/
-!function(e,r){"object"==typeof exports&&"undefined"!=typeof module?r(exports,require("@fullcalendar/core"),require("@fullcalendar/resource-common"),require("@fullcalendar/timegrid"),require("@fullcalendar/resource-daygrid")):"function"==typeof define&&define.amd?define(["exports","@fullcalendar/core","@fullcalendar/resource-common","@fullcalendar/timegrid","@fullcalendar/resource-daygrid"],r):r((e=e||self).FullCalendarResourceTimeGrid={},e.FullCalendar,e.FullCalendarResourceCommon,e.FullCalendarTimeGrid,e.FullCalendarResourceDayGrid)}(this,function(e,r,t,i,o){"use strict";var s="default"in t?t.default:t,a="default"in i?i.default:i,n=function(e,r){return(n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,r){e.__proto__=r}||function(e,r){for(var t in r)r.hasOwnProperty(t)&&(e[t]=r[t])})(e,r)};function l(e,r){function t(){this.constructor=e}n(e,r),e.prototype=null===r?Object.create(r):(t.prototype=r.prototype,new t)}var c=function(){return(c=Object.assign||function(e){for(var r,t=1,i=arguments.length;t<i;t++)for(var o in r=arguments[t])Object.prototype.hasOwnProperty.call(r,o)&&(e[o]=r[o]);return e}).apply(this,arguments)},d=function(e){function o(o,s){var a=e.call(this,o,s.el)||this;return a.buildDayRanges=r.memoize(i.buildDayRanges),a.splitter=new t.VResourceSplitter,a.slicers={},a.joiner=new u,a.timeGrid=s,o.calendar.registerInteractiveComponent(a,{el:a.timeGrid.el}),a}return l(o,e),o.prototype.destroy=function(){this.calendar.unregisterInteractiveComponent(this)},o.prototype.render=function(e){var t=this,o=this.timeGrid,s=e.dateProfile,a=e.resourceDayTable,n=this.dayRanges=this.buildDayRanges(a.dayTable,s,this.dateEnv),l=this.splitter.splitProps(e);this.slicers=r.mapHash(l,function(e,r){return t.slicers[r]||new i.TimeGridSlicer});var d=r.mapHash(this.slicers,function(e,r){return e.sliceProps(l[r],s,null,o,n)});o.allowAcrossResources=1===n.length,o.receiveProps(c({},this.joiner.joinProps(d,a),{dateProfile:s,cells:a.cells[0]}))},o.prototype.renderNowIndicator=function(e){var r=this.timeGrid,t=this.props.resourceDayTable,i=this.slicers[""].sliceNowDate(e,r,this.dayRanges),o=this.joiner.expandSegs(t,i);r.renderNowIndicator(o,e)},o.prototype.buildPositionCaches=function(){this.timeGrid.buildPositionCaches()},o.prototype.queryHit=function(e,r){var t=this.timeGrid.positionToHit(e,r);if(t)return{component:this.timeGrid,dateSpan:{range:t.dateSpan.range,allDay:t.dateSpan.allDay,resourceId:this.props.resourceDayTable.cells[0][t.col].resource.id},dayEl:t.dayEl,rect:{left:t.relativeRect.left,right:t.relativeRect.right,top:t.relativeRect.top,bottom:t.relativeRect.bottom},layer:0}},o}(r.DateComponent),u=function(e){function r(){return null!==e&&e.apply(this,arguments)||this}return l(r,e),r.prototype.transformSeg=function(e,r,t){return[c({},e,{col:r.computeCol(e.col,t)})]},r}(t.VResourceJoiner),p=function(e){function i(i,s,a,n){var l=e.call(this,i,s,a,n)||this;return l.flattenResources=r.memoize(t.flattenResources),l.buildResourceDayTable=r.memoize(y),l.resourceOrderSpecs=r.parseFieldSpecs(l.opt("resourceOrder")),l.opt("columnHeader")&&(l.header=new t.ResourceDayHeader(l.context,l.el.querySelector(".fc-head-container"))),l.resourceTimeGrid=new d(i,l.timeGrid),l.dayGrid&&(l.resourceDayGrid=new o.ResourceDayGrid(i,l.dayGrid)),l}return l(i,e),i.prototype.destroy=function(){e.prototype.destroy.call(this),this.header&&this.header.destroy(),this.resourceTimeGrid.destroy(),this.resourceDayGrid&&this.resourceDayGrid.destroy()},i.prototype.render=function(r){e.prototype.render.call(this,r);var t=this.splitter.splitProps(r),i=this.flattenResources(r.resourceStore,this.resourceOrderSpecs),o=this.buildResourceDayTable(this.props.dateProfile,this.dateProfileGenerator,i,this.opt("datesAboveResources"));this.header&&this.header.receiveProps({resources:i,dates:o.dayTable.headerDates,dateProfile:r.dateProfile,datesRepDistinctDays:!0,renderIntroHtml:this.renderHeadIntroHtml}),this.resourceTimeGrid.receiveProps(c({},t.timed,{dateProfile:r.dateProfile,resourceDayTable:o})),this.resourceDayGrid&&this.resourceDayGrid.receiveProps(c({},t.allDay,{dateProfile:r.dateProfile,resourceDayTable:o,isRigid:!1,nextDayThreshold:this.nextDayThreshold}))},i.prototype.renderNowIndicator=function(e){this.resourceTimeGrid.renderNowIndicator(e)},i.needsResourceData=!0,i}(i.AbstractTimeGridView);function y(e,r,o,s){var a=i.buildDayTable(e,r);return s?new t.DayResourceTable(a,o):new t.ResourceDayTable(a,o)}var f=r.createPlugin({deps:[s,a],defaultView:"resourceTimeGridDay",views:{resourceTimeGrid:{class:p,allDaySlot:!0,slotDuration:"00:30:00",slotEventOverlap:!0},resourceTimeGridDay:{type:"resourceTimeGrid",duration:{days:1}},resourceTimeGridWeek:{type:"resourceTimeGrid",duration:{weeks:1}}}});e.ResourceTimeGrid=d,e.ResourceTimeGridView=p,e.default=f,Object.defineProperty(e,"__esModule",{value:!0})});
\ No newline at end of file
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/resource-timegrid/package.json b/AKPlan/static/AKPlan/vendor/fullcalendar/resource-timegrid/package.json
deleted file mode 100644
index d8f7b5249ddaf0fbd71cbad389d778d00c0feaaf..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/resource-timegrid/package.json
+++ /dev/null
@@ -1,38 +0,0 @@
-{
-  "name": "@fullcalendar/resource-timegrid",
-  "version": "4.3.0",
-  "title": "FullCalendar Resource Time Grid Plugin",
-  "description": "Displays events on a vertical resource view with time slots",
-  "keywords": [
-    "calendar",
-    "event",
-    "full-sized"
-  ],
-  "homepage": "https://fullcalendar.io/scheduler",
-  "docs": "https://fullcalendar.io/docs/vertical-resource-view",
-  "bugs": "https://fullcalendar.io/reporting-bugs",
-  "repository": {
-    "type": "git",
-    "url": "https://github.com/fullcalendar/fullcalendar-scheduler.git",
-    "homepage": "https://github.com/fullcalendar/fullcalendar-scheduler"
-  },
-  "license": "SEE LICENSE IN LICENSE.md",
-  "author": {
-    "name": "Adam Shaw",
-    "email": "arshaw@arshaw.com",
-    "url": "http://arshaw.com/"
-  },
-  "copyright": "2019 Adam Shaw",
-  "dependencies": {
-    "@fullcalendar/resource-common": "~4.3.0",
-    "@fullcalendar/timegrid": "~4.3.0",
-    "@fullcalendar/resource-daygrid": "~4.3.0"
-  },
-  "peerDependencies": {
-    "@fullcalendar/core": "~4.3.0"
-  },
-  "main": "main.js",
-  "module": "main.esm.js",
-  "unpkg": "main.min.js",
-  "types": "main.d.ts"
-}
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/resource-timeline/LICENSE.md b/AKPlan/static/AKPlan/vendor/fullcalendar/resource-timeline/LICENSE.md
deleted file mode 100644
index 52296639f8117dd1cd8c5a9e629fed87e5b32cfc..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/resource-timeline/LICENSE.md
+++ /dev/null
@@ -1,18 +0,0 @@
-
-For complete licensing information, visit:
-http://fullcalendar.io/scheduler/license
-
-FullCalendar Scheduler is tri-licensed, meaning you must choose
-one of three licenses to use. Here is a summary of those licenses:
-
-- Commercial License
-  (a paid license, meant for commercial use)
-  http://fullcalendar.io/scheduler/license-details
-
-- Creative Commons Non-Commercial No-Derivatives
-  (meant for trial and non-commercial use)
-  https://creativecommons.org/licenses/by-nc-nd/4.0/
-
-- GPLv3 License
-  (meant for open-source projects)
-  http://www.gnu.org/licenses/gpl-3.0.en.html
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/resource-timeline/README.md b/AKPlan/static/AKPlan/vendor/fullcalendar/resource-timeline/README.md
deleted file mode 100644
index 4261c892dee14aa1c4867af07522142944ff38a5..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/resource-timeline/README.md
+++ /dev/null
@@ -1,8 +0,0 @@
-
-# FullCalendar Resource Timeline Plugin
-
-Display events and resources on a horizontal time axis
-
-[View the docs &raquo;](https://fullcalendar.io/docs/timeline-view)
-
-This package was created from the [FullCalendar monorepo &raquo;](https://github.com/fullcalendar/fullcalendar-scheduler)
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/resource-timeline/main.css b/AKPlan/static/AKPlan/vendor/fullcalendar/resource-timeline/main.css
deleted file mode 100644
index 584fe3302f56b899b76231a110e4dad3b55a1d9c..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/resource-timeline/main.css
+++ /dev/null
@@ -1,125 +0,0 @@
-/* Divider between resources and time area
---------------------------------------------------------------------------------------------------*/
-.fc-timeline .fc-divider {
-  width: 3px;
-  border-style: double;
-  /* overcome neighboring borders */
-}
-
-.fc-timeline .fc-head > tr > .fc-divider {
-  border-bottom: 0;
-}
-
-.fc-timeline .fc-body > tr > .fc-divider {
-  border-top: 0;
-}
-
-/* Resource Area
---------------------------------------------------------------------------------------------------*/
-.fc-resource-area {
-  width: 30%;
-}
-
-.fc-resource-area col {
-  width: 40%;
-  min-width: 70px;
-  /* will be read by JS */
-}
-
-.fc-resource-area col.fc-main-col {
-  width: 60%;
-  /* make the first column in a nested setup bigger */
-}
-
-.fc-flat .fc-expander-space {
-  /* fc-flat is opposite of fc-nested */
-  display: none;
-}
-
-.fc-ltr .fc-resource-area tr > * {
-  text-align: left;
-}
-
-.fc-rtl .fc-resource-area tr > * {
-  text-align: right;
-}
-
-.fc-resource-area .fc-cell-content {
-  padding-left: 4px;
-  padding-right: 4px;
-}
-
-/* head */
-.fc-resource-area .fc-super th {
-  text-align: center;
-}
-
-.fc-resource-area th > div {
-  position: relative;
-}
-
-.fc-resource-area th .fc-cell-content {
-  position: relative;
-  z-index: 1;
-}
-
-.fc-resource-area th .fc-col-resizer {
-  position: absolute;
-  z-index: 2;
-  top: 0;
-  bottom: 0;
-  width: 5px;
-}
-
-.fc-timeline .fc-col-resizer {
-  cursor: col-resize;
-}
-
-.fc-ltr .fc-resource-area th .fc-col-resizer {
-  right: -3px;
-}
-
-.fc-rtl .fc-resource-area th .fc-col-resizer {
-  left: -3px;
-}
-
-/* body */
-.fc-body .fc-resource-area .fc-cell-content {
-  /* might BE the cell */
-  padding-top: 8px;
-  padding-bottom: 8px;
-}
-
-.fc-no-overlap .fc-body .fc-resource-area .fc-cell-content {
-  /* might BE the cell */
-  padding-top: 6px;
-  padding-bottom: 6px;
-}
-
-.fc-resource-area .fc-icon {
-  /* the expander and spacers before the expander */
-  display: inline-block;
-  width: 1em;
-  /* ensure constant width, esp for empty icons */
-  text-align: center;
-}
-
-.fc-resource-area .fc-expander {
-  cursor: pointer;
-  opacity: 0.65;
-}
-
-/* body resource rows */
-.fc-time-area .fc-rows {
-  position: relative;
-  z-index: 3;
-}
-
-.fc-time-area .fc-rows td > div {
-  position: relative;
-}
-
-.fc-time-area .fc-rows .fc-bgevent-container,
-.fc-time-area .fc-rows .fc-highlight-container {
-  z-index: 1;
-}
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/resource-timeline/main.d.ts b/AKPlan/static/AKPlan/vendor/fullcalendar/resource-timeline/main.d.ts
deleted file mode 100644
index cddd55a2a122884836b12afde47d9afa3ca60178..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/resource-timeline/main.d.ts
+++ /dev/null
@@ -1,266 +0,0 @@
-// Generated by dts-bundle v0.7.3-fork.1
-// Dependencies for this module:
-//   ../../../../../@fullcalendar/core
-//   ../../../../../@fullcalendar/timeline
-//   ../../../../../@fullcalendar/resource-common
-
-declare module '@fullcalendar/resource-timeline' {
-    import ResourceTimelineView from '@fullcalendar/resource-timeline/ResourceTimelineView';
-    export { ResourceTimelineView };
-    const _default: import("@fullcalendar/core").PluginDef;
-    export default _default;
-}
-
-declare module '@fullcalendar/resource-timeline/ResourceTimelineView' {
-    import {
-        ComponentContext,
-        DateProfile,
-        DateProfileGenerator,
-        Duration,
-        ElementDragging,
-        Hit,
-        PositionCache,
-        SplittableProps,
-        View,
-        ViewSpec
-    } from '@fullcalendar/core';
-    import {ScrollJoiner, StickyScroller, TimeAxis, TimelineLane} from '@fullcalendar/timeline';
-    import {GroupNode, ResourceNode, ResourceViewProps} from '@fullcalendar/resource-common';
-    import GroupRow from '@fullcalendar/resource-timeline/GroupRow';
-    import ResourceRow from '@fullcalendar/resource-timeline/ResourceRow';
-    import Spreadsheet from '@fullcalendar/resource-timeline/Spreadsheet';
-    export {ResourceTimelineView as default, ResourceTimelineView};
-
-    class ResourceTimelineView extends View {
-        static needsResourceData: boolean;
-        props: ResourceViewProps;
-        spreadsheet: Spreadsheet;
-        timeAxis: TimeAxis;
-        lane: TimelineLane;
-        bodyScrollJoiner: ScrollJoiner;
-        spreadsheetBodyStickyScroller: StickyScroller;
-        isStickyScrollDirty: boolean;
-        timeAxisTbody: HTMLElement;
-        miscHeight: number;
-        rowNodes: (GroupNode | ResourceNode)[];
-        rowComponents: (GroupRow | ResourceRow)[];
-        rowComponentsById: {
-            [id: string]: (GroupRow | ResourceRow);
-        };
-        resourceAreaHeadEl: HTMLElement;
-        resourceAreaWidth?: number;
-        resourceAreaWidthDraggings: ElementDragging[];
-        superHeaderText: any;
-        isVGrouping: any;
-        isHGrouping: any;
-        groupSpecs: any;
-        colSpecs: any;
-        orderSpecs: any;
-        rowPositions: PositionCache;
-        constructor(context: ComponentContext, viewSpec: ViewSpec, dateProfileGenerator: DateProfileGenerator, parentEl: HTMLElement);
-        renderSkeletonHtml(): string;
-        render(props: ResourceViewProps): void;
-        updateHasNesting(isNesting: boolean): void;
-        diffRows(newNodes: any): void;
-        addRow(index: any, rowNode: any): void;
-        removeRows(startIndex: any, len: any, oldRowNodes: any): void;
-        buildChildComponent(node: (GroupNode | ResourceNode), spreadsheetTbody: HTMLElement, spreadsheetNext: HTMLElement, timeAxisTbody: HTMLElement, timeAxisNext: HTMLElement): GroupRow | ResourceRow;
-        renderRows(dateProfile: DateProfile, fallbackBusinessHours: any, splitProps: {
-            [resourceId: string]: SplittableProps;
-        }): void;
-        updateSize(isResize: any, viewHeight: any, isAuto: any): void;
-        syncHeadHeights(): void;
-        updateRowSizes(isResize: boolean): number;
-        destroy(): void;
-        getNowIndicatorUnit(dateProfile: DateProfile): string;
-        renderNowIndicator(date: any): void;
-        unrenderNowIndicator(): void;
-        queryScroll(): any;
-        applyScroll(scroll: any, isResize: any): void;
-        computeDateScroll(duration: Duration): {
-            left: number;
-        };
-        queryDateScroll(): {
-            left: number;
-        };
-        applyDateScroll(scroll: any): void;
-        queryResourceScroll(): any;
-        applyResourceScroll(scroll: any): void;
-        buildPositionCaches(): void;
-        queryHit(positionLeft: number, positionTop: number): Hit;
-        setResourceAreaWidth(widthVal: any): void;
-        initResourceAreaWidthDragging(): void;
-    }
-}
-
-declare module '@fullcalendar/resource-timeline/GroupRow' {
-    import {Group} from '@fullcalendar/resource-common';
-    import Row from '@fullcalendar/resource-timeline/Row';
-
-    export interface GroupRowProps {
-        spreadsheetColCnt: number;
-        id: string;
-        isExpanded: boolean;
-        group: Group;
-    }
-    export { GroupRow as default, GroupRow };
-    class GroupRow extends Row<GroupRowProps> {
-        spreadsheetHeightEl: HTMLElement;
-        timeAxisHeightEl: HTMLElement;
-        expanderIconEl: HTMLElement;
-        render(props: GroupRowProps): void;
-        destroy(): void;
-        renderCells(group: Group, spreadsheetColCnt: number): void;
-        unrenderCells(): void;
-        renderSpreadsheetContent(group: Group): HTMLElement;
-        renderCellText(group: Group): any;
-        getHeightEls(): HTMLElement[];
-        updateExpanderIcon(isExpanded: boolean): void;
-        onExpanderClick: (ev: UIEvent) => void;
-    }
-}
-
-declare module '@fullcalendar/resource-timeline/ResourceRow' {
-    import {
-        ComponentContext,
-        DateProfile,
-        DateSpan,
-        Duration,
-        EventInteractionState,
-        EventStore,
-        EventUiHash
-    } from '@fullcalendar/core';
-    import {TimeAxis, TimelineLane} from '@fullcalendar/timeline';
-    import Row from '@fullcalendar/resource-timeline/Row';
-    import SpreadsheetRow from '@fullcalendar/resource-timeline/SpreadsheetRow';
-    import {Resource} from '@fullcalendar/resource-common';
-
-    export interface ResourceRowProps {
-        dateProfile: DateProfile;
-        nextDayThreshold: Duration;
-        businessHours: EventStore | null;
-        eventStore: EventStore | null;
-        eventUiBases: EventUiHash;
-        dateSelection: DateSpan | null;
-        eventSelection: string;
-        eventDrag: EventInteractionState | null;
-        eventResize: EventInteractionState | null;
-        colSpecs: any;
-        id: string;
-        rowSpans: number[];
-        depth: number;
-        isExpanded: boolean;
-        hasChildren: boolean;
-        resource: Resource;
-    }
-    export { ResourceRow as default, ResourceRow };
-    class ResourceRow extends Row<ResourceRowProps> {
-        innerContainerEl: HTMLElement;
-        spreadsheetRow: SpreadsheetRow;
-        lane: TimelineLane;
-        constructor(context: ComponentContext, a: any, b: any, c: any, d: any, timeAxis: TimeAxis);
-        destroy(): void;
-        render(props: ResourceRowProps): void;
-        updateSize(isResize: boolean): void;
-        getHeightEls(): HTMLElement[];
-    }
-}
-
-declare module '@fullcalendar/resource-timeline/Spreadsheet' {
-    import {Component, ComponentContext} from '@fullcalendar/core';
-    import {HeaderBodyLayout} from '@fullcalendar/timeline';
-    import SpreadsheetHeader from '@fullcalendar/resource-timeline/SpreadsheetHeader';
-
-    export interface SpreadsheetProps {
-        superHeaderText: string;
-        colSpecs: any;
-    }
-
-    export {Spreadsheet as default, Spreadsheet};
-
-    class Spreadsheet extends Component<SpreadsheetProps> {
-        header: SpreadsheetHeader;
-        layout: HeaderBodyLayout;
-        bodyContainerEl: HTMLElement;
-        bodyColGroup: HTMLElement;
-        bodyTbody: HTMLElement;
-        bodyColEls: HTMLElement[];
-        constructor(context: ComponentContext, headParentEl: HTMLElement, bodyParentEl: HTMLElement);
-        destroy(): void;
-        render(props: SpreadsheetProps): void;
-        renderCells(superHeaderText: any, colSpecs: any): void;
-        unrenderCells(): void;
-        renderColTags(colSpecs: any): string;
-        updateSize(isResize: any, totalHeight: any, isAuto: any): void;
-        applyColWidths(colWidths: (number | string)[]): void;
-    }
-}
-
-declare module '@fullcalendar/resource-timeline/Row' {
-    import {Component, ComponentContext} from '@fullcalendar/core';
-    export { Row as default, Row };
-    abstract class Row<PropsType> extends Component<PropsType> {
-        spreadsheetTr: HTMLElement;
-        timeAxisTr: HTMLElement;
-        isSizeDirty: boolean;
-        constructor(context: ComponentContext, spreadsheetParent: HTMLElement, spreadsheetNextSibling: HTMLElement, timeAxisParent: HTMLElement, timeAxisNextSibling: HTMLElement);
-        destroy(): void;
-        abstract getHeightEls(): HTMLElement[];
-        updateSize(isResize: boolean): void;
-    }
-}
-
-declare module '@fullcalendar/resource-timeline/SpreadsheetRow' {
-    import {Component, ComponentContext} from '@fullcalendar/core';
-    import {Resource} from '@fullcalendar/resource-common';
-
-    export interface SpreadsheetRowProps {
-        colSpecs: any;
-        id: string;
-        rowSpans: number[];
-        depth: number;
-        isExpanded: boolean;
-        hasChildren: boolean;
-        resource: Resource;
-    }
-    export { SpreadsheetRow as default, SpreadsheetRow };
-    class SpreadsheetRow extends Component<SpreadsheetRowProps> {
-        tr: HTMLElement;
-        heightEl: HTMLElement;
-        expanderIconEl: HTMLElement;
-        constructor(context: ComponentContext, tr: HTMLElement);
-        render(props: SpreadsheetRowProps): void;
-        destroy(): void;
-        renderRow(resource: Resource, rowSpans: number[], depth: number, colSpecs: any): void;
-        unrenderRow(): void;
-        updateExpanderIcon(hasChildren: boolean, isExpanded: boolean): void;
-        onExpanderClick: (ev: UIEvent) => void;
-    }
-}
-
-declare module '@fullcalendar/resource-timeline/SpreadsheetHeader' {
-    import {Component, ComponentContext, ElementDragging, EmitterMixin} from '@fullcalendar/core';
-
-    export interface SpreadsheetHeaderProps {
-        superHeaderText: string;
-        colSpecs: any;
-        colTags: string;
-    }
-
-    export {SpreadsheetHeader as default, SpreadsheetHeader};
-
-    class SpreadsheetHeader extends Component<SpreadsheetHeaderProps> {
-        tableEl: HTMLElement;
-        resizerEls: HTMLElement[];
-        resizables: ElementDragging[];
-        thEls: HTMLElement[];
-        colEls: HTMLElement[];
-        colWidths: number[];
-        emitter: EmitterMixin;
-        constructor(context: ComponentContext, parentEl: HTMLElement);
-        destroy(): void;
-        render(props: SpreadsheetHeaderProps): void;
-        initColResizing(): void;
-    }
-}
-
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/resource-timeline/main.esm.js b/AKPlan/static/AKPlan/vendor/fullcalendar/resource-timeline/main.esm.js
deleted file mode 100644
index f6d0b58fe06fa24ab4cab7029163d50a1709a9b1..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/resource-timeline/main.esm.js
+++ /dev/null
@@ -1,1054 +0,0 @@
-/*!
-FullCalendar Resource Timeline Plugin v4.3.0
-Docs & License: https://fullcalendar.io/scheduler
-(c) 2019 Adam Shaw
-*/
-
-import {
-    applyStyleProp,
-    Component,
-    createElement,
-    createPlugin,
-    EmitterMixin,
-    htmlEscape,
-    htmlToElement,
-    isArraysEqual,
-    memoize,
-    memoizeRendering,
-    parseFieldSpecs,
-    PositionCache,
-    removeElement,
-    View
-} from '@fullcalendar/core';
-import TimelinePlugin, {
-    HeaderBodyLayout,
-    ScrollJoiner,
-    StickyScroller,
-    TimeAxis,
-    TimelineLane
-} from '@fullcalendar/timeline';
-import ResourceCommonPlugin, {
-    buildResourceFields,
-    buildResourceTextFunc,
-    buildRowNodes,
-    isGroupsEqual,
-    ResourceApi,
-    ResourceSplitter
-} from '@fullcalendar/resource-common';
-
-/*! *****************************************************************************
-Copyright (c) Microsoft Corporation. All rights reserved.
-Licensed under the Apache License, Version 2.0 (the "License"); you may not use
-this file except in compliance with the License. You may obtain a copy of the
-License at http://www.apache.org/licenses/LICENSE-2.0
-
-THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
-WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
-MERCHANTABLITY OR NON-INFRINGEMENT.
-
-See the Apache Version 2.0 License for specific language governing permissions
-and limitations under the License.
-***************************************************************************** */
-/* global Reflect, Promise */
-
-var extendStatics = function(d, b) {
-    extendStatics = Object.setPrototypeOf ||
-        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-    return extendStatics(d, b);
-};
-
-function __extends(d, b) {
-    extendStatics(d, b);
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-}
-
-var __assign = function() {
-    __assign = Object.assign || function __assign(t) {
-        for (var s, i = 1, n = arguments.length; i < n; i++) {
-            s = arguments[i];
-            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
-        }
-        return t;
-    };
-    return __assign.apply(this, arguments);
-};
-
-var Row = /** @class */ (function (_super) {
-    __extends(Row, _super);
-    function Row(context, spreadsheetParent, spreadsheetNextSibling, timeAxisParent, timeAxisNextSibling) {
-        var _this = _super.call(this, context) || this;
-        _this.isSizeDirty = false;
-        spreadsheetParent.insertBefore(_this.spreadsheetTr = document.createElement('tr'), spreadsheetNextSibling);
-        timeAxisParent.insertBefore(_this.timeAxisTr = document.createElement('tr'), timeAxisNextSibling);
-        return _this;
-    }
-    Row.prototype.destroy = function () {
-        removeElement(this.spreadsheetTr);
-        removeElement(this.timeAxisTr);
-        _super.prototype.destroy.call(this);
-    };
-    Row.prototype.updateSize = function (isResize) {
-        this.isSizeDirty = false;
-    };
-    return Row;
-}(Component));
-
-function updateExpanderIcon(el, isExpanded) {
-    var classList = el.classList;
-    if (isExpanded) {
-        classList.remove('fc-icon-plus-square');
-        classList.add('fc-icon-minus-square');
-    }
-    else {
-        classList.remove('fc-icon-minus-square');
-        classList.add('fc-icon-plus-square');
-    }
-}
-function clearExpanderIcon(el) {
-    var classList = el.classList;
-    classList.remove('fc-icon-minus-square');
-    classList.remove('fc-icon-plus-square');
-}
-function updateTrResourceId(tr, resourceId) {
-    tr.setAttribute('data-resource-id', resourceId);
-}
-
-var GroupRow = /** @class */ (function (_super) {
-    __extends(GroupRow, _super);
-    function GroupRow() {
-        var _this = _super !== null && _super.apply(this, arguments) || this;
-        _this._renderCells = memoizeRendering(_this.renderCells, _this.unrenderCells);
-        _this._updateExpanderIcon = memoizeRendering(_this.updateExpanderIcon, null, [_this._renderCells]);
-        _this.onExpanderClick = function (ev) {
-            var props = _this.props;
-            _this.calendar.dispatch({
-                type: 'SET_RESOURCE_ENTITY_EXPANDED',
-                id: props.id,
-                isExpanded: !props.isExpanded
-            });
-        };
-        return _this;
-    }
-    GroupRow.prototype.render = function (props) {
-        this._renderCells(props.group, props.spreadsheetColCnt);
-        this._updateExpanderIcon(props.isExpanded);
-        this.isSizeDirty = true;
-    };
-    GroupRow.prototype.destroy = function () {
-        _super.prototype.destroy.call(this);
-        this._renderCells.unrender(); // should unrender everything else
-    };
-    GroupRow.prototype.renderCells = function (group, spreadsheetColCnt) {
-        var spreadsheetContentEl = this.renderSpreadsheetContent(group);
-        this.spreadsheetTr.appendChild(createElement('td', {
-            className: 'fc-divider',
-            colSpan: spreadsheetColCnt // span across all columns
-        }, this.spreadsheetHeightEl = createElement('div', null, spreadsheetContentEl)) // needed by setTrInnerHeight
-        );
-        this.expanderIconEl = spreadsheetContentEl.querySelector('.fc-icon');
-        this.expanderIconEl.parentElement.addEventListener('click', this.onExpanderClick);
-        // insert a single cell, with a single empty <div>.
-        // there will be no content
-        this.timeAxisTr.appendChild(createElement('td', { className: 'fc-divider' }, this.timeAxisHeightEl = document.createElement('div')));
-    };
-    GroupRow.prototype.unrenderCells = function () {
-        this.spreadsheetTr.innerHTML = '';
-        this.timeAxisTr.innerHTML = '';
-    };
-    /*
-    Renders the content wrapper element that will be inserted into this row's TD cell.
-    */
-    GroupRow.prototype.renderSpreadsheetContent = function (group) {
-        var text = this.renderCellText(group);
-        var contentEl = htmlToElement('<div class="fc-cell-content">' +
-            '<span class="fc-expander">' +
-            '<span class="fc-icon"></span>' +
-            '</span>' +
-            '<span class="fc-cell-text">' +
-            (text ? htmlEscape(text) : '&nbsp;') +
-            '</span>' +
-            '</div>');
-        var filter = group.spec.render;
-        if (typeof filter === 'function') {
-            contentEl = filter(contentEl, group.value) || contentEl;
-        }
-        return contentEl;
-    };
-    GroupRow.prototype.renderCellText = function (group) {
-        var text = group.value || ''; // might be null/undefined if an ad-hoc grouping
-        var filter = group.spec.text;
-        if (typeof filter === 'function') {
-            text = filter(text) || text;
-        }
-        return text;
-    };
-    GroupRow.prototype.getHeightEls = function () {
-        return [this.spreadsheetHeightEl, this.timeAxisHeightEl];
-    };
-    GroupRow.prototype.updateExpanderIcon = function (isExpanded) {
-        updateExpanderIcon(this.expanderIconEl, isExpanded);
-    };
-    return GroupRow;
-}(Row));
-GroupRow.addEqualityFuncs({
-    group: isGroupsEqual // HACK for ResourceTimelineView::renderRows
-});
-
-var SpreadsheetRow = /** @class */ (function (_super) {
-    __extends(SpreadsheetRow, _super);
-    function SpreadsheetRow(context, tr) {
-        var _this = _super.call(this, context) || this;
-        _this._renderRow = memoizeRendering(_this.renderRow, _this.unrenderRow);
-        _this._updateTrResourceId = memoizeRendering(updateTrResourceId, null, [_this._renderRow]);
-        _this._updateExpanderIcon = memoizeRendering(_this.updateExpanderIcon, null, [_this._renderRow]);
-        _this.onExpanderClick = function (ev) {
-            var props = _this.props;
-            _this.calendar.dispatch({
-                type: 'SET_RESOURCE_ENTITY_EXPANDED',
-                id: props.id,
-                isExpanded: !props.isExpanded
-            });
-        };
-        _this.tr = tr;
-        return _this;
-    }
-    SpreadsheetRow.prototype.render = function (props) {
-        this._renderRow(props.resource, props.rowSpans, props.depth, props.colSpecs);
-        this._updateTrResourceId(this.tr, props.resource.id); // TODO: only use public ID?
-        this._updateExpanderIcon(props.hasChildren, props.isExpanded);
-    };
-    SpreadsheetRow.prototype.destroy = function () {
-        _super.prototype.destroy.call(this);
-        this._renderRow.unrender(); // should unrender everything else
-    };
-    SpreadsheetRow.prototype.renderRow = function (resource, rowSpans, depth, colSpecs) {
-        var _a = this, tr = _a.tr, theme = _a.theme, calendar = _a.calendar, view = _a.view;
-        var resourceFields = buildResourceFields(resource); // slightly inefficient. already done up the call stack
-        var mainTd;
-        for (var i = 0; i < colSpecs.length; i++) {
-            var colSpec = colSpecs[i];
-            var rowSpan = rowSpans[i];
-            if (rowSpan === 0) { // not responsible for group-based rows. VRowGroup is
-                continue;
-            }
-            else if (rowSpan == null) {
-                rowSpan = 1;
-            }
-            var text = void 0;
-            if (colSpec.field) {
-                text = resourceFields[colSpec.field];
-            }
-            else {
-                text = buildResourceTextFunc(colSpec.text, calendar)(resource);
-            }
-            var contentEl = htmlToElement('<div class="fc-cell-content">' +
-                (colSpec.isMain ? renderIconHtml(depth) : '') +
-                '<span class="fc-cell-text">' +
-                (text ? htmlEscape(text) : '&nbsp;') +
-                '</span>' +
-                '</div>');
-            if (typeof colSpec.render === 'function') { // a filter function for the element
-                contentEl = colSpec.render(new ResourceApi(calendar, resource), contentEl) || contentEl;
-            }
-            if (rowSpan > 1) {
-                contentEl.classList.add('fc-sticky');
-            }
-            var td = createElement('td', {
-                className: theme.getClass('widgetContent'),
-                rowspan: rowSpan
-            }, contentEl);
-            // the first cell of the row needs to have an inner div for setTrInnerHeight
-            if (colSpec.isMain) {
-                td.appendChild(this.heightEl = createElement('div', null, td.childNodes) // inner wrap
-                );
-                mainTd = td;
-            }
-            tr.appendChild(td);
-        }
-        this.expanderIconEl = tr.querySelector('.fc-expander-space .fc-icon');
-        // wait until very end
-        view.publiclyTrigger('resourceRender', [
-            {
-                resource: new ResourceApi(calendar, resource),
-                el: mainTd,
-                view: view
-            }
-        ]);
-    };
-    SpreadsheetRow.prototype.unrenderRow = function () {
-        this.tr.innerHTML = '';
-    };
-    SpreadsheetRow.prototype.updateExpanderIcon = function (hasChildren, isExpanded) {
-        var expanderIconEl = this.expanderIconEl;
-        var expanderEl = expanderIconEl.parentElement;
-        if (expanderIconEl &&
-            expanderEl // why would this be null?? was the case in IE11
-        ) {
-            if (hasChildren) {
-                expanderEl.addEventListener('click', this.onExpanderClick);
-                expanderEl.classList.add('fc-expander');
-                updateExpanderIcon(expanderIconEl, isExpanded);
-            }
-            else {
-                expanderEl.removeEventListener('click', this.onExpanderClick);
-                expanderEl.classList.remove('fc-expander');
-                clearExpanderIcon(expanderIconEl);
-            }
-        }
-    };
-    return SpreadsheetRow;
-}(Component));
-/*
-Renders the HTML responsible for the subrow expander area,
-as well as the space before it (used to align expanders of similar depths)
-*/
-function renderIconHtml(depth) {
-    var html = '';
-    for (var i = 0; i < depth; i++) {
-        html += '<span class="fc-icon"></span>';
-    }
-    html +=
-        '<span class="fc-expander-space">' +
-            '<span class="fc-icon"></span>' +
-            '</span>';
-    return html;
-}
-
-var ResourceRow = /** @class */ (function (_super) {
-    __extends(ResourceRow, _super);
-    function ResourceRow(context, a, b, c, d, timeAxis) {
-        var _this = _super.call(this, context, a, b, c, d) || this;
-        _this._updateTrResourceId = memoizeRendering(updateTrResourceId);
-        _this.spreadsheetRow = new SpreadsheetRow(context, _this.spreadsheetTr);
-        _this.timeAxisTr.appendChild(createElement('td', { className: _this.theme.getClass('widgetContent') }, _this.innerContainerEl = document.createElement('div')));
-        _this.lane = new TimelineLane(context, _this.innerContainerEl, _this.innerContainerEl, timeAxis);
-        return _this;
-    }
-    ResourceRow.prototype.destroy = function () {
-        this.spreadsheetRow.destroy();
-        this.lane.destroy();
-        _super.prototype.destroy.call(this);
-    };
-    ResourceRow.prototype.render = function (props) {
-        // spreadsheetRow handles calling updateTrResourceId for spreadsheetTr
-        this.spreadsheetRow.receiveProps({
-            colSpecs: props.colSpecs,
-            id: props.id,
-            rowSpans: props.rowSpans,
-            depth: props.depth,
-            isExpanded: props.isExpanded,
-            hasChildren: props.hasChildren,
-            resource: props.resource
-        });
-        this._updateTrResourceId(this.timeAxisTr, props.resource.id);
-        this.lane.receiveProps({
-            dateProfile: props.dateProfile,
-            nextDayThreshold: props.nextDayThreshold,
-            businessHours: props.businessHours,
-            eventStore: props.eventStore,
-            eventUiBases: props.eventUiBases,
-            dateSelection: props.dateSelection,
-            eventSelection: props.eventSelection,
-            eventDrag: props.eventDrag,
-            eventResize: props.eventResize
-        });
-        this.isSizeDirty = true;
-    };
-    ResourceRow.prototype.updateSize = function (isResize) {
-        _super.prototype.updateSize.call(this, isResize);
-        this.lane.updateSize(isResize);
-    };
-    ResourceRow.prototype.getHeightEls = function () {
-        return [this.spreadsheetRow.heightEl, this.innerContainerEl];
-    };
-    return ResourceRow;
-}(Row));
-ResourceRow.addEqualityFuncs({
-    rowSpans: isArraysEqual // HACK for isSizeDirty, ResourceTimelineView::renderRows
-});
-
-var COL_MIN_WIDTH = 30;
-var SpreadsheetHeader = /** @class */ (function (_super) {
-    __extends(SpreadsheetHeader, _super);
-    function SpreadsheetHeader(context, parentEl) {
-        var _this = _super.call(this, context) || this;
-        _this.resizables = [];
-        _this.colWidths = [];
-        _this.emitter = new EmitterMixin();
-        parentEl.appendChild(_this.tableEl = createElement('table', {
-            className: _this.theme.getClass('tableGrid')
-        }));
-        return _this;
-    }
-    SpreadsheetHeader.prototype.destroy = function () {
-        for (var _i = 0, _a = this.resizables; _i < _a.length; _i++) {
-            var resizable = _a[_i];
-            resizable.destroy();
-        }
-        removeElement(this.tableEl);
-        _super.prototype.destroy.call(this);
-    };
-    SpreadsheetHeader.prototype.render = function (props) {
-        var theme = this.theme;
-        var colSpecs = props.colSpecs;
-        var html = '<colgroup>' + props.colTags + '</colgroup>' +
-            '<tbody>';
-        if (props.superHeaderText) {
-            html +=
-                '<tr class="fc-super">' +
-                    '<th class="' + theme.getClass('widgetHeader') + '" colspan="' + colSpecs.length + '">' +
-                    '<div class="fc-cell-content">' +
-                    '<span class="fc-cell-text">' +
-                    htmlEscape(props.superHeaderText) +
-                    '</span>' +
-                    '</div>' +
-                    '</th>' +
-                    '</tr>';
-        }
-        html += '<tr>';
-        for (var i = 0; i < colSpecs.length; i++) {
-            var o = colSpecs[i];
-            var isLast = i === (colSpecs.length - 1);
-            html +=
-                "<th class=\"" + theme.getClass('widgetHeader') + "\">" +
-                    '<div>' +
-                    '<div class="fc-cell-content">' +
-                    (o.isMain ?
-                        '<span class="fc-expander-space">' +
-                            '<span class="fc-icon"></span>' +
-                            '</span>' :
-                        '') +
-                    '<span class="fc-cell-text">' +
-                    htmlEscape(o.labelText || '') + // what about normalizing this value ahead of time?
-                    '</span>' +
-                    '</div>' +
-                    (!isLast ? '<div class="fc-col-resizer"></div>' : '') +
-                    '</div>' +
-                    '</th>';
-        }
-        html += '</tr>';
-        html += '</tbody>';
-        this.tableEl.innerHTML = html;
-        this.thEls = Array.prototype.slice.call(this.tableEl.querySelectorAll('th'));
-        this.colEls = Array.prototype.slice.call(this.tableEl.querySelectorAll('col'));
-        this.resizerEls = Array.prototype.slice.call(this.tableEl.querySelectorAll('.fc-col-resizer'));
-        this.initColResizing();
-    };
-    SpreadsheetHeader.prototype.initColResizing = function () {
-        var _this = this;
-        var ElementDraggingImpl = this.calendar.pluginSystem.hooks.elementDraggingImpl;
-        if (ElementDraggingImpl) {
-            this.resizables = this.resizerEls.map(function (handleEl, colIndex) {
-                var dragging = new ElementDraggingImpl(handleEl);
-                var startWidth;
-                dragging.emitter.on('dragstart', function () {
-                    startWidth = _this.colWidths[colIndex];
-                    if (typeof startWidth !== 'number') {
-                        startWidth = _this.thEls[colIndex].getBoundingClientRect().width;
-                    }
-                });
-                dragging.emitter.on('dragmove', function (pev) {
-                    _this.colWidths[colIndex] = Math.max(startWidth + pev.deltaX * (_this.isRtl ? -1 : 1), COL_MIN_WIDTH);
-                    _this.emitter.trigger('colwidthchange', _this.colWidths);
-                });
-                dragging.setAutoScrollEnabled(false); // because gets weird with auto-scrolling time area
-                return dragging;
-            });
-        }
-    };
-    return SpreadsheetHeader;
-}(Component));
-
-var Spreadsheet = /** @class */ (function (_super) {
-    __extends(Spreadsheet, _super);
-    function Spreadsheet(context, headParentEl, bodyParentEl) {
-        var _this = _super.call(this, context) || this;
-        _this._renderCells = memoizeRendering(_this.renderCells, _this.unrenderCells);
-        _this.layout = new HeaderBodyLayout(headParentEl, bodyParentEl, 'clipped-scroll');
-        var headerEnhancedScroller = _this.layout.headerScroller.enhancedScroll;
-        var bodyEnhancedScroller = _this.layout.bodyScroller.enhancedScroll;
-        _this.header = new SpreadsheetHeader(context, headerEnhancedScroller.canvas.contentEl);
-        _this.header.emitter.on('colwidthchange', function (colWidths) {
-            _this.applyColWidths(colWidths);
-        });
-        bodyEnhancedScroller.canvas.contentEl
-            .appendChild(_this.bodyContainerEl = createElement('div', { className: 'fc-rows' }, '<table>' +
-            '<colgroup />' +
-            '<tbody />' +
-            '</table>'));
-        _this.bodyColGroup = _this.bodyContainerEl.querySelector('colgroup');
-        _this.bodyTbody = _this.bodyContainerEl.querySelector('tbody');
-        return _this;
-    }
-    Spreadsheet.prototype.destroy = function () {
-        this.header.destroy();
-        this.layout.destroy();
-        this._renderCells.unrender();
-        _super.prototype.destroy.call(this);
-    };
-    Spreadsheet.prototype.render = function (props) {
-        this._renderCells(props.superHeaderText, props.colSpecs);
-    };
-    Spreadsheet.prototype.renderCells = function (superHeaderText, colSpecs) {
-        var colTags = this.renderColTags(colSpecs);
-        this.header.receiveProps({
-            superHeaderText: superHeaderText,
-            colSpecs: colSpecs,
-            colTags: colTags
-        });
-        this.bodyColGroup.innerHTML = colTags;
-        this.bodyColEls = Array.prototype.slice.call(this.bodyColGroup.querySelectorAll('col'));
-        this.applyColWidths(colSpecs.map(function (colSpec) { return colSpec.width; }));
-    };
-    Spreadsheet.prototype.unrenderCells = function () {
-        this.bodyColGroup.innerHTML = '';
-    };
-    Spreadsheet.prototype.renderColTags = function (colSpecs) {
-        var html = '';
-        for (var _i = 0, colSpecs_1 = colSpecs; _i < colSpecs_1.length; _i++) {
-            var o = colSpecs_1[_i];
-            if (o.isMain) {
-                html += '<col class="fc-main-col"/>';
-            }
-            else {
-                html += '<col/>';
-            }
-        }
-        return html;
-    };
-    Spreadsheet.prototype.updateSize = function (isResize, totalHeight, isAuto) {
-        this.layout.setHeight(totalHeight, isAuto);
-    };
-    Spreadsheet.prototype.applyColWidths = function (colWidths) {
-        var _this = this;
-        colWidths.forEach(function (colWidth, colIndex) {
-            var headEl = _this.header.colEls[colIndex]; // bad to access child
-            var bodyEl = _this.bodyColEls[colIndex];
-            var styleVal;
-            if (typeof colWidth === 'number') {
-                styleVal = colWidth + 'px';
-            }
-            else if (typeof colWidth == null) {
-                styleVal = '';
-            }
-            headEl.style.width = bodyEl.style.width = styleVal;
-        });
-    };
-    return Spreadsheet;
-}(Component));
-
-var MIN_RESOURCE_AREA_WIDTH = 30; // definitely bigger than scrollbars
-var ResourceTimelineView = /** @class */ (function (_super) {
-    __extends(ResourceTimelineView, _super);
-    function ResourceTimelineView(context, viewSpec, dateProfileGenerator, parentEl) {
-        var _this = _super.call(this, context, viewSpec, dateProfileGenerator, parentEl) || this;
-        _this.isStickyScrollDirty = false;
-        _this.rowNodes = [];
-        _this.rowComponents = [];
-        _this.rowComponentsById = {};
-        _this.resourceAreaWidthDraggings = [];
-        _this.splitter = new ResourceSplitter(); // doesn't let it do businessHours tho
-        _this.hasResourceBusinessHours = memoize(hasResourceBusinessHours);
-        _this.buildRowNodes = memoize(buildRowNodes);
-        _this.hasNesting = memoize(hasNesting);
-        _this._updateHasNesting = memoizeRendering(_this.updateHasNesting);
-        var allColSpecs = _this.opt('resourceColumns') || [];
-        var labelText = _this.opt('resourceLabelText'); // TODO: view.override
-        var defaultLabelText = 'Resources'; // TODO: view.defaults
-        var superHeaderText = null;
-        if (!allColSpecs.length) {
-            allColSpecs.push({
-                labelText: labelText || defaultLabelText,
-                text: buildResourceTextFunc(_this.opt('resourceText'), _this.calendar)
-            });
-        }
-        else {
-            superHeaderText = labelText;
-        }
-        var plainColSpecs = [];
-        var groupColSpecs = [];
-        var groupSpecs = [];
-        var isVGrouping = false;
-        var isHGrouping = false;
-        for (var _i = 0, allColSpecs_1 = allColSpecs; _i < allColSpecs_1.length; _i++) {
-            var colSpec = allColSpecs_1[_i];
-            if (colSpec.group) {
-                groupColSpecs.push(colSpec);
-            }
-            else {
-                plainColSpecs.push(colSpec);
-            }
-        }
-        plainColSpecs[0].isMain = true;
-        if (groupColSpecs.length) {
-            groupSpecs = groupColSpecs;
-            isVGrouping = true;
-        }
-        else {
-            var hGroupField = _this.opt('resourceGroupField');
-            if (hGroupField) {
-                isHGrouping = true;
-                groupSpecs.push({
-                    field: hGroupField,
-                    text: _this.opt('resourceGroupText'),
-                    render: _this.opt('resourceGroupRender')
-                });
-            }
-        }
-        var allOrderSpecs = parseFieldSpecs(_this.opt('resourceOrder'));
-        var plainOrderSpecs = [];
-        for (var _a = 0, allOrderSpecs_1 = allOrderSpecs; _a < allOrderSpecs_1.length; _a++) {
-            var orderSpec = allOrderSpecs_1[_a];
-            var isGroup = false;
-            for (var _b = 0, groupSpecs_1 = groupSpecs; _b < groupSpecs_1.length; _b++) {
-                var groupSpec = groupSpecs_1[_b];
-                if (groupSpec.field === orderSpec.field) {
-                    groupSpec.order = orderSpec.order; // -1, 0, 1
-                    isGroup = true;
-                    break;
-                }
-            }
-            if (!isGroup) {
-                plainOrderSpecs.push(orderSpec);
-            }
-        }
-        _this.superHeaderText = superHeaderText;
-        _this.isVGrouping = isVGrouping;
-        _this.isHGrouping = isHGrouping;
-        _this.groupSpecs = groupSpecs;
-        _this.colSpecs = groupColSpecs.concat(plainColSpecs);
-        _this.orderSpecs = plainOrderSpecs;
-        // START RENDERING...
-        _this.el.classList.add('fc-timeline');
-        if (_this.opt('eventOverlap') === false) {
-            _this.el.classList.add('fc-no-overlap');
-        }
-        _this.el.innerHTML = _this.renderSkeletonHtml();
-        _this.resourceAreaHeadEl = _this.el.querySelector('thead .fc-resource-area');
-        _this.setResourceAreaWidth(_this.opt('resourceAreaWidth'));
-        _this.initResourceAreaWidthDragging();
-        _this.miscHeight = _this.el.getBoundingClientRect().height;
-        _this.spreadsheet = new Spreadsheet(_this.context, _this.resourceAreaHeadEl, _this.el.querySelector('tbody .fc-resource-area'));
-        _this.timeAxis = new TimeAxis(_this.context, _this.el.querySelector('thead .fc-time-area'), _this.el.querySelector('tbody .fc-time-area'));
-        var timeAxisRowContainer = createElement('div', { className: 'fc-rows' }, '<table><tbody /></table>');
-        _this.timeAxis.layout.bodyScroller.enhancedScroll.canvas.contentEl.appendChild(timeAxisRowContainer);
-        _this.timeAxisTbody = timeAxisRowContainer.querySelector('tbody');
-        _this.lane = new TimelineLane(_this.context, null, _this.timeAxis.layout.bodyScroller.enhancedScroll.canvas.bgEl, _this.timeAxis);
-        _this.bodyScrollJoiner = new ScrollJoiner('vertical', [
-            _this.spreadsheet.layout.bodyScroller,
-            _this.timeAxis.layout.bodyScroller
-        ]);
-        // after scrolljoiner
-        _this.spreadsheetBodyStickyScroller = new StickyScroller(_this.spreadsheet.layout.bodyScroller.enhancedScroll, _this.isRtl, true // isVertical
-        );
-        _this.spreadsheet.receiveProps({
-            superHeaderText: _this.superHeaderText,
-            colSpecs: _this.colSpecs
-        });
-        // Component...
-        context.calendar.registerInteractiveComponent(_this, {
-            el: _this.timeAxis.slats.el
-        });
-        return _this;
-    }
-    ResourceTimelineView.prototype.renderSkeletonHtml = function () {
-        var theme = this.theme;
-        return "<table class=\"" + theme.getClass('tableGrid') + "\"> <thead class=\"fc-head\"> <tr> <td class=\"fc-resource-area " + theme.getClass('widgetHeader') + "\"></td> <td class=\"fc-divider fc-col-resizer " + theme.getClass('widgetHeader') + "\"></td> <td class=\"fc-time-area " + theme.getClass('widgetHeader') + "\"></td> </tr> </thead> <tbody class=\"fc-body\"> <tr> <td class=\"fc-resource-area " + theme.getClass('widgetContent') + "\"></td> <td class=\"fc-divider fc-col-resizer " + theme.getClass('widgetHeader') + "\"></td> <td class=\"fc-time-area " + theme.getClass('widgetContent') + "\"></td> </tr> </tbody> </table>";
-    };
-    ResourceTimelineView.prototype.render = function (props) {
-        _super.prototype.render.call(this, props);
-        var splitProps = this.splitter.splitProps(props);
-        var hasResourceBusinessHours = this.hasResourceBusinessHours(props.resourceStore);
-        this.timeAxis.receiveProps({
-            dateProfile: props.dateProfile
-        });
-        // for all-resource bg events / selections / business-hours
-        this.lane.receiveProps(__assign({}, splitProps[''], { dateProfile: props.dateProfile, nextDayThreshold: this.nextDayThreshold, businessHours: hasResourceBusinessHours ? null : props.businessHours }));
-        var newRowNodes = this.buildRowNodes(props.resourceStore, this.groupSpecs, this.orderSpecs, this.isVGrouping, props.resourceEntityExpansions, this.opt('resourcesInitiallyExpanded'));
-        this._updateHasNesting(this.hasNesting(newRowNodes));
-        this.diffRows(newRowNodes);
-        this.renderRows(props.dateProfile, hasResourceBusinessHours ? props.businessHours : null, // CONFUSING, comment
-        splitProps);
-    };
-    ResourceTimelineView.prototype.updateHasNesting = function (isNesting) {
-        var classList = this.el.classList;
-        if (isNesting) {
-            classList.remove('fc-flat');
-        }
-        else {
-            classList.add('fc-flat');
-        }
-    };
-    ResourceTimelineView.prototype.diffRows = function (newNodes) {
-        var oldNodes = this.rowNodes;
-        var oldLen = oldNodes.length;
-        var oldIndexHash = {}; // id -> index
-        var oldI = 0;
-        var newI = 0;
-        for (oldI = 0; oldI < oldLen; oldI++) {
-            oldIndexHash[oldNodes[oldI].id] = oldI;
-        }
-        // iterate new nodes
-        for (oldI = 0, newI = 0; newI < newNodes.length; newI++) {
-            var newNode = newNodes[newI];
-            var oldIFound = oldIndexHash[newNode.id];
-            if (oldIFound != null && oldIFound >= oldI) {
-                this.removeRows(newI, oldIFound - oldI, oldNodes); // won't do anything if same index
-                oldI = oldIFound + 1;
-            }
-            else {
-                this.addRow(newI, newNode);
-            }
-        }
-        // old rows that weren't found need to be removed
-        this.removeRows(newI, oldLen - oldI, oldNodes); // won't do anything if same index
-        this.rowNodes = newNodes;
-    };
-    /*
-    rowComponents is the in-progress result
-    */
-    ResourceTimelineView.prototype.addRow = function (index, rowNode) {
-        var _a = this, rowComponents = _a.rowComponents, rowComponentsById = _a.rowComponentsById;
-        var nextComponent = rowComponents[index];
-        var newComponent = this.buildChildComponent(rowNode, this.spreadsheet.bodyTbody, nextComponent ? nextComponent.spreadsheetTr : null, this.timeAxisTbody, nextComponent ? nextComponent.timeAxisTr : null);
-        rowComponents.splice(index, 0, newComponent);
-        rowComponentsById[rowNode.id] = newComponent;
-    };
-    ResourceTimelineView.prototype.removeRows = function (startIndex, len, oldRowNodes) {
-        if (len) {
-            var _a = this, rowComponents = _a.rowComponents, rowComponentsById = _a.rowComponentsById;
-            for (var i = 0; i < len; i++) {
-                var rowComponent = rowComponents[startIndex + i];
-                rowComponent.destroy();
-                delete rowComponentsById[oldRowNodes[i].id];
-            }
-            rowComponents.splice(startIndex, len);
-        }
-    };
-    ResourceTimelineView.prototype.buildChildComponent = function (node, spreadsheetTbody, spreadsheetNext, timeAxisTbody, timeAxisNext) {
-        if (node.group) {
-            return new GroupRow(this.context, spreadsheetTbody, spreadsheetNext, timeAxisTbody, timeAxisNext);
-        }
-        else if (node.resource) {
-            return new ResourceRow(this.context, spreadsheetTbody, spreadsheetNext, timeAxisTbody, timeAxisNext, this.timeAxis);
-        }
-    };
-    ResourceTimelineView.prototype.renderRows = function (dateProfile, fallbackBusinessHours, splitProps) {
-        var _a = this, rowNodes = _a.rowNodes, rowComponents = _a.rowComponents;
-        for (var i = 0; i < rowNodes.length; i++) {
-            var rowNode = rowNodes[i];
-            var rowComponent = rowComponents[i];
-            if (rowNode.group) {
-                rowComponent.receiveProps({
-                    spreadsheetColCnt: this.colSpecs.length,
-                    id: rowNode.id,
-                    isExpanded: rowNode.isExpanded,
-                    group: rowNode.group
-                });
-            }
-            else {
-                var resource = rowNode.resource;
-                rowComponent.receiveProps(__assign({}, splitProps[resource.id], { dateProfile: dateProfile, nextDayThreshold: this.nextDayThreshold, businessHours: resource.businessHours || fallbackBusinessHours, colSpecs: this.colSpecs, id: rowNode.id, rowSpans: rowNode.rowSpans, depth: rowNode.depth, isExpanded: rowNode.isExpanded, hasChildren: rowNode.hasChildren, resource: rowNode.resource }));
-            }
-        }
-    };
-    ResourceTimelineView.prototype.updateSize = function (isResize, viewHeight, isAuto) {
-        // FYI: this ordering is really important
-        var calendar = this.calendar;
-        var isBaseSizing = isResize || calendar.isViewUpdated || calendar.isDatesUpdated || calendar.isEventsUpdated;
-        if (isBaseSizing) {
-            this.syncHeadHeights();
-            this.timeAxis.updateSize(isResize, viewHeight - this.miscHeight, isAuto);
-            this.spreadsheet.updateSize(isResize, viewHeight - this.miscHeight, isAuto);
-        }
-        var rowSizingCnt = this.updateRowSizes(isResize);
-        this.lane.updateSize(isResize); // is efficient. uses flags
-        if (isBaseSizing || rowSizingCnt) {
-            this.bodyScrollJoiner.update();
-            this.timeAxis.layout.scrollJoiner.update(); // hack
-            this.rowPositions = new PositionCache(this.timeAxis.slats.el, this.rowComponents.map(function (rowComponent) {
-                return rowComponent.timeAxisTr;
-            }), false, // isHorizontal
-            true // isVertical
-            );
-            this.rowPositions.build();
-            this.isStickyScrollDirty = true;
-        }
-    };
-    ResourceTimelineView.prototype.syncHeadHeights = function () {
-        var spreadsheetHeadEl = this.spreadsheet.header.tableEl;
-        var timeAxisHeadEl = this.timeAxis.header.tableEl;
-        spreadsheetHeadEl.style.height = '';
-        timeAxisHeadEl.style.height = '';
-        var max = Math.max(spreadsheetHeadEl.getBoundingClientRect().height, timeAxisHeadEl.getBoundingClientRect().height);
-        spreadsheetHeadEl.style.height =
-            timeAxisHeadEl.style.height = max + 'px';
-    };
-    ResourceTimelineView.prototype.updateRowSizes = function (isResize) {
-        var dirtyRowComponents = this.rowComponents;
-        if (!isResize) {
-            dirtyRowComponents = dirtyRowComponents.filter(function (rowComponent) {
-                return rowComponent.isSizeDirty;
-            });
-        }
-        var elArrays = dirtyRowComponents.map(function (rowComponent) {
-            return rowComponent.getHeightEls();
-        });
-        // reset to natural heights
-        for (var _i = 0, elArrays_1 = elArrays; _i < elArrays_1.length; _i++) {
-            var elArray = elArrays_1[_i];
-            for (var _a = 0, elArray_1 = elArray; _a < elArray_1.length; _a++) {
-                var el = elArray_1[_a];
-                el.style.height = '';
-            }
-        }
-        // let rows update their contents' heights
-        for (var _b = 0, dirtyRowComponents_1 = dirtyRowComponents; _b < dirtyRowComponents_1.length; _b++) {
-            var rowComponent = dirtyRowComponents_1[_b];
-            rowComponent.updateSize(isResize); // will reset isSizeDirty
-        }
-        var maxHeights = elArrays.map(function (elArray) {
-            var maxHeight = null;
-            for (var _i = 0, elArray_2 = elArray; _i < elArray_2.length; _i++) {
-                var el = elArray_2[_i];
-                var height = el.getBoundingClientRect().height;
-                if (maxHeight === null || height > maxHeight) {
-                    maxHeight = height;
-                }
-            }
-            return maxHeight;
-        });
-        for (var i = 0; i < elArrays.length; i++) {
-            for (var _c = 0, _d = elArrays[i]; _c < _d.length; _c++) {
-                var el = _d[_c];
-                el.style.height = maxHeights[i] + 'px';
-            }
-        }
-        return dirtyRowComponents.length;
-    };
-    ResourceTimelineView.prototype.destroy = function () {
-        for (var _i = 0, _a = this.rowComponents; _i < _a.length; _i++) {
-            var rowComponent = _a[_i];
-            rowComponent.destroy();
-        }
-        this.rowNodes = [];
-        this.rowComponents = [];
-        this.spreadsheet.destroy();
-        this.timeAxis.destroy();
-        for (var _b = 0, _c = this.resourceAreaWidthDraggings; _b < _c.length; _b++) {
-            var resourceAreaWidthDragging = _c[_b];
-            resourceAreaWidthDragging.destroy();
-        }
-        this.spreadsheetBodyStickyScroller.destroy();
-        _super.prototype.destroy.call(this);
-        this.calendar.unregisterInteractiveComponent(this);
-    };
-    // Now Indicator
-    // ------------------------------------------------------------------------------------------
-    ResourceTimelineView.prototype.getNowIndicatorUnit = function (dateProfile) {
-        return this.timeAxis.getNowIndicatorUnit(dateProfile);
-    };
-    ResourceTimelineView.prototype.renderNowIndicator = function (date) {
-        this.timeAxis.renderNowIndicator(date);
-    };
-    ResourceTimelineView.prototype.unrenderNowIndicator = function () {
-        this.timeAxis.unrenderNowIndicator();
-    };
-    // Scrolling
-    // ------------------------------------------------------------------------------------------------------------------
-    // this is useful for scrolling prev/next dates while resource is scrolled down
-    ResourceTimelineView.prototype.queryScroll = function () {
-        var scroll = _super.prototype.queryScroll.call(this);
-        if (this.props.resourceStore) {
-            __assign(scroll, this.queryResourceScroll());
-        }
-        return scroll;
-    };
-    ResourceTimelineView.prototype.applyScroll = function (scroll, isResize) {
-        _super.prototype.applyScroll.call(this, scroll, isResize);
-        if (this.props.resourceStore) {
-            this.applyResourceScroll(scroll);
-        }
-        // avoid updating stickyscroll too often
-        if (isResize || this.isStickyScrollDirty) {
-            this.isStickyScrollDirty = false;
-            this.spreadsheetBodyStickyScroller.updateSize();
-            this.timeAxis.updateStickyScrollers();
-        }
-    };
-    ResourceTimelineView.prototype.computeDateScroll = function (duration) {
-        return this.timeAxis.computeDateScroll(duration);
-    };
-    ResourceTimelineView.prototype.queryDateScroll = function () {
-        return this.timeAxis.queryDateScroll();
-    };
-    ResourceTimelineView.prototype.applyDateScroll = function (scroll) {
-        this.timeAxis.applyDateScroll(scroll);
-    };
-    ResourceTimelineView.prototype.queryResourceScroll = function () {
-        var _a = this, rowComponents = _a.rowComponents, rowNodes = _a.rowNodes;
-        var scroll = {};
-        var scrollerTop = this.timeAxis.layout.bodyScroller.el.getBoundingClientRect().top; // fixed position
-        for (var i = 0; i < rowComponents.length; i++) {
-            var rowComponent = rowComponents[i];
-            var rowNode = rowNodes[i];
-            var el = rowComponent.timeAxisTr;
-            var elBottom = el.getBoundingClientRect().bottom; // fixed position
-            if (elBottom > scrollerTop) {
-                scroll.rowId = rowNode.id;
-                scroll.bottom = elBottom - scrollerTop;
-                break;
-            }
-        }
-        // TODO: what about left scroll state for spreadsheet area?
-        return scroll;
-    };
-    ResourceTimelineView.prototype.applyResourceScroll = function (scroll) {
-        var rowId = scroll.forcedRowId || scroll.rowId;
-        if (rowId) {
-            var rowComponent = this.rowComponentsById[rowId];
-            if (rowComponent) {
-                var el = rowComponent.timeAxisTr;
-                if (el) {
-                    var innerTop = this.timeAxis.layout.bodyScroller.enhancedScroll.canvas.el.getBoundingClientRect().top;
-                    var rowRect = el.getBoundingClientRect();
-                    var scrollTop = (scroll.forcedRowId ?
-                        rowRect.top : // just use top edge
-                        rowRect.bottom - scroll.bottom) - // pixels from bottom edge
-                        innerTop;
-                    this.timeAxis.layout.bodyScroller.enhancedScroll.setScrollTop(scrollTop);
-                    this.spreadsheet.layout.bodyScroller.enhancedScroll.setScrollTop(scrollTop);
-                }
-            }
-        }
-    };
-    // TODO: scrollToResource
-    // Hit System
-    // ------------------------------------------------------------------------------------------
-    ResourceTimelineView.prototype.buildPositionCaches = function () {
-        this.timeAxis.slats.updateSize();
-        this.rowPositions.build();
-    };
-    ResourceTimelineView.prototype.queryHit = function (positionLeft, positionTop) {
-        var rowPositions = this.rowPositions;
-        var slats = this.timeAxis.slats;
-        var rowIndex = rowPositions.topToIndex(positionTop);
-        if (rowIndex != null) {
-            var resource = this.rowNodes[rowIndex].resource;
-            if (resource) { // not a group
-                var slatHit = slats.positionToHit(positionLeft);
-                if (slatHit) {
-                    return {
-                        component: this,
-                        dateSpan: {
-                            range: slatHit.dateSpan.range,
-                            allDay: slatHit.dateSpan.allDay,
-                            resourceId: resource.id
-                        },
-                        rect: {
-                            left: slatHit.left,
-                            right: slatHit.right,
-                            top: rowPositions.tops[rowIndex],
-                            bottom: rowPositions.bottoms[rowIndex]
-                        },
-                        dayEl: slatHit.dayEl,
-                        layer: 0
-                    };
-                }
-            }
-        }
-    };
-    // Resource Area
-    // ------------------------------------------------------------------------------------------------------------------
-    ResourceTimelineView.prototype.setResourceAreaWidth = function (widthVal) {
-        this.resourceAreaWidth = widthVal;
-        applyStyleProp(this.resourceAreaHeadEl, 'width', widthVal || '');
-    };
-    ResourceTimelineView.prototype.initResourceAreaWidthDragging = function () {
-        var _this = this;
-        var resourceAreaDividerEls = Array.prototype.slice.call(this.el.querySelectorAll('.fc-col-resizer'));
-        var ElementDraggingImpl = this.calendar.pluginSystem.hooks.elementDraggingImpl;
-        if (ElementDraggingImpl) {
-            this.resourceAreaWidthDraggings = resourceAreaDividerEls.map(function (el) {
-                var dragging = new ElementDraggingImpl(el);
-                var dragStartWidth;
-                var viewWidth;
-                dragging.emitter.on('dragstart', function () {
-                    dragStartWidth = _this.resourceAreaWidth;
-                    if (typeof dragStartWidth !== 'number') {
-                        dragStartWidth = _this.resourceAreaHeadEl.getBoundingClientRect().width;
-                    }
-                    viewWidth = _this.el.getBoundingClientRect().width;
-                });
-                dragging.emitter.on('dragmove', function (pev) {
-                    var newWidth = dragStartWidth + pev.deltaX * (_this.isRtl ? -1 : 1);
-                    newWidth = Math.max(newWidth, MIN_RESOURCE_AREA_WIDTH);
-                    newWidth = Math.min(newWidth, viewWidth - MIN_RESOURCE_AREA_WIDTH);
-                    _this.setResourceAreaWidth(newWidth);
-                });
-                dragging.setAutoScrollEnabled(false); // because gets weird with auto-scrolling time area
-                return dragging;
-            });
-        }
-    };
-    ResourceTimelineView.needsResourceData = true; // for ResourceViewProps
-    return ResourceTimelineView;
-}(View));
-function hasResourceBusinessHours(resourceStore) {
-    for (var resourceId in resourceStore) {
-        var resource = resourceStore[resourceId];
-        if (resource.businessHours) {
-            return true;
-        }
-    }
-    return false;
-}
-function hasNesting(nodes) {
-    for (var _i = 0, nodes_1 = nodes; _i < nodes_1.length; _i++) {
-        var node = nodes_1[_i];
-        if (node.group) {
-            return true;
-        }
-        else if (node.resource) {
-            if (node.hasChildren) {
-                return true;
-            }
-        }
-    }
-    return false;
-}
-
-var main = createPlugin({
-    deps: [ResourceCommonPlugin, TimelinePlugin],
-    defaultView: 'resourceTimelineDay',
-    views: {
-        resourceTimeline: {
-            class: ResourceTimelineView,
-            resourceAreaWidth: '30%',
-            resourcesInitiallyExpanded: true,
-            eventResizableFromStart: true // TODO: not DRY with this same setting in the main timeline config
-        },
-        resourceTimelineDay: {
-            type: 'resourceTimeline',
-            duration: { days: 1 }
-        },
-        resourceTimelineWeek: {
-            type: 'resourceTimeline',
-            duration: { weeks: 1 }
-        },
-        resourceTimelineMonth: {
-            type: 'resourceTimeline',
-            duration: { months: 1 }
-        },
-        resourceTimelineYear: {
-            type: 'resourceTimeline',
-            duration: { years: 1 }
-        }
-    }
-});
-
-export default main;
-export { ResourceTimelineView };
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/resource-timeline/main.js b/AKPlan/static/AKPlan/vendor/fullcalendar/resource-timeline/main.js
deleted file mode 100644
index 2631955c4d91a426c9f0020540b0252c94d78bf7..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/resource-timeline/main.js
+++ /dev/null
@@ -1,1035 +0,0 @@
-/*!
-FullCalendar Resource Timeline Plugin v4.3.0
-Docs & License: https://fullcalendar.io/scheduler
-(c) 2019 Adam Shaw
-*/
-
-(function (global, factory) {
-    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@fullcalendar/core'), require('@fullcalendar/timeline'), require('@fullcalendar/resource-common')) :
-    typeof define === 'function' && define.amd ? define(['exports', '@fullcalendar/core', '@fullcalendar/timeline', '@fullcalendar/resource-common'], factory) :
-    (global = global || self, factory(global.FullCalendarResourceTimeline = {}, global.FullCalendar, global.FullCalendarTimeline, global.FullCalendarResourceCommon));
-}(this, function (exports, core, TimelinePlugin, ResourceCommonPlugin) { 'use strict';
-
-    var TimelinePlugin__default = 'default' in TimelinePlugin ? TimelinePlugin['default'] : TimelinePlugin;
-    var ResourceCommonPlugin__default = 'default' in ResourceCommonPlugin ? ResourceCommonPlugin['default'] : ResourceCommonPlugin;
-
-    /*! *****************************************************************************
-    Copyright (c) Microsoft Corporation. All rights reserved.
-    Licensed under the Apache License, Version 2.0 (the "License"); you may not use
-    this file except in compliance with the License. You may obtain a copy of the
-    License at http://www.apache.org/licenses/LICENSE-2.0
-
-    THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-    KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
-    WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
-    MERCHANTABLITY OR NON-INFRINGEMENT.
-
-    See the Apache Version 2.0 License for specific language governing permissions
-    and limitations under the License.
-    ***************************************************************************** */
-    /* global Reflect, Promise */
-
-    var extendStatics = function(d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-
-    function __extends(d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    }
-
-    var __assign = function() {
-        __assign = Object.assign || function __assign(t) {
-            for (var s, i = 1, n = arguments.length; i < n; i++) {
-                s = arguments[i];
-                for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
-            }
-            return t;
-        };
-        return __assign.apply(this, arguments);
-    };
-
-    var Row = /** @class */ (function (_super) {
-        __extends(Row, _super);
-        function Row(context, spreadsheetParent, spreadsheetNextSibling, timeAxisParent, timeAxisNextSibling) {
-            var _this = _super.call(this, context) || this;
-            _this.isSizeDirty = false;
-            spreadsheetParent.insertBefore(_this.spreadsheetTr = document.createElement('tr'), spreadsheetNextSibling);
-            timeAxisParent.insertBefore(_this.timeAxisTr = document.createElement('tr'), timeAxisNextSibling);
-            return _this;
-        }
-        Row.prototype.destroy = function () {
-            core.removeElement(this.spreadsheetTr);
-            core.removeElement(this.timeAxisTr);
-            _super.prototype.destroy.call(this);
-        };
-        Row.prototype.updateSize = function (isResize) {
-            this.isSizeDirty = false;
-        };
-        return Row;
-    }(core.Component));
-
-    function updateExpanderIcon(el, isExpanded) {
-        var classList = el.classList;
-        if (isExpanded) {
-            classList.remove('fc-icon-plus-square');
-            classList.add('fc-icon-minus-square');
-        }
-        else {
-            classList.remove('fc-icon-minus-square');
-            classList.add('fc-icon-plus-square');
-        }
-    }
-    function clearExpanderIcon(el) {
-        var classList = el.classList;
-        classList.remove('fc-icon-minus-square');
-        classList.remove('fc-icon-plus-square');
-    }
-    function updateTrResourceId(tr, resourceId) {
-        tr.setAttribute('data-resource-id', resourceId);
-    }
-
-    var GroupRow = /** @class */ (function (_super) {
-        __extends(GroupRow, _super);
-        function GroupRow() {
-            var _this = _super !== null && _super.apply(this, arguments) || this;
-            _this._renderCells = core.memoizeRendering(_this.renderCells, _this.unrenderCells);
-            _this._updateExpanderIcon = core.memoizeRendering(_this.updateExpanderIcon, null, [_this._renderCells]);
-            _this.onExpanderClick = function (ev) {
-                var props = _this.props;
-                _this.calendar.dispatch({
-                    type: 'SET_RESOURCE_ENTITY_EXPANDED',
-                    id: props.id,
-                    isExpanded: !props.isExpanded
-                });
-            };
-            return _this;
-        }
-        GroupRow.prototype.render = function (props) {
-            this._renderCells(props.group, props.spreadsheetColCnt);
-            this._updateExpanderIcon(props.isExpanded);
-            this.isSizeDirty = true;
-        };
-        GroupRow.prototype.destroy = function () {
-            _super.prototype.destroy.call(this);
-            this._renderCells.unrender(); // should unrender everything else
-        };
-        GroupRow.prototype.renderCells = function (group, spreadsheetColCnt) {
-            var spreadsheetContentEl = this.renderSpreadsheetContent(group);
-            this.spreadsheetTr.appendChild(core.createElement('td', {
-                className: 'fc-divider',
-                colSpan: spreadsheetColCnt // span across all columns
-            }, this.spreadsheetHeightEl = core.createElement('div', null, spreadsheetContentEl)) // needed by setTrInnerHeight
-            );
-            this.expanderIconEl = spreadsheetContentEl.querySelector('.fc-icon');
-            this.expanderIconEl.parentElement.addEventListener('click', this.onExpanderClick);
-            // insert a single cell, with a single empty <div>.
-            // there will be no content
-            this.timeAxisTr.appendChild(core.createElement('td', { className: 'fc-divider' }, this.timeAxisHeightEl = document.createElement('div')));
-        };
-        GroupRow.prototype.unrenderCells = function () {
-            this.spreadsheetTr.innerHTML = '';
-            this.timeAxisTr.innerHTML = '';
-        };
-        /*
-        Renders the content wrapper element that will be inserted into this row's TD cell.
-        */
-        GroupRow.prototype.renderSpreadsheetContent = function (group) {
-            var text = this.renderCellText(group);
-            var contentEl = core.htmlToElement('<div class="fc-cell-content">' +
-                '<span class="fc-expander">' +
-                '<span class="fc-icon"></span>' +
-                '</span>' +
-                '<span class="fc-cell-text">' +
-                (text ? core.htmlEscape(text) : '&nbsp;') +
-                '</span>' +
-                '</div>');
-            var filter = group.spec.render;
-            if (typeof filter === 'function') {
-                contentEl = filter(contentEl, group.value) || contentEl;
-            }
-            return contentEl;
-        };
-        GroupRow.prototype.renderCellText = function (group) {
-            var text = group.value || ''; // might be null/undefined if an ad-hoc grouping
-            var filter = group.spec.text;
-            if (typeof filter === 'function') {
-                text = filter(text) || text;
-            }
-            return text;
-        };
-        GroupRow.prototype.getHeightEls = function () {
-            return [this.spreadsheetHeightEl, this.timeAxisHeightEl];
-        };
-        GroupRow.prototype.updateExpanderIcon = function (isExpanded) {
-            updateExpanderIcon(this.expanderIconEl, isExpanded);
-        };
-        return GroupRow;
-    }(Row));
-    GroupRow.addEqualityFuncs({
-        group: ResourceCommonPlugin.isGroupsEqual // HACK for ResourceTimelineView::renderRows
-    });
-
-    var SpreadsheetRow = /** @class */ (function (_super) {
-        __extends(SpreadsheetRow, _super);
-        function SpreadsheetRow(context, tr) {
-            var _this = _super.call(this, context) || this;
-            _this._renderRow = core.memoizeRendering(_this.renderRow, _this.unrenderRow);
-            _this._updateTrResourceId = core.memoizeRendering(updateTrResourceId, null, [_this._renderRow]);
-            _this._updateExpanderIcon = core.memoizeRendering(_this.updateExpanderIcon, null, [_this._renderRow]);
-            _this.onExpanderClick = function (ev) {
-                var props = _this.props;
-                _this.calendar.dispatch({
-                    type: 'SET_RESOURCE_ENTITY_EXPANDED',
-                    id: props.id,
-                    isExpanded: !props.isExpanded
-                });
-            };
-            _this.tr = tr;
-            return _this;
-        }
-        SpreadsheetRow.prototype.render = function (props) {
-            this._renderRow(props.resource, props.rowSpans, props.depth, props.colSpecs);
-            this._updateTrResourceId(this.tr, props.resource.id); // TODO: only use public ID?
-            this._updateExpanderIcon(props.hasChildren, props.isExpanded);
-        };
-        SpreadsheetRow.prototype.destroy = function () {
-            _super.prototype.destroy.call(this);
-            this._renderRow.unrender(); // should unrender everything else
-        };
-        SpreadsheetRow.prototype.renderRow = function (resource, rowSpans, depth, colSpecs) {
-            var _a = this, tr = _a.tr, theme = _a.theme, calendar = _a.calendar, view = _a.view;
-            var resourceFields = ResourceCommonPlugin.buildResourceFields(resource); // slightly inefficient. already done up the call stack
-            var mainTd;
-            for (var i = 0; i < colSpecs.length; i++) {
-                var colSpec = colSpecs[i];
-                var rowSpan = rowSpans[i];
-                if (rowSpan === 0) { // not responsible for group-based rows. VRowGroup is
-                    continue;
-                }
-                else if (rowSpan == null) {
-                    rowSpan = 1;
-                }
-                var text = void 0;
-                if (colSpec.field) {
-                    text = resourceFields[colSpec.field];
-                }
-                else {
-                    text = ResourceCommonPlugin.buildResourceTextFunc(colSpec.text, calendar)(resource);
-                }
-                var contentEl = core.htmlToElement('<div class="fc-cell-content">' +
-                    (colSpec.isMain ? renderIconHtml(depth) : '') +
-                    '<span class="fc-cell-text">' +
-                    (text ? core.htmlEscape(text) : '&nbsp;') +
-                    '</span>' +
-                    '</div>');
-                if (typeof colSpec.render === 'function') { // a filter function for the element
-                    contentEl = colSpec.render(new ResourceCommonPlugin.ResourceApi(calendar, resource), contentEl) || contentEl;
-                }
-                if (rowSpan > 1) {
-                    contentEl.classList.add('fc-sticky');
-                }
-                var td = core.createElement('td', {
-                    className: theme.getClass('widgetContent'),
-                    rowspan: rowSpan
-                }, contentEl);
-                // the first cell of the row needs to have an inner div for setTrInnerHeight
-                if (colSpec.isMain) {
-                    td.appendChild(this.heightEl = core.createElement('div', null, td.childNodes) // inner wrap
-                    );
-                    mainTd = td;
-                }
-                tr.appendChild(td);
-            }
-            this.expanderIconEl = tr.querySelector('.fc-expander-space .fc-icon');
-            // wait until very end
-            view.publiclyTrigger('resourceRender', [
-                {
-                    resource: new ResourceCommonPlugin.ResourceApi(calendar, resource),
-                    el: mainTd,
-                    view: view
-                }
-            ]);
-        };
-        SpreadsheetRow.prototype.unrenderRow = function () {
-            this.tr.innerHTML = '';
-        };
-        SpreadsheetRow.prototype.updateExpanderIcon = function (hasChildren, isExpanded) {
-            var expanderIconEl = this.expanderIconEl;
-            var expanderEl = expanderIconEl.parentElement;
-            if (expanderIconEl &&
-                expanderEl // why would this be null?? was the case in IE11
-            ) {
-                if (hasChildren) {
-                    expanderEl.addEventListener('click', this.onExpanderClick);
-                    expanderEl.classList.add('fc-expander');
-                    updateExpanderIcon(expanderIconEl, isExpanded);
-                }
-                else {
-                    expanderEl.removeEventListener('click', this.onExpanderClick);
-                    expanderEl.classList.remove('fc-expander');
-                    clearExpanderIcon(expanderIconEl);
-                }
-            }
-        };
-        return SpreadsheetRow;
-    }(core.Component));
-    /*
-    Renders the HTML responsible for the subrow expander area,
-    as well as the space before it (used to align expanders of similar depths)
-    */
-    function renderIconHtml(depth) {
-        var html = '';
-        for (var i = 0; i < depth; i++) {
-            html += '<span class="fc-icon"></span>';
-        }
-        html +=
-            '<span class="fc-expander-space">' +
-                '<span class="fc-icon"></span>' +
-                '</span>';
-        return html;
-    }
-
-    var ResourceRow = /** @class */ (function (_super) {
-        __extends(ResourceRow, _super);
-        function ResourceRow(context, a, b, c, d, timeAxis) {
-            var _this = _super.call(this, context, a, b, c, d) || this;
-            _this._updateTrResourceId = core.memoizeRendering(updateTrResourceId);
-            _this.spreadsheetRow = new SpreadsheetRow(context, _this.spreadsheetTr);
-            _this.timeAxisTr.appendChild(core.createElement('td', { className: _this.theme.getClass('widgetContent') }, _this.innerContainerEl = document.createElement('div')));
-            _this.lane = new TimelinePlugin.TimelineLane(context, _this.innerContainerEl, _this.innerContainerEl, timeAxis);
-            return _this;
-        }
-        ResourceRow.prototype.destroy = function () {
-            this.spreadsheetRow.destroy();
-            this.lane.destroy();
-            _super.prototype.destroy.call(this);
-        };
-        ResourceRow.prototype.render = function (props) {
-            // spreadsheetRow handles calling updateTrResourceId for spreadsheetTr
-            this.spreadsheetRow.receiveProps({
-                colSpecs: props.colSpecs,
-                id: props.id,
-                rowSpans: props.rowSpans,
-                depth: props.depth,
-                isExpanded: props.isExpanded,
-                hasChildren: props.hasChildren,
-                resource: props.resource
-            });
-            this._updateTrResourceId(this.timeAxisTr, props.resource.id);
-            this.lane.receiveProps({
-                dateProfile: props.dateProfile,
-                nextDayThreshold: props.nextDayThreshold,
-                businessHours: props.businessHours,
-                eventStore: props.eventStore,
-                eventUiBases: props.eventUiBases,
-                dateSelection: props.dateSelection,
-                eventSelection: props.eventSelection,
-                eventDrag: props.eventDrag,
-                eventResize: props.eventResize
-            });
-            this.isSizeDirty = true;
-        };
-        ResourceRow.prototype.updateSize = function (isResize) {
-            _super.prototype.updateSize.call(this, isResize);
-            this.lane.updateSize(isResize);
-        };
-        ResourceRow.prototype.getHeightEls = function () {
-            return [this.spreadsheetRow.heightEl, this.innerContainerEl];
-        };
-        return ResourceRow;
-    }(Row));
-    ResourceRow.addEqualityFuncs({
-        rowSpans: core.isArraysEqual // HACK for isSizeDirty, ResourceTimelineView::renderRows
-    });
-
-    var COL_MIN_WIDTH = 30;
-    var SpreadsheetHeader = /** @class */ (function (_super) {
-        __extends(SpreadsheetHeader, _super);
-        function SpreadsheetHeader(context, parentEl) {
-            var _this = _super.call(this, context) || this;
-            _this.resizables = [];
-            _this.colWidths = [];
-            _this.emitter = new core.EmitterMixin();
-            parentEl.appendChild(_this.tableEl = core.createElement('table', {
-                className: _this.theme.getClass('tableGrid')
-            }));
-            return _this;
-        }
-        SpreadsheetHeader.prototype.destroy = function () {
-            for (var _i = 0, _a = this.resizables; _i < _a.length; _i++) {
-                var resizable = _a[_i];
-                resizable.destroy();
-            }
-            core.removeElement(this.tableEl);
-            _super.prototype.destroy.call(this);
-        };
-        SpreadsheetHeader.prototype.render = function (props) {
-            var theme = this.theme;
-            var colSpecs = props.colSpecs;
-            var html = '<colgroup>' + props.colTags + '</colgroup>' +
-                '<tbody>';
-            if (props.superHeaderText) {
-                html +=
-                    '<tr class="fc-super">' +
-                        '<th class="' + theme.getClass('widgetHeader') + '" colspan="' + colSpecs.length + '">' +
-                        '<div class="fc-cell-content">' +
-                        '<span class="fc-cell-text">' +
-                        core.htmlEscape(props.superHeaderText) +
-                        '</span>' +
-                        '</div>' +
-                        '</th>' +
-                        '</tr>';
-            }
-            html += '<tr>';
-            for (var i = 0; i < colSpecs.length; i++) {
-                var o = colSpecs[i];
-                var isLast = i === (colSpecs.length - 1);
-                html +=
-                    "<th class=\"" + theme.getClass('widgetHeader') + "\">" +
-                        '<div>' +
-                        '<div class="fc-cell-content">' +
-                        (o.isMain ?
-                            '<span class="fc-expander-space">' +
-                                '<span class="fc-icon"></span>' +
-                                '</span>' :
-                            '') +
-                        '<span class="fc-cell-text">' +
-                        core.htmlEscape(o.labelText || '') + // what about normalizing this value ahead of time?
-                        '</span>' +
-                        '</div>' +
-                        (!isLast ? '<div class="fc-col-resizer"></div>' : '') +
-                        '</div>' +
-                        '</th>';
-            }
-            html += '</tr>';
-            html += '</tbody>';
-            this.tableEl.innerHTML = html;
-            this.thEls = Array.prototype.slice.call(this.tableEl.querySelectorAll('th'));
-            this.colEls = Array.prototype.slice.call(this.tableEl.querySelectorAll('col'));
-            this.resizerEls = Array.prototype.slice.call(this.tableEl.querySelectorAll('.fc-col-resizer'));
-            this.initColResizing();
-        };
-        SpreadsheetHeader.prototype.initColResizing = function () {
-            var _this = this;
-            var ElementDraggingImpl = this.calendar.pluginSystem.hooks.elementDraggingImpl;
-            if (ElementDraggingImpl) {
-                this.resizables = this.resizerEls.map(function (handleEl, colIndex) {
-                    var dragging = new ElementDraggingImpl(handleEl);
-                    var startWidth;
-                    dragging.emitter.on('dragstart', function () {
-                        startWidth = _this.colWidths[colIndex];
-                        if (typeof startWidth !== 'number') {
-                            startWidth = _this.thEls[colIndex].getBoundingClientRect().width;
-                        }
-                    });
-                    dragging.emitter.on('dragmove', function (pev) {
-                        _this.colWidths[colIndex] = Math.max(startWidth + pev.deltaX * (_this.isRtl ? -1 : 1), COL_MIN_WIDTH);
-                        _this.emitter.trigger('colwidthchange', _this.colWidths);
-                    });
-                    dragging.setAutoScrollEnabled(false); // because gets weird with auto-scrolling time area
-                    return dragging;
-                });
-            }
-        };
-        return SpreadsheetHeader;
-    }(core.Component));
-
-    var Spreadsheet = /** @class */ (function (_super) {
-        __extends(Spreadsheet, _super);
-        function Spreadsheet(context, headParentEl, bodyParentEl) {
-            var _this = _super.call(this, context) || this;
-            _this._renderCells = core.memoizeRendering(_this.renderCells, _this.unrenderCells);
-            _this.layout = new TimelinePlugin.HeaderBodyLayout(headParentEl, bodyParentEl, 'clipped-scroll');
-            var headerEnhancedScroller = _this.layout.headerScroller.enhancedScroll;
-            var bodyEnhancedScroller = _this.layout.bodyScroller.enhancedScroll;
-            _this.header = new SpreadsheetHeader(context, headerEnhancedScroller.canvas.contentEl);
-            _this.header.emitter.on('colwidthchange', function (colWidths) {
-                _this.applyColWidths(colWidths);
-            });
-            bodyEnhancedScroller.canvas.contentEl
-                .appendChild(_this.bodyContainerEl = core.createElement('div', { className: 'fc-rows' }, '<table>' +
-                '<colgroup />' +
-                '<tbody />' +
-                '</table>'));
-            _this.bodyColGroup = _this.bodyContainerEl.querySelector('colgroup');
-            _this.bodyTbody = _this.bodyContainerEl.querySelector('tbody');
-            return _this;
-        }
-        Spreadsheet.prototype.destroy = function () {
-            this.header.destroy();
-            this.layout.destroy();
-            this._renderCells.unrender();
-            _super.prototype.destroy.call(this);
-        };
-        Spreadsheet.prototype.render = function (props) {
-            this._renderCells(props.superHeaderText, props.colSpecs);
-        };
-        Spreadsheet.prototype.renderCells = function (superHeaderText, colSpecs) {
-            var colTags = this.renderColTags(colSpecs);
-            this.header.receiveProps({
-                superHeaderText: superHeaderText,
-                colSpecs: colSpecs,
-                colTags: colTags
-            });
-            this.bodyColGroup.innerHTML = colTags;
-            this.bodyColEls = Array.prototype.slice.call(this.bodyColGroup.querySelectorAll('col'));
-            this.applyColWidths(colSpecs.map(function (colSpec) { return colSpec.width; }));
-        };
-        Spreadsheet.prototype.unrenderCells = function () {
-            this.bodyColGroup.innerHTML = '';
-        };
-        Spreadsheet.prototype.renderColTags = function (colSpecs) {
-            var html = '';
-            for (var _i = 0, colSpecs_1 = colSpecs; _i < colSpecs_1.length; _i++) {
-                var o = colSpecs_1[_i];
-                if (o.isMain) {
-                    html += '<col class="fc-main-col"/>';
-                }
-                else {
-                    html += '<col/>';
-                }
-            }
-            return html;
-        };
-        Spreadsheet.prototype.updateSize = function (isResize, totalHeight, isAuto) {
-            this.layout.setHeight(totalHeight, isAuto);
-        };
-        Spreadsheet.prototype.applyColWidths = function (colWidths) {
-            var _this = this;
-            colWidths.forEach(function (colWidth, colIndex) {
-                var headEl = _this.header.colEls[colIndex]; // bad to access child
-                var bodyEl = _this.bodyColEls[colIndex];
-                var styleVal;
-                if (typeof colWidth === 'number') {
-                    styleVal = colWidth + 'px';
-                }
-                else if (typeof colWidth == null) {
-                    styleVal = '';
-                }
-                headEl.style.width = bodyEl.style.width = styleVal;
-            });
-        };
-        return Spreadsheet;
-    }(core.Component));
-
-    var MIN_RESOURCE_AREA_WIDTH = 30; // definitely bigger than scrollbars
-    var ResourceTimelineView = /** @class */ (function (_super) {
-        __extends(ResourceTimelineView, _super);
-        function ResourceTimelineView(context, viewSpec, dateProfileGenerator, parentEl) {
-            var _this = _super.call(this, context, viewSpec, dateProfileGenerator, parentEl) || this;
-            _this.isStickyScrollDirty = false;
-            _this.rowNodes = [];
-            _this.rowComponents = [];
-            _this.rowComponentsById = {};
-            _this.resourceAreaWidthDraggings = [];
-            _this.splitter = new ResourceCommonPlugin.ResourceSplitter(); // doesn't let it do businessHours tho
-            _this.hasResourceBusinessHours = core.memoize(hasResourceBusinessHours);
-            _this.buildRowNodes = core.memoize(ResourceCommonPlugin.buildRowNodes);
-            _this.hasNesting = core.memoize(hasNesting);
-            _this._updateHasNesting = core.memoizeRendering(_this.updateHasNesting);
-            var allColSpecs = _this.opt('resourceColumns') || [];
-            var labelText = _this.opt('resourceLabelText'); // TODO: view.override
-            var defaultLabelText = 'Resources'; // TODO: view.defaults
-            var superHeaderText = null;
-            if (!allColSpecs.length) {
-                allColSpecs.push({
-                    labelText: labelText || defaultLabelText,
-                    text: ResourceCommonPlugin.buildResourceTextFunc(_this.opt('resourceText'), _this.calendar)
-                });
-            }
-            else {
-                superHeaderText = labelText;
-            }
-            var plainColSpecs = [];
-            var groupColSpecs = [];
-            var groupSpecs = [];
-            var isVGrouping = false;
-            var isHGrouping = false;
-            for (var _i = 0, allColSpecs_1 = allColSpecs; _i < allColSpecs_1.length; _i++) {
-                var colSpec = allColSpecs_1[_i];
-                if (colSpec.group) {
-                    groupColSpecs.push(colSpec);
-                }
-                else {
-                    plainColSpecs.push(colSpec);
-                }
-            }
-            plainColSpecs[0].isMain = true;
-            if (groupColSpecs.length) {
-                groupSpecs = groupColSpecs;
-                isVGrouping = true;
-            }
-            else {
-                var hGroupField = _this.opt('resourceGroupField');
-                if (hGroupField) {
-                    isHGrouping = true;
-                    groupSpecs.push({
-                        field: hGroupField,
-                        text: _this.opt('resourceGroupText'),
-                        render: _this.opt('resourceGroupRender')
-                    });
-                }
-            }
-            var allOrderSpecs = core.parseFieldSpecs(_this.opt('resourceOrder'));
-            var plainOrderSpecs = [];
-            for (var _a = 0, allOrderSpecs_1 = allOrderSpecs; _a < allOrderSpecs_1.length; _a++) {
-                var orderSpec = allOrderSpecs_1[_a];
-                var isGroup = false;
-                for (var _b = 0, groupSpecs_1 = groupSpecs; _b < groupSpecs_1.length; _b++) {
-                    var groupSpec = groupSpecs_1[_b];
-                    if (groupSpec.field === orderSpec.field) {
-                        groupSpec.order = orderSpec.order; // -1, 0, 1
-                        isGroup = true;
-                        break;
-                    }
-                }
-                if (!isGroup) {
-                    plainOrderSpecs.push(orderSpec);
-                }
-            }
-            _this.superHeaderText = superHeaderText;
-            _this.isVGrouping = isVGrouping;
-            _this.isHGrouping = isHGrouping;
-            _this.groupSpecs = groupSpecs;
-            _this.colSpecs = groupColSpecs.concat(plainColSpecs);
-            _this.orderSpecs = plainOrderSpecs;
-            // START RENDERING...
-            _this.el.classList.add('fc-timeline');
-            if (_this.opt('eventOverlap') === false) {
-                _this.el.classList.add('fc-no-overlap');
-            }
-            _this.el.innerHTML = _this.renderSkeletonHtml();
-            _this.resourceAreaHeadEl = _this.el.querySelector('thead .fc-resource-area');
-            _this.setResourceAreaWidth(_this.opt('resourceAreaWidth'));
-            _this.initResourceAreaWidthDragging();
-            _this.miscHeight = _this.el.getBoundingClientRect().height;
-            _this.spreadsheet = new Spreadsheet(_this.context, _this.resourceAreaHeadEl, _this.el.querySelector('tbody .fc-resource-area'));
-            _this.timeAxis = new TimelinePlugin.TimeAxis(_this.context, _this.el.querySelector('thead .fc-time-area'), _this.el.querySelector('tbody .fc-time-area'));
-            var timeAxisRowContainer = core.createElement('div', { className: 'fc-rows' }, '<table><tbody /></table>');
-            _this.timeAxis.layout.bodyScroller.enhancedScroll.canvas.contentEl.appendChild(timeAxisRowContainer);
-            _this.timeAxisTbody = timeAxisRowContainer.querySelector('tbody');
-            _this.lane = new TimelinePlugin.TimelineLane(_this.context, null, _this.timeAxis.layout.bodyScroller.enhancedScroll.canvas.bgEl, _this.timeAxis);
-            _this.bodyScrollJoiner = new TimelinePlugin.ScrollJoiner('vertical', [
-                _this.spreadsheet.layout.bodyScroller,
-                _this.timeAxis.layout.bodyScroller
-            ]);
-            // after scrolljoiner
-            _this.spreadsheetBodyStickyScroller = new TimelinePlugin.StickyScroller(_this.spreadsheet.layout.bodyScroller.enhancedScroll, _this.isRtl, true // isVertical
-            );
-            _this.spreadsheet.receiveProps({
-                superHeaderText: _this.superHeaderText,
-                colSpecs: _this.colSpecs
-            });
-            // Component...
-            context.calendar.registerInteractiveComponent(_this, {
-                el: _this.timeAxis.slats.el
-            });
-            return _this;
-        }
-        ResourceTimelineView.prototype.renderSkeletonHtml = function () {
-            var theme = this.theme;
-            return "<table class=\"" + theme.getClass('tableGrid') + "\"> <thead class=\"fc-head\"> <tr> <td class=\"fc-resource-area " + theme.getClass('widgetHeader') + "\"></td> <td class=\"fc-divider fc-col-resizer " + theme.getClass('widgetHeader') + "\"></td> <td class=\"fc-time-area " + theme.getClass('widgetHeader') + "\"></td> </tr> </thead> <tbody class=\"fc-body\"> <tr> <td class=\"fc-resource-area " + theme.getClass('widgetContent') + "\"></td> <td class=\"fc-divider fc-col-resizer " + theme.getClass('widgetHeader') + "\"></td> <td class=\"fc-time-area " + theme.getClass('widgetContent') + "\"></td> </tr> </tbody> </table>";
-        };
-        ResourceTimelineView.prototype.render = function (props) {
-            _super.prototype.render.call(this, props);
-            var splitProps = this.splitter.splitProps(props);
-            var hasResourceBusinessHours = this.hasResourceBusinessHours(props.resourceStore);
-            this.timeAxis.receiveProps({
-                dateProfile: props.dateProfile
-            });
-            // for all-resource bg events / selections / business-hours
-            this.lane.receiveProps(__assign({}, splitProps[''], { dateProfile: props.dateProfile, nextDayThreshold: this.nextDayThreshold, businessHours: hasResourceBusinessHours ? null : props.businessHours }));
-            var newRowNodes = this.buildRowNodes(props.resourceStore, this.groupSpecs, this.orderSpecs, this.isVGrouping, props.resourceEntityExpansions, this.opt('resourcesInitiallyExpanded'));
-            this._updateHasNesting(this.hasNesting(newRowNodes));
-            this.diffRows(newRowNodes);
-            this.renderRows(props.dateProfile, hasResourceBusinessHours ? props.businessHours : null, // CONFUSING, comment
-            splitProps);
-        };
-        ResourceTimelineView.prototype.updateHasNesting = function (isNesting) {
-            var classList = this.el.classList;
-            if (isNesting) {
-                classList.remove('fc-flat');
-            }
-            else {
-                classList.add('fc-flat');
-            }
-        };
-        ResourceTimelineView.prototype.diffRows = function (newNodes) {
-            var oldNodes = this.rowNodes;
-            var oldLen = oldNodes.length;
-            var oldIndexHash = {}; // id -> index
-            var oldI = 0;
-            var newI = 0;
-            for (oldI = 0; oldI < oldLen; oldI++) {
-                oldIndexHash[oldNodes[oldI].id] = oldI;
-            }
-            // iterate new nodes
-            for (oldI = 0, newI = 0; newI < newNodes.length; newI++) {
-                var newNode = newNodes[newI];
-                var oldIFound = oldIndexHash[newNode.id];
-                if (oldIFound != null && oldIFound >= oldI) {
-                    this.removeRows(newI, oldIFound - oldI, oldNodes); // won't do anything if same index
-                    oldI = oldIFound + 1;
-                }
-                else {
-                    this.addRow(newI, newNode);
-                }
-            }
-            // old rows that weren't found need to be removed
-            this.removeRows(newI, oldLen - oldI, oldNodes); // won't do anything if same index
-            this.rowNodes = newNodes;
-        };
-        /*
-        rowComponents is the in-progress result
-        */
-        ResourceTimelineView.prototype.addRow = function (index, rowNode) {
-            var _a = this, rowComponents = _a.rowComponents, rowComponentsById = _a.rowComponentsById;
-            var nextComponent = rowComponents[index];
-            var newComponent = this.buildChildComponent(rowNode, this.spreadsheet.bodyTbody, nextComponent ? nextComponent.spreadsheetTr : null, this.timeAxisTbody, nextComponent ? nextComponent.timeAxisTr : null);
-            rowComponents.splice(index, 0, newComponent);
-            rowComponentsById[rowNode.id] = newComponent;
-        };
-        ResourceTimelineView.prototype.removeRows = function (startIndex, len, oldRowNodes) {
-            if (len) {
-                var _a = this, rowComponents = _a.rowComponents, rowComponentsById = _a.rowComponentsById;
-                for (var i = 0; i < len; i++) {
-                    var rowComponent = rowComponents[startIndex + i];
-                    rowComponent.destroy();
-                    delete rowComponentsById[oldRowNodes[i].id];
-                }
-                rowComponents.splice(startIndex, len);
-            }
-        };
-        ResourceTimelineView.prototype.buildChildComponent = function (node, spreadsheetTbody, spreadsheetNext, timeAxisTbody, timeAxisNext) {
-            if (node.group) {
-                return new GroupRow(this.context, spreadsheetTbody, spreadsheetNext, timeAxisTbody, timeAxisNext);
-            }
-            else if (node.resource) {
-                return new ResourceRow(this.context, spreadsheetTbody, spreadsheetNext, timeAxisTbody, timeAxisNext, this.timeAxis);
-            }
-        };
-        ResourceTimelineView.prototype.renderRows = function (dateProfile, fallbackBusinessHours, splitProps) {
-            var _a = this, rowNodes = _a.rowNodes, rowComponents = _a.rowComponents;
-            for (var i = 0; i < rowNodes.length; i++) {
-                var rowNode = rowNodes[i];
-                var rowComponent = rowComponents[i];
-                if (rowNode.group) {
-                    rowComponent.receiveProps({
-                        spreadsheetColCnt: this.colSpecs.length,
-                        id: rowNode.id,
-                        isExpanded: rowNode.isExpanded,
-                        group: rowNode.group
-                    });
-                }
-                else {
-                    var resource = rowNode.resource;
-                    rowComponent.receiveProps(__assign({}, splitProps[resource.id], { dateProfile: dateProfile, nextDayThreshold: this.nextDayThreshold, businessHours: resource.businessHours || fallbackBusinessHours, colSpecs: this.colSpecs, id: rowNode.id, rowSpans: rowNode.rowSpans, depth: rowNode.depth, isExpanded: rowNode.isExpanded, hasChildren: rowNode.hasChildren, resource: rowNode.resource }));
-                }
-            }
-        };
-        ResourceTimelineView.prototype.updateSize = function (isResize, viewHeight, isAuto) {
-            // FYI: this ordering is really important
-            var calendar = this.calendar;
-            var isBaseSizing = isResize || calendar.isViewUpdated || calendar.isDatesUpdated || calendar.isEventsUpdated;
-            if (isBaseSizing) {
-                this.syncHeadHeights();
-                this.timeAxis.updateSize(isResize, viewHeight - this.miscHeight, isAuto);
-                this.spreadsheet.updateSize(isResize, viewHeight - this.miscHeight, isAuto);
-            }
-            var rowSizingCnt = this.updateRowSizes(isResize);
-            this.lane.updateSize(isResize); // is efficient. uses flags
-            if (isBaseSizing || rowSizingCnt) {
-                this.bodyScrollJoiner.update();
-                this.timeAxis.layout.scrollJoiner.update(); // hack
-                this.rowPositions = new core.PositionCache(this.timeAxis.slats.el, this.rowComponents.map(function (rowComponent) {
-                    return rowComponent.timeAxisTr;
-                }), false, // isHorizontal
-                true // isVertical
-                );
-                this.rowPositions.build();
-                this.isStickyScrollDirty = true;
-            }
-        };
-        ResourceTimelineView.prototype.syncHeadHeights = function () {
-            var spreadsheetHeadEl = this.spreadsheet.header.tableEl;
-            var timeAxisHeadEl = this.timeAxis.header.tableEl;
-            spreadsheetHeadEl.style.height = '';
-            timeAxisHeadEl.style.height = '';
-            var max = Math.max(spreadsheetHeadEl.getBoundingClientRect().height, timeAxisHeadEl.getBoundingClientRect().height);
-            spreadsheetHeadEl.style.height =
-                timeAxisHeadEl.style.height = max + 'px';
-        };
-        ResourceTimelineView.prototype.updateRowSizes = function (isResize) {
-            var dirtyRowComponents = this.rowComponents;
-            if (!isResize) {
-                dirtyRowComponents = dirtyRowComponents.filter(function (rowComponent) {
-                    return rowComponent.isSizeDirty;
-                });
-            }
-            var elArrays = dirtyRowComponents.map(function (rowComponent) {
-                return rowComponent.getHeightEls();
-            });
-            // reset to natural heights
-            for (var _i = 0, elArrays_1 = elArrays; _i < elArrays_1.length; _i++) {
-                var elArray = elArrays_1[_i];
-                for (var _a = 0, elArray_1 = elArray; _a < elArray_1.length; _a++) {
-                    var el = elArray_1[_a];
-                    el.style.height = '';
-                }
-            }
-            // let rows update their contents' heights
-            for (var _b = 0, dirtyRowComponents_1 = dirtyRowComponents; _b < dirtyRowComponents_1.length; _b++) {
-                var rowComponent = dirtyRowComponents_1[_b];
-                rowComponent.updateSize(isResize); // will reset isSizeDirty
-            }
-            var maxHeights = elArrays.map(function (elArray) {
-                var maxHeight = null;
-                for (var _i = 0, elArray_2 = elArray; _i < elArray_2.length; _i++) {
-                    var el = elArray_2[_i];
-                    var height = el.getBoundingClientRect().height;
-                    if (maxHeight === null || height > maxHeight) {
-                        maxHeight = height;
-                    }
-                }
-                return maxHeight;
-            });
-            for (var i = 0; i < elArrays.length; i++) {
-                for (var _c = 0, _d = elArrays[i]; _c < _d.length; _c++) {
-                    var el = _d[_c];
-                    el.style.height = maxHeights[i] + 'px';
-                }
-            }
-            return dirtyRowComponents.length;
-        };
-        ResourceTimelineView.prototype.destroy = function () {
-            for (var _i = 0, _a = this.rowComponents; _i < _a.length; _i++) {
-                var rowComponent = _a[_i];
-                rowComponent.destroy();
-            }
-            this.rowNodes = [];
-            this.rowComponents = [];
-            this.spreadsheet.destroy();
-            this.timeAxis.destroy();
-            for (var _b = 0, _c = this.resourceAreaWidthDraggings; _b < _c.length; _b++) {
-                var resourceAreaWidthDragging = _c[_b];
-                resourceAreaWidthDragging.destroy();
-            }
-            this.spreadsheetBodyStickyScroller.destroy();
-            _super.prototype.destroy.call(this);
-            this.calendar.unregisterInteractiveComponent(this);
-        };
-        // Now Indicator
-        // ------------------------------------------------------------------------------------------
-        ResourceTimelineView.prototype.getNowIndicatorUnit = function (dateProfile) {
-            return this.timeAxis.getNowIndicatorUnit(dateProfile);
-        };
-        ResourceTimelineView.prototype.renderNowIndicator = function (date) {
-            this.timeAxis.renderNowIndicator(date);
-        };
-        ResourceTimelineView.prototype.unrenderNowIndicator = function () {
-            this.timeAxis.unrenderNowIndicator();
-        };
-        // Scrolling
-        // ------------------------------------------------------------------------------------------------------------------
-        // this is useful for scrolling prev/next dates while resource is scrolled down
-        ResourceTimelineView.prototype.queryScroll = function () {
-            var scroll = _super.prototype.queryScroll.call(this);
-            if (this.props.resourceStore) {
-                __assign(scroll, this.queryResourceScroll());
-            }
-            return scroll;
-        };
-        ResourceTimelineView.prototype.applyScroll = function (scroll, isResize) {
-            _super.prototype.applyScroll.call(this, scroll, isResize);
-            if (this.props.resourceStore) {
-                this.applyResourceScroll(scroll);
-            }
-            // avoid updating stickyscroll too often
-            if (isResize || this.isStickyScrollDirty) {
-                this.isStickyScrollDirty = false;
-                this.spreadsheetBodyStickyScroller.updateSize();
-                this.timeAxis.updateStickyScrollers();
-            }
-        };
-        ResourceTimelineView.prototype.computeDateScroll = function (duration) {
-            return this.timeAxis.computeDateScroll(duration);
-        };
-        ResourceTimelineView.prototype.queryDateScroll = function () {
-            return this.timeAxis.queryDateScroll();
-        };
-        ResourceTimelineView.prototype.applyDateScroll = function (scroll) {
-            this.timeAxis.applyDateScroll(scroll);
-        };
-        ResourceTimelineView.prototype.queryResourceScroll = function () {
-            var _a = this, rowComponents = _a.rowComponents, rowNodes = _a.rowNodes;
-            var scroll = {};
-            var scrollerTop = this.timeAxis.layout.bodyScroller.el.getBoundingClientRect().top; // fixed position
-            for (var i = 0; i < rowComponents.length; i++) {
-                var rowComponent = rowComponents[i];
-                var rowNode = rowNodes[i];
-                var el = rowComponent.timeAxisTr;
-                var elBottom = el.getBoundingClientRect().bottom; // fixed position
-                if (elBottom > scrollerTop) {
-                    scroll.rowId = rowNode.id;
-                    scroll.bottom = elBottom - scrollerTop;
-                    break;
-                }
-            }
-            // TODO: what about left scroll state for spreadsheet area?
-            return scroll;
-        };
-        ResourceTimelineView.prototype.applyResourceScroll = function (scroll) {
-            var rowId = scroll.forcedRowId || scroll.rowId;
-            if (rowId) {
-                var rowComponent = this.rowComponentsById[rowId];
-                if (rowComponent) {
-                    var el = rowComponent.timeAxisTr;
-                    if (el) {
-                        var innerTop = this.timeAxis.layout.bodyScroller.enhancedScroll.canvas.el.getBoundingClientRect().top;
-                        var rowRect = el.getBoundingClientRect();
-                        var scrollTop = (scroll.forcedRowId ?
-                            rowRect.top : // just use top edge
-                            rowRect.bottom - scroll.bottom) - // pixels from bottom edge
-                            innerTop;
-                        this.timeAxis.layout.bodyScroller.enhancedScroll.setScrollTop(scrollTop);
-                        this.spreadsheet.layout.bodyScroller.enhancedScroll.setScrollTop(scrollTop);
-                    }
-                }
-            }
-        };
-        // TODO: scrollToResource
-        // Hit System
-        // ------------------------------------------------------------------------------------------
-        ResourceTimelineView.prototype.buildPositionCaches = function () {
-            this.timeAxis.slats.updateSize();
-            this.rowPositions.build();
-        };
-        ResourceTimelineView.prototype.queryHit = function (positionLeft, positionTop) {
-            var rowPositions = this.rowPositions;
-            var slats = this.timeAxis.slats;
-            var rowIndex = rowPositions.topToIndex(positionTop);
-            if (rowIndex != null) {
-                var resource = this.rowNodes[rowIndex].resource;
-                if (resource) { // not a group
-                    var slatHit = slats.positionToHit(positionLeft);
-                    if (slatHit) {
-                        return {
-                            component: this,
-                            dateSpan: {
-                                range: slatHit.dateSpan.range,
-                                allDay: slatHit.dateSpan.allDay,
-                                resourceId: resource.id
-                            },
-                            rect: {
-                                left: slatHit.left,
-                                right: slatHit.right,
-                                top: rowPositions.tops[rowIndex],
-                                bottom: rowPositions.bottoms[rowIndex]
-                            },
-                            dayEl: slatHit.dayEl,
-                            layer: 0
-                        };
-                    }
-                }
-            }
-        };
-        // Resource Area
-        // ------------------------------------------------------------------------------------------------------------------
-        ResourceTimelineView.prototype.setResourceAreaWidth = function (widthVal) {
-            this.resourceAreaWidth = widthVal;
-            core.applyStyleProp(this.resourceAreaHeadEl, 'width', widthVal || '');
-        };
-        ResourceTimelineView.prototype.initResourceAreaWidthDragging = function () {
-            var _this = this;
-            var resourceAreaDividerEls = Array.prototype.slice.call(this.el.querySelectorAll('.fc-col-resizer'));
-            var ElementDraggingImpl = this.calendar.pluginSystem.hooks.elementDraggingImpl;
-            if (ElementDraggingImpl) {
-                this.resourceAreaWidthDraggings = resourceAreaDividerEls.map(function (el) {
-                    var dragging = new ElementDraggingImpl(el);
-                    var dragStartWidth;
-                    var viewWidth;
-                    dragging.emitter.on('dragstart', function () {
-                        dragStartWidth = _this.resourceAreaWidth;
-                        if (typeof dragStartWidth !== 'number') {
-                            dragStartWidth = _this.resourceAreaHeadEl.getBoundingClientRect().width;
-                        }
-                        viewWidth = _this.el.getBoundingClientRect().width;
-                    });
-                    dragging.emitter.on('dragmove', function (pev) {
-                        var newWidth = dragStartWidth + pev.deltaX * (_this.isRtl ? -1 : 1);
-                        newWidth = Math.max(newWidth, MIN_RESOURCE_AREA_WIDTH);
-                        newWidth = Math.min(newWidth, viewWidth - MIN_RESOURCE_AREA_WIDTH);
-                        _this.setResourceAreaWidth(newWidth);
-                    });
-                    dragging.setAutoScrollEnabled(false); // because gets weird with auto-scrolling time area
-                    return dragging;
-                });
-            }
-        };
-        ResourceTimelineView.needsResourceData = true; // for ResourceViewProps
-        return ResourceTimelineView;
-    }(core.View));
-    function hasResourceBusinessHours(resourceStore) {
-        for (var resourceId in resourceStore) {
-            var resource = resourceStore[resourceId];
-            if (resource.businessHours) {
-                return true;
-            }
-        }
-        return false;
-    }
-    function hasNesting(nodes) {
-        for (var _i = 0, nodes_1 = nodes; _i < nodes_1.length; _i++) {
-            var node = nodes_1[_i];
-            if (node.group) {
-                return true;
-            }
-            else if (node.resource) {
-                if (node.hasChildren) {
-                    return true;
-                }
-            }
-        }
-        return false;
-    }
-
-    var main = core.createPlugin({
-        deps: [ResourceCommonPlugin__default, TimelinePlugin__default],
-        defaultView: 'resourceTimelineDay',
-        views: {
-            resourceTimeline: {
-                class: ResourceTimelineView,
-                resourceAreaWidth: '30%',
-                resourcesInitiallyExpanded: true,
-                eventResizableFromStart: true // TODO: not DRY with this same setting in the main timeline config
-            },
-            resourceTimelineDay: {
-                type: 'resourceTimeline',
-                duration: { days: 1 }
-            },
-            resourceTimelineWeek: {
-                type: 'resourceTimeline',
-                duration: { weeks: 1 }
-            },
-            resourceTimelineMonth: {
-                type: 'resourceTimeline',
-                duration: { months: 1 }
-            },
-            resourceTimelineYear: {
-                type: 'resourceTimeline',
-                duration: { years: 1 }
-            }
-        }
-    });
-
-    exports.ResourceTimelineView = ResourceTimelineView;
-    exports.default = main;
-
-    Object.defineProperty(exports, '__esModule', { value: true });
-
-}));
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/resource-timeline/main.min.css b/AKPlan/static/AKPlan/vendor/fullcalendar/resource-timeline/main.min.css
deleted file mode 100644
index a365c608d3c4b455135320750f27d180e14ec113..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/resource-timeline/main.min.css
+++ /dev/null
@@ -1 +0,0 @@
-.fc-timeline .fc-divider{width:3px;border-style:double}.fc-timeline .fc-head>tr>.fc-divider{border-bottom:0}.fc-timeline .fc-body>tr>.fc-divider{border-top:0}.fc-resource-area{width:30%}.fc-resource-area col{width:40%;min-width:70px}.fc-resource-area col.fc-main-col{width:60%}.fc-flat .fc-expander-space{display:none}.fc-ltr .fc-resource-area tr>*{text-align:left}.fc-rtl .fc-resource-area tr>*{text-align:right}.fc-resource-area .fc-cell-content{padding-left:4px;padding-right:4px}.fc-resource-area .fc-super th{text-align:center}.fc-resource-area th>div{position:relative}.fc-resource-area th .fc-cell-content{position:relative;z-index:1}.fc-resource-area th .fc-col-resizer{position:absolute;z-index:2;top:0;bottom:0;width:5px}.fc-timeline .fc-col-resizer{cursor:col-resize}.fc-ltr .fc-resource-area th .fc-col-resizer{right:-3px}.fc-rtl .fc-resource-area th .fc-col-resizer{left:-3px}.fc-body .fc-resource-area .fc-cell-content{padding-top:8px;padding-bottom:8px}.fc-no-overlap .fc-body .fc-resource-area .fc-cell-content{padding-top:6px;padding-bottom:6px}.fc-resource-area .fc-icon{display:inline-block;width:1em;text-align:center}.fc-resource-area .fc-expander{cursor:pointer;opacity:.65}.fc-time-area .fc-rows{position:relative;z-index:3}.fc-time-area .fc-rows td>div{position:relative}.fc-time-area .fc-rows .fc-bgevent-container,.fc-time-area .fc-rows .fc-highlight-container{z-index:1}
\ No newline at end of file
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/resource-timeline/main.min.js b/AKPlan/static/AKPlan/vendor/fullcalendar/resource-timeline/main.min.js
deleted file mode 100644
index c3467bffe4238ae4cd8089d9c05060ca064fcaef..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/resource-timeline/main.min.js
+++ /dev/null
@@ -1,6 +0,0 @@
-/*!
-FullCalendar Resource Timeline Plugin v4.3.0
-Docs & License: https://fullcalendar.io/scheduler
-(c) 2019 Adam Shaw
-*/
-!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("@fullcalendar/core"),require("@fullcalendar/timeline"),require("@fullcalendar/resource-common")):"function"==typeof define&&define.amd?define(["exports","@fullcalendar/core","@fullcalendar/timeline","@fullcalendar/resource-common"],t):t((e=e||self).FullCalendarResourceTimeline={},e.FullCalendar,e.FullCalendarTimeline,e.FullCalendarResourceCommon)}(this,function(e,t,r,o){"use strict";var i="default"in r?r.default:r,s="default"in o?o.default:o,n=function(e,t){return(n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])})(e,t)};function l(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}var a=function(){return(a=Object.assign||function(e){for(var t,r=1,o=arguments.length;r<o;r++)for(var i in t=arguments[r])Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i]);return e}).apply(this,arguments)},c=function(e){function r(t,r,o,i,s){var n=e.call(this,t)||this;return n.isSizeDirty=!1,r.insertBefore(n.spreadsheetTr=document.createElement("tr"),o),i.insertBefore(n.timeAxisTr=document.createElement("tr"),s),n}return l(r,e),r.prototype.destroy=function(){t.removeElement(this.spreadsheetTr),t.removeElement(this.timeAxisTr),e.prototype.destroy.call(this)},r.prototype.updateSize=function(e){this.isSizeDirty=!1},r}(t.Component);function d(e,t){var r=e.classList;t?(r.remove("fc-icon-plus-square"),r.add("fc-icon-minus-square")):(r.remove("fc-icon-minus-square"),r.add("fc-icon-plus-square"))}function p(e,t){e.setAttribute("data-resource-id",t)}var u=function(e){function r(){var r=null!==e&&e.apply(this,arguments)||this;return r._renderCells=t.memoizeRendering(r.renderCells,r.unrenderCells),r._updateExpanderIcon=t.memoizeRendering(r.updateExpanderIcon,null,[r._renderCells]),r.onExpanderClick=function(e){var t=r.props;r.calendar.dispatch({type:"SET_RESOURCE_ENTITY_EXPANDED",id:t.id,isExpanded:!t.isExpanded})},r}return l(r,e),r.prototype.render=function(e){this._renderCells(e.group,e.spreadsheetColCnt),this._updateExpanderIcon(e.isExpanded),this.isSizeDirty=!0},r.prototype.destroy=function(){e.prototype.destroy.call(this),this._renderCells.unrender()},r.prototype.renderCells=function(e,r){var o=this.renderSpreadsheetContent(e);this.spreadsheetTr.appendChild(t.createElement("td",{className:"fc-divider",colSpan:r},this.spreadsheetHeightEl=t.createElement("div",null,o))),this.expanderIconEl=o.querySelector(".fc-icon"),this.expanderIconEl.parentElement.addEventListener("click",this.onExpanderClick),this.timeAxisTr.appendChild(t.createElement("td",{className:"fc-divider"},this.timeAxisHeightEl=document.createElement("div")))},r.prototype.unrenderCells=function(){this.spreadsheetTr.innerHTML="",this.timeAxisTr.innerHTML=""},r.prototype.renderSpreadsheetContent=function(e){var r=this.renderCellText(e),o=t.htmlToElement('<div class="fc-cell-content"><span class="fc-expander"><span class="fc-icon"></span></span><span class="fc-cell-text">'+(r?t.htmlEscape(r):"&nbsp;")+"</span></div>"),i=e.spec.render;return"function"==typeof i&&(o=i(o,e.value)||o),o},r.prototype.renderCellText=function(e){var t=e.value||"",r=e.spec.text;return"function"==typeof r&&(t=r(t)||t),t},r.prototype.getHeightEls=function(){return[this.spreadsheetHeightEl,this.timeAxisHeightEl]},r.prototype.updateExpanderIcon=function(e){d(this.expanderIconEl,e)},r}(c);u.addEqualityFuncs({group:o.isGroupsEqual});var h=function(e){function r(r,o){var i=e.call(this,r)||this;return i._renderRow=t.memoizeRendering(i.renderRow,i.unrenderRow),i._updateTrResourceId=t.memoizeRendering(p,null,[i._renderRow]),i._updateExpanderIcon=t.memoizeRendering(i.updateExpanderIcon,null,[i._renderRow]),i.onExpanderClick=function(e){var t=i.props;i.calendar.dispatch({type:"SET_RESOURCE_ENTITY_EXPANDED",id:t.id,isExpanded:!t.isExpanded})},i.tr=o,i}return l(r,e),r.prototype.render=function(e){this._renderRow(e.resource,e.rowSpans,e.depth,e.colSpecs),this._updateTrResourceId(this.tr,e.resource.id),this._updateExpanderIcon(e.hasChildren,e.isExpanded)},r.prototype.destroy=function(){e.prototype.destroy.call(this),this._renderRow.unrender()},r.prototype.renderRow=function(e,r,i,s){for(var n,l=this.tr,a=this.theme,c=this.calendar,d=this.view,p=o.buildResourceFields(e),u=0;u<s.length;u++){var h=s[u],f=r[u];if(0!==f){null==f&&(f=1);var m=void 0;m=h.field?p[h.field]:o.buildResourceTextFunc(h.text,c)(e);var g=t.htmlToElement('<div class="fc-cell-content">'+(h.isMain?y(i):"")+'<span class="fc-cell-text">'+(m?t.htmlEscape(m):"&nbsp;")+"</span></div>");"function"==typeof h.render&&(g=h.render(new o.ResourceApi(c,e),g)||g),f>1&&g.classList.add("fc-sticky");var v=t.createElement("td",{className:a.getClass("widgetContent"),rowspan:f},g);h.isMain&&(v.appendChild(this.heightEl=t.createElement("div",null,v.childNodes)),n=v),l.appendChild(v)}}this.expanderIconEl=l.querySelector(".fc-expander-space .fc-icon"),d.publiclyTrigger("resourceRender",[{resource:new o.ResourceApi(c,e),el:n,view:d}])},r.prototype.unrenderRow=function(){this.tr.innerHTML=""},r.prototype.updateExpanderIcon=function(e,t){var r,o=this.expanderIconEl,i=o.parentElement;o&&i&&(e?(i.addEventListener("click",this.onExpanderClick),i.classList.add("fc-expander"),d(o,t)):(i.removeEventListener("click",this.onExpanderClick),i.classList.remove("fc-expander"),(r=o.classList).remove("fc-icon-minus-square"),r.remove("fc-icon-plus-square")))},r}(t.Component);function y(e){for(var t="",r=0;r<e;r++)t+='<span class="fc-icon"></span>';return t+='<span class="fc-expander-space"><span class="fc-icon"></span></span>'}var f=function(e){function o(o,i,s,n,l,a){var c=e.call(this,o,i,s,n,l)||this;return c._updateTrResourceId=t.memoizeRendering(p),c.spreadsheetRow=new h(o,c.spreadsheetTr),c.timeAxisTr.appendChild(t.createElement("td",{className:c.theme.getClass("widgetContent")},c.innerContainerEl=document.createElement("div"))),c.lane=new r.TimelineLane(o,c.innerContainerEl,c.innerContainerEl,a),c}return l(o,e),o.prototype.destroy=function(){this.spreadsheetRow.destroy(),this.lane.destroy(),e.prototype.destroy.call(this)},o.prototype.render=function(e){this.spreadsheetRow.receiveProps({colSpecs:e.colSpecs,id:e.id,rowSpans:e.rowSpans,depth:e.depth,isExpanded:e.isExpanded,hasChildren:e.hasChildren,resource:e.resource}),this._updateTrResourceId(this.timeAxisTr,e.resource.id),this.lane.receiveProps({dateProfile:e.dateProfile,nextDayThreshold:e.nextDayThreshold,businessHours:e.businessHours,eventStore:e.eventStore,eventUiBases:e.eventUiBases,dateSelection:e.dateSelection,eventSelection:e.eventSelection,eventDrag:e.eventDrag,eventResize:e.eventResize}),this.isSizeDirty=!0},o.prototype.updateSize=function(t){e.prototype.updateSize.call(this,t),this.lane.updateSize(t)},o.prototype.getHeightEls=function(){return[this.spreadsheetRow.heightEl,this.innerContainerEl]},o}(c);f.addEqualityFuncs({rowSpans:t.isArraysEqual});var m=function(e){function r(r,o){var i=e.call(this,r)||this;return i.resizables=[],i.colWidths=[],i.emitter=new t.EmitterMixin,o.appendChild(i.tableEl=t.createElement("table",{className:i.theme.getClass("tableGrid")})),i}return l(r,e),r.prototype.destroy=function(){for(var r=0,o=this.resizables;r<o.length;r++){o[r].destroy()}t.removeElement(this.tableEl),e.prototype.destroy.call(this)},r.prototype.render=function(e){var r=this.theme,o=e.colSpecs,i="<colgroup>"+e.colTags+"</colgroup><tbody>";e.superHeaderText&&(i+='<tr class="fc-super"><th class="'+r.getClass("widgetHeader")+'" colspan="'+o.length+'"><div class="fc-cell-content"><span class="fc-cell-text">'+t.htmlEscape(e.superHeaderText)+"</span></div></th></tr>"),i+="<tr>";for(var s=0;s<o.length;s++){var n=o[s],l=s===o.length-1;i+='<th class="'+r.getClass("widgetHeader")+'"><div><div class="fc-cell-content">'+(n.isMain?'<span class="fc-expander-space"><span class="fc-icon"></span></span>':"")+'<span class="fc-cell-text">'+t.htmlEscape(n.labelText||"")+"</span></div>"+(l?"":'<div class="fc-col-resizer"></div>')+"</div></th>"}i+="</tr>",i+="</tbody>",this.tableEl.innerHTML=i,this.thEls=Array.prototype.slice.call(this.tableEl.querySelectorAll("th")),this.colEls=Array.prototype.slice.call(this.tableEl.querySelectorAll("col")),this.resizerEls=Array.prototype.slice.call(this.tableEl.querySelectorAll(".fc-col-resizer")),this.initColResizing()},r.prototype.initColResizing=function(){var e=this,t=this.calendar.pluginSystem.hooks.elementDraggingImpl;t&&(this.resizables=this.resizerEls.map(function(r,o){var i,s=new t(r);return s.emitter.on("dragstart",function(){"number"!=typeof(i=e.colWidths[o])&&(i=e.thEls[o].getBoundingClientRect().width)}),s.emitter.on("dragmove",function(t){e.colWidths[o]=Math.max(i+t.deltaX*(e.isRtl?-1:1),30),e.emitter.trigger("colwidthchange",e.colWidths)}),s.setAutoScrollEnabled(!1),s}))},r}(t.Component),g=function(e){function o(o,i,s){var n=e.call(this,o)||this;n._renderCells=t.memoizeRendering(n.renderCells,n.unrenderCells),n.layout=new r.HeaderBodyLayout(i,s,"clipped-scroll");var l=n.layout.headerScroller.enhancedScroll,a=n.layout.bodyScroller.enhancedScroll;return n.header=new m(o,l.canvas.contentEl),n.header.emitter.on("colwidthchange",function(e){n.applyColWidths(e)}),a.canvas.contentEl.appendChild(n.bodyContainerEl=t.createElement("div",{className:"fc-rows"},"<table><colgroup /><tbody /></table>")),n.bodyColGroup=n.bodyContainerEl.querySelector("colgroup"),n.bodyTbody=n.bodyContainerEl.querySelector("tbody"),n}return l(o,e),o.prototype.destroy=function(){this.header.destroy(),this.layout.destroy(),this._renderCells.unrender(),e.prototype.destroy.call(this)},o.prototype.render=function(e){this._renderCells(e.superHeaderText,e.colSpecs)},o.prototype.renderCells=function(e,t){var r=this.renderColTags(t);this.header.receiveProps({superHeaderText:e,colSpecs:t,colTags:r}),this.bodyColGroup.innerHTML=r,this.bodyColEls=Array.prototype.slice.call(this.bodyColGroup.querySelectorAll("col")),this.applyColWidths(t.map(function(e){return e.width}))},o.prototype.unrenderCells=function(){this.bodyColGroup.innerHTML=""},o.prototype.renderColTags=function(e){for(var t="",r=0,o=e;r<o.length;r++){o[r].isMain?t+='<col class="fc-main-col"/>':t+="<col/>"}return t},o.prototype.updateSize=function(e,t,r){this.layout.setHeight(t,r)},o.prototype.applyColWidths=function(e){var t=this;e.forEach(function(e,r){var o,i=t.header.colEls[r],s=t.bodyColEls[r];"number"==typeof e?o=e+"px":null==typeof e&&(o=""),i.style.width=s.style.width=o})},o}(t.Component),v=function(e){function i(i,s,n,l){var a=e.call(this,i,s,n,l)||this;a.isStickyScrollDirty=!1,a.rowNodes=[],a.rowComponents=[],a.rowComponentsById={},a.resourceAreaWidthDraggings=[],a.splitter=new o.ResourceSplitter,a.hasResourceBusinessHours=t.memoize(S),a.buildRowNodes=t.memoize(o.buildRowNodes),a.hasNesting=t.memoize(x),a._updateHasNesting=t.memoizeRendering(a.updateHasNesting);var c=a.opt("resourceColumns")||[],d=a.opt("resourceLabelText"),p=null;c.length?p=d:c.push({labelText:d||"Resources",text:o.buildResourceTextFunc(a.opt("resourceText"),a.calendar)});for(var u=[],h=[],y=[],f=!1,m=!1,v=0,E=c;v<E.length;v++){var C=E[v];C.group?h.push(C):u.push(C)}if(u[0].isMain=!0,h.length)y=h,f=!0;else{var w=a.opt("resourceGroupField");w&&(m=!0,y.push({field:w,text:a.opt("resourceGroupText"),render:a.opt("resourceGroupRender")}))}for(var b=[],R=0,T=t.parseFieldSpecs(a.opt("resourceOrder"));R<T.length;R++){for(var A=T[R],H=!1,z=0,I=y;z<I.length;z++){var D=I[z];if(D.field===A.field){D.order=A.order,H=!0;break}}H||b.push(A)}a.superHeaderText=p,a.isVGrouping=f,a.isHGrouping=m,a.groupSpecs=y,a.colSpecs=h.concat(u),a.orderSpecs=b,a.el.classList.add("fc-timeline"),!1===a.opt("eventOverlap")&&a.el.classList.add("fc-no-overlap"),a.el.innerHTML=a.renderSkeletonHtml(),a.resourceAreaHeadEl=a.el.querySelector("thead .fc-resource-area"),a.setResourceAreaWidth(a.opt("resourceAreaWidth")),a.initResourceAreaWidthDragging(),a.miscHeight=a.el.getBoundingClientRect().height,a.spreadsheet=new g(a.context,a.resourceAreaHeadEl,a.el.querySelector("tbody .fc-resource-area")),a.timeAxis=new r.TimeAxis(a.context,a.el.querySelector("thead .fc-time-area"),a.el.querySelector("tbody .fc-time-area"));var _=t.createElement("div",{className:"fc-rows"},"<table><tbody /></table>");return a.timeAxis.layout.bodyScroller.enhancedScroll.canvas.contentEl.appendChild(_),a.timeAxisTbody=_.querySelector("tbody"),a.lane=new r.TimelineLane(a.context,null,a.timeAxis.layout.bodyScroller.enhancedScroll.canvas.bgEl,a.timeAxis),a.bodyScrollJoiner=new r.ScrollJoiner("vertical",[a.spreadsheet.layout.bodyScroller,a.timeAxis.layout.bodyScroller]),a.spreadsheetBodyStickyScroller=new r.StickyScroller(a.spreadsheet.layout.bodyScroller.enhancedScroll,a.isRtl,!0),a.spreadsheet.receiveProps({superHeaderText:a.superHeaderText,colSpecs:a.colSpecs}),i.calendar.registerInteractiveComponent(a,{el:a.timeAxis.slats.el}),a}return l(i,e),i.prototype.renderSkeletonHtml=function(){var e=this.theme;return'<table class="'+e.getClass("tableGrid")+'"> <thead class="fc-head"> <tr> <td class="fc-resource-area '+e.getClass("widgetHeader")+'"></td> <td class="fc-divider fc-col-resizer '+e.getClass("widgetHeader")+'"></td> <td class="fc-time-area '+e.getClass("widgetHeader")+'"></td> </tr> </thead> <tbody class="fc-body"> <tr> <td class="fc-resource-area '+e.getClass("widgetContent")+'"></td> <td class="fc-divider fc-col-resizer '+e.getClass("widgetHeader")+'"></td> <td class="fc-time-area '+e.getClass("widgetContent")+'"></td> </tr> </tbody> </table>'},i.prototype.render=function(t){e.prototype.render.call(this,t);var r=this.splitter.splitProps(t),o=this.hasResourceBusinessHours(t.resourceStore);this.timeAxis.receiveProps({dateProfile:t.dateProfile}),this.lane.receiveProps(a({},r[""],{dateProfile:t.dateProfile,nextDayThreshold:this.nextDayThreshold,businessHours:o?null:t.businessHours}));var i=this.buildRowNodes(t.resourceStore,this.groupSpecs,this.orderSpecs,this.isVGrouping,t.resourceEntityExpansions,this.opt("resourcesInitiallyExpanded"));this._updateHasNesting(this.hasNesting(i)),this.diffRows(i),this.renderRows(t.dateProfile,o?t.businessHours:null,r)},i.prototype.updateHasNesting=function(e){var t=this.el.classList;e?t.remove("fc-flat"):t.add("fc-flat")},i.prototype.diffRows=function(e){var t=this.rowNodes,r=t.length,o={},i=0,s=0;for(i=0;i<r;i++)o[t[i].id]=i;for(i=0,s=0;s<e.length;s++){var n=e[s],l=o[n.id];null!=l&&l>=i?(this.removeRows(s,l-i,t),i=l+1):this.addRow(s,n)}this.removeRows(s,r-i,t),this.rowNodes=e},i.prototype.addRow=function(e,t){var r=this.rowComponents,o=this.rowComponentsById,i=r[e],s=this.buildChildComponent(t,this.spreadsheet.bodyTbody,i?i.spreadsheetTr:null,this.timeAxisTbody,i?i.timeAxisTr:null);r.splice(e,0,s),o[t.id]=s},i.prototype.removeRows=function(e,t,r){if(t){for(var o=this.rowComponents,i=this.rowComponentsById,s=0;s<t;s++){o[e+s].destroy(),delete i[r[s].id]}o.splice(e,t)}},i.prototype.buildChildComponent=function(e,t,r,o,i){return e.group?new u(this.context,t,r,o,i):e.resource?new f(this.context,t,r,o,i,this.timeAxis):void 0},i.prototype.renderRows=function(e,t,r){for(var o=this.rowNodes,i=this.rowComponents,s=0;s<o.length;s++){var n=o[s],l=i[s];if(n.group)l.receiveProps({spreadsheetColCnt:this.colSpecs.length,id:n.id,isExpanded:n.isExpanded,group:n.group});else{var c=n.resource;l.receiveProps(a({},r[c.id],{dateProfile:e,nextDayThreshold:this.nextDayThreshold,businessHours:c.businessHours||t,colSpecs:this.colSpecs,id:n.id,rowSpans:n.rowSpans,depth:n.depth,isExpanded:n.isExpanded,hasChildren:n.hasChildren,resource:n.resource}))}}},i.prototype.updateSize=function(e,r,o){var i=this.calendar,s=e||i.isViewUpdated||i.isDatesUpdated||i.isEventsUpdated;s&&(this.syncHeadHeights(),this.timeAxis.updateSize(e,r-this.miscHeight,o),this.spreadsheet.updateSize(e,r-this.miscHeight,o));var n=this.updateRowSizes(e);this.lane.updateSize(e),(s||n)&&(this.bodyScrollJoiner.update(),this.timeAxis.layout.scrollJoiner.update(),this.rowPositions=new t.PositionCache(this.timeAxis.slats.el,this.rowComponents.map(function(e){return e.timeAxisTr}),!1,!0),this.rowPositions.build(),this.isStickyScrollDirty=!0)},i.prototype.syncHeadHeights=function(){var e=this.spreadsheet.header.tableEl,t=this.timeAxis.header.tableEl;e.style.height="",t.style.height="";var r=Math.max(e.getBoundingClientRect().height,t.getBoundingClientRect().height);e.style.height=t.style.height=r+"px"},i.prototype.updateRowSizes=function(e){var t=this.rowComponents;e||(t=t.filter(function(e){return e.isSizeDirty}));for(var r=t.map(function(e){return e.getHeightEls()}),o=0,i=r;o<i.length;o++)for(var s=0,n=i[o];s<n.length;s++){n[s].style.height=""}for(var l=0,a=t;l<a.length;l++){a[l].updateSize(e)}for(var c=r.map(function(e){for(var t=null,r=0,o=e;r<o.length;r++){var i=o[r].getBoundingClientRect().height;(null===t||i>t)&&(t=i)}return t}),d=0;d<r.length;d++)for(var p=0,u=r[d];p<u.length;p++){u[p].style.height=c[d]+"px"}return t.length},i.prototype.destroy=function(){for(var t=0,r=this.rowComponents;t<r.length;t++){r[t].destroy()}this.rowNodes=[],this.rowComponents=[],this.spreadsheet.destroy(),this.timeAxis.destroy();for(var o=0,i=this.resourceAreaWidthDraggings;o<i.length;o++){i[o].destroy()}this.spreadsheetBodyStickyScroller.destroy(),e.prototype.destroy.call(this),this.calendar.unregisterInteractiveComponent(this)},i.prototype.getNowIndicatorUnit=function(e){return this.timeAxis.getNowIndicatorUnit(e)},i.prototype.renderNowIndicator=function(e){this.timeAxis.renderNowIndicator(e)},i.prototype.unrenderNowIndicator=function(){this.timeAxis.unrenderNowIndicator()},i.prototype.queryScroll=function(){var t=e.prototype.queryScroll.call(this);return this.props.resourceStore&&a(t,this.queryResourceScroll()),t},i.prototype.applyScroll=function(t,r){e.prototype.applyScroll.call(this,t,r),this.props.resourceStore&&this.applyResourceScroll(t),(r||this.isStickyScrollDirty)&&(this.isStickyScrollDirty=!1,this.spreadsheetBodyStickyScroller.updateSize(),this.timeAxis.updateStickyScrollers())},i.prototype.computeDateScroll=function(e){return this.timeAxis.computeDateScroll(e)},i.prototype.queryDateScroll=function(){return this.timeAxis.queryDateScroll()},i.prototype.applyDateScroll=function(e){this.timeAxis.applyDateScroll(e)},i.prototype.queryResourceScroll=function(){for(var e=this.rowComponents,t=this.rowNodes,r={},o=this.timeAxis.layout.bodyScroller.el.getBoundingClientRect().top,i=0;i<e.length;i++){var s=e[i],n=t[i],l=s.timeAxisTr.getBoundingClientRect().bottom;if(l>o){r.rowId=n.id,r.bottom=l-o;break}}return r},i.prototype.applyResourceScroll=function(e){var t=e.forcedRowId||e.rowId;if(t){var r=this.rowComponentsById[t];if(r){var o=r.timeAxisTr;if(o){var i=this.timeAxis.layout.bodyScroller.enhancedScroll.canvas.el.getBoundingClientRect().top,s=o.getBoundingClientRect(),n=(e.forcedRowId?s.top:s.bottom-e.bottom)-i;this.timeAxis.layout.bodyScroller.enhancedScroll.setScrollTop(n),this.spreadsheet.layout.bodyScroller.enhancedScroll.setScrollTop(n)}}}},i.prototype.buildPositionCaches=function(){this.timeAxis.slats.updateSize(),this.rowPositions.build()},i.prototype.queryHit=function(e,t){var r=this.rowPositions,o=this.timeAxis.slats,i=r.topToIndex(t);if(null!=i){var s=this.rowNodes[i].resource;if(s){var n=o.positionToHit(e);if(n)return{component:this,dateSpan:{range:n.dateSpan.range,allDay:n.dateSpan.allDay,resourceId:s.id},rect:{left:n.left,right:n.right,top:r.tops[i],bottom:r.bottoms[i]},dayEl:n.dayEl,layer:0}}}},i.prototype.setResourceAreaWidth=function(e){this.resourceAreaWidth=e,t.applyStyleProp(this.resourceAreaHeadEl,"width",e||"")},i.prototype.initResourceAreaWidthDragging=function(){var e=this,t=Array.prototype.slice.call(this.el.querySelectorAll(".fc-col-resizer")),r=this.calendar.pluginSystem.hooks.elementDraggingImpl;r&&(this.resourceAreaWidthDraggings=t.map(function(t){var o,i,s=new r(t);return s.emitter.on("dragstart",function(){"number"!=typeof(o=e.resourceAreaWidth)&&(o=e.resourceAreaHeadEl.getBoundingClientRect().width),i=e.el.getBoundingClientRect().width}),s.emitter.on("dragmove",function(t){var r=o+t.deltaX*(e.isRtl?-1:1);r=Math.max(r,30),r=Math.min(r,i-30),e.setResourceAreaWidth(r)}),s.setAutoScrollEnabled(!1),s}))},i.needsResourceData=!0,i}(t.View);function S(e){for(var t in e){if(e[t].businessHours)return!0}return!1}function x(e){for(var t=0,r=e;t<r.length;t++){var o=r[t];if(o.group)return!0;if(o.resource&&o.hasChildren)return!0}return!1}var E=t.createPlugin({deps:[s,i],defaultView:"resourceTimelineDay",views:{resourceTimeline:{class:v,resourceAreaWidth:"30%",resourcesInitiallyExpanded:!0,eventResizableFromStart:!0},resourceTimelineDay:{type:"resourceTimeline",duration:{days:1}},resourceTimelineWeek:{type:"resourceTimeline",duration:{weeks:1}},resourceTimelineMonth:{type:"resourceTimeline",duration:{months:1}},resourceTimelineYear:{type:"resourceTimeline",duration:{years:1}}}});e.ResourceTimelineView=v,e.default=E,Object.defineProperty(e,"__esModule",{value:!0})});
\ No newline at end of file
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/resource-timeline/package.json b/AKPlan/static/AKPlan/vendor/fullcalendar/resource-timeline/package.json
deleted file mode 100644
index 75c1775fb8b3a62225d727aa508b49bfc27c9def..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/resource-timeline/package.json
+++ /dev/null
@@ -1,37 +0,0 @@
-{
-  "name": "@fullcalendar/resource-timeline",
-  "version": "4.3.0",
-  "title": "FullCalendar Resource Timeline Plugin",
-  "description": "Display events and resources on a horizontal time axis",
-  "keywords": [
-    "calendar",
-    "event",
-    "full-sized"
-  ],
-  "homepage": "https://fullcalendar.io/scheduler",
-  "docs": "https://fullcalendar.io/docs/timeline-view",
-  "bugs": "https://fullcalendar.io/reporting-bugs",
-  "repository": {
-    "type": "git",
-    "url": "https://github.com/fullcalendar/fullcalendar-scheduler.git",
-    "homepage": "https://github.com/fullcalendar/fullcalendar-scheduler"
-  },
-  "license": "SEE LICENSE IN LICENSE.md",
-  "author": {
-    "name": "Adam Shaw",
-    "email": "arshaw@arshaw.com",
-    "url": "http://arshaw.com/"
-  },
-  "copyright": "2019 Adam Shaw",
-  "dependencies": {
-    "@fullcalendar/resource-common": "~4.3.0",
-    "@fullcalendar/timeline": "~4.3.0"
-  },
-  "peerDependencies": {
-    "@fullcalendar/core": "~4.3.0"
-  },
-  "main": "main.js",
-  "module": "main.esm.js",
-  "unpkg": "main.min.js",
-  "types": "main.d.ts"
-}
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/rrule/LICENSE.txt b/AKPlan/static/AKPlan/vendor/fullcalendar/rrule/LICENSE.txt
deleted file mode 100644
index 2149cfbeff4f2e3649bc950982aa72b894f7e521..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/rrule/LICENSE.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-Copyright (c) 2019 Adam Shaw
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/rrule/README.md b/AKPlan/static/AKPlan/vendor/fullcalendar/rrule/README.md
deleted file mode 100644
index 7b56bed789e521bbc60d5963867b603435977341..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/rrule/README.md
+++ /dev/null
@@ -1,8 +0,0 @@
-
-# FullCalendar RRule Plugin
-
-A connector to the RRule library, for recurring events
-
-[View the docs &raquo;](https://fullcalendar.io/docs/rrule-plugin)
-
-This package was created from the [FullCalendar monorepo &raquo;](https://github.com/fullcalendar/fullcalendar)
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/rrule/main.d.ts b/AKPlan/static/AKPlan/vendor/fullcalendar/rrule/main.d.ts
deleted file mode 100644
index 8ce74e975573a1a7c8409ab3340bd389ba70e000..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/rrule/main.d.ts
+++ /dev/null
@@ -1,9 +0,0 @@
-// Generated by dts-bundle v0.7.3-fork.1
-// Dependencies for this module:
-//   ../../../../../@fullcalendar/core
-
-declare module '@fullcalendar/rrule' {
-    const _default: import("@fullcalendar/core").PluginDef;
-    export default _default;
-}
-
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/rrule/main.esm.js b/AKPlan/static/AKPlan/vendor/fullcalendar/rrule/main.esm.js
deleted file mode 100644
index 3aee7eb9210ffd1a93bfe8d798f6ed865b057bd0..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/rrule/main.esm.js
+++ /dev/null
@@ -1,121 +0,0 @@
-/*!
-FullCalendar RRule Plugin v4.3.0
-Docs & License: https://fullcalendar.io/
-(c) 2019 Adam Shaw
-*/
-
-import {RRule, rrulestr} from 'rrule';
-import {createDuration, createPlugin, refineProps} from '@fullcalendar/core';
-
-/*! *****************************************************************************
-Copyright (c) Microsoft Corporation. All rights reserved.
-Licensed under the Apache License, Version 2.0 (the "License"); you may not use
-this file except in compliance with the License. You may obtain a copy of the
-License at http://www.apache.org/licenses/LICENSE-2.0
-
-THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
-WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
-MERCHANTABLITY OR NON-INFRINGEMENT.
-
-See the Apache Version 2.0 License for specific language governing permissions
-and limitations under the License.
-***************************************************************************** */
-
-var __assign = function() {
-    __assign = Object.assign || function __assign(t) {
-        for (var s, i = 1, n = arguments.length; i < n; i++) {
-            s = arguments[i];
-            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
-        }
-        return t;
-    };
-    return __assign.apply(this, arguments);
-};
-
-var EVENT_DEF_PROPS = {
-    rrule: null,
-    duration: createDuration
-};
-var recurring = {
-    parse: function (rawEvent, leftoverProps, dateEnv) {
-        if (rawEvent.rrule != null) {
-            var props = refineProps(rawEvent, EVENT_DEF_PROPS, {}, leftoverProps);
-            var parsed = parseRRule(props.rrule, dateEnv);
-            if (parsed) {
-                return {
-                    typeData: parsed.rrule,
-                    allDayGuess: parsed.allDayGuess,
-                    duration: props.duration
-                };
-            }
-        }
-        return null;
-    },
-    expand: function (rrule, framingRange) {
-        // we WANT an inclusive start and in exclusive end, but the js rrule lib will only do either BOTH
-        // inclusive or BOTH exclusive, which is stupid: https://github.com/jakubroztocil/rrule/issues/84
-        // Workaround: make inclusive, which will generate extra occurences, and then trim.
-        return rrule.between(framingRange.start, framingRange.end, true)
-            .filter(function (date) {
-            return date.valueOf() < framingRange.end.valueOf();
-        });
-    }
-};
-var main = createPlugin({
-    recurringTypes: [recurring]
-});
-function parseRRule(input, dateEnv) {
-    var allDayGuess = null;
-    var rrule;
-    if (typeof input === 'string') {
-        rrule = rrulestr(input);
-    }
-    else if (typeof input === 'object' && input) { // non-null object
-        var refined = __assign({}, input); // copy
-        if (typeof refined.dtstart === 'string') {
-            var dtstartMeta = dateEnv.createMarkerMeta(refined.dtstart);
-            if (dtstartMeta) {
-                refined.dtstart = dtstartMeta.marker;
-                allDayGuess = dtstartMeta.isTimeUnspecified;
-            }
-            else {
-                delete refined.dtstart;
-            }
-        }
-        if (typeof refined.until === 'string') {
-            refined.until = dateEnv.createMarker(refined.until);
-        }
-        if (refined.freq != null) {
-            refined.freq = convertConstant(refined.freq);
-        }
-        if (refined.wkst != null) {
-            refined.wkst = convertConstant(refined.wkst);
-        }
-        else {
-            refined.wkst = (dateEnv.weekDow - 1 + 7) % 7; // convert Sunday-first to Monday-first
-        }
-        if (refined.byweekday != null) {
-            refined.byweekday = convertConstants(refined.byweekday); // the plural version
-        }
-        rrule = new RRule(refined);
-    }
-    if (rrule) {
-        return { rrule: rrule, allDayGuess: allDayGuess };
-    }
-    return null;
-}
-function convertConstants(input) {
-    if (Array.isArray(input)) {
-        return input.map(convertConstant);
-    }
-    return convertConstant(input);
-}
-function convertConstant(input) {
-    if (typeof input === 'string') {
-        return RRule[input.toUpperCase()];
-    }
-    return input;
-}
-
-export default main;
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/rrule/main.js b/AKPlan/static/AKPlan/vendor/fullcalendar/rrule/main.js
deleted file mode 100644
index 1ed7bd76b275add2a0397f9323d9d8f3305fefdd..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/rrule/main.js
+++ /dev/null
@@ -1,128 +0,0 @@
-/*!
-FullCalendar RRule Plugin v4.3.0
-Docs & License: https://fullcalendar.io/
-(c) 2019 Adam Shaw
-*/
-
-(function (global, factory) {
-    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('rrule'), require('@fullcalendar/core')) :
-    typeof define === 'function' && define.amd ? define(['exports', 'rrule', '@fullcalendar/core'], factory) :
-    (global = global || self, factory(global.FullCalendarRrule = {}, global.rrule, global.FullCalendar));
-}(this, function (exports, rrule, core) { 'use strict';
-
-    /*! *****************************************************************************
-    Copyright (c) Microsoft Corporation. All rights reserved.
-    Licensed under the Apache License, Version 2.0 (the "License"); you may not use
-    this file except in compliance with the License. You may obtain a copy of the
-    License at http://www.apache.org/licenses/LICENSE-2.0
-
-    THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-    KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
-    WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
-    MERCHANTABLITY OR NON-INFRINGEMENT.
-
-    See the Apache Version 2.0 License for specific language governing permissions
-    and limitations under the License.
-    ***************************************************************************** */
-
-    var __assign = function() {
-        __assign = Object.assign || function __assign(t) {
-            for (var s, i = 1, n = arguments.length; i < n; i++) {
-                s = arguments[i];
-                for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
-            }
-            return t;
-        };
-        return __assign.apply(this, arguments);
-    };
-
-    var EVENT_DEF_PROPS = {
-        rrule: null,
-        duration: core.createDuration
-    };
-    var recurring = {
-        parse: function (rawEvent, leftoverProps, dateEnv) {
-            if (rawEvent.rrule != null) {
-                var props = core.refineProps(rawEvent, EVENT_DEF_PROPS, {}, leftoverProps);
-                var parsed = parseRRule(props.rrule, dateEnv);
-                if (parsed) {
-                    return {
-                        typeData: parsed.rrule,
-                        allDayGuess: parsed.allDayGuess,
-                        duration: props.duration
-                    };
-                }
-            }
-            return null;
-        },
-        expand: function (rrule, framingRange) {
-            // we WANT an inclusive start and in exclusive end, but the js rrule lib will only do either BOTH
-            // inclusive or BOTH exclusive, which is stupid: https://github.com/jakubroztocil/rrule/issues/84
-            // Workaround: make inclusive, which will generate extra occurences, and then trim.
-            return rrule.between(framingRange.start, framingRange.end, true)
-                .filter(function (date) {
-                return date.valueOf() < framingRange.end.valueOf();
-            });
-        }
-    };
-    var main = core.createPlugin({
-        recurringTypes: [recurring]
-    });
-    function parseRRule(input, dateEnv) {
-        var allDayGuess = null;
-        var rrule$1;
-        if (typeof input === 'string') {
-            rrule$1 = rrule.rrulestr(input);
-        }
-        else if (typeof input === 'object' && input) { // non-null object
-            var refined = __assign({}, input); // copy
-            if (typeof refined.dtstart === 'string') {
-                var dtstartMeta = dateEnv.createMarkerMeta(refined.dtstart);
-                if (dtstartMeta) {
-                    refined.dtstart = dtstartMeta.marker;
-                    allDayGuess = dtstartMeta.isTimeUnspecified;
-                }
-                else {
-                    delete refined.dtstart;
-                }
-            }
-            if (typeof refined.until === 'string') {
-                refined.until = dateEnv.createMarker(refined.until);
-            }
-            if (refined.freq != null) {
-                refined.freq = convertConstant(refined.freq);
-            }
-            if (refined.wkst != null) {
-                refined.wkst = convertConstant(refined.wkst);
-            }
-            else {
-                refined.wkst = (dateEnv.weekDow - 1 + 7) % 7; // convert Sunday-first to Monday-first
-            }
-            if (refined.byweekday != null) {
-                refined.byweekday = convertConstants(refined.byweekday); // the plural version
-            }
-            rrule$1 = new rrule.RRule(refined);
-        }
-        if (rrule$1) {
-            return { rrule: rrule$1, allDayGuess: allDayGuess };
-        }
-        return null;
-    }
-    function convertConstants(input) {
-        if (Array.isArray(input)) {
-            return input.map(convertConstant);
-        }
-        return convertConstant(input);
-    }
-    function convertConstant(input) {
-        if (typeof input === 'string') {
-            return rrule.RRule[input.toUpperCase()];
-        }
-        return input;
-    }
-
-    exports.default = main;
-
-    Object.defineProperty(exports, '__esModule', { value: true });
-
-}));
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/rrule/main.min.js b/AKPlan/static/AKPlan/vendor/fullcalendar/rrule/main.min.js
deleted file mode 100644
index 44fff76b93b023a6a74c1ca9e3daa9ca58a555b8..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/rrule/main.min.js
+++ /dev/null
@@ -1,6 +0,0 @@
-/*!
-FullCalendar RRule Plugin v4.3.0
-Docs & License: https://fullcalendar.io/
-(c) 2019 Adam Shaw
-*/
-!function(e,r){"object"==typeof exports&&"undefined"!=typeof module?r(exports,require("rrule"),require("@fullcalendar/core")):"function"==typeof define&&define.amd?define(["exports","rrule","@fullcalendar/core"],r):r((e=e||self).FullCalendarRrule={},e.rrule,e.FullCalendar)}(this,function(e,r,t){"use strict";var n=function(){return(n=Object.assign||function(e){for(var r,t=1,n=arguments.length;t<n;t++)for(var u in r=arguments[t])Object.prototype.hasOwnProperty.call(r,u)&&(e[u]=r[u]);return e}).apply(this,arguments)},u={rrule:null,duration:t.createDuration},l={parse:function(e,l,a){if(null!=e.rrule){var f=t.refineProps(e,u,{},l),o=function(e,t){var u,l=null;if("string"==typeof e)u=r.rrulestr(e);else if("object"==typeof e&&e){var a=n({},e);if("string"==typeof a.dtstart){var f=t.createMarkerMeta(a.dtstart);f?(a.dtstart=f.marker,l=f.isTimeUnspecified):delete a.dtstart}"string"==typeof a.until&&(a.until=t.createMarker(a.until)),null!=a.freq&&(a.freq=i(a.freq)),null!=a.wkst?a.wkst=i(a.wkst):a.wkst=(t.weekDow-1+7)%7,null!=a.byweekday&&(a.byweekday=function(e){if(Array.isArray(e))return e.map(i);return i(e)}(a.byweekday)),u=new r.RRule(a)}if(u)return{rrule:u,allDayGuess:l};return null}(f.rrule,a);if(o)return{typeData:o.rrule,allDayGuess:o.allDayGuess,duration:f.duration}}return null},expand:function(e,r){return e.between(r.start,r.end,!0).filter(function(e){return e.valueOf()<r.end.valueOf()})}},a=t.createPlugin({recurringTypes:[l]});function i(e){return"string"==typeof e?r.RRule[e.toUpperCase()]:e}e.default=a,Object.defineProperty(e,"__esModule",{value:!0})});
\ No newline at end of file
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/rrule/package.json b/AKPlan/static/AKPlan/vendor/fullcalendar/rrule/package.json
deleted file mode 100644
index cf9706bc617c8ceb2fc3a1b57d5c0dd759742452..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/rrule/package.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
-  "name": "@fullcalendar/rrule",
-  "version": "4.3.0",
-  "title": "FullCalendar RRule Plugin",
-  "description": "A connector to the RRule library, for recurring events",
-  "keywords": [
-    "calendar",
-    "event",
-    "full-sized"
-  ],
-  "homepage": "https://fullcalendar.io/",
-  "docs": "https://fullcalendar.io/docs/rrule-plugin",
-  "bugs": "https://fullcalendar.io/reporting-bugs",
-  "repository": {
-    "type": "git",
-    "url": "https://github.com/fullcalendar/fullcalendar.git",
-    "homepage": "https://github.com/fullcalendar/fullcalendar"
-  },
-  "license": "MIT",
-  "author": {
-    "name": "Adam Shaw",
-    "email": "arshaw@arshaw.com",
-    "url": "http://arshaw.com/"
-  },
-  "copyright": "2019 Adam Shaw",
-  "peerDependencies": {
-    "@fullcalendar/core": "~4.3.0",
-    "rrule": "^2.6.0"
-  },
-  "main": "main.js",
-  "module": "main.esm.js",
-  "unpkg": "main.min.js",
-  "types": "main.d.ts"
-}
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/timegrid/LICENSE.txt b/AKPlan/static/AKPlan/vendor/fullcalendar/timegrid/LICENSE.txt
deleted file mode 100644
index 2149cfbeff4f2e3649bc950982aa72b894f7e521..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/timegrid/LICENSE.txt
+++ /dev/null
@@ -1,20 +0,0 @@
-Copyright (c) 2019 Adam Shaw
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be
-included in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/timegrid/README.md b/AKPlan/static/AKPlan/vendor/fullcalendar/timegrid/README.md
deleted file mode 100644
index ac13676c847d14e5f73afe063781fc85756d842d..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/timegrid/README.md
+++ /dev/null
@@ -1,8 +0,0 @@
-
-# FullCalendar Time Grid Plugin
-
-Display your events on a grid of time slots
-
-[View the docs &raquo;](https://fullcalendar.io/docs/timegrid-view)
-
-This package was created from the [FullCalendar monorepo &raquo;](https://github.com/fullcalendar/fullcalendar)
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/timegrid/main.css b/AKPlan/static/AKPlan/vendor/fullcalendar/timegrid/main.css
deleted file mode 100644
index b8ee6448a2f7f06a2892d0a2bb64991b73dd95cd..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/timegrid/main.css
+++ /dev/null
@@ -1,309 +0,0 @@
-@charset "UTF-8";
-/* TimeGridView all-day area
---------------------------------------------------------------------------------------------------*/
-.fc-timeGrid-view .fc-day-grid {
-  position: relative;
-  z-index: 2;
-  /* so the "more.." popover will be over the time grid */
-}
-
-.fc-timeGrid-view .fc-day-grid .fc-row {
-  min-height: 3em;
-  /* all-day section will never get shorter than this */
-}
-
-.fc-timeGrid-view .fc-day-grid .fc-row .fc-content-skeleton {
-  padding-bottom: 1em;
-  /* give space underneath events for clicking/selecting days */
-}
-
-/* TimeGrid axis running down the side (for both the all-day area and the slot area)
---------------------------------------------------------------------------------------------------*/
-.fc .fc-axis {
-  /* .fc to overcome default cell styles */
-  vertical-align: middle;
-  padding: 0 4px;
-  white-space: nowrap;
-}
-
-.fc-ltr .fc-axis {
-  text-align: right;
-}
-
-.fc-rtl .fc-axis {
-  text-align: left;
-}
-
-/* TimeGrid Structure
---------------------------------------------------------------------------------------------------*/
-.fc-time-grid-container,
-.fc-time-grid {
-  /* so slats/bg/content/etc positions get scoped within here */
-  position: relative;
-  z-index: 1;
-}
-
-.fc-time-grid {
-  min-height: 100%;
-  /* so if height setting is 'auto', .fc-bg stretches to fill height */
-}
-
-.fc-time-grid table {
-  /* don't put outer borders on slats/bg/content/etc */
-  border: 0 hidden transparent;
-}
-
-.fc-time-grid > .fc-bg {
-  z-index: 1;
-}
-
-.fc-time-grid .fc-slats,
-.fc-time-grid > hr {
-  /* the <hr> TimeGridView injects when grid is shorter than scroller */
-  position: relative;
-  z-index: 2;
-}
-
-.fc-time-grid .fc-content-col {
-  position: relative;
-  /* because now-indicator lives directly inside */
-}
-
-.fc-time-grid .fc-content-skeleton {
-  position: absolute;
-  z-index: 3;
-  top: 0;
-  left: 0;
-  right: 0;
-}
-
-/* divs within a cell within the fc-content-skeleton */
-.fc-time-grid .fc-business-container {
-  position: relative;
-  z-index: 1;
-}
-
-.fc-time-grid .fc-bgevent-container {
-  position: relative;
-  z-index: 2;
-}
-
-.fc-time-grid .fc-highlight-container {
-  position: relative;
-  z-index: 3;
-}
-
-.fc-time-grid .fc-event-container {
-  position: relative;
-  z-index: 4;
-}
-
-.fc-time-grid .fc-now-indicator-line {
-  z-index: 5;
-}
-
-.fc-time-grid .fc-mirror-container {
-  /* also is fc-event-container */
-  position: relative;
-  z-index: 6;
-}
-
-/* TimeGrid Slats (lines that run horizontally)
---------------------------------------------------------------------------------------------------*/
-.fc-time-grid .fc-slats td {
-  height: 1.5em;
-  border-bottom: 0;
-  /* each cell is responsible for its top border */
-}
-
-.fc-time-grid .fc-slats .fc-minor td {
-  border-top-style: dotted;
-}
-
-/* TimeGrid Highlighting Slots
---------------------------------------------------------------------------------------------------*/
-.fc-time-grid .fc-highlight-container {
-  /* a div within a cell within the fc-highlight-skeleton */
-  position: relative;
-  /* scopes the left/right of the fc-highlight to be in the column */
-}
-
-.fc-time-grid .fc-highlight {
-  position: absolute;
-  left: 0;
-  right: 0;
-  /* top and bottom will be in by JS */
-}
-
-/* TimeGrid Event Containment
---------------------------------------------------------------------------------------------------*/
-.fc-ltr .fc-time-grid .fc-event-container {
-  /* space on the sides of events for LTR (default) */
-  margin: 0 2.5% 0 2px;
-}
-
-.fc-rtl .fc-time-grid .fc-event-container {
-  /* space on the sides of events for RTL */
-  margin: 0 2px 0 2.5%;
-}
-
-.fc-time-grid .fc-event,
-.fc-time-grid .fc-bgevent {
-  position: absolute;
-  z-index: 1;
-  /* scope inner z-index's */
-}
-
-.fc-time-grid .fc-bgevent {
-  /* background events always span full width */
-  left: 0;
-  right: 0;
-}
-
-/* TimeGrid Event Styling
-----------------------------------------------------------------------------------------------------
-We use the full "fc-time-grid-event" class instead of using descendants because the event won't
-be a descendant of the grid when it is being dragged.
-*/
-.fc-time-grid-event {
-  margin-bottom: 1px;
-}
-
-.fc-time-grid-event-inset {
-  -webkit-box-shadow: 0px 0px 0px 1px #fff;
-  box-shadow: 0px 0px 0px 1px #fff;
-}
-
-.fc-time-grid-event.fc-not-start {
-  /* events that are continuing from another day */
-  /* replace space made by the top border with padding */
-  border-top-width: 0;
-  padding-top: 1px;
-  /* remove top rounded corners */
-  border-top-left-radius: 0;
-  border-top-right-radius: 0;
-}
-
-.fc-time-grid-event.fc-not-end {
-  /* replace space made by the top border with padding */
-  border-bottom-width: 0;
-  padding-bottom: 1px;
-  /* remove bottom rounded corners */
-  border-bottom-left-radius: 0;
-  border-bottom-right-radius: 0;
-}
-
-.fc-time-grid-event .fc-content {
-  overflow: hidden;
-  max-height: 100%;
-}
-
-.fc-time-grid-event .fc-time,
-.fc-time-grid-event .fc-title {
-  padding: 0 1px;
-}
-
-.fc-time-grid-event .fc-time {
-  font-size: 0.85em;
-  white-space: nowrap;
-}
-
-/* short mode, where time and title are on the same line */
-.fc-time-grid-event.fc-short .fc-content {
-  /* don't wrap to second line (now that contents will be inline) */
-  white-space: nowrap;
-}
-
-.fc-time-grid-event.fc-short .fc-time,
-.fc-time-grid-event.fc-short .fc-title {
-  /* put the time and title on the same line */
-  display: inline-block;
-  vertical-align: top;
-}
-
-.fc-time-grid-event.fc-short .fc-time span {
-  display: none;
-  /* don't display the full time text... */
-}
-
-.fc-time-grid-event.fc-short .fc-time:before {
-  content: attr(data-start);
-  /* ...instead, display only the start time */
-}
-
-.fc-time-grid-event.fc-short .fc-time:after {
-  content: " - ";
-  /* seperate with a dash, wrapped in nbsp's */
-}
-
-.fc-time-grid-event.fc-short .fc-title {
-  font-size: 0.85em;
-  /* make the title text the same size as the time */
-  padding: 0;
-  /* undo padding from above */
-}
-
-/* resizer (cursor device) */
-.fc-time-grid-event.fc-allow-mouse-resize .fc-resizer {
-  left: 0;
-  right: 0;
-  bottom: 0;
-  height: 8px;
-  overflow: hidden;
-  line-height: 8px;
-  font-size: 11px;
-  font-family: monospace;
-  text-align: center;
-  cursor: s-resize;
-}
-
-.fc-time-grid-event.fc-allow-mouse-resize .fc-resizer:after {
-  content: "=";
-}
-
-/* resizer (touch device) */
-.fc-time-grid-event.fc-selected .fc-resizer {
-  /* 10x10 dot */
-  border-radius: 5px;
-  border-width: 1px;
-  width: 8px;
-  height: 8px;
-  border-style: solid;
-  border-color: inherit;
-  background: #fff;
-  /* horizontally center */
-  left: 50%;
-  margin-left: -5px;
-  /* center on the bottom edge */
-  bottom: -5px;
-}
-
-/* Now Indicator
---------------------------------------------------------------------------------------------------*/
-.fc-time-grid .fc-now-indicator-line {
-  border-top-width: 1px;
-  left: 0;
-  right: 0;
-}
-
-/* arrow on axis */
-.fc-time-grid .fc-now-indicator-arrow {
-  margin-top: -5px;
-  /* vertically center on top coordinate */
-}
-
-.fc-ltr .fc-time-grid .fc-now-indicator-arrow {
-  left: 0;
-  /* triangle pointing right... */
-  border-width: 5px 0 5px 6px;
-  border-top-color: transparent;
-  border-bottom-color: transparent;
-}
-
-.fc-rtl .fc-time-grid .fc-now-indicator-arrow {
-  right: 0;
-  /* triangle pointing left... */
-  border-width: 5px 6px 5px 0;
-  border-top-color: transparent;
-  border-bottom-color: transparent;
-}
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/timegrid/main.d.ts b/AKPlan/static/AKPlan/vendor/fullcalendar/timegrid/main.d.ts
deleted file mode 100644
index 875bffed5af6c2c9fdd9f6de4327cedc19b617b9..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/timegrid/main.d.ts
+++ /dev/null
@@ -1,268 +0,0 @@
-// Generated by dts-bundle v0.7.3-fork.1
-// Dependencies for this module:
-//   ../../../../../@fullcalendar/core
-//   ../../../../../@fullcalendar/daygrid
-
-declare module '@fullcalendar/timegrid' {
-    import AbstractTimeGridView from '@fullcalendar/timegrid/AbstractTimeGridView';
-    import TimeGridView, {buildDayTable} from '@fullcalendar/timegrid/TimeGridView';
-    import {TimeGridSeg} from '@fullcalendar/timegrid/TimeGrid';
-    import {buildDayRanges, TimeGridSlicer} from '@fullcalendar/timegrid/SimpleTimeGrid';
-    export {TimeGridView, AbstractTimeGridView, buildDayTable, buildDayRanges, TimeGridSlicer, TimeGridSeg};
-    export {default as TimeGrid} from '@fullcalendar/timegrid/TimeGrid';
-    const _default: import("@fullcalendar/core").PluginDef;
-    export default _default;
-}
-
-declare module '@fullcalendar/timegrid/AbstractTimeGridView' {
-    import {
-        ComponentContext,
-        DateProfileGenerator,
-        Duration,
-        ScrollComponent,
-        View,
-        ViewSpec
-    } from '@fullcalendar/core';
-    import {DayGrid} from '@fullcalendar/daygrid';
-    import TimeGrid from '@fullcalendar/timegrid/TimeGrid';
-    import AllDaySplitter from '@fullcalendar/timegrid/AllDaySplitter';
-    export {TimeGridView as default, TimeGridView};
-
-    abstract class TimeGridView extends View {
-        timeGrid: TimeGrid;
-        dayGrid: DayGrid;
-        scroller: ScrollComponent;
-        axisWidth: any;
-        protected splitter: AllDaySplitter;
-
-        constructor(context: ComponentContext, viewSpec: ViewSpec, dateProfileGenerator: DateProfileGenerator, parentEl: HTMLElement);
-        destroy(): void;
-        renderSkeletonHtml(): string;
-        getNowIndicatorUnit(): string;
-        unrenderNowIndicator(): void;
-        updateSize(isResize: boolean, viewHeight: number, isAuto: boolean): void;
-        updateBaseSize(isResize: any, viewHeight: any, isAuto: any): void;
-        computeScrollerHeight(viewHeight: any): number;
-        computeDateScroll(duration: Duration): {
-            top: any;
-        };
-        queryDateScroll(): {
-            top: number;
-        };
-        applyDateScroll(scroll: any): void;
-        renderHeadIntroHtml: () => string;
-        axisStyleAttr(): string;
-        renderTimeGridBgIntroHtml: () => string;
-        renderTimeGridIntroHtml: () => string;
-        renderDayGridBgIntroHtml: () => string;
-        renderDayGridIntroHtml: () => string;
-    }
-}
-
-declare module '@fullcalendar/timegrid/TimeGridView' {
-    import {
-        ComponentContext,
-        DateProfile,
-        DateProfileGenerator,
-        DayHeader,
-        DayTable,
-        ViewProps,
-        ViewSpec
-    } from '@fullcalendar/core';
-    import {SimpleDayGrid} from '@fullcalendar/daygrid';
-    import SimpleTimeGrid from '@fullcalendar/timegrid/SimpleTimeGrid';
-    import AbstractTimeGridView from '@fullcalendar/timegrid/AbstractTimeGridView';
-    export {TimeGridView as default, TimeGridView};
-
-    class TimeGridView extends AbstractTimeGridView {
-        header: DayHeader;
-        simpleDayGrid: SimpleDayGrid;
-        simpleTimeGrid: SimpleTimeGrid;
-
-        constructor(_context: ComponentContext, viewSpec: ViewSpec, dateProfileGenerator: DateProfileGenerator, parentEl: HTMLElement);
-
-        destroy(): void;
-
-        render(props: ViewProps): void;
-        renderNowIndicator(date: any): void;
-    }
-    export function buildDayTable(dateProfile: DateProfile, dateProfileGenerator: DateProfileGenerator): DayTable;
-}
-
-declare module '@fullcalendar/timegrid/TimeGrid' {
-    import {
-        ComponentContext,
-        DateComponent,
-        DateFormatter,
-        DateMarker,
-        DateProfile,
-        Duration,
-        EventSegUiInteractionState,
-        PositionCache,
-        Seg
-    } from '@fullcalendar/core';
-
-    export interface RenderProps {
-        renderBgIntroHtml: () => string;
-        renderIntroHtml: () => string;
-    }
-
-    export interface TimeGridSeg extends Seg {
-        col: number;
-        start: DateMarker;
-        end: DateMarker;
-    }
-    export interface TimeGridCell {
-        date: DateMarker;
-        htmlAttrs?: string;
-    }
-    export interface TimeGridProps {
-        dateProfile: DateProfile;
-        cells: TimeGridCell[];
-        businessHourSegs: TimeGridSeg[];
-        bgEventSegs: TimeGridSeg[];
-        fgEventSegs: TimeGridSeg[];
-        dateSelectionSegs: TimeGridSeg[];
-        eventSelection: string;
-        eventDrag: EventSegUiInteractionState | null;
-        eventResize: EventSegUiInteractionState | null;
-    }
-    export { TimeGrid as default, TimeGrid };
-    class TimeGrid extends DateComponent<TimeGridProps> {
-        renderProps: RenderProps;
-        slotDuration: Duration;
-        snapDuration: Duration;
-        snapsPerSlot: any;
-        labelFormat: DateFormatter;
-        labelInterval: Duration;
-        colCnt: number;
-        colEls: HTMLElement[];
-        slatContainerEl: HTMLElement;
-        slatEls: HTMLElement[];
-        nowIndicatorEls: HTMLElement[];
-        colPositions: PositionCache;
-        slatPositions: PositionCache;
-        isSlatSizesDirty: boolean;
-        isColSizesDirty: boolean;
-        rootBgContainerEl: HTMLElement;
-        bottomRuleEl: HTMLElement;
-        contentSkeletonEl: HTMLElement;
-        colContainerEls: HTMLElement[];
-        fgContainerEls: HTMLElement[];
-        bgContainerEls: HTMLElement[];
-        mirrorContainerEls: HTMLElement[];
-        highlightContainerEls: HTMLElement[];
-        businessContainerEls: HTMLElement[];
-        constructor(context: ComponentContext, el: HTMLElement, renderProps: RenderProps);
-        processOptions(): void;
-        computeLabelInterval(slotDuration: any): any;
-        render(props: TimeGridProps): void;
-        destroy(): void;
-        updateSize(isResize: boolean): void;
-        _renderSlats(dateProfile: DateProfile): void;
-        renderSlatRowHtml(dateProfile: DateProfile): string;
-        _renderColumns(cells: TimeGridCell[], dateProfile: DateProfile): void;
-        _unrenderColumns(): void;
-        renderContentSkeleton(): void;
-        unrenderContentSkeleton(): void;
-        groupSegsByCol(segs: any): any[];
-        attachSegsByCol(segsByCol: any, containerEls: HTMLElement[]): void;
-        getNowIndicatorUnit(): string;
-        renderNowIndicator(segs: TimeGridSeg[], date: any): void;
-        unrenderNowIndicator(): void;
-        getTotalSlatHeight(): number;
-        computeDateTop(when: DateMarker, startOfDayDate?: DateMarker): any;
-        computeTimeTop(duration: Duration): any;
-        computeSegVerticals(segs: any): void;
-        assignSegVerticals(segs: any): void;
-        generateSegVerticalCss(seg: any): {
-            top: any;
-            bottom: number;
-        };
-        buildPositionCaches(): void;
-        buildColPositions(): void;
-        buildSlatPositions(): void;
-        positionToHit(positionLeft: any, positionTop: any): {
-            col: any;
-            dateSpan: {
-                range: {
-                    start: Date;
-                    end: Date;
-                };
-                allDay: boolean;
-            };
-            dayEl: HTMLElement;
-            relativeRect: {
-                left: any;
-                right: any;
-                top: any;
-                bottom: any;
-            };
-        };
-        _renderEventDrag(state: EventSegUiInteractionState): void;
-        _unrenderEventDrag(state: EventSegUiInteractionState): void;
-        _renderEventResize(state: EventSegUiInteractionState): void;
-        _unrenderEventResize(state: EventSegUiInteractionState): void;
-        _renderDateSelection(segs: Seg[]): void;
-        _unrenderDateSelection(segs: Seg[]): void;
-    }
-}
-
-declare module '@fullcalendar/timegrid/SimpleTimeGrid' {
-    import {
-        ComponentContext,
-        DateComponent,
-        DateEnv,
-        DateMarker,
-        DateProfile,
-        DateRange,
-        DateSpan,
-        DayTable,
-        EventInteractionState,
-        EventStore,
-        EventUiHash,
-        Hit,
-        Slicer
-    } from '@fullcalendar/core';
-    import TimeGrid, {TimeGridSeg} from '@fullcalendar/timegrid/TimeGrid';
-
-    export interface SimpleTimeGridProps {
-        dateProfile: DateProfile | null;
-        dayTable: DayTable;
-        businessHours: EventStore;
-        eventStore: EventStore;
-        eventUiBases: EventUiHash;
-        dateSelection: DateSpan | null;
-        eventSelection: string;
-        eventDrag: EventInteractionState | null;
-        eventResize: EventInteractionState | null;
-    }
-    export { SimpleTimeGrid as default, SimpleTimeGrid };
-    class SimpleTimeGrid extends DateComponent<SimpleTimeGridProps> {
-        timeGrid: TimeGrid;
-        constructor(context: ComponentContext, timeGrid: TimeGrid);
-        destroy(): void;
-        render(props: SimpleTimeGridProps): void;
-        renderNowIndicator(date: DateMarker): void;
-        buildPositionCaches(): void;
-        queryHit(positionLeft: number, positionTop: number): Hit;
-    }
-    export function buildDayRanges(dayTable: DayTable, dateProfile: DateProfile, dateEnv: DateEnv): DateRange[];
-    export class TimeGridSlicer extends Slicer<TimeGridSeg, [DateRange[]]> {
-        sliceRange(range: DateRange, dayRanges: DateRange[]): TimeGridSeg[];
-    }
-}
-
-declare module '@fullcalendar/timegrid/AllDaySplitter' {
-    import {DateSpan, EventDef, Splitter} from '@fullcalendar/core';
-    export { AllDaySplitter as default, AllDaySplitter };
-    class AllDaySplitter extends Splitter {
-        getKeyInfo(): {
-            allDay: {};
-            timed: {};
-        };
-        getKeysForDateSpan(dateSpan: DateSpan): string[];
-        getKeysForEventDef(eventDef: EventDef): string[];
-    }
-}
-
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/timegrid/main.esm.js b/AKPlan/static/AKPlan/vendor/fullcalendar/timegrid/main.esm.js
deleted file mode 100644
index 8732c26599652135c7c667d926a7ede75ac3d5c9..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/timegrid/main.esm.js
+++ /dev/null
@@ -1,1387 +0,0 @@
-/*!
-FullCalendar Time Grid Plugin v4.3.0
-Docs & License: https://fullcalendar.io/
-(c) 2019 Adam Shaw
-*/
-
-import {
-    addDurations,
-    applyStyle,
-    asRoughMs,
-    buildGotoAnchorHtml,
-    buildSegCompareObj,
-    compareByFieldSpecs,
-    compensateScroll,
-    createDuration,
-    createElement,
-    createFormatter,
-    createPlugin,
-    cssToStr,
-    DateComponent,
-    DayHeader,
-    DaySeries,
-    DayTable,
-    diffDays,
-    FgEventRenderer,
-    FillRenderer,
-    findElements,
-    formatIsoTimeString,
-    getAllDayHtml,
-    hasBgRendering,
-    htmlEscape,
-    htmlToElement,
-    intersectRanges,
-    isMultiDayRange,
-    matchCellWidths,
-    memoize,
-    memoizeRendering,
-    multiplyDuration,
-    PositionCache,
-    removeElement,
-    ScrollComponent,
-    Slicer,
-    Splitter,
-    startOfDay,
-    subtractInnerElHeight,
-    uncompensateScroll,
-    View,
-    wholeDivideDurations
-} from '@fullcalendar/core';
-import {DayBgRow, DayGrid, SimpleDayGrid} from '@fullcalendar/daygrid';
-
-/*! *****************************************************************************
-Copyright (c) Microsoft Corporation. All rights reserved.
-Licensed under the Apache License, Version 2.0 (the "License"); you may not use
-this file except in compliance with the License. You may obtain a copy of the
-License at http://www.apache.org/licenses/LICENSE-2.0
-
-THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
-WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
-MERCHANTABLITY OR NON-INFRINGEMENT.
-
-See the Apache Version 2.0 License for specific language governing permissions
-and limitations under the License.
-***************************************************************************** */
-/* global Reflect, Promise */
-
-var extendStatics = function(d, b) {
-    extendStatics = Object.setPrototypeOf ||
-        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-    return extendStatics(d, b);
-};
-
-function __extends(d, b) {
-    extendStatics(d, b);
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-}
-
-var __assign = function() {
-    __assign = Object.assign || function __assign(t) {
-        for (var s, i = 1, n = arguments.length; i < n; i++) {
-            s = arguments[i];
-            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
-        }
-        return t;
-    };
-    return __assign.apply(this, arguments);
-};
-
-/*
-Only handles foreground segs.
-Does not own rendering. Use for low-level util methods by TimeGrid.
-*/
-var TimeGridEventRenderer = /** @class */ (function (_super) {
-    __extends(TimeGridEventRenderer, _super);
-    function TimeGridEventRenderer(timeGrid) {
-        var _this = _super.call(this, timeGrid.context) || this;
-        _this.timeGrid = timeGrid;
-        _this.fullTimeFormat = createFormatter({
-            hour: 'numeric',
-            minute: '2-digit',
-            separator: _this.context.options.defaultRangeSeparator
-        });
-        return _this;
-    }
-    // Given an array of foreground segments, render a DOM element for each, computes position,
-    // and attaches to the column inner-container elements.
-    TimeGridEventRenderer.prototype.attachSegs = function (segs, mirrorInfo) {
-        var segsByCol = this.timeGrid.groupSegsByCol(segs);
-        // order the segs within each column
-        // TODO: have groupSegsByCol do this?
-        for (var col = 0; col < segsByCol.length; col++) {
-            segsByCol[col] = this.sortEventSegs(segsByCol[col]);
-        }
-        this.segsByCol = segsByCol;
-        this.timeGrid.attachSegsByCol(segsByCol, this.timeGrid.fgContainerEls);
-    };
-    TimeGridEventRenderer.prototype.detachSegs = function (segs) {
-        segs.forEach(function (seg) {
-            removeElement(seg.el);
-        });
-        this.segsByCol = null;
-    };
-    TimeGridEventRenderer.prototype.computeSegSizes = function (allSegs) {
-        var _a = this, timeGrid = _a.timeGrid, segsByCol = _a.segsByCol;
-        var colCnt = timeGrid.colCnt;
-        timeGrid.computeSegVerticals(allSegs); // horizontals relies on this
-        if (segsByCol) {
-            for (var col = 0; col < colCnt; col++) {
-                this.computeSegHorizontals(segsByCol[col]); // compute horizontal coordinates, z-index's, and reorder the array
-            }
-        }
-    };
-    TimeGridEventRenderer.prototype.assignSegSizes = function (allSegs) {
-        var _a = this, timeGrid = _a.timeGrid, segsByCol = _a.segsByCol;
-        var colCnt = timeGrid.colCnt;
-        timeGrid.assignSegVerticals(allSegs); // horizontals relies on this
-        if (segsByCol) {
-            for (var col = 0; col < colCnt; col++) {
-                this.assignSegCss(segsByCol[col]);
-            }
-        }
-    };
-    // Computes a default event time formatting string if `eventTimeFormat` is not explicitly defined
-    TimeGridEventRenderer.prototype.computeEventTimeFormat = function () {
-        return {
-            hour: 'numeric',
-            minute: '2-digit',
-            meridiem: false
-        };
-    };
-    // Computes a default `displayEventEnd` value if one is not expliclty defined
-    TimeGridEventRenderer.prototype.computeDisplayEventEnd = function () {
-        return true;
-    };
-    // Renders the HTML for a single event segment's default rendering
-    TimeGridEventRenderer.prototype.renderSegHtml = function (seg, mirrorInfo) {
-        var view = this.context.view;
-        var eventRange = seg.eventRange;
-        var eventDef = eventRange.def;
-        var eventUi = eventRange.ui;
-        var allDay = eventDef.allDay;
-        var isDraggable = view.computeEventDraggable(eventDef, eventUi);
-        var isResizableFromStart = seg.isStart && view.computeEventStartResizable(eventDef, eventUi);
-        var isResizableFromEnd = seg.isEnd && view.computeEventEndResizable(eventDef, eventUi);
-        var classes = this.getSegClasses(seg, isDraggable, isResizableFromStart || isResizableFromEnd, mirrorInfo);
-        var skinCss = cssToStr(this.getSkinCss(eventUi));
-        var timeText;
-        var fullTimeText; // more verbose time text. for the print stylesheet
-        var startTimeText; // just the start time text
-        classes.unshift('fc-time-grid-event');
-        // if the event appears to span more than one day...
-        if (isMultiDayRange(eventRange.range)) {
-            // Don't display time text on segments that run entirely through a day.
-            // That would appear as midnight-midnight and would look dumb.
-            // Otherwise, display the time text for the *segment's* times (like 6pm-midnight or midnight-10am)
-            if (seg.isStart || seg.isEnd) {
-                var unzonedStart = seg.start;
-                var unzonedEnd = seg.end;
-                timeText = this._getTimeText(unzonedStart, unzonedEnd, allDay); // TODO: give the timezones
-                fullTimeText = this._getTimeText(unzonedStart, unzonedEnd, allDay, this.fullTimeFormat);
-                startTimeText = this._getTimeText(unzonedStart, unzonedEnd, allDay, null, false); // displayEnd=false
-            }
-        }
-        else {
-            // Display the normal time text for the *event's* times
-            timeText = this.getTimeText(eventRange);
-            fullTimeText = this.getTimeText(eventRange, this.fullTimeFormat);
-            startTimeText = this.getTimeText(eventRange, null, false); // displayEnd=false
-        }
-        return '<a class="' + classes.join(' ') + '"' +
-            (eventDef.url ?
-                ' href="' + htmlEscape(eventDef.url) + '"' :
-                '') +
-            (skinCss ?
-                ' style="' + skinCss + '"' :
-                '') +
-            '>' +
-            '<div class="fc-content">' +
-            (timeText ?
-                '<div class="fc-time"' +
-                    ' data-start="' + htmlEscape(startTimeText) + '"' +
-                    ' data-full="' + htmlEscape(fullTimeText) + '"' +
-                    '>' +
-                    '<span>' + htmlEscape(timeText) + '</span>' +
-                    '</div>' :
-                '') +
-            (eventDef.title ?
-                '<div class="fc-title">' +
-                    htmlEscape(eventDef.title) +
-                    '</div>' :
-                '') +
-            '</div>' +
-            /* TODO: write CSS for this
-            (isResizableFromStart ?
-              '<div class="fc-resizer fc-start-resizer"></div>' :
-              ''
-              ) +
-            */
-            (isResizableFromEnd ?
-                '<div class="fc-resizer fc-end-resizer"></div>' :
-                '') +
-            '</a>';
-    };
-    // Given an array of segments that are all in the same column, sets the backwardCoord and forwardCoord on each.
-    // Assumed the segs are already ordered.
-    // NOTE: Also reorders the given array by date!
-    TimeGridEventRenderer.prototype.computeSegHorizontals = function (segs) {
-        var levels;
-        var level0;
-        var i;
-        levels = buildSlotSegLevels(segs);
-        computeForwardSlotSegs(levels);
-        if ((level0 = levels[0])) {
-            for (i = 0; i < level0.length; i++) {
-                computeSlotSegPressures(level0[i]);
-            }
-            for (i = 0; i < level0.length; i++) {
-                this.computeSegForwardBack(level0[i], 0, 0);
-            }
-        }
-    };
-    // Calculate seg.forwardCoord and seg.backwardCoord for the segment, where both values range
-    // from 0 to 1. If the calendar is left-to-right, the seg.backwardCoord maps to "left" and
-    // seg.forwardCoord maps to "right" (via percentage). Vice-versa if the calendar is right-to-left.
-    //
-    // The segment might be part of a "series", which means consecutive segments with the same pressure
-    // who's width is unknown until an edge has been hit. `seriesBackwardPressure` is the number of
-    // segments behind this one in the current series, and `seriesBackwardCoord` is the starting
-    // coordinate of the first segment in the series.
-    TimeGridEventRenderer.prototype.computeSegForwardBack = function (seg, seriesBackwardPressure, seriesBackwardCoord) {
-        var forwardSegs = seg.forwardSegs;
-        var i;
-        if (seg.forwardCoord === undefined) { // not already computed
-            if (!forwardSegs.length) {
-                // if there are no forward segments, this segment should butt up against the edge
-                seg.forwardCoord = 1;
-            }
-            else {
-                // sort highest pressure first
-                this.sortForwardSegs(forwardSegs);
-                // this segment's forwardCoord will be calculated from the backwardCoord of the
-                // highest-pressure forward segment.
-                this.computeSegForwardBack(forwardSegs[0], seriesBackwardPressure + 1, seriesBackwardCoord);
-                seg.forwardCoord = forwardSegs[0].backwardCoord;
-            }
-            // calculate the backwardCoord from the forwardCoord. consider the series
-            seg.backwardCoord = seg.forwardCoord -
-                (seg.forwardCoord - seriesBackwardCoord) / // available width for series
-                    (seriesBackwardPressure + 1); // # of segments in the series
-            // use this segment's coordinates to computed the coordinates of the less-pressurized
-            // forward segments
-            for (i = 0; i < forwardSegs.length; i++) {
-                this.computeSegForwardBack(forwardSegs[i], 0, seg.forwardCoord);
-            }
-        }
-    };
-    TimeGridEventRenderer.prototype.sortForwardSegs = function (forwardSegs) {
-        var objs = forwardSegs.map(buildTimeGridSegCompareObj);
-        var specs = [
-            // put higher-pressure first
-            { field: 'forwardPressure', order: -1 },
-            // put segments that are closer to initial edge first (and favor ones with no coords yet)
-            { field: 'backwardCoord', order: 1 }
-        ].concat(this.context.view.eventOrderSpecs);
-        objs.sort(function (obj0, obj1) {
-            return compareByFieldSpecs(obj0, obj1, specs);
-        });
-        return objs.map(function (c) {
-            return c._seg;
-        });
-    };
-    // Given foreground event segments that have already had their position coordinates computed,
-    // assigns position-related CSS values to their elements.
-    TimeGridEventRenderer.prototype.assignSegCss = function (segs) {
-        for (var _i = 0, segs_1 = segs; _i < segs_1.length; _i++) {
-            var seg = segs_1[_i];
-            applyStyle(seg.el, this.generateSegCss(seg));
-            if (seg.level > 0) {
-                seg.el.classList.add('fc-time-grid-event-inset');
-            }
-            // if the event is short that the title will be cut off,
-            // attach a className that condenses the title into the time area.
-            if (seg.eventRange.def.title && seg.bottom - seg.top < 30) {
-                seg.el.classList.add('fc-short'); // TODO: "condensed" is a better name
-            }
-        }
-    };
-    // Generates an object with CSS properties/values that should be applied to an event segment element.
-    // Contains important positioning-related properties that should be applied to any event element, customized or not.
-    TimeGridEventRenderer.prototype.generateSegCss = function (seg) {
-        var shouldOverlap = this.context.options.slotEventOverlap;
-        var backwardCoord = seg.backwardCoord; // the left side if LTR. the right side if RTL. floating-point
-        var forwardCoord = seg.forwardCoord; // the right side if LTR. the left side if RTL. floating-point
-        var props = this.timeGrid.generateSegVerticalCss(seg); // get top/bottom first
-        var isRtl = this.timeGrid.isRtl;
-        var left; // amount of space from left edge, a fraction of the total width
-        var right; // amount of space from right edge, a fraction of the total width
-        if (shouldOverlap) {
-            // double the width, but don't go beyond the maximum forward coordinate (1.0)
-            forwardCoord = Math.min(1, backwardCoord + (forwardCoord - backwardCoord) * 2);
-        }
-        if (isRtl) {
-            left = 1 - forwardCoord;
-            right = backwardCoord;
-        }
-        else {
-            left = backwardCoord;
-            right = 1 - forwardCoord;
-        }
-        props.zIndex = seg.level + 1; // convert from 0-base to 1-based
-        props.left = left * 100 + '%';
-        props.right = right * 100 + '%';
-        if (shouldOverlap && seg.forwardPressure) {
-            // add padding to the edge so that forward stacked events don't cover the resizer's icon
-            props[isRtl ? 'marginLeft' : 'marginRight'] = 10 * 2; // 10 is a guesstimate of the icon's width
-        }
-        return props;
-    };
-    return TimeGridEventRenderer;
-}(FgEventRenderer));
-// Builds an array of segments "levels". The first level will be the leftmost tier of segments if the calendar is
-// left-to-right, or the rightmost if the calendar is right-to-left. Assumes the segments are already ordered by date.
-function buildSlotSegLevels(segs) {
-    var levels = [];
-    var i;
-    var seg;
-    var j;
-    for (i = 0; i < segs.length; i++) {
-        seg = segs[i];
-        // go through all the levels and stop on the first level where there are no collisions
-        for (j = 0; j < levels.length; j++) {
-            if (!computeSlotSegCollisions(seg, levels[j]).length) {
-                break;
-            }
-        }
-        seg.level = j;
-        (levels[j] || (levels[j] = [])).push(seg);
-    }
-    return levels;
-}
-// For every segment, figure out the other segments that are in subsequent
-// levels that also occupy the same vertical space. Accumulate in seg.forwardSegs
-function computeForwardSlotSegs(levels) {
-    var i;
-    var level;
-    var j;
-    var seg;
-    var k;
-    for (i = 0; i < levels.length; i++) {
-        level = levels[i];
-        for (j = 0; j < level.length; j++) {
-            seg = level[j];
-            seg.forwardSegs = [];
-            for (k = i + 1; k < levels.length; k++) {
-                computeSlotSegCollisions(seg, levels[k], seg.forwardSegs);
-            }
-        }
-    }
-}
-// Figure out which path forward (via seg.forwardSegs) results in the longest path until
-// the furthest edge is reached. The number of segments in this path will be seg.forwardPressure
-function computeSlotSegPressures(seg) {
-    var forwardSegs = seg.forwardSegs;
-    var forwardPressure = 0;
-    var i;
-    var forwardSeg;
-    if (seg.forwardPressure === undefined) { // not already computed
-        for (i = 0; i < forwardSegs.length; i++) {
-            forwardSeg = forwardSegs[i];
-            // figure out the child's maximum forward path
-            computeSlotSegPressures(forwardSeg);
-            // either use the existing maximum, or use the child's forward pressure
-            // plus one (for the forwardSeg itself)
-            forwardPressure = Math.max(forwardPressure, 1 + forwardSeg.forwardPressure);
-        }
-        seg.forwardPressure = forwardPressure;
-    }
-}
-// Find all the segments in `otherSegs` that vertically collide with `seg`.
-// Append into an optionally-supplied `results` array and return.
-function computeSlotSegCollisions(seg, otherSegs, results) {
-    if (results === void 0) { results = []; }
-    for (var i = 0; i < otherSegs.length; i++) {
-        if (isSlotSegCollision(seg, otherSegs[i])) {
-            results.push(otherSegs[i]);
-        }
-    }
-    return results;
-}
-// Do these segments occupy the same vertical space?
-function isSlotSegCollision(seg1, seg2) {
-    return seg1.bottom > seg2.top && seg1.top < seg2.bottom;
-}
-function buildTimeGridSegCompareObj(seg) {
-    var obj = buildSegCompareObj(seg);
-    obj.forwardPressure = seg.forwardPressure;
-    obj.backwardCoord = seg.backwardCoord;
-    return obj;
-}
-
-var TimeGridMirrorRenderer = /** @class */ (function (_super) {
-    __extends(TimeGridMirrorRenderer, _super);
-    function TimeGridMirrorRenderer() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    TimeGridMirrorRenderer.prototype.attachSegs = function (segs, mirrorInfo) {
-        this.segsByCol = this.timeGrid.groupSegsByCol(segs);
-        this.timeGrid.attachSegsByCol(this.segsByCol, this.timeGrid.mirrorContainerEls);
-        this.sourceSeg = mirrorInfo.sourceSeg;
-    };
-    TimeGridMirrorRenderer.prototype.generateSegCss = function (seg) {
-        var props = _super.prototype.generateSegCss.call(this, seg);
-        var sourceSeg = this.sourceSeg;
-        if (sourceSeg && sourceSeg.col === seg.col) {
-            var sourceSegProps = _super.prototype.generateSegCss.call(this, sourceSeg);
-            props.left = sourceSegProps.left;
-            props.right = sourceSegProps.right;
-            props.marginLeft = sourceSegProps.marginLeft;
-            props.marginRight = sourceSegProps.marginRight;
-        }
-        return props;
-    };
-    return TimeGridMirrorRenderer;
-}(TimeGridEventRenderer));
-
-var TimeGridFillRenderer = /** @class */ (function (_super) {
-    __extends(TimeGridFillRenderer, _super);
-    function TimeGridFillRenderer(timeGrid) {
-        var _this = _super.call(this, timeGrid.context) || this;
-        _this.timeGrid = timeGrid;
-        return _this;
-    }
-    TimeGridFillRenderer.prototype.attachSegs = function (type, segs) {
-        var timeGrid = this.timeGrid;
-        var containerEls;
-        // TODO: more efficient lookup
-        if (type === 'bgEvent') {
-            containerEls = timeGrid.bgContainerEls;
-        }
-        else if (type === 'businessHours') {
-            containerEls = timeGrid.businessContainerEls;
-        }
-        else if (type === 'highlight') {
-            containerEls = timeGrid.highlightContainerEls;
-        }
-        timeGrid.attachSegsByCol(timeGrid.groupSegsByCol(segs), containerEls);
-        return segs.map(function (seg) {
-            return seg.el;
-        });
-    };
-    TimeGridFillRenderer.prototype.computeSegSizes = function (segs) {
-        this.timeGrid.computeSegVerticals(segs);
-    };
-    TimeGridFillRenderer.prototype.assignSegSizes = function (segs) {
-        this.timeGrid.assignSegVerticals(segs);
-    };
-    return TimeGridFillRenderer;
-}(FillRenderer));
-
-/* A component that renders one or more columns of vertical time slots
-----------------------------------------------------------------------------------------------------------------------*/
-// potential nice values for the slot-duration and interval-duration
-// from largest to smallest
-var AGENDA_STOCK_SUB_DURATIONS = [
-    { hours: 1 },
-    { minutes: 30 },
-    { minutes: 15 },
-    { seconds: 30 },
-    { seconds: 15 }
-];
-var TimeGrid = /** @class */ (function (_super) {
-    __extends(TimeGrid, _super);
-    function TimeGrid(context, el, renderProps) {
-        var _this = _super.call(this, context, el) || this;
-        _this.isSlatSizesDirty = false;
-        _this.isColSizesDirty = false;
-        _this.renderSlats = memoizeRendering(_this._renderSlats);
-        var eventRenderer = _this.eventRenderer = new TimeGridEventRenderer(_this);
-        var fillRenderer = _this.fillRenderer = new TimeGridFillRenderer(_this);
-        _this.mirrorRenderer = new TimeGridMirrorRenderer(_this);
-        var renderColumns = _this.renderColumns = memoizeRendering(_this._renderColumns, _this._unrenderColumns);
-        _this.renderBusinessHours = memoizeRendering(fillRenderer.renderSegs.bind(fillRenderer, 'businessHours'), fillRenderer.unrender.bind(fillRenderer, 'businessHours'), [renderColumns]);
-        _this.renderDateSelection = memoizeRendering(_this._renderDateSelection, _this._unrenderDateSelection, [renderColumns]);
-        _this.renderFgEvents = memoizeRendering(eventRenderer.renderSegs.bind(eventRenderer), eventRenderer.unrender.bind(eventRenderer), [renderColumns]);
-        _this.renderBgEvents = memoizeRendering(fillRenderer.renderSegs.bind(fillRenderer, 'bgEvent'), fillRenderer.unrender.bind(fillRenderer, 'bgEvent'), [renderColumns]);
-        _this.renderEventSelection = memoizeRendering(eventRenderer.selectByInstanceId.bind(eventRenderer), eventRenderer.unselectByInstanceId.bind(eventRenderer), [_this.renderFgEvents]);
-        _this.renderEventDrag = memoizeRendering(_this._renderEventDrag, _this._unrenderEventDrag, [renderColumns]);
-        _this.renderEventResize = memoizeRendering(_this._renderEventResize, _this._unrenderEventResize, [renderColumns]);
-        _this.processOptions();
-        el.innerHTML =
-            '<div class="fc-bg"></div>' +
-                '<div class="fc-slats"></div>' +
-                '<hr class="fc-divider ' + _this.theme.getClass('widgetHeader') + '" style="display:none" />';
-        _this.rootBgContainerEl = el.querySelector('.fc-bg');
-        _this.slatContainerEl = el.querySelector('.fc-slats');
-        _this.bottomRuleEl = el.querySelector('.fc-divider');
-        _this.renderProps = renderProps;
-        return _this;
-    }
-    /* Options
-    ------------------------------------------------------------------------------------------------------------------*/
-    // Parses various options into properties of this object
-    TimeGrid.prototype.processOptions = function () {
-        var slotDuration = this.opt('slotDuration');
-        var snapDuration = this.opt('snapDuration');
-        var snapsPerSlot;
-        var input;
-        slotDuration = createDuration(slotDuration);
-        snapDuration = snapDuration ? createDuration(snapDuration) : slotDuration;
-        snapsPerSlot = wholeDivideDurations(slotDuration, snapDuration);
-        if (snapsPerSlot === null) {
-            snapDuration = slotDuration;
-            snapsPerSlot = 1;
-            // TODO: say warning?
-        }
-        this.slotDuration = slotDuration;
-        this.snapDuration = snapDuration;
-        this.snapsPerSlot = snapsPerSlot;
-        // might be an array value (for TimelineView).
-        // if so, getting the most granular entry (the last one probably).
-        input = this.opt('slotLabelFormat');
-        if (Array.isArray(input)) {
-            input = input[input.length - 1];
-        }
-        this.labelFormat = createFormatter(input || {
-            hour: 'numeric',
-            minute: '2-digit',
-            omitZeroMinute: true,
-            meridiem: 'short'
-        });
-        input = this.opt('slotLabelInterval');
-        this.labelInterval = input ?
-            createDuration(input) :
-            this.computeLabelInterval(slotDuration);
-    };
-    // Computes an automatic value for slotLabelInterval
-    TimeGrid.prototype.computeLabelInterval = function (slotDuration) {
-        var i;
-        var labelInterval;
-        var slotsPerLabel;
-        // find the smallest stock label interval that results in more than one slots-per-label
-        for (i = AGENDA_STOCK_SUB_DURATIONS.length - 1; i >= 0; i--) {
-            labelInterval = createDuration(AGENDA_STOCK_SUB_DURATIONS[i]);
-            slotsPerLabel = wholeDivideDurations(labelInterval, slotDuration);
-            if (slotsPerLabel !== null && slotsPerLabel > 1) {
-                return labelInterval;
-            }
-        }
-        return slotDuration; // fall back
-    };
-    /* Rendering
-    ------------------------------------------------------------------------------------------------------------------*/
-    TimeGrid.prototype.render = function (props) {
-        var cells = props.cells;
-        this.colCnt = cells.length;
-        this.renderSlats(props.dateProfile);
-        this.renderColumns(props.cells, props.dateProfile);
-        this.renderBusinessHours(props.businessHourSegs);
-        this.renderDateSelection(props.dateSelectionSegs);
-        this.renderFgEvents(props.fgEventSegs);
-        this.renderBgEvents(props.bgEventSegs);
-        this.renderEventSelection(props.eventSelection);
-        this.renderEventDrag(props.eventDrag);
-        this.renderEventResize(props.eventResize);
-    };
-    TimeGrid.prototype.destroy = function () {
-        _super.prototype.destroy.call(this);
-        // should unrender everything else too
-        this.renderSlats.unrender();
-        this.renderColumns.unrender();
-    };
-    TimeGrid.prototype.updateSize = function (isResize) {
-        var _a = this, fillRenderer = _a.fillRenderer, eventRenderer = _a.eventRenderer, mirrorRenderer = _a.mirrorRenderer;
-        if (isResize || this.isSlatSizesDirty) {
-            this.buildSlatPositions();
-            this.isSlatSizesDirty = false;
-        }
-        if (isResize || this.isColSizesDirty) {
-            this.buildColPositions();
-            this.isColSizesDirty = false;
-        }
-        fillRenderer.computeSizes(isResize);
-        eventRenderer.computeSizes(isResize);
-        mirrorRenderer.computeSizes(isResize);
-        fillRenderer.assignSizes(isResize);
-        eventRenderer.assignSizes(isResize);
-        mirrorRenderer.assignSizes(isResize);
-    };
-    TimeGrid.prototype._renderSlats = function (dateProfile) {
-        var theme = this.theme;
-        this.slatContainerEl.innerHTML =
-            '<table class="' + theme.getClass('tableGrid') + '">' +
-                this.renderSlatRowHtml(dateProfile) +
-                '</table>';
-        this.slatEls = findElements(this.slatContainerEl, 'tr');
-        this.slatPositions = new PositionCache(this.el, this.slatEls, false, true // vertical
-        );
-        this.isSlatSizesDirty = true;
-    };
-    // Generates the HTML for the horizontal "slats" that run width-wise. Has a time axis on a side. Depends on RTL.
-    TimeGrid.prototype.renderSlatRowHtml = function (dateProfile) {
-        var _a = this, dateEnv = _a.dateEnv, theme = _a.theme, isRtl = _a.isRtl;
-        var html = '';
-        var dayStart = startOfDay(dateProfile.renderRange.start);
-        var slotTime = dateProfile.minTime;
-        var slotIterator = createDuration(0);
-        var slotDate; // will be on the view's first day, but we only care about its time
-        var isLabeled;
-        var axisHtml;
-        // Calculate the time for each slot
-        while (asRoughMs(slotTime) < asRoughMs(dateProfile.maxTime)) {
-            slotDate = dateEnv.add(dayStart, slotTime);
-            isLabeled = wholeDivideDurations(slotIterator, this.labelInterval) !== null;
-            axisHtml =
-                '<td class="fc-axis fc-time ' + theme.getClass('widgetContent') + '">' +
-                    (isLabeled ?
-                        '<span>' + // for matchCellWidths
-                            htmlEscape(dateEnv.format(slotDate, this.labelFormat)) +
-                            '</span>' :
-                        '') +
-                    '</td>';
-            html +=
-                '<tr data-time="' + formatIsoTimeString(slotDate) + '"' +
-                    (isLabeled ? '' : ' class="fc-minor"') +
-                    '>' +
-                    (!isRtl ? axisHtml : '') +
-                    '<td class="' + theme.getClass('widgetContent') + '"></td>' +
-                    (isRtl ? axisHtml : '') +
-                    '</tr>';
-            slotTime = addDurations(slotTime, this.slotDuration);
-            slotIterator = addDurations(slotIterator, this.slotDuration);
-        }
-        return html;
-    };
-    TimeGrid.prototype._renderColumns = function (cells, dateProfile) {
-        var _a = this, theme = _a.theme, dateEnv = _a.dateEnv, view = _a.view;
-        var bgRow = new DayBgRow(this.context);
-        this.rootBgContainerEl.innerHTML =
-            '<table class="' + theme.getClass('tableGrid') + '">' +
-                bgRow.renderHtml({
-                    cells: cells,
-                    dateProfile: dateProfile,
-                    renderIntroHtml: this.renderProps.renderBgIntroHtml
-                }) +
-                '</table>';
-        this.colEls = findElements(this.el, '.fc-day, .fc-disabled-day');
-        for (var col = 0; col < this.colCnt; col++) {
-            this.publiclyTrigger('dayRender', [
-                {
-                    date: dateEnv.toDate(cells[col].date),
-                    el: this.colEls[col],
-                    view: view
-                }
-            ]);
-        }
-        if (this.isRtl) {
-            this.colEls.reverse();
-        }
-        this.colPositions = new PositionCache(this.el, this.colEls, true, // horizontal
-        false);
-        this.renderContentSkeleton();
-        this.isColSizesDirty = true;
-    };
-    TimeGrid.prototype._unrenderColumns = function () {
-        this.unrenderContentSkeleton();
-    };
-    /* Content Skeleton
-    ------------------------------------------------------------------------------------------------------------------*/
-    // Renders the DOM that the view's content will live in
-    TimeGrid.prototype.renderContentSkeleton = function () {
-        var parts = [];
-        var skeletonEl;
-        parts.push(this.renderProps.renderIntroHtml());
-        for (var i = 0; i < this.colCnt; i++) {
-            parts.push('<td>' +
-                '<div class="fc-content-col">' +
-                '<div class="fc-event-container fc-mirror-container"></div>' +
-                '<div class="fc-event-container"></div>' +
-                '<div class="fc-highlight-container"></div>' +
-                '<div class="fc-bgevent-container"></div>' +
-                '<div class="fc-business-container"></div>' +
-                '</div>' +
-                '</td>');
-        }
-        if (this.isRtl) {
-            parts.reverse();
-        }
-        skeletonEl = this.contentSkeletonEl = htmlToElement('<div class="fc-content-skeleton">' +
-            '<table>' +
-            '<tr>' + parts.join('') + '</tr>' +
-            '</table>' +
-            '</div>');
-        this.colContainerEls = findElements(skeletonEl, '.fc-content-col');
-        this.mirrorContainerEls = findElements(skeletonEl, '.fc-mirror-container');
-        this.fgContainerEls = findElements(skeletonEl, '.fc-event-container:not(.fc-mirror-container)');
-        this.bgContainerEls = findElements(skeletonEl, '.fc-bgevent-container');
-        this.highlightContainerEls = findElements(skeletonEl, '.fc-highlight-container');
-        this.businessContainerEls = findElements(skeletonEl, '.fc-business-container');
-        if (this.isRtl) {
-            this.colContainerEls.reverse();
-            this.mirrorContainerEls.reverse();
-            this.fgContainerEls.reverse();
-            this.bgContainerEls.reverse();
-            this.highlightContainerEls.reverse();
-            this.businessContainerEls.reverse();
-        }
-        this.el.appendChild(skeletonEl);
-    };
-    TimeGrid.prototype.unrenderContentSkeleton = function () {
-        removeElement(this.contentSkeletonEl);
-    };
-    // Given a flat array of segments, return an array of sub-arrays, grouped by each segment's col
-    TimeGrid.prototype.groupSegsByCol = function (segs) {
-        var segsByCol = [];
-        var i;
-        for (i = 0; i < this.colCnt; i++) {
-            segsByCol.push([]);
-        }
-        for (i = 0; i < segs.length; i++) {
-            segsByCol[segs[i].col].push(segs[i]);
-        }
-        return segsByCol;
-    };
-    // Given segments grouped by column, insert the segments' elements into a parallel array of container
-    // elements, each living within a column.
-    TimeGrid.prototype.attachSegsByCol = function (segsByCol, containerEls) {
-        var col;
-        var segs;
-        var i;
-        for (col = 0; col < this.colCnt; col++) { // iterate each column grouping
-            segs = segsByCol[col];
-            for (i = 0; i < segs.length; i++) {
-                containerEls[col].appendChild(segs[i].el);
-            }
-        }
-    };
-    /* Now Indicator
-    ------------------------------------------------------------------------------------------------------------------*/
-    TimeGrid.prototype.getNowIndicatorUnit = function () {
-        return 'minute'; // will refresh on the minute
-    };
-    TimeGrid.prototype.renderNowIndicator = function (segs, date) {
-        // HACK: if date columns not ready for some reason (scheduler)
-        if (!this.colContainerEls) {
-            return;
-        }
-        var top = this.computeDateTop(date);
-        var nodes = [];
-        var i;
-        // render lines within the columns
-        for (i = 0; i < segs.length; i++) {
-            var lineEl = createElement('div', { className: 'fc-now-indicator fc-now-indicator-line' });
-            lineEl.style.top = top + 'px';
-            this.colContainerEls[segs[i].col].appendChild(lineEl);
-            nodes.push(lineEl);
-        }
-        // render an arrow over the axis
-        if (segs.length > 0) { // is the current time in view?
-            var arrowEl = createElement('div', { className: 'fc-now-indicator fc-now-indicator-arrow' });
-            arrowEl.style.top = top + 'px';
-            this.contentSkeletonEl.appendChild(arrowEl);
-            nodes.push(arrowEl);
-        }
-        this.nowIndicatorEls = nodes;
-    };
-    TimeGrid.prototype.unrenderNowIndicator = function () {
-        if (this.nowIndicatorEls) {
-            this.nowIndicatorEls.forEach(removeElement);
-            this.nowIndicatorEls = null;
-        }
-    };
-    /* Coordinates
-    ------------------------------------------------------------------------------------------------------------------*/
-    TimeGrid.prototype.getTotalSlatHeight = function () {
-        return this.slatContainerEl.getBoundingClientRect().height;
-    };
-    // Computes the top coordinate, relative to the bounds of the grid, of the given date.
-    // A `startOfDayDate` must be given for avoiding ambiguity over how to treat midnight.
-    TimeGrid.prototype.computeDateTop = function (when, startOfDayDate) {
-        if (!startOfDayDate) {
-            startOfDayDate = startOfDay(when);
-        }
-        return this.computeTimeTop(createDuration(when.valueOf() - startOfDayDate.valueOf()));
-    };
-    // Computes the top coordinate, relative to the bounds of the grid, of the given time (a Duration).
-    TimeGrid.prototype.computeTimeTop = function (duration) {
-        var len = this.slatEls.length;
-        var dateProfile = this.props.dateProfile;
-        var slatCoverage = (duration.milliseconds - asRoughMs(dateProfile.minTime)) / asRoughMs(this.slotDuration); // floating-point value of # of slots covered
-        var slatIndex;
-        var slatRemainder;
-        // compute a floating-point number for how many slats should be progressed through.
-        // from 0 to number of slats (inclusive)
-        // constrained because minTime/maxTime might be customized.
-        slatCoverage = Math.max(0, slatCoverage);
-        slatCoverage = Math.min(len, slatCoverage);
-        // an integer index of the furthest whole slat
-        // from 0 to number slats (*exclusive*, so len-1)
-        slatIndex = Math.floor(slatCoverage);
-        slatIndex = Math.min(slatIndex, len - 1);
-        // how much further through the slatIndex slat (from 0.0-1.0) must be covered in addition.
-        // could be 1.0 if slatCoverage is covering *all* the slots
-        slatRemainder = slatCoverage - slatIndex;
-        return this.slatPositions.tops[slatIndex] +
-            this.slatPositions.getHeight(slatIndex) * slatRemainder;
-    };
-    // For each segment in an array, computes and assigns its top and bottom properties
-    TimeGrid.prototype.computeSegVerticals = function (segs) {
-        var eventMinHeight = this.opt('timeGridEventMinHeight');
-        var i;
-        var seg;
-        var dayDate;
-        for (i = 0; i < segs.length; i++) {
-            seg = segs[i];
-            dayDate = this.props.cells[seg.col].date;
-            seg.top = this.computeDateTop(seg.start, dayDate);
-            seg.bottom = Math.max(seg.top + eventMinHeight, this.computeDateTop(seg.end, dayDate));
-        }
-    };
-    // Given segments that already have their top/bottom properties computed, applies those values to
-    // the segments' elements.
-    TimeGrid.prototype.assignSegVerticals = function (segs) {
-        var i;
-        var seg;
-        for (i = 0; i < segs.length; i++) {
-            seg = segs[i];
-            applyStyle(seg.el, this.generateSegVerticalCss(seg));
-        }
-    };
-    // Generates an object with CSS properties for the top/bottom coordinates of a segment element
-    TimeGrid.prototype.generateSegVerticalCss = function (seg) {
-        return {
-            top: seg.top,
-            bottom: -seg.bottom // flipped because needs to be space beyond bottom edge of event container
-        };
-    };
-    /* Sizing
-    ------------------------------------------------------------------------------------------------------------------*/
-    TimeGrid.prototype.buildPositionCaches = function () {
-        this.buildColPositions();
-        this.buildSlatPositions();
-    };
-    TimeGrid.prototype.buildColPositions = function () {
-        this.colPositions.build();
-    };
-    TimeGrid.prototype.buildSlatPositions = function () {
-        this.slatPositions.build();
-    };
-    /* Hit System
-    ------------------------------------------------------------------------------------------------------------------*/
-    TimeGrid.prototype.positionToHit = function (positionLeft, positionTop) {
-        var _a = this, dateEnv = _a.dateEnv, snapsPerSlot = _a.snapsPerSlot, slatPositions = _a.slatPositions, colPositions = _a.colPositions;
-        var colIndex = colPositions.leftToIndex(positionLeft);
-        var slatIndex = slatPositions.topToIndex(positionTop);
-        if (colIndex != null && slatIndex != null) {
-            var slatTop = slatPositions.tops[slatIndex];
-            var slatHeight = slatPositions.getHeight(slatIndex);
-            var partial = (positionTop - slatTop) / slatHeight; // floating point number between 0 and 1
-            var localSnapIndex = Math.floor(partial * snapsPerSlot); // the snap # relative to start of slat
-            var snapIndex = slatIndex * snapsPerSlot + localSnapIndex;
-            var dayDate = this.props.cells[colIndex].date;
-            var time = addDurations(this.props.dateProfile.minTime, multiplyDuration(this.snapDuration, snapIndex));
-            var start = dateEnv.add(dayDate, time);
-            var end = dateEnv.add(start, this.snapDuration);
-            return {
-                col: colIndex,
-                dateSpan: {
-                    range: { start: start, end: end },
-                    allDay: false
-                },
-                dayEl: this.colEls[colIndex],
-                relativeRect: {
-                    left: colPositions.lefts[colIndex],
-                    right: colPositions.rights[colIndex],
-                    top: slatTop,
-                    bottom: slatTop + slatHeight
-                }
-            };
-        }
-    };
-    /* Event Drag Visualization
-    ------------------------------------------------------------------------------------------------------------------*/
-    TimeGrid.prototype._renderEventDrag = function (state) {
-        if (state) {
-            this.eventRenderer.hideByHash(state.affectedInstances);
-            if (state.isEvent) {
-                this.mirrorRenderer.renderSegs(state.segs, { isDragging: true, sourceSeg: state.sourceSeg });
-            }
-            else {
-                this.fillRenderer.renderSegs('highlight', state.segs);
-            }
-        }
-    };
-    TimeGrid.prototype._unrenderEventDrag = function (state) {
-        if (state) {
-            this.eventRenderer.showByHash(state.affectedInstances);
-            this.mirrorRenderer.unrender(state.segs, { isDragging: true, sourceSeg: state.sourceSeg });
-            this.fillRenderer.unrender('highlight');
-        }
-    };
-    /* Event Resize Visualization
-    ------------------------------------------------------------------------------------------------------------------*/
-    TimeGrid.prototype._renderEventResize = function (state) {
-        if (state) {
-            this.eventRenderer.hideByHash(state.affectedInstances);
-            this.mirrorRenderer.renderSegs(state.segs, { isResizing: true, sourceSeg: state.sourceSeg });
-        }
-    };
-    TimeGrid.prototype._unrenderEventResize = function (state) {
-        if (state) {
-            this.eventRenderer.showByHash(state.affectedInstances);
-            this.mirrorRenderer.unrender(state.segs, { isResizing: true, sourceSeg: state.sourceSeg });
-        }
-    };
-    /* Selection
-    ------------------------------------------------------------------------------------------------------------------*/
-    // Renders a visual indication of a selection. Overrides the default, which was to simply render a highlight.
-    TimeGrid.prototype._renderDateSelection = function (segs) {
-        if (segs) {
-            if (this.opt('selectMirror')) {
-                this.mirrorRenderer.renderSegs(segs, { isSelecting: true });
-            }
-            else {
-                this.fillRenderer.renderSegs('highlight', segs);
-            }
-        }
-    };
-    TimeGrid.prototype._unrenderDateSelection = function (segs) {
-        this.mirrorRenderer.unrender(segs, { isSelecting: true });
-        this.fillRenderer.unrender('highlight');
-    };
-    return TimeGrid;
-}(DateComponent));
-
-var AllDaySplitter = /** @class */ (function (_super) {
-    __extends(AllDaySplitter, _super);
-    function AllDaySplitter() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    AllDaySplitter.prototype.getKeyInfo = function () {
-        return {
-            allDay: {},
-            timed: {}
-        };
-    };
-    AllDaySplitter.prototype.getKeysForDateSpan = function (dateSpan) {
-        if (dateSpan.allDay) {
-            return ['allDay'];
-        }
-        else {
-            return ['timed'];
-        }
-    };
-    AllDaySplitter.prototype.getKeysForEventDef = function (eventDef) {
-        if (!eventDef.allDay) {
-            return ['timed'];
-        }
-        else if (hasBgRendering(eventDef)) {
-            return ['timed', 'allDay'];
-        }
-        else {
-            return ['allDay'];
-        }
-    };
-    return AllDaySplitter;
-}(Splitter));
-
-var TIMEGRID_ALL_DAY_EVENT_LIMIT = 5;
-var WEEK_HEADER_FORMAT = createFormatter({ week: 'short' });
-/* An abstract class for all timegrid-related views. Displays one more columns with time slots running vertically.
-----------------------------------------------------------------------------------------------------------------------*/
-// Is a manager for the TimeGrid subcomponent and possibly the DayGrid subcomponent (if allDaySlot is on).
-// Responsible for managing width/height.
-var TimeGridView = /** @class */ (function (_super) {
-    __extends(TimeGridView, _super);
-    function TimeGridView(context, viewSpec, dateProfileGenerator, parentEl) {
-        var _this = _super.call(this, context, viewSpec, dateProfileGenerator, parentEl) || this;
-        _this.splitter = new AllDaySplitter();
-        /* Header Render Methods
-        ------------------------------------------------------------------------------------------------------------------*/
-        // Generates the HTML that will go before the day-of week header cells
-        _this.renderHeadIntroHtml = function () {
-            var _a = _this, theme = _a.theme, dateEnv = _a.dateEnv;
-            var range = _this.props.dateProfile.renderRange;
-            var dayCnt = diffDays(range.start, range.end);
-            var weekText;
-            if (_this.opt('weekNumbers')) {
-                weekText = dateEnv.format(range.start, WEEK_HEADER_FORMAT);
-                return '' +
-                    '<th class="fc-axis fc-week-number ' + theme.getClass('widgetHeader') + '" ' + _this.axisStyleAttr() + '>' +
-                    buildGotoAnchorHtml(// aside from link, important for matchCellWidths
-                    _this, { date: range.start, type: 'week', forceOff: dayCnt > 1 }, htmlEscape(weekText) // inner HTML
-                    ) +
-                    '</th>';
-            }
-            else {
-                return '<th class="fc-axis ' + theme.getClass('widgetHeader') + '" ' + _this.axisStyleAttr() + '></th>';
-            }
-        };
-        /* Time Grid Render Methods
-        ------------------------------------------------------------------------------------------------------------------*/
-        // Generates the HTML that goes before the bg of the TimeGrid slot area. Long vertical column.
-        _this.renderTimeGridBgIntroHtml = function () {
-            var theme = _this.theme;
-            return '<td class="fc-axis ' + theme.getClass('widgetContent') + '" ' + _this.axisStyleAttr() + '></td>';
-        };
-        // Generates the HTML that goes before all other types of cells.
-        // Affects content-skeleton, mirror-skeleton, highlight-skeleton for both the time-grid and day-grid.
-        _this.renderTimeGridIntroHtml = function () {
-            return '<td class="fc-axis" ' + _this.axisStyleAttr() + '></td>';
-        };
-        /* Day Grid Render Methods
-        ------------------------------------------------------------------------------------------------------------------*/
-        // Generates the HTML that goes before the all-day cells
-        _this.renderDayGridBgIntroHtml = function () {
-            var theme = _this.theme;
-            return '' +
-                '<td class="fc-axis ' + theme.getClass('widgetContent') + '" ' + _this.axisStyleAttr() + '>' +
-                '<span>' + // needed for matchCellWidths
-                getAllDayHtml(_this) +
-                '</span>' +
-                '</td>';
-        };
-        // Generates the HTML that goes before all other types of cells.
-        // Affects content-skeleton, mirror-skeleton, highlight-skeleton for both the time-grid and day-grid.
-        _this.renderDayGridIntroHtml = function () {
-            return '<td class="fc-axis" ' + _this.axisStyleAttr() + '></td>';
-        };
-        _this.el.classList.add('fc-timeGrid-view');
-        _this.el.innerHTML = _this.renderSkeletonHtml();
-        _this.scroller = new ScrollComponent('hidden', // overflow x
-        'auto' // overflow y
-        );
-        var timeGridWrapEl = _this.scroller.el;
-        _this.el.querySelector('.fc-body > tr > td').appendChild(timeGridWrapEl);
-        timeGridWrapEl.classList.add('fc-time-grid-container');
-        var timeGridEl = createElement('div', { className: 'fc-time-grid' });
-        timeGridWrapEl.appendChild(timeGridEl);
-        _this.timeGrid = new TimeGrid(_this.context, timeGridEl, {
-            renderBgIntroHtml: _this.renderTimeGridBgIntroHtml,
-            renderIntroHtml: _this.renderTimeGridIntroHtml
-        });
-        if (_this.opt('allDaySlot')) { // should we display the "all-day" area?
-            _this.dayGrid = new DayGrid(// the all-day subcomponent of this view
-            _this.context, _this.el.querySelector('.fc-day-grid'), {
-                renderNumberIntroHtml: _this.renderDayGridIntroHtml,
-                renderBgIntroHtml: _this.renderDayGridBgIntroHtml,
-                renderIntroHtml: _this.renderDayGridIntroHtml,
-                colWeekNumbersVisible: false,
-                cellWeekNumbersVisible: false
-            });
-            // have the day-grid extend it's coordinate area over the <hr> dividing the two grids
-            var dividerEl = _this.el.querySelector('.fc-divider');
-            _this.dayGrid.bottomCoordPadding = dividerEl.getBoundingClientRect().height;
-        }
-        return _this;
-    }
-    TimeGridView.prototype.destroy = function () {
-        _super.prototype.destroy.call(this);
-        this.timeGrid.destroy();
-        if (this.dayGrid) {
-            this.dayGrid.destroy();
-        }
-        this.scroller.destroy();
-    };
-    /* Rendering
-    ------------------------------------------------------------------------------------------------------------------*/
-    // Builds the HTML skeleton for the view.
-    // The day-grid and time-grid components will render inside containers defined by this HTML.
-    TimeGridView.prototype.renderSkeletonHtml = function () {
-        var theme = this.theme;
-        return '' +
-            '<table class="' + theme.getClass('tableGrid') + '">' +
-            (this.opt('columnHeader') ?
-                '<thead class="fc-head">' +
-                    '<tr>' +
-                    '<td class="fc-head-container ' + theme.getClass('widgetHeader') + '">&nbsp;</td>' +
-                    '</tr>' +
-                    '</thead>' :
-                '') +
-            '<tbody class="fc-body">' +
-            '<tr>' +
-            '<td class="' + theme.getClass('widgetContent') + '">' +
-            (this.opt('allDaySlot') ?
-                '<div class="fc-day-grid"></div>' +
-                    '<hr class="fc-divider ' + theme.getClass('widgetHeader') + '" />' :
-                '') +
-            '</td>' +
-            '</tr>' +
-            '</tbody>' +
-            '</table>';
-    };
-    /* Now Indicator
-    ------------------------------------------------------------------------------------------------------------------*/
-    TimeGridView.prototype.getNowIndicatorUnit = function () {
-        return this.timeGrid.getNowIndicatorUnit();
-    };
-    // subclasses should implement
-    // renderNowIndicator(date: DateMarker) {
-    // }
-    TimeGridView.prototype.unrenderNowIndicator = function () {
-        this.timeGrid.unrenderNowIndicator();
-    };
-    /* Dimensions
-    ------------------------------------------------------------------------------------------------------------------*/
-    TimeGridView.prototype.updateSize = function (isResize, viewHeight, isAuto) {
-        _super.prototype.updateSize.call(this, isResize, viewHeight, isAuto); // will call updateBaseSize. important that executes first
-        this.timeGrid.updateSize(isResize);
-        if (this.dayGrid) {
-            this.dayGrid.updateSize(isResize);
-        }
-    };
-    // Adjusts the vertical dimensions of the view to the specified values
-    TimeGridView.prototype.updateBaseSize = function (isResize, viewHeight, isAuto) {
-        var _this = this;
-        var eventLimit;
-        var scrollerHeight;
-        var scrollbarWidths;
-        // make all axis cells line up
-        this.axisWidth = matchCellWidths(findElements(this.el, '.fc-axis'));
-        // hack to give the view some height prior to timeGrid's columns being rendered
-        // TODO: separate setting height from scroller VS timeGrid.
-        if (!this.timeGrid.colEls) {
-            if (!isAuto) {
-                scrollerHeight = this.computeScrollerHeight(viewHeight);
-                this.scroller.setHeight(scrollerHeight);
-            }
-            return;
-        }
-        // set of fake row elements that must compensate when scroller has scrollbars
-        var noScrollRowEls = findElements(this.el, '.fc-row').filter(function (node) {
-            return !_this.scroller.el.contains(node);
-        });
-        // reset all dimensions back to the original state
-        this.timeGrid.bottomRuleEl.style.display = 'none'; // will be shown later if this <hr> is necessary
-        this.scroller.clear(); // sets height to 'auto' and clears overflow
-        noScrollRowEls.forEach(uncompensateScroll);
-        // limit number of events in the all-day area
-        if (this.dayGrid) {
-            this.dayGrid.removeSegPopover(); // kill the "more" popover if displayed
-            eventLimit = this.opt('eventLimit');
-            if (eventLimit && typeof eventLimit !== 'number') {
-                eventLimit = TIMEGRID_ALL_DAY_EVENT_LIMIT; // make sure "auto" goes to a real number
-            }
-            if (eventLimit) {
-                this.dayGrid.limitRows(eventLimit);
-            }
-        }
-        if (!isAuto) { // should we force dimensions of the scroll container?
-            scrollerHeight = this.computeScrollerHeight(viewHeight);
-            this.scroller.setHeight(scrollerHeight);
-            scrollbarWidths = this.scroller.getScrollbarWidths();
-            if (scrollbarWidths.left || scrollbarWidths.right) { // using scrollbars?
-                // make the all-day and header rows lines up
-                noScrollRowEls.forEach(function (rowEl) {
-                    compensateScroll(rowEl, scrollbarWidths);
-                });
-                // the scrollbar compensation might have changed text flow, which might affect height, so recalculate
-                // and reapply the desired height to the scroller.
-                scrollerHeight = this.computeScrollerHeight(viewHeight);
-                this.scroller.setHeight(scrollerHeight);
-            }
-            // guarantees the same scrollbar widths
-            this.scroller.lockOverflow(scrollbarWidths);
-            // if there's any space below the slats, show the horizontal rule.
-            // this won't cause any new overflow, because lockOverflow already called.
-            if (this.timeGrid.getTotalSlatHeight() < scrollerHeight) {
-                this.timeGrid.bottomRuleEl.style.display = '';
-            }
-        }
-    };
-    // given a desired total height of the view, returns what the height of the scroller should be
-    TimeGridView.prototype.computeScrollerHeight = function (viewHeight) {
-        return viewHeight -
-            subtractInnerElHeight(this.el, this.scroller.el); // everything that's NOT the scroller
-    };
-    /* Scroll
-    ------------------------------------------------------------------------------------------------------------------*/
-    // Computes the initial pre-configured scroll state prior to allowing the user to change it
-    TimeGridView.prototype.computeDateScroll = function (duration) {
-        var top = this.timeGrid.computeTimeTop(duration);
-        // zoom can give weird floating-point values. rather scroll a little bit further
-        top = Math.ceil(top);
-        if (top) {
-            top++; // to overcome top border that slots beyond the first have. looks better
-        }
-        return { top: top };
-    };
-    TimeGridView.prototype.queryDateScroll = function () {
-        return { top: this.scroller.getScrollTop() };
-    };
-    TimeGridView.prototype.applyDateScroll = function (scroll) {
-        if (scroll.top !== undefined) {
-            this.scroller.setScrollTop(scroll.top);
-        }
-    };
-    // Generates an HTML attribute string for setting the width of the axis, if it is known
-    TimeGridView.prototype.axisStyleAttr = function () {
-        if (this.axisWidth != null) {
-            return 'style="width:' + this.axisWidth + 'px"';
-        }
-        return '';
-    };
-    return TimeGridView;
-}(View));
-TimeGridView.prototype.usesMinMaxTime = true; // indicates that minTime/maxTime affects rendering
-
-var SimpleTimeGrid = /** @class */ (function (_super) {
-    __extends(SimpleTimeGrid, _super);
-    function SimpleTimeGrid(context, timeGrid) {
-        var _this = _super.call(this, context, timeGrid.el) || this;
-        _this.buildDayRanges = memoize(buildDayRanges);
-        _this.slicer = new TimeGridSlicer();
-        _this.timeGrid = timeGrid;
-        context.calendar.registerInteractiveComponent(_this, {
-            el: _this.timeGrid.el
-        });
-        return _this;
-    }
-    SimpleTimeGrid.prototype.destroy = function () {
-        _super.prototype.destroy.call(this);
-        this.calendar.unregisterInteractiveComponent(this);
-    };
-    SimpleTimeGrid.prototype.render = function (props) {
-        var dateProfile = props.dateProfile, dayTable = props.dayTable;
-        var dayRanges = this.dayRanges = this.buildDayRanges(dayTable, dateProfile, this.dateEnv);
-        this.timeGrid.receiveProps(__assign({}, this.slicer.sliceProps(props, dateProfile, null, this.timeGrid, dayRanges), { dateProfile: dateProfile, cells: dayTable.cells[0] }));
-    };
-    SimpleTimeGrid.prototype.renderNowIndicator = function (date) {
-        this.timeGrid.renderNowIndicator(this.slicer.sliceNowDate(date, this.timeGrid, this.dayRanges), date);
-    };
-    SimpleTimeGrid.prototype.buildPositionCaches = function () {
-        this.timeGrid.buildPositionCaches();
-    };
-    SimpleTimeGrid.prototype.queryHit = function (positionLeft, positionTop) {
-        var rawHit = this.timeGrid.positionToHit(positionLeft, positionTop);
-        if (rawHit) {
-            return {
-                component: this.timeGrid,
-                dateSpan: rawHit.dateSpan,
-                dayEl: rawHit.dayEl,
-                rect: {
-                    left: rawHit.relativeRect.left,
-                    right: rawHit.relativeRect.right,
-                    top: rawHit.relativeRect.top,
-                    bottom: rawHit.relativeRect.bottom
-                },
-                layer: 0
-            };
-        }
-    };
-    return SimpleTimeGrid;
-}(DateComponent));
-function buildDayRanges(dayTable, dateProfile, dateEnv) {
-    var ranges = [];
-    for (var _i = 0, _a = dayTable.headerDates; _i < _a.length; _i++) {
-        var date = _a[_i];
-        ranges.push({
-            start: dateEnv.add(date, dateProfile.minTime),
-            end: dateEnv.add(date, dateProfile.maxTime)
-        });
-    }
-    return ranges;
-}
-var TimeGridSlicer = /** @class */ (function (_super) {
-    __extends(TimeGridSlicer, _super);
-    function TimeGridSlicer() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    TimeGridSlicer.prototype.sliceRange = function (range, dayRanges) {
-        var segs = [];
-        for (var col = 0; col < dayRanges.length; col++) {
-            var segRange = intersectRanges(range, dayRanges[col]);
-            if (segRange) {
-                segs.push({
-                    start: segRange.start,
-                    end: segRange.end,
-                    isStart: segRange.start.valueOf() === range.start.valueOf(),
-                    isEnd: segRange.end.valueOf() === range.end.valueOf(),
-                    col: col
-                });
-            }
-        }
-        return segs;
-    };
-    return TimeGridSlicer;
-}(Slicer));
-
-var TimeGridView$1 = /** @class */ (function (_super) {
-    __extends(TimeGridView, _super);
-    function TimeGridView(_context, viewSpec, dateProfileGenerator, parentEl) {
-        var _this = _super.call(this, _context, viewSpec, dateProfileGenerator, parentEl) || this;
-        _this.buildDayTable = memoize(buildDayTable);
-        if (_this.opt('columnHeader')) {
-            _this.header = new DayHeader(_this.context, _this.el.querySelector('.fc-head-container'));
-        }
-        _this.simpleTimeGrid = new SimpleTimeGrid(_this.context, _this.timeGrid);
-        if (_this.dayGrid) {
-            _this.simpleDayGrid = new SimpleDayGrid(_this.context, _this.dayGrid);
-        }
-        return _this;
-    }
-    TimeGridView.prototype.destroy = function () {
-        _super.prototype.destroy.call(this);
-        if (this.header) {
-            this.header.destroy();
-        }
-        this.simpleTimeGrid.destroy();
-        if (this.simpleDayGrid) {
-            this.simpleDayGrid.destroy();
-        }
-    };
-    TimeGridView.prototype.render = function (props) {
-        _super.prototype.render.call(this, props); // for flags for updateSize
-        var dateProfile = this.props.dateProfile;
-        var dayTable = this.buildDayTable(dateProfile, this.dateProfileGenerator);
-        var splitProps = this.splitter.splitProps(props);
-        if (this.header) {
-            this.header.receiveProps({
-                dateProfile: dateProfile,
-                dates: dayTable.headerDates,
-                datesRepDistinctDays: true,
-                renderIntroHtml: this.renderHeadIntroHtml
-            });
-        }
-        this.simpleTimeGrid.receiveProps(__assign({}, splitProps['timed'], { dateProfile: dateProfile,
-            dayTable: dayTable }));
-        if (this.simpleDayGrid) {
-            this.simpleDayGrid.receiveProps(__assign({}, splitProps['allDay'], { dateProfile: dateProfile,
-                dayTable: dayTable, nextDayThreshold: this.nextDayThreshold, isRigid: false }));
-        }
-    };
-    TimeGridView.prototype.renderNowIndicator = function (date) {
-        this.simpleTimeGrid.renderNowIndicator(date);
-    };
-    return TimeGridView;
-}(TimeGridView));
-function buildDayTable(dateProfile, dateProfileGenerator) {
-    var daySeries = new DaySeries(dateProfile.renderRange, dateProfileGenerator);
-    return new DayTable(daySeries, false);
-}
-
-var main = createPlugin({
-    defaultView: 'timeGridWeek',
-    views: {
-        timeGrid: {
-            class: TimeGridView$1,
-            allDaySlot: true,
-            slotDuration: '00:30:00',
-            slotEventOverlap: true // a bad name. confused with overlap/constraint system
-        },
-        timeGridDay: {
-            type: 'timeGrid',
-            duration: { days: 1 }
-        },
-        timeGridWeek: {
-            type: 'timeGrid',
-            duration: { weeks: 1 }
-        }
-    }
-});
-
-export default main;
-export { TimeGridView as AbstractTimeGridView, TimeGrid, TimeGridSlicer, TimeGridView$1 as TimeGridView, buildDayRanges, buildDayTable };
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/timegrid/main.js b/AKPlan/static/AKPlan/vendor/fullcalendar/timegrid/main.js
deleted file mode 100644
index 470925e8b839b4800fa3f605055dcc40442e47f8..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/timegrid/main.js
+++ /dev/null
@@ -1,1357 +0,0 @@
-/*!
-FullCalendar Time Grid Plugin v4.3.0
-Docs & License: https://fullcalendar.io/
-(c) 2019 Adam Shaw
-*/
-
-(function (global, factory) {
-    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@fullcalendar/core'), require('@fullcalendar/daygrid')) :
-    typeof define === 'function' && define.amd ? define(['exports', '@fullcalendar/core', '@fullcalendar/daygrid'], factory) :
-    (global = global || self, factory(global.FullCalendarTimeGrid = {}, global.FullCalendar, global.FullCalendarDayGrid));
-}(this, function (exports, core, daygrid) { 'use strict';
-
-    /*! *****************************************************************************
-    Copyright (c) Microsoft Corporation. All rights reserved.
-    Licensed under the Apache License, Version 2.0 (the "License"); you may not use
-    this file except in compliance with the License. You may obtain a copy of the
-    License at http://www.apache.org/licenses/LICENSE-2.0
-
-    THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-    KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
-    WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
-    MERCHANTABLITY OR NON-INFRINGEMENT.
-
-    See the Apache Version 2.0 License for specific language governing permissions
-    and limitations under the License.
-    ***************************************************************************** */
-    /* global Reflect, Promise */
-
-    var extendStatics = function(d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-
-    function __extends(d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    }
-
-    var __assign = function() {
-        __assign = Object.assign || function __assign(t) {
-            for (var s, i = 1, n = arguments.length; i < n; i++) {
-                s = arguments[i];
-                for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
-            }
-            return t;
-        };
-        return __assign.apply(this, arguments);
-    };
-
-    /*
-    Only handles foreground segs.
-    Does not own rendering. Use for low-level util methods by TimeGrid.
-    */
-    var TimeGridEventRenderer = /** @class */ (function (_super) {
-        __extends(TimeGridEventRenderer, _super);
-        function TimeGridEventRenderer(timeGrid) {
-            var _this = _super.call(this, timeGrid.context) || this;
-            _this.timeGrid = timeGrid;
-            _this.fullTimeFormat = core.createFormatter({
-                hour: 'numeric',
-                minute: '2-digit',
-                separator: _this.context.options.defaultRangeSeparator
-            });
-            return _this;
-        }
-        // Given an array of foreground segments, render a DOM element for each, computes position,
-        // and attaches to the column inner-container elements.
-        TimeGridEventRenderer.prototype.attachSegs = function (segs, mirrorInfo) {
-            var segsByCol = this.timeGrid.groupSegsByCol(segs);
-            // order the segs within each column
-            // TODO: have groupSegsByCol do this?
-            for (var col = 0; col < segsByCol.length; col++) {
-                segsByCol[col] = this.sortEventSegs(segsByCol[col]);
-            }
-            this.segsByCol = segsByCol;
-            this.timeGrid.attachSegsByCol(segsByCol, this.timeGrid.fgContainerEls);
-        };
-        TimeGridEventRenderer.prototype.detachSegs = function (segs) {
-            segs.forEach(function (seg) {
-                core.removeElement(seg.el);
-            });
-            this.segsByCol = null;
-        };
-        TimeGridEventRenderer.prototype.computeSegSizes = function (allSegs) {
-            var _a = this, timeGrid = _a.timeGrid, segsByCol = _a.segsByCol;
-            var colCnt = timeGrid.colCnt;
-            timeGrid.computeSegVerticals(allSegs); // horizontals relies on this
-            if (segsByCol) {
-                for (var col = 0; col < colCnt; col++) {
-                    this.computeSegHorizontals(segsByCol[col]); // compute horizontal coordinates, z-index's, and reorder the array
-                }
-            }
-        };
-        TimeGridEventRenderer.prototype.assignSegSizes = function (allSegs) {
-            var _a = this, timeGrid = _a.timeGrid, segsByCol = _a.segsByCol;
-            var colCnt = timeGrid.colCnt;
-            timeGrid.assignSegVerticals(allSegs); // horizontals relies on this
-            if (segsByCol) {
-                for (var col = 0; col < colCnt; col++) {
-                    this.assignSegCss(segsByCol[col]);
-                }
-            }
-        };
-        // Computes a default event time formatting string if `eventTimeFormat` is not explicitly defined
-        TimeGridEventRenderer.prototype.computeEventTimeFormat = function () {
-            return {
-                hour: 'numeric',
-                minute: '2-digit',
-                meridiem: false
-            };
-        };
-        // Computes a default `displayEventEnd` value if one is not expliclty defined
-        TimeGridEventRenderer.prototype.computeDisplayEventEnd = function () {
-            return true;
-        };
-        // Renders the HTML for a single event segment's default rendering
-        TimeGridEventRenderer.prototype.renderSegHtml = function (seg, mirrorInfo) {
-            var view = this.context.view;
-            var eventRange = seg.eventRange;
-            var eventDef = eventRange.def;
-            var eventUi = eventRange.ui;
-            var allDay = eventDef.allDay;
-            var isDraggable = view.computeEventDraggable(eventDef, eventUi);
-            var isResizableFromStart = seg.isStart && view.computeEventStartResizable(eventDef, eventUi);
-            var isResizableFromEnd = seg.isEnd && view.computeEventEndResizable(eventDef, eventUi);
-            var classes = this.getSegClasses(seg, isDraggable, isResizableFromStart || isResizableFromEnd, mirrorInfo);
-            var skinCss = core.cssToStr(this.getSkinCss(eventUi));
-            var timeText;
-            var fullTimeText; // more verbose time text. for the print stylesheet
-            var startTimeText; // just the start time text
-            classes.unshift('fc-time-grid-event');
-            // if the event appears to span more than one day...
-            if (core.isMultiDayRange(eventRange.range)) {
-                // Don't display time text on segments that run entirely through a day.
-                // That would appear as midnight-midnight and would look dumb.
-                // Otherwise, display the time text for the *segment's* times (like 6pm-midnight or midnight-10am)
-                if (seg.isStart || seg.isEnd) {
-                    var unzonedStart = seg.start;
-                    var unzonedEnd = seg.end;
-                    timeText = this._getTimeText(unzonedStart, unzonedEnd, allDay); // TODO: give the timezones
-                    fullTimeText = this._getTimeText(unzonedStart, unzonedEnd, allDay, this.fullTimeFormat);
-                    startTimeText = this._getTimeText(unzonedStart, unzonedEnd, allDay, null, false); // displayEnd=false
-                }
-            }
-            else {
-                // Display the normal time text for the *event's* times
-                timeText = this.getTimeText(eventRange);
-                fullTimeText = this.getTimeText(eventRange, this.fullTimeFormat);
-                startTimeText = this.getTimeText(eventRange, null, false); // displayEnd=false
-            }
-            return '<a class="' + classes.join(' ') + '"' +
-                (eventDef.url ?
-                    ' href="' + core.htmlEscape(eventDef.url) + '"' :
-                    '') +
-                (skinCss ?
-                    ' style="' + skinCss + '"' :
-                    '') +
-                '>' +
-                '<div class="fc-content">' +
-                (timeText ?
-                    '<div class="fc-time"' +
-                        ' data-start="' + core.htmlEscape(startTimeText) + '"' +
-                        ' data-full="' + core.htmlEscape(fullTimeText) + '"' +
-                        '>' +
-                        '<span>' + core.htmlEscape(timeText) + '</span>' +
-                        '</div>' :
-                    '') +
-                (eventDef.title ?
-                    '<div class="fc-title">' +
-                        core.htmlEscape(eventDef.title) +
-                        '</div>' :
-                    '') +
-                '</div>' +
-                /* TODO: write CSS for this
-                (isResizableFromStart ?
-                  '<div class="fc-resizer fc-start-resizer"></div>' :
-                  ''
-                  ) +
-                */
-                (isResizableFromEnd ?
-                    '<div class="fc-resizer fc-end-resizer"></div>' :
-                    '') +
-                '</a>';
-        };
-        // Given an array of segments that are all in the same column, sets the backwardCoord and forwardCoord on each.
-        // Assumed the segs are already ordered.
-        // NOTE: Also reorders the given array by date!
-        TimeGridEventRenderer.prototype.computeSegHorizontals = function (segs) {
-            var levels;
-            var level0;
-            var i;
-            levels = buildSlotSegLevels(segs);
-            computeForwardSlotSegs(levels);
-            if ((level0 = levels[0])) {
-                for (i = 0; i < level0.length; i++) {
-                    computeSlotSegPressures(level0[i]);
-                }
-                for (i = 0; i < level0.length; i++) {
-                    this.computeSegForwardBack(level0[i], 0, 0);
-                }
-            }
-        };
-        // Calculate seg.forwardCoord and seg.backwardCoord for the segment, where both values range
-        // from 0 to 1. If the calendar is left-to-right, the seg.backwardCoord maps to "left" and
-        // seg.forwardCoord maps to "right" (via percentage). Vice-versa if the calendar is right-to-left.
-        //
-        // The segment might be part of a "series", which means consecutive segments with the same pressure
-        // who's width is unknown until an edge has been hit. `seriesBackwardPressure` is the number of
-        // segments behind this one in the current series, and `seriesBackwardCoord` is the starting
-        // coordinate of the first segment in the series.
-        TimeGridEventRenderer.prototype.computeSegForwardBack = function (seg, seriesBackwardPressure, seriesBackwardCoord) {
-            var forwardSegs = seg.forwardSegs;
-            var i;
-            if (seg.forwardCoord === undefined) { // not already computed
-                if (!forwardSegs.length) {
-                    // if there are no forward segments, this segment should butt up against the edge
-                    seg.forwardCoord = 1;
-                }
-                else {
-                    // sort highest pressure first
-                    this.sortForwardSegs(forwardSegs);
-                    // this segment's forwardCoord will be calculated from the backwardCoord of the
-                    // highest-pressure forward segment.
-                    this.computeSegForwardBack(forwardSegs[0], seriesBackwardPressure + 1, seriesBackwardCoord);
-                    seg.forwardCoord = forwardSegs[0].backwardCoord;
-                }
-                // calculate the backwardCoord from the forwardCoord. consider the series
-                seg.backwardCoord = seg.forwardCoord -
-                    (seg.forwardCoord - seriesBackwardCoord) / // available width for series
-                        (seriesBackwardPressure + 1); // # of segments in the series
-                // use this segment's coordinates to computed the coordinates of the less-pressurized
-                // forward segments
-                for (i = 0; i < forwardSegs.length; i++) {
-                    this.computeSegForwardBack(forwardSegs[i], 0, seg.forwardCoord);
-                }
-            }
-        };
-        TimeGridEventRenderer.prototype.sortForwardSegs = function (forwardSegs) {
-            var objs = forwardSegs.map(buildTimeGridSegCompareObj);
-            var specs = [
-                // put higher-pressure first
-                { field: 'forwardPressure', order: -1 },
-                // put segments that are closer to initial edge first (and favor ones with no coords yet)
-                { field: 'backwardCoord', order: 1 }
-            ].concat(this.context.view.eventOrderSpecs);
-            objs.sort(function (obj0, obj1) {
-                return core.compareByFieldSpecs(obj0, obj1, specs);
-            });
-            return objs.map(function (c) {
-                return c._seg;
-            });
-        };
-        // Given foreground event segments that have already had their position coordinates computed,
-        // assigns position-related CSS values to their elements.
-        TimeGridEventRenderer.prototype.assignSegCss = function (segs) {
-            for (var _i = 0, segs_1 = segs; _i < segs_1.length; _i++) {
-                var seg = segs_1[_i];
-                core.applyStyle(seg.el, this.generateSegCss(seg));
-                if (seg.level > 0) {
-                    seg.el.classList.add('fc-time-grid-event-inset');
-                }
-                // if the event is short that the title will be cut off,
-                // attach a className that condenses the title into the time area.
-                if (seg.eventRange.def.title && seg.bottom - seg.top < 30) {
-                    seg.el.classList.add('fc-short'); // TODO: "condensed" is a better name
-                }
-            }
-        };
-        // Generates an object with CSS properties/values that should be applied to an event segment element.
-        // Contains important positioning-related properties that should be applied to any event element, customized or not.
-        TimeGridEventRenderer.prototype.generateSegCss = function (seg) {
-            var shouldOverlap = this.context.options.slotEventOverlap;
-            var backwardCoord = seg.backwardCoord; // the left side if LTR. the right side if RTL. floating-point
-            var forwardCoord = seg.forwardCoord; // the right side if LTR. the left side if RTL. floating-point
-            var props = this.timeGrid.generateSegVerticalCss(seg); // get top/bottom first
-            var isRtl = this.timeGrid.isRtl;
-            var left; // amount of space from left edge, a fraction of the total width
-            var right; // amount of space from right edge, a fraction of the total width
-            if (shouldOverlap) {
-                // double the width, but don't go beyond the maximum forward coordinate (1.0)
-                forwardCoord = Math.min(1, backwardCoord + (forwardCoord - backwardCoord) * 2);
-            }
-            if (isRtl) {
-                left = 1 - forwardCoord;
-                right = backwardCoord;
-            }
-            else {
-                left = backwardCoord;
-                right = 1 - forwardCoord;
-            }
-            props.zIndex = seg.level + 1; // convert from 0-base to 1-based
-            props.left = left * 100 + '%';
-            props.right = right * 100 + '%';
-            if (shouldOverlap && seg.forwardPressure) {
-                // add padding to the edge so that forward stacked events don't cover the resizer's icon
-                props[isRtl ? 'marginLeft' : 'marginRight'] = 10 * 2; // 10 is a guesstimate of the icon's width
-            }
-            return props;
-        };
-        return TimeGridEventRenderer;
-    }(core.FgEventRenderer));
-    // Builds an array of segments "levels". The first level will be the leftmost tier of segments if the calendar is
-    // left-to-right, or the rightmost if the calendar is right-to-left. Assumes the segments are already ordered by date.
-    function buildSlotSegLevels(segs) {
-        var levels = [];
-        var i;
-        var seg;
-        var j;
-        for (i = 0; i < segs.length; i++) {
-            seg = segs[i];
-            // go through all the levels and stop on the first level where there are no collisions
-            for (j = 0; j < levels.length; j++) {
-                if (!computeSlotSegCollisions(seg, levels[j]).length) {
-                    break;
-                }
-            }
-            seg.level = j;
-            (levels[j] || (levels[j] = [])).push(seg);
-        }
-        return levels;
-    }
-    // For every segment, figure out the other segments that are in subsequent
-    // levels that also occupy the same vertical space. Accumulate in seg.forwardSegs
-    function computeForwardSlotSegs(levels) {
-        var i;
-        var level;
-        var j;
-        var seg;
-        var k;
-        for (i = 0; i < levels.length; i++) {
-            level = levels[i];
-            for (j = 0; j < level.length; j++) {
-                seg = level[j];
-                seg.forwardSegs = [];
-                for (k = i + 1; k < levels.length; k++) {
-                    computeSlotSegCollisions(seg, levels[k], seg.forwardSegs);
-                }
-            }
-        }
-    }
-    // Figure out which path forward (via seg.forwardSegs) results in the longest path until
-    // the furthest edge is reached. The number of segments in this path will be seg.forwardPressure
-    function computeSlotSegPressures(seg) {
-        var forwardSegs = seg.forwardSegs;
-        var forwardPressure = 0;
-        var i;
-        var forwardSeg;
-        if (seg.forwardPressure === undefined) { // not already computed
-            for (i = 0; i < forwardSegs.length; i++) {
-                forwardSeg = forwardSegs[i];
-                // figure out the child's maximum forward path
-                computeSlotSegPressures(forwardSeg);
-                // either use the existing maximum, or use the child's forward pressure
-                // plus one (for the forwardSeg itself)
-                forwardPressure = Math.max(forwardPressure, 1 + forwardSeg.forwardPressure);
-            }
-            seg.forwardPressure = forwardPressure;
-        }
-    }
-    // Find all the segments in `otherSegs` that vertically collide with `seg`.
-    // Append into an optionally-supplied `results` array and return.
-    function computeSlotSegCollisions(seg, otherSegs, results) {
-        if (results === void 0) { results = []; }
-        for (var i = 0; i < otherSegs.length; i++) {
-            if (isSlotSegCollision(seg, otherSegs[i])) {
-                results.push(otherSegs[i]);
-            }
-        }
-        return results;
-    }
-    // Do these segments occupy the same vertical space?
-    function isSlotSegCollision(seg1, seg2) {
-        return seg1.bottom > seg2.top && seg1.top < seg2.bottom;
-    }
-    function buildTimeGridSegCompareObj(seg) {
-        var obj = core.buildSegCompareObj(seg);
-        obj.forwardPressure = seg.forwardPressure;
-        obj.backwardCoord = seg.backwardCoord;
-        return obj;
-    }
-
-    var TimeGridMirrorRenderer = /** @class */ (function (_super) {
-        __extends(TimeGridMirrorRenderer, _super);
-        function TimeGridMirrorRenderer() {
-            return _super !== null && _super.apply(this, arguments) || this;
-        }
-        TimeGridMirrorRenderer.prototype.attachSegs = function (segs, mirrorInfo) {
-            this.segsByCol = this.timeGrid.groupSegsByCol(segs);
-            this.timeGrid.attachSegsByCol(this.segsByCol, this.timeGrid.mirrorContainerEls);
-            this.sourceSeg = mirrorInfo.sourceSeg;
-        };
-        TimeGridMirrorRenderer.prototype.generateSegCss = function (seg) {
-            var props = _super.prototype.generateSegCss.call(this, seg);
-            var sourceSeg = this.sourceSeg;
-            if (sourceSeg && sourceSeg.col === seg.col) {
-                var sourceSegProps = _super.prototype.generateSegCss.call(this, sourceSeg);
-                props.left = sourceSegProps.left;
-                props.right = sourceSegProps.right;
-                props.marginLeft = sourceSegProps.marginLeft;
-                props.marginRight = sourceSegProps.marginRight;
-            }
-            return props;
-        };
-        return TimeGridMirrorRenderer;
-    }(TimeGridEventRenderer));
-
-    var TimeGridFillRenderer = /** @class */ (function (_super) {
-        __extends(TimeGridFillRenderer, _super);
-        function TimeGridFillRenderer(timeGrid) {
-            var _this = _super.call(this, timeGrid.context) || this;
-            _this.timeGrid = timeGrid;
-            return _this;
-        }
-        TimeGridFillRenderer.prototype.attachSegs = function (type, segs) {
-            var timeGrid = this.timeGrid;
-            var containerEls;
-            // TODO: more efficient lookup
-            if (type === 'bgEvent') {
-                containerEls = timeGrid.bgContainerEls;
-            }
-            else if (type === 'businessHours') {
-                containerEls = timeGrid.businessContainerEls;
-            }
-            else if (type === 'highlight') {
-                containerEls = timeGrid.highlightContainerEls;
-            }
-            timeGrid.attachSegsByCol(timeGrid.groupSegsByCol(segs), containerEls);
-            return segs.map(function (seg) {
-                return seg.el;
-            });
-        };
-        TimeGridFillRenderer.prototype.computeSegSizes = function (segs) {
-            this.timeGrid.computeSegVerticals(segs);
-        };
-        TimeGridFillRenderer.prototype.assignSegSizes = function (segs) {
-            this.timeGrid.assignSegVerticals(segs);
-        };
-        return TimeGridFillRenderer;
-    }(core.FillRenderer));
-
-    /* A component that renders one or more columns of vertical time slots
-    ----------------------------------------------------------------------------------------------------------------------*/
-    // potential nice values for the slot-duration and interval-duration
-    // from largest to smallest
-    var AGENDA_STOCK_SUB_DURATIONS = [
-        { hours: 1 },
-        { minutes: 30 },
-        { minutes: 15 },
-        { seconds: 30 },
-        { seconds: 15 }
-    ];
-    var TimeGrid = /** @class */ (function (_super) {
-        __extends(TimeGrid, _super);
-        function TimeGrid(context, el, renderProps) {
-            var _this = _super.call(this, context, el) || this;
-            _this.isSlatSizesDirty = false;
-            _this.isColSizesDirty = false;
-            _this.renderSlats = core.memoizeRendering(_this._renderSlats);
-            var eventRenderer = _this.eventRenderer = new TimeGridEventRenderer(_this);
-            var fillRenderer = _this.fillRenderer = new TimeGridFillRenderer(_this);
-            _this.mirrorRenderer = new TimeGridMirrorRenderer(_this);
-            var renderColumns = _this.renderColumns = core.memoizeRendering(_this._renderColumns, _this._unrenderColumns);
-            _this.renderBusinessHours = core.memoizeRendering(fillRenderer.renderSegs.bind(fillRenderer, 'businessHours'), fillRenderer.unrender.bind(fillRenderer, 'businessHours'), [renderColumns]);
-            _this.renderDateSelection = core.memoizeRendering(_this._renderDateSelection, _this._unrenderDateSelection, [renderColumns]);
-            _this.renderFgEvents = core.memoizeRendering(eventRenderer.renderSegs.bind(eventRenderer), eventRenderer.unrender.bind(eventRenderer), [renderColumns]);
-            _this.renderBgEvents = core.memoizeRendering(fillRenderer.renderSegs.bind(fillRenderer, 'bgEvent'), fillRenderer.unrender.bind(fillRenderer, 'bgEvent'), [renderColumns]);
-            _this.renderEventSelection = core.memoizeRendering(eventRenderer.selectByInstanceId.bind(eventRenderer), eventRenderer.unselectByInstanceId.bind(eventRenderer), [_this.renderFgEvents]);
-            _this.renderEventDrag = core.memoizeRendering(_this._renderEventDrag, _this._unrenderEventDrag, [renderColumns]);
-            _this.renderEventResize = core.memoizeRendering(_this._renderEventResize, _this._unrenderEventResize, [renderColumns]);
-            _this.processOptions();
-            el.innerHTML =
-                '<div class="fc-bg"></div>' +
-                    '<div class="fc-slats"></div>' +
-                    '<hr class="fc-divider ' + _this.theme.getClass('widgetHeader') + '" style="display:none" />';
-            _this.rootBgContainerEl = el.querySelector('.fc-bg');
-            _this.slatContainerEl = el.querySelector('.fc-slats');
-            _this.bottomRuleEl = el.querySelector('.fc-divider');
-            _this.renderProps = renderProps;
-            return _this;
-        }
-        /* Options
-        ------------------------------------------------------------------------------------------------------------------*/
-        // Parses various options into properties of this object
-        TimeGrid.prototype.processOptions = function () {
-            var slotDuration = this.opt('slotDuration');
-            var snapDuration = this.opt('snapDuration');
-            var snapsPerSlot;
-            var input;
-            slotDuration = core.createDuration(slotDuration);
-            snapDuration = snapDuration ? core.createDuration(snapDuration) : slotDuration;
-            snapsPerSlot = core.wholeDivideDurations(slotDuration, snapDuration);
-            if (snapsPerSlot === null) {
-                snapDuration = slotDuration;
-                snapsPerSlot = 1;
-                // TODO: say warning?
-            }
-            this.slotDuration = slotDuration;
-            this.snapDuration = snapDuration;
-            this.snapsPerSlot = snapsPerSlot;
-            // might be an array value (for TimelineView).
-            // if so, getting the most granular entry (the last one probably).
-            input = this.opt('slotLabelFormat');
-            if (Array.isArray(input)) {
-                input = input[input.length - 1];
-            }
-            this.labelFormat = core.createFormatter(input || {
-                hour: 'numeric',
-                minute: '2-digit',
-                omitZeroMinute: true,
-                meridiem: 'short'
-            });
-            input = this.opt('slotLabelInterval');
-            this.labelInterval = input ?
-                core.createDuration(input) :
-                this.computeLabelInterval(slotDuration);
-        };
-        // Computes an automatic value for slotLabelInterval
-        TimeGrid.prototype.computeLabelInterval = function (slotDuration) {
-            var i;
-            var labelInterval;
-            var slotsPerLabel;
-            // find the smallest stock label interval that results in more than one slots-per-label
-            for (i = AGENDA_STOCK_SUB_DURATIONS.length - 1; i >= 0; i--) {
-                labelInterval = core.createDuration(AGENDA_STOCK_SUB_DURATIONS[i]);
-                slotsPerLabel = core.wholeDivideDurations(labelInterval, slotDuration);
-                if (slotsPerLabel !== null && slotsPerLabel > 1) {
-                    return labelInterval;
-                }
-            }
-            return slotDuration; // fall back
-        };
-        /* Rendering
-        ------------------------------------------------------------------------------------------------------------------*/
-        TimeGrid.prototype.render = function (props) {
-            var cells = props.cells;
-            this.colCnt = cells.length;
-            this.renderSlats(props.dateProfile);
-            this.renderColumns(props.cells, props.dateProfile);
-            this.renderBusinessHours(props.businessHourSegs);
-            this.renderDateSelection(props.dateSelectionSegs);
-            this.renderFgEvents(props.fgEventSegs);
-            this.renderBgEvents(props.bgEventSegs);
-            this.renderEventSelection(props.eventSelection);
-            this.renderEventDrag(props.eventDrag);
-            this.renderEventResize(props.eventResize);
-        };
-        TimeGrid.prototype.destroy = function () {
-            _super.prototype.destroy.call(this);
-            // should unrender everything else too
-            this.renderSlats.unrender();
-            this.renderColumns.unrender();
-        };
-        TimeGrid.prototype.updateSize = function (isResize) {
-            var _a = this, fillRenderer = _a.fillRenderer, eventRenderer = _a.eventRenderer, mirrorRenderer = _a.mirrorRenderer;
-            if (isResize || this.isSlatSizesDirty) {
-                this.buildSlatPositions();
-                this.isSlatSizesDirty = false;
-            }
-            if (isResize || this.isColSizesDirty) {
-                this.buildColPositions();
-                this.isColSizesDirty = false;
-            }
-            fillRenderer.computeSizes(isResize);
-            eventRenderer.computeSizes(isResize);
-            mirrorRenderer.computeSizes(isResize);
-            fillRenderer.assignSizes(isResize);
-            eventRenderer.assignSizes(isResize);
-            mirrorRenderer.assignSizes(isResize);
-        };
-        TimeGrid.prototype._renderSlats = function (dateProfile) {
-            var theme = this.theme;
-            this.slatContainerEl.innerHTML =
-                '<table class="' + theme.getClass('tableGrid') + '">' +
-                    this.renderSlatRowHtml(dateProfile) +
-                    '</table>';
-            this.slatEls = core.findElements(this.slatContainerEl, 'tr');
-            this.slatPositions = new core.PositionCache(this.el, this.slatEls, false, true // vertical
-            );
-            this.isSlatSizesDirty = true;
-        };
-        // Generates the HTML for the horizontal "slats" that run width-wise. Has a time axis on a side. Depends on RTL.
-        TimeGrid.prototype.renderSlatRowHtml = function (dateProfile) {
-            var _a = this, dateEnv = _a.dateEnv, theme = _a.theme, isRtl = _a.isRtl;
-            var html = '';
-            var dayStart = core.startOfDay(dateProfile.renderRange.start);
-            var slotTime = dateProfile.minTime;
-            var slotIterator = core.createDuration(0);
-            var slotDate; // will be on the view's first day, but we only care about its time
-            var isLabeled;
-            var axisHtml;
-            // Calculate the time for each slot
-            while (core.asRoughMs(slotTime) < core.asRoughMs(dateProfile.maxTime)) {
-                slotDate = dateEnv.add(dayStart, slotTime);
-                isLabeled = core.wholeDivideDurations(slotIterator, this.labelInterval) !== null;
-                axisHtml =
-                    '<td class="fc-axis fc-time ' + theme.getClass('widgetContent') + '">' +
-                        (isLabeled ?
-                            '<span>' + // for matchCellWidths
-                                core.htmlEscape(dateEnv.format(slotDate, this.labelFormat)) +
-                                '</span>' :
-                            '') +
-                        '</td>';
-                html +=
-                    '<tr data-time="' + core.formatIsoTimeString(slotDate) + '"' +
-                        (isLabeled ? '' : ' class="fc-minor"') +
-                        '>' +
-                        (!isRtl ? axisHtml : '') +
-                        '<td class="' + theme.getClass('widgetContent') + '"></td>' +
-                        (isRtl ? axisHtml : '') +
-                        '</tr>';
-                slotTime = core.addDurations(slotTime, this.slotDuration);
-                slotIterator = core.addDurations(slotIterator, this.slotDuration);
-            }
-            return html;
-        };
-        TimeGrid.prototype._renderColumns = function (cells, dateProfile) {
-            var _a = this, theme = _a.theme, dateEnv = _a.dateEnv, view = _a.view;
-            var bgRow = new daygrid.DayBgRow(this.context);
-            this.rootBgContainerEl.innerHTML =
-                '<table class="' + theme.getClass('tableGrid') + '">' +
-                    bgRow.renderHtml({
-                        cells: cells,
-                        dateProfile: dateProfile,
-                        renderIntroHtml: this.renderProps.renderBgIntroHtml
-                    }) +
-                    '</table>';
-            this.colEls = core.findElements(this.el, '.fc-day, .fc-disabled-day');
-            for (var col = 0; col < this.colCnt; col++) {
-                this.publiclyTrigger('dayRender', [
-                    {
-                        date: dateEnv.toDate(cells[col].date),
-                        el: this.colEls[col],
-                        view: view
-                    }
-                ]);
-            }
-            if (this.isRtl) {
-                this.colEls.reverse();
-            }
-            this.colPositions = new core.PositionCache(this.el, this.colEls, true, // horizontal
-            false);
-            this.renderContentSkeleton();
-            this.isColSizesDirty = true;
-        };
-        TimeGrid.prototype._unrenderColumns = function () {
-            this.unrenderContentSkeleton();
-        };
-        /* Content Skeleton
-        ------------------------------------------------------------------------------------------------------------------*/
-        // Renders the DOM that the view's content will live in
-        TimeGrid.prototype.renderContentSkeleton = function () {
-            var parts = [];
-            var skeletonEl;
-            parts.push(this.renderProps.renderIntroHtml());
-            for (var i = 0; i < this.colCnt; i++) {
-                parts.push('<td>' +
-                    '<div class="fc-content-col">' +
-                    '<div class="fc-event-container fc-mirror-container"></div>' +
-                    '<div class="fc-event-container"></div>' +
-                    '<div class="fc-highlight-container"></div>' +
-                    '<div class="fc-bgevent-container"></div>' +
-                    '<div class="fc-business-container"></div>' +
-                    '</div>' +
-                    '</td>');
-            }
-            if (this.isRtl) {
-                parts.reverse();
-            }
-            skeletonEl = this.contentSkeletonEl = core.htmlToElement('<div class="fc-content-skeleton">' +
-                '<table>' +
-                '<tr>' + parts.join('') + '</tr>' +
-                '</table>' +
-                '</div>');
-            this.colContainerEls = core.findElements(skeletonEl, '.fc-content-col');
-            this.mirrorContainerEls = core.findElements(skeletonEl, '.fc-mirror-container');
-            this.fgContainerEls = core.findElements(skeletonEl, '.fc-event-container:not(.fc-mirror-container)');
-            this.bgContainerEls = core.findElements(skeletonEl, '.fc-bgevent-container');
-            this.highlightContainerEls = core.findElements(skeletonEl, '.fc-highlight-container');
-            this.businessContainerEls = core.findElements(skeletonEl, '.fc-business-container');
-            if (this.isRtl) {
-                this.colContainerEls.reverse();
-                this.mirrorContainerEls.reverse();
-                this.fgContainerEls.reverse();
-                this.bgContainerEls.reverse();
-                this.highlightContainerEls.reverse();
-                this.businessContainerEls.reverse();
-            }
-            this.el.appendChild(skeletonEl);
-        };
-        TimeGrid.prototype.unrenderContentSkeleton = function () {
-            core.removeElement(this.contentSkeletonEl);
-        };
-        // Given a flat array of segments, return an array of sub-arrays, grouped by each segment's col
-        TimeGrid.prototype.groupSegsByCol = function (segs) {
-            var segsByCol = [];
-            var i;
-            for (i = 0; i < this.colCnt; i++) {
-                segsByCol.push([]);
-            }
-            for (i = 0; i < segs.length; i++) {
-                segsByCol[segs[i].col].push(segs[i]);
-            }
-            return segsByCol;
-        };
-        // Given segments grouped by column, insert the segments' elements into a parallel array of container
-        // elements, each living within a column.
-        TimeGrid.prototype.attachSegsByCol = function (segsByCol, containerEls) {
-            var col;
-            var segs;
-            var i;
-            for (col = 0; col < this.colCnt; col++) { // iterate each column grouping
-                segs = segsByCol[col];
-                for (i = 0; i < segs.length; i++) {
-                    containerEls[col].appendChild(segs[i].el);
-                }
-            }
-        };
-        /* Now Indicator
-        ------------------------------------------------------------------------------------------------------------------*/
-        TimeGrid.prototype.getNowIndicatorUnit = function () {
-            return 'minute'; // will refresh on the minute
-        };
-        TimeGrid.prototype.renderNowIndicator = function (segs, date) {
-            // HACK: if date columns not ready for some reason (scheduler)
-            if (!this.colContainerEls) {
-                return;
-            }
-            var top = this.computeDateTop(date);
-            var nodes = [];
-            var i;
-            // render lines within the columns
-            for (i = 0; i < segs.length; i++) {
-                var lineEl = core.createElement('div', { className: 'fc-now-indicator fc-now-indicator-line' });
-                lineEl.style.top = top + 'px';
-                this.colContainerEls[segs[i].col].appendChild(lineEl);
-                nodes.push(lineEl);
-            }
-            // render an arrow over the axis
-            if (segs.length > 0) { // is the current time in view?
-                var arrowEl = core.createElement('div', { className: 'fc-now-indicator fc-now-indicator-arrow' });
-                arrowEl.style.top = top + 'px';
-                this.contentSkeletonEl.appendChild(arrowEl);
-                nodes.push(arrowEl);
-            }
-            this.nowIndicatorEls = nodes;
-        };
-        TimeGrid.prototype.unrenderNowIndicator = function () {
-            if (this.nowIndicatorEls) {
-                this.nowIndicatorEls.forEach(core.removeElement);
-                this.nowIndicatorEls = null;
-            }
-        };
-        /* Coordinates
-        ------------------------------------------------------------------------------------------------------------------*/
-        TimeGrid.prototype.getTotalSlatHeight = function () {
-            return this.slatContainerEl.getBoundingClientRect().height;
-        };
-        // Computes the top coordinate, relative to the bounds of the grid, of the given date.
-        // A `startOfDayDate` must be given for avoiding ambiguity over how to treat midnight.
-        TimeGrid.prototype.computeDateTop = function (when, startOfDayDate) {
-            if (!startOfDayDate) {
-                startOfDayDate = core.startOfDay(when);
-            }
-            return this.computeTimeTop(core.createDuration(when.valueOf() - startOfDayDate.valueOf()));
-        };
-        // Computes the top coordinate, relative to the bounds of the grid, of the given time (a Duration).
-        TimeGrid.prototype.computeTimeTop = function (duration) {
-            var len = this.slatEls.length;
-            var dateProfile = this.props.dateProfile;
-            var slatCoverage = (duration.milliseconds - core.asRoughMs(dateProfile.minTime)) / core.asRoughMs(this.slotDuration); // floating-point value of # of slots covered
-            var slatIndex;
-            var slatRemainder;
-            // compute a floating-point number for how many slats should be progressed through.
-            // from 0 to number of slats (inclusive)
-            // constrained because minTime/maxTime might be customized.
-            slatCoverage = Math.max(0, slatCoverage);
-            slatCoverage = Math.min(len, slatCoverage);
-            // an integer index of the furthest whole slat
-            // from 0 to number slats (*exclusive*, so len-1)
-            slatIndex = Math.floor(slatCoverage);
-            slatIndex = Math.min(slatIndex, len - 1);
-            // how much further through the slatIndex slat (from 0.0-1.0) must be covered in addition.
-            // could be 1.0 if slatCoverage is covering *all* the slots
-            slatRemainder = slatCoverage - slatIndex;
-            return this.slatPositions.tops[slatIndex] +
-                this.slatPositions.getHeight(slatIndex) * slatRemainder;
-        };
-        // For each segment in an array, computes and assigns its top and bottom properties
-        TimeGrid.prototype.computeSegVerticals = function (segs) {
-            var eventMinHeight = this.opt('timeGridEventMinHeight');
-            var i;
-            var seg;
-            var dayDate;
-            for (i = 0; i < segs.length; i++) {
-                seg = segs[i];
-                dayDate = this.props.cells[seg.col].date;
-                seg.top = this.computeDateTop(seg.start, dayDate);
-                seg.bottom = Math.max(seg.top + eventMinHeight, this.computeDateTop(seg.end, dayDate));
-            }
-        };
-        // Given segments that already have their top/bottom properties computed, applies those values to
-        // the segments' elements.
-        TimeGrid.prototype.assignSegVerticals = function (segs) {
-            var i;
-            var seg;
-            for (i = 0; i < segs.length; i++) {
-                seg = segs[i];
-                core.applyStyle(seg.el, this.generateSegVerticalCss(seg));
-            }
-        };
-        // Generates an object with CSS properties for the top/bottom coordinates of a segment element
-        TimeGrid.prototype.generateSegVerticalCss = function (seg) {
-            return {
-                top: seg.top,
-                bottom: -seg.bottom // flipped because needs to be space beyond bottom edge of event container
-            };
-        };
-        /* Sizing
-        ------------------------------------------------------------------------------------------------------------------*/
-        TimeGrid.prototype.buildPositionCaches = function () {
-            this.buildColPositions();
-            this.buildSlatPositions();
-        };
-        TimeGrid.prototype.buildColPositions = function () {
-            this.colPositions.build();
-        };
-        TimeGrid.prototype.buildSlatPositions = function () {
-            this.slatPositions.build();
-        };
-        /* Hit System
-        ------------------------------------------------------------------------------------------------------------------*/
-        TimeGrid.prototype.positionToHit = function (positionLeft, positionTop) {
-            var _a = this, dateEnv = _a.dateEnv, snapsPerSlot = _a.snapsPerSlot, slatPositions = _a.slatPositions, colPositions = _a.colPositions;
-            var colIndex = colPositions.leftToIndex(positionLeft);
-            var slatIndex = slatPositions.topToIndex(positionTop);
-            if (colIndex != null && slatIndex != null) {
-                var slatTop = slatPositions.tops[slatIndex];
-                var slatHeight = slatPositions.getHeight(slatIndex);
-                var partial = (positionTop - slatTop) / slatHeight; // floating point number between 0 and 1
-                var localSnapIndex = Math.floor(partial * snapsPerSlot); // the snap # relative to start of slat
-                var snapIndex = slatIndex * snapsPerSlot + localSnapIndex;
-                var dayDate = this.props.cells[colIndex].date;
-                var time = core.addDurations(this.props.dateProfile.minTime, core.multiplyDuration(this.snapDuration, snapIndex));
-                var start = dateEnv.add(dayDate, time);
-                var end = dateEnv.add(start, this.snapDuration);
-                return {
-                    col: colIndex,
-                    dateSpan: {
-                        range: { start: start, end: end },
-                        allDay: false
-                    },
-                    dayEl: this.colEls[colIndex],
-                    relativeRect: {
-                        left: colPositions.lefts[colIndex],
-                        right: colPositions.rights[colIndex],
-                        top: slatTop,
-                        bottom: slatTop + slatHeight
-                    }
-                };
-            }
-        };
-        /* Event Drag Visualization
-        ------------------------------------------------------------------------------------------------------------------*/
-        TimeGrid.prototype._renderEventDrag = function (state) {
-            if (state) {
-                this.eventRenderer.hideByHash(state.affectedInstances);
-                if (state.isEvent) {
-                    this.mirrorRenderer.renderSegs(state.segs, { isDragging: true, sourceSeg: state.sourceSeg });
-                }
-                else {
-                    this.fillRenderer.renderSegs('highlight', state.segs);
-                }
-            }
-        };
-        TimeGrid.prototype._unrenderEventDrag = function (state) {
-            if (state) {
-                this.eventRenderer.showByHash(state.affectedInstances);
-                this.mirrorRenderer.unrender(state.segs, { isDragging: true, sourceSeg: state.sourceSeg });
-                this.fillRenderer.unrender('highlight');
-            }
-        };
-        /* Event Resize Visualization
-        ------------------------------------------------------------------------------------------------------------------*/
-        TimeGrid.prototype._renderEventResize = function (state) {
-            if (state) {
-                this.eventRenderer.hideByHash(state.affectedInstances);
-                this.mirrorRenderer.renderSegs(state.segs, { isResizing: true, sourceSeg: state.sourceSeg });
-            }
-        };
-        TimeGrid.prototype._unrenderEventResize = function (state) {
-            if (state) {
-                this.eventRenderer.showByHash(state.affectedInstances);
-                this.mirrorRenderer.unrender(state.segs, { isResizing: true, sourceSeg: state.sourceSeg });
-            }
-        };
-        /* Selection
-        ------------------------------------------------------------------------------------------------------------------*/
-        // Renders a visual indication of a selection. Overrides the default, which was to simply render a highlight.
-        TimeGrid.prototype._renderDateSelection = function (segs) {
-            if (segs) {
-                if (this.opt('selectMirror')) {
-                    this.mirrorRenderer.renderSegs(segs, { isSelecting: true });
-                }
-                else {
-                    this.fillRenderer.renderSegs('highlight', segs);
-                }
-            }
-        };
-        TimeGrid.prototype._unrenderDateSelection = function (segs) {
-            this.mirrorRenderer.unrender(segs, { isSelecting: true });
-            this.fillRenderer.unrender('highlight');
-        };
-        return TimeGrid;
-    }(core.DateComponent));
-
-    var AllDaySplitter = /** @class */ (function (_super) {
-        __extends(AllDaySplitter, _super);
-        function AllDaySplitter() {
-            return _super !== null && _super.apply(this, arguments) || this;
-        }
-        AllDaySplitter.prototype.getKeyInfo = function () {
-            return {
-                allDay: {},
-                timed: {}
-            };
-        };
-        AllDaySplitter.prototype.getKeysForDateSpan = function (dateSpan) {
-            if (dateSpan.allDay) {
-                return ['allDay'];
-            }
-            else {
-                return ['timed'];
-            }
-        };
-        AllDaySplitter.prototype.getKeysForEventDef = function (eventDef) {
-            if (!eventDef.allDay) {
-                return ['timed'];
-            }
-            else if (core.hasBgRendering(eventDef)) {
-                return ['timed', 'allDay'];
-            }
-            else {
-                return ['allDay'];
-            }
-        };
-        return AllDaySplitter;
-    }(core.Splitter));
-
-    var TIMEGRID_ALL_DAY_EVENT_LIMIT = 5;
-    var WEEK_HEADER_FORMAT = core.createFormatter({ week: 'short' });
-    /* An abstract class for all timegrid-related views. Displays one more columns with time slots running vertically.
-    ----------------------------------------------------------------------------------------------------------------------*/
-    // Is a manager for the TimeGrid subcomponent and possibly the DayGrid subcomponent (if allDaySlot is on).
-    // Responsible for managing width/height.
-    var TimeGridView = /** @class */ (function (_super) {
-        __extends(TimeGridView, _super);
-        function TimeGridView(context, viewSpec, dateProfileGenerator, parentEl) {
-            var _this = _super.call(this, context, viewSpec, dateProfileGenerator, parentEl) || this;
-            _this.splitter = new AllDaySplitter();
-            /* Header Render Methods
-            ------------------------------------------------------------------------------------------------------------------*/
-            // Generates the HTML that will go before the day-of week header cells
-            _this.renderHeadIntroHtml = function () {
-                var _a = _this, theme = _a.theme, dateEnv = _a.dateEnv;
-                var range = _this.props.dateProfile.renderRange;
-                var dayCnt = core.diffDays(range.start, range.end);
-                var weekText;
-                if (_this.opt('weekNumbers')) {
-                    weekText = dateEnv.format(range.start, WEEK_HEADER_FORMAT);
-                    return '' +
-                        '<th class="fc-axis fc-week-number ' + theme.getClass('widgetHeader') + '" ' + _this.axisStyleAttr() + '>' +
-                        core.buildGotoAnchorHtml(// aside from link, important for matchCellWidths
-                        _this, { date: range.start, type: 'week', forceOff: dayCnt > 1 }, core.htmlEscape(weekText) // inner HTML
-                        ) +
-                        '</th>';
-                }
-                else {
-                    return '<th class="fc-axis ' + theme.getClass('widgetHeader') + '" ' + _this.axisStyleAttr() + '></th>';
-                }
-            };
-            /* Time Grid Render Methods
-            ------------------------------------------------------------------------------------------------------------------*/
-            // Generates the HTML that goes before the bg of the TimeGrid slot area. Long vertical column.
-            _this.renderTimeGridBgIntroHtml = function () {
-                var theme = _this.theme;
-                return '<td class="fc-axis ' + theme.getClass('widgetContent') + '" ' + _this.axisStyleAttr() + '></td>';
-            };
-            // Generates the HTML that goes before all other types of cells.
-            // Affects content-skeleton, mirror-skeleton, highlight-skeleton for both the time-grid and day-grid.
-            _this.renderTimeGridIntroHtml = function () {
-                return '<td class="fc-axis" ' + _this.axisStyleAttr() + '></td>';
-            };
-            /* Day Grid Render Methods
-            ------------------------------------------------------------------------------------------------------------------*/
-            // Generates the HTML that goes before the all-day cells
-            _this.renderDayGridBgIntroHtml = function () {
-                var theme = _this.theme;
-                return '' +
-                    '<td class="fc-axis ' + theme.getClass('widgetContent') + '" ' + _this.axisStyleAttr() + '>' +
-                    '<span>' + // needed for matchCellWidths
-                    core.getAllDayHtml(_this) +
-                    '</span>' +
-                    '</td>';
-            };
-            // Generates the HTML that goes before all other types of cells.
-            // Affects content-skeleton, mirror-skeleton, highlight-skeleton for both the time-grid and day-grid.
-            _this.renderDayGridIntroHtml = function () {
-                return '<td class="fc-axis" ' + _this.axisStyleAttr() + '></td>';
-            };
-            _this.el.classList.add('fc-timeGrid-view');
-            _this.el.innerHTML = _this.renderSkeletonHtml();
-            _this.scroller = new core.ScrollComponent('hidden', // overflow x
-            'auto' // overflow y
-            );
-            var timeGridWrapEl = _this.scroller.el;
-            _this.el.querySelector('.fc-body > tr > td').appendChild(timeGridWrapEl);
-            timeGridWrapEl.classList.add('fc-time-grid-container');
-            var timeGridEl = core.createElement('div', { className: 'fc-time-grid' });
-            timeGridWrapEl.appendChild(timeGridEl);
-            _this.timeGrid = new TimeGrid(_this.context, timeGridEl, {
-                renderBgIntroHtml: _this.renderTimeGridBgIntroHtml,
-                renderIntroHtml: _this.renderTimeGridIntroHtml
-            });
-            if (_this.opt('allDaySlot')) { // should we display the "all-day" area?
-                _this.dayGrid = new daygrid.DayGrid(// the all-day subcomponent of this view
-                _this.context, _this.el.querySelector('.fc-day-grid'), {
-                    renderNumberIntroHtml: _this.renderDayGridIntroHtml,
-                    renderBgIntroHtml: _this.renderDayGridBgIntroHtml,
-                    renderIntroHtml: _this.renderDayGridIntroHtml,
-                    colWeekNumbersVisible: false,
-                    cellWeekNumbersVisible: false
-                });
-                // have the day-grid extend it's coordinate area over the <hr> dividing the two grids
-                var dividerEl = _this.el.querySelector('.fc-divider');
-                _this.dayGrid.bottomCoordPadding = dividerEl.getBoundingClientRect().height;
-            }
-            return _this;
-        }
-        TimeGridView.prototype.destroy = function () {
-            _super.prototype.destroy.call(this);
-            this.timeGrid.destroy();
-            if (this.dayGrid) {
-                this.dayGrid.destroy();
-            }
-            this.scroller.destroy();
-        };
-        /* Rendering
-        ------------------------------------------------------------------------------------------------------------------*/
-        // Builds the HTML skeleton for the view.
-        // The day-grid and time-grid components will render inside containers defined by this HTML.
-        TimeGridView.prototype.renderSkeletonHtml = function () {
-            var theme = this.theme;
-            return '' +
-                '<table class="' + theme.getClass('tableGrid') + '">' +
-                (this.opt('columnHeader') ?
-                    '<thead class="fc-head">' +
-                        '<tr>' +
-                        '<td class="fc-head-container ' + theme.getClass('widgetHeader') + '">&nbsp;</td>' +
-                        '</tr>' +
-                        '</thead>' :
-                    '') +
-                '<tbody class="fc-body">' +
-                '<tr>' +
-                '<td class="' + theme.getClass('widgetContent') + '">' +
-                (this.opt('allDaySlot') ?
-                    '<div class="fc-day-grid"></div>' +
-                        '<hr class="fc-divider ' + theme.getClass('widgetHeader') + '" />' :
-                    '') +
-                '</td>' +
-                '</tr>' +
-                '</tbody>' +
-                '</table>';
-        };
-        /* Now Indicator
-        ------------------------------------------------------------------------------------------------------------------*/
-        TimeGridView.prototype.getNowIndicatorUnit = function () {
-            return this.timeGrid.getNowIndicatorUnit();
-        };
-        // subclasses should implement
-        // renderNowIndicator(date: DateMarker) {
-        // }
-        TimeGridView.prototype.unrenderNowIndicator = function () {
-            this.timeGrid.unrenderNowIndicator();
-        };
-        /* Dimensions
-        ------------------------------------------------------------------------------------------------------------------*/
-        TimeGridView.prototype.updateSize = function (isResize, viewHeight, isAuto) {
-            _super.prototype.updateSize.call(this, isResize, viewHeight, isAuto); // will call updateBaseSize. important that executes first
-            this.timeGrid.updateSize(isResize);
-            if (this.dayGrid) {
-                this.dayGrid.updateSize(isResize);
-            }
-        };
-        // Adjusts the vertical dimensions of the view to the specified values
-        TimeGridView.prototype.updateBaseSize = function (isResize, viewHeight, isAuto) {
-            var _this = this;
-            var eventLimit;
-            var scrollerHeight;
-            var scrollbarWidths;
-            // make all axis cells line up
-            this.axisWidth = core.matchCellWidths(core.findElements(this.el, '.fc-axis'));
-            // hack to give the view some height prior to timeGrid's columns being rendered
-            // TODO: separate setting height from scroller VS timeGrid.
-            if (!this.timeGrid.colEls) {
-                if (!isAuto) {
-                    scrollerHeight = this.computeScrollerHeight(viewHeight);
-                    this.scroller.setHeight(scrollerHeight);
-                }
-                return;
-            }
-            // set of fake row elements that must compensate when scroller has scrollbars
-            var noScrollRowEls = core.findElements(this.el, '.fc-row').filter(function (node) {
-                return !_this.scroller.el.contains(node);
-            });
-            // reset all dimensions back to the original state
-            this.timeGrid.bottomRuleEl.style.display = 'none'; // will be shown later if this <hr> is necessary
-            this.scroller.clear(); // sets height to 'auto' and clears overflow
-            noScrollRowEls.forEach(core.uncompensateScroll);
-            // limit number of events in the all-day area
-            if (this.dayGrid) {
-                this.dayGrid.removeSegPopover(); // kill the "more" popover if displayed
-                eventLimit = this.opt('eventLimit');
-                if (eventLimit && typeof eventLimit !== 'number') {
-                    eventLimit = TIMEGRID_ALL_DAY_EVENT_LIMIT; // make sure "auto" goes to a real number
-                }
-                if (eventLimit) {
-                    this.dayGrid.limitRows(eventLimit);
-                }
-            }
-            if (!isAuto) { // should we force dimensions of the scroll container?
-                scrollerHeight = this.computeScrollerHeight(viewHeight);
-                this.scroller.setHeight(scrollerHeight);
-                scrollbarWidths = this.scroller.getScrollbarWidths();
-                if (scrollbarWidths.left || scrollbarWidths.right) { // using scrollbars?
-                    // make the all-day and header rows lines up
-                    noScrollRowEls.forEach(function (rowEl) {
-                        core.compensateScroll(rowEl, scrollbarWidths);
-                    });
-                    // the scrollbar compensation might have changed text flow, which might affect height, so recalculate
-                    // and reapply the desired height to the scroller.
-                    scrollerHeight = this.computeScrollerHeight(viewHeight);
-                    this.scroller.setHeight(scrollerHeight);
-                }
-                // guarantees the same scrollbar widths
-                this.scroller.lockOverflow(scrollbarWidths);
-                // if there's any space below the slats, show the horizontal rule.
-                // this won't cause any new overflow, because lockOverflow already called.
-                if (this.timeGrid.getTotalSlatHeight() < scrollerHeight) {
-                    this.timeGrid.bottomRuleEl.style.display = '';
-                }
-            }
-        };
-        // given a desired total height of the view, returns what the height of the scroller should be
-        TimeGridView.prototype.computeScrollerHeight = function (viewHeight) {
-            return viewHeight -
-                core.subtractInnerElHeight(this.el, this.scroller.el); // everything that's NOT the scroller
-        };
-        /* Scroll
-        ------------------------------------------------------------------------------------------------------------------*/
-        // Computes the initial pre-configured scroll state prior to allowing the user to change it
-        TimeGridView.prototype.computeDateScroll = function (duration) {
-            var top = this.timeGrid.computeTimeTop(duration);
-            // zoom can give weird floating-point values. rather scroll a little bit further
-            top = Math.ceil(top);
-            if (top) {
-                top++; // to overcome top border that slots beyond the first have. looks better
-            }
-            return { top: top };
-        };
-        TimeGridView.prototype.queryDateScroll = function () {
-            return { top: this.scroller.getScrollTop() };
-        };
-        TimeGridView.prototype.applyDateScroll = function (scroll) {
-            if (scroll.top !== undefined) {
-                this.scroller.setScrollTop(scroll.top);
-            }
-        };
-        // Generates an HTML attribute string for setting the width of the axis, if it is known
-        TimeGridView.prototype.axisStyleAttr = function () {
-            if (this.axisWidth != null) {
-                return 'style="width:' + this.axisWidth + 'px"';
-            }
-            return '';
-        };
-        return TimeGridView;
-    }(core.View));
-    TimeGridView.prototype.usesMinMaxTime = true; // indicates that minTime/maxTime affects rendering
-
-    var SimpleTimeGrid = /** @class */ (function (_super) {
-        __extends(SimpleTimeGrid, _super);
-        function SimpleTimeGrid(context, timeGrid) {
-            var _this = _super.call(this, context, timeGrid.el) || this;
-            _this.buildDayRanges = core.memoize(buildDayRanges);
-            _this.slicer = new TimeGridSlicer();
-            _this.timeGrid = timeGrid;
-            context.calendar.registerInteractiveComponent(_this, {
-                el: _this.timeGrid.el
-            });
-            return _this;
-        }
-        SimpleTimeGrid.prototype.destroy = function () {
-            _super.prototype.destroy.call(this);
-            this.calendar.unregisterInteractiveComponent(this);
-        };
-        SimpleTimeGrid.prototype.render = function (props) {
-            var dateProfile = props.dateProfile, dayTable = props.dayTable;
-            var dayRanges = this.dayRanges = this.buildDayRanges(dayTable, dateProfile, this.dateEnv);
-            this.timeGrid.receiveProps(__assign({}, this.slicer.sliceProps(props, dateProfile, null, this.timeGrid, dayRanges), { dateProfile: dateProfile, cells: dayTable.cells[0] }));
-        };
-        SimpleTimeGrid.prototype.renderNowIndicator = function (date) {
-            this.timeGrid.renderNowIndicator(this.slicer.sliceNowDate(date, this.timeGrid, this.dayRanges), date);
-        };
-        SimpleTimeGrid.prototype.buildPositionCaches = function () {
-            this.timeGrid.buildPositionCaches();
-        };
-        SimpleTimeGrid.prototype.queryHit = function (positionLeft, positionTop) {
-            var rawHit = this.timeGrid.positionToHit(positionLeft, positionTop);
-            if (rawHit) {
-                return {
-                    component: this.timeGrid,
-                    dateSpan: rawHit.dateSpan,
-                    dayEl: rawHit.dayEl,
-                    rect: {
-                        left: rawHit.relativeRect.left,
-                        right: rawHit.relativeRect.right,
-                        top: rawHit.relativeRect.top,
-                        bottom: rawHit.relativeRect.bottom
-                    },
-                    layer: 0
-                };
-            }
-        };
-        return SimpleTimeGrid;
-    }(core.DateComponent));
-    function buildDayRanges(dayTable, dateProfile, dateEnv) {
-        var ranges = [];
-        for (var _i = 0, _a = dayTable.headerDates; _i < _a.length; _i++) {
-            var date = _a[_i];
-            ranges.push({
-                start: dateEnv.add(date, dateProfile.minTime),
-                end: dateEnv.add(date, dateProfile.maxTime)
-            });
-        }
-        return ranges;
-    }
-    var TimeGridSlicer = /** @class */ (function (_super) {
-        __extends(TimeGridSlicer, _super);
-        function TimeGridSlicer() {
-            return _super !== null && _super.apply(this, arguments) || this;
-        }
-        TimeGridSlicer.prototype.sliceRange = function (range, dayRanges) {
-            var segs = [];
-            for (var col = 0; col < dayRanges.length; col++) {
-                var segRange = core.intersectRanges(range, dayRanges[col]);
-                if (segRange) {
-                    segs.push({
-                        start: segRange.start,
-                        end: segRange.end,
-                        isStart: segRange.start.valueOf() === range.start.valueOf(),
-                        isEnd: segRange.end.valueOf() === range.end.valueOf(),
-                        col: col
-                    });
-                }
-            }
-            return segs;
-        };
-        return TimeGridSlicer;
-    }(core.Slicer));
-
-    var TimeGridView$1 = /** @class */ (function (_super) {
-        __extends(TimeGridView, _super);
-        function TimeGridView(_context, viewSpec, dateProfileGenerator, parentEl) {
-            var _this = _super.call(this, _context, viewSpec, dateProfileGenerator, parentEl) || this;
-            _this.buildDayTable = core.memoize(buildDayTable);
-            if (_this.opt('columnHeader')) {
-                _this.header = new core.DayHeader(_this.context, _this.el.querySelector('.fc-head-container'));
-            }
-            _this.simpleTimeGrid = new SimpleTimeGrid(_this.context, _this.timeGrid);
-            if (_this.dayGrid) {
-                _this.simpleDayGrid = new daygrid.SimpleDayGrid(_this.context, _this.dayGrid);
-            }
-            return _this;
-        }
-        TimeGridView.prototype.destroy = function () {
-            _super.prototype.destroy.call(this);
-            if (this.header) {
-                this.header.destroy();
-            }
-            this.simpleTimeGrid.destroy();
-            if (this.simpleDayGrid) {
-                this.simpleDayGrid.destroy();
-            }
-        };
-        TimeGridView.prototype.render = function (props) {
-            _super.prototype.render.call(this, props); // for flags for updateSize
-            var dateProfile = this.props.dateProfile;
-            var dayTable = this.buildDayTable(dateProfile, this.dateProfileGenerator);
-            var splitProps = this.splitter.splitProps(props);
-            if (this.header) {
-                this.header.receiveProps({
-                    dateProfile: dateProfile,
-                    dates: dayTable.headerDates,
-                    datesRepDistinctDays: true,
-                    renderIntroHtml: this.renderHeadIntroHtml
-                });
-            }
-            this.simpleTimeGrid.receiveProps(__assign({}, splitProps['timed'], { dateProfile: dateProfile,
-                dayTable: dayTable }));
-            if (this.simpleDayGrid) {
-                this.simpleDayGrid.receiveProps(__assign({}, splitProps['allDay'], { dateProfile: dateProfile,
-                    dayTable: dayTable, nextDayThreshold: this.nextDayThreshold, isRigid: false }));
-            }
-        };
-        TimeGridView.prototype.renderNowIndicator = function (date) {
-            this.simpleTimeGrid.renderNowIndicator(date);
-        };
-        return TimeGridView;
-    }(TimeGridView));
-    function buildDayTable(dateProfile, dateProfileGenerator) {
-        var daySeries = new core.DaySeries(dateProfile.renderRange, dateProfileGenerator);
-        return new core.DayTable(daySeries, false);
-    }
-
-    var main = core.createPlugin({
-        defaultView: 'timeGridWeek',
-        views: {
-            timeGrid: {
-                class: TimeGridView$1,
-                allDaySlot: true,
-                slotDuration: '00:30:00',
-                slotEventOverlap: true // a bad name. confused with overlap/constraint system
-            },
-            timeGridDay: {
-                type: 'timeGrid',
-                duration: { days: 1 }
-            },
-            timeGridWeek: {
-                type: 'timeGrid',
-                duration: { weeks: 1 }
-            }
-        }
-    });
-
-    exports.AbstractTimeGridView = TimeGridView;
-    exports.TimeGrid = TimeGrid;
-    exports.TimeGridSlicer = TimeGridSlicer;
-    exports.TimeGridView = TimeGridView$1;
-    exports.buildDayRanges = buildDayRanges;
-    exports.buildDayTable = buildDayTable;
-    exports.default = main;
-
-    Object.defineProperty(exports, '__esModule', { value: true });
-
-}));
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/timegrid/main.min.css b/AKPlan/static/AKPlan/vendor/fullcalendar/timegrid/main.min.css
deleted file mode 100644
index a1abf91f558e3cd6e6c64b27dd4ee1531dd15410..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/timegrid/main.min.css
+++ /dev/null
@@ -1 +0,0 @@
-@charset "UTF-8";.fc-timeGrid-view .fc-day-grid{position:relative;z-index:2}.fc-timeGrid-view .fc-day-grid .fc-row{min-height:3em}.fc-timeGrid-view .fc-day-grid .fc-row .fc-content-skeleton{padding-bottom:1em}.fc .fc-axis{vertical-align:middle;padding:0 4px;white-space:nowrap}.fc-ltr .fc-axis{text-align:right}.fc-rtl .fc-axis{text-align:left}.fc-time-grid,.fc-time-grid-container{position:relative;z-index:1}.fc-time-grid{min-height:100%}.fc-time-grid table{border:0 hidden transparent}.fc-time-grid>.fc-bg{z-index:1}.fc-time-grid .fc-slats,.fc-time-grid>hr{position:relative;z-index:2}.fc-time-grid .fc-content-col{position:relative}.fc-time-grid .fc-content-skeleton{position:absolute;z-index:3;top:0;left:0;right:0}.fc-time-grid .fc-business-container{position:relative;z-index:1}.fc-time-grid .fc-bgevent-container{position:relative;z-index:2}.fc-time-grid .fc-highlight-container{z-index:3;position:relative}.fc-time-grid .fc-event-container{position:relative;z-index:4}.fc-time-grid .fc-now-indicator-line{z-index:5}.fc-time-grid .fc-mirror-container{position:relative;z-index:6}.fc-time-grid .fc-slats td{height:1.5em;border-bottom:0}.fc-time-grid .fc-slats .fc-minor td{border-top-style:dotted}.fc-time-grid .fc-highlight{position:absolute;left:0;right:0}.fc-ltr .fc-time-grid .fc-event-container{margin:0 2.5% 0 2px}.fc-rtl .fc-time-grid .fc-event-container{margin:0 2px 0 2.5%}.fc-time-grid .fc-bgevent,.fc-time-grid .fc-event{position:absolute;z-index:1}.fc-time-grid .fc-bgevent{left:0;right:0}.fc-time-grid-event{margin-bottom:1px}.fc-time-grid-event-inset{-webkit-box-shadow:0 0 0 1px #fff;box-shadow:0 0 0 1px #fff}.fc-time-grid-event.fc-not-start{border-top-width:0;padding-top:1px;border-top-left-radius:0;border-top-right-radius:0}.fc-time-grid-event.fc-not-end{border-bottom-width:0;padding-bottom:1px;border-bottom-left-radius:0;border-bottom-right-radius:0}.fc-time-grid-event .fc-content{overflow:hidden;max-height:100%}.fc-time-grid-event .fc-time,.fc-time-grid-event .fc-title{padding:0 1px}.fc-time-grid-event .fc-time{font-size:.85em;white-space:nowrap}.fc-time-grid-event.fc-short .fc-content{white-space:nowrap}.fc-time-grid-event.fc-short .fc-time,.fc-time-grid-event.fc-short .fc-title{display:inline-block;vertical-align:top}.fc-time-grid-event.fc-short .fc-time span{display:none}.fc-time-grid-event.fc-short .fc-time:before{content:attr(data-start)}.fc-time-grid-event.fc-short .fc-time:after{content:" - "}.fc-time-grid-event.fc-short .fc-title{font-size:.85em;padding:0}.fc-time-grid-event.fc-allow-mouse-resize .fc-resizer{left:0;right:0;bottom:0;height:8px;overflow:hidden;line-height:8px;font-size:11px;font-family:monospace;text-align:center;cursor:s-resize}.fc-time-grid-event.fc-allow-mouse-resize .fc-resizer:after{content:"="}.fc-time-grid-event.fc-selected .fc-resizer{border-radius:5px;border-width:1px;width:8px;height:8px;border-style:solid;border-color:inherit;background:#fff;left:50%;margin-left:-5px;bottom:-5px}.fc-time-grid .fc-now-indicator-line{border-top-width:1px;left:0;right:0}.fc-time-grid .fc-now-indicator-arrow{margin-top:-5px}.fc-ltr .fc-time-grid .fc-now-indicator-arrow{left:0;border-width:5px 0 5px 6px;border-top-color:transparent;border-bottom-color:transparent}.fc-rtl .fc-time-grid .fc-now-indicator-arrow{right:0;border-width:5px 6px 5px 0;border-top-color:transparent;border-bottom-color:transparent}
\ No newline at end of file
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/timegrid/main.min.js b/AKPlan/static/AKPlan/vendor/fullcalendar/timegrid/main.min.js
deleted file mode 100644
index 13c3433e9f0380fa64c972b20a2bb647df4299bc..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/timegrid/main.min.js
+++ /dev/null
@@ -1,6 +0,0 @@
-/*!
-FullCalendar Time Grid Plugin v4.3.0
-Docs & License: https://fullcalendar.io/
-(c) 2019 Adam Shaw
-*/
-!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("@fullcalendar/core"),require("@fullcalendar/daygrid")):"function"==typeof define&&define.amd?define(["exports","@fullcalendar/core","@fullcalendar/daygrid"],t):t((e=e||self).FullCalendarTimeGrid={},e.FullCalendar,e.FullCalendarDayGrid)}(this,function(e,t,r){"use strict";var i=function(e,t){return(i=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])})(e,t)};function n(e,t){function r(){this.constructor=e}i(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}var o=function(){return(o=Object.assign||function(e){for(var t,r=1,i=arguments.length;r<i;r++)for(var n in t=arguments[r])Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n]);return e}).apply(this,arguments)},s=function(e){function r(r){var i=e.call(this,r.context)||this;return i.timeGrid=r,i.fullTimeFormat=t.createFormatter({hour:"numeric",minute:"2-digit",separator:i.context.options.defaultRangeSeparator}),i}return n(r,e),r.prototype.attachSegs=function(e,t){for(var r=this.timeGrid.groupSegsByCol(e),i=0;i<r.length;i++)r[i]=this.sortEventSegs(r[i]);this.segsByCol=r,this.timeGrid.attachSegsByCol(r,this.timeGrid.fgContainerEls)},r.prototype.detachSegs=function(e){e.forEach(function(e){t.removeElement(e.el)}),this.segsByCol=null},r.prototype.computeSegSizes=function(e){var t=this.timeGrid,r=this.segsByCol,i=t.colCnt;if(t.computeSegVerticals(e),r)for(var n=0;n<i;n++)this.computeSegHorizontals(r[n])},r.prototype.assignSegSizes=function(e){var t=this.timeGrid,r=this.segsByCol,i=t.colCnt;if(t.assignSegVerticals(e),r)for(var n=0;n<i;n++)this.assignSegCss(r[n])},r.prototype.computeEventTimeFormat=function(){return{hour:"numeric",minute:"2-digit",meridiem:!1}},r.prototype.computeDisplayEventEnd=function(){return!0},r.prototype.renderSegHtml=function(e,r){var i,n,o,s=this.context.view,a=e.eventRange,l=a.def,d=a.ui,c=l.allDay,h=s.computeEventDraggable(l,d),u=e.isStart&&s.computeEventStartResizable(l,d),p=e.isEnd&&s.computeEventEndResizable(l,d),f=this.getSegClasses(e,h,u||p,r),g=t.cssToStr(this.getSkinCss(d));if(f.unshift("fc-time-grid-event"),t.isMultiDayRange(a.range)){if(e.isStart||e.isEnd){var m=e.start,y=e.end;i=this._getTimeText(m,y,c),n=this._getTimeText(m,y,c,this.fullTimeFormat),o=this._getTimeText(m,y,c,null,!1)}}else i=this.getTimeText(a),n=this.getTimeText(a,this.fullTimeFormat),o=this.getTimeText(a,null,!1);return'<a class="'+f.join(" ")+'"'+(l.url?' href="'+t.htmlEscape(l.url)+'"':"")+(g?' style="'+g+'"':"")+'><div class="fc-content">'+(i?'<div class="fc-time" data-start="'+t.htmlEscape(o)+'" data-full="'+t.htmlEscape(n)+'"><span>'+t.htmlEscape(i)+"</span></div>":"")+(l.title?'<div class="fc-title">'+t.htmlEscape(l.title)+"</div>":"")+"</div>"+(p?'<div class="fc-resizer fc-end-resizer"></div>':"")+"</a>"},r.prototype.computeSegHorizontals=function(e){var t,r,i;if(function(e){var t,r,i,n,o;for(t=0;t<e.length;t++)for(r=e[t],i=0;i<r.length;i++)for((n=r[i]).forwardSegs=[],o=t+1;o<e.length;o++)l(n,e[o],n.forwardSegs)}(t=function(e){var t,r,i,n=[];for(t=0;t<e.length;t++){for(r=e[t],i=0;i<n.length&&l(r,n[i]).length;i++);r.level=i,(n[i]||(n[i]=[])).push(r)}return n}(e)),r=t[0]){for(i=0;i<r.length;i++)a(r[i]);for(i=0;i<r.length;i++)this.computeSegForwardBack(r[i],0,0)}},r.prototype.computeSegForwardBack=function(e,t,r){var i,n=e.forwardSegs;if(void 0===e.forwardCoord)for(n.length?(this.sortForwardSegs(n),this.computeSegForwardBack(n[0],t+1,r),e.forwardCoord=n[0].backwardCoord):e.forwardCoord=1,e.backwardCoord=e.forwardCoord-(e.forwardCoord-r)/(t+1),i=0;i<n.length;i++)this.computeSegForwardBack(n[i],0,e.forwardCoord)},r.prototype.sortForwardSegs=function(e){var r=e.map(d),i=[{field:"forwardPressure",order:-1},{field:"backwardCoord",order:1}].concat(this.context.view.eventOrderSpecs);return r.sort(function(e,r){return t.compareByFieldSpecs(e,r,i)}),r.map(function(e){return e._seg})},r.prototype.assignSegCss=function(e){for(var r=0,i=e;r<i.length;r++){var n=i[r];t.applyStyle(n.el,this.generateSegCss(n)),n.level>0&&n.el.classList.add("fc-time-grid-event-inset"),n.eventRange.def.title&&n.bottom-n.top<30&&n.el.classList.add("fc-short")}},r.prototype.generateSegCss=function(e){var t,r,i=this.context.options.slotEventOverlap,n=e.backwardCoord,o=e.forwardCoord,s=this.timeGrid.generateSegVerticalCss(e),a=this.timeGrid.isRtl;return i&&(o=Math.min(1,n+2*(o-n))),a?(t=1-o,r=n):(t=n,r=1-o),s.zIndex=e.level+1,s.left=100*t+"%",s.right=100*r+"%",i&&e.forwardPressure&&(s[a?"marginLeft":"marginRight"]=20),s},r}(t.FgEventRenderer);function a(e){var t,r,i=e.forwardSegs,n=0;if(void 0===e.forwardPressure){for(t=0;t<i.length;t++)a(r=i[t]),n=Math.max(n,1+r.forwardPressure);e.forwardPressure=n}}function l(e,t,r){void 0===r&&(r=[]);for(var i=0;i<t.length;i++)n=e,o=t[i],n.bottom>o.top&&n.top<o.bottom&&r.push(t[i]);var n,o;return r}function d(e){var r=t.buildSegCompareObj(e);return r.forwardPressure=e.forwardPressure,r.backwardCoord=e.backwardCoord,r}var c=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.attachSegs=function(e,t){this.segsByCol=this.timeGrid.groupSegsByCol(e),this.timeGrid.attachSegsByCol(this.segsByCol,this.timeGrid.mirrorContainerEls),this.sourceSeg=t.sourceSeg},t.prototype.generateSegCss=function(t){var r=e.prototype.generateSegCss.call(this,t),i=this.sourceSeg;if(i&&i.col===t.col){var n=e.prototype.generateSegCss.call(this,i);r.left=n.left,r.right=n.right,r.marginLeft=n.marginLeft,r.marginRight=n.marginRight}return r},t}(s),h=function(e){function t(t){var r=e.call(this,t.context)||this;return r.timeGrid=t,r}return n(t,e),t.prototype.attachSegs=function(e,t){var r,i=this.timeGrid;return"bgEvent"===e?r=i.bgContainerEls:"businessHours"===e?r=i.businessContainerEls:"highlight"===e&&(r=i.highlightContainerEls),i.attachSegsByCol(i.groupSegsByCol(t),r),t.map(function(e){return e.el})},t.prototype.computeSegSizes=function(e){this.timeGrid.computeSegVerticals(e)},t.prototype.assignSegSizes=function(e){this.timeGrid.assignSegVerticals(e)},t}(t.FillRenderer),u=[{hours:1},{minutes:30},{minutes:15},{seconds:30},{seconds:15}],p=function(e){function i(r,i,n){var o=e.call(this,r,i)||this;o.isSlatSizesDirty=!1,o.isColSizesDirty=!1,o.renderSlats=t.memoizeRendering(o._renderSlats);var a=o.eventRenderer=new s(o),l=o.fillRenderer=new h(o);o.mirrorRenderer=new c(o);var d=o.renderColumns=t.memoizeRendering(o._renderColumns,o._unrenderColumns);return o.renderBusinessHours=t.memoizeRendering(l.renderSegs.bind(l,"businessHours"),l.unrender.bind(l,"businessHours"),[d]),o.renderDateSelection=t.memoizeRendering(o._renderDateSelection,o._unrenderDateSelection,[d]),o.renderFgEvents=t.memoizeRendering(a.renderSegs.bind(a),a.unrender.bind(a),[d]),o.renderBgEvents=t.memoizeRendering(l.renderSegs.bind(l,"bgEvent"),l.unrender.bind(l,"bgEvent"),[d]),o.renderEventSelection=t.memoizeRendering(a.selectByInstanceId.bind(a),a.unselectByInstanceId.bind(a),[o.renderFgEvents]),o.renderEventDrag=t.memoizeRendering(o._renderEventDrag,o._unrenderEventDrag,[d]),o.renderEventResize=t.memoizeRendering(o._renderEventResize,o._unrenderEventResize,[d]),o.processOptions(),i.innerHTML='<div class="fc-bg"></div><div class="fc-slats"></div><hr class="fc-divider '+o.theme.getClass("widgetHeader")+'" style="display:none" />',o.rootBgContainerEl=i.querySelector(".fc-bg"),o.slatContainerEl=i.querySelector(".fc-slats"),o.bottomRuleEl=i.querySelector(".fc-divider"),o.renderProps=n,o}return n(i,e),i.prototype.processOptions=function(){var e,r,i=this.opt("slotDuration"),n=this.opt("snapDuration");i=t.createDuration(i),n=n?t.createDuration(n):i,null===(e=t.wholeDivideDurations(i,n))&&(n=i,e=1),this.slotDuration=i,this.snapDuration=n,this.snapsPerSlot=e,r=this.opt("slotLabelFormat"),Array.isArray(r)&&(r=r[r.length-1]),this.labelFormat=t.createFormatter(r||{hour:"numeric",minute:"2-digit",omitZeroMinute:!0,meridiem:"short"}),r=this.opt("slotLabelInterval"),this.labelInterval=r?t.createDuration(r):this.computeLabelInterval(i)},i.prototype.computeLabelInterval=function(e){var r,i,n;for(r=u.length-1;r>=0;r--)if(i=t.createDuration(u[r]),null!==(n=t.wholeDivideDurations(i,e))&&n>1)return i;return e},i.prototype.render=function(e){var t=e.cells;this.colCnt=t.length,this.renderSlats(e.dateProfile),this.renderColumns(e.cells,e.dateProfile),this.renderBusinessHours(e.businessHourSegs),this.renderDateSelection(e.dateSelectionSegs),this.renderFgEvents(e.fgEventSegs),this.renderBgEvents(e.bgEventSegs),this.renderEventSelection(e.eventSelection),this.renderEventDrag(e.eventDrag),this.renderEventResize(e.eventResize)},i.prototype.destroy=function(){e.prototype.destroy.call(this),this.renderSlats.unrender(),this.renderColumns.unrender()},i.prototype.updateSize=function(e){var t=this.fillRenderer,r=this.eventRenderer,i=this.mirrorRenderer;(e||this.isSlatSizesDirty)&&(this.buildSlatPositions(),this.isSlatSizesDirty=!1),(e||this.isColSizesDirty)&&(this.buildColPositions(),this.isColSizesDirty=!1),t.computeSizes(e),r.computeSizes(e),i.computeSizes(e),t.assignSizes(e),r.assignSizes(e),i.assignSizes(e)},i.prototype._renderSlats=function(e){var r=this.theme;this.slatContainerEl.innerHTML='<table class="'+r.getClass("tableGrid")+'">'+this.renderSlatRowHtml(e)+"</table>",this.slatEls=t.findElements(this.slatContainerEl,"tr"),this.slatPositions=new t.PositionCache(this.el,this.slatEls,!1,!0),this.isSlatSizesDirty=!0},i.prototype.renderSlatRowHtml=function(e){for(var r,i,n,o=this.dateEnv,s=this.theme,a=this.isRtl,l="",d=t.startOfDay(e.renderRange.start),c=e.minTime,h=t.createDuration(0);t.asRoughMs(c)<t.asRoughMs(e.maxTime);)r=o.add(d,c),i=null!==t.wholeDivideDurations(h,this.labelInterval),n='<td class="fc-axis fc-time '+s.getClass("widgetContent")+'">'+(i?"<span>"+t.htmlEscape(o.format(r,this.labelFormat))+"</span>":"")+"</td>",l+='<tr data-time="'+t.formatIsoTimeString(r)+'"'+(i?"":' class="fc-minor"')+">"+(a?"":n)+'<td class="'+s.getClass("widgetContent")+'"></td>'+(a?n:"")+"</tr>",c=t.addDurations(c,this.slotDuration),h=t.addDurations(h,this.slotDuration);return l},i.prototype._renderColumns=function(e,i){var n=this.theme,o=this.dateEnv,s=this.view,a=new r.DayBgRow(this.context);this.rootBgContainerEl.innerHTML='<table class="'+n.getClass("tableGrid")+'">'+a.renderHtml({cells:e,dateProfile:i,renderIntroHtml:this.renderProps.renderBgIntroHtml})+"</table>",this.colEls=t.findElements(this.el,".fc-day, .fc-disabled-day");for(var l=0;l<this.colCnt;l++)this.publiclyTrigger("dayRender",[{date:o.toDate(e[l].date),el:this.colEls[l],view:s}]);this.isRtl&&this.colEls.reverse(),this.colPositions=new t.PositionCache(this.el,this.colEls,!0,!1),this.renderContentSkeleton(),this.isColSizesDirty=!0},i.prototype._unrenderColumns=function(){this.unrenderContentSkeleton()},i.prototype.renderContentSkeleton=function(){var e,r=[];r.push(this.renderProps.renderIntroHtml());for(var i=0;i<this.colCnt;i++)r.push('<td><div class="fc-content-col"><div class="fc-event-container fc-mirror-container"></div><div class="fc-event-container"></div><div class="fc-highlight-container"></div><div class="fc-bgevent-container"></div><div class="fc-business-container"></div></div></td>');this.isRtl&&r.reverse(),e=this.contentSkeletonEl=t.htmlToElement('<div class="fc-content-skeleton"><table><tr>'+r.join("")+"</tr></table></div>"),this.colContainerEls=t.findElements(e,".fc-content-col"),this.mirrorContainerEls=t.findElements(e,".fc-mirror-container"),this.fgContainerEls=t.findElements(e,".fc-event-container:not(.fc-mirror-container)"),this.bgContainerEls=t.findElements(e,".fc-bgevent-container"),this.highlightContainerEls=t.findElements(e,".fc-highlight-container"),this.businessContainerEls=t.findElements(e,".fc-business-container"),this.isRtl&&(this.colContainerEls.reverse(),this.mirrorContainerEls.reverse(),this.fgContainerEls.reverse(),this.bgContainerEls.reverse(),this.highlightContainerEls.reverse(),this.businessContainerEls.reverse()),this.el.appendChild(e)},i.prototype.unrenderContentSkeleton=function(){t.removeElement(this.contentSkeletonEl)},i.prototype.groupSegsByCol=function(e){var t,r=[];for(t=0;t<this.colCnt;t++)r.push([]);for(t=0;t<e.length;t++)r[e[t].col].push(e[t]);return r},i.prototype.attachSegsByCol=function(e,t){var r,i,n;for(r=0;r<this.colCnt;r++)for(i=e[r],n=0;n<i.length;n++)t[r].appendChild(i[n].el)},i.prototype.getNowIndicatorUnit=function(){return"minute"},i.prototype.renderNowIndicator=function(e,r){if(this.colContainerEls){var i,n=this.computeDateTop(r),o=[];for(i=0;i<e.length;i++){var s=t.createElement("div",{className:"fc-now-indicator fc-now-indicator-line"});s.style.top=n+"px",this.colContainerEls[e[i].col].appendChild(s),o.push(s)}if(e.length>0){var a=t.createElement("div",{className:"fc-now-indicator fc-now-indicator-arrow"});a.style.top=n+"px",this.contentSkeletonEl.appendChild(a),o.push(a)}this.nowIndicatorEls=o}},i.prototype.unrenderNowIndicator=function(){this.nowIndicatorEls&&(this.nowIndicatorEls.forEach(t.removeElement),this.nowIndicatorEls=null)},i.prototype.getTotalSlatHeight=function(){return this.slatContainerEl.getBoundingClientRect().height},i.prototype.computeDateTop=function(e,r){return r||(r=t.startOfDay(e)),this.computeTimeTop(t.createDuration(e.valueOf()-r.valueOf()))},i.prototype.computeTimeTop=function(e){var r,i,n=this.slatEls.length,o=this.props.dateProfile,s=(e.milliseconds-t.asRoughMs(o.minTime))/t.asRoughMs(this.slotDuration);return s=Math.max(0,s),s=Math.min(n,s),r=Math.floor(s),i=s-(r=Math.min(r,n-1)),this.slatPositions.tops[r]+this.slatPositions.getHeight(r)*i},i.prototype.computeSegVerticals=function(e){var t,r,i,n=this.opt("timeGridEventMinHeight");for(t=0;t<e.length;t++)r=e[t],i=this.props.cells[r.col].date,r.top=this.computeDateTop(r.start,i),r.bottom=Math.max(r.top+n,this.computeDateTop(r.end,i))},i.prototype.assignSegVerticals=function(e){var r,i;for(r=0;r<e.length;r++)i=e[r],t.applyStyle(i.el,this.generateSegVerticalCss(i))},i.prototype.generateSegVerticalCss=function(e){return{top:e.top,bottom:-e.bottom}},i.prototype.buildPositionCaches=function(){this.buildColPositions(),this.buildSlatPositions()},i.prototype.buildColPositions=function(){this.colPositions.build()},i.prototype.buildSlatPositions=function(){this.slatPositions.build()},i.prototype.positionToHit=function(e,r){var i=this.dateEnv,n=this.snapsPerSlot,o=this.slatPositions,s=this.colPositions,a=s.leftToIndex(e),l=o.topToIndex(r);if(null!=a&&null!=l){var d=o.tops[l],c=o.getHeight(l),h=(r-d)/c,u=l*n+Math.floor(h*n),p=this.props.cells[a].date,f=t.addDurations(this.props.dateProfile.minTime,t.multiplyDuration(this.snapDuration,u)),g=i.add(p,f);return{col:a,dateSpan:{range:{start:g,end:i.add(g,this.snapDuration)},allDay:!1},dayEl:this.colEls[a],relativeRect:{left:s.lefts[a],right:s.rights[a],top:d,bottom:d+c}}}},i.prototype._renderEventDrag=function(e){e&&(this.eventRenderer.hideByHash(e.affectedInstances),e.isEvent?this.mirrorRenderer.renderSegs(e.segs,{isDragging:!0,sourceSeg:e.sourceSeg}):this.fillRenderer.renderSegs("highlight",e.segs))},i.prototype._unrenderEventDrag=function(e){e&&(this.eventRenderer.showByHash(e.affectedInstances),this.mirrorRenderer.unrender(e.segs,{isDragging:!0,sourceSeg:e.sourceSeg}),this.fillRenderer.unrender("highlight"))},i.prototype._renderEventResize=function(e){e&&(this.eventRenderer.hideByHash(e.affectedInstances),this.mirrorRenderer.renderSegs(e.segs,{isResizing:!0,sourceSeg:e.sourceSeg}))},i.prototype._unrenderEventResize=function(e){e&&(this.eventRenderer.showByHash(e.affectedInstances),this.mirrorRenderer.unrender(e.segs,{isResizing:!0,sourceSeg:e.sourceSeg}))},i.prototype._renderDateSelection=function(e){e&&(this.opt("selectMirror")?this.mirrorRenderer.renderSegs(e,{isSelecting:!0}):this.fillRenderer.renderSegs("highlight",e))},i.prototype._unrenderDateSelection=function(e){this.mirrorRenderer.unrender(e,{isSelecting:!0}),this.fillRenderer.unrender("highlight")},i}(t.DateComponent),f=function(e){function r(){return null!==e&&e.apply(this,arguments)||this}return n(r,e),r.prototype.getKeyInfo=function(){return{allDay:{},timed:{}}},r.prototype.getKeysForDateSpan=function(e){return e.allDay?["allDay"]:["timed"]},r.prototype.getKeysForEventDef=function(e){return e.allDay?t.hasBgRendering(e)?["timed","allDay"]:["allDay"]:["timed"]},r}(t.Splitter),g=t.createFormatter({week:"short"}),m=function(e){function i(i,n,o,s){var a=e.call(this,i,n,o,s)||this;a.splitter=new f,a.renderHeadIntroHtml=function(){var e,r=a,i=r.theme,n=r.dateEnv,o=a.props.dateProfile.renderRange,s=t.diffDays(o.start,o.end);return a.opt("weekNumbers")?(e=n.format(o.start,g),'<th class="fc-axis fc-week-number '+i.getClass("widgetHeader")+'" '+a.axisStyleAttr()+">"+t.buildGotoAnchorHtml(a,{date:o.start,type:"week",forceOff:s>1},t.htmlEscape(e))+"</th>"):'<th class="fc-axis '+i.getClass("widgetHeader")+'" '+a.axisStyleAttr()+"></th>"},a.renderTimeGridBgIntroHtml=function(){return'<td class="fc-axis '+a.theme.getClass("widgetContent")+'" '+a.axisStyleAttr()+"></td>"},a.renderTimeGridIntroHtml=function(){return'<td class="fc-axis" '+a.axisStyleAttr()+"></td>"},a.renderDayGridBgIntroHtml=function(){return'<td class="fc-axis '+a.theme.getClass("widgetContent")+'" '+a.axisStyleAttr()+"><span>"+t.getAllDayHtml(a)+"</span></td>"},a.renderDayGridIntroHtml=function(){return'<td class="fc-axis" '+a.axisStyleAttr()+"></td>"},a.el.classList.add("fc-timeGrid-view"),a.el.innerHTML=a.renderSkeletonHtml(),a.scroller=new t.ScrollComponent("hidden","auto");var l=a.scroller.el;a.el.querySelector(".fc-body > tr > td").appendChild(l),l.classList.add("fc-time-grid-container");var d=t.createElement("div",{className:"fc-time-grid"});if(l.appendChild(d),a.timeGrid=new p(a.context,d,{renderBgIntroHtml:a.renderTimeGridBgIntroHtml,renderIntroHtml:a.renderTimeGridIntroHtml}),a.opt("allDaySlot")){a.dayGrid=new r.DayGrid(a.context,a.el.querySelector(".fc-day-grid"),{renderNumberIntroHtml:a.renderDayGridIntroHtml,renderBgIntroHtml:a.renderDayGridBgIntroHtml,renderIntroHtml:a.renderDayGridIntroHtml,colWeekNumbersVisible:!1,cellWeekNumbersVisible:!1});var c=a.el.querySelector(".fc-divider");a.dayGrid.bottomCoordPadding=c.getBoundingClientRect().height}return a}return n(i,e),i.prototype.destroy=function(){e.prototype.destroy.call(this),this.timeGrid.destroy(),this.dayGrid&&this.dayGrid.destroy(),this.scroller.destroy()},i.prototype.renderSkeletonHtml=function(){var e=this.theme;return'<table class="'+e.getClass("tableGrid")+'">'+(this.opt("columnHeader")?'<thead class="fc-head"><tr><td class="fc-head-container '+e.getClass("widgetHeader")+'">&nbsp;</td></tr></thead>':"")+'<tbody class="fc-body"><tr><td class="'+e.getClass("widgetContent")+'">'+(this.opt("allDaySlot")?'<div class="fc-day-grid"></div><hr class="fc-divider '+e.getClass("widgetHeader")+'" />':"")+"</td></tr></tbody></table>"},i.prototype.getNowIndicatorUnit=function(){return this.timeGrid.getNowIndicatorUnit()},i.prototype.unrenderNowIndicator=function(){this.timeGrid.unrenderNowIndicator()},i.prototype.updateSize=function(t,r,i){e.prototype.updateSize.call(this,t,r,i),this.timeGrid.updateSize(t),this.dayGrid&&this.dayGrid.updateSize(t)},i.prototype.updateBaseSize=function(e,r,i){var n,o,s,a=this;if(this.axisWidth=t.matchCellWidths(t.findElements(this.el,".fc-axis")),this.timeGrid.colEls){var l=t.findElements(this.el,".fc-row").filter(function(e){return!a.scroller.el.contains(e)});this.timeGrid.bottomRuleEl.style.display="none",this.scroller.clear(),l.forEach(t.uncompensateScroll),this.dayGrid&&(this.dayGrid.removeSegPopover(),(n=this.opt("eventLimit"))&&"number"!=typeof n&&(n=5),n&&this.dayGrid.limitRows(n)),i||(o=this.computeScrollerHeight(r),this.scroller.setHeight(o),((s=this.scroller.getScrollbarWidths()).left||s.right)&&(l.forEach(function(e){t.compensateScroll(e,s)}),o=this.computeScrollerHeight(r),this.scroller.setHeight(o)),this.scroller.lockOverflow(s),this.timeGrid.getTotalSlatHeight()<o&&(this.timeGrid.bottomRuleEl.style.display=""))}else i||(o=this.computeScrollerHeight(r),this.scroller.setHeight(o))},i.prototype.computeScrollerHeight=function(e){return e-t.subtractInnerElHeight(this.el,this.scroller.el)},i.prototype.computeDateScroll=function(e){var t=this.timeGrid.computeTimeTop(e);return(t=Math.ceil(t))&&t++,{top:t}},i.prototype.queryDateScroll=function(){return{top:this.scroller.getScrollTop()}},i.prototype.applyDateScroll=function(e){void 0!==e.top&&this.scroller.setScrollTop(e.top)},i.prototype.axisStyleAttr=function(){return null!=this.axisWidth?'style="width:'+this.axisWidth+'px"':""},i}(t.View);m.prototype.usesMinMaxTime=!0;var y=function(e){function r(r,i){var n=e.call(this,r,i.el)||this;return n.buildDayRanges=t.memoize(v),n.slicer=new S,n.timeGrid=i,r.calendar.registerInteractiveComponent(n,{el:n.timeGrid.el}),n}return n(r,e),r.prototype.destroy=function(){e.prototype.destroy.call(this),this.calendar.unregisterInteractiveComponent(this)},r.prototype.render=function(e){var t=e.dateProfile,r=e.dayTable,i=this.dayRanges=this.buildDayRanges(r,t,this.dateEnv);this.timeGrid.receiveProps(o({},this.slicer.sliceProps(e,t,null,this.timeGrid,i),{dateProfile:t,cells:r.cells[0]}))},r.prototype.renderNowIndicator=function(e){this.timeGrid.renderNowIndicator(this.slicer.sliceNowDate(e,this.timeGrid,this.dayRanges),e)},r.prototype.buildPositionCaches=function(){this.timeGrid.buildPositionCaches()},r.prototype.queryHit=function(e,t){var r=this.timeGrid.positionToHit(e,t);if(r)return{component:this.timeGrid,dateSpan:r.dateSpan,dayEl:r.dayEl,rect:{left:r.relativeRect.left,right:r.relativeRect.right,top:r.relativeRect.top,bottom:r.relativeRect.bottom},layer:0}},r}(t.DateComponent);function v(e,t,r){for(var i=[],n=0,o=e.headerDates;n<o.length;n++){var s=o[n];i.push({start:r.add(s,t.minTime),end:r.add(s,t.maxTime)})}return i}var S=function(e){function r(){return null!==e&&e.apply(this,arguments)||this}return n(r,e),r.prototype.sliceRange=function(e,r){for(var i=[],n=0;n<r.length;n++){var o=t.intersectRanges(e,r[n]);o&&i.push({start:o.start,end:o.end,isStart:o.start.valueOf()===e.start.valueOf(),isEnd:o.end.valueOf()===e.end.valueOf(),col:n})}return i},r}(t.Slicer),C=function(e){function i(i,n,o,s){var a=e.call(this,i,n,o,s)||this;return a.buildDayTable=t.memoize(E),a.opt("columnHeader")&&(a.header=new t.DayHeader(a.context,a.el.querySelector(".fc-head-container"))),a.simpleTimeGrid=new y(a.context,a.timeGrid),a.dayGrid&&(a.simpleDayGrid=new r.SimpleDayGrid(a.context,a.dayGrid)),a}return n(i,e),i.prototype.destroy=function(){e.prototype.destroy.call(this),this.header&&this.header.destroy(),this.simpleTimeGrid.destroy(),this.simpleDayGrid&&this.simpleDayGrid.destroy()},i.prototype.render=function(t){e.prototype.render.call(this,t);var r=this.props.dateProfile,i=this.buildDayTable(r,this.dateProfileGenerator),n=this.splitter.splitProps(t);this.header&&this.header.receiveProps({dateProfile:r,dates:i.headerDates,datesRepDistinctDays:!0,renderIntroHtml:this.renderHeadIntroHtml}),this.simpleTimeGrid.receiveProps(o({},n.timed,{dateProfile:r,dayTable:i})),this.simpleDayGrid&&this.simpleDayGrid.receiveProps(o({},n.allDay,{dateProfile:r,dayTable:i,nextDayThreshold:this.nextDayThreshold,isRigid:!1}))},i.prototype.renderNowIndicator=function(e){this.simpleTimeGrid.renderNowIndicator(e)},i}(m);function E(e,r){var i=new t.DaySeries(e.renderRange,r);return new t.DayTable(i,!1)}var b=t.createPlugin({defaultView:"timeGridWeek",views:{timeGrid:{class:C,allDaySlot:!0,slotDuration:"00:30:00",slotEventOverlap:!0},timeGridDay:{type:"timeGrid",duration:{days:1}},timeGridWeek:{type:"timeGrid",duration:{weeks:1}}}});e.AbstractTimeGridView=m,e.TimeGrid=p,e.TimeGridSlicer=S,e.TimeGridView=C,e.buildDayRanges=v,e.buildDayTable=E,e.default=b,Object.defineProperty(e,"__esModule",{value:!0})});
\ No newline at end of file
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/timegrid/package.json b/AKPlan/static/AKPlan/vendor/fullcalendar/timegrid/package.json
deleted file mode 100644
index 9226f35056822412bfffc445bb05596e26de2fb6..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/timegrid/package.json
+++ /dev/null
@@ -1,36 +0,0 @@
-{
-  "name": "@fullcalendar/timegrid",
-  "version": "4.3.0",
-  "title": "FullCalendar Time Grid Plugin",
-  "description": "Display your events on a grid of time slots",
-  "keywords": [
-    "calendar",
-    "event",
-    "full-sized"
-  ],
-  "homepage": "https://fullcalendar.io/",
-  "docs": "https://fullcalendar.io/docs/timegrid-view",
-  "bugs": "https://fullcalendar.io/reporting-bugs",
-  "repository": {
-    "type": "git",
-    "url": "https://github.com/fullcalendar/fullcalendar.git",
-    "homepage": "https://github.com/fullcalendar/fullcalendar"
-  },
-  "license": "MIT",
-  "author": {
-    "name": "Adam Shaw",
-    "email": "arshaw@arshaw.com",
-    "url": "http://arshaw.com/"
-  },
-  "copyright": "2019 Adam Shaw",
-  "dependencies": {
-    "@fullcalendar/daygrid": "~4.3.0"
-  },
-  "peerDependencies": {
-    "@fullcalendar/core": "~4.3.0"
-  },
-  "main": "main.js",
-  "module": "main.esm.js",
-  "unpkg": "main.min.js",
-  "types": "main.d.ts"
-}
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/timeline/LICENSE.md b/AKPlan/static/AKPlan/vendor/fullcalendar/timeline/LICENSE.md
deleted file mode 100644
index 52296639f8117dd1cd8c5a9e629fed87e5b32cfc..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/timeline/LICENSE.md
+++ /dev/null
@@ -1,18 +0,0 @@
-
-For complete licensing information, visit:
-http://fullcalendar.io/scheduler/license
-
-FullCalendar Scheduler is tri-licensed, meaning you must choose
-one of three licenses to use. Here is a summary of those licenses:
-
-- Commercial License
-  (a paid license, meant for commercial use)
-  http://fullcalendar.io/scheduler/license-details
-
-- Creative Commons Non-Commercial No-Derivatives
-  (meant for trial and non-commercial use)
-  https://creativecommons.org/licenses/by-nc-nd/4.0/
-
-- GPLv3 License
-  (meant for open-source projects)
-  http://www.gnu.org/licenses/gpl-3.0.en.html
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/timeline/README.md b/AKPlan/static/AKPlan/vendor/fullcalendar/timeline/README.md
deleted file mode 100644
index ade1cab521515d4f22d7d5c2b05c38685af893c5..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/timeline/README.md
+++ /dev/null
@@ -1,8 +0,0 @@
-
-# FullCalendar Timeline Plugin
-
-Display events on a horizontal time axis (without resources)
-
-[View the docs &raquo;](https://fullcalendar.io/docs/timeline-view-no-resources)
-
-This package was created from the [FullCalendar monorepo &raquo;](https://github.com/fullcalendar/fullcalendar-scheduler)
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/timeline/main.css b/AKPlan/static/AKPlan/vendor/fullcalendar/timeline/main.css
deleted file mode 100644
index 69f5999c6d35f9a078fde0eb4a499c42bb5bf598..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/timeline/main.css
+++ /dev/null
@@ -1,351 +0,0 @@
-/* Scroller
---------------------------------------------------------------------------------------------------*/
-.fc-scroller-clip {
-  overflow: hidden;
-  /* for clipping scrollbars */
-  position: relative;
-  /* so things like scrollfollowers can attach to this */
-}
-
-/* supresses rendering of native scrollbars */
-/* on .fc-scroller */
-.fc-no-scrollbars {
-  background: rgba(255, 255, 255, 0);
-  /* hack for dynamic DOM nodes (in Chrome OSX at least) */
-}
-
-.fc-no-scrollbars::-webkit-scrollbar {
-  width: 0;
-  height: 0;
-}
-
-.fc-scroller-canvas {
-  position: relative;
-  /* origin for bg */
-  box-sizing: border-box;
-  /* so that padding (for gutter) will be part of height */
-  min-height: 100%;
-}
-
-.fc-scroller-canvas > .fc-bg {
-  z-index: 1;
-  /* make default? */
-}
-
-.fc-scroller-canvas > .fc-content {
-  z-index: 2;
-  /* make default? */
-  position: relative;
-  /* origin for inner content */
-  border-style: solid;
-  border-width: 0;
-}
-
-.fc-scroller-canvas.fc-gutter-left > .fc-content {
-  border-left-width: 1px;
-  margin-left: -1px;
-}
-
-.fc-scroller-canvas.fc-gutter-right > .fc-content {
-  border-right-width: 1px;
-  margin-right: -1px;
-}
-
-.fc-scroller-canvas.fc-gutter-top > .fc-content {
-  border-top-width: 1px;
-  margin-top: -1px;
-}
-
-/* content is responsible for bottom border */
-/* View Structure
---------------------------------------------------------------------------------------------------*/
-.fc-rtl .fc-timeline {
-  direction: rtl;
-}
-
-.fc-scrolled .fc-head .fc-scroller {
-  z-index: 2;
-  /* so drop shadow will go above body panes */
-}
-
-.fc-timeline.fc-scrolled .fc-head .fc-scroller {
-  box-shadow: 0 3px 4px rgba(0, 0, 0, 0.075);
-}
-
-.fc-timeline .fc-body .fc-scroller {
-  z-index: 1;
-}
-
-/*
-on most tables that expand to the edges, kill the outer border,
-because the container elements take care of it.
-example tables:
-.fc-scroller-canvas .fc-content table
-.fc-scroller-canvas .fc-bg .fc-slats table
-*/
-.fc-timeline .fc-scroller-canvas > div > table,
-.fc-timeline .fc-scroller-canvas > div > div > table {
-  border-style: hidden;
-}
-
-/*
-for resource rows (in both the spreadsheet and timeline areas),
-undo previous rule in order to always show last border.
-*/
-.fc-timeline .fc-scroller-canvas > .fc-content > .fc-rows > table {
-  border-bottom-style: none;
-}
-
-/* Table Cell Common
---------------------------------------------------------------------------------------------------*/
-.fc-timeline th,
-.fc-timeline td {
-  white-space: nowrap;
-}
-
-.fc-timeline .fc-cell-content {
-  overflow: hidden;
-}
-
-.fc-timeline .fc-cell-text {
-  display: inline-block;
-  padding-left: 4px;
-  padding-right: 4px;
-}
-
-/*
-Cells at the start of a week
-TODO: figure out better styling
-
-.fc-ltr .fc-timeline .fc-em-cell div {
-  border-left: 3px solid #eee;
-  height: 100%;
-}
-.fc-rtl .fc-timeline .fc-em-cell {
-  border-right-width: 3px;
-}
-*/
-/* head */
-.fc-timeline th {
-  vertical-align: middle;
-}
-
-.fc-timeline .fc-head .fc-cell-content {
-  padding-top: 3px;
-  padding-bottom: 3px;
-}
-
-.fc-timeline .fc-head .fc-time-area .fc-cell-content {
-  overflow: visible;
-}
-
-/* Time Area
---------------------------------------------------------------------------------------------------*/
-.fc-time-area col {
-  min-width: 2.2em;
-  /* detected by JS */
-}
-
-/* head */
-.fc-ltr .fc-time-area .fc-chrono th {
-  text-align: left;
-}
-
-.fc-rtl .fc-time-area .fc-chrono th {
-  text-align: right;
-}
-
-/* body slats (vertical lines) */
-.fc-time-area .fc-slats {
-  /* fc-bg is responsible for a lot of this now! */
-  position: absolute;
-  z-index: 1;
-  top: 0;
-  left: 0;
-  right: 0;
-  bottom: 0;
-}
-
-.fc-time-area .fc-slats table {
-  height: 100%;
-}
-
-.fc-time-area .fc-slats .fc-minor {
-  border-style: dotted;
-}
-
-.fc-time-area .fc-slats td {
-  border-width: 0 1px;
-  /* need to do this. sometimes -1 margin wouldn't hide the dotted */
-}
-
-.fc-ltr .fc-time-area .fc-slats td {
-  border-right-width: 0;
-}
-
-.fc-rtl .fc-time-area .fc-slats td {
-  border-left-width: 0;
-}
-
-/* body content containers
-   can be within rows or directly within the pane's content
-*/
-.fc-time-area .fc-bgevent-container,
-.fc-time-area .fc-highlight-container {
-  position: absolute;
-  z-index: 2;
-  /* only for directly within pane. not for row. overridden later */
-  top: 0;
-  bottom: 0;
-  width: 0;
-}
-
-.fc-ltr .fc-time-area .fc-mirror-container,
-.fc-ltr .fc-time-area .fc-bgevent-container,
-.fc-ltr .fc-time-area .fc-highlight-container {
-  left: 0;
-}
-
-.fc-rtl .fc-time-area .fc-mirror-container,
-.fc-rtl .fc-time-area .fc-bgevent-container,
-.fc-rtl .fc-time-area .fc-highlight-container {
-  right: 0;
-}
-
-.fc-time-area .fc-bgevent,
-.fc-time-area .fc-highlight {
-  position: absolute;
-  top: 0;
-  bottom: 0;
-}
-
-/* Now Indicator
---------------------------------------------------------------------------------------------------*/
-.fc-timeline .fc-now-indicator {
-  /* both the arrow and the line */
-  z-index: 3;
-  /* one above scroller's fc-content */
-  top: 0;
-}
-
-.fc-time-area .fc-now-indicator-arrow {
-  margin: 0 -6px;
-  /* 5, then one more to counteract scroller's negative margins */
-  /* triangle pointing down... */
-  border-width: 6px 5px 0 5px;
-  border-left-color: transparent;
-  border-right-color: transparent;
-}
-
-.fc-time-area .fc-now-indicator-line {
-  margin: 0 -1px;
-  /* counteract scroller's negative margins */
-  bottom: 0;
-  border-left-width: 1px;
-}
-
-/* Event Container
---------------------------------------------------------------------------------------------------*/
-.fc-time-area .fc-event-container {
-  position: relative;
-  z-index: 2;
-  /* above bgevent and highlight */
-  width: 0;
-  /* for event positioning. will end up on correct side based on dir */
-}
-
-.fc-time-area .fc-mirror-container {
-  /* also an fc-event-container */
-  position: absolute;
-  z-index: 3;
-  top: 0;
-}
-
-.fc-time-area .fc-event-container {
-  padding-bottom: 8px;
-  top: -1px;
-}
-
-.fc-time-area tr:first-child .fc-event-container {
-  top: 0;
-}
-
-.fc-no-overlap .fc-time-area .fc-event-container {
-  padding-bottom: 0;
-  top: 0;
-}
-
-/* Time Grid Events
---------------------------------------------------------------------------------------------------*/
-.fc-timeline-event {
-  position: absolute;
-  display: flex;
-  border-radius: 0;
-  padding: 2px 1px;
-  margin-bottom: 1px;
-}
-
-.fc-no-overlap .fc-timeline-event {
-  padding-top: 5px;
-  padding-bottom: 5px;
-  margin-bottom: 0;
-}
-
-.fc-ltr .fc-timeline-event {
-  flex-direction: row;
-  margin-right: 1px;
-}
-
-.fc-rtl .fc-timeline-event {
-  margin-left: 1px;
-}
-
-.fc-timeline-event .fc-time-wrap {
-  flex-shrink: 0;
-  min-width: 0;
-}
-
-.fc-timeline-event .fc-title-wrap {
-  flex-grow: 1;
-  min-width: 0;
-}
-
-.fc-timeline-event .fc-time,
-.fc-timeline-event .fc-title {
-  display: inline-block;
-  vertical-align: top;
-  max-width: 100%;
-  padding: 0 2px;
-  -webkit-box-sizing: border-box;
-  -moz-box-sizing: border-box;
-  box-sizing: border-box;
-  white-space: nowrap;
-  overflow: hidden;
-}
-
-.fc-timeline-event .fc-time {
-  font-weight: bold;
-}
-
-.fc-timeline-event.fc-not-start:before,
-.fc-timeline-event.fc-not-end:after {
-  content: "";
-  align-self: center;
-  width: 0;
-  height: 0;
-  margin: 0 1px;
-  border: 5px solid #000;
-  border-top-color: transparent;
-  border-bottom-color: transparent;
-  opacity: 0.5;
-}
-
-.fc-ltr .fc-timeline-event.fc-not-start:before,
-.fc-rtl .fc-timeline-event.fc-not-end:after {
-  border-left: 0;
-}
-
-.fc-ltr .fc-timeline-event.fc-not-end:after,
-.fc-rtl .fc-timeline-event.fc-not-start:before {
-  border-right: 0;
-}
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/timeline/main.d.ts b/AKPlan/static/AKPlan/vendor/fullcalendar/timeline/main.d.ts
deleted file mode 100644
index 4fb92851528543fb400010f249b5edb4339066b5..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/timeline/main.d.ts
+++ /dev/null
@@ -1,390 +0,0 @@
-// Generated by dts-bundle v0.7.3-fork.1
-// Dependencies for this module:
-//   ../../../../../@fullcalendar/core
-
-declare module '@fullcalendar/timeline' {
-    import TimelineView from '@fullcalendar/timeline/TimelineView';
-    export { TimelineView };
-    export { default as TimelineLane } from '@fullcalendar/timeline/TimelineLane';
-    export { default as ScrollJoiner } from '@fullcalendar/timeline/util/ScrollJoiner';
-    export { default as StickyScroller } from '@fullcalendar/timeline/util/StickyScroller';
-    export { default as TimeAxis } from '@fullcalendar/timeline/TimeAxis';
-    export { default as HeaderBodyLayout } from '@fullcalendar/timeline/HeaderBodyLayout';
-    const _default: import("@fullcalendar/core").PluginDef;
-    export default _default;
-}
-
-declare module '@fullcalendar/timeline/TimelineView' {
-    import {
-        ComponentContext,
-        DateProfile,
-        DateProfileGenerator,
-        Duration,
-        Hit,
-        View,
-        ViewProps,
-        ViewSpec
-    } from '@fullcalendar/core';
-    import TimeAxis from '@fullcalendar/timeline/TimeAxis';
-    import TimelineLane from '@fullcalendar/timeline/TimelineLane';
-    export {TimelineView as default, TimelineView};
-
-    class TimelineView extends View {
-        timeAxis: TimeAxis;
-        lane: TimelineLane;
-
-        constructor(context: ComponentContext, viewSpec: ViewSpec, dateProfileGenerator: DateProfileGenerator, parentEl: HTMLElement);
-
-        destroy(): void;
-
-        renderSkeletonHtml(): string;
-
-        render(props: ViewProps): void;
-        updateSize(isResize: any, totalHeight: any, isAuto: any): void;
-        getNowIndicatorUnit(dateProfile: DateProfile): string;
-        renderNowIndicator(date: any): void;
-        unrenderNowIndicator(): void;
-        computeDateScroll(duration: Duration): {
-            left: number;
-        };
-        applyScroll(scroll: any, isResize: any): void;
-        applyDateScroll(scroll: any): void;
-        queryScroll(): {
-            top: number;
-            left: number;
-        };
-        buildPositionCaches(): void;
-        queryHit(positionLeft: number, positionTop: number, elWidth: number, elHeight: number): Hit;
-    }
-}
-
-declare module '@fullcalendar/timeline/TimelineLane' {
-    import {
-        ComponentContext,
-        DateComponent,
-        DateMarker,
-        DateProfile,
-        DateSpan,
-        Duration,
-        EventInteractionState,
-        EventSegUiInteractionState,
-        EventStore,
-        EventUiHash,
-        Seg
-    } from '@fullcalendar/core';
-    import TimeAxis from '@fullcalendar/timeline/TimeAxis';
-
-    export interface TimelineLaneSeg extends Seg {
-        start: DateMarker;
-        end: DateMarker;
-    }
-
-    export interface TimelineLaneProps {
-        dateProfile: DateProfile;
-        nextDayThreshold: Duration;
-        businessHours: EventStore | null;
-        eventStore: EventStore | null;
-        eventUiBases: EventUiHash;
-        dateSelection: DateSpan | null;
-        eventSelection: string;
-        eventDrag: EventInteractionState | null;
-        eventResize: EventInteractionState | null;
-    }
-    export { TimelineLane as default, TimelineLane };
-    class TimelineLane extends DateComponent<TimelineLaneProps> {
-        timeAxis: TimeAxis;
-        constructor(context: ComponentContext, fgContainerEl: HTMLElement, bgContainerEl: HTMLElement, timeAxis: TimeAxis);
-        render(props: TimelineLaneProps): void;
-        destroy(): void;
-        _renderEventDrag(state: EventSegUiInteractionState): void;
-        _unrenderEventDrag(state: EventSegUiInteractionState): void;
-        _renderEventResize(state: EventSegUiInteractionState): void;
-        _unrenderEventResize(state: EventSegUiInteractionState): void;
-        updateSize(isResize: boolean): void;
-    }
-}
-
-declare module '@fullcalendar/timeline/util/ScrollJoiner' {
-    import ClippedScroller from '@fullcalendar/timeline/util/ClippedScroller';
-    export { ScrollJoiner as default, ScrollJoiner };
-    class ScrollJoiner {
-        axis: any;
-        scrollers: ClippedScroller[];
-        masterScroller: ClippedScroller;
-        constructor(axis: any, scrollers: ClippedScroller[]);
-        initScroller(scroller: ClippedScroller): void;
-        assignMasterScroller(scroller: any): void;
-        unassignMasterScroller(): void;
-        update(): void;
-    }
-}
-
-declare module '@fullcalendar/timeline/util/StickyScroller' {
-    import {Point, Rect} from '@fullcalendar/core';
-    import EnhancedScroller from '@fullcalendar/timeline/util/EnhancedScroller';
-
-    interface ElementGeom {
-        parentBound: Rect;
-        naturalBound: Rect | null;
-        elWidth: number;
-        elHeight: number;
-        computedTextAlign: string;
-        intendedTextAlign: string;
-    }
-    export { StickyScroller as default, StickyScroller };
-    class StickyScroller {
-        scroller: EnhancedScroller;
-        usingRelative: boolean | null;
-        constructor(scroller: EnhancedScroller, isRtl: boolean, isVertical: boolean);
-        destroy(): void;
-        updateSize: () => void;
-        queryElGeoms(els: HTMLElement[]): ElementGeom[];
-        computeElDestinations(elGeoms: ElementGeom[], viewportWidth: number): Point[];
-    }
-    export {};
-}
-
-declare module '@fullcalendar/timeline/TimeAxis' {
-    import {Component, ComponentContext, DateMarker, DateProfile, Duration} from '@fullcalendar/core';
-    import HeaderBodyLayout from '@fullcalendar/timeline/HeaderBodyLayout';
-    import TimelineHeader from '@fullcalendar/timeline/TimelineHeader';
-    import TimelineSlats from '@fullcalendar/timeline/TimelineSlats';
-    import {TimelineDateProfile} from '@fullcalendar/timeline/timeline-date-profile';
-    import TimelineNowIndicator from '@fullcalendar/timeline/TimelineNowIndicator';
-    import StickyScroller from '@fullcalendar/timeline/util/StickyScroller';
-
-    export interface TimeAxisProps {
-        dateProfile: DateProfile;
-    }
-    export { TimeAxis as default, TimeAxis };
-    class TimeAxis extends Component<TimeAxisProps> {
-        layout: HeaderBodyLayout;
-        header: TimelineHeader;
-        slats: TimelineSlats;
-        nowIndicator: TimelineNowIndicator;
-        headStickyScroller: StickyScroller;
-        bodyStickyScroller: StickyScroller;
-        tDateProfile: TimelineDateProfile;
-        constructor(context: ComponentContext, headerContainerEl: any, bodyContainerEl: any);
-        destroy(): void;
-        render(props: TimeAxisProps): void;
-        getNowIndicatorUnit(dateProfile: DateProfile): string;
-        renderNowIndicator(date: any): void;
-        unrenderNowIndicator(): void;
-        updateSize(isResize: any, totalHeight: any, isAuto: any): void;
-        updateStickyScrollers(): void;
-        computeSlotWidth(): any;
-        computeDefaultSlotWidth(tDateProfile: any): number;
-        applySlotWidth(slotWidth: number | string): void;
-        computeDateSnapCoverage(date: DateMarker): number;
-        dateToCoord(date: any): any;
-        rangeToCoords(range: any): {
-            right: any;
-            left: any;
-        };
-        computeDateScroll(duration: Duration): {
-            left: number;
-        };
-        queryDateScroll(): {
-            left: number;
-        };
-        applyDateScroll(scroll: any): void;
-    }
-}
-
-declare module '@fullcalendar/timeline/HeaderBodyLayout' {
-    import ClippedScroller from '@fullcalendar/timeline/util/ClippedScroller';
-    import ScrollJoiner from '@fullcalendar/timeline/util/ScrollJoiner';
-    export { HeaderBodyLayout as default, HeaderBodyLayout };
-    class HeaderBodyLayout {
-        headerScroller: ClippedScroller;
-        bodyScroller: ClippedScroller;
-        scrollJoiner: ScrollJoiner;
-        constructor(headerContainerEl: any, bodyContainerEl: any, verticalScroll: any);
-        destroy(): void;
-        setHeight(totalHeight: any, isAuto: any): void;
-        queryHeadHeight(): number;
-    }
-}
-
-declare module '@fullcalendar/timeline/util/ClippedScroller' {
-    import {ScrollbarWidths} from '@fullcalendar/core';
-    import EnhancedScroller from '@fullcalendar/timeline/util/EnhancedScroller';
-    export { ClippedScroller as default, ClippedScroller };
-    class ClippedScroller {
-        el: HTMLElement;
-        enhancedScroll: EnhancedScroller;
-        isHScrollbarsClipped: boolean;
-        isVScrollbarsClipped: boolean;
-        constructor(overflowX: string, overflowY: string, parentEl: HTMLElement);
-        destroy(): void;
-        updateSize(): void;
-        setHeight(height: number | string): void;
-        getScrollbarWidths(): ScrollbarWidths;
-    }
-}
-
-declare module '@fullcalendar/timeline/util/EnhancedScroller' {
-    import {EmitterInterface, ScrollComponent} from '@fullcalendar/core';
-    import ScrollerCanvas from '@fullcalendar/timeline/util/ScrollerCanvas';
-    export { EnhancedScroller as default, EnhancedScroller };
-    class EnhancedScroller extends ScrollComponent {
-        on: EmitterInterface['on'];
-        one: EmitterInterface['one'];
-        off: EmitterInterface['off'];
-        trigger: EmitterInterface['trigger'];
-        triggerWith: EmitterInterface['triggerWith'];
-        hasHandlers: EmitterInterface['hasHandlers'];
-        canvas: ScrollerCanvas;
-        isScrolling: boolean;
-        isTouching: boolean;
-        isMoving: boolean;
-        isTouchScrollEnabled: boolean;
-        preventTouchScrollHandler: any;
-        requestMovingEnd: any;
-        constructor(overflowX: string, overflowY: string);
-        destroy(): void;
-        disableTouchScroll(): void;
-        enableTouchScroll(): void;
-        bindPreventTouchScroll(): void;
-        unbindPreventTouchScroll(): void;
-        bindHandlers(): void;
-        unbindHandlers(): void;
-        reportScroll: () => void;
-        reportScrollStart: () => void;
-        reportMovingEnd(): void;
-        reportScrollEnd(): void;
-        reportTouchStart: () => void;
-        reportTouchEnd: () => void;
-        getScrollLeft(): number;
-        setScrollLeft(val: any): void;
-        getScrollFromLeft(): number;
-    }
-}
-
-declare module '@fullcalendar/timeline/TimelineHeader' {
-    import {Component, ComponentContext, DateProfile} from '@fullcalendar/core';
-    import {TimelineDateProfile} from '@fullcalendar/timeline/timeline-date-profile';
-
-    export interface TimelineHeaderProps {
-        dateProfile: DateProfile;
-        tDateProfile: TimelineDateProfile;
-    }
-
-    export {TimelineHeader as default, TimelineHeader};
-
-    class TimelineHeader extends Component<TimelineHeaderProps> {
-        tableEl: HTMLElement;
-        slatColEls: HTMLElement[];
-        innerEls: HTMLElement[];
-        constructor(context: ComponentContext, parentEl: HTMLElement);
-        destroy(): void;
-        render(props: TimelineHeaderProps): void;
-        renderDates(tDateProfile: TimelineDateProfile): void;
-    }
-}
-
-declare module '@fullcalendar/timeline/TimelineSlats' {
-    import {Component, ComponentContext, DateProfile, PositionCache} from '@fullcalendar/core';
-    import {TimelineDateProfile} from '@fullcalendar/timeline/timeline-date-profile';
-
-    export interface TimelineSlatsProps {
-        dateProfile: DateProfile;
-        tDateProfile: TimelineDateProfile;
-    }
-
-    export {TimelineSlats as default, TimelineSlats};
-
-    class TimelineSlats extends Component<TimelineSlatsProps> {
-        el: HTMLElement;
-        slatColEls: HTMLElement[];
-        slatEls: HTMLElement[];
-        outerCoordCache: PositionCache;
-        innerCoordCache: PositionCache;
-        constructor(context: ComponentContext, parentEl: HTMLElement);
-        destroy(): void;
-        render(props: TimelineSlatsProps): void;
-        renderDates(tDateProfile: TimelineDateProfile): void;
-        slatCellHtml(date: any, isEm: any, tDateProfile: TimelineDateProfile): string;
-        updateSize(): void;
-        positionToHit(leftPosition: any): {
-            dateSpan: {
-                range: {
-                    start: Date;
-                    end: Date;
-                };
-                allDay: boolean;
-            };
-            dayEl: HTMLElement;
-            left: any;
-            right: any;
-        };
-    }
-}
-
-declare module '@fullcalendar/timeline/timeline-date-profile' {
-    import {DateEnv, DateMarker, DateProfile, DateRange, Duration, View} from '@fullcalendar/core';
-
-    export interface TimelineDateProfile {
-        labelInterval: Duration;
-        slotDuration: Duration;
-        headerFormats: any;
-        isTimeScale: boolean;
-        largeUnit: string;
-        emphasizeWeeks: boolean;
-        snapDuration: Duration;
-        snapsPerSlot: number;
-        normalizedRange: DateRange;
-        timeWindowMs: number;
-        slotDates: DateMarker[];
-        isWeekStarts: boolean[];
-        snapDiffToIndex: number[];
-        snapIndexToDiff: number[];
-        snapCnt: number;
-        slotCnt: number;
-        cellRows: TimelineHeaderCell[][];
-    }
-    export interface TimelineHeaderCell {
-        text: string;
-        spanHtml: string;
-        date: DateMarker;
-        colspan: number;
-        isWeekStart: boolean;
-    }
-    export function buildTimelineDateProfile(dateProfile: DateProfile, view: View): TimelineDateProfile;
-    export function normalizeDate(date: DateMarker, tDateProfile: TimelineDateProfile, dateEnv: DateEnv): DateMarker;
-    export function normalizeRange(range: DateRange, tDateProfile: TimelineDateProfile, dateEnv: DateEnv): DateRange;
-    export function isValidDate(date: DateMarker, tDateProfile: TimelineDateProfile, dateProfile: DateProfile, view: View): boolean;
-}
-
-declare module '@fullcalendar/timeline/TimelineNowIndicator' {
-    export { TimelineNowIndicator as default, TimelineNowIndicator };
-    class TimelineNowIndicator {
-        headParent: HTMLElement;
-        bodyParent: HTMLElement;
-        arrowEl: HTMLElement;
-        lineEl: HTMLElement;
-        constructor(headParent: HTMLElement, bodyParent: HTMLElement);
-        render(coord: number, isRtl: boolean): void;
-        unrender(): void;
-    }
-}
-
-declare module '@fullcalendar/timeline/util/ScrollerCanvas' {
-    export { ScrollerCanvas as default, ScrollerCanvas };
-    class ScrollerCanvas {
-        el: HTMLElement;
-        contentEl: HTMLElement;
-        bgEl: HTMLElement;
-        gutters: any;
-        width: any;
-        minWidth: any;
-        constructor();
-        setGutters(gutters: any): void;
-        setWidth(width: any): void;
-        setMinWidth(minWidth: any): void;
-        clearWidth(): void;
-        updateSize(): void;
-    }
-}
-
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/timeline/main.esm.js b/AKPlan/static/AKPlan/vendor/fullcalendar/timeline/main.esm.js
deleted file mode 100644
index 5b207e70f720c41d77897601244bbc9c749e8bdf..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/timeline/main.esm.js
+++ /dev/null
@@ -1,2031 +0,0 @@
-/*!
-FullCalendar Timeline Plugin v4.3.0
-Docs & License: https://fullcalendar.io/scheduler
-(c) 2019 Adam Shaw
-*/
-
-import {
-    addDays,
-    addMs,
-    applyStyle,
-    applyStyleProp,
-    asRoughMinutes,
-    asRoughMs,
-    asRoughSeconds,
-    buildGotoAnchorHtml,
-    Component,
-    computeEdges,
-    computeHeightAndMargins,
-    computeVisibleDayRange,
-    config,
-    createDuration,
-    createElement,
-    createFormatter,
-    createPlugin,
-    cssToStr,
-    DateComponent,
-    debounce,
-    diffWholeDays,
-    EmitterMixin,
-    FgEventRenderer,
-    FillRenderer,
-    findChildren,
-    findElements,
-    forceClassName,
-    getDayClasses,
-    greatestDurationDenominator,
-    htmlEscape,
-    htmlToElement,
-    intersectRanges,
-    isInt,
-    isSingleDay,
-    memoizeRendering,
-    multiplyDuration,
-    padStart,
-    PositionCache,
-    preventDefault,
-    rangeContainsMarker,
-    removeElement,
-    ScrollComponent,
-    Slicer,
-    startOfDay,
-    translateRect,
-    View,
-    wholeDivideDurations
-} from '@fullcalendar/core';
-
-/*! *****************************************************************************
-Copyright (c) Microsoft Corporation. All rights reserved.
-Licensed under the Apache License, Version 2.0 (the "License"); you may not use
-this file except in compliance with the License. You may obtain a copy of the
-License at http://www.apache.org/licenses/LICENSE-2.0
-
-THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
-WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
-MERCHANTABLITY OR NON-INFRINGEMENT.
-
-See the Apache Version 2.0 License for specific language governing permissions
-and limitations under the License.
-***************************************************************************** */
-/* global Reflect, Promise */
-
-var extendStatics = function(d, b) {
-    extendStatics = Object.setPrototypeOf ||
-        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-    return extendStatics(d, b);
-};
-
-function __extends(d, b) {
-    extendStatics(d, b);
-    function __() { this.constructor = d; }
-    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-}
-
-var __assign = function() {
-    __assign = Object.assign || function __assign(t) {
-        for (var s, i = 1, n = arguments.length; i < n; i++) {
-            s = arguments[i];
-            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
-        }
-        return t;
-    };
-    return __assign.apply(this, arguments);
-};
-
-/*
-A rectangular area of content that lives within a Scroller.
-Can have "gutters", areas of dead spacing around the perimeter.
-Also very useful for forcing a width, which a Scroller cannot do alone.
-Has a content area that lives above a background area.
-*/
-var ScrollerCanvas = /** @class */ (function () {
-    function ScrollerCanvas() {
-        this.gutters = {};
-        this.el = htmlToElement("<div class=\"fc-scroller-canvas\"> <div class=\"fc-content\"></div> <div class=\"fc-bg\"></div> </div>");
-        this.contentEl = this.el.querySelector('.fc-content');
-        this.bgEl = this.el.querySelector('.fc-bg');
-    }
-    /*
-    If falsy, resets all the gutters to 0
-    */
-    ScrollerCanvas.prototype.setGutters = function (gutters) {
-        if (!gutters) {
-            this.gutters = {};
-        }
-        else {
-            __assign(this.gutters, gutters);
-        }
-        this.updateSize();
-    };
-    ScrollerCanvas.prototype.setWidth = function (width) {
-        this.width = width;
-        this.updateSize();
-    };
-    ScrollerCanvas.prototype.setMinWidth = function (minWidth) {
-        this.minWidth = minWidth;
-        this.updateSize();
-    };
-    ScrollerCanvas.prototype.clearWidth = function () {
-        this.width = null;
-        this.minWidth = null;
-        this.updateSize();
-    };
-    ScrollerCanvas.prototype.updateSize = function () {
-        var _a = this, gutters = _a.gutters, el = _a.el;
-        // is border-box (width includes padding)
-        forceClassName(el, 'fc-gutter-left', gutters.left);
-        forceClassName(el, 'fc-gutter-right', gutters.right);
-        forceClassName(el, 'fc-gutter-top', gutters.top);
-        forceClassName(el, 'fc-gutter-bottom', gutters.bottom);
-        applyStyle(el, {
-            paddingLeft: gutters.left || '',
-            paddingRight: gutters.right || '',
-            paddingTop: gutters.top || '',
-            paddingBottom: gutters.bottom || '',
-            width: (this.width != null) ?
-                this.width + (gutters.left || 0) + (gutters.right || 0) :
-                '',
-            minWidth: (this.minWidth != null) ?
-                this.minWidth + (gutters.left || 0) + (gutters.right || 0) :
-                ''
-        });
-        applyStyle(this.bgEl, {
-            left: gutters.left || '',
-            right: gutters.right || '',
-            top: gutters.top || '',
-            bottom: gutters.bottom || ''
-        });
-    };
-    return ScrollerCanvas;
-}());
-
-var EnhancedScroller = /** @class */ (function (_super) {
-    __extends(EnhancedScroller, _super);
-    function EnhancedScroller(overflowX, overflowY) {
-        var _this = _super.call(this, overflowX, overflowY) || this;
-        // Scroll Events
-        // ----------------------------------------------------------------------------------------------
-        _this.reportScroll = function () {
-            if (!_this.isScrolling) {
-                _this.reportScrollStart();
-            }
-            _this.trigger('scroll');
-            _this.isMoving = true;
-            _this.requestMovingEnd();
-        };
-        _this.reportScrollStart = function () {
-            if (!_this.isScrolling) {
-                _this.isScrolling = true;
-                _this.trigger('scrollStart', _this.isTouching); // created in constructor
-            }
-        };
-        // Touch Events
-        // ----------------------------------------------------------------------------------------------
-        // will fire *before* the scroll event is fired
-        _this.reportTouchStart = function () {
-            _this.isTouching = true;
-        };
-        _this.reportTouchEnd = function () {
-            if (_this.isTouching) {
-                _this.isTouching = false;
-                // if touch scrolling was re-enabled during a recent touch scroll
-                // then unbind the handlers that are preventing it from happening.
-                if (_this.isTouchScrollEnabled) {
-                    _this.unbindPreventTouchScroll(); // won't do anything if not bound
-                }
-                // if the user ended their touch, and the scroll area wasn't moving,
-                // we consider this to be the end of the scroll.
-                if (!_this.isMoving) {
-                    _this.reportScrollEnd(); // won't fire if already ended
-                }
-            }
-        };
-        _this.isScrolling = false;
-        _this.isTouching = false;
-        _this.isMoving = false;
-        _this.isTouchScrollEnabled = true;
-        _this.requestMovingEnd = debounce(_this.reportMovingEnd, 500);
-        _this.canvas = new ScrollerCanvas();
-        _this.el.appendChild(_this.canvas.el);
-        _this.applyOverflow();
-        _this.bindHandlers();
-        return _this;
-    }
-    EnhancedScroller.prototype.destroy = function () {
-        _super.prototype.destroy.call(this);
-        this.unbindHandlers();
-    };
-    // Touch scroll prevention
-    // ----------------------------------------------------------------------------------------------
-    EnhancedScroller.prototype.disableTouchScroll = function () {
-        this.isTouchScrollEnabled = false;
-        this.bindPreventTouchScroll(); // will be unbound in enableTouchScroll or reportTouchEnd
-    };
-    EnhancedScroller.prototype.enableTouchScroll = function () {
-        this.isTouchScrollEnabled = true;
-        // only immediately unbind if a touch event is NOT in progress.
-        // otherwise, it will be handled by reportTouchEnd.
-        if (!this.isTouching) {
-            this.unbindPreventTouchScroll();
-        }
-    };
-    EnhancedScroller.prototype.bindPreventTouchScroll = function () {
-        if (!this.preventTouchScrollHandler) {
-            this.el.addEventListener('touchmove', (this.preventTouchScrollHandler = preventDefault));
-        }
-    };
-    EnhancedScroller.prototype.unbindPreventTouchScroll = function () {
-        if (this.preventTouchScrollHandler) {
-            this.el.removeEventListener('touchmove', this.preventTouchScrollHandler);
-            this.preventTouchScrollHandler = null;
-        }
-    };
-    // Handlers
-    // ----------------------------------------------------------------------------------------------
-    EnhancedScroller.prototype.bindHandlers = function () {
-        this.el.addEventListener('scroll', this.reportScroll);
-        this.el.addEventListener('touchstart', this.reportTouchStart, { passive: true });
-        this.el.addEventListener('touchend', this.reportTouchEnd);
-    };
-    EnhancedScroller.prototype.unbindHandlers = function () {
-        this.el.removeEventListener('scroll', this.reportScroll);
-        this.el.removeEventListener('touchstart', this.reportTouchStart, { passive: true });
-        this.el.removeEventListener('touchend', this.reportTouchEnd);
-    };
-    EnhancedScroller.prototype.reportMovingEnd = function () {
-        this.isMoving = false;
-        // only end the scroll if not currently touching.
-        // if touching, the scrolling will end later, on touchend.
-        if (!this.isTouching) {
-            this.reportScrollEnd();
-        }
-    };
-    EnhancedScroller.prototype.reportScrollEnd = function () {
-        if (this.isScrolling) {
-            this.trigger('scrollEnd');
-            this.isScrolling = false;
-        }
-    };
-    // Horizontal Scroll Normalization
-    // ----------------------------------------------------------------------------------------------
-    // http://stackoverflow.com/questions/24276619/better-way-to-get-the-viewport-of-a-scrollable-div-in-rtl-mode/24394376#24394376
-    // TODO: move all this to util functions
-    /*
-    If RTL, and scrolled to the left, returns NEGATIVE value (like Firefox)
-    */
-    EnhancedScroller.prototype.getScrollLeft = function () {
-        var el = this.el;
-        var direction = window.getComputedStyle(el).direction;
-        var val = el.scrollLeft;
-        if (direction === 'rtl') {
-            switch (getRtlScrollSystem()) {
-                case 'positive':
-                    val = (val + el.clientWidth) - el.scrollWidth;
-                    break;
-                case 'reverse':
-                    val = -val;
-                    break;
-            }
-        }
-        return val;
-    };
-    /*
-    Accepts a NEGATIVE value for when scrolled in RTL
-    */
-    EnhancedScroller.prototype.setScrollLeft = function (val) {
-        var el = this.el;
-        var direction = window.getComputedStyle(el).direction;
-        if (direction === 'rtl') {
-            switch (getRtlScrollSystem()) {
-                case 'positive':
-                    val = (val - el.clientWidth) + el.scrollWidth;
-                    break;
-                case 'reverse':
-                    val = -val;
-                    break;
-            }
-        }
-        el.scrollLeft = val;
-    };
-    /*
-    Always returns the number of pixels scrolled from the leftmost position (even if RTL).
-    Always positive.
-    */
-    EnhancedScroller.prototype.getScrollFromLeft = function () {
-        var el = this.el;
-        var direction = window.getComputedStyle(el).direction;
-        var val = el.scrollLeft;
-        if (direction === 'rtl') {
-            switch (getRtlScrollSystem()) {
-                case 'negative':
-                    val = (val - el.clientWidth) + el.scrollWidth;
-                    break;
-                case 'reverse':
-                    val = (-val - el.clientWidth) + el.scrollWidth;
-                    break;
-            }
-        }
-        return val;
-    };
-    return EnhancedScroller;
-}(ScrollComponent));
-EmitterMixin.mixInto(EnhancedScroller);
-// Horizontal Scroll System Detection
-// ----------------------------------------------------------------------------------------------
-var _rtlScrollSystem;
-function getRtlScrollSystem() {
-    return _rtlScrollSystem || (_rtlScrollSystem = detectRtlScrollSystem());
-}
-function detectRtlScrollSystem() {
-    var el = htmlToElement("<div style=\" position: absolute; top: -1000px; width: 1px; height: 1px; overflow: scroll; direction: rtl; font-size: 100px; \">A</div>");
-    document.body.appendChild(el);
-    var system;
-    if (el.scrollLeft > 0) {
-        system = 'positive';
-    }
-    else {
-        el.scrollLeft = 1;
-        if (el.scrollLeft > 0) {
-            system = 'reverse';
-        }
-        else {
-            system = 'negative';
-        }
-    }
-    removeElement(el);
-    return system;
-}
-
-/*
-A Scroller, but with a wrapping div that allows "clipping" away of native scrollbars,
-giving the appearance that there are no scrollbars.
-*/
-var ClippedScroller = /** @class */ (function () {
-    /*
-    Received overflows can be set to 'clipped', meaning scrollbars shouldn't be visible
-    to the user, but the area should still scroll.
-    */
-    function ClippedScroller(overflowX, overflowY, parentEl) {
-        this.isHScrollbarsClipped = false;
-        this.isVScrollbarsClipped = false;
-        if (overflowX === 'clipped-scroll') {
-            overflowX = 'scroll';
-            this.isHScrollbarsClipped = true;
-        }
-        if (overflowY === 'clipped-scroll') {
-            overflowY = 'scroll';
-            this.isVScrollbarsClipped = true;
-        }
-        this.enhancedScroll = new EnhancedScroller(overflowX, overflowY);
-        parentEl.appendChild(this.el = createElement('div', {
-            className: 'fc-scroller-clip'
-        }));
-        this.el.appendChild(this.enhancedScroll.el);
-    }
-    ClippedScroller.prototype.destroy = function () {
-        removeElement(this.el);
-    };
-    ClippedScroller.prototype.updateSize = function () {
-        var enhancedScroll = this.enhancedScroll;
-        var scrollEl = enhancedScroll.el;
-        var edges = computeEdges(scrollEl);
-        var cssProps = { marginLeft: 0, marginRight: 0, marginTop: 0, marginBottom: 0 };
-        // give the inner scrolling div negative margins so that its scrollbars
-        // are nudged outside of the bounding box of the wrapper, which is overflow:hidden
-        if (this.isVScrollbarsClipped) {
-            cssProps.marginLeft = -edges.scrollbarLeft;
-            cssProps.marginRight = -edges.scrollbarRight;
-        }
-        if (this.isHScrollbarsClipped) {
-            cssProps.marginBottom = -edges.scrollbarBottom;
-        }
-        applyStyle(scrollEl, cssProps);
-        // if we are attempting to hide the scrollbars offscreen, OSX/iOS will still
-        // display the floating scrollbars. attach a className to force-hide them.
-        if ((this.isHScrollbarsClipped || (enhancedScroll.overflowX === 'hidden')) && // should never show?
-            (this.isVScrollbarsClipped || (enhancedScroll.overflowY === 'hidden')) && // should never show?
-            !( // doesn't have any scrollbar mass
-            edges.scrollbarLeft ||
-                edges.scrollbarRight ||
-                edges.scrollbarBottom)) {
-            scrollEl.classList.add('fc-no-scrollbars');
-        }
-        else {
-            scrollEl.classList.remove('fc-no-scrollbars');
-        }
-    };
-    ClippedScroller.prototype.setHeight = function (height) {
-        this.enhancedScroll.setHeight(height);
-    };
-    /*
-    Accounts for 'clipped' scrollbars
-    */
-    ClippedScroller.prototype.getScrollbarWidths = function () {
-        var widths = this.enhancedScroll.getScrollbarWidths();
-        if (this.isVScrollbarsClipped) {
-            widths.left = 0;
-            widths.right = 0;
-        }
-        if (this.isHScrollbarsClipped) {
-            widths.bottom = 0;
-        }
-        return widths;
-    };
-    return ClippedScroller;
-}());
-
-var ScrollJoiner = /** @class */ (function () {
-    function ScrollJoiner(axis, scrollers) {
-        this.axis = axis;
-        this.scrollers = scrollers;
-        for (var _i = 0, _a = this.scrollers; _i < _a.length; _i++) {
-            var scroller = _a[_i];
-            this.initScroller(scroller);
-        }
-    }
-    ScrollJoiner.prototype.initScroller = function (scroller) {
-        var _this = this;
-        var enhancedScroll = scroller.enhancedScroll;
-        // when the user scrolls via mousewheel, we know for sure the target
-        // scroller should be the master. capture the various x-browser events that fire.
-        var onScroll = function () {
-            _this.assignMasterScroller(scroller);
-        };
-        'wheel mousewheel DomMouseScroll MozMousePixelScroll'.split(' ').forEach(function (evName) {
-            enhancedScroll.el.addEventListener(evName, onScroll);
-        });
-        enhancedScroll
-            .on('scrollStart', function () {
-            if (!_this.masterScroller) {
-                _this.assignMasterScroller(scroller);
-            }
-        })
-            .on('scroll', function () {
-            if (scroller === _this.masterScroller) {
-                for (var _i = 0, _a = _this.scrollers; _i < _a.length; _i++) {
-                    var otherScroller = _a[_i];
-                    if (otherScroller !== scroller) {
-                        switch (_this.axis) {
-                            case 'horizontal':
-                                otherScroller.enhancedScroll.el.scrollLeft = enhancedScroll.el.scrollLeft;
-                                break;
-                            case 'vertical':
-                                otherScroller.enhancedScroll.setScrollTop(enhancedScroll.getScrollTop());
-                                break;
-                        }
-                    }
-                }
-            }
-        })
-            .on('scrollEnd', function () {
-            if (scroller === _this.masterScroller) {
-                _this.unassignMasterScroller();
-            }
-        });
-    };
-    ScrollJoiner.prototype.assignMasterScroller = function (scroller) {
-        this.unassignMasterScroller();
-        this.masterScroller = scroller;
-        for (var _i = 0, _a = this.scrollers; _i < _a.length; _i++) {
-            var otherScroller = _a[_i];
-            if (otherScroller !== scroller) {
-                otherScroller.enhancedScroll.disableTouchScroll();
-            }
-        }
-    };
-    ScrollJoiner.prototype.unassignMasterScroller = function () {
-        if (this.masterScroller) {
-            for (var _i = 0, _a = this.scrollers; _i < _a.length; _i++) {
-                var otherScroller = _a[_i];
-                otherScroller.enhancedScroll.enableTouchScroll();
-            }
-            this.masterScroller = null;
-        }
-    };
-    ScrollJoiner.prototype.update = function () {
-        var allWidths = this.scrollers.map(function (scroller) { return scroller.getScrollbarWidths(); });
-        var maxLeft = 0;
-        var maxRight = 0;
-        var maxTop = 0;
-        var maxBottom = 0;
-        var widths;
-        var i;
-        for (var _i = 0, allWidths_1 = allWidths; _i < allWidths_1.length; _i++) {
-            widths = allWidths_1[_i];
-            maxLeft = Math.max(maxLeft, widths.left);
-            maxRight = Math.max(maxRight, widths.right);
-            maxTop = Math.max(maxTop, widths.top);
-            maxBottom = Math.max(maxBottom, widths.bottom);
-        }
-        for (i = 0; i < this.scrollers.length; i++) {
-            var scroller = this.scrollers[i];
-            widths = allWidths[i];
-            scroller.enhancedScroll.canvas.setGutters(this.axis === 'horizontal' ?
-                {
-                    left: maxLeft - widths.left,
-                    right: maxRight - widths.right
-                } :
-                {
-                    top: maxTop - widths.top,
-                    bottom: maxBottom - widths.bottom
-                });
-        }
-    };
-    return ScrollJoiner;
-}());
-
-var HeaderBodyLayout = /** @class */ (function () {
-    /*
-    verticalScroll = 'auto' | 'clipped-scroll'
-    */
-    function HeaderBodyLayout(headerContainerEl, bodyContainerEl, verticalScroll) {
-        this.headerScroller = new ClippedScroller('clipped-scroll', 'hidden', headerContainerEl);
-        this.bodyScroller = new ClippedScroller('auto', verticalScroll, bodyContainerEl);
-        this.scrollJoiner = new ScrollJoiner('horizontal', [
-            this.headerScroller,
-            this.bodyScroller
-        ]);
-    }
-    HeaderBodyLayout.prototype.destroy = function () {
-        this.headerScroller.destroy();
-        this.bodyScroller.destroy();
-    };
-    HeaderBodyLayout.prototype.setHeight = function (totalHeight, isAuto) {
-        var bodyHeight;
-        if (isAuto) {
-            bodyHeight = 'auto';
-        }
-        else {
-            bodyHeight = totalHeight - this.queryHeadHeight();
-        }
-        this.bodyScroller.setHeight(bodyHeight);
-        this.headerScroller.updateSize(); // adjusts gutters and classNames
-        this.bodyScroller.updateSize(); // adjusts gutters and classNames
-        this.scrollJoiner.update();
-    };
-    HeaderBodyLayout.prototype.queryHeadHeight = function () {
-        return this.headerScroller.enhancedScroll.canvas.contentEl.getBoundingClientRect().height;
-    };
-    return HeaderBodyLayout;
-}());
-
-var TimelineHeader = /** @class */ (function (_super) {
-    __extends(TimelineHeader, _super);
-    function TimelineHeader(context, parentEl) {
-        var _this = _super.call(this, context) || this;
-        parentEl.appendChild(_this.tableEl = createElement('table', {
-            className: _this.theme.getClass('tableGrid')
-        }));
-        return _this;
-    }
-    TimelineHeader.prototype.destroy = function () {
-        removeElement(this.tableEl);
-        _super.prototype.destroy.call(this);
-    };
-    TimelineHeader.prototype.render = function (props) {
-        this.renderDates(props.tDateProfile);
-    };
-    TimelineHeader.prototype.renderDates = function (tDateProfile) {
-        var _a = this, dateEnv = _a.dateEnv, theme = _a.theme;
-        var cellRows = tDateProfile.cellRows;
-        var lastRow = cellRows[cellRows.length - 1];
-        var isChrono = asRoughMs(tDateProfile.labelInterval) > asRoughMs(tDateProfile.slotDuration);
-        var oneDay = isSingleDay(tDateProfile.slotDuration);
-        var html = '<colgroup>';
-        // needs to be a col for each body slat. header cells will have colspans
-        for (var i = tDateProfile.slotCnt - 1; i >= 0; i--) {
-            html += '<col/>';
-        }
-        html += '</colgroup>';
-        html += '<tbody>';
-        for (var _i = 0, cellRows_1 = cellRows; _i < cellRows_1.length; _i++) {
-            var rowCells = cellRows_1[_i];
-            var isLast = rowCells === lastRow;
-            html += '<tr' + (isChrono && isLast ? ' class="fc-chrono"' : '') + '>';
-            for (var _b = 0, rowCells_1 = rowCells; _b < rowCells_1.length; _b++) {
-                var cell = rowCells_1[_b];
-                var headerCellClassNames = [theme.getClass('widgetHeader')];
-                if (cell.isWeekStart) {
-                    headerCellClassNames.push('fc-em-cell');
-                }
-                if (oneDay) {
-                    headerCellClassNames = headerCellClassNames.concat(getDayClasses(cell.date, this.props.dateProfile, this.context, true) // adds "today" class and other day-based classes
-                    );
-                }
-                html +=
-                    '<th class="' + headerCellClassNames.join(' ') + '"' +
-                        ' data-date="' + dateEnv.formatIso(cell.date, { omitTime: !tDateProfile.isTimeScale, omitTimeZoneOffset: true }) + '"' +
-                        (cell.colspan > 1 ? ' colspan="' + cell.colspan + '"' : '') +
-                        '>' +
-                        '<div class="fc-cell-content">' +
-                        cell.spanHtml +
-                        '</div>' +
-                        '</th>';
-            }
-            html += '</tr>';
-        }
-        html += '</tbody>';
-        this.tableEl.innerHTML = html; // TODO: does this work cross-browser?
-        this.slatColEls = findElements(this.tableEl, 'col');
-        this.innerEls = findElements(this.tableEl.querySelector('tr:last-child'), // compound selector won't work because of query-root problem
-        'th .fc-cell-text');
-        findElements(this.tableEl.querySelectorAll('tr:not(:last-child)'), // compound selector won't work because of query-root problem
-        'th .fc-cell-text').forEach(function (innerEl) {
-            innerEl.classList.add('fc-sticky');
-        });
-    };
-    return TimelineHeader;
-}(Component));
-
-var TimelineSlats = /** @class */ (function (_super) {
-    __extends(TimelineSlats, _super);
-    function TimelineSlats(context, parentEl) {
-        var _this = _super.call(this, context) || this;
-        parentEl.appendChild(_this.el = createElement('div', { className: 'fc-slats' }));
-        return _this;
-    }
-    TimelineSlats.prototype.destroy = function () {
-        removeElement(this.el);
-        _super.prototype.destroy.call(this);
-    };
-    TimelineSlats.prototype.render = function (props) {
-        this.renderDates(props.tDateProfile);
-    };
-    TimelineSlats.prototype.renderDates = function (tDateProfile) {
-        var _a = this, theme = _a.theme, view = _a.view, dateEnv = _a.dateEnv;
-        var slotDates = tDateProfile.slotDates, isWeekStarts = tDateProfile.isWeekStarts;
-        var html = '<table class="' + theme.getClass('tableGrid') + '">' +
-            '<colgroup>';
-        for (var i = 0; i < slotDates.length; i++) {
-            html += '<col/>';
-        }
-        html += '</colgroup>';
-        html += '<tbody><tr>';
-        for (var i = 0; i < slotDates.length; i++) {
-            html += this.slatCellHtml(slotDates[i], isWeekStarts[i], tDateProfile);
-        }
-        html += '</tr></tbody></table>';
-        this.el.innerHTML = html;
-        this.slatColEls = findElements(this.el, 'col');
-        this.slatEls = findElements(this.el, 'td');
-        for (var i = 0; i < slotDates.length; i++) {
-            view.publiclyTrigger('dayRender', [
-                {
-                    date: dateEnv.toDate(slotDates[i]),
-                    el: this.slatEls[i],
-                    view: view
-                }
-            ]);
-        }
-        this.outerCoordCache = new PositionCache(this.el, this.slatEls, true, // isHorizontal
-        false // isVertical
-        );
-        // for the inner divs within the slats
-        // used for event rendering and scrollTime, to disregard slat border
-        this.innerCoordCache = new PositionCache(this.el, findChildren(this.slatEls, 'div'), true, // isHorizontal
-        false // isVertical
-        );
-    };
-    TimelineSlats.prototype.slatCellHtml = function (date, isEm, tDateProfile) {
-        var _a = this, theme = _a.theme, dateEnv = _a.dateEnv;
-        var classes;
-        if (tDateProfile.isTimeScale) {
-            classes = [];
-            classes.push(isInt(dateEnv.countDurationsBetween(tDateProfile.normalizedRange.start, date, tDateProfile.labelInterval)) ?
-                'fc-major' :
-                'fc-minor');
-        }
-        else {
-            classes = getDayClasses(date, this.props.dateProfile, this.context);
-            classes.push('fc-day');
-        }
-        classes.unshift(theme.getClass('widgetContent'));
-        if (isEm) {
-            classes.push('fc-em-cell');
-        }
-        return '<td class="' + classes.join(' ') + '"' +
-            ' data-date="' + dateEnv.formatIso(date, { omitTime: !tDateProfile.isTimeScale, omitTimeZoneOffset: true }) + '"' +
-            '><div></div></td>';
-    };
-    TimelineSlats.prototype.updateSize = function () {
-        this.outerCoordCache.build();
-        this.innerCoordCache.build();
-    };
-    TimelineSlats.prototype.positionToHit = function (leftPosition) {
-        var outerCoordCache = this.outerCoordCache;
-        var tDateProfile = this.props.tDateProfile;
-        var slatIndex = outerCoordCache.leftToIndex(leftPosition);
-        if (slatIndex != null) {
-            // somewhat similar to what TimeGrid does. consolidate?
-            var slatWidth = outerCoordCache.getWidth(slatIndex);
-            var partial = this.isRtl ?
-                (outerCoordCache.rights[slatIndex] - leftPosition) / slatWidth :
-                (leftPosition - outerCoordCache.lefts[slatIndex]) / slatWidth;
-            var localSnapIndex = Math.floor(partial * tDateProfile.snapsPerSlot);
-            var start = this.dateEnv.add(tDateProfile.slotDates[slatIndex], multiplyDuration(tDateProfile.snapDuration, localSnapIndex));
-            var end = this.dateEnv.add(start, tDateProfile.snapDuration);
-            return {
-                dateSpan: {
-                    range: { start: start, end: end },
-                    allDay: !this.props.tDateProfile.isTimeScale
-                },
-                dayEl: this.slatColEls[slatIndex],
-                left: outerCoordCache.lefts[slatIndex],
-                right: outerCoordCache.rights[slatIndex]
-            };
-        }
-        return null;
-    };
-    return TimelineSlats;
-}(Component));
-
-var MIN_AUTO_LABELS = 18; // more than `12` months but less that `24` hours
-var MAX_AUTO_SLOTS_PER_LABEL = 6; // allows 6 10-min slots in an hour
-var MAX_AUTO_CELLS = 200; // allows 4-days to have a :30 slot duration
-config.MAX_TIMELINE_SLOTS = 1000;
-// potential nice values for slot-duration and interval-duration
-var STOCK_SUB_DURATIONS = [
-    { years: 1 },
-    { months: 1 },
-    { days: 1 },
-    { hours: 1 },
-    { minutes: 30 },
-    { minutes: 15 },
-    { minutes: 10 },
-    { minutes: 5 },
-    { minutes: 1 },
-    { seconds: 30 },
-    { seconds: 15 },
-    { seconds: 10 },
-    { seconds: 5 },
-    { seconds: 1 },
-    { milliseconds: 500 },
-    { milliseconds: 100 },
-    { milliseconds: 10 },
-    { milliseconds: 1 }
-];
-function buildTimelineDateProfile(dateProfile, view) {
-    var dateEnv = view.dateEnv;
-    var tDateProfile = {
-        labelInterval: queryDurationOption(view, 'slotLabelInterval'),
-        slotDuration: queryDurationOption(view, 'slotDuration')
-    };
-    validateLabelAndSlot(tDateProfile, dateProfile, dateEnv); // validate after computed grid duration
-    ensureLabelInterval(tDateProfile, dateProfile, dateEnv);
-    ensureSlotDuration(tDateProfile, dateProfile, dateEnv);
-    var input = view.opt('slotLabelFormat');
-    var rawFormats = Array.isArray(input) ?
-        input
-        : (input != null) ?
-            [input]
-            :
-                computeHeaderFormats(tDateProfile, dateProfile, dateEnv, view);
-    tDateProfile.headerFormats = rawFormats.map(function (rawFormat) {
-        return createFormatter(rawFormat);
-    });
-    tDateProfile.isTimeScale = Boolean(tDateProfile.slotDuration.milliseconds);
-    var largeUnit = null;
-    if (!tDateProfile.isTimeScale) {
-        var slotUnit = greatestDurationDenominator(tDateProfile.slotDuration).unit;
-        if (/year|month|week/.test(slotUnit)) {
-            largeUnit = slotUnit;
-        }
-    }
-    tDateProfile.largeUnit = largeUnit;
-    tDateProfile.emphasizeWeeks =
-        isSingleDay(tDateProfile.slotDuration) &&
-            currentRangeAs('weeks', dateProfile, dateEnv) >= 2 &&
-            !view.opt('businessHours');
-    /*
-    console.log('label interval =', timelineView.labelInterval.humanize())
-    console.log('slot duration =', timelineView.slotDuration.humanize())
-    console.log('header formats =', timelineView.headerFormats)
-    console.log('isTimeScale', timelineView.isTimeScale)
-    console.log('largeUnit', timelineView.largeUnit)
-    */
-    var rawSnapDuration = view.opt('snapDuration');
-    var snapDuration;
-    var snapsPerSlot;
-    if (rawSnapDuration) {
-        snapDuration = createDuration(rawSnapDuration);
-        snapsPerSlot = wholeDivideDurations(tDateProfile.slotDuration, snapDuration);
-        // ^ TODO: warning if not whole?
-    }
-    if (snapsPerSlot == null) {
-        snapDuration = tDateProfile.slotDuration;
-        snapsPerSlot = 1;
-    }
-    tDateProfile.snapDuration = snapDuration;
-    tDateProfile.snapsPerSlot = snapsPerSlot;
-    // more...
-    var timeWindowMs = asRoughMs(dateProfile.maxTime) - asRoughMs(dateProfile.minTime);
-    // TODO: why not use normalizeRange!?
-    var normalizedStart = normalizeDate(dateProfile.renderRange.start, tDateProfile, dateEnv);
-    var normalizedEnd = normalizeDate(dateProfile.renderRange.end, tDateProfile, dateEnv);
-    // apply minTime/maxTime
-    // TODO: View should be responsible.
-    if (tDateProfile.isTimeScale) {
-        normalizedStart = dateEnv.add(normalizedStart, dateProfile.minTime);
-        normalizedEnd = dateEnv.add(addDays(normalizedEnd, -1), dateProfile.maxTime);
-    }
-    tDateProfile.timeWindowMs = timeWindowMs;
-    tDateProfile.normalizedRange = { start: normalizedStart, end: normalizedEnd };
-    var slotDates = [];
-    var date = normalizedStart;
-    while (date < normalizedEnd) {
-        if (isValidDate(date, tDateProfile, dateProfile, view)) {
-            slotDates.push(date);
-        }
-        date = dateEnv.add(date, tDateProfile.slotDuration);
-    }
-    tDateProfile.slotDates = slotDates;
-    // more...
-    var snapIndex = -1;
-    var snapDiff = 0; // index of the diff :(
-    var snapDiffToIndex = [];
-    var snapIndexToDiff = [];
-    date = normalizedStart;
-    while (date < normalizedEnd) {
-        if (isValidDate(date, tDateProfile, dateProfile, view)) {
-            snapIndex++;
-            snapDiffToIndex.push(snapIndex);
-            snapIndexToDiff.push(snapDiff);
-        }
-        else {
-            snapDiffToIndex.push(snapIndex + 0.5);
-        }
-        date = dateEnv.add(date, tDateProfile.snapDuration);
-        snapDiff++;
-    }
-    tDateProfile.snapDiffToIndex = snapDiffToIndex;
-    tDateProfile.snapIndexToDiff = snapIndexToDiff;
-    tDateProfile.snapCnt = snapIndex + 1; // is always one behind
-    tDateProfile.slotCnt = tDateProfile.snapCnt / tDateProfile.snapsPerSlot;
-    // more...
-    tDateProfile.isWeekStarts = buildIsWeekStarts(tDateProfile, dateEnv);
-    tDateProfile.cellRows = buildCellRows(tDateProfile, dateEnv, view);
-    return tDateProfile;
-}
-/*
-snaps to appropriate unit
-*/
-function normalizeDate(date, tDateProfile, dateEnv) {
-    var normalDate = date;
-    if (!tDateProfile.isTimeScale) {
-        normalDate = startOfDay(normalDate);
-        if (tDateProfile.largeUnit) {
-            normalDate = dateEnv.startOf(normalDate, tDateProfile.largeUnit);
-        }
-    }
-    return normalDate;
-}
-/*
-snaps to appropriate unit
-*/
-function normalizeRange(range, tDateProfile, dateEnv) {
-    if (!tDateProfile.isTimeScale) {
-        range = computeVisibleDayRange(range);
-        if (tDateProfile.largeUnit) {
-            var dayRange = range; // preserve original result
-            range = {
-                start: dateEnv.startOf(range.start, tDateProfile.largeUnit),
-                end: dateEnv.startOf(range.end, tDateProfile.largeUnit)
-            };
-            // if date is partially through the interval, or is in the same interval as the start,
-            // make the exclusive end be the *next* interval
-            if (range.end.valueOf() !== dayRange.end.valueOf() || range.end <= range.start) {
-                range = {
-                    start: range.start,
-                    end: dateEnv.add(range.end, tDateProfile.slotDuration)
-                };
-            }
-        }
-    }
-    return range;
-}
-function isValidDate(date, tDateProfile, dateProfile, view) {
-    if (view.dateProfileGenerator.isHiddenDay(date)) {
-        return false;
-    }
-    else if (tDateProfile.isTimeScale) {
-        // determine if the time is within minTime/maxTime, which may have wacky values
-        var day = startOfDay(date);
-        var timeMs = date.valueOf() - day.valueOf();
-        var ms = timeMs - asRoughMs(dateProfile.minTime); // milliseconds since minTime
-        ms = ((ms % 86400000) + 86400000) % 86400000; // make negative values wrap to 24hr clock
-        return ms < tDateProfile.timeWindowMs; // before the maxTime?
-    }
-    else {
-        return true;
-    }
-}
-function queryDurationOption(view, name) {
-    var input = view.opt(name);
-    if (input != null) {
-        return createDuration(input);
-    }
-}
-function validateLabelAndSlot(tDateProfile, dateProfile, dateEnv) {
-    var currentRange = dateProfile.currentRange;
-    // make sure labelInterval doesn't exceed the max number of cells
-    if (tDateProfile.labelInterval) {
-        var labelCnt = dateEnv.countDurationsBetween(currentRange.start, currentRange.end, tDateProfile.labelInterval);
-        if (labelCnt > config.MAX_TIMELINE_SLOTS) {
-            console.warn('slotLabelInterval results in too many cells');
-            tDateProfile.labelInterval = null;
-        }
-    }
-    // make sure slotDuration doesn't exceed the maximum number of cells
-    if (tDateProfile.slotDuration) {
-        var slotCnt = dateEnv.countDurationsBetween(currentRange.start, currentRange.end, tDateProfile.slotDuration);
-        if (slotCnt > config.MAX_TIMELINE_SLOTS) {
-            console.warn('slotDuration results in too many cells');
-            tDateProfile.slotDuration = null;
-        }
-    }
-    // make sure labelInterval is a multiple of slotDuration
-    if (tDateProfile.labelInterval && tDateProfile.slotDuration) {
-        var slotsPerLabel = wholeDivideDurations(tDateProfile.labelInterval, tDateProfile.slotDuration);
-        if (slotsPerLabel === null || slotsPerLabel < 1) {
-            console.warn('slotLabelInterval must be a multiple of slotDuration');
-            tDateProfile.slotDuration = null;
-        }
-    }
-}
-function ensureLabelInterval(tDateProfile, dateProfile, dateEnv) {
-    var currentRange = dateProfile.currentRange;
-    var labelInterval = tDateProfile.labelInterval;
-    if (!labelInterval) {
-        // compute based off the slot duration
-        // find the largest label interval with an acceptable slots-per-label
-        var input = void 0;
-        if (tDateProfile.slotDuration) {
-            for (var _i = 0, STOCK_SUB_DURATIONS_1 = STOCK_SUB_DURATIONS; _i < STOCK_SUB_DURATIONS_1.length; _i++) {
-                input = STOCK_SUB_DURATIONS_1[_i];
-                var tryLabelInterval = createDuration(input);
-                var slotsPerLabel = wholeDivideDurations(tryLabelInterval, tDateProfile.slotDuration);
-                if (slotsPerLabel !== null && slotsPerLabel <= MAX_AUTO_SLOTS_PER_LABEL) {
-                    labelInterval = tryLabelInterval;
-                    break;
-                }
-            }
-            // use the slot duration as a last resort
-            if (!labelInterval) {
-                labelInterval = tDateProfile.slotDuration;
-            }
-            // compute based off the view's duration
-            // find the largest label interval that yields the minimum number of labels
-        }
-        else {
-            for (var _a = 0, STOCK_SUB_DURATIONS_2 = STOCK_SUB_DURATIONS; _a < STOCK_SUB_DURATIONS_2.length; _a++) {
-                input = STOCK_SUB_DURATIONS_2[_a];
-                labelInterval = createDuration(input);
-                var labelCnt = dateEnv.countDurationsBetween(currentRange.start, currentRange.end, labelInterval);
-                if (labelCnt >= MIN_AUTO_LABELS) {
-                    break;
-                }
-            }
-        }
-        tDateProfile.labelInterval = labelInterval;
-    }
-    return labelInterval;
-}
-function ensureSlotDuration(tDateProfile, dateProfile, dateEnv) {
-    var currentRange = dateProfile.currentRange;
-    var slotDuration = tDateProfile.slotDuration;
-    if (!slotDuration) {
-        var labelInterval = ensureLabelInterval(tDateProfile, dateProfile, dateEnv); // will compute if necessary
-        // compute based off the label interval
-        // find the largest slot duration that is different from labelInterval, but still acceptable
-        for (var _i = 0, STOCK_SUB_DURATIONS_3 = STOCK_SUB_DURATIONS; _i < STOCK_SUB_DURATIONS_3.length; _i++) {
-            var input = STOCK_SUB_DURATIONS_3[_i];
-            var trySlotDuration = createDuration(input);
-            var slotsPerLabel = wholeDivideDurations(labelInterval, trySlotDuration);
-            if (slotsPerLabel !== null && slotsPerLabel > 1 && slotsPerLabel <= MAX_AUTO_SLOTS_PER_LABEL) {
-                slotDuration = trySlotDuration;
-                break;
-            }
-        }
-        // only allow the value if it won't exceed the view's # of slots limit
-        if (slotDuration) {
-            var slotCnt = dateEnv.countDurationsBetween(currentRange.start, currentRange.end, slotDuration);
-            if (slotCnt > MAX_AUTO_CELLS) {
-                slotDuration = null;
-            }
-        }
-        // use the label interval as a last resort
-        if (!slotDuration) {
-            slotDuration = labelInterval;
-        }
-        tDateProfile.slotDuration = slotDuration;
-    }
-    return slotDuration;
-}
-function computeHeaderFormats(tDateProfile, dateProfile, dateEnv, view) {
-    var format1;
-    var format2;
-    var labelInterval = tDateProfile.labelInterval;
-    var unit = greatestDurationDenominator(labelInterval).unit;
-    var weekNumbersVisible = view.opt('weekNumbers');
-    var format0 = (format1 = (format2 = null));
-    // NOTE: weekNumber computation function wont work
-    if ((unit === 'week') && !weekNumbersVisible) {
-        unit = 'day';
-    }
-    switch (unit) {
-        case 'year':
-            format0 = { year: 'numeric' }; // '2015'
-            break;
-        case 'month':
-            if (currentRangeAs('years', dateProfile, dateEnv) > 1) {
-                format0 = { year: 'numeric' }; // '2015'
-            }
-            format1 = { month: 'short' }; // 'Jan'
-            break;
-        case 'week':
-            if (currentRangeAs('years', dateProfile, dateEnv) > 1) {
-                format0 = { year: 'numeric' }; // '2015'
-            }
-            format1 = { week: 'narrow' }; // 'Wk4'
-            break;
-        case 'day':
-            if (currentRangeAs('years', dateProfile, dateEnv) > 1) {
-                format0 = { year: 'numeric', month: 'long' }; // 'January 2014'
-            }
-            else if (currentRangeAs('months', dateProfile, dateEnv) > 1) {
-                format0 = { month: 'long' }; // 'January'
-            }
-            if (weekNumbersVisible) {
-                format1 = { week: 'short' }; // 'Wk 4'
-            }
-            format2 = { weekday: 'narrow', day: 'numeric' }; // 'Su 9'
-            break;
-        case 'hour':
-            if (weekNumbersVisible) {
-                format0 = { week: 'short' }; // 'Wk 4'
-            }
-            if (currentRangeAs('days', dateProfile, dateEnv) > 1) {
-                format1 = { weekday: 'short', day: 'numeric', month: 'numeric', omitCommas: true }; // Sat 4/7
-            }
-            format2 = {
-                hour: 'numeric',
-                minute: '2-digit',
-                omitZeroMinute: true,
-                meridiem: 'short'
-            };
-            break;
-        case 'minute':
-            // sufficiently large number of different minute cells?
-            if ((asRoughMinutes(labelInterval) / 60) >= MAX_AUTO_SLOTS_PER_LABEL) {
-                format0 = {
-                    hour: 'numeric',
-                    meridiem: 'short'
-                };
-                format1 = function (params) {
-                    return ':' + padStart(params.date.minute, 2); // ':30'
-                };
-            }
-            else {
-                format0 = {
-                    hour: 'numeric',
-                    minute: 'numeric',
-                    meridiem: 'short'
-                };
-            }
-            break;
-        case 'second':
-            // sufficiently large number of different second cells?
-            if ((asRoughSeconds(labelInterval) / 60) >= MAX_AUTO_SLOTS_PER_LABEL) {
-                format0 = { hour: 'numeric', minute: '2-digit', meridiem: 'lowercase' }; // '8:30 PM'
-                format1 = function (params) {
-                    return ':' + padStart(params.date.second, 2); // ':30'
-                };
-            }
-            else {
-                format0 = { hour: 'numeric', minute: '2-digit', second: '2-digit', meridiem: 'lowercase' }; // '8:30:45 PM'
-            }
-            break;
-        case 'millisecond':
-            format0 = { hour: 'numeric', minute: '2-digit', second: '2-digit', meridiem: 'lowercase' }; // '8:30:45 PM'
-            format1 = function (params) {
-                return '.' + padStart(params.millisecond, 3);
-            };
-            break;
-    }
-    return [].concat(format0 || [], format1 || [], format2 || []);
-}
-// Compute the number of the give units in the "current" range.
-// Won't go more precise than days.
-// Will return `0` if there's not a clean whole interval.
-function currentRangeAs(unit, dateProfile, dateEnv) {
-    var range = dateProfile.currentRange;
-    var res = null;
-    if (unit === 'years') {
-        res = dateEnv.diffWholeYears(range.start, range.end);
-    }
-    else if (unit === 'months') {
-        res = dateEnv.diffWholeMonths(range.start, range.end);
-    }
-    else if (unit === 'weeks') {
-        res = dateEnv.diffWholeMonths(range.start, range.end);
-    }
-    else if (unit === 'days') {
-        res = diffWholeDays(range.start, range.end);
-    }
-    return res || 0;
-}
-function buildIsWeekStarts(tDateProfile, dateEnv) {
-    var slotDates = tDateProfile.slotDates, emphasizeWeeks = tDateProfile.emphasizeWeeks;
-    var prevWeekNumber = null;
-    var isWeekStarts = [];
-    for (var _i = 0, slotDates_1 = slotDates; _i < slotDates_1.length; _i++) {
-        var slotDate = slotDates_1[_i];
-        var weekNumber = dateEnv.computeWeekNumber(slotDate);
-        var isWeekStart = emphasizeWeeks && (prevWeekNumber !== null) && (prevWeekNumber !== weekNumber);
-        prevWeekNumber = weekNumber;
-        isWeekStarts.push(isWeekStart);
-    }
-    return isWeekStarts;
-}
-function buildCellRows(tDateProfile, dateEnv, view) {
-    var slotDates = tDateProfile.slotDates;
-    var formats = tDateProfile.headerFormats;
-    var cellRows = formats.map(function (format) { return []; }); // indexed by row,col
-    // specifically for navclicks
-    var rowUnits = formats.map(function (format) {
-        return format.getLargestUnit ? format.getLargestUnit() : null;
-    });
-    // builds cellRows and slotCells
-    for (var i = 0; i < slotDates.length; i++) {
-        var date = slotDates[i];
-        var isWeekStart = tDateProfile.isWeekStarts[i];
-        for (var row = 0; row < formats.length; row++) {
-            var format = formats[row];
-            var rowCells = cellRows[row];
-            var leadingCell = rowCells[rowCells.length - 1];
-            var isSuperRow = (formats.length > 1) && (row < (formats.length - 1)); // more than one row and not the last
-            var newCell = null;
-            if (isSuperRow) {
-                var text = dateEnv.format(date, format);
-                if (!leadingCell || (leadingCell.text !== text)) {
-                    newCell = buildCellObject(date, text, rowUnits[row], view);
-                }
-                else {
-                    leadingCell.colspan += 1;
-                }
-            }
-            else {
-                if (!leadingCell ||
-                    isInt(dateEnv.countDurationsBetween(tDateProfile.normalizedRange.start, date, tDateProfile.labelInterval))) {
-                    var text = dateEnv.format(date, format);
-                    newCell = buildCellObject(date, text, rowUnits[row], view);
-                }
-                else {
-                    leadingCell.colspan += 1;
-                }
-            }
-            if (newCell) {
-                newCell.weekStart = isWeekStart;
-                rowCells.push(newCell);
-            }
-        }
-    }
-    return cellRows;
-}
-function buildCellObject(date, text, rowUnit, view) {
-    var spanHtml = buildGotoAnchorHtml(view, {
-        date: date,
-        type: rowUnit,
-        forceOff: !rowUnit
-    }, {
-        'class': 'fc-cell-text'
-    }, htmlEscape(text));
-    return { text: text, spanHtml: spanHtml, date: date, colspan: 1, isWeekStart: false };
-}
-
-var TimelineNowIndicator = /** @class */ (function () {
-    function TimelineNowIndicator(headParent, bodyParent) {
-        this.headParent = headParent;
-        this.bodyParent = bodyParent;
-    }
-    TimelineNowIndicator.prototype.render = function (coord, isRtl) {
-        var styleProps = isRtl ? { right: -coord } : { left: coord };
-        this.headParent.appendChild(this.arrowEl = createElement('div', {
-            className: 'fc-now-indicator fc-now-indicator-arrow',
-            style: styleProps
-        }));
-        this.bodyParent.appendChild(this.lineEl = createElement('div', {
-            className: 'fc-now-indicator fc-now-indicator-line',
-            style: styleProps
-        }));
-    };
-    TimelineNowIndicator.prototype.unrender = function () {
-        if (this.arrowEl) {
-            removeElement(this.arrowEl);
-        }
-        if (this.lineEl) {
-            removeElement(this.lineEl);
-        }
-    };
-    return TimelineNowIndicator;
-}());
-
-var STICKY_PROP_VAL = computeStickyPropVal(); // if null, means not supported at all
-var IS_MS_EDGE = /Edge/.test(navigator.userAgent);
-var IS_SAFARI = STICKY_PROP_VAL === '-webkit-sticky'; // good b/c doesn't confuse chrome
-var STICKY_CLASSNAME = 'fc-sticky';
-/*
-useful beyond the native position:sticky for these reasons:
-- support in IE11
-- nice centering support
-*/
-var StickyScroller = /** @class */ (function () {
-    function StickyScroller(scroller, isRtl, isVertical) {
-        var _this = this;
-        this.usingRelative = null;
-        /*
-        known bug: called twice on init. problem when mixing with ScrollJoiner
-        */
-        this.updateSize = function () {
-            var els = Array.prototype.slice.call(_this.scroller.canvas.el.querySelectorAll('.' + STICKY_CLASSNAME));
-            var elGeoms = _this.queryElGeoms(els);
-            var viewportWidth = _this.scroller.el.clientWidth;
-            if (_this.usingRelative) {
-                var elDestinations = _this.computeElDestinations(elGeoms, viewportWidth); // read before prepPositioning
-                assignRelativePositions(els, elGeoms, elDestinations);
-            }
-            else {
-                assignStickyPositions(els, elGeoms, viewportWidth);
-            }
-        };
-        this.scroller = scroller;
-        this.usingRelative =
-            !STICKY_PROP_VAL || // IE11
-                (IS_MS_EDGE && isRtl) || // https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/18883305/
-                ((IS_MS_EDGE || IS_SAFARI) && isVertical); // because doesn't work with rowspan in tables, our only vertial use
-        if (this.usingRelative) {
-            scroller.on('scrollEnd', this.updateSize);
-        }
-    }
-    StickyScroller.prototype.destroy = function () {
-        this.scroller.off('scrollEnd', this.updateSize);
-    };
-    StickyScroller.prototype.queryElGeoms = function (els) {
-        var canvasOrigin = this.scroller.canvas.el.getBoundingClientRect();
-        var elGeoms = [];
-        for (var _i = 0, els_1 = els; _i < els_1.length; _i++) {
-            var el = els_1[_i];
-            var parentBound = translateRect(el.parentNode.getBoundingClientRect(), -canvasOrigin.left, -canvasOrigin.top);
-            var elRect = el.getBoundingClientRect();
-            var computedStyles = window.getComputedStyle(el);
-            var computedTextAlign = window.getComputedStyle(el.parentNode).textAlign; // ask the parent
-            var intendedTextAlign = computedTextAlign;
-            var naturalBound = null;
-            if (computedStyles.position !== 'sticky') {
-                naturalBound = translateRect(elRect, -canvasOrigin.left - (parseFloat(computedStyles.left) || 0), // could be 'auto'
-                -canvasOrigin.top - (parseFloat(computedStyles.top) || 0));
-            }
-            if (el.hasAttribute('data-sticky-center')) {
-                intendedTextAlign = 'center';
-            }
-            elGeoms.push({
-                parentBound: parentBound,
-                naturalBound: naturalBound,
-                elWidth: elRect.width,
-                elHeight: elRect.height,
-                computedTextAlign: computedTextAlign,
-                intendedTextAlign: intendedTextAlign
-            });
-        }
-        return elGeoms;
-    };
-    StickyScroller.prototype.computeElDestinations = function (elGeoms, viewportWidth) {
-        var viewportLeft = this.scroller.getScrollFromLeft();
-        var viewportTop = this.scroller.getScrollTop();
-        var viewportRight = viewportLeft + viewportWidth;
-        return elGeoms.map(function (elGeom) {
-            var elWidth = elGeom.elWidth, elHeight = elGeom.elHeight, parentBound = elGeom.parentBound, naturalBound = elGeom.naturalBound;
-            var destLeft; // relative to canvas topleft
-            var destTop; // "
-            switch (elGeom.intendedTextAlign) {
-                case 'left':
-                    destLeft = viewportLeft;
-                    break;
-                case 'right':
-                    destLeft = viewportRight - elWidth;
-                    break;
-                case 'center':
-                    destLeft = (viewportLeft + viewportRight) / 2 - elWidth / 2;
-                    break;
-            }
-            destLeft = Math.min(destLeft, parentBound.right - elWidth);
-            destLeft = Math.max(destLeft, parentBound.left);
-            destTop = viewportTop;
-            destTop = Math.min(destTop, parentBound.bottom - elHeight);
-            destTop = Math.max(destTop, naturalBound.top); // better to use natural top for upper bound
-            return { left: destLeft, top: destTop };
-        });
-    };
-    return StickyScroller;
-}());
-function assignRelativePositions(els, elGeoms, elDestinations) {
-    els.forEach(function (el, i) {
-        var naturalBound = elGeoms[i].naturalBound;
-        applyStyle(el, {
-            position: 'relative',
-            left: elDestinations[i].left - naturalBound.left,
-            top: elDestinations[i].top - naturalBound.top
-        });
-    });
-}
-function assignStickyPositions(els, elGeoms, viewportWidth) {
-    els.forEach(function (el, i) {
-        var stickyLeft = 0;
-        if (elGeoms[i].intendedTextAlign === 'center') {
-            stickyLeft = (viewportWidth - elGeoms[i].elWidth) / 2;
-            // needs to be forced to left?
-            if (elGeoms[i].computedTextAlign === 'center') {
-                el.setAttribute('data-sticky-center', '') // remember for next queryElGeoms
-                ;
-                el.parentNode.style.textAlign = 'left';
-            }
-        }
-        applyStyle(el, {
-            position: STICKY_PROP_VAL,
-            left: stickyLeft,
-            right: 0,
-            top: 0
-        });
-    });
-}
-function computeStickyPropVal() {
-    var el = htmlToElement('<div style="position:-webkit-sticky;position:sticky"></div>');
-    var val = el.style.position;
-    if (val.indexOf('sticky') !== -1) {
-        return val;
-    }
-    else {
-        return null;
-    }
-}
-
-var TimeAxis = /** @class */ (function (_super) {
-    __extends(TimeAxis, _super);
-    function TimeAxis(context, headerContainerEl, bodyContainerEl) {
-        var _this = _super.call(this, context) || this;
-        var layout = _this.layout = new HeaderBodyLayout(headerContainerEl, bodyContainerEl, 'auto');
-        var headerEnhancedScroller = layout.headerScroller.enhancedScroll;
-        var bodyEnhancedScroller = layout.bodyScroller.enhancedScroll;
-        // needs to go after layout, which has ScrollJoiner
-        _this.headStickyScroller = new StickyScroller(headerEnhancedScroller, _this.isRtl, false); // isVertical=false
-        _this.bodyStickyScroller = new StickyScroller(bodyEnhancedScroller, _this.isRtl, false); // isVertical=false
-        _this.header = new TimelineHeader(context, headerEnhancedScroller.canvas.contentEl);
-        _this.slats = new TimelineSlats(context, bodyEnhancedScroller.canvas.bgEl);
-        _this.nowIndicator = new TimelineNowIndicator(headerEnhancedScroller.canvas.el, bodyEnhancedScroller.canvas.el);
-        return _this;
-    }
-    TimeAxis.prototype.destroy = function () {
-        this.layout.destroy();
-        this.header.destroy();
-        this.slats.destroy();
-        this.nowIndicator.unrender();
-        this.headStickyScroller.destroy();
-        this.bodyStickyScroller.destroy();
-        _super.prototype.destroy.call(this);
-    };
-    TimeAxis.prototype.render = function (props) {
-        var tDateProfile = this.tDateProfile =
-            buildTimelineDateProfile(props.dateProfile, this.view); // TODO: cache
-        this.header.receiveProps({
-            dateProfile: props.dateProfile,
-            tDateProfile: tDateProfile
-        });
-        this.slats.receiveProps({
-            dateProfile: props.dateProfile,
-            tDateProfile: tDateProfile
-        });
-    };
-    // Now Indicator
-    // ------------------------------------------------------------------------------------------
-    TimeAxis.prototype.getNowIndicatorUnit = function (dateProfile) {
-        // yuck
-        var tDateProfile = this.tDateProfile =
-            buildTimelineDateProfile(dateProfile, this.view); // TODO: cache
-        if (tDateProfile.isTimeScale) {
-            return greatestDurationDenominator(tDateProfile.slotDuration).unit;
-        }
-    };
-    // will only execute if isTimeScale
-    TimeAxis.prototype.renderNowIndicator = function (date) {
-        if (rangeContainsMarker(this.tDateProfile.normalizedRange, date)) {
-            this.nowIndicator.render(this.dateToCoord(date), this.isRtl);
-        }
-    };
-    // will only execute if isTimeScale
-    TimeAxis.prototype.unrenderNowIndicator = function () {
-        this.nowIndicator.unrender();
-    };
-    // Sizing
-    // ------------------------------------------------------------------------------------------
-    TimeAxis.prototype.updateSize = function (isResize, totalHeight, isAuto) {
-        this.applySlotWidth(this.computeSlotWidth());
-        // adjusts gutters. do after slot widths set
-        this.layout.setHeight(totalHeight, isAuto);
-        // pretty much just queries coords. do last
-        this.slats.updateSize();
-    };
-    TimeAxis.prototype.updateStickyScrollers = function () {
-        this.headStickyScroller.updateSize();
-        this.bodyStickyScroller.updateSize();
-    };
-    TimeAxis.prototype.computeSlotWidth = function () {
-        var slotWidth = this.opt('slotWidth') || '';
-        if (slotWidth === '') {
-            slotWidth = this.computeDefaultSlotWidth(this.tDateProfile);
-        }
-        return slotWidth;
-    };
-    TimeAxis.prototype.computeDefaultSlotWidth = function (tDateProfile) {
-        var maxInnerWidth = 0; // TODO: harness core's `matchCellWidths` for this
-        this.header.innerEls.forEach(function (innerEl, i) {
-            maxInnerWidth = Math.max(maxInnerWidth, innerEl.getBoundingClientRect().width);
-        });
-        var headingCellWidth = Math.ceil(maxInnerWidth) + 1; // assume no padding, and one pixel border
-        // in TimelineView.defaults we ensured that labelInterval is an interval of slotDuration
-        // TODO: rename labelDuration?
-        var slotsPerLabel = wholeDivideDurations(tDateProfile.labelInterval, tDateProfile.slotDuration);
-        var slotWidth = Math.ceil(headingCellWidth / slotsPerLabel);
-        var minWidth = window.getComputedStyle(this.header.slatColEls[0]).minWidth;
-        if (minWidth) {
-            minWidth = parseInt(minWidth, 10);
-            if (minWidth) {
-                slotWidth = Math.max(slotWidth, minWidth);
-            }
-        }
-        return slotWidth;
-    };
-    TimeAxis.prototype.applySlotWidth = function (slotWidth) {
-        var _a = this, layout = _a.layout, tDateProfile = _a.tDateProfile;
-        var containerWidth = '';
-        var containerMinWidth = '';
-        var nonLastSlotWidth = '';
-        if (slotWidth !== '') {
-            slotWidth = Math.round(slotWidth);
-            containerWidth = slotWidth * tDateProfile.slotDates.length;
-            containerMinWidth = '';
-            nonLastSlotWidth = slotWidth;
-            var availableWidth = layout.bodyScroller.enhancedScroll.getClientWidth();
-            if (availableWidth > containerWidth) {
-                containerMinWidth = availableWidth;
-                containerWidth = '';
-                nonLastSlotWidth = Math.floor(availableWidth / tDateProfile.slotDates.length);
-            }
-        }
-        layout.headerScroller.enhancedScroll.canvas.setWidth(containerWidth);
-        layout.headerScroller.enhancedScroll.canvas.setMinWidth(containerMinWidth);
-        layout.bodyScroller.enhancedScroll.canvas.setWidth(containerWidth);
-        layout.bodyScroller.enhancedScroll.canvas.setMinWidth(containerMinWidth);
-        if (nonLastSlotWidth !== '') {
-            this.header.slatColEls.slice(0, -1).concat(this.slats.slatColEls.slice(0, -1)).forEach(function (el) {
-                el.style.width = nonLastSlotWidth + 'px';
-            });
-        }
-    };
-    // returned value is between 0 and the number of snaps
-    TimeAxis.prototype.computeDateSnapCoverage = function (date) {
-        var _a = this, dateEnv = _a.dateEnv, tDateProfile = _a.tDateProfile;
-        var snapDiff = dateEnv.countDurationsBetween(tDateProfile.normalizedRange.start, date, tDateProfile.snapDuration);
-        if (snapDiff < 0) {
-            return 0;
-        }
-        else if (snapDiff >= tDateProfile.snapDiffToIndex.length) {
-            return tDateProfile.snapCnt;
-        }
-        else {
-            var snapDiffInt = Math.floor(snapDiff);
-            var snapCoverage = tDateProfile.snapDiffToIndex[snapDiffInt];
-            if (isInt(snapCoverage)) { // not an in-between value
-                snapCoverage += snapDiff - snapDiffInt; // add the remainder
-            }
-            else {
-                // a fractional value, meaning the date is not visible
-                // always round up in this case. works for start AND end dates in a range.
-                snapCoverage = Math.ceil(snapCoverage);
-            }
-            return snapCoverage;
-        }
-    };
-    // for LTR, results range from 0 to width of area
-    // for RTL, results range from negative width of area to 0
-    TimeAxis.prototype.dateToCoord = function (date) {
-        var tDateProfile = this.tDateProfile;
-        var snapCoverage = this.computeDateSnapCoverage(date);
-        var slotCoverage = snapCoverage / tDateProfile.snapsPerSlot;
-        var slotIndex = Math.floor(slotCoverage);
-        slotIndex = Math.min(slotIndex, tDateProfile.slotCnt - 1);
-        var partial = slotCoverage - slotIndex;
-        var _a = this.slats, innerCoordCache = _a.innerCoordCache, outerCoordCache = _a.outerCoordCache;
-        if (this.isRtl) {
-            return (outerCoordCache.rights[slotIndex] -
-                (innerCoordCache.getWidth(slotIndex) * partial)) - outerCoordCache.originClientRect.width;
-        }
-        else {
-            return (outerCoordCache.lefts[slotIndex] +
-                (innerCoordCache.getWidth(slotIndex) * partial));
-        }
-    };
-    TimeAxis.prototype.rangeToCoords = function (range) {
-        if (this.isRtl) {
-            return { right: this.dateToCoord(range.start), left: this.dateToCoord(range.end) };
-        }
-        else {
-            return { left: this.dateToCoord(range.start), right: this.dateToCoord(range.end) };
-        }
-    };
-    // Scrolling
-    // ------------------------------------------------------------------------------------------
-    TimeAxis.prototype.computeDateScroll = function (duration) {
-        var dateEnv = this.dateEnv;
-        var dateProfile = this.props.dateProfile;
-        var left = 0;
-        if (dateProfile) {
-            left = this.dateToCoord(dateEnv.add(startOfDay(dateProfile.activeRange.start), // startOfDay needed?
-            duration));
-            // hack to overcome the left borders of non-first slat
-            if (!this.isRtl && left) {
-                left += 1;
-            }
-        }
-        return { left: left };
-    };
-    TimeAxis.prototype.queryDateScroll = function () {
-        var enhancedScroll = this.layout.bodyScroller.enhancedScroll;
-        return {
-            left: enhancedScroll.getScrollLeft()
-        };
-    };
-    TimeAxis.prototype.applyDateScroll = function (scroll) {
-        // TODO: lame we have to update both. use the scrolljoiner instead maybe
-        this.layout.bodyScroller.enhancedScroll.setScrollLeft(scroll.left || 0);
-        this.layout.headerScroller.enhancedScroll.setScrollLeft(scroll.left || 0);
-    };
-    return TimeAxis;
-}(Component));
-
-var TimelineLaneEventRenderer = /** @class */ (function (_super) {
-    __extends(TimelineLaneEventRenderer, _super);
-    function TimelineLaneEventRenderer(context, masterContainerEl, timeAxis) {
-        var _this = _super.call(this, context) || this;
-        _this.masterContainerEl = masterContainerEl;
-        _this.timeAxis = timeAxis;
-        return _this;
-    }
-    TimelineLaneEventRenderer.prototype.renderSegHtml = function (seg, mirrorInfo) {
-        var view = this.context.view;
-        var eventRange = seg.eventRange;
-        var eventDef = eventRange.def;
-        var eventUi = eventRange.ui;
-        var isDraggable = view.computeEventDraggable(eventDef, eventUi);
-        var isResizableFromStart = seg.isStart && view.computeEventStartResizable(eventDef, eventUi);
-        var isResizableFromEnd = seg.isEnd && view.computeEventEndResizable(eventDef, eventUi);
-        var classes = this.getSegClasses(seg, isDraggable, isResizableFromStart || isResizableFromEnd, mirrorInfo);
-        classes.unshift('fc-timeline-event', 'fc-h-event');
-        var timeText = this.getTimeText(eventRange);
-        return '<a class="' + classes.join(' ') + '" style="' + cssToStr(this.getSkinCss(eventUi)) + '"' +
-            (eventDef.url ?
-                ' href="' + htmlEscape(eventDef.url) + '"' :
-                '') +
-            '>' +
-            (timeText ?
-                '<span class="fc-time-wrap">' +
-                    '<span class="fc-time">' +
-                    htmlEscape(timeText) +
-                    '</span>' +
-                    '</span>'
-                :
-                    '') +
-            '<span class="fc-title-wrap">' +
-            '<span class="fc-title fc-sticky">' +
-            (eventDef.title ? htmlEscape(eventDef.title) : '&nbsp;') +
-            '</span>' +
-            '</span>' +
-            (isResizableFromStart ?
-                '<div class="fc-resizer fc-start-resizer"></div>' :
-                '') +
-            (isResizableFromEnd ?
-                '<div class="fc-resizer fc-end-resizer"></div>' :
-                '') +
-            '</a>';
-    };
-    TimelineLaneEventRenderer.prototype.computeDisplayEventTime = function () {
-        return !this.timeAxis.tDateProfile.isTimeScale; // because times should be obvious via axis
-    };
-    TimelineLaneEventRenderer.prototype.computeDisplayEventEnd = function () {
-        return false;
-    };
-    // Computes a default event time formatting string if `timeFormat` is not explicitly defined
-    TimelineLaneEventRenderer.prototype.computeEventTimeFormat = function () {
-        return {
-            hour: 'numeric',
-            minute: '2-digit',
-            omitZeroMinute: true,
-            meridiem: 'narrow'
-        };
-    };
-    TimelineLaneEventRenderer.prototype.attachSegs = function (segs, mirrorInfo) {
-        if (!this.el && this.masterContainerEl) {
-            this.el = createElement('div', { className: 'fc-event-container' });
-            if (mirrorInfo) {
-                this.el.classList.add('fc-mirror-container');
-            }
-            this.masterContainerEl.appendChild(this.el);
-        }
-        if (this.el) {
-            for (var _i = 0, segs_1 = segs; _i < segs_1.length; _i++) {
-                var seg = segs_1[_i];
-                this.el.appendChild(seg.el);
-            }
-        }
-    };
-    TimelineLaneEventRenderer.prototype.detachSegs = function (segs) {
-        for (var _i = 0, segs_2 = segs; _i < segs_2.length; _i++) {
-            var seg = segs_2[_i];
-            removeElement(seg.el);
-        }
-    };
-    // computes AND assigns (assigns the left/right at least). bad
-    TimelineLaneEventRenderer.prototype.computeSegSizes = function (segs) {
-        var timeAxis = this.timeAxis;
-        for (var _i = 0, segs_3 = segs; _i < segs_3.length; _i++) {
-            var seg = segs_3[_i];
-            var coords = timeAxis.rangeToCoords(seg); // works because Seg has start/end
-            applyStyle(seg.el, {
-                left: (seg.left = coords.left),
-                right: -(seg.right = coords.right)
-            });
-        }
-    };
-    TimelineLaneEventRenderer.prototype.assignSegSizes = function (segs) {
-        if (!this.el) {
-            return;
-        }
-        // compute seg verticals
-        for (var _i = 0, segs_4 = segs; _i < segs_4.length; _i++) {
-            var seg = segs_4[_i];
-            seg.height = computeHeightAndMargins(seg.el);
-        }
-        this.buildSegLevels(segs); // populates above/below props for computeOffsetForSegs
-        var totalHeight = computeOffsetForSegs(segs); // also assigns seg.top
-        applyStyleProp(this.el, 'height', totalHeight);
-        // assign seg verticals
-        for (var _a = 0, segs_5 = segs; _a < segs_5.length; _a++) {
-            var seg = segs_5[_a];
-            applyStyleProp(seg.el, 'top', seg.top);
-        }
-    };
-    TimelineLaneEventRenderer.prototype.buildSegLevels = function (segs) {
-        var segLevels = [];
-        segs = this.sortEventSegs(segs);
-        for (var _i = 0, segs_6 = segs; _i < segs_6.length; _i++) {
-            var unplacedSeg = segs_6[_i];
-            unplacedSeg.above = [];
-            // determine the first level with no collisions
-            var level = 0; // level index
-            while (level < segLevels.length) {
-                var isLevelCollision = false;
-                // determine collisions
-                for (var _a = 0, _b = segLevels[level]; _a < _b.length; _a++) {
-                    var placedSeg = _b[_a];
-                    if (timeRowSegsCollide(unplacedSeg, placedSeg)) {
-                        unplacedSeg.above.push(placedSeg);
-                        isLevelCollision = true;
-                    }
-                }
-                if (isLevelCollision) {
-                    level += 1;
-                }
-                else {
-                    break;
-                }
-            }
-            // insert into the first non-colliding level. create if necessary
-            (segLevels[level] || (segLevels[level] = []))
-                .push(unplacedSeg);
-            // record possible colliding segments below (TODO: automated test for this)
-            level += 1;
-            while (level < segLevels.length) {
-                for (var _c = 0, _d = segLevels[level]; _c < _d.length; _c++) {
-                    var belowSeg = _d[_c];
-                    if (timeRowSegsCollide(unplacedSeg, belowSeg)) {
-                        belowSeg.above.push(unplacedSeg);
-                    }
-                }
-                level += 1;
-            }
-        }
-        return segLevels;
-    };
-    return TimelineLaneEventRenderer;
-}(FgEventRenderer));
-function computeOffsetForSegs(segs) {
-    var max = 0;
-    for (var _i = 0, segs_7 = segs; _i < segs_7.length; _i++) {
-        var seg = segs_7[_i];
-        max = Math.max(max, computeOffsetForSeg(seg));
-    }
-    return max;
-}
-function computeOffsetForSeg(seg) {
-    if ((seg.top == null)) {
-        seg.top = computeOffsetForSegs(seg.above);
-    }
-    return seg.top + seg.height;
-}
-function timeRowSegsCollide(seg0, seg1) {
-    return (seg0.left < seg1.right) && (seg0.right > seg1.left);
-}
-
-var TimelineLaneFillRenderer = /** @class */ (function (_super) {
-    __extends(TimelineLaneFillRenderer, _super);
-    function TimelineLaneFillRenderer(context, masterContainerEl, timeAxis) {
-        var _this = _super.call(this, context) || this;
-        _this.masterContainerEl = masterContainerEl;
-        _this.timeAxis = timeAxis;
-        return _this;
-    }
-    TimelineLaneFillRenderer.prototype.attachSegs = function (type, segs) {
-        if (segs.length) {
-            var className = void 0;
-            if (type === 'businessHours') {
-                className = 'bgevent';
-            }
-            else {
-                className = type.toLowerCase();
-            }
-            // making a new container each time is OKAY
-            // all types of segs (background or business hours or whatever) are rendered in one pass
-            var containerEl = createElement('div', { className: 'fc-' + className + '-container' });
-            this.masterContainerEl.appendChild(containerEl);
-            for (var _i = 0, segs_1 = segs; _i < segs_1.length; _i++) {
-                var seg = segs_1[_i];
-                containerEl.appendChild(seg.el);
-            }
-            return [containerEl]; // return value
-        }
-    };
-    TimelineLaneFillRenderer.prototype.computeSegSizes = function (segs) {
-        var timeAxis = this.timeAxis;
-        for (var _i = 0, segs_2 = segs; _i < segs_2.length; _i++) {
-            var seg = segs_2[_i];
-            var coords = timeAxis.rangeToCoords(seg);
-            seg.left = coords.left;
-            seg.right = coords.right;
-        }
-    };
-    TimelineLaneFillRenderer.prototype.assignSegSizes = function (segs) {
-        for (var _i = 0, segs_3 = segs; _i < segs_3.length; _i++) {
-            var seg = segs_3[_i];
-            applyStyle(seg.el, {
-                left: seg.left,
-                right: -seg.right
-            });
-        }
-    };
-    return TimelineLaneFillRenderer;
-}(FillRenderer));
-
-var TimelineLane = /** @class */ (function (_super) {
-    __extends(TimelineLane, _super);
-    function TimelineLane(context, fgContainerEl, bgContainerEl, timeAxis) {
-        var _this = _super.call(this, context, bgContainerEl) // should el be bgContainerEl???
-         || this;
-        _this.slicer = new TimelineLaneSlicer();
-        _this.renderEventDrag = memoizeRendering(_this._renderEventDrag, _this._unrenderEventDrag);
-        _this.renderEventResize = memoizeRendering(_this._renderEventResize, _this._unrenderEventResize);
-        var fillRenderer = _this.fillRenderer = new TimelineLaneFillRenderer(context, bgContainerEl, timeAxis);
-        var eventRenderer = _this.eventRenderer = new TimelineLaneEventRenderer(context, fgContainerEl, timeAxis);
-        _this.mirrorRenderer = new TimelineLaneEventRenderer(context, fgContainerEl, timeAxis);
-        _this.renderBusinessHours = memoizeRendering(fillRenderer.renderSegs.bind(fillRenderer, 'businessHours'), fillRenderer.unrender.bind(fillRenderer, 'businessHours'));
-        _this.renderDateSelection = memoizeRendering(fillRenderer.renderSegs.bind(fillRenderer, 'highlight'), fillRenderer.unrender.bind(fillRenderer, 'highlight'));
-        _this.renderBgEvents = memoizeRendering(fillRenderer.renderSegs.bind(fillRenderer, 'bgEvent'), fillRenderer.unrender.bind(fillRenderer, 'bgEvent'));
-        _this.renderFgEvents = memoizeRendering(eventRenderer.renderSegs.bind(eventRenderer), eventRenderer.unrender.bind(eventRenderer));
-        _this.renderEventSelection = memoizeRendering(eventRenderer.selectByInstanceId.bind(eventRenderer), eventRenderer.unselectByInstanceId.bind(eventRenderer), [_this.renderFgEvents]);
-        _this.timeAxis = timeAxis;
-        return _this;
-    }
-    TimelineLane.prototype.render = function (props) {
-        var slicedProps = this.slicer.sliceProps(props, props.dateProfile, this.timeAxis.tDateProfile.isTimeScale ? null : props.nextDayThreshold, this, this.timeAxis);
-        this.renderBusinessHours(slicedProps.businessHourSegs);
-        this.renderDateSelection(slicedProps.dateSelectionSegs);
-        this.renderBgEvents(slicedProps.bgEventSegs);
-        this.renderFgEvents(slicedProps.fgEventSegs);
-        this.renderEventSelection(slicedProps.eventSelection);
-        this.renderEventDrag(slicedProps.eventDrag);
-        this.renderEventResize(slicedProps.eventResize);
-    };
-    TimelineLane.prototype.destroy = function () {
-        _super.prototype.destroy.call(this);
-        this.renderBusinessHours.unrender();
-        this.renderDateSelection.unrender();
-        this.renderBgEvents.unrender();
-        this.renderFgEvents.unrender();
-        this.renderEventSelection.unrender();
-        this.renderEventDrag.unrender();
-        this.renderEventResize.unrender();
-    };
-    TimelineLane.prototype._renderEventDrag = function (state) {
-        if (state) {
-            this.eventRenderer.hideByHash(state.affectedInstances);
-            this.mirrorRenderer.renderSegs(state.segs, { isDragging: true, sourceSeg: state.sourceSeg });
-        }
-    };
-    TimelineLane.prototype._unrenderEventDrag = function (state) {
-        if (state) {
-            this.eventRenderer.showByHash(state.affectedInstances);
-            this.mirrorRenderer.unrender(state.segs, { isDragging: true, sourceSeg: state.sourceSeg });
-        }
-    };
-    TimelineLane.prototype._renderEventResize = function (state) {
-        if (state) {
-            // HACK. eventRenderer and fillRenderer both use these segs. would compete over seg.el
-            var segsForHighlight = state.segs.map(function (seg) {
-                return __assign({}, seg);
-            });
-            this.eventRenderer.hideByHash(state.affectedInstances);
-            this.fillRenderer.renderSegs('highlight', segsForHighlight);
-            this.mirrorRenderer.renderSegs(state.segs, { isDragging: true, sourceSeg: state.sourceSeg });
-        }
-    };
-    TimelineLane.prototype._unrenderEventResize = function (state) {
-        if (state) {
-            this.eventRenderer.showByHash(state.affectedInstances);
-            this.fillRenderer.unrender('highlight');
-            this.mirrorRenderer.unrender(state.segs, { isDragging: true, sourceSeg: state.sourceSeg });
-        }
-    };
-    TimelineLane.prototype.updateSize = function (isResize) {
-        var _a = this, fillRenderer = _a.fillRenderer, eventRenderer = _a.eventRenderer, mirrorRenderer = _a.mirrorRenderer;
-        fillRenderer.computeSizes(isResize);
-        eventRenderer.computeSizes(isResize);
-        mirrorRenderer.computeSizes(isResize);
-        fillRenderer.assignSizes(isResize);
-        eventRenderer.assignSizes(isResize);
-        mirrorRenderer.assignSizes(isResize);
-    };
-    return TimelineLane;
-}(DateComponent));
-var TimelineLaneSlicer = /** @class */ (function (_super) {
-    __extends(TimelineLaneSlicer, _super);
-    function TimelineLaneSlicer() {
-        return _super !== null && _super.apply(this, arguments) || this;
-    }
-    TimelineLaneSlicer.prototype.sliceRange = function (origRange, timeAxis) {
-        var tDateProfile = timeAxis.tDateProfile;
-        var dateProfile = timeAxis.props.dateProfile;
-        var normalRange = normalizeRange(origRange, tDateProfile, timeAxis.dateEnv);
-        var segs = [];
-        // protect against when the span is entirely in an invalid date region
-        if (timeAxis.computeDateSnapCoverage(normalRange.start) < timeAxis.computeDateSnapCoverage(normalRange.end)) {
-            // intersect the footprint's range with the grid's range
-            var slicedRange = intersectRanges(normalRange, tDateProfile.normalizedRange);
-            if (slicedRange) {
-                segs.push({
-                    start: slicedRange.start,
-                    end: slicedRange.end,
-                    isStart: slicedRange.start.valueOf() === normalRange.start.valueOf() && isValidDate(slicedRange.start, tDateProfile, dateProfile, timeAxis.view),
-                    isEnd: slicedRange.end.valueOf() === normalRange.end.valueOf() && isValidDate(addMs(slicedRange.end, -1), tDateProfile, dateProfile, timeAxis.view)
-                });
-            }
-        }
-        return segs;
-    };
-    return TimelineLaneSlicer;
-}(Slicer));
-
-var TimelineView = /** @class */ (function (_super) {
-    __extends(TimelineView, _super);
-    function TimelineView(context, viewSpec, dateProfileGenerator, parentEl) {
-        var _this = _super.call(this, context, viewSpec, dateProfileGenerator, parentEl) || this;
-        _this.el.classList.add('fc-timeline');
-        if (_this.opt('eventOverlap') === false) {
-            _this.el.classList.add('fc-no-overlap');
-        }
-        _this.el.innerHTML = _this.renderSkeletonHtml();
-        _this.timeAxis = new TimeAxis(_this.context, _this.el.querySelector('thead .fc-time-area'), _this.el.querySelector('tbody .fc-time-area'));
-        _this.lane = new TimelineLane(_this.context, _this.timeAxis.layout.bodyScroller.enhancedScroll.canvas.contentEl, _this.timeAxis.layout.bodyScroller.enhancedScroll.canvas.bgEl, _this.timeAxis);
-        context.calendar.registerInteractiveComponent(_this, {
-            el: _this.timeAxis.slats.el
-        });
-        return _this;
-    }
-    TimelineView.prototype.destroy = function () {
-        this.timeAxis.destroy();
-        this.lane.destroy();
-        _super.prototype.destroy.call(this);
-        this.calendar.unregisterInteractiveComponent(this);
-    };
-    TimelineView.prototype.renderSkeletonHtml = function () {
-        var theme = this.theme;
-        return "<table class=\"" + theme.getClass('tableGrid') + "\"> <thead class=\"fc-head\"> <tr> <td class=\"fc-time-area " + theme.getClass('widgetHeader') + "\"></td> </tr> </thead> <tbody class=\"fc-body\"> <tr> <td class=\"fc-time-area " + theme.getClass('widgetContent') + "\"></td> </tr> </tbody> </table>";
-    };
-    TimelineView.prototype.render = function (props) {
-        _super.prototype.render.call(this, props); // flags for updateSize, addScroll
-        this.timeAxis.receiveProps({
-            dateProfile: props.dateProfile
-        });
-        this.lane.receiveProps(__assign({}, props, { nextDayThreshold: this.nextDayThreshold }));
-    };
-    TimelineView.prototype.updateSize = function (isResize, totalHeight, isAuto) {
-        this.timeAxis.updateSize(isResize, totalHeight, isAuto);
-        this.lane.updateSize(isResize);
-    };
-    // Now Indicator
-    // ------------------------------------------------------------------------------------------
-    TimelineView.prototype.getNowIndicatorUnit = function (dateProfile) {
-        return this.timeAxis.getNowIndicatorUnit(dateProfile);
-    };
-    TimelineView.prototype.renderNowIndicator = function (date) {
-        this.timeAxis.renderNowIndicator(date);
-    };
-    TimelineView.prototype.unrenderNowIndicator = function () {
-        this.timeAxis.unrenderNowIndicator();
-    };
-    // Scroll System
-    // ------------------------------------------------------------------------------------------
-    TimelineView.prototype.computeDateScroll = function (duration) {
-        return this.timeAxis.computeDateScroll(duration);
-    };
-    TimelineView.prototype.applyScroll = function (scroll, isResize) {
-        _super.prototype.applyScroll.call(this, scroll, isResize); // will call applyDateScroll
-        // avoid updating stickyscroll too often
-        // TODO: repeat code as ResourceTimelineView::updateSize
-        var calendar = this.calendar;
-        if (isResize || calendar.isViewUpdated || calendar.isDatesUpdated || calendar.isEventsUpdated) {
-            this.timeAxis.updateStickyScrollers();
-        }
-    };
-    TimelineView.prototype.applyDateScroll = function (scroll) {
-        this.timeAxis.applyDateScroll(scroll);
-    };
-    TimelineView.prototype.queryScroll = function () {
-        var enhancedScroll = this.timeAxis.layout.bodyScroller.enhancedScroll;
-        return {
-            top: enhancedScroll.getScrollTop(),
-            left: enhancedScroll.getScrollLeft()
-        };
-    };
-    // Hit System
-    // ------------------------------------------------------------------------------------------
-    TimelineView.prototype.buildPositionCaches = function () {
-        this.timeAxis.slats.updateSize();
-    };
-    TimelineView.prototype.queryHit = function (positionLeft, positionTop, elWidth, elHeight) {
-        var slatHit = this.timeAxis.slats.positionToHit(positionLeft);
-        if (slatHit) {
-            return {
-                component: this,
-                dateSpan: slatHit.dateSpan,
-                rect: {
-                    left: slatHit.left,
-                    right: slatHit.right,
-                    top: 0,
-                    bottom: elHeight
-                },
-                dayEl: slatHit.dayEl,
-                layer: 0
-            };
-        }
-    };
-    return TimelineView;
-}(View));
-
-var main = createPlugin({
-    defaultView: 'timelineDay',
-    views: {
-        timeline: {
-            class: TimelineView,
-            eventResizableFromStart: true // how is this consumed for TimelineView tho?
-        },
-        timelineDay: {
-            type: 'timeline',
-            duration: { days: 1 }
-        },
-        timelineWeek: {
-            type: 'timeline',
-            duration: { weeks: 1 }
-        },
-        timelineMonth: {
-            type: 'timeline',
-            duration: { months: 1 }
-        },
-        timelineYear: {
-            type: 'timeline',
-            duration: { years: 1 }
-        }
-    }
-});
-
-export default main;
-export { HeaderBodyLayout, ScrollJoiner, StickyScroller, TimeAxis, TimelineLane, TimelineView };
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/timeline/main.js b/AKPlan/static/AKPlan/vendor/fullcalendar/timeline/main.js
deleted file mode 100644
index f349419ba437bad07ed35a014a33230890bcfffb..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/timeline/main.js
+++ /dev/null
@@ -1,1996 +0,0 @@
-/*!
-FullCalendar Timeline Plugin v4.3.0
-Docs & License: https://fullcalendar.io/scheduler
-(c) 2019 Adam Shaw
-*/
-
-(function (global, factory) {
-    typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@fullcalendar/core')) :
-    typeof define === 'function' && define.amd ? define(['exports', '@fullcalendar/core'], factory) :
-    (global = global || self, factory(global.FullCalendarTimeline = {}, global.FullCalendar));
-}(this, function (exports, core) { 'use strict';
-
-    /*! *****************************************************************************
-    Copyright (c) Microsoft Corporation. All rights reserved.
-    Licensed under the Apache License, Version 2.0 (the "License"); you may not use
-    this file except in compliance with the License. You may obtain a copy of the
-    License at http://www.apache.org/licenses/LICENSE-2.0
-
-    THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-    KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
-    WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
-    MERCHANTABLITY OR NON-INFRINGEMENT.
-
-    See the Apache Version 2.0 License for specific language governing permissions
-    and limitations under the License.
-    ***************************************************************************** */
-    /* global Reflect, Promise */
-
-    var extendStatics = function(d, b) {
-        extendStatics = Object.setPrototypeOf ||
-            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
-            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
-        return extendStatics(d, b);
-    };
-
-    function __extends(d, b) {
-        extendStatics(d, b);
-        function __() { this.constructor = d; }
-        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
-    }
-
-    var __assign = function() {
-        __assign = Object.assign || function __assign(t) {
-            for (var s, i = 1, n = arguments.length; i < n; i++) {
-                s = arguments[i];
-                for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
-            }
-            return t;
-        };
-        return __assign.apply(this, arguments);
-    };
-
-    /*
-    A rectangular area of content that lives within a Scroller.
-    Can have "gutters", areas of dead spacing around the perimeter.
-    Also very useful for forcing a width, which a Scroller cannot do alone.
-    Has a content area that lives above a background area.
-    */
-    var ScrollerCanvas = /** @class */ (function () {
-        function ScrollerCanvas() {
-            this.gutters = {};
-            this.el = core.htmlToElement("<div class=\"fc-scroller-canvas\"> <div class=\"fc-content\"></div> <div class=\"fc-bg\"></div> </div>");
-            this.contentEl = this.el.querySelector('.fc-content');
-            this.bgEl = this.el.querySelector('.fc-bg');
-        }
-        /*
-        If falsy, resets all the gutters to 0
-        */
-        ScrollerCanvas.prototype.setGutters = function (gutters) {
-            if (!gutters) {
-                this.gutters = {};
-            }
-            else {
-                __assign(this.gutters, gutters);
-            }
-            this.updateSize();
-        };
-        ScrollerCanvas.prototype.setWidth = function (width) {
-            this.width = width;
-            this.updateSize();
-        };
-        ScrollerCanvas.prototype.setMinWidth = function (minWidth) {
-            this.minWidth = minWidth;
-            this.updateSize();
-        };
-        ScrollerCanvas.prototype.clearWidth = function () {
-            this.width = null;
-            this.minWidth = null;
-            this.updateSize();
-        };
-        ScrollerCanvas.prototype.updateSize = function () {
-            var _a = this, gutters = _a.gutters, el = _a.el;
-            // is border-box (width includes padding)
-            core.forceClassName(el, 'fc-gutter-left', gutters.left);
-            core.forceClassName(el, 'fc-gutter-right', gutters.right);
-            core.forceClassName(el, 'fc-gutter-top', gutters.top);
-            core.forceClassName(el, 'fc-gutter-bottom', gutters.bottom);
-            core.applyStyle(el, {
-                paddingLeft: gutters.left || '',
-                paddingRight: gutters.right || '',
-                paddingTop: gutters.top || '',
-                paddingBottom: gutters.bottom || '',
-                width: (this.width != null) ?
-                    this.width + (gutters.left || 0) + (gutters.right || 0) :
-                    '',
-                minWidth: (this.minWidth != null) ?
-                    this.minWidth + (gutters.left || 0) + (gutters.right || 0) :
-                    ''
-            });
-            core.applyStyle(this.bgEl, {
-                left: gutters.left || '',
-                right: gutters.right || '',
-                top: gutters.top || '',
-                bottom: gutters.bottom || ''
-            });
-        };
-        return ScrollerCanvas;
-    }());
-
-    var EnhancedScroller = /** @class */ (function (_super) {
-        __extends(EnhancedScroller, _super);
-        function EnhancedScroller(overflowX, overflowY) {
-            var _this = _super.call(this, overflowX, overflowY) || this;
-            // Scroll Events
-            // ----------------------------------------------------------------------------------------------
-            _this.reportScroll = function () {
-                if (!_this.isScrolling) {
-                    _this.reportScrollStart();
-                }
-                _this.trigger('scroll');
-                _this.isMoving = true;
-                _this.requestMovingEnd();
-            };
-            _this.reportScrollStart = function () {
-                if (!_this.isScrolling) {
-                    _this.isScrolling = true;
-                    _this.trigger('scrollStart', _this.isTouching); // created in constructor
-                }
-            };
-            // Touch Events
-            // ----------------------------------------------------------------------------------------------
-            // will fire *before* the scroll event is fired
-            _this.reportTouchStart = function () {
-                _this.isTouching = true;
-            };
-            _this.reportTouchEnd = function () {
-                if (_this.isTouching) {
-                    _this.isTouching = false;
-                    // if touch scrolling was re-enabled during a recent touch scroll
-                    // then unbind the handlers that are preventing it from happening.
-                    if (_this.isTouchScrollEnabled) {
-                        _this.unbindPreventTouchScroll(); // won't do anything if not bound
-                    }
-                    // if the user ended their touch, and the scroll area wasn't moving,
-                    // we consider this to be the end of the scroll.
-                    if (!_this.isMoving) {
-                        _this.reportScrollEnd(); // won't fire if already ended
-                    }
-                }
-            };
-            _this.isScrolling = false;
-            _this.isTouching = false;
-            _this.isMoving = false;
-            _this.isTouchScrollEnabled = true;
-            _this.requestMovingEnd = core.debounce(_this.reportMovingEnd, 500);
-            _this.canvas = new ScrollerCanvas();
-            _this.el.appendChild(_this.canvas.el);
-            _this.applyOverflow();
-            _this.bindHandlers();
-            return _this;
-        }
-        EnhancedScroller.prototype.destroy = function () {
-            _super.prototype.destroy.call(this);
-            this.unbindHandlers();
-        };
-        // Touch scroll prevention
-        // ----------------------------------------------------------------------------------------------
-        EnhancedScroller.prototype.disableTouchScroll = function () {
-            this.isTouchScrollEnabled = false;
-            this.bindPreventTouchScroll(); // will be unbound in enableTouchScroll or reportTouchEnd
-        };
-        EnhancedScroller.prototype.enableTouchScroll = function () {
-            this.isTouchScrollEnabled = true;
-            // only immediately unbind if a touch event is NOT in progress.
-            // otherwise, it will be handled by reportTouchEnd.
-            if (!this.isTouching) {
-                this.unbindPreventTouchScroll();
-            }
-        };
-        EnhancedScroller.prototype.bindPreventTouchScroll = function () {
-            if (!this.preventTouchScrollHandler) {
-                this.el.addEventListener('touchmove', (this.preventTouchScrollHandler = core.preventDefault));
-            }
-        };
-        EnhancedScroller.prototype.unbindPreventTouchScroll = function () {
-            if (this.preventTouchScrollHandler) {
-                this.el.removeEventListener('touchmove', this.preventTouchScrollHandler);
-                this.preventTouchScrollHandler = null;
-            }
-        };
-        // Handlers
-        // ----------------------------------------------------------------------------------------------
-        EnhancedScroller.prototype.bindHandlers = function () {
-            this.el.addEventListener('scroll', this.reportScroll);
-            this.el.addEventListener('touchstart', this.reportTouchStart, { passive: true });
-            this.el.addEventListener('touchend', this.reportTouchEnd);
-        };
-        EnhancedScroller.prototype.unbindHandlers = function () {
-            this.el.removeEventListener('scroll', this.reportScroll);
-            this.el.removeEventListener('touchstart', this.reportTouchStart, { passive: true });
-            this.el.removeEventListener('touchend', this.reportTouchEnd);
-        };
-        EnhancedScroller.prototype.reportMovingEnd = function () {
-            this.isMoving = false;
-            // only end the scroll if not currently touching.
-            // if touching, the scrolling will end later, on touchend.
-            if (!this.isTouching) {
-                this.reportScrollEnd();
-            }
-        };
-        EnhancedScroller.prototype.reportScrollEnd = function () {
-            if (this.isScrolling) {
-                this.trigger('scrollEnd');
-                this.isScrolling = false;
-            }
-        };
-        // Horizontal Scroll Normalization
-        // ----------------------------------------------------------------------------------------------
-        // http://stackoverflow.com/questions/24276619/better-way-to-get-the-viewport-of-a-scrollable-div-in-rtl-mode/24394376#24394376
-        // TODO: move all this to util functions
-        /*
-        If RTL, and scrolled to the left, returns NEGATIVE value (like Firefox)
-        */
-        EnhancedScroller.prototype.getScrollLeft = function () {
-            var el = this.el;
-            var direction = window.getComputedStyle(el).direction;
-            var val = el.scrollLeft;
-            if (direction === 'rtl') {
-                switch (getRtlScrollSystem()) {
-                    case 'positive':
-                        val = (val + el.clientWidth) - el.scrollWidth;
-                        break;
-                    case 'reverse':
-                        val = -val;
-                        break;
-                }
-            }
-            return val;
-        };
-        /*
-        Accepts a NEGATIVE value for when scrolled in RTL
-        */
-        EnhancedScroller.prototype.setScrollLeft = function (val) {
-            var el = this.el;
-            var direction = window.getComputedStyle(el).direction;
-            if (direction === 'rtl') {
-                switch (getRtlScrollSystem()) {
-                    case 'positive':
-                        val = (val - el.clientWidth) + el.scrollWidth;
-                        break;
-                    case 'reverse':
-                        val = -val;
-                        break;
-                }
-            }
-            el.scrollLeft = val;
-        };
-        /*
-        Always returns the number of pixels scrolled from the leftmost position (even if RTL).
-        Always positive.
-        */
-        EnhancedScroller.prototype.getScrollFromLeft = function () {
-            var el = this.el;
-            var direction = window.getComputedStyle(el).direction;
-            var val = el.scrollLeft;
-            if (direction === 'rtl') {
-                switch (getRtlScrollSystem()) {
-                    case 'negative':
-                        val = (val - el.clientWidth) + el.scrollWidth;
-                        break;
-                    case 'reverse':
-                        val = (-val - el.clientWidth) + el.scrollWidth;
-                        break;
-                }
-            }
-            return val;
-        };
-        return EnhancedScroller;
-    }(core.ScrollComponent));
-    core.EmitterMixin.mixInto(EnhancedScroller);
-    // Horizontal Scroll System Detection
-    // ----------------------------------------------------------------------------------------------
-    var _rtlScrollSystem;
-    function getRtlScrollSystem() {
-        return _rtlScrollSystem || (_rtlScrollSystem = detectRtlScrollSystem());
-    }
-    function detectRtlScrollSystem() {
-        var el = core.htmlToElement("<div style=\" position: absolute; top: -1000px; width: 1px; height: 1px; overflow: scroll; direction: rtl; font-size: 100px; \">A</div>");
-        document.body.appendChild(el);
-        var system;
-        if (el.scrollLeft > 0) {
-            system = 'positive';
-        }
-        else {
-            el.scrollLeft = 1;
-            if (el.scrollLeft > 0) {
-                system = 'reverse';
-            }
-            else {
-                system = 'negative';
-            }
-        }
-        core.removeElement(el);
-        return system;
-    }
-
-    /*
-    A Scroller, but with a wrapping div that allows "clipping" away of native scrollbars,
-    giving the appearance that there are no scrollbars.
-    */
-    var ClippedScroller = /** @class */ (function () {
-        /*
-        Received overflows can be set to 'clipped', meaning scrollbars shouldn't be visible
-        to the user, but the area should still scroll.
-        */
-        function ClippedScroller(overflowX, overflowY, parentEl) {
-            this.isHScrollbarsClipped = false;
-            this.isVScrollbarsClipped = false;
-            if (overflowX === 'clipped-scroll') {
-                overflowX = 'scroll';
-                this.isHScrollbarsClipped = true;
-            }
-            if (overflowY === 'clipped-scroll') {
-                overflowY = 'scroll';
-                this.isVScrollbarsClipped = true;
-            }
-            this.enhancedScroll = new EnhancedScroller(overflowX, overflowY);
-            parentEl.appendChild(this.el = core.createElement('div', {
-                className: 'fc-scroller-clip'
-            }));
-            this.el.appendChild(this.enhancedScroll.el);
-        }
-        ClippedScroller.prototype.destroy = function () {
-            core.removeElement(this.el);
-        };
-        ClippedScroller.prototype.updateSize = function () {
-            var enhancedScroll = this.enhancedScroll;
-            var scrollEl = enhancedScroll.el;
-            var edges = core.computeEdges(scrollEl);
-            var cssProps = { marginLeft: 0, marginRight: 0, marginTop: 0, marginBottom: 0 };
-            // give the inner scrolling div negative margins so that its scrollbars
-            // are nudged outside of the bounding box of the wrapper, which is overflow:hidden
-            if (this.isVScrollbarsClipped) {
-                cssProps.marginLeft = -edges.scrollbarLeft;
-                cssProps.marginRight = -edges.scrollbarRight;
-            }
-            if (this.isHScrollbarsClipped) {
-                cssProps.marginBottom = -edges.scrollbarBottom;
-            }
-            core.applyStyle(scrollEl, cssProps);
-            // if we are attempting to hide the scrollbars offscreen, OSX/iOS will still
-            // display the floating scrollbars. attach a className to force-hide them.
-            if ((this.isHScrollbarsClipped || (enhancedScroll.overflowX === 'hidden')) && // should never show?
-                (this.isVScrollbarsClipped || (enhancedScroll.overflowY === 'hidden')) && // should never show?
-                !( // doesn't have any scrollbar mass
-                edges.scrollbarLeft ||
-                    edges.scrollbarRight ||
-                    edges.scrollbarBottom)) {
-                scrollEl.classList.add('fc-no-scrollbars');
-            }
-            else {
-                scrollEl.classList.remove('fc-no-scrollbars');
-            }
-        };
-        ClippedScroller.prototype.setHeight = function (height) {
-            this.enhancedScroll.setHeight(height);
-        };
-        /*
-        Accounts for 'clipped' scrollbars
-        */
-        ClippedScroller.prototype.getScrollbarWidths = function () {
-            var widths = this.enhancedScroll.getScrollbarWidths();
-            if (this.isVScrollbarsClipped) {
-                widths.left = 0;
-                widths.right = 0;
-            }
-            if (this.isHScrollbarsClipped) {
-                widths.bottom = 0;
-            }
-            return widths;
-        };
-        return ClippedScroller;
-    }());
-
-    var ScrollJoiner = /** @class */ (function () {
-        function ScrollJoiner(axis, scrollers) {
-            this.axis = axis;
-            this.scrollers = scrollers;
-            for (var _i = 0, _a = this.scrollers; _i < _a.length; _i++) {
-                var scroller = _a[_i];
-                this.initScroller(scroller);
-            }
-        }
-        ScrollJoiner.prototype.initScroller = function (scroller) {
-            var _this = this;
-            var enhancedScroll = scroller.enhancedScroll;
-            // when the user scrolls via mousewheel, we know for sure the target
-            // scroller should be the master. capture the various x-browser events that fire.
-            var onScroll = function () {
-                _this.assignMasterScroller(scroller);
-            };
-            'wheel mousewheel DomMouseScroll MozMousePixelScroll'.split(' ').forEach(function (evName) {
-                enhancedScroll.el.addEventListener(evName, onScroll);
-            });
-            enhancedScroll
-                .on('scrollStart', function () {
-                if (!_this.masterScroller) {
-                    _this.assignMasterScroller(scroller);
-                }
-            })
-                .on('scroll', function () {
-                if (scroller === _this.masterScroller) {
-                    for (var _i = 0, _a = _this.scrollers; _i < _a.length; _i++) {
-                        var otherScroller = _a[_i];
-                        if (otherScroller !== scroller) {
-                            switch (_this.axis) {
-                                case 'horizontal':
-                                    otherScroller.enhancedScroll.el.scrollLeft = enhancedScroll.el.scrollLeft;
-                                    break;
-                                case 'vertical':
-                                    otherScroller.enhancedScroll.setScrollTop(enhancedScroll.getScrollTop());
-                                    break;
-                            }
-                        }
-                    }
-                }
-            })
-                .on('scrollEnd', function () {
-                if (scroller === _this.masterScroller) {
-                    _this.unassignMasterScroller();
-                }
-            });
-        };
-        ScrollJoiner.prototype.assignMasterScroller = function (scroller) {
-            this.unassignMasterScroller();
-            this.masterScroller = scroller;
-            for (var _i = 0, _a = this.scrollers; _i < _a.length; _i++) {
-                var otherScroller = _a[_i];
-                if (otherScroller !== scroller) {
-                    otherScroller.enhancedScroll.disableTouchScroll();
-                }
-            }
-        };
-        ScrollJoiner.prototype.unassignMasterScroller = function () {
-            if (this.masterScroller) {
-                for (var _i = 0, _a = this.scrollers; _i < _a.length; _i++) {
-                    var otherScroller = _a[_i];
-                    otherScroller.enhancedScroll.enableTouchScroll();
-                }
-                this.masterScroller = null;
-            }
-        };
-        ScrollJoiner.prototype.update = function () {
-            var allWidths = this.scrollers.map(function (scroller) { return scroller.getScrollbarWidths(); });
-            var maxLeft = 0;
-            var maxRight = 0;
-            var maxTop = 0;
-            var maxBottom = 0;
-            var widths;
-            var i;
-            for (var _i = 0, allWidths_1 = allWidths; _i < allWidths_1.length; _i++) {
-                widths = allWidths_1[_i];
-                maxLeft = Math.max(maxLeft, widths.left);
-                maxRight = Math.max(maxRight, widths.right);
-                maxTop = Math.max(maxTop, widths.top);
-                maxBottom = Math.max(maxBottom, widths.bottom);
-            }
-            for (i = 0; i < this.scrollers.length; i++) {
-                var scroller = this.scrollers[i];
-                widths = allWidths[i];
-                scroller.enhancedScroll.canvas.setGutters(this.axis === 'horizontal' ?
-                    {
-                        left: maxLeft - widths.left,
-                        right: maxRight - widths.right
-                    } :
-                    {
-                        top: maxTop - widths.top,
-                        bottom: maxBottom - widths.bottom
-                    });
-            }
-        };
-        return ScrollJoiner;
-    }());
-
-    var HeaderBodyLayout = /** @class */ (function () {
-        /*
-        verticalScroll = 'auto' | 'clipped-scroll'
-        */
-        function HeaderBodyLayout(headerContainerEl, bodyContainerEl, verticalScroll) {
-            this.headerScroller = new ClippedScroller('clipped-scroll', 'hidden', headerContainerEl);
-            this.bodyScroller = new ClippedScroller('auto', verticalScroll, bodyContainerEl);
-            this.scrollJoiner = new ScrollJoiner('horizontal', [
-                this.headerScroller,
-                this.bodyScroller
-            ]);
-        }
-        HeaderBodyLayout.prototype.destroy = function () {
-            this.headerScroller.destroy();
-            this.bodyScroller.destroy();
-        };
-        HeaderBodyLayout.prototype.setHeight = function (totalHeight, isAuto) {
-            var bodyHeight;
-            if (isAuto) {
-                bodyHeight = 'auto';
-            }
-            else {
-                bodyHeight = totalHeight - this.queryHeadHeight();
-            }
-            this.bodyScroller.setHeight(bodyHeight);
-            this.headerScroller.updateSize(); // adjusts gutters and classNames
-            this.bodyScroller.updateSize(); // adjusts gutters and classNames
-            this.scrollJoiner.update();
-        };
-        HeaderBodyLayout.prototype.queryHeadHeight = function () {
-            return this.headerScroller.enhancedScroll.canvas.contentEl.getBoundingClientRect().height;
-        };
-        return HeaderBodyLayout;
-    }());
-
-    var TimelineHeader = /** @class */ (function (_super) {
-        __extends(TimelineHeader, _super);
-        function TimelineHeader(context, parentEl) {
-            var _this = _super.call(this, context) || this;
-            parentEl.appendChild(_this.tableEl = core.createElement('table', {
-                className: _this.theme.getClass('tableGrid')
-            }));
-            return _this;
-        }
-        TimelineHeader.prototype.destroy = function () {
-            core.removeElement(this.tableEl);
-            _super.prototype.destroy.call(this);
-        };
-        TimelineHeader.prototype.render = function (props) {
-            this.renderDates(props.tDateProfile);
-        };
-        TimelineHeader.prototype.renderDates = function (tDateProfile) {
-            var _a = this, dateEnv = _a.dateEnv, theme = _a.theme;
-            var cellRows = tDateProfile.cellRows;
-            var lastRow = cellRows[cellRows.length - 1];
-            var isChrono = core.asRoughMs(tDateProfile.labelInterval) > core.asRoughMs(tDateProfile.slotDuration);
-            var oneDay = core.isSingleDay(tDateProfile.slotDuration);
-            var html = '<colgroup>';
-            // needs to be a col for each body slat. header cells will have colspans
-            for (var i = tDateProfile.slotCnt - 1; i >= 0; i--) {
-                html += '<col/>';
-            }
-            html += '</colgroup>';
-            html += '<tbody>';
-            for (var _i = 0, cellRows_1 = cellRows; _i < cellRows_1.length; _i++) {
-                var rowCells = cellRows_1[_i];
-                var isLast = rowCells === lastRow;
-                html += '<tr' + (isChrono && isLast ? ' class="fc-chrono"' : '') + '>';
-                for (var _b = 0, rowCells_1 = rowCells; _b < rowCells_1.length; _b++) {
-                    var cell = rowCells_1[_b];
-                    var headerCellClassNames = [theme.getClass('widgetHeader')];
-                    if (cell.isWeekStart) {
-                        headerCellClassNames.push('fc-em-cell');
-                    }
-                    if (oneDay) {
-                        headerCellClassNames = headerCellClassNames.concat(core.getDayClasses(cell.date, this.props.dateProfile, this.context, true) // adds "today" class and other day-based classes
-                        );
-                    }
-                    html +=
-                        '<th class="' + headerCellClassNames.join(' ') + '"' +
-                            ' data-date="' + dateEnv.formatIso(cell.date, { omitTime: !tDateProfile.isTimeScale, omitTimeZoneOffset: true }) + '"' +
-                            (cell.colspan > 1 ? ' colspan="' + cell.colspan + '"' : '') +
-                            '>' +
-                            '<div class="fc-cell-content">' +
-                            cell.spanHtml +
-                            '</div>' +
-                            '</th>';
-                }
-                html += '</tr>';
-            }
-            html += '</tbody>';
-            this.tableEl.innerHTML = html; // TODO: does this work cross-browser?
-            this.slatColEls = core.findElements(this.tableEl, 'col');
-            this.innerEls = core.findElements(this.tableEl.querySelector('tr:last-child'), // compound selector won't work because of query-root problem
-            'th .fc-cell-text');
-            core.findElements(this.tableEl.querySelectorAll('tr:not(:last-child)'), // compound selector won't work because of query-root problem
-            'th .fc-cell-text').forEach(function (innerEl) {
-                innerEl.classList.add('fc-sticky');
-            });
-        };
-        return TimelineHeader;
-    }(core.Component));
-
-    var TimelineSlats = /** @class */ (function (_super) {
-        __extends(TimelineSlats, _super);
-        function TimelineSlats(context, parentEl) {
-            var _this = _super.call(this, context) || this;
-            parentEl.appendChild(_this.el = core.createElement('div', { className: 'fc-slats' }));
-            return _this;
-        }
-        TimelineSlats.prototype.destroy = function () {
-            core.removeElement(this.el);
-            _super.prototype.destroy.call(this);
-        };
-        TimelineSlats.prototype.render = function (props) {
-            this.renderDates(props.tDateProfile);
-        };
-        TimelineSlats.prototype.renderDates = function (tDateProfile) {
-            var _a = this, theme = _a.theme, view = _a.view, dateEnv = _a.dateEnv;
-            var slotDates = tDateProfile.slotDates, isWeekStarts = tDateProfile.isWeekStarts;
-            var html = '<table class="' + theme.getClass('tableGrid') + '">' +
-                '<colgroup>';
-            for (var i = 0; i < slotDates.length; i++) {
-                html += '<col/>';
-            }
-            html += '</colgroup>';
-            html += '<tbody><tr>';
-            for (var i = 0; i < slotDates.length; i++) {
-                html += this.slatCellHtml(slotDates[i], isWeekStarts[i], tDateProfile);
-            }
-            html += '</tr></tbody></table>';
-            this.el.innerHTML = html;
-            this.slatColEls = core.findElements(this.el, 'col');
-            this.slatEls = core.findElements(this.el, 'td');
-            for (var i = 0; i < slotDates.length; i++) {
-                view.publiclyTrigger('dayRender', [
-                    {
-                        date: dateEnv.toDate(slotDates[i]),
-                        el: this.slatEls[i],
-                        view: view
-                    }
-                ]);
-            }
-            this.outerCoordCache = new core.PositionCache(this.el, this.slatEls, true, // isHorizontal
-            false // isVertical
-            );
-            // for the inner divs within the slats
-            // used for event rendering and scrollTime, to disregard slat border
-            this.innerCoordCache = new core.PositionCache(this.el, core.findChildren(this.slatEls, 'div'), true, // isHorizontal
-            false // isVertical
-            );
-        };
-        TimelineSlats.prototype.slatCellHtml = function (date, isEm, tDateProfile) {
-            var _a = this, theme = _a.theme, dateEnv = _a.dateEnv;
-            var classes;
-            if (tDateProfile.isTimeScale) {
-                classes = [];
-                classes.push(core.isInt(dateEnv.countDurationsBetween(tDateProfile.normalizedRange.start, date, tDateProfile.labelInterval)) ?
-                    'fc-major' :
-                    'fc-minor');
-            }
-            else {
-                classes = core.getDayClasses(date, this.props.dateProfile, this.context);
-                classes.push('fc-day');
-            }
-            classes.unshift(theme.getClass('widgetContent'));
-            if (isEm) {
-                classes.push('fc-em-cell');
-            }
-            return '<td class="' + classes.join(' ') + '"' +
-                ' data-date="' + dateEnv.formatIso(date, { omitTime: !tDateProfile.isTimeScale, omitTimeZoneOffset: true }) + '"' +
-                '><div></div></td>';
-        };
-        TimelineSlats.prototype.updateSize = function () {
-            this.outerCoordCache.build();
-            this.innerCoordCache.build();
-        };
-        TimelineSlats.prototype.positionToHit = function (leftPosition) {
-            var outerCoordCache = this.outerCoordCache;
-            var tDateProfile = this.props.tDateProfile;
-            var slatIndex = outerCoordCache.leftToIndex(leftPosition);
-            if (slatIndex != null) {
-                // somewhat similar to what TimeGrid does. consolidate?
-                var slatWidth = outerCoordCache.getWidth(slatIndex);
-                var partial = this.isRtl ?
-                    (outerCoordCache.rights[slatIndex] - leftPosition) / slatWidth :
-                    (leftPosition - outerCoordCache.lefts[slatIndex]) / slatWidth;
-                var localSnapIndex = Math.floor(partial * tDateProfile.snapsPerSlot);
-                var start = this.dateEnv.add(tDateProfile.slotDates[slatIndex], core.multiplyDuration(tDateProfile.snapDuration, localSnapIndex));
-                var end = this.dateEnv.add(start, tDateProfile.snapDuration);
-                return {
-                    dateSpan: {
-                        range: { start: start, end: end },
-                        allDay: !this.props.tDateProfile.isTimeScale
-                    },
-                    dayEl: this.slatColEls[slatIndex],
-                    left: outerCoordCache.lefts[slatIndex],
-                    right: outerCoordCache.rights[slatIndex]
-                };
-            }
-            return null;
-        };
-        return TimelineSlats;
-    }(core.Component));
-
-    var MIN_AUTO_LABELS = 18; // more than `12` months but less that `24` hours
-    var MAX_AUTO_SLOTS_PER_LABEL = 6; // allows 6 10-min slots in an hour
-    var MAX_AUTO_CELLS = 200; // allows 4-days to have a :30 slot duration
-    core.config.MAX_TIMELINE_SLOTS = 1000;
-    // potential nice values for slot-duration and interval-duration
-    var STOCK_SUB_DURATIONS = [
-        { years: 1 },
-        { months: 1 },
-        { days: 1 },
-        { hours: 1 },
-        { minutes: 30 },
-        { minutes: 15 },
-        { minutes: 10 },
-        { minutes: 5 },
-        { minutes: 1 },
-        { seconds: 30 },
-        { seconds: 15 },
-        { seconds: 10 },
-        { seconds: 5 },
-        { seconds: 1 },
-        { milliseconds: 500 },
-        { milliseconds: 100 },
-        { milliseconds: 10 },
-        { milliseconds: 1 }
-    ];
-    function buildTimelineDateProfile(dateProfile, view) {
-        var dateEnv = view.dateEnv;
-        var tDateProfile = {
-            labelInterval: queryDurationOption(view, 'slotLabelInterval'),
-            slotDuration: queryDurationOption(view, 'slotDuration')
-        };
-        validateLabelAndSlot(tDateProfile, dateProfile, dateEnv); // validate after computed grid duration
-        ensureLabelInterval(tDateProfile, dateProfile, dateEnv);
-        ensureSlotDuration(tDateProfile, dateProfile, dateEnv);
-        var input = view.opt('slotLabelFormat');
-        var rawFormats = Array.isArray(input) ?
-            input
-            : (input != null) ?
-                [input]
-                :
-                    computeHeaderFormats(tDateProfile, dateProfile, dateEnv, view);
-        tDateProfile.headerFormats = rawFormats.map(function (rawFormat) {
-            return core.createFormatter(rawFormat);
-        });
-        tDateProfile.isTimeScale = Boolean(tDateProfile.slotDuration.milliseconds);
-        var largeUnit = null;
-        if (!tDateProfile.isTimeScale) {
-            var slotUnit = core.greatestDurationDenominator(tDateProfile.slotDuration).unit;
-            if (/year|month|week/.test(slotUnit)) {
-                largeUnit = slotUnit;
-            }
-        }
-        tDateProfile.largeUnit = largeUnit;
-        tDateProfile.emphasizeWeeks =
-            core.isSingleDay(tDateProfile.slotDuration) &&
-                currentRangeAs('weeks', dateProfile, dateEnv) >= 2 &&
-                !view.opt('businessHours');
-        /*
-        console.log('label interval =', timelineView.labelInterval.humanize())
-        console.log('slot duration =', timelineView.slotDuration.humanize())
-        console.log('header formats =', timelineView.headerFormats)
-        console.log('isTimeScale', timelineView.isTimeScale)
-        console.log('largeUnit', timelineView.largeUnit)
-        */
-        var rawSnapDuration = view.opt('snapDuration');
-        var snapDuration;
-        var snapsPerSlot;
-        if (rawSnapDuration) {
-            snapDuration = core.createDuration(rawSnapDuration);
-            snapsPerSlot = core.wholeDivideDurations(tDateProfile.slotDuration, snapDuration);
-            // ^ TODO: warning if not whole?
-        }
-        if (snapsPerSlot == null) {
-            snapDuration = tDateProfile.slotDuration;
-            snapsPerSlot = 1;
-        }
-        tDateProfile.snapDuration = snapDuration;
-        tDateProfile.snapsPerSlot = snapsPerSlot;
-        // more...
-        var timeWindowMs = core.asRoughMs(dateProfile.maxTime) - core.asRoughMs(dateProfile.minTime);
-        // TODO: why not use normalizeRange!?
-        var normalizedStart = normalizeDate(dateProfile.renderRange.start, tDateProfile, dateEnv);
-        var normalizedEnd = normalizeDate(dateProfile.renderRange.end, tDateProfile, dateEnv);
-        // apply minTime/maxTime
-        // TODO: View should be responsible.
-        if (tDateProfile.isTimeScale) {
-            normalizedStart = dateEnv.add(normalizedStart, dateProfile.minTime);
-            normalizedEnd = dateEnv.add(core.addDays(normalizedEnd, -1), dateProfile.maxTime);
-        }
-        tDateProfile.timeWindowMs = timeWindowMs;
-        tDateProfile.normalizedRange = { start: normalizedStart, end: normalizedEnd };
-        var slotDates = [];
-        var date = normalizedStart;
-        while (date < normalizedEnd) {
-            if (isValidDate(date, tDateProfile, dateProfile, view)) {
-                slotDates.push(date);
-            }
-            date = dateEnv.add(date, tDateProfile.slotDuration);
-        }
-        tDateProfile.slotDates = slotDates;
-        // more...
-        var snapIndex = -1;
-        var snapDiff = 0; // index of the diff :(
-        var snapDiffToIndex = [];
-        var snapIndexToDiff = [];
-        date = normalizedStart;
-        while (date < normalizedEnd) {
-            if (isValidDate(date, tDateProfile, dateProfile, view)) {
-                snapIndex++;
-                snapDiffToIndex.push(snapIndex);
-                snapIndexToDiff.push(snapDiff);
-            }
-            else {
-                snapDiffToIndex.push(snapIndex + 0.5);
-            }
-            date = dateEnv.add(date, tDateProfile.snapDuration);
-            snapDiff++;
-        }
-        tDateProfile.snapDiffToIndex = snapDiffToIndex;
-        tDateProfile.snapIndexToDiff = snapIndexToDiff;
-        tDateProfile.snapCnt = snapIndex + 1; // is always one behind
-        tDateProfile.slotCnt = tDateProfile.snapCnt / tDateProfile.snapsPerSlot;
-        // more...
-        tDateProfile.isWeekStarts = buildIsWeekStarts(tDateProfile, dateEnv);
-        tDateProfile.cellRows = buildCellRows(tDateProfile, dateEnv, view);
-        return tDateProfile;
-    }
-    /*
-    snaps to appropriate unit
-    */
-    function normalizeDate(date, tDateProfile, dateEnv) {
-        var normalDate = date;
-        if (!tDateProfile.isTimeScale) {
-            normalDate = core.startOfDay(normalDate);
-            if (tDateProfile.largeUnit) {
-                normalDate = dateEnv.startOf(normalDate, tDateProfile.largeUnit);
-            }
-        }
-        return normalDate;
-    }
-    /*
-    snaps to appropriate unit
-    */
-    function normalizeRange(range, tDateProfile, dateEnv) {
-        if (!tDateProfile.isTimeScale) {
-            range = core.computeVisibleDayRange(range);
-            if (tDateProfile.largeUnit) {
-                var dayRange = range; // preserve original result
-                range = {
-                    start: dateEnv.startOf(range.start, tDateProfile.largeUnit),
-                    end: dateEnv.startOf(range.end, tDateProfile.largeUnit)
-                };
-                // if date is partially through the interval, or is in the same interval as the start,
-                // make the exclusive end be the *next* interval
-                if (range.end.valueOf() !== dayRange.end.valueOf() || range.end <= range.start) {
-                    range = {
-                        start: range.start,
-                        end: dateEnv.add(range.end, tDateProfile.slotDuration)
-                    };
-                }
-            }
-        }
-        return range;
-    }
-    function isValidDate(date, tDateProfile, dateProfile, view) {
-        if (view.dateProfileGenerator.isHiddenDay(date)) {
-            return false;
-        }
-        else if (tDateProfile.isTimeScale) {
-            // determine if the time is within minTime/maxTime, which may have wacky values
-            var day = core.startOfDay(date);
-            var timeMs = date.valueOf() - day.valueOf();
-            var ms = timeMs - core.asRoughMs(dateProfile.minTime); // milliseconds since minTime
-            ms = ((ms % 86400000) + 86400000) % 86400000; // make negative values wrap to 24hr clock
-            return ms < tDateProfile.timeWindowMs; // before the maxTime?
-        }
-        else {
-            return true;
-        }
-    }
-    function queryDurationOption(view, name) {
-        var input = view.opt(name);
-        if (input != null) {
-            return core.createDuration(input);
-        }
-    }
-    function validateLabelAndSlot(tDateProfile, dateProfile, dateEnv) {
-        var currentRange = dateProfile.currentRange;
-        // make sure labelInterval doesn't exceed the max number of cells
-        if (tDateProfile.labelInterval) {
-            var labelCnt = dateEnv.countDurationsBetween(currentRange.start, currentRange.end, tDateProfile.labelInterval);
-            if (labelCnt > core.config.MAX_TIMELINE_SLOTS) {
-                console.warn('slotLabelInterval results in too many cells');
-                tDateProfile.labelInterval = null;
-            }
-        }
-        // make sure slotDuration doesn't exceed the maximum number of cells
-        if (tDateProfile.slotDuration) {
-            var slotCnt = dateEnv.countDurationsBetween(currentRange.start, currentRange.end, tDateProfile.slotDuration);
-            if (slotCnt > core.config.MAX_TIMELINE_SLOTS) {
-                console.warn('slotDuration results in too many cells');
-                tDateProfile.slotDuration = null;
-            }
-        }
-        // make sure labelInterval is a multiple of slotDuration
-        if (tDateProfile.labelInterval && tDateProfile.slotDuration) {
-            var slotsPerLabel = core.wholeDivideDurations(tDateProfile.labelInterval, tDateProfile.slotDuration);
-            if (slotsPerLabel === null || slotsPerLabel < 1) {
-                console.warn('slotLabelInterval must be a multiple of slotDuration');
-                tDateProfile.slotDuration = null;
-            }
-        }
-    }
-    function ensureLabelInterval(tDateProfile, dateProfile, dateEnv) {
-        var currentRange = dateProfile.currentRange;
-        var labelInterval = tDateProfile.labelInterval;
-        if (!labelInterval) {
-            // compute based off the slot duration
-            // find the largest label interval with an acceptable slots-per-label
-            var input = void 0;
-            if (tDateProfile.slotDuration) {
-                for (var _i = 0, STOCK_SUB_DURATIONS_1 = STOCK_SUB_DURATIONS; _i < STOCK_SUB_DURATIONS_1.length; _i++) {
-                    input = STOCK_SUB_DURATIONS_1[_i];
-                    var tryLabelInterval = core.createDuration(input);
-                    var slotsPerLabel = core.wholeDivideDurations(tryLabelInterval, tDateProfile.slotDuration);
-                    if (slotsPerLabel !== null && slotsPerLabel <= MAX_AUTO_SLOTS_PER_LABEL) {
-                        labelInterval = tryLabelInterval;
-                        break;
-                    }
-                }
-                // use the slot duration as a last resort
-                if (!labelInterval) {
-                    labelInterval = tDateProfile.slotDuration;
-                }
-                // compute based off the view's duration
-                // find the largest label interval that yields the minimum number of labels
-            }
-            else {
-                for (var _a = 0, STOCK_SUB_DURATIONS_2 = STOCK_SUB_DURATIONS; _a < STOCK_SUB_DURATIONS_2.length; _a++) {
-                    input = STOCK_SUB_DURATIONS_2[_a];
-                    labelInterval = core.createDuration(input);
-                    var labelCnt = dateEnv.countDurationsBetween(currentRange.start, currentRange.end, labelInterval);
-                    if (labelCnt >= MIN_AUTO_LABELS) {
-                        break;
-                    }
-                }
-            }
-            tDateProfile.labelInterval = labelInterval;
-        }
-        return labelInterval;
-    }
-    function ensureSlotDuration(tDateProfile, dateProfile, dateEnv) {
-        var currentRange = dateProfile.currentRange;
-        var slotDuration = tDateProfile.slotDuration;
-        if (!slotDuration) {
-            var labelInterval = ensureLabelInterval(tDateProfile, dateProfile, dateEnv); // will compute if necessary
-            // compute based off the label interval
-            // find the largest slot duration that is different from labelInterval, but still acceptable
-            for (var _i = 0, STOCK_SUB_DURATIONS_3 = STOCK_SUB_DURATIONS; _i < STOCK_SUB_DURATIONS_3.length; _i++) {
-                var input = STOCK_SUB_DURATIONS_3[_i];
-                var trySlotDuration = core.createDuration(input);
-                var slotsPerLabel = core.wholeDivideDurations(labelInterval, trySlotDuration);
-                if (slotsPerLabel !== null && slotsPerLabel > 1 && slotsPerLabel <= MAX_AUTO_SLOTS_PER_LABEL) {
-                    slotDuration = trySlotDuration;
-                    break;
-                }
-            }
-            // only allow the value if it won't exceed the view's # of slots limit
-            if (slotDuration) {
-                var slotCnt = dateEnv.countDurationsBetween(currentRange.start, currentRange.end, slotDuration);
-                if (slotCnt > MAX_AUTO_CELLS) {
-                    slotDuration = null;
-                }
-            }
-            // use the label interval as a last resort
-            if (!slotDuration) {
-                slotDuration = labelInterval;
-            }
-            tDateProfile.slotDuration = slotDuration;
-        }
-        return slotDuration;
-    }
-    function computeHeaderFormats(tDateProfile, dateProfile, dateEnv, view) {
-        var format1;
-        var format2;
-        var labelInterval = tDateProfile.labelInterval;
-        var unit = core.greatestDurationDenominator(labelInterval).unit;
-        var weekNumbersVisible = view.opt('weekNumbers');
-        var format0 = (format1 = (format2 = null));
-        // NOTE: weekNumber computation function wont work
-        if ((unit === 'week') && !weekNumbersVisible) {
-            unit = 'day';
-        }
-        switch (unit) {
-            case 'year':
-                format0 = { year: 'numeric' }; // '2015'
-                break;
-            case 'month':
-                if (currentRangeAs('years', dateProfile, dateEnv) > 1) {
-                    format0 = { year: 'numeric' }; // '2015'
-                }
-                format1 = { month: 'short' }; // 'Jan'
-                break;
-            case 'week':
-                if (currentRangeAs('years', dateProfile, dateEnv) > 1) {
-                    format0 = { year: 'numeric' }; // '2015'
-                }
-                format1 = { week: 'narrow' }; // 'Wk4'
-                break;
-            case 'day':
-                if (currentRangeAs('years', dateProfile, dateEnv) > 1) {
-                    format0 = { year: 'numeric', month: 'long' }; // 'January 2014'
-                }
-                else if (currentRangeAs('months', dateProfile, dateEnv) > 1) {
-                    format0 = { month: 'long' }; // 'January'
-                }
-                if (weekNumbersVisible) {
-                    format1 = { week: 'short' }; // 'Wk 4'
-                }
-                format2 = { weekday: 'narrow', day: 'numeric' }; // 'Su 9'
-                break;
-            case 'hour':
-                if (weekNumbersVisible) {
-                    format0 = { week: 'short' }; // 'Wk 4'
-                }
-                if (currentRangeAs('days', dateProfile, dateEnv) > 1) {
-                    format1 = { weekday: 'short', day: 'numeric', month: 'numeric', omitCommas: true }; // Sat 4/7
-                }
-                format2 = {
-                    hour: 'numeric',
-                    minute: '2-digit',
-                    omitZeroMinute: true,
-                    meridiem: 'short'
-                };
-                break;
-            case 'minute':
-                // sufficiently large number of different minute cells?
-                if ((core.asRoughMinutes(labelInterval) / 60) >= MAX_AUTO_SLOTS_PER_LABEL) {
-                    format0 = {
-                        hour: 'numeric',
-                        meridiem: 'short'
-                    };
-                    format1 = function (params) {
-                        return ':' + core.padStart(params.date.minute, 2); // ':30'
-                    };
-                }
-                else {
-                    format0 = {
-                        hour: 'numeric',
-                        minute: 'numeric',
-                        meridiem: 'short'
-                    };
-                }
-                break;
-            case 'second':
-                // sufficiently large number of different second cells?
-                if ((core.asRoughSeconds(labelInterval) / 60) >= MAX_AUTO_SLOTS_PER_LABEL) {
-                    format0 = { hour: 'numeric', minute: '2-digit', meridiem: 'lowercase' }; // '8:30 PM'
-                    format1 = function (params) {
-                        return ':' + core.padStart(params.date.second, 2); // ':30'
-                    };
-                }
-                else {
-                    format0 = { hour: 'numeric', minute: '2-digit', second: '2-digit', meridiem: 'lowercase' }; // '8:30:45 PM'
-                }
-                break;
-            case 'millisecond':
-                format0 = { hour: 'numeric', minute: '2-digit', second: '2-digit', meridiem: 'lowercase' }; // '8:30:45 PM'
-                format1 = function (params) {
-                    return '.' + core.padStart(params.millisecond, 3);
-                };
-                break;
-        }
-        return [].concat(format0 || [], format1 || [], format2 || []);
-    }
-    // Compute the number of the give units in the "current" range.
-    // Won't go more precise than days.
-    // Will return `0` if there's not a clean whole interval.
-    function currentRangeAs(unit, dateProfile, dateEnv) {
-        var range = dateProfile.currentRange;
-        var res = null;
-        if (unit === 'years') {
-            res = dateEnv.diffWholeYears(range.start, range.end);
-        }
-        else if (unit === 'months') {
-            res = dateEnv.diffWholeMonths(range.start, range.end);
-        }
-        else if (unit === 'weeks') {
-            res = dateEnv.diffWholeMonths(range.start, range.end);
-        }
-        else if (unit === 'days') {
-            res = core.diffWholeDays(range.start, range.end);
-        }
-        return res || 0;
-    }
-    function buildIsWeekStarts(tDateProfile, dateEnv) {
-        var slotDates = tDateProfile.slotDates, emphasizeWeeks = tDateProfile.emphasizeWeeks;
-        var prevWeekNumber = null;
-        var isWeekStarts = [];
-        for (var _i = 0, slotDates_1 = slotDates; _i < slotDates_1.length; _i++) {
-            var slotDate = slotDates_1[_i];
-            var weekNumber = dateEnv.computeWeekNumber(slotDate);
-            var isWeekStart = emphasizeWeeks && (prevWeekNumber !== null) && (prevWeekNumber !== weekNumber);
-            prevWeekNumber = weekNumber;
-            isWeekStarts.push(isWeekStart);
-        }
-        return isWeekStarts;
-    }
-    function buildCellRows(tDateProfile, dateEnv, view) {
-        var slotDates = tDateProfile.slotDates;
-        var formats = tDateProfile.headerFormats;
-        var cellRows = formats.map(function (format) { return []; }); // indexed by row,col
-        // specifically for navclicks
-        var rowUnits = formats.map(function (format) {
-            return format.getLargestUnit ? format.getLargestUnit() : null;
-        });
-        // builds cellRows and slotCells
-        for (var i = 0; i < slotDates.length; i++) {
-            var date = slotDates[i];
-            var isWeekStart = tDateProfile.isWeekStarts[i];
-            for (var row = 0; row < formats.length; row++) {
-                var format = formats[row];
-                var rowCells = cellRows[row];
-                var leadingCell = rowCells[rowCells.length - 1];
-                var isSuperRow = (formats.length > 1) && (row < (formats.length - 1)); // more than one row and not the last
-                var newCell = null;
-                if (isSuperRow) {
-                    var text = dateEnv.format(date, format);
-                    if (!leadingCell || (leadingCell.text !== text)) {
-                        newCell = buildCellObject(date, text, rowUnits[row], view);
-                    }
-                    else {
-                        leadingCell.colspan += 1;
-                    }
-                }
-                else {
-                    if (!leadingCell ||
-                        core.isInt(dateEnv.countDurationsBetween(tDateProfile.normalizedRange.start, date, tDateProfile.labelInterval))) {
-                        var text = dateEnv.format(date, format);
-                        newCell = buildCellObject(date, text, rowUnits[row], view);
-                    }
-                    else {
-                        leadingCell.colspan += 1;
-                    }
-                }
-                if (newCell) {
-                    newCell.weekStart = isWeekStart;
-                    rowCells.push(newCell);
-                }
-            }
-        }
-        return cellRows;
-    }
-    function buildCellObject(date, text, rowUnit, view) {
-        var spanHtml = core.buildGotoAnchorHtml(view, {
-            date: date,
-            type: rowUnit,
-            forceOff: !rowUnit
-        }, {
-            'class': 'fc-cell-text'
-        }, core.htmlEscape(text));
-        return { text: text, spanHtml: spanHtml, date: date, colspan: 1, isWeekStart: false };
-    }
-
-    var TimelineNowIndicator = /** @class */ (function () {
-        function TimelineNowIndicator(headParent, bodyParent) {
-            this.headParent = headParent;
-            this.bodyParent = bodyParent;
-        }
-        TimelineNowIndicator.prototype.render = function (coord, isRtl) {
-            var styleProps = isRtl ? { right: -coord } : { left: coord };
-            this.headParent.appendChild(this.arrowEl = core.createElement('div', {
-                className: 'fc-now-indicator fc-now-indicator-arrow',
-                style: styleProps
-            }));
-            this.bodyParent.appendChild(this.lineEl = core.createElement('div', {
-                className: 'fc-now-indicator fc-now-indicator-line',
-                style: styleProps
-            }));
-        };
-        TimelineNowIndicator.prototype.unrender = function () {
-            if (this.arrowEl) {
-                core.removeElement(this.arrowEl);
-            }
-            if (this.lineEl) {
-                core.removeElement(this.lineEl);
-            }
-        };
-        return TimelineNowIndicator;
-    }());
-
-    var STICKY_PROP_VAL = computeStickyPropVal(); // if null, means not supported at all
-    var IS_MS_EDGE = /Edge/.test(navigator.userAgent);
-    var IS_SAFARI = STICKY_PROP_VAL === '-webkit-sticky'; // good b/c doesn't confuse chrome
-    var STICKY_CLASSNAME = 'fc-sticky';
-    /*
-    useful beyond the native position:sticky for these reasons:
-    - support in IE11
-    - nice centering support
-    */
-    var StickyScroller = /** @class */ (function () {
-        function StickyScroller(scroller, isRtl, isVertical) {
-            var _this = this;
-            this.usingRelative = null;
-            /*
-            known bug: called twice on init. problem when mixing with ScrollJoiner
-            */
-            this.updateSize = function () {
-                var els = Array.prototype.slice.call(_this.scroller.canvas.el.querySelectorAll('.' + STICKY_CLASSNAME));
-                var elGeoms = _this.queryElGeoms(els);
-                var viewportWidth = _this.scroller.el.clientWidth;
-                if (_this.usingRelative) {
-                    var elDestinations = _this.computeElDestinations(elGeoms, viewportWidth); // read before prepPositioning
-                    assignRelativePositions(els, elGeoms, elDestinations);
-                }
-                else {
-                    assignStickyPositions(els, elGeoms, viewportWidth);
-                }
-            };
-            this.scroller = scroller;
-            this.usingRelative =
-                !STICKY_PROP_VAL || // IE11
-                    (IS_MS_EDGE && isRtl) || // https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/18883305/
-                    ((IS_MS_EDGE || IS_SAFARI) && isVertical); // because doesn't work with rowspan in tables, our only vertial use
-            if (this.usingRelative) {
-                scroller.on('scrollEnd', this.updateSize);
-            }
-        }
-        StickyScroller.prototype.destroy = function () {
-            this.scroller.off('scrollEnd', this.updateSize);
-        };
-        StickyScroller.prototype.queryElGeoms = function (els) {
-            var canvasOrigin = this.scroller.canvas.el.getBoundingClientRect();
-            var elGeoms = [];
-            for (var _i = 0, els_1 = els; _i < els_1.length; _i++) {
-                var el = els_1[_i];
-                var parentBound = core.translateRect(el.parentNode.getBoundingClientRect(), -canvasOrigin.left, -canvasOrigin.top);
-                var elRect = el.getBoundingClientRect();
-                var computedStyles = window.getComputedStyle(el);
-                var computedTextAlign = window.getComputedStyle(el.parentNode).textAlign; // ask the parent
-                var intendedTextAlign = computedTextAlign;
-                var naturalBound = null;
-                if (computedStyles.position !== 'sticky') {
-                    naturalBound = core.translateRect(elRect, -canvasOrigin.left - (parseFloat(computedStyles.left) || 0), // could be 'auto'
-                    -canvasOrigin.top - (parseFloat(computedStyles.top) || 0));
-                }
-                if (el.hasAttribute('data-sticky-center')) {
-                    intendedTextAlign = 'center';
-                }
-                elGeoms.push({
-                    parentBound: parentBound,
-                    naturalBound: naturalBound,
-                    elWidth: elRect.width,
-                    elHeight: elRect.height,
-                    computedTextAlign: computedTextAlign,
-                    intendedTextAlign: intendedTextAlign
-                });
-            }
-            return elGeoms;
-        };
-        StickyScroller.prototype.computeElDestinations = function (elGeoms, viewportWidth) {
-            var viewportLeft = this.scroller.getScrollFromLeft();
-            var viewportTop = this.scroller.getScrollTop();
-            var viewportRight = viewportLeft + viewportWidth;
-            return elGeoms.map(function (elGeom) {
-                var elWidth = elGeom.elWidth, elHeight = elGeom.elHeight, parentBound = elGeom.parentBound, naturalBound = elGeom.naturalBound;
-                var destLeft; // relative to canvas topleft
-                var destTop; // "
-                switch (elGeom.intendedTextAlign) {
-                    case 'left':
-                        destLeft = viewportLeft;
-                        break;
-                    case 'right':
-                        destLeft = viewportRight - elWidth;
-                        break;
-                    case 'center':
-                        destLeft = (viewportLeft + viewportRight) / 2 - elWidth / 2;
-                        break;
-                }
-                destLeft = Math.min(destLeft, parentBound.right - elWidth);
-                destLeft = Math.max(destLeft, parentBound.left);
-                destTop = viewportTop;
-                destTop = Math.min(destTop, parentBound.bottom - elHeight);
-                destTop = Math.max(destTop, naturalBound.top); // better to use natural top for upper bound
-                return { left: destLeft, top: destTop };
-            });
-        };
-        return StickyScroller;
-    }());
-    function assignRelativePositions(els, elGeoms, elDestinations) {
-        els.forEach(function (el, i) {
-            var naturalBound = elGeoms[i].naturalBound;
-            core.applyStyle(el, {
-                position: 'relative',
-                left: elDestinations[i].left - naturalBound.left,
-                top: elDestinations[i].top - naturalBound.top
-            });
-        });
-    }
-    function assignStickyPositions(els, elGeoms, viewportWidth) {
-        els.forEach(function (el, i) {
-            var stickyLeft = 0;
-            if (elGeoms[i].intendedTextAlign === 'center') {
-                stickyLeft = (viewportWidth - elGeoms[i].elWidth) / 2;
-                // needs to be forced to left?
-                if (elGeoms[i].computedTextAlign === 'center') {
-                    el.setAttribute('data-sticky-center', '') // remember for next queryElGeoms
-                    ;
-                    el.parentNode.style.textAlign = 'left';
-                }
-            }
-            core.applyStyle(el, {
-                position: STICKY_PROP_VAL,
-                left: stickyLeft,
-                right: 0,
-                top: 0
-            });
-        });
-    }
-    function computeStickyPropVal() {
-        var el = core.htmlToElement('<div style="position:-webkit-sticky;position:sticky"></div>');
-        var val = el.style.position;
-        if (val.indexOf('sticky') !== -1) {
-            return val;
-        }
-        else {
-            return null;
-        }
-    }
-
-    var TimeAxis = /** @class */ (function (_super) {
-        __extends(TimeAxis, _super);
-        function TimeAxis(context, headerContainerEl, bodyContainerEl) {
-            var _this = _super.call(this, context) || this;
-            var layout = _this.layout = new HeaderBodyLayout(headerContainerEl, bodyContainerEl, 'auto');
-            var headerEnhancedScroller = layout.headerScroller.enhancedScroll;
-            var bodyEnhancedScroller = layout.bodyScroller.enhancedScroll;
-            // needs to go after layout, which has ScrollJoiner
-            _this.headStickyScroller = new StickyScroller(headerEnhancedScroller, _this.isRtl, false); // isVertical=false
-            _this.bodyStickyScroller = new StickyScroller(bodyEnhancedScroller, _this.isRtl, false); // isVertical=false
-            _this.header = new TimelineHeader(context, headerEnhancedScroller.canvas.contentEl);
-            _this.slats = new TimelineSlats(context, bodyEnhancedScroller.canvas.bgEl);
-            _this.nowIndicator = new TimelineNowIndicator(headerEnhancedScroller.canvas.el, bodyEnhancedScroller.canvas.el);
-            return _this;
-        }
-        TimeAxis.prototype.destroy = function () {
-            this.layout.destroy();
-            this.header.destroy();
-            this.slats.destroy();
-            this.nowIndicator.unrender();
-            this.headStickyScroller.destroy();
-            this.bodyStickyScroller.destroy();
-            _super.prototype.destroy.call(this);
-        };
-        TimeAxis.prototype.render = function (props) {
-            var tDateProfile = this.tDateProfile =
-                buildTimelineDateProfile(props.dateProfile, this.view); // TODO: cache
-            this.header.receiveProps({
-                dateProfile: props.dateProfile,
-                tDateProfile: tDateProfile
-            });
-            this.slats.receiveProps({
-                dateProfile: props.dateProfile,
-                tDateProfile: tDateProfile
-            });
-        };
-        // Now Indicator
-        // ------------------------------------------------------------------------------------------
-        TimeAxis.prototype.getNowIndicatorUnit = function (dateProfile) {
-            // yuck
-            var tDateProfile = this.tDateProfile =
-                buildTimelineDateProfile(dateProfile, this.view); // TODO: cache
-            if (tDateProfile.isTimeScale) {
-                return core.greatestDurationDenominator(tDateProfile.slotDuration).unit;
-            }
-        };
-        // will only execute if isTimeScale
-        TimeAxis.prototype.renderNowIndicator = function (date) {
-            if (core.rangeContainsMarker(this.tDateProfile.normalizedRange, date)) {
-                this.nowIndicator.render(this.dateToCoord(date), this.isRtl);
-            }
-        };
-        // will only execute if isTimeScale
-        TimeAxis.prototype.unrenderNowIndicator = function () {
-            this.nowIndicator.unrender();
-        };
-        // Sizing
-        // ------------------------------------------------------------------------------------------
-        TimeAxis.prototype.updateSize = function (isResize, totalHeight, isAuto) {
-            this.applySlotWidth(this.computeSlotWidth());
-            // adjusts gutters. do after slot widths set
-            this.layout.setHeight(totalHeight, isAuto);
-            // pretty much just queries coords. do last
-            this.slats.updateSize();
-        };
-        TimeAxis.prototype.updateStickyScrollers = function () {
-            this.headStickyScroller.updateSize();
-            this.bodyStickyScroller.updateSize();
-        };
-        TimeAxis.prototype.computeSlotWidth = function () {
-            var slotWidth = this.opt('slotWidth') || '';
-            if (slotWidth === '') {
-                slotWidth = this.computeDefaultSlotWidth(this.tDateProfile);
-            }
-            return slotWidth;
-        };
-        TimeAxis.prototype.computeDefaultSlotWidth = function (tDateProfile) {
-            var maxInnerWidth = 0; // TODO: harness core's `matchCellWidths` for this
-            this.header.innerEls.forEach(function (innerEl, i) {
-                maxInnerWidth = Math.max(maxInnerWidth, innerEl.getBoundingClientRect().width);
-            });
-            var headingCellWidth = Math.ceil(maxInnerWidth) + 1; // assume no padding, and one pixel border
-            // in TimelineView.defaults we ensured that labelInterval is an interval of slotDuration
-            // TODO: rename labelDuration?
-            var slotsPerLabel = core.wholeDivideDurations(tDateProfile.labelInterval, tDateProfile.slotDuration);
-            var slotWidth = Math.ceil(headingCellWidth / slotsPerLabel);
-            var minWidth = window.getComputedStyle(this.header.slatColEls[0]).minWidth;
-            if (minWidth) {
-                minWidth = parseInt(minWidth, 10);
-                if (minWidth) {
-                    slotWidth = Math.max(slotWidth, minWidth);
-                }
-            }
-            return slotWidth;
-        };
-        TimeAxis.prototype.applySlotWidth = function (slotWidth) {
-            var _a = this, layout = _a.layout, tDateProfile = _a.tDateProfile;
-            var containerWidth = '';
-            var containerMinWidth = '';
-            var nonLastSlotWidth = '';
-            if (slotWidth !== '') {
-                slotWidth = Math.round(slotWidth);
-                containerWidth = slotWidth * tDateProfile.slotDates.length;
-                containerMinWidth = '';
-                nonLastSlotWidth = slotWidth;
-                var availableWidth = layout.bodyScroller.enhancedScroll.getClientWidth();
-                if (availableWidth > containerWidth) {
-                    containerMinWidth = availableWidth;
-                    containerWidth = '';
-                    nonLastSlotWidth = Math.floor(availableWidth / tDateProfile.slotDates.length);
-                }
-            }
-            layout.headerScroller.enhancedScroll.canvas.setWidth(containerWidth);
-            layout.headerScroller.enhancedScroll.canvas.setMinWidth(containerMinWidth);
-            layout.bodyScroller.enhancedScroll.canvas.setWidth(containerWidth);
-            layout.bodyScroller.enhancedScroll.canvas.setMinWidth(containerMinWidth);
-            if (nonLastSlotWidth !== '') {
-                this.header.slatColEls.slice(0, -1).concat(this.slats.slatColEls.slice(0, -1)).forEach(function (el) {
-                    el.style.width = nonLastSlotWidth + 'px';
-                });
-            }
-        };
-        // returned value is between 0 and the number of snaps
-        TimeAxis.prototype.computeDateSnapCoverage = function (date) {
-            var _a = this, dateEnv = _a.dateEnv, tDateProfile = _a.tDateProfile;
-            var snapDiff = dateEnv.countDurationsBetween(tDateProfile.normalizedRange.start, date, tDateProfile.snapDuration);
-            if (snapDiff < 0) {
-                return 0;
-            }
-            else if (snapDiff >= tDateProfile.snapDiffToIndex.length) {
-                return tDateProfile.snapCnt;
-            }
-            else {
-                var snapDiffInt = Math.floor(snapDiff);
-                var snapCoverage = tDateProfile.snapDiffToIndex[snapDiffInt];
-                if (core.isInt(snapCoverage)) { // not an in-between value
-                    snapCoverage += snapDiff - snapDiffInt; // add the remainder
-                }
-                else {
-                    // a fractional value, meaning the date is not visible
-                    // always round up in this case. works for start AND end dates in a range.
-                    snapCoverage = Math.ceil(snapCoverage);
-                }
-                return snapCoverage;
-            }
-        };
-        // for LTR, results range from 0 to width of area
-        // for RTL, results range from negative width of area to 0
-        TimeAxis.prototype.dateToCoord = function (date) {
-            var tDateProfile = this.tDateProfile;
-            var snapCoverage = this.computeDateSnapCoverage(date);
-            var slotCoverage = snapCoverage / tDateProfile.snapsPerSlot;
-            var slotIndex = Math.floor(slotCoverage);
-            slotIndex = Math.min(slotIndex, tDateProfile.slotCnt - 1);
-            var partial = slotCoverage - slotIndex;
-            var _a = this.slats, innerCoordCache = _a.innerCoordCache, outerCoordCache = _a.outerCoordCache;
-            if (this.isRtl) {
-                return (outerCoordCache.rights[slotIndex] -
-                    (innerCoordCache.getWidth(slotIndex) * partial)) - outerCoordCache.originClientRect.width;
-            }
-            else {
-                return (outerCoordCache.lefts[slotIndex] +
-                    (innerCoordCache.getWidth(slotIndex) * partial));
-            }
-        };
-        TimeAxis.prototype.rangeToCoords = function (range) {
-            if (this.isRtl) {
-                return { right: this.dateToCoord(range.start), left: this.dateToCoord(range.end) };
-            }
-            else {
-                return { left: this.dateToCoord(range.start), right: this.dateToCoord(range.end) };
-            }
-        };
-        // Scrolling
-        // ------------------------------------------------------------------------------------------
-        TimeAxis.prototype.computeDateScroll = function (duration) {
-            var dateEnv = this.dateEnv;
-            var dateProfile = this.props.dateProfile;
-            var left = 0;
-            if (dateProfile) {
-                left = this.dateToCoord(dateEnv.add(core.startOfDay(dateProfile.activeRange.start), // startOfDay needed?
-                duration));
-                // hack to overcome the left borders of non-first slat
-                if (!this.isRtl && left) {
-                    left += 1;
-                }
-            }
-            return { left: left };
-        };
-        TimeAxis.prototype.queryDateScroll = function () {
-            var enhancedScroll = this.layout.bodyScroller.enhancedScroll;
-            return {
-                left: enhancedScroll.getScrollLeft()
-            };
-        };
-        TimeAxis.prototype.applyDateScroll = function (scroll) {
-            // TODO: lame we have to update both. use the scrolljoiner instead maybe
-            this.layout.bodyScroller.enhancedScroll.setScrollLeft(scroll.left || 0);
-            this.layout.headerScroller.enhancedScroll.setScrollLeft(scroll.left || 0);
-        };
-        return TimeAxis;
-    }(core.Component));
-
-    var TimelineLaneEventRenderer = /** @class */ (function (_super) {
-        __extends(TimelineLaneEventRenderer, _super);
-        function TimelineLaneEventRenderer(context, masterContainerEl, timeAxis) {
-            var _this = _super.call(this, context) || this;
-            _this.masterContainerEl = masterContainerEl;
-            _this.timeAxis = timeAxis;
-            return _this;
-        }
-        TimelineLaneEventRenderer.prototype.renderSegHtml = function (seg, mirrorInfo) {
-            var view = this.context.view;
-            var eventRange = seg.eventRange;
-            var eventDef = eventRange.def;
-            var eventUi = eventRange.ui;
-            var isDraggable = view.computeEventDraggable(eventDef, eventUi);
-            var isResizableFromStart = seg.isStart && view.computeEventStartResizable(eventDef, eventUi);
-            var isResizableFromEnd = seg.isEnd && view.computeEventEndResizable(eventDef, eventUi);
-            var classes = this.getSegClasses(seg, isDraggable, isResizableFromStart || isResizableFromEnd, mirrorInfo);
-            classes.unshift('fc-timeline-event', 'fc-h-event');
-            var timeText = this.getTimeText(eventRange);
-            return '<a class="' + classes.join(' ') + '" style="' + core.cssToStr(this.getSkinCss(eventUi)) + '"' +
-                (eventDef.url ?
-                    ' href="' + core.htmlEscape(eventDef.url) + '"' :
-                    '') +
-                '>' +
-                (timeText ?
-                    '<span class="fc-time-wrap">' +
-                        '<span class="fc-time">' +
-                        core.htmlEscape(timeText) +
-                        '</span>' +
-                        '</span>'
-                    :
-                        '') +
-                '<span class="fc-title-wrap">' +
-                '<span class="fc-title fc-sticky">' +
-                (eventDef.title ? core.htmlEscape(eventDef.title) : '&nbsp;') +
-                '</span>' +
-                '</span>' +
-                (isResizableFromStart ?
-                    '<div class="fc-resizer fc-start-resizer"></div>' :
-                    '') +
-                (isResizableFromEnd ?
-                    '<div class="fc-resizer fc-end-resizer"></div>' :
-                    '') +
-                '</a>';
-        };
-        TimelineLaneEventRenderer.prototype.computeDisplayEventTime = function () {
-            return !this.timeAxis.tDateProfile.isTimeScale; // because times should be obvious via axis
-        };
-        TimelineLaneEventRenderer.prototype.computeDisplayEventEnd = function () {
-            return false;
-        };
-        // Computes a default event time formatting string if `timeFormat` is not explicitly defined
-        TimelineLaneEventRenderer.prototype.computeEventTimeFormat = function () {
-            return {
-                hour: 'numeric',
-                minute: '2-digit',
-                omitZeroMinute: true,
-                meridiem: 'narrow'
-            };
-        };
-        TimelineLaneEventRenderer.prototype.attachSegs = function (segs, mirrorInfo) {
-            if (!this.el && this.masterContainerEl) {
-                this.el = core.createElement('div', { className: 'fc-event-container' });
-                if (mirrorInfo) {
-                    this.el.classList.add('fc-mirror-container');
-                }
-                this.masterContainerEl.appendChild(this.el);
-            }
-            if (this.el) {
-                for (var _i = 0, segs_1 = segs; _i < segs_1.length; _i++) {
-                    var seg = segs_1[_i];
-                    this.el.appendChild(seg.el);
-                }
-            }
-        };
-        TimelineLaneEventRenderer.prototype.detachSegs = function (segs) {
-            for (var _i = 0, segs_2 = segs; _i < segs_2.length; _i++) {
-                var seg = segs_2[_i];
-                core.removeElement(seg.el);
-            }
-        };
-        // computes AND assigns (assigns the left/right at least). bad
-        TimelineLaneEventRenderer.prototype.computeSegSizes = function (segs) {
-            var timeAxis = this.timeAxis;
-            for (var _i = 0, segs_3 = segs; _i < segs_3.length; _i++) {
-                var seg = segs_3[_i];
-                var coords = timeAxis.rangeToCoords(seg); // works because Seg has start/end
-                core.applyStyle(seg.el, {
-                    left: (seg.left = coords.left),
-                    right: -(seg.right = coords.right)
-                });
-            }
-        };
-        TimelineLaneEventRenderer.prototype.assignSegSizes = function (segs) {
-            if (!this.el) {
-                return;
-            }
-            // compute seg verticals
-            for (var _i = 0, segs_4 = segs; _i < segs_4.length; _i++) {
-                var seg = segs_4[_i];
-                seg.height = core.computeHeightAndMargins(seg.el);
-            }
-            this.buildSegLevels(segs); // populates above/below props for computeOffsetForSegs
-            var totalHeight = computeOffsetForSegs(segs); // also assigns seg.top
-            core.applyStyleProp(this.el, 'height', totalHeight);
-            // assign seg verticals
-            for (var _a = 0, segs_5 = segs; _a < segs_5.length; _a++) {
-                var seg = segs_5[_a];
-                core.applyStyleProp(seg.el, 'top', seg.top);
-            }
-        };
-        TimelineLaneEventRenderer.prototype.buildSegLevels = function (segs) {
-            var segLevels = [];
-            segs = this.sortEventSegs(segs);
-            for (var _i = 0, segs_6 = segs; _i < segs_6.length; _i++) {
-                var unplacedSeg = segs_6[_i];
-                unplacedSeg.above = [];
-                // determine the first level with no collisions
-                var level = 0; // level index
-                while (level < segLevels.length) {
-                    var isLevelCollision = false;
-                    // determine collisions
-                    for (var _a = 0, _b = segLevels[level]; _a < _b.length; _a++) {
-                        var placedSeg = _b[_a];
-                        if (timeRowSegsCollide(unplacedSeg, placedSeg)) {
-                            unplacedSeg.above.push(placedSeg);
-                            isLevelCollision = true;
-                        }
-                    }
-                    if (isLevelCollision) {
-                        level += 1;
-                    }
-                    else {
-                        break;
-                    }
-                }
-                // insert into the first non-colliding level. create if necessary
-                (segLevels[level] || (segLevels[level] = []))
-                    .push(unplacedSeg);
-                // record possible colliding segments below (TODO: automated test for this)
-                level += 1;
-                while (level < segLevels.length) {
-                    for (var _c = 0, _d = segLevels[level]; _c < _d.length; _c++) {
-                        var belowSeg = _d[_c];
-                        if (timeRowSegsCollide(unplacedSeg, belowSeg)) {
-                            belowSeg.above.push(unplacedSeg);
-                        }
-                    }
-                    level += 1;
-                }
-            }
-            return segLevels;
-        };
-        return TimelineLaneEventRenderer;
-    }(core.FgEventRenderer));
-    function computeOffsetForSegs(segs) {
-        var max = 0;
-        for (var _i = 0, segs_7 = segs; _i < segs_7.length; _i++) {
-            var seg = segs_7[_i];
-            max = Math.max(max, computeOffsetForSeg(seg));
-        }
-        return max;
-    }
-    function computeOffsetForSeg(seg) {
-        if ((seg.top == null)) {
-            seg.top = computeOffsetForSegs(seg.above);
-        }
-        return seg.top + seg.height;
-    }
-    function timeRowSegsCollide(seg0, seg1) {
-        return (seg0.left < seg1.right) && (seg0.right > seg1.left);
-    }
-
-    var TimelineLaneFillRenderer = /** @class */ (function (_super) {
-        __extends(TimelineLaneFillRenderer, _super);
-        function TimelineLaneFillRenderer(context, masterContainerEl, timeAxis) {
-            var _this = _super.call(this, context) || this;
-            _this.masterContainerEl = masterContainerEl;
-            _this.timeAxis = timeAxis;
-            return _this;
-        }
-        TimelineLaneFillRenderer.prototype.attachSegs = function (type, segs) {
-            if (segs.length) {
-                var className = void 0;
-                if (type === 'businessHours') {
-                    className = 'bgevent';
-                }
-                else {
-                    className = type.toLowerCase();
-                }
-                // making a new container each time is OKAY
-                // all types of segs (background or business hours or whatever) are rendered in one pass
-                var containerEl = core.createElement('div', { className: 'fc-' + className + '-container' });
-                this.masterContainerEl.appendChild(containerEl);
-                for (var _i = 0, segs_1 = segs; _i < segs_1.length; _i++) {
-                    var seg = segs_1[_i];
-                    containerEl.appendChild(seg.el);
-                }
-                return [containerEl]; // return value
-            }
-        };
-        TimelineLaneFillRenderer.prototype.computeSegSizes = function (segs) {
-            var timeAxis = this.timeAxis;
-            for (var _i = 0, segs_2 = segs; _i < segs_2.length; _i++) {
-                var seg = segs_2[_i];
-                var coords = timeAxis.rangeToCoords(seg);
-                seg.left = coords.left;
-                seg.right = coords.right;
-            }
-        };
-        TimelineLaneFillRenderer.prototype.assignSegSizes = function (segs) {
-            for (var _i = 0, segs_3 = segs; _i < segs_3.length; _i++) {
-                var seg = segs_3[_i];
-                core.applyStyle(seg.el, {
-                    left: seg.left,
-                    right: -seg.right
-                });
-            }
-        };
-        return TimelineLaneFillRenderer;
-    }(core.FillRenderer));
-
-    var TimelineLane = /** @class */ (function (_super) {
-        __extends(TimelineLane, _super);
-        function TimelineLane(context, fgContainerEl, bgContainerEl, timeAxis) {
-            var _this = _super.call(this, context, bgContainerEl) // should el be bgContainerEl???
-             || this;
-            _this.slicer = new TimelineLaneSlicer();
-            _this.renderEventDrag = core.memoizeRendering(_this._renderEventDrag, _this._unrenderEventDrag);
-            _this.renderEventResize = core.memoizeRendering(_this._renderEventResize, _this._unrenderEventResize);
-            var fillRenderer = _this.fillRenderer = new TimelineLaneFillRenderer(context, bgContainerEl, timeAxis);
-            var eventRenderer = _this.eventRenderer = new TimelineLaneEventRenderer(context, fgContainerEl, timeAxis);
-            _this.mirrorRenderer = new TimelineLaneEventRenderer(context, fgContainerEl, timeAxis);
-            _this.renderBusinessHours = core.memoizeRendering(fillRenderer.renderSegs.bind(fillRenderer, 'businessHours'), fillRenderer.unrender.bind(fillRenderer, 'businessHours'));
-            _this.renderDateSelection = core.memoizeRendering(fillRenderer.renderSegs.bind(fillRenderer, 'highlight'), fillRenderer.unrender.bind(fillRenderer, 'highlight'));
-            _this.renderBgEvents = core.memoizeRendering(fillRenderer.renderSegs.bind(fillRenderer, 'bgEvent'), fillRenderer.unrender.bind(fillRenderer, 'bgEvent'));
-            _this.renderFgEvents = core.memoizeRendering(eventRenderer.renderSegs.bind(eventRenderer), eventRenderer.unrender.bind(eventRenderer));
-            _this.renderEventSelection = core.memoizeRendering(eventRenderer.selectByInstanceId.bind(eventRenderer), eventRenderer.unselectByInstanceId.bind(eventRenderer), [_this.renderFgEvents]);
-            _this.timeAxis = timeAxis;
-            return _this;
-        }
-        TimelineLane.prototype.render = function (props) {
-            var slicedProps = this.slicer.sliceProps(props, props.dateProfile, this.timeAxis.tDateProfile.isTimeScale ? null : props.nextDayThreshold, this, this.timeAxis);
-            this.renderBusinessHours(slicedProps.businessHourSegs);
-            this.renderDateSelection(slicedProps.dateSelectionSegs);
-            this.renderBgEvents(slicedProps.bgEventSegs);
-            this.renderFgEvents(slicedProps.fgEventSegs);
-            this.renderEventSelection(slicedProps.eventSelection);
-            this.renderEventDrag(slicedProps.eventDrag);
-            this.renderEventResize(slicedProps.eventResize);
-        };
-        TimelineLane.prototype.destroy = function () {
-            _super.prototype.destroy.call(this);
-            this.renderBusinessHours.unrender();
-            this.renderDateSelection.unrender();
-            this.renderBgEvents.unrender();
-            this.renderFgEvents.unrender();
-            this.renderEventSelection.unrender();
-            this.renderEventDrag.unrender();
-            this.renderEventResize.unrender();
-        };
-        TimelineLane.prototype._renderEventDrag = function (state) {
-            if (state) {
-                this.eventRenderer.hideByHash(state.affectedInstances);
-                this.mirrorRenderer.renderSegs(state.segs, { isDragging: true, sourceSeg: state.sourceSeg });
-            }
-        };
-        TimelineLane.prototype._unrenderEventDrag = function (state) {
-            if (state) {
-                this.eventRenderer.showByHash(state.affectedInstances);
-                this.mirrorRenderer.unrender(state.segs, { isDragging: true, sourceSeg: state.sourceSeg });
-            }
-        };
-        TimelineLane.prototype._renderEventResize = function (state) {
-            if (state) {
-                // HACK. eventRenderer and fillRenderer both use these segs. would compete over seg.el
-                var segsForHighlight = state.segs.map(function (seg) {
-                    return __assign({}, seg);
-                });
-                this.eventRenderer.hideByHash(state.affectedInstances);
-                this.fillRenderer.renderSegs('highlight', segsForHighlight);
-                this.mirrorRenderer.renderSegs(state.segs, { isDragging: true, sourceSeg: state.sourceSeg });
-            }
-        };
-        TimelineLane.prototype._unrenderEventResize = function (state) {
-            if (state) {
-                this.eventRenderer.showByHash(state.affectedInstances);
-                this.fillRenderer.unrender('highlight');
-                this.mirrorRenderer.unrender(state.segs, { isDragging: true, sourceSeg: state.sourceSeg });
-            }
-        };
-        TimelineLane.prototype.updateSize = function (isResize) {
-            var _a = this, fillRenderer = _a.fillRenderer, eventRenderer = _a.eventRenderer, mirrorRenderer = _a.mirrorRenderer;
-            fillRenderer.computeSizes(isResize);
-            eventRenderer.computeSizes(isResize);
-            mirrorRenderer.computeSizes(isResize);
-            fillRenderer.assignSizes(isResize);
-            eventRenderer.assignSizes(isResize);
-            mirrorRenderer.assignSizes(isResize);
-        };
-        return TimelineLane;
-    }(core.DateComponent));
-    var TimelineLaneSlicer = /** @class */ (function (_super) {
-        __extends(TimelineLaneSlicer, _super);
-        function TimelineLaneSlicer() {
-            return _super !== null && _super.apply(this, arguments) || this;
-        }
-        TimelineLaneSlicer.prototype.sliceRange = function (origRange, timeAxis) {
-            var tDateProfile = timeAxis.tDateProfile;
-            var dateProfile = timeAxis.props.dateProfile;
-            var normalRange = normalizeRange(origRange, tDateProfile, timeAxis.dateEnv);
-            var segs = [];
-            // protect against when the span is entirely in an invalid date region
-            if (timeAxis.computeDateSnapCoverage(normalRange.start) < timeAxis.computeDateSnapCoverage(normalRange.end)) {
-                // intersect the footprint's range with the grid's range
-                var slicedRange = core.intersectRanges(normalRange, tDateProfile.normalizedRange);
-                if (slicedRange) {
-                    segs.push({
-                        start: slicedRange.start,
-                        end: slicedRange.end,
-                        isStart: slicedRange.start.valueOf() === normalRange.start.valueOf() && isValidDate(slicedRange.start, tDateProfile, dateProfile, timeAxis.view),
-                        isEnd: slicedRange.end.valueOf() === normalRange.end.valueOf() && isValidDate(core.addMs(slicedRange.end, -1), tDateProfile, dateProfile, timeAxis.view)
-                    });
-                }
-            }
-            return segs;
-        };
-        return TimelineLaneSlicer;
-    }(core.Slicer));
-
-    var TimelineView = /** @class */ (function (_super) {
-        __extends(TimelineView, _super);
-        function TimelineView(context, viewSpec, dateProfileGenerator, parentEl) {
-            var _this = _super.call(this, context, viewSpec, dateProfileGenerator, parentEl) || this;
-            _this.el.classList.add('fc-timeline');
-            if (_this.opt('eventOverlap') === false) {
-                _this.el.classList.add('fc-no-overlap');
-            }
-            _this.el.innerHTML = _this.renderSkeletonHtml();
-            _this.timeAxis = new TimeAxis(_this.context, _this.el.querySelector('thead .fc-time-area'), _this.el.querySelector('tbody .fc-time-area'));
-            _this.lane = new TimelineLane(_this.context, _this.timeAxis.layout.bodyScroller.enhancedScroll.canvas.contentEl, _this.timeAxis.layout.bodyScroller.enhancedScroll.canvas.bgEl, _this.timeAxis);
-            context.calendar.registerInteractiveComponent(_this, {
-                el: _this.timeAxis.slats.el
-            });
-            return _this;
-        }
-        TimelineView.prototype.destroy = function () {
-            this.timeAxis.destroy();
-            this.lane.destroy();
-            _super.prototype.destroy.call(this);
-            this.calendar.unregisterInteractiveComponent(this);
-        };
-        TimelineView.prototype.renderSkeletonHtml = function () {
-            var theme = this.theme;
-            return "<table class=\"" + theme.getClass('tableGrid') + "\"> <thead class=\"fc-head\"> <tr> <td class=\"fc-time-area " + theme.getClass('widgetHeader') + "\"></td> </tr> </thead> <tbody class=\"fc-body\"> <tr> <td class=\"fc-time-area " + theme.getClass('widgetContent') + "\"></td> </tr> </tbody> </table>";
-        };
-        TimelineView.prototype.render = function (props) {
-            _super.prototype.render.call(this, props); // flags for updateSize, addScroll
-            this.timeAxis.receiveProps({
-                dateProfile: props.dateProfile
-            });
-            this.lane.receiveProps(__assign({}, props, { nextDayThreshold: this.nextDayThreshold }));
-        };
-        TimelineView.prototype.updateSize = function (isResize, totalHeight, isAuto) {
-            this.timeAxis.updateSize(isResize, totalHeight, isAuto);
-            this.lane.updateSize(isResize);
-        };
-        // Now Indicator
-        // ------------------------------------------------------------------------------------------
-        TimelineView.prototype.getNowIndicatorUnit = function (dateProfile) {
-            return this.timeAxis.getNowIndicatorUnit(dateProfile);
-        };
-        TimelineView.prototype.renderNowIndicator = function (date) {
-            this.timeAxis.renderNowIndicator(date);
-        };
-        TimelineView.prototype.unrenderNowIndicator = function () {
-            this.timeAxis.unrenderNowIndicator();
-        };
-        // Scroll System
-        // ------------------------------------------------------------------------------------------
-        TimelineView.prototype.computeDateScroll = function (duration) {
-            return this.timeAxis.computeDateScroll(duration);
-        };
-        TimelineView.prototype.applyScroll = function (scroll, isResize) {
-            _super.prototype.applyScroll.call(this, scroll, isResize); // will call applyDateScroll
-            // avoid updating stickyscroll too often
-            // TODO: repeat code as ResourceTimelineView::updateSize
-            var calendar = this.calendar;
-            if (isResize || calendar.isViewUpdated || calendar.isDatesUpdated || calendar.isEventsUpdated) {
-                this.timeAxis.updateStickyScrollers();
-            }
-        };
-        TimelineView.prototype.applyDateScroll = function (scroll) {
-            this.timeAxis.applyDateScroll(scroll);
-        };
-        TimelineView.prototype.queryScroll = function () {
-            var enhancedScroll = this.timeAxis.layout.bodyScroller.enhancedScroll;
-            return {
-                top: enhancedScroll.getScrollTop(),
-                left: enhancedScroll.getScrollLeft()
-            };
-        };
-        // Hit System
-        // ------------------------------------------------------------------------------------------
-        TimelineView.prototype.buildPositionCaches = function () {
-            this.timeAxis.slats.updateSize();
-        };
-        TimelineView.prototype.queryHit = function (positionLeft, positionTop, elWidth, elHeight) {
-            var slatHit = this.timeAxis.slats.positionToHit(positionLeft);
-            if (slatHit) {
-                return {
-                    component: this,
-                    dateSpan: slatHit.dateSpan,
-                    rect: {
-                        left: slatHit.left,
-                        right: slatHit.right,
-                        top: 0,
-                        bottom: elHeight
-                    },
-                    dayEl: slatHit.dayEl,
-                    layer: 0
-                };
-            }
-        };
-        return TimelineView;
-    }(core.View));
-
-    var main = core.createPlugin({
-        defaultView: 'timelineDay',
-        views: {
-            timeline: {
-                class: TimelineView,
-                eventResizableFromStart: true // how is this consumed for TimelineView tho?
-            },
-            timelineDay: {
-                type: 'timeline',
-                duration: { days: 1 }
-            },
-            timelineWeek: {
-                type: 'timeline',
-                duration: { weeks: 1 }
-            },
-            timelineMonth: {
-                type: 'timeline',
-                duration: { months: 1 }
-            },
-            timelineYear: {
-                type: 'timeline',
-                duration: { years: 1 }
-            }
-        }
-    });
-
-    exports.HeaderBodyLayout = HeaderBodyLayout;
-    exports.ScrollJoiner = ScrollJoiner;
-    exports.StickyScroller = StickyScroller;
-    exports.TimeAxis = TimeAxis;
-    exports.TimelineLane = TimelineLane;
-    exports.TimelineView = TimelineView;
-    exports.default = main;
-
-    Object.defineProperty(exports, '__esModule', { value: true });
-
-}));
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/timeline/main.min.css b/AKPlan/static/AKPlan/vendor/fullcalendar/timeline/main.min.css
deleted file mode 100644
index df72784b230a20792e73e12bd5044a864697d760..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/timeline/main.min.css
+++ /dev/null
@@ -1 +0,0 @@
-.fc-scroller-clip{overflow:hidden;position:relative}.fc-no-scrollbars{background:rgba(255,255,255,0)}.fc-no-scrollbars::-webkit-scrollbar{width:0;height:0}.fc-scroller-canvas{position:relative;box-sizing:border-box;min-height:100%}.fc-scroller-canvas>.fc-bg{z-index:1}.fc-scroller-canvas>.fc-content{z-index:2;position:relative;border-style:solid;border-width:0}.fc-scroller-canvas.fc-gutter-left>.fc-content{border-left-width:1px;margin-left:-1px}.fc-scroller-canvas.fc-gutter-right>.fc-content{border-right-width:1px;margin-right:-1px}.fc-scroller-canvas.fc-gutter-top>.fc-content{border-top-width:1px;margin-top:-1px}.fc-rtl .fc-timeline{direction:rtl}.fc-scrolled .fc-head .fc-scroller{z-index:2}.fc-timeline.fc-scrolled .fc-head .fc-scroller{box-shadow:0 3px 4px rgba(0,0,0,.075)}.fc-timeline .fc-body .fc-scroller{z-index:1}.fc-timeline .fc-scroller-canvas>div>div>table,.fc-timeline .fc-scroller-canvas>div>table{border-style:hidden}.fc-timeline .fc-scroller-canvas>.fc-content>.fc-rows>table{border-bottom-style:none}.fc-timeline td,.fc-timeline th{white-space:nowrap}.fc-timeline .fc-cell-content{overflow:hidden}.fc-timeline .fc-cell-text{display:inline-block;padding-left:4px;padding-right:4px}.fc-timeline th{vertical-align:middle}.fc-timeline .fc-head .fc-cell-content{padding-top:3px;padding-bottom:3px}.fc-timeline .fc-head .fc-time-area .fc-cell-content{overflow:visible}.fc-time-area col{min-width:2.2em}.fc-ltr .fc-time-area .fc-chrono th{text-align:left}.fc-rtl .fc-time-area .fc-chrono th{text-align:right}.fc-time-area .fc-slats{position:absolute;z-index:1;top:0;left:0;right:0;bottom:0}.fc-time-area .fc-slats table{height:100%}.fc-time-area .fc-slats .fc-minor{border-style:dotted}.fc-time-area .fc-slats td{border-width:0 1px}.fc-ltr .fc-time-area .fc-slats td{border-right-width:0}.fc-rtl .fc-time-area .fc-slats td{border-left-width:0}.fc-time-area .fc-bgevent-container,.fc-time-area .fc-highlight-container{position:absolute;z-index:2;top:0;bottom:0;width:0}.fc-ltr .fc-time-area .fc-bgevent-container,.fc-ltr .fc-time-area .fc-highlight-container,.fc-ltr .fc-time-area .fc-mirror-container{left:0}.fc-rtl .fc-time-area .fc-bgevent-container,.fc-rtl .fc-time-area .fc-highlight-container,.fc-rtl .fc-time-area .fc-mirror-container{right:0}.fc-time-area .fc-bgevent,.fc-time-area .fc-highlight{position:absolute;top:0;bottom:0}.fc-timeline .fc-now-indicator{z-index:3;top:0}.fc-time-area .fc-now-indicator-arrow{margin:0 -6px;border-width:6px 5px 0;border-left-color:transparent;border-right-color:transparent}.fc-time-area .fc-now-indicator-line{margin:0 -1px;bottom:0;border-left-width:1px}.fc-time-area .fc-event-container{position:relative;z-index:2;width:0}.fc-time-area .fc-mirror-container{position:absolute;z-index:3;top:0}.fc-time-area .fc-event-container{padding-bottom:8px;top:-1px}.fc-time-area tr:first-child .fc-event-container{top:0}.fc-no-overlap .fc-time-area .fc-event-container{padding-bottom:0;top:0}.fc-timeline-event{position:absolute;display:flex;border-radius:0;padding:2px 1px;margin-bottom:1px}.fc-no-overlap .fc-timeline-event{padding-top:5px;padding-bottom:5px;margin-bottom:0}.fc-ltr .fc-timeline-event{flex-direction:row;margin-right:1px}.fc-rtl .fc-timeline-event{margin-left:1px}.fc-timeline-event .fc-time-wrap{flex-shrink:0;min-width:0}.fc-timeline-event .fc-title-wrap{flex-grow:1;min-width:0}.fc-timeline-event .fc-time,.fc-timeline-event .fc-title{display:inline-block;vertical-align:top;max-width:100%;padding:0 2px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;white-space:nowrap;overflow:hidden}.fc-timeline-event .fc-time{font-weight:700}.fc-timeline-event.fc-not-end:after,.fc-timeline-event.fc-not-start:before{content:"";align-self:center;width:0;height:0;margin:0 1px;border:5px solid #000;border-top-color:transparent;border-bottom-color:transparent;opacity:.5}.fc-ltr .fc-timeline-event.fc-not-start:before,.fc-rtl .fc-timeline-event.fc-not-end:after{border-left:0}.fc-ltr .fc-timeline-event.fc-not-end:after,.fc-rtl .fc-timeline-event.fc-not-start:before{border-right:0}
\ No newline at end of file
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/timeline/main.min.js b/AKPlan/static/AKPlan/vendor/fullcalendar/timeline/main.min.js
deleted file mode 100644
index ff54d9735fcff1b64d31896874445f4923eae9f3..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/timeline/main.min.js
+++ /dev/null
@@ -1,6 +0,0 @@
-/*!
-FullCalendar Timeline Plugin v4.3.0
-Docs & License: https://fullcalendar.io/scheduler
-(c) 2019 Adam Shaw
-*/
-!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("@fullcalendar/core")):"function"==typeof define&&define.amd?define(["exports","@fullcalendar/core"],t):t((e=e||self).FullCalendarTimeline={},e.FullCalendar)}(this,function(e,t){"use strict";var r=function(e,t){return(r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])})(e,t)};function n(e,t){function n(){this.constructor=e}r(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}var i,o=function(){return(o=Object.assign||function(e){for(var t,r=1,n=arguments.length;r<n;r++)for(var i in t=arguments[r])Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i]);return e}).apply(this,arguments)},l=function(){function e(){this.gutters={},this.el=t.htmlToElement('<div class="fc-scroller-canvas"> <div class="fc-content"></div> <div class="fc-bg"></div> </div>'),this.contentEl=this.el.querySelector(".fc-content"),this.bgEl=this.el.querySelector(".fc-bg")}return e.prototype.setGutters=function(e){e?o(this.gutters,e):this.gutters={},this.updateSize()},e.prototype.setWidth=function(e){this.width=e,this.updateSize()},e.prototype.setMinWidth=function(e){this.minWidth=e,this.updateSize()},e.prototype.clearWidth=function(){this.width=null,this.minWidth=null,this.updateSize()},e.prototype.updateSize=function(){var e=this.gutters,r=this.el;t.forceClassName(r,"fc-gutter-left",e.left),t.forceClassName(r,"fc-gutter-right",e.right),t.forceClassName(r,"fc-gutter-top",e.top),t.forceClassName(r,"fc-gutter-bottom",e.bottom),t.applyStyle(r,{paddingLeft:e.left||"",paddingRight:e.right||"",paddingTop:e.top||"",paddingBottom:e.bottom||"",width:null!=this.width?this.width+(e.left||0)+(e.right||0):"",minWidth:null!=this.minWidth?this.minWidth+(e.left||0)+(e.right||0):""}),t.applyStyle(this.bgEl,{left:e.left||"",right:e.right||"",top:e.top||"",bottom:e.bottom||""})},e}(),s=function(e){function r(r,n){var i=e.call(this,r,n)||this;return i.reportScroll=function(){i.isScrolling||i.reportScrollStart(),i.trigger("scroll"),i.isMoving=!0,i.requestMovingEnd()},i.reportScrollStart=function(){i.isScrolling||(i.isScrolling=!0,i.trigger("scrollStart",i.isTouching))},i.reportTouchStart=function(){i.isTouching=!0},i.reportTouchEnd=function(){i.isTouching&&(i.isTouching=!1,i.isTouchScrollEnabled&&i.unbindPreventTouchScroll(),i.isMoving||i.reportScrollEnd())},i.isScrolling=!1,i.isTouching=!1,i.isMoving=!1,i.isTouchScrollEnabled=!0,i.requestMovingEnd=t.debounce(i.reportMovingEnd,500),i.canvas=new l,i.el.appendChild(i.canvas.el),i.applyOverflow(),i.bindHandlers(),i}return n(r,e),r.prototype.destroy=function(){e.prototype.destroy.call(this),this.unbindHandlers()},r.prototype.disableTouchScroll=function(){this.isTouchScrollEnabled=!1,this.bindPreventTouchScroll()},r.prototype.enableTouchScroll=function(){this.isTouchScrollEnabled=!0,this.isTouching||this.unbindPreventTouchScroll()},r.prototype.bindPreventTouchScroll=function(){this.preventTouchScrollHandler||this.el.addEventListener("touchmove",this.preventTouchScrollHandler=t.preventDefault)},r.prototype.unbindPreventTouchScroll=function(){this.preventTouchScrollHandler&&(this.el.removeEventListener("touchmove",this.preventTouchScrollHandler),this.preventTouchScrollHandler=null)},r.prototype.bindHandlers=function(){this.el.addEventListener("scroll",this.reportScroll),this.el.addEventListener("touchstart",this.reportTouchStart,{passive:!0}),this.el.addEventListener("touchend",this.reportTouchEnd)},r.prototype.unbindHandlers=function(){this.el.removeEventListener("scroll",this.reportScroll),this.el.removeEventListener("touchstart",this.reportTouchStart,{passive:!0}),this.el.removeEventListener("touchend",this.reportTouchEnd)},r.prototype.reportMovingEnd=function(){this.isMoving=!1,this.isTouching||this.reportScrollEnd()},r.prototype.reportScrollEnd=function(){this.isScrolling&&(this.trigger("scrollEnd"),this.isScrolling=!1)},r.prototype.getScrollLeft=function(){var e=this.el,t=window.getComputedStyle(e).direction,r=e.scrollLeft;if("rtl"===t)switch(a()){case"positive":r=r+e.clientWidth-e.scrollWidth;break;case"reverse":r=-r}return r},r.prototype.setScrollLeft=function(e){var t=this.el;if("rtl"===window.getComputedStyle(t).direction)switch(a()){case"positive":e=e-t.clientWidth+t.scrollWidth;break;case"reverse":e=-e}t.scrollLeft=e},r.prototype.getScrollFromLeft=function(){var e=this.el,t=window.getComputedStyle(e).direction,r=e.scrollLeft;if("rtl"===t)switch(a()){case"negative":r=r-e.clientWidth+e.scrollWidth;break;case"reverse":r=-r-e.clientWidth+e.scrollWidth}return r},r}(t.ScrollComponent);function a(){return i||(i=function(){var e,r=t.htmlToElement('<div style=" position: absolute; top: -1000px; width: 1px; height: 1px; overflow: scroll; direction: rtl; font-size: 100px; ">A</div>');document.body.appendChild(r),r.scrollLeft>0?e="positive":(r.scrollLeft=1,e=r.scrollLeft>0?"reverse":"negative");return t.removeElement(r),e}())}t.EmitterMixin.mixInto(s);var c=function(){function e(e,r,n){this.isHScrollbarsClipped=!1,this.isVScrollbarsClipped=!1,"clipped-scroll"===e&&(e="scroll",this.isHScrollbarsClipped=!0),"clipped-scroll"===r&&(r="scroll",this.isVScrollbarsClipped=!0),this.enhancedScroll=new s(e,r),n.appendChild(this.el=t.createElement("div",{className:"fc-scroller-clip"})),this.el.appendChild(this.enhancedScroll.el)}return e.prototype.destroy=function(){t.removeElement(this.el)},e.prototype.updateSize=function(){var e=this.enhancedScroll,r=e.el,n=t.computeEdges(r),i={marginLeft:0,marginRight:0,marginTop:0,marginBottom:0};this.isVScrollbarsClipped&&(i.marginLeft=-n.scrollbarLeft,i.marginRight=-n.scrollbarRight),this.isHScrollbarsClipped&&(i.marginBottom=-n.scrollbarBottom),t.applyStyle(r,i),!this.isHScrollbarsClipped&&"hidden"!==e.overflowX||!this.isVScrollbarsClipped&&"hidden"!==e.overflowY||n.scrollbarLeft||n.scrollbarRight||n.scrollbarBottom?r.classList.remove("fc-no-scrollbars"):r.classList.add("fc-no-scrollbars")},e.prototype.setHeight=function(e){this.enhancedScroll.setHeight(e)},e.prototype.getScrollbarWidths=function(){var e=this.enhancedScroll.getScrollbarWidths();return this.isVScrollbarsClipped&&(e.left=0,e.right=0),this.isHScrollbarsClipped&&(e.bottom=0),e},e}(),d=function(){function e(e,t){this.axis=e,this.scrollers=t;for(var r=0,n=this.scrollers;r<n.length;r++){var i=n[r];this.initScroller(i)}}return e.prototype.initScroller=function(e){var t=this,r=e.enhancedScroll,n=function(){t.assignMasterScroller(e)};"wheel mousewheel DomMouseScroll MozMousePixelScroll".split(" ").forEach(function(e){r.el.addEventListener(e,n)}),r.on("scrollStart",function(){t.masterScroller||t.assignMasterScroller(e)}).on("scroll",function(){if(e===t.masterScroller)for(var n=0,i=t.scrollers;n<i.length;n++){var o=i[n];if(o!==e)switch(t.axis){case"horizontal":o.enhancedScroll.el.scrollLeft=r.el.scrollLeft;break;case"vertical":o.enhancedScroll.setScrollTop(r.getScrollTop())}}}).on("scrollEnd",function(){e===t.masterScroller&&t.unassignMasterScroller()})},e.prototype.assignMasterScroller=function(e){this.unassignMasterScroller(),this.masterScroller=e;for(var t=0,r=this.scrollers;t<r.length;t++){var n=r[t];n!==e&&n.enhancedScroll.disableTouchScroll()}},e.prototype.unassignMasterScroller=function(){if(this.masterScroller){for(var e=0,t=this.scrollers;e<t.length;e++){t[e].enhancedScroll.enableTouchScroll()}this.masterScroller=null}},e.prototype.update=function(){for(var e,t,r=this.scrollers.map(function(e){return e.getScrollbarWidths()}),n=0,i=0,o=0,l=0,s=0,a=r;s<a.length;s++)e=a[s],n=Math.max(n,e.left),i=Math.max(i,e.right),o=Math.max(o,e.top),l=Math.max(l,e.bottom);for(t=0;t<this.scrollers.length;t++){var c=this.scrollers[t];e=r[t],c.enhancedScroll.canvas.setGutters("horizontal"===this.axis?{left:n-e.left,right:i-e.right}:{top:o-e.top,bottom:l-e.bottom})}},e}(),h=function(){function e(e,t,r){this.headerScroller=new c("clipped-scroll","hidden",e),this.bodyScroller=new c("auto",r,t),this.scrollJoiner=new d("horizontal",[this.headerScroller,this.bodyScroller])}return e.prototype.destroy=function(){this.headerScroller.destroy(),this.bodyScroller.destroy()},e.prototype.setHeight=function(e,t){var r;r=t?"auto":e-this.queryHeadHeight(),this.bodyScroller.setHeight(r),this.headerScroller.updateSize(),this.bodyScroller.updateSize(),this.scrollJoiner.update()},e.prototype.queryHeadHeight=function(){return this.headerScroller.enhancedScroll.canvas.contentEl.getBoundingClientRect().height},e}(),u=function(e){function r(r,n){var i=e.call(this,r)||this;return n.appendChild(i.tableEl=t.createElement("table",{className:i.theme.getClass("tableGrid")})),i}return n(r,e),r.prototype.destroy=function(){t.removeElement(this.tableEl),e.prototype.destroy.call(this)},r.prototype.render=function(e){this.renderDates(e.tDateProfile)},r.prototype.renderDates=function(e){for(var r=this.dateEnv,n=this.theme,i=e.cellRows,o=i[i.length-1],l=t.asRoughMs(e.labelInterval)>t.asRoughMs(e.slotDuration),s=t.isSingleDay(e.slotDuration),a="<colgroup>",c=e.slotCnt-1;c>=0;c--)a+="<col/>";a+="</colgroup>",a+="<tbody>";for(var d=0,h=i;d<h.length;d++){var u=h[d];a+="<tr"+(l&&u===o?' class="fc-chrono"':"")+">";for(var p=0,f=u;p<f.length;p++){var g=f[p],m=[n.getClass("widgetHeader")];g.isWeekStart&&m.push("fc-em-cell"),s&&(m=m.concat(t.getDayClasses(g.date,this.props.dateProfile,this.context,!0))),a+='<th class="'+m.join(" ")+'" data-date="'+r.formatIso(g.date,{omitTime:!e.isTimeScale,omitTimeZoneOffset:!0})+'"'+(g.colspan>1?' colspan="'+g.colspan+'"':"")+'><div class="fc-cell-content">'+g.spanHtml+"</div></th>"}a+="</tr>"}a+="</tbody>",this.tableEl.innerHTML=a,this.slatColEls=t.findElements(this.tableEl,"col"),this.innerEls=t.findElements(this.tableEl.querySelector("tr:last-child"),"th .fc-cell-text"),t.findElements(this.tableEl.querySelectorAll("tr:not(:last-child)"),"th .fc-cell-text").forEach(function(e){e.classList.add("fc-sticky")})},r}(t.Component),p=function(e){function r(r,n){var i=e.call(this,r)||this;return n.appendChild(i.el=t.createElement("div",{className:"fc-slats"})),i}return n(r,e),r.prototype.destroy=function(){t.removeElement(this.el),e.prototype.destroy.call(this)},r.prototype.render=function(e){this.renderDates(e.tDateProfile)},r.prototype.renderDates=function(e){for(var r=this.theme,n=this.view,i=this.dateEnv,o=e.slotDates,l=e.isWeekStarts,s='<table class="'+r.getClass("tableGrid")+'"><colgroup>',a=0;a<o.length;a++)s+="<col/>";s+="</colgroup>",s+="<tbody><tr>";for(a=0;a<o.length;a++)s+=this.slatCellHtml(o[a],l[a],e);s+="</tr></tbody></table>",this.el.innerHTML=s,this.slatColEls=t.findElements(this.el,"col"),this.slatEls=t.findElements(this.el,"td");for(a=0;a<o.length;a++)n.publiclyTrigger("dayRender",[{date:i.toDate(o[a]),el:this.slatEls[a],view:n}]);this.outerCoordCache=new t.PositionCache(this.el,this.slatEls,!0,!1),this.innerCoordCache=new t.PositionCache(this.el,t.findChildren(this.slatEls,"div"),!0,!1)},r.prototype.slatCellHtml=function(e,r,n){var i,o=this.theme,l=this.dateEnv;return n.isTimeScale?(i=[]).push(t.isInt(l.countDurationsBetween(n.normalizedRange.start,e,n.labelInterval))?"fc-major":"fc-minor"):(i=t.getDayClasses(e,this.props.dateProfile,this.context)).push("fc-day"),i.unshift(o.getClass("widgetContent")),r&&i.push("fc-em-cell"),'<td class="'+i.join(" ")+'" data-date="'+l.formatIso(e,{omitTime:!n.isTimeScale,omitTimeZoneOffset:!0})+'"><div></div></td>'},r.prototype.updateSize=function(){this.outerCoordCache.build(),this.innerCoordCache.build()},r.prototype.positionToHit=function(e){var r=this.outerCoordCache,n=this.props.tDateProfile,i=r.leftToIndex(e);if(null!=i){var o=r.getWidth(i),l=this.isRtl?(r.rights[i]-e)/o:(e-r.lefts[i])/o,s=Math.floor(l*n.snapsPerSlot),a=this.dateEnv.add(n.slotDates[i],t.multiplyDuration(n.snapDuration,s));return{dateSpan:{range:{start:a,end:this.dateEnv.add(a,n.snapDuration)},allDay:!this.props.tDateProfile.isTimeScale},dayEl:this.slatColEls[i],left:r.lefts[i],right:r.rights[i]}}return null},r}(t.Component),f=18,g=6,m=200;t.config.MAX_TIMELINE_SLOTS=1e3;var v=[{years:1},{months:1},{days:1},{hours:1},{minutes:30},{minutes:15},{minutes:10},{minutes:5},{minutes:1},{seconds:30},{seconds:15},{seconds:10},{seconds:5},{seconds:1},{milliseconds:500},{milliseconds:100},{milliseconds:10},{milliseconds:1}];function y(e,r){var n=r.dateEnv,i={labelInterval:E(r,"slotLabelInterval"),slotDuration:E(r,"slotDuration")};!function(e,r,n){var i=r.currentRange;if(e.labelInterval){var o=n.countDurationsBetween(i.start,i.end,e.labelInterval);o>t.config.MAX_TIMELINE_SLOTS&&(console.warn("slotLabelInterval results in too many cells"),e.labelInterval=null)}if(e.slotDuration){var l=n.countDurationsBetween(i.start,i.end,e.slotDuration);l>t.config.MAX_TIMELINE_SLOTS&&(console.warn("slotDuration results in too many cells"),e.slotDuration=null)}if(e.labelInterval&&e.slotDuration){var s=t.wholeDivideDurations(e.labelInterval,e.slotDuration);(null===s||s<1)&&(console.warn("slotLabelInterval must be a multiple of slotDuration"),e.slotDuration=null)}}(i,e,n),D(i,e,n),function(e,r,n){var i=r.currentRange,o=e.slotDuration;if(!o){for(var l=D(e,r,n),s=0,a=v;s<a.length;s++){var c=a[s],d=t.createDuration(c),h=t.wholeDivideDurations(l,d);if(null!==h&&h>1&&h<=g){o=d;break}}if(o){var u=n.countDurationsBetween(i.start,i.end,o);u>m&&(o=null)}o||(o=l),e.slotDuration=o}}(i,e,n);var o=r.opt("slotLabelFormat"),l=Array.isArray(o)?o:null!=o?[o]:function(e,r,n,i){var o,l,s=e.labelInterval,a=t.greatestDurationDenominator(s).unit,c=i.opt("weekNumbers"),d=o=l=null;"week"!==a||c||(a="day");switch(a){case"year":d={year:"numeric"};break;case"month":w("years",r,n)>1&&(d={year:"numeric"}),o={month:"short"};break;case"week":w("years",r,n)>1&&(d={year:"numeric"}),o={week:"narrow"};break;case"day":w("years",r,n)>1?d={year:"numeric",month:"long"}:w("months",r,n)>1&&(d={month:"long"}),c&&(o={week:"short"}),l={weekday:"narrow",day:"numeric"};break;case"hour":c&&(d={week:"short"}),w("days",r,n)>1&&(o={weekday:"short",day:"numeric",month:"numeric",omitCommas:!0}),l={hour:"numeric",minute:"2-digit",omitZeroMinute:!0,meridiem:"short"};break;case"minute":t.asRoughMinutes(s)/60>=g?(d={hour:"numeric",meridiem:"short"},o=function(e){return":"+t.padStart(e.date.minute,2)}):d={hour:"numeric",minute:"numeric",meridiem:"short"};break;case"second":t.asRoughSeconds(s)/60>=g?(d={hour:"numeric",minute:"2-digit",meridiem:"lowercase"},o=function(e){return":"+t.padStart(e.date.second,2)}):d={hour:"numeric",minute:"2-digit",second:"2-digit",meridiem:"lowercase"};break;case"millisecond":d={hour:"numeric",minute:"2-digit",second:"2-digit",meridiem:"lowercase"},o=function(e){return"."+t.padStart(e.millisecond,3)}}return[].concat(d||[],o||[],l||[])}(i,e,n,r);i.headerFormats=l.map(function(e){return t.createFormatter(e)}),i.isTimeScale=Boolean(i.slotDuration.milliseconds);var s=null;if(!i.isTimeScale){var a=t.greatestDurationDenominator(i.slotDuration).unit;/year|month|week/.test(a)&&(s=a)}i.largeUnit=s,i.emphasizeWeeks=t.isSingleDay(i.slotDuration)&&w("weeks",e,n)>=2&&!r.opt("businessHours");var c,d,h=r.opt("snapDuration");h&&(c=t.createDuration(h),d=t.wholeDivideDurations(i.slotDuration,c)),null==d&&(c=i.slotDuration,d=1),i.snapDuration=c,i.snapsPerSlot=d;var u=t.asRoughMs(e.maxTime)-t.asRoughMs(e.minTime),p=S(e.renderRange.start,i,n),f=S(e.renderRange.end,i,n);i.isTimeScale&&(p=n.add(p,e.minTime),f=n.add(t.addDays(f,-1),e.maxTime)),i.timeWindowMs=u,i.normalizedRange={start:p,end:f};for(var y=[],T=p;T<f;)b(T,i,e,r)&&y.push(T),T=n.add(T,i.slotDuration);i.slotDates=y;var R=-1,x=0,M=[],z=[];for(T=p;T<f;)b(T,i,e,r)?(R++,M.push(R),z.push(x)):M.push(R+.5),T=n.add(T,i.snapDuration),x++;return i.snapDiffToIndex=M,i.snapIndexToDiff=z,i.snapCnt=R+1,i.slotCnt=i.snapCnt/i.snapsPerSlot,i.isWeekStarts=function(e,t){for(var r=e.slotDates,n=e.emphasizeWeeks,i=null,o=[],l=0,s=r;l<s.length;l++){var a=s[l],c=t.computeWeekNumber(a),d=n&&null!==i&&i!==c;i=c,o.push(d)}return o}(i,n),i.cellRows=function(e,r,n){for(var i=e.slotDates,o=e.headerFormats,l=o.map(function(e){return[]}),s=o.map(function(e){return e.getLargestUnit?e.getLargestUnit():null}),a=0;a<i.length;a++)for(var c=i[a],d=e.isWeekStarts[a],h=0;h<o.length;h++){var u=o[h],p=l[h],f=p[p.length-1],g=o.length>1&&h<o.length-1,m=null;if(g){var v=r.format(c,u);f&&f.text===v?f.colspan+=1:m=C(c,v,s[h],n)}else if(!f||t.isInt(r.countDurationsBetween(e.normalizedRange.start,c,e.labelInterval))){var v=r.format(c,u);m=C(c,v,s[h],n)}else f.colspan+=1;m&&(m.weekStart=d,p.push(m))}return l}(i,n,r),i}function S(e,r,n){var i=e;return r.isTimeScale||(i=t.startOfDay(i),r.largeUnit&&(i=n.startOf(i,r.largeUnit))),i}function b(e,r,n,i){if(i.dateProfileGenerator.isHiddenDay(e))return!1;if(r.isTimeScale){var o=t.startOfDay(e),l=e.valueOf()-o.valueOf()-t.asRoughMs(n.minTime);return(l=(l%864e5+864e5)%864e5)<r.timeWindowMs}return!0}function E(e,r){var n=e.opt(r);if(null!=n)return t.createDuration(n)}function D(e,r,n){var i=r.currentRange,o=e.labelInterval;if(!o){var l=void 0;if(e.slotDuration){for(var s=0,a=v;s<a.length;s++){l=a[s];var c=t.createDuration(l),d=t.wholeDivideDurations(c,e.slotDuration);if(null!==d&&d<=g){o=c;break}}o||(o=e.slotDuration)}else for(var h=0,u=v;h<u.length;h++){if(l=u[h],o=t.createDuration(l),n.countDurationsBetween(i.start,i.end,o)>=f)break}e.labelInterval=o}return o}function w(e,r,n){var i=r.currentRange,o=null;return"years"===e?o=n.diffWholeYears(i.start,i.end):"months"===e?o=n.diffWholeMonths(i.start,i.end):"weeks"===e?o=n.diffWholeMonths(i.start,i.end):"days"===e&&(o=t.diffWholeDays(i.start,i.end)),o||0}function C(e,r,n,i){return{text:r,spanHtml:t.buildGotoAnchorHtml(i,{date:e,type:n,forceOff:!n},{class:"fc-cell-text"},t.htmlEscape(r)),date:e,colspan:1,isWeekStart:!1}}var T,R=function(){function e(e,t){this.headParent=e,this.bodyParent=t}return e.prototype.render=function(e,r){var n=r?{right:-e}:{left:e};this.headParent.appendChild(this.arrowEl=t.createElement("div",{className:"fc-now-indicator fc-now-indicator-arrow",style:n})),this.bodyParent.appendChild(this.lineEl=t.createElement("div",{className:"fc-now-indicator fc-now-indicator-line",style:n}))},e.prototype.unrender=function(){this.arrowEl&&t.removeElement(this.arrowEl),this.lineEl&&t.removeElement(this.lineEl)},e}(),x=-1!==(T=t.htmlToElement('<div style="position:-webkit-sticky;position:sticky"></div>').style.position).indexOf("sticky")?T:null,M=/Edge/.test(navigator.userAgent),z="-webkit-sticky"===x,k="fc-sticky",P=function(){function e(e,r,n){var i=this;this.usingRelative=null,this.updateSize=function(){var e=Array.prototype.slice.call(i.scroller.canvas.el.querySelectorAll("."+k)),r=i.queryElGeoms(e),n=i.scroller.el.clientWidth;i.usingRelative?function(e,r,n){e.forEach(function(e,i){var o=r[i].naturalBound;t.applyStyle(e,{position:"relative",left:n[i].left-o.left,top:n[i].top-o.top})})}(e,r,i.computeElDestinations(r,n)):function(e,r,n){e.forEach(function(e,i){var o=0;"center"===r[i].intendedTextAlign&&(o=(n-r[i].elWidth)/2,"center"===r[i].computedTextAlign&&(e.setAttribute("data-sticky-center",""),e.parentNode.style.textAlign="left")),t.applyStyle(e,{position:x,left:o,right:0,top:0})})}(e,r,n)},this.scroller=e,this.usingRelative=!x||M&&r||(M||z)&&n,this.usingRelative&&e.on("scrollEnd",this.updateSize)}return e.prototype.destroy=function(){this.scroller.off("scrollEnd",this.updateSize)},e.prototype.queryElGeoms=function(e){for(var r=this.scroller.canvas.el.getBoundingClientRect(),n=[],i=0,o=e;i<o.length;i++){var l=o[i],s=t.translateRect(l.parentNode.getBoundingClientRect(),-r.left,-r.top),a=l.getBoundingClientRect(),c=window.getComputedStyle(l),d=window.getComputedStyle(l.parentNode).textAlign,h=d,u=null;"sticky"!==c.position&&(u=t.translateRect(a,-r.left-(parseFloat(c.left)||0),-r.top-(parseFloat(c.top)||0))),l.hasAttribute("data-sticky-center")&&(h="center"),n.push({parentBound:s,naturalBound:u,elWidth:a.width,elHeight:a.height,computedTextAlign:d,intendedTextAlign:h})}return n},e.prototype.computeElDestinations=function(e,t){var r=this.scroller.getScrollFromLeft(),n=this.scroller.getScrollTop(),i=r+t;return e.map(function(e){var t,o,l=e.elWidth,s=e.elHeight,a=e.parentBound,c=e.naturalBound;switch(e.intendedTextAlign){case"left":t=r;break;case"right":t=i-l;break;case"center":t=(r+i)/2-l/2}return t=Math.min(t,a.right-l),t=Math.max(t,a.left),o=n,o=Math.min(o,a.bottom-s),{left:t,top:o=Math.max(o,c.top)}})},e}();var I=function(e){function r(t,r,n){var i=e.call(this,t)||this,o=i.layout=new h(r,n,"auto"),l=o.headerScroller.enhancedScroll,s=o.bodyScroller.enhancedScroll;return i.headStickyScroller=new P(l,i.isRtl,!1),i.bodyStickyScroller=new P(s,i.isRtl,!1),i.header=new u(t,l.canvas.contentEl),i.slats=new p(t,s.canvas.bgEl),i.nowIndicator=new R(l.canvas.el,s.canvas.el),i}return n(r,e),r.prototype.destroy=function(){this.layout.destroy(),this.header.destroy(),this.slats.destroy(),this.nowIndicator.unrender(),this.headStickyScroller.destroy(),this.bodyStickyScroller.destroy(),e.prototype.destroy.call(this)},r.prototype.render=function(e){var t=this.tDateProfile=y(e.dateProfile,this.view);this.header.receiveProps({dateProfile:e.dateProfile,tDateProfile:t}),this.slats.receiveProps({dateProfile:e.dateProfile,tDateProfile:t})},r.prototype.getNowIndicatorUnit=function(e){var r=this.tDateProfile=y(e,this.view);if(r.isTimeScale)return t.greatestDurationDenominator(r.slotDuration).unit},r.prototype.renderNowIndicator=function(e){t.rangeContainsMarker(this.tDateProfile.normalizedRange,e)&&this.nowIndicator.render(this.dateToCoord(e),this.isRtl)},r.prototype.unrenderNowIndicator=function(){this.nowIndicator.unrender()},r.prototype.updateSize=function(e,t,r){this.applySlotWidth(this.computeSlotWidth()),this.layout.setHeight(t,r),this.slats.updateSize()},r.prototype.updateStickyScrollers=function(){this.headStickyScroller.updateSize(),this.bodyStickyScroller.updateSize()},r.prototype.computeSlotWidth=function(){var e=this.opt("slotWidth")||"";return""===e&&(e=this.computeDefaultSlotWidth(this.tDateProfile)),e},r.prototype.computeDefaultSlotWidth=function(e){var r=0;this.header.innerEls.forEach(function(e,t){r=Math.max(r,e.getBoundingClientRect().width)});var n=Math.ceil(r)+1,i=t.wholeDivideDurations(e.labelInterval,e.slotDuration),o=Math.ceil(n/i),l=window.getComputedStyle(this.header.slatColEls[0]).minWidth;return l&&(l=parseInt(l,10))&&(o=Math.max(o,l)),o},r.prototype.applySlotWidth=function(e){var t=this.layout,r=this.tDateProfile,n="",i="",o="";if(""!==e){n=(e=Math.round(e))*r.slotDates.length,i="",o=e;var l=t.bodyScroller.enhancedScroll.getClientWidth();l>n&&(i=l,n="",o=Math.floor(l/r.slotDates.length))}t.headerScroller.enhancedScroll.canvas.setWidth(n),t.headerScroller.enhancedScroll.canvas.setMinWidth(i),t.bodyScroller.enhancedScroll.canvas.setWidth(n),t.bodyScroller.enhancedScroll.canvas.setMinWidth(i),""!==o&&this.header.slatColEls.slice(0,-1).concat(this.slats.slatColEls.slice(0,-1)).forEach(function(e){e.style.width=o+"px"})},r.prototype.computeDateSnapCoverage=function(e){var r=this.dateEnv,n=this.tDateProfile,i=r.countDurationsBetween(n.normalizedRange.start,e,n.snapDuration);if(i<0)return 0;if(i>=n.snapDiffToIndex.length)return n.snapCnt;var o=Math.floor(i),l=n.snapDiffToIndex[o];return t.isInt(l)?l+=i-o:l=Math.ceil(l),l},r.prototype.dateToCoord=function(e){var t=this.tDateProfile,r=this.computeDateSnapCoverage(e)/t.snapsPerSlot,n=Math.floor(r),i=r-(n=Math.min(n,t.slotCnt-1)),o=this.slats,l=o.innerCoordCache,s=o.outerCoordCache;return this.isRtl?s.rights[n]-l.getWidth(n)*i-s.originClientRect.width:s.lefts[n]+l.getWidth(n)*i},r.prototype.rangeToCoords=function(e){return this.isRtl?{right:this.dateToCoord(e.start),left:this.dateToCoord(e.end)}:{left:this.dateToCoord(e.start),right:this.dateToCoord(e.end)}},r.prototype.computeDateScroll=function(e){var r=this.dateEnv,n=this.props.dateProfile,i=0;return n&&(i=this.dateToCoord(r.add(t.startOfDay(n.activeRange.start),e)),!this.isRtl&&i&&(i+=1)),{left:i}},r.prototype.queryDateScroll=function(){return{left:this.layout.bodyScroller.enhancedScroll.getScrollLeft()}},r.prototype.applyDateScroll=function(e){this.layout.bodyScroller.enhancedScroll.setScrollLeft(e.left||0),this.layout.headerScroller.enhancedScroll.setScrollLeft(e.left||0)},r}(t.Component),H=function(e){function r(t,r,n){var i=e.call(this,t)||this;return i.masterContainerEl=r,i.timeAxis=n,i}return n(r,e),r.prototype.renderSegHtml=function(e,r){var n=this.context.view,i=e.eventRange,o=i.def,l=i.ui,s=n.computeEventDraggable(o,l),a=e.isStart&&n.computeEventStartResizable(o,l),c=e.isEnd&&n.computeEventEndResizable(o,l),d=this.getSegClasses(e,s,a||c,r);d.unshift("fc-timeline-event","fc-h-event");var h=this.getTimeText(i);return'<a class="'+d.join(" ")+'" style="'+t.cssToStr(this.getSkinCss(l))+'"'+(o.url?' href="'+t.htmlEscape(o.url)+'"':"")+">"+(h?'<span class="fc-time-wrap"><span class="fc-time">'+t.htmlEscape(h)+"</span></span>":"")+'<span class="fc-title-wrap"><span class="fc-title fc-sticky">'+(o.title?t.htmlEscape(o.title):"&nbsp;")+"</span></span>"+(a?'<div class="fc-resizer fc-start-resizer"></div>':"")+(c?'<div class="fc-resizer fc-end-resizer"></div>':"")+"</a>"},r.prototype.computeDisplayEventTime=function(){return!this.timeAxis.tDateProfile.isTimeScale},r.prototype.computeDisplayEventEnd=function(){return!1},r.prototype.computeEventTimeFormat=function(){return{hour:"numeric",minute:"2-digit",omitZeroMinute:!0,meridiem:"narrow"}},r.prototype.attachSegs=function(e,r){if(!this.el&&this.masterContainerEl&&(this.el=t.createElement("div",{className:"fc-event-container"}),r&&this.el.classList.add("fc-mirror-container"),this.masterContainerEl.appendChild(this.el)),this.el)for(var n=0,i=e;n<i.length;n++){var o=i[n];this.el.appendChild(o.el)}},r.prototype.detachSegs=function(e){for(var r=0,n=e;r<n.length;r++){var i=n[r];t.removeElement(i.el)}},r.prototype.computeSegSizes=function(e){for(var r=this.timeAxis,n=0,i=e;n<i.length;n++){var o=i[n],l=r.rangeToCoords(o);t.applyStyle(o.el,{left:o.left=l.left,right:-(o.right=l.right)})}},r.prototype.assignSegSizes=function(e){if(this.el){for(var r=0,n=e;r<n.length;r++){(s=n[r]).height=t.computeHeightAndMargins(s.el)}this.buildSegLevels(e);var i=L(e);t.applyStyleProp(this.el,"height",i);for(var o=0,l=e;o<l.length;o++){var s=l[o];t.applyStyleProp(s.el,"top",s.top)}}},r.prototype.buildSegLevels=function(e){for(var t=[],r=0,n=e=this.sortEventSegs(e);r<n.length;r++){var i=n[r];i.above=[];for(var o=0;o<t.length;){for(var l=!1,s=0,a=t[o];s<a.length;s++){var c=a[s];A(i,c)&&(i.above.push(c),l=!0)}if(!l)break;o+=1}for((t[o]||(t[o]=[])).push(i),o+=1;o<t.length;){for(var d=0,h=t[o];d<h.length;d++){var u=h[d];A(i,u)&&u.above.push(i)}o+=1}}return t},r}(t.FgEventRenderer);function L(e){for(var t=0,r=0,n=e;r<n.length;r++){var i=n[r];t=Math.max(t,W(i))}return t}function W(e){return null==e.top&&(e.top=L(e.above)),e.top+e.height}function A(e,t){return e.left<t.right&&e.right>t.left}var B=function(e){function r(t,r,n){var i=e.call(this,t)||this;return i.masterContainerEl=r,i.timeAxis=n,i}return n(r,e),r.prototype.attachSegs=function(e,r){if(r.length){var n=void 0;n="businessHours"===e?"bgevent":e.toLowerCase();var i=t.createElement("div",{className:"fc-"+n+"-container"});this.masterContainerEl.appendChild(i);for(var o=0,l=r;o<l.length;o++){var s=l[o];i.appendChild(s.el)}return[i]}},r.prototype.computeSegSizes=function(e){for(var t=this.timeAxis,r=0,n=e;r<n.length;r++){var i=n[r],o=t.rangeToCoords(i);i.left=o.left,i.right=o.right}},r.prototype.assignSegSizes=function(e){for(var r=0,n=e;r<n.length;r++){var i=n[r];t.applyStyle(i.el,{left:i.left,right:-i.right})}},r}(t.FillRenderer),O=function(e){function r(r,n,i,o){var l=e.call(this,r,i)||this;l.slicer=new N,l.renderEventDrag=t.memoizeRendering(l._renderEventDrag,l._unrenderEventDrag),l.renderEventResize=t.memoizeRendering(l._renderEventResize,l._unrenderEventResize);var s=l.fillRenderer=new B(r,i,o),a=l.eventRenderer=new H(r,n,o);return l.mirrorRenderer=new H(r,n,o),l.renderBusinessHours=t.memoizeRendering(s.renderSegs.bind(s,"businessHours"),s.unrender.bind(s,"businessHours")),l.renderDateSelection=t.memoizeRendering(s.renderSegs.bind(s,"highlight"),s.unrender.bind(s,"highlight")),l.renderBgEvents=t.memoizeRendering(s.renderSegs.bind(s,"bgEvent"),s.unrender.bind(s,"bgEvent")),l.renderFgEvents=t.memoizeRendering(a.renderSegs.bind(a),a.unrender.bind(a)),l.renderEventSelection=t.memoizeRendering(a.selectByInstanceId.bind(a),a.unselectByInstanceId.bind(a),[l.renderFgEvents]),l.timeAxis=o,l}return n(r,e),r.prototype.render=function(e){var t=this.slicer.sliceProps(e,e.dateProfile,this.timeAxis.tDateProfile.isTimeScale?null:e.nextDayThreshold,this,this.timeAxis);this.renderBusinessHours(t.businessHourSegs),this.renderDateSelection(t.dateSelectionSegs),this.renderBgEvents(t.bgEventSegs),this.renderFgEvents(t.fgEventSegs),this.renderEventSelection(t.eventSelection),this.renderEventDrag(t.eventDrag),this.renderEventResize(t.eventResize)},r.prototype.destroy=function(){e.prototype.destroy.call(this),this.renderBusinessHours.unrender(),this.renderDateSelection.unrender(),this.renderBgEvents.unrender(),this.renderFgEvents.unrender(),this.renderEventSelection.unrender(),this.renderEventDrag.unrender(),this.renderEventResize.unrender()},r.prototype._renderEventDrag=function(e){e&&(this.eventRenderer.hideByHash(e.affectedInstances),this.mirrorRenderer.renderSegs(e.segs,{isDragging:!0,sourceSeg:e.sourceSeg}))},r.prototype._unrenderEventDrag=function(e){e&&(this.eventRenderer.showByHash(e.affectedInstances),this.mirrorRenderer.unrender(e.segs,{isDragging:!0,sourceSeg:e.sourceSeg}))},r.prototype._renderEventResize=function(e){if(e){var t=e.segs.map(function(e){return o({},e)});this.eventRenderer.hideByHash(e.affectedInstances),this.fillRenderer.renderSegs("highlight",t),this.mirrorRenderer.renderSegs(e.segs,{isDragging:!0,sourceSeg:e.sourceSeg})}},r.prototype._unrenderEventResize=function(e){e&&(this.eventRenderer.showByHash(e.affectedInstances),this.fillRenderer.unrender("highlight"),this.mirrorRenderer.unrender(e.segs,{isDragging:!0,sourceSeg:e.sourceSeg}))},r.prototype.updateSize=function(e){var t=this.fillRenderer,r=this.eventRenderer,n=this.mirrorRenderer;t.computeSizes(e),r.computeSizes(e),n.computeSizes(e),t.assignSizes(e),r.assignSizes(e),n.assignSizes(e)},r}(t.DateComponent),N=function(e){function r(){return null!==e&&e.apply(this,arguments)||this}return n(r,e),r.prototype.sliceRange=function(e,r){var n=r.tDateProfile,i=r.props.dateProfile,o=function(e,r,n){if(!r.isTimeScale&&(e=t.computeVisibleDayRange(e),r.largeUnit)){var i=e;((e={start:n.startOf(e.start,r.largeUnit),end:n.startOf(e.end,r.largeUnit)}).end.valueOf()!==i.end.valueOf()||e.end<=e.start)&&(e={start:e.start,end:n.add(e.end,r.slotDuration)})}return e}(e,n,r.dateEnv),l=[];if(r.computeDateSnapCoverage(o.start)<r.computeDateSnapCoverage(o.end)){var s=t.intersectRanges(o,n.normalizedRange);s&&l.push({start:s.start,end:s.end,isStart:s.start.valueOf()===o.start.valueOf()&&b(s.start,n,i,r.view),isEnd:s.end.valueOf()===o.end.valueOf()&&b(t.addMs(s.end,-1),n,i,r.view)})}return l},r}(t.Slicer),_=function(e){function t(t,r,n,i){var o=e.call(this,t,r,n,i)||this;return o.el.classList.add("fc-timeline"),!1===o.opt("eventOverlap")&&o.el.classList.add("fc-no-overlap"),o.el.innerHTML=o.renderSkeletonHtml(),o.timeAxis=new I(o.context,o.el.querySelector("thead .fc-time-area"),o.el.querySelector("tbody .fc-time-area")),o.lane=new O(o.context,o.timeAxis.layout.bodyScroller.enhancedScroll.canvas.contentEl,o.timeAxis.layout.bodyScroller.enhancedScroll.canvas.bgEl,o.timeAxis),t.calendar.registerInteractiveComponent(o,{el:o.timeAxis.slats.el}),o}return n(t,e),t.prototype.destroy=function(){this.timeAxis.destroy(),this.lane.destroy(),e.prototype.destroy.call(this),this.calendar.unregisterInteractiveComponent(this)},t.prototype.renderSkeletonHtml=function(){var e=this.theme;return'<table class="'+e.getClass("tableGrid")+'"> <thead class="fc-head"> <tr> <td class="fc-time-area '+e.getClass("widgetHeader")+'"></td> </tr> </thead> <tbody class="fc-body"> <tr> <td class="fc-time-area '+e.getClass("widgetContent")+'"></td> </tr> </tbody> </table>'},t.prototype.render=function(t){e.prototype.render.call(this,t),this.timeAxis.receiveProps({dateProfile:t.dateProfile}),this.lane.receiveProps(o({},t,{nextDayThreshold:this.nextDayThreshold}))},t.prototype.updateSize=function(e,t,r){this.timeAxis.updateSize(e,t,r),this.lane.updateSize(e)},t.prototype.getNowIndicatorUnit=function(e){return this.timeAxis.getNowIndicatorUnit(e)},t.prototype.renderNowIndicator=function(e){this.timeAxis.renderNowIndicator(e)},t.prototype.unrenderNowIndicator=function(){this.timeAxis.unrenderNowIndicator()},t.prototype.computeDateScroll=function(e){return this.timeAxis.computeDateScroll(e)},t.prototype.applyScroll=function(t,r){e.prototype.applyScroll.call(this,t,r);var n=this.calendar;(r||n.isViewUpdated||n.isDatesUpdated||n.isEventsUpdated)&&this.timeAxis.updateStickyScrollers()},t.prototype.applyDateScroll=function(e){this.timeAxis.applyDateScroll(e)},t.prototype.queryScroll=function(){var e=this.timeAxis.layout.bodyScroller.enhancedScroll;return{top:e.getScrollTop(),left:e.getScrollLeft()}},t.prototype.buildPositionCaches=function(){this.timeAxis.slats.updateSize()},t.prototype.queryHit=function(e,t,r,n){var i=this.timeAxis.slats.positionToHit(e);if(i)return{component:this,dateSpan:i.dateSpan,rect:{left:i.left,right:i.right,top:0,bottom:n},dayEl:i.dayEl,layer:0}},t}(t.View),F=t.createPlugin({defaultView:"timelineDay",views:{timeline:{class:_,eventResizableFromStart:!0},timelineDay:{type:"timeline",duration:{days:1}},timelineWeek:{type:"timeline",duration:{weeks:1}},timelineMonth:{type:"timeline",duration:{months:1}},timelineYear:{type:"timeline",duration:{years:1}}}});e.HeaderBodyLayout=h,e.ScrollJoiner=d,e.StickyScroller=P,e.TimeAxis=I,e.TimelineLane=O,e.TimelineView=_,e.default=F,Object.defineProperty(e,"__esModule",{value:!0})});
\ No newline at end of file
diff --git a/AKPlan/static/AKPlan/vendor/fullcalendar/timeline/package.json b/AKPlan/static/AKPlan/vendor/fullcalendar/timeline/package.json
deleted file mode 100644
index d7105eabd221153726126ac38fd7f783da01432f..0000000000000000000000000000000000000000
--- a/AKPlan/static/AKPlan/vendor/fullcalendar/timeline/package.json
+++ /dev/null
@@ -1,33 +0,0 @@
-{
-  "name": "@fullcalendar/timeline",
-  "version": "4.3.0",
-  "title": "FullCalendar Timeline Plugin",
-  "description": "Display events on a horizontal time axis (without resources)",
-  "keywords": [
-    "calendar",
-    "event",
-    "full-sized"
-  ],
-  "homepage": "https://fullcalendar.io/scheduler",
-  "docs": "https://fullcalendar.io/docs/timeline-view-no-resources",
-  "bugs": "https://fullcalendar.io/reporting-bugs",
-  "repository": {
-    "type": "git",
-    "url": "https://github.com/fullcalendar/fullcalendar-scheduler.git",
-    "homepage": "https://github.com/fullcalendar/fullcalendar-scheduler"
-  },
-  "license": "SEE LICENSE IN LICENSE.md",
-  "author": {
-    "name": "Adam Shaw",
-    "email": "arshaw@arshaw.com",
-    "url": "http://arshaw.com/"
-  },
-  "copyright": "2019 Adam Shaw",
-  "peerDependencies": {
-    "@fullcalendar/core": "~4.3.0"
-  },
-  "main": "main.js",
-  "module": "main.esm.js",
-  "unpkg": "main.min.js",
-  "types": "main.d.ts"
-}
diff --git a/AKPlan/templates/AKPlan/plan_akslot.html b/AKPlan/templates/AKPlan/plan_akslot.html
index f951c86c00d3716e27dcd42ef10147956014284e..e519491fe66bbe91064be9ffca4a5b878ecfb2bb 100644
--- a/AKPlan/templates/AKPlan/plan_akslot.html
+++ b/AKPlan/templates/AKPlan/plan_akslot.html
@@ -3,17 +3,12 @@
 {% load i18n %}
 {% get_current_language as LANGUAGE_CODE %}
 
-<link href='{% static 'AKPlan/vendor/fullcalendar/core/main.min.css' %}' rel='stylesheet'/>
-<link href='{% static 'AKPlan/vendor/fullcalendar/daygrid/main.min.css' %}' rel='stylesheet'/>
-<link href='{% static 'AKPlan/vendor/fullcalendar/timegrid/main.min.css' %}' rel='stylesheet'/>
+<script src='{% static 'AKPlan/vendor/fullcalendar-scheduler/main.js' %}'></script>
+<link href='{% static 'AKPlan/vendor/fullcalendar-scheduler/main.css' %}' rel='stylesheet'/>
 
-<script src='{% static 'AKPlan/vendor/fullcalendar/core/main.min.js' %}'></script>
-{% with 'AKPlan/vendor/fullcalendar/core/locales/'|add:LANGUAGE_CODE|add:'.js' as locale_file %}
+{% with 'AKPlan/vendor/fullcalendar-scheduler/locales/'|add:LANGUAGE_CODE|add:'.js' as locale_file %}
     <script src="{% static locale_file %}"></script>
 {% endwith %}
-<script src='{% static 'AKPlan/vendor/fullcalendar/daygrid/main.min.js' %}'></script>
-<script src='{% static 'AKPlan/vendor/fullcalendar/timegrid/main.min.js' %}'></script>
-<script src='{% static 'AKPlan/vendor/fullcalendar/bootstrap/main.min.js' %}'></script>
 
 <script>
 
@@ -21,18 +16,13 @@
         var calendarEl = document.getElementById('akSlotCalendar');
 
         var calendar = new FullCalendar.Calendar(calendarEl, {
-            plugins: ['timeGrid', 'bootstrap'],
             // Adapt to timezone of the connected event
             timeZone: '{{ ak.event.timezone }}',
-            defaultView: 'timeGrid',
+            initialView: 'timeGrid',
             // Adapt to user selected locale
             locale: '{{ LANGUAGE_CODE }}',
             // No header, not buttons
-            header: {
-                left: '',
-                center: '',
-                right: ''
-            },
+            headerToolbar: false,
             aspectRatio: 2.5,
             themeSystem: 'bootstrap',
             // Only show calendar view for the dates of the connected event
@@ -40,6 +30,7 @@
                 start: '{{ ak.event.start | timezone:ak.event.timezone | date:"Y-m-d H:i:s" }}',
                 end: '{{ ak.event.end | timezone:ak.event.timezone  | date:"Y-m-d H:i:s"}}',
             },
+            scrollTime: '08:00:00',
             allDaySlot: false,
             nowIndicator: true,
             eventTextColor: '#fff',
@@ -64,10 +55,11 @@
                         start: '{{ a.start | timezone:ak.event.timezone | date:"Y-m-d H:i:s" }}',
                         end: '{{ a.end | timezone:ak.event.timezone | date:"Y-m-d H:i:s" }}',
                         backgroundColor: '#28B62C',
-                        rendering: 'background'
+                        display: 'background'
                     },
                 {% endfor %}
-            ]
+            ],
+            schedulerLicenseKey: 'GPL-My-Project-Is-Open-Source',
         });
 
         calendar.render();
diff --git a/AKPlan/templates/AKPlan/plan_base.html b/AKPlan/templates/AKPlan/plan_base.html
index 846e79d2bc389d1cddf0a4e376645f8b0a0855df..50cb2c07baab49eb7bef6dbb945ba1a5b1519504 100644
--- a/AKPlan/templates/AKPlan/plan_base.html
+++ b/AKPlan/templates/AKPlan/plan_base.html
@@ -12,13 +12,12 @@
 {% block imports %}
     {% get_current_language as LANGUAGE_CODE %}
 
-    <link href='{% static 'AKPlan/vendor/fullcalendar/core/main.css' %}' rel='stylesheet'/>
+    <script src='{% static 'AKPlan/vendor/fullcalendar-scheduler/main.js' %}'></script>
+    <link href='{% static 'AKPlan/vendor/fullcalendar-scheduler/main.css' %}' rel='stylesheet'/>
 
-    <script src='{% static 'AKPlan/vendor/fullcalendar/core/main.js' %}'></script>
-    {% with 'AKPlan/vendor/fullcalendar/core/locales/'|add:LANGUAGE_CODE|add:'.js' as locale_file %}
+    {% with 'AKPlan/vendor/fullcalendar-scheduler/locales/'|add:LANGUAGE_CODE|add:'.js' as locale_file %}
         <script src="{% static locale_file %}"></script>
     {% endwith %}
-    <script src='{% static 'AKPlan/vendor/fullcalendar/bootstrap/main.js' %}'></script>
 
     {% block fullcalendar %}{% endblock %}
 {% endblock imports %}
diff --git a/AKPlan/templates/AKPlan/plan_detail.html b/AKPlan/templates/AKPlan/plan_detail.html
index b539afd8f7384a822c482dcd1590358eb3c12dff..7c4423dac832d3a6d45e5c78efca62800381d8ec 100644
--- a/AKPlan/templates/AKPlan/plan_detail.html
+++ b/AKPlan/templates/AKPlan/plan_detail.html
@@ -10,25 +10,18 @@
     {% if not event.plan_hidden or user.is_staff %}
         {% get_current_language as LANGUAGE_CODE %}
 
-        <link href='{% static 'AKPlan/vendor/fullcalendar/daygrid/main.min.css' %}' rel='stylesheet'/>
-        <link href='{% static 'AKPlan/vendor/fullcalendar/timegrid/main.min.css' %}' rel='stylesheet'/>
-
-        <script src='{% static 'AKPlan/vendor/fullcalendar/daygrid/main.min.js' %}'></script>
-        <script src='{% static 'AKPlan/vendor/fullcalendar/timegrid/main.min.js' %}'></script>
-
         <script>
             document.addEventListener('DOMContentLoaded', function () {
                 var calendarEl = document.getElementById('planCalendar');
 
                 var calendar = new FullCalendar.Calendar(calendarEl, {
-                    plugins: ['timeGrid', 'bootstrap'],
                     // Adapt to timezone of the connected event
                     timeZone: '{{ event.timezone }}',
-                    defaultView: 'timeGrid',
+                    initialView: 'timeGrid',
                     // Adapt to user selected locale
                     locale: '{{ LANGUAGE_CODE }}',
                     // No header, not buttons
-                    header: {
+                    headerToolbar: {
                         left: '',
                         center: '',
                         right: ''
@@ -40,12 +33,14 @@
                         start: '{{ event.start | timezone:event.timezone | date:"Y-m-d H:i:s" }}',
                         end: '{{ event.end | timezone:event.timezone  | date:"Y-m-d H:i:s"}}',
                     },
+                    scrollTime: '08:00:00',
                     allDaySlot: false,
                     nowIndicator: true,
                     eventTextColor: '#fff',
                     eventColor: '#127ba3',
                     // Create entries for all scheduled slots
-                    events: {% block encode %}{% endblock %}
+                    events: {% block encode %}{% endblock %},
+                    schedulerLicenseKey: 'GPL-My-Project-Is-Open-Source',
                 });
 
                 calendar.render();
diff --git a/AKPlan/templates/AKPlan/plan_index.html b/AKPlan/templates/AKPlan/plan_index.html
index 976ce496b06f90075bf76a106fc3708b77fbc415..149559723f1623bc7a3cd7d78499578710a883d7 100644
--- a/AKPlan/templates/AKPlan/plan_index.html
+++ b/AKPlan/templates/AKPlan/plan_index.html
@@ -10,30 +10,21 @@
     {% if not event.plan_hidden or user.is_staff %}
         {% get_current_language as LANGUAGE_CODE %}
 
-        <link href='{% static 'AKPlan/vendor/fullcalendar/timeline/main.css' %}' rel='stylesheet'/>
-        <link href='{% static 'AKPlan/vendor/fullcalendar/resource-timeline/main.css' %}' rel='stylesheet'/>
-        <link href='{% static 'AKPlan/vendor/fullcalendar/resource-timeline/main.min.css' %}' rel='stylesheet'/>
-
-        <script src='{% static 'AKPlan/vendor/fullcalendar/timeline/main.js' %}'></script>
-        <script src='{% static 'AKPlan/vendor/fullcalendar/resource-common/main.js' %}'></script>
-        <script src='{% static 'AKPlan/vendor/fullcalendar/resource-timeline/main.js' %}'></script>
         <script>
             document.addEventListener('DOMContentLoaded', function () {
                 var planEl = document.getElementById('planCalendar');
 
                 var plan = new FullCalendar.Calendar(planEl, {
-                    plugins: ['resourceTimeline', 'bootstrap'],
                     timeZone: '{{ event.timezone }}',
-                    header: {
+                    headerToolbar: {
                         left: 'today prev,next',
                         center: 'title',
                         right: 'resourceTimelineDay,resourceTimelineEvent'
                     },
-                    aspectRatio: 2,
                     themeSystem: 'bootstrap',
                     // Adapt to user selected locale
                     locale: '{{ LANGUAGE_CODE }}',
-                    defaultView: 'resourceTimelineEvent',
+                    initialView: 'resourceTimelineEvent',
                     views: {
                         resourceTimelineDay: {
                             type: 'resourceTimeline',
@@ -50,7 +41,7 @@
                             buttonText: '{% trans "Event" %}',
                         }
                     },
-                    eventRender: function(info) {
+                    eventDidMount: function(info) {
                         $(info.el).tooltip({title: info.event.extendedProps.description});
                     },
                     editable: false,
@@ -59,7 +50,7 @@
                     eventTextColor: '#fff',
                     eventColor: '#127ba3',
                     resourceAreaWidth: '15%',
-                    resourceLabelText: '{% trans "Room" %}',
+                    resourceAreaHeaderContent: '{% trans "Room" %}',
                     resources: {% include "AKPlan/encode_rooms.html" %},
                     events: {% with akslots as slots %}{% include "AKPlan/encode_events.html" %}{% endwith %},
                     schedulerLicenseKey: 'GPL-My-Project-Is-Open-Source',
@@ -68,7 +59,9 @@
                 plan.render();
 
                 // Scroll to current time
-                $('.fc-scroller').scrollLeft($('.fc-now-indicator').position().left);
+                if($(".fc-timeline-now-indicator-line").length) {
+                    $('.fc-scroller').scrollLeft($('.fc-timeline-now-indicator-line').position().left);
+                }
             });
         </script>
     {% endif %}
@@ -149,7 +142,9 @@
                 {% endif %}
 
                 <div class="col-md-12">
-                    <div id="planCalendar" style="margin-top:30px;"></div>
+                    <div style="margin-top:30px;margin-bottom: 70px;">
+                        <div id="planCalendar"></div>
+                    </div>
                 </div>
             {% else %}
                 <div class="col-md-12">
diff --git a/AKPlan/templates/AKPlan/plan_room.html b/AKPlan/templates/AKPlan/plan_room.html
index ab56ba1e672f735f03a93629b5f4b1fa6074b8bc..7a7e62ed4076c3432075e48fad51efdf30831909 100644
--- a/AKPlan/templates/AKPlan/plan_room.html
+++ b/AKPlan/templates/AKPlan/plan_room.html
@@ -27,6 +27,17 @@
             },
         {% endif %}
     {% endfor %}
+    {% for a in room.availabilities.all %}
+        {
+            title: '',
+            start: '{{ a.start | timezone:event.timezone | date:"Y-m-d H:i:s" }}',
+            end: '{{ a.end | timezone:event.timezone | date:"Y-m-d H:i:s" }}',
+            'resourceId': '{{ a.room.title }}',
+            backgroundColor: '#28B62C',
+            display: 'background',
+            groupId: 'roomAvailable',
+        },
+    {% endfor %}
 ]
 {% endblock %}
 
diff --git a/AKPlan/templates/AKPlan/plan_wall.html b/AKPlan/templates/AKPlan/plan_wall.html
index c99ff3c8738afa028c8a4ae4ab713e6f353cb4d0..a04e1e9107aba7fe75494232a29e2fa8f9bfe446 100644
--- a/AKPlan/templates/AKPlan/plan_wall.html
+++ b/AKPlan/templates/AKPlan/plan_wall.html
@@ -21,39 +21,30 @@
 
     {% get_current_language as LANGUAGE_CODE %}
 
-    <link href='{% static 'AKPlan/vendor/fullcalendar/core/main.css' %}' rel='stylesheet'/>
-    <link href='{% static 'AKPlan/vendor/fullcalendar/timeline/main.css' %}' rel='stylesheet'/>
-    <link href='{% static 'AKPlan/vendor/fullcalendar/resource-timeline/main.css' %}' rel='stylesheet'/>
-    <link href='{% static 'AKPlan/vendor/fullcalendar/resource-timeline/main.min.css' %}' rel='stylesheet'/>
+    <script src='{% static 'AKPlan/vendor/fullcalendar-scheduler/main.js' %}'></script>
+    <link href='{% static 'AKPlan/vendor/fullcalendar-scheduler/main.css' %}' rel='stylesheet'/>
 
-    <script src='{% static 'AKPlan/vendor/fullcalendar/core/main.js' %}'></script>
-    {% with 'AKPlan/vendor/fullcalendar/core/locales/'|add:LANGUAGE_CODE|add:'.js' as locale_file %}
+    {% with 'AKPlan/vendor/fullcalendar-scheduler/locales/'|add:LANGUAGE_CODE|add:'.js' as locale_file %}
         <script src="{% static locale_file %}"></script>
     {% endwith %}
-    <script src='{% static 'AKPlan/vendor/fullcalendar/timeline/main.js' %}'></script>
-    <script src='{% static 'AKPlan/vendor/fullcalendar/resource-common/main.js' %}'></script>
-    <script src='{% static 'AKPlan/vendor/fullcalendar/resource-timeline/main.js' %}'></script>
-    <script src='{% static 'AKPlan/vendor/fullcalendar/bootstrap/main.js' %}'></script>
 
     <script>
         document.addEventListener('DOMContentLoaded', function () {
             var planEl = document.getElementById('planCalendar');
 
             var plan = new FullCalendar.Calendar(planEl, {
-                plugins: ['resourceTimeline', 'bootstrap'],
                 timeZone: '{{ event.timezone }}',
-                header: false,
+                headerToolbar: false,
                 themeSystem: 'bootstrap',
                 // Adapt to user selected locale
                 locale: '{{ LANGUAGE_CODE }}',
-                type: 'resourceTimeline',
                 slotDuration: '01:00',
-                defaultView: 'resourceTimeline',
+                initialView: 'resourceTimeline',
                 visibleRange: {
                     start: '{{ start | timezone:event.timezone | date:"Y-m-d H:i:s" }}',
                     end: '{{ end | timezone:event.timezone  | date:"Y-m-d H:i:s"}}',
                 },
-                eventRender: function(info) {
+                eventDidMount: function(info) {
                     $(info.el).tooltip({title: info.event.extendedProps.description});
                 },
                 editable: false,
@@ -61,9 +52,9 @@
                 nowIndicator: true,
                 eventTextColor: '#fff',
                 eventColor: '#127ba3',
-                height: 'parent',
+                height: '90%',
                 resourceAreaWidth: '15%',
-                resourceLabelText: '{% trans "Room" %}',
+                resourceAreaHeaderContent: '{% trans "Room" %}',
                 resources: [
                     {% for room in rooms %}
                         {
@@ -79,7 +70,9 @@
             plan.render();
 
             // Scroll to current time
-            $('.fc-scroller').scrollLeft($('.fc-now-indicator').position().left);
+                if($(".fc-timeline-now-indicator-line").length) {
+                    $('.fc-scroller').scrollLeft($('.fc-timeline-now-indicator-line').position().left);
+                }
         });
     </script>
 
diff --git a/AKScheduling/api.py b/AKScheduling/api.py
new file mode 100644
index 0000000000000000000000000000000000000000..84b629224b69119acd62cc8ca5dafcae32a8684d
--- /dev/null
+++ b/AKScheduling/api.py
@@ -0,0 +1,112 @@
+from django.contrib.auth.mixins import LoginRequiredMixin
+from django.http import JsonResponse
+from django.shortcuts import get_object_or_404
+from django.urls import reverse
+from django.utils import timezone
+from django.views.generic import ListView
+from rest_framework import viewsets, mixins, serializers, permissions
+
+from AKModel.availability.models import Availability
+from AKModel.models import Room, AKSlot
+from AKModel.views import EventSlugMixin
+
+
+class ResourceSerializer(serializers.ModelSerializer):
+    class Meta:
+        model = Room
+        fields = ['id', 'title']
+
+    title = serializers.SerializerMethodField('transform_title')
+
+    def transform_title(self, obj):
+        if obj.capacity > 0:
+            return f"{obj.title} [{obj.capacity}]"
+        return obj.title
+
+
+class ResourcesViewSet(EventSlugMixin, mixins.RetrieveModelMixin, mixins.ListModelMixin, viewsets.GenericViewSet):
+    permission_classes = (permissions.DjangoModelPermissionsOrAnonReadOnly,)
+    serializer_class = ResourceSerializer
+
+    def get_queryset(self):
+        return Room.objects.filter(event=self.event)
+
+
+class EventsView(LoginRequiredMixin, EventSlugMixin, ListView):
+    model = AKSlot
+
+    def get_queryset(self):
+        return super().get_queryset().filter(event=self.event, room__isnull=False)
+
+    def render_to_response(self, context, **response_kwargs):
+        return JsonResponse(
+            [{
+                "slotID": slot.pk,
+                "title": slot.ak.short_name,
+                "description": slot.ak.name,
+                "resourceId": slot.room.id,
+                "start": timezone.localtime(slot.start, self.event.timezone).strftime("%Y-%m-%d %H:%M:%S"),
+                "end": timezone.localtime(slot.end, self.event.timezone).strftime("%Y-%m-%d %H:%M:%S"),
+                "backgroundColor": slot.ak.category.color,
+                # TODO Mark conflicts here?
+                "borderColor": slot.ak.category.color,
+                "constraint": 'roomAvailable',
+                'url': str(reverse('submit:ak_detail', kwargs={"event_slug": self.event.slug, "pk": slot.ak.pk})),
+            } for slot in context["object_list"]],
+            safe=False,
+            **response_kwargs
+        )
+
+
+class RoomAvailabilitiesView(LoginRequiredMixin, EventSlugMixin, ListView):
+    model = Availability
+    context_object_name = "availabilities"
+
+    def get_queryset(self):
+        return super().get_queryset().filter(event=self.event, room__isnull=False)
+
+    def render_to_response(self, context, **response_kwargs):
+        return JsonResponse(
+            [{
+                "title": "",
+                "resourceId": a.room.id,
+                "start": timezone.localtime(a.start, self.event.timezone).strftime("%Y-%m-%d %H:%M:%S"),
+                "end": timezone.localtime(a.end, self.event.timezone).strftime("%Y-%m-%d %H:%M:%S"),
+                "backgroundColor": "#28B62C",
+                "display": 'background',
+                "groupId": 'roomAvailable',
+            } for a in context["availabilities"]],
+            safe=False,
+            **response_kwargs
+        )
+
+
+class EventSerializer(serializers.ModelSerializer):
+    class Meta:
+        model = AKSlot
+        fields = ['id', 'start', 'end', 'roomId']
+
+    start = serializers.DateTimeField()
+    end = serializers.DateTimeField()
+    roomId = serializers.IntegerField(source='room.pk')
+
+    def update(self, instance, validated_data):
+        start = timezone.make_aware(timezone.make_naive(validated_data.get('start')), instance.event.timezone)
+        end = timezone.make_aware(timezone.make_naive(validated_data.get('end')), instance.event.timezone)
+        instance.start = start
+        instance.room = get_object_or_404(Room, pk=validated_data.get('room')["pk"])
+        diff = end - start
+        instance.duration = round(diff.days * 24 + (diff.seconds / 3600), 2)
+        instance.save()
+        return instance
+
+
+class EventsViewSet(EventSlugMixin, viewsets.ModelViewSet):
+    permission_classes = (permissions.DjangoModelPermissions,)
+    serializer_class = EventSerializer
+
+    def get_object(self):
+        return get_object_or_404(AKSlot, pk=self.kwargs["pk"])
+
+    def get_queryset(self):
+        return AKSlot.objects.filter(event=self.event)
diff --git a/AKScheduling/templates/admin/AKScheduling/scheduling.html b/AKScheduling/templates/admin/AKScheduling/scheduling.html
new file mode 100644
index 0000000000000000000000000000000000000000..1c45be592c1710297096fcc1127eb70ed31d9420
--- /dev/null
+++ b/AKScheduling/templates/admin/AKScheduling/scheduling.html
@@ -0,0 +1,189 @@
+{% extends "admin_base.html" %}
+{% load tags_AKModel %}
+
+{% load i18n %}
+{% load l10n %}
+{% load tz %}
+{% load static %}
+{% load tags_AKPlan %}
+
+{% block title %}{% trans "Scheduling for" %} {{event}}{% endblock %}
+
+{% block extrahead %}
+    {{ block.super }}
+    {% get_current_language as LANGUAGE_CODE %}
+
+    <script src='{% static 'AKPlan/vendor/fullcalendar-scheduler/main.js' %}'></script>
+    <link href='{% static 'AKPlan/vendor/fullcalendar-scheduler/main.css' %}' rel='stylesheet'/>
+
+    {% with 'AKPlan/vendor/fullcalendar-scheduler/locales/'|add:LANGUAGE_CODE|add:'.js' as locale_file %}
+        <script src="{% static locale_file %}"></script>
+    {% endwith %}
+
+    <style>
+    .unscheduled-slot {
+        cursor: move;
+
+    }
+    </style>
+
+    <script>
+        document.addEventListener('DOMContentLoaded', function () {
+            // CSRF Protection/Authentication
+            function getCookie(name) {
+                let cookieValue = null;
+                if (document.cookie && document.cookie !== '') {
+                    const cookies = document.cookie.split(';');
+                    for (let i = 0; i < cookies.length; i++) {
+                        const cookie = cookies[i].trim();
+                        // Does this cookie string begin with the name we want?
+                        if (cookie.substring(0, name.length + 1) === (name + '=')) {
+                            cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
+                            break;
+                        }
+                    }
+                }
+                return cookieValue;
+            }
+            const csrftoken = getCookie('csrftoken');
+
+            function csrfSafeMethod(method) {
+                // these HTTP methods do not require CSRF protection
+                return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
+            }
+            $.ajaxSetup({
+                beforeSend: function(xhr, settings) {
+                    if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
+                        xhr.setRequestHeader("X-CSRFToken", csrftoken);
+                    }
+                }
+            });
+
+
+            // Place slots by dropping placeholders on calendar
+            var containerEl = document.getElementById('unscheduled-slots');
+            new FullCalendar.Draggable(containerEl, {
+                itemSelector: '.unscheduled-slot',
+              });
+
+
+            // Calendar
+            var planEl = document.getElementById('planCalendar');
+
+            plan = new FullCalendar.Calendar(planEl, {
+                timeZone: '{{ event.timezone }}',
+                headerToolbar : {
+                    left: 'today prev,next',
+                    center: 'title',
+                    right: 'resourceTimelineDayVert,resourceTimelineDayHoriz,resourceTimelineEventVert,resourceTimelineEventHoriz'
+                },
+                //aspectRatio: 2,
+                themeSystem: 'bootstrap',
+                // Adapt to user selected locale
+                locale: '{{ LANGUAGE_CODE }}',
+                initialView: 'resourceTimelineEventVert',
+                views: {
+                    resourceTimelineDayHoriz: {
+                        type: 'resourceTimelineDay',
+                        buttonText: '{% trans "Day (Horizontal)" %}',
+                        slotDuration: '00:15',
+                        scrollTime: '08:00',
+                    },
+                    resourceTimelineDayVert: {
+                        type: 'resourceTimeGridDay',
+                        buttonText: '{% trans "Day (Vertical)" %}',
+                        slotDuration: '00:30',
+                        scrollTime: '08:00',
+                    },
+                    resourceTimelineEventHoriz: {
+                        type: 'resourceTimeline',
+                        visibleRange: {
+                            start: '{{ event.start | timezone:event.timezone | date:"Y-m-d H:i:s" }}',
+                            end: '{{ event.end | timezone:event.timezone  | date:"Y-m-d H:i:s"}}',
+                        },
+                        buttonText: '{% trans "Event (Horizontal)" %}',
+                        slotDuration: '00:15',
+                    },
+                    resourceTimelineEventVert: {
+                        type: 'resourceTimeGrid',
+                        visibleRange: {
+                            start: '{{ event.start | timezone:event.timezone | date:"Y-m-d H:i:s" }}',
+                            end: '{{ event.end | timezone:event.timezone  | date:"Y-m-d H:i:s"}}',
+                        },
+                        buttonText: '{% trans "Event (Vertical)" %}',
+                        slotDuration: '00:30',
+                    }
+                },
+                // Show full AK title as tooltip for each AK (needs to be removed and newly placed when AK is moved)
+                eventDidMount : function(info) {
+                    if(info.event.extendedProps.description !== undefined) {
+                        $(info.el).tooltip({title: info.event.extendedProps.description, trigger: 'hover'});
+                    }
+                },
+                eventWillUnmount : function(info) {
+                    $(info.el).tooltip('dispose');
+                },
+
+                // React to event changes (moving or change of duration)
+                eventChange: updateEvent,
+                eventReceive: updateEvent,
+                editable: true,
+                dropable: true,
+                drop: function(info) {
+                    info.draggedEl.parentNode.removeChild(info.draggedEl);
+                },
+                allDaySlot: false,
+                nowIndicator: true,
+                eventTextColor: '#fff',
+                eventColor: '#127ba3',
+                datesAboveResources: true,
+                resourceAreaHeaderContent: '{% trans "Room" %}',
+                resources: '{% url "model:scheduling-resources-list" event_slug=event.slug %}',
+                eventSources: [
+                        '{% url "model:scheduling-events" event_slug=event.slug %}',
+                        '{% url "model:scheduling-room-availabilities" event_slug=event.slug %}'
+                    ],
+                schedulerLicenseKey: 'GPL-My-Project-Is-Open-Source',
+                dayMinWidth: 100,
+            });
+
+            plan.setOption('contentHeight', $(window).height() - $('#header').height() * 11);
+            plan.render();
+
+            function updateEvent(changeInfo) {
+                room = changeInfo.event.getResources()[0];
+                $.ajax({
+                    url: '{% url "model:scheduling-event-list" event_slug=event.slug %}' + changeInfo.event.extendedProps.slotID + "/",
+                    type: 'PUT',
+                    data: {
+                        start: plan.formatIso(changeInfo.event.start),
+                        end: plan.formatIso(changeInfo.event.end),
+                        roomId: room.id,
+                    },
+                    success: function(response) {},
+                    error: function(response) {
+                        changeInfo.revert();
+                        alert("ERROR. Did not update "+changeInfo.event.title)
+                    }
+                });
+            }
+        });
+    </script>
+{% endblock extrahead %}
+
+{% block content %}
+
+    <div class="row" style="margin-bottom: 50px;">
+        <div class="col-md-10 col-lg-11">
+            <div id="planCalendar" ></div>
+        </div>
+        <div class="col-md-2 col-lg-1" id="unscheduled-slots">
+            {% for slot in slots_unscheduled %}
+                <div class="unscheduled-slot badge badge-primary" data-event='{ "title": "{{ slot.ak.short_name }}", "duration": {"hours": "{{ slot.duration|unlocalize }}"}, "description": "{{ slot.ak.name }}", "slotID": "{{ slot.pk }}"}'>{{ slot.ak.short_name }} ({{ slot.duration }} h)</div>
+            {% endfor %}
+        </div>
+    </div>
+
+
+    <a href="{% url 'admin:event_status' event.slug %}">{% trans "Event Status" %}</a>
+{% endblock %}
diff --git a/AKScheduling/views.py b/AKScheduling/views.py
index 88523e54dad18c2083450b71c868f8417c92b6e1..6bae0a318998c1ed7dcc173841e073a549299f92 100644
--- a/AKScheduling/views.py
+++ b/AKScheduling/views.py
@@ -1,7 +1,7 @@
-from django.urls import reverse_lazy
 from django.views.generic import ListView
 from django.utils.translation import gettext_lazy as _
 
+from AKModel.availability.models import Availability
 from AKModel.models import AKSlot
 from AKModel.views import AdminViewMixin, FilterByEventSlugMixin
 
@@ -18,3 +18,22 @@ class UnscheduledSlotsAdminView(AdminViewMixin, FilterByEventSlugMixin, ListView
 
     def get_queryset(self):
         return super().get_queryset().filter(start=None)
+
+
+class SchedulingAdminView(AdminViewMixin, FilterByEventSlugMixin, ListView):
+    template_name = "admin/AKScheduling/scheduling.html"
+    model = AKSlot
+    context_object_name = "slots_unscheduled"
+
+    def get_queryset(self):
+        return super().get_queryset().filter(start__isnull=True)
+
+    def get_context_data(self, *, object_list=None, **kwargs):
+        context = super().get_context_data(object_list=object_list, **kwargs)
+        context["title"] = f"{_('Scheduling')} for {context['event']}"
+
+        context["event"] = self.event
+        context["start"] = self.event.start
+        context["end"] = self.event.end
+
+        return context
diff --git a/templates/admin_base.html b/templates/admin_base.html
index cecf50f3694855670212591a35db6791be08c152..1022bb45582e4d5b8d201d7d0a60991ee6fb2887 100644
--- a/templates/admin_base.html
+++ b/templates/admin_base.html
@@ -5,7 +5,7 @@
 
 {% block extrahead %}
     {% bootstrap_css %}
-    {% bootstrap_javascript jquery='slim' %}
+    {% bootstrap_javascript jquery='full' %}
     {% fontawesome_5_static %}
 
     <style>