{"version":3,"file":"dav-settings-personal-availability.mjs","sources":["../build/frontend/apps/dav/src/utils/date.ts","../build/frontend/apps/dav/src/components/AbsenceForm.vue","../node_modules/icalzone/dist/zones.js","../node_modules/icalzone/dist/index.js","../node_modules/ical.js/dist/ical.js","../node_modules/@nextcloud/calendar-availability-vue/node_modules/uuid/dist-browser/stringify.js","../node_modules/@nextcloud/calendar-availability-vue/node_modules/uuid/dist-browser/rng.js","../node_modules/@nextcloud/calendar-availability-vue/node_modules/uuid/dist-browser/native.js","../node_modules/@nextcloud/calendar-availability-vue/node_modules/uuid/dist-browser/v4.js","../node_modules/@nextcloud/calendar-availability-vue/dist/index.mjs","../build/frontend/apps/dav/src/dav/client.ts","../build/frontend/apps/dav/src/service/CalendarService.ts","../build/frontend/apps/dav/src/service/PreferenceService.ts","../build/frontend/apps/dav/src/components/AvailabilityForm.vue","../build/frontend/apps/dav/src/views/UserAvailability.vue","../build/frontend/apps/dav/src/settings-personal-availability.ts"],"sourcesContent":["/**\n * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\n/**\n * Format a date as 'YYYY-MM-DD'.\n *\n * @param date - A date instance to format.\n */\nexport function formatDateAsYMD(date: Date): `${number}-${number}-${number}` {\n\tconst year = date.getFullYear()\n\tconst month = (date.getMonth() + 1).toString().padStart(2, '0') as `${number}`\n\tconst day = date.getDate().toString().padStart(2, '0') as `${number}`\n\treturn `${year}-${month}-${day}`\n}\n","<!--\n  - SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors\n  - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<template>\n\t<form :class=\"$style.absenceForm\" @submit.prevent=\"saveForm\">\n\t\t<div :class=\"$style.absenceForm__pickerContainer\">\n\t\t\t<NcDateTimePickerNative\n\t\t\t\tid=\"absence-first-day\"\n\t\t\t\tv-model=\"firstDay\"\n\t\t\t\t:class=\"$style.absenceForm__picker\"\n\t\t\t\t:label=\"t('dav', 'First day')\"\n\t\t\t\trequired />\n\t\t\t<NcDateTimePickerNative\n\t\t\t\tid=\"absence-last-day\"\n\t\t\t\tv-model=\"lastDay\"\n\t\t\t\t:class=\"$style.absenceForm__picker\"\n\t\t\t\t:label=\"t('dav', 'Last day (inclusive)')\"\n\t\t\t\trequired />\n\t\t</div>\n\t\t<label for=\"replacement-search-input\">{{ t('dav', 'Out of office replacement (optional)') }}</label>\n\t\t<NcSelectUsers\n\t\t\tv-model=\"replacementUser\"\n\t\t\tinputId=\"replacement-search-input\"\n\t\t\t:loading=\"searchLoading\"\n\t\t\t:placeholder=\"t('dav', 'Name of the replacement')\"\n\t\t\t:options=\"options\"\n\t\t\t@search=\"asyncFind\" />\n\t\t<NcTextField v-model=\"status\" :label=\"t('dav', 'Short absence status')\" :required=\"true\" />\n\t\t<div :class=\"$style.absenceForm__longMessageContainer\">\n\t\t\t<NcTextArea\n\t\t\t\tv-model=\"message\"\n\t\t\t\t:inputClass=\"$style.absenceForm__longMessage\"\n\t\t\t\t:label=\"t('dav', 'Long absence Message')\"\n\t\t\t\trequired\n\t\t\t\tresize=\"none\"\n\t\t\t\trows=\"6\" />\n\t\t</div>\n\n\t\t<div :class=\"$style.absenceForm__actions\">\n\t\t\t<NcButton\n\t\t\t\t:disabled=\"loading || !valid\"\n\t\t\t\tvariant=\"primary\"\n\t\t\t\ttype=\"submit\">\n\t\t\t\t{{ t('dav', 'Save') }}\n\t\t\t</NcButton>\n\t\t\t<NcButton\n\t\t\t\t:disabled=\"loading || !valid\"\n\t\t\t\tvariant=\"error\"\n\t\t\t\t@click=\"clearAbsence\">\n\t\t\t\t{{ t('dav', 'Disable absence') }}\n\t\t\t</NcButton>\n\t\t</div>\n\t</form>\n</template>\n\n<script>\nimport { getCurrentUser } from '@nextcloud/auth'\nimport axios from '@nextcloud/axios'\nimport { showError, showSuccess } from '@nextcloud/dialogs'\nimport { loadState } from '@nextcloud/initial-state'\nimport { t } from '@nextcloud/l10n'\nimport { generateOcsUrl } from '@nextcloud/router'\nimport { ShareType } from '@nextcloud/sharing'\nimport debounce from 'debounce'\nimport NcButton from '@nextcloud/vue/components/NcButton'\nimport NcDateTimePickerNative from '@nextcloud/vue/components/NcDateTimePickerNative'\nimport NcSelectUsers from '@nextcloud/vue/components/NcSelectUsers'\nimport NcTextArea from '@nextcloud/vue/components/NcTextArea'\nimport NcTextField from '@nextcloud/vue/components/NcTextField'\nimport { logger } from '../service/logger.ts'\nimport { formatDateAsYMD } from '../utils/date.ts'\n\nexport default {\n\tname: 'AbsenceForm',\n\tcomponents: {\n\t\tNcButton,\n\t\tNcTextField,\n\t\tNcTextArea,\n\t\tNcDateTimePickerNative,\n\t\tNcSelectUsers,\n\t},\n\n\tsetup() {\n\t\treturn { t }\n\t},\n\n\tdata() {\n\t\tconst { firstDay, lastDay, status, message, replacementUserId, replacementUserDisplayName } = loadState('dav', 'absence', {})\n\t\treturn {\n\t\t\tloading: false,\n\t\t\tstatus: status ?? '',\n\t\t\tmessage: message ?? '',\n\t\t\tfirstDay: firstDay ? new Date(firstDay) : new Date(),\n\t\t\tlastDay: lastDay ? new Date(lastDay) : null,\n\t\t\treplacementUserId,\n\t\t\treplacementUser: replacementUserId ? { user: replacementUserId, displayName: replacementUserDisplayName } : null,\n\t\t\tsearchLoading: false,\n\t\t\toptions: [],\n\t\t}\n\t},\n\n\tcomputed: {\n\t\t/**\n\t\t * @return {boolean}\n\t\t */\n\t\tvalid() {\n\t\t\t// Translate the two date objects to midnight for an accurate comparison\n\t\t\tconst firstDay = new Date(this.firstDay?.getTime())\n\t\t\tconst lastDay = new Date(this.lastDay?.getTime())\n\t\t\tfirstDay?.setHours(0, 0, 0, 0)\n\t\t\tlastDay?.setHours(0, 0, 0, 0)\n\n\t\t\treturn !!this.firstDay\n\t\t\t\t&& !!this.lastDay\n\t\t\t\t&& !!this.status\n\t\t\t\t&& !!this.message\n\t\t\t\t&& lastDay >= firstDay\n\t\t},\n\t},\n\n\tmethods: {\n\t\tresetForm() {\n\t\t\tthis.status = ''\n\t\t\tthis.message = ''\n\t\t\tthis.firstDay = new Date()\n\t\t\tthis.lastDay = null\n\t\t},\n\n\t\t/**\n\t\t * Format shares for the multiselect options\n\t\t *\n\t\t * @param {object} result select entry item\n\t\t * @return {object}\n\t\t */\n\t\tformatForMultiselect(result) {\n\t\t\treturn {\n\t\t\t\tuser: result.uuid || result.value.shareWith,\n\t\t\t\tdisplayName: result.name || result.label,\n\t\t\t\tsubtitle: result.dsc | '',\n\t\t\t}\n\t\t},\n\n\t\tasync asyncFind(query) {\n\t\t\tthis.searchLoading = true\n\t\t\tawait this.debounceGetSuggestions(query.trim())\n\t\t},\n\n\t\t/**\n\t\t * Get suggestions\n\t\t *\n\t\t * @param {string} search the search query\n\t\t */\n\t\tasync getSuggestions(search) {\n\t\t\tconst shareType = [\n\t\t\t\tShareType.User,\n\t\t\t]\n\n\t\t\tlet request\n\t\t\ttry {\n\t\t\t\trequest = await axios.get(generateOcsUrl('apps/files_sharing/api/v1/sharees'), {\n\t\t\t\t\tparams: {\n\t\t\t\t\t\tformat: 'json',\n\t\t\t\t\t\titemType: 'file',\n\t\t\t\t\t\tsearch,\n\t\t\t\t\t\tshareType,\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t} catch (error) {\n\t\t\t\tlogger.error('Error fetching suggestions', { error })\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tconst data = request.data.ocs.data\n\t\t\tconst exact = request.data.ocs.data.exact\n\t\t\tdata.exact = [] // removing exact from general results\n\t\t\tconst rawExactSuggestions = exact.users\n\t\t\tconst rawSuggestions = data.users\n\t\t\tlogger.info('AbsenceForm raw suggestions', { rawExactSuggestions, rawSuggestions })\n\t\t\t// remove invalid data and format to user-select layout\n\t\t\tconst exactSuggestions = rawExactSuggestions\n\t\t\t\t.map((share) => this.formatForMultiselect(share))\n\t\t\tconst suggestions = rawSuggestions\n\t\t\t\t.map((share) => this.formatForMultiselect(share))\n\n\t\t\tconst allSuggestions = exactSuggestions.concat(suggestions)\n\n\t\t\t// Count occurrences of display names in order to provide a distinguishable description if needed\n\t\t\tconst nameCounts = allSuggestions.reduce((nameCounts, result) => {\n\t\t\t\tif (!result.displayName) {\n\t\t\t\t\treturn nameCounts\n\t\t\t\t}\n\t\t\t\tif (!nameCounts[result.displayName]) {\n\t\t\t\t\tnameCounts[result.displayName] = 0\n\t\t\t\t}\n\t\t\t\tnameCounts[result.displayName]++\n\t\t\t\treturn nameCounts\n\t\t\t}, {})\n\n\t\t\tthis.options = allSuggestions.map((item) => {\n\t\t\t\t// Make sure that items with duplicate displayName get the shareWith applied as a description\n\t\t\t\tif (nameCounts[item.displayName] > 1 && !item.desc) {\n\t\t\t\t\treturn { ...item, desc: item.shareWithDisplayNameUnique }\n\t\t\t\t}\n\t\t\t\treturn item\n\t\t\t})\n\n\t\t\tthis.searchLoading = false\n\t\t\tlogger.info('AbsenseForm suggestions', { options: this.options })\n\t\t},\n\n\t\t/**\n\t\t * Debounce getSuggestions\n\t\t *\n\t\t * @param {[string]} args - The arguments\n\t\t */\n\t\tdebounceGetSuggestions: debounce(function(...args) {\n\t\t\tthis.getSuggestions(...args)\n\t\t}, 300),\n\n\t\tasync saveForm() {\n\t\t\tif (!this.valid) {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tthis.loading = true\n\t\t\ttry {\n\t\t\t\tawait axios.post(generateOcsUrl('/apps/dav/api/v1/outOfOffice/{userId}', { userId: getCurrentUser().uid }), {\n\t\t\t\t\tfirstDay: formatDateAsYMD(this.firstDay),\n\t\t\t\t\tlastDay: formatDateAsYMD(this.lastDay),\n\t\t\t\t\tstatus: this.status,\n\t\t\t\t\tmessage: this.message,\n\t\t\t\t\treplacementUserId: this.replacementUser?.user ?? null,\n\t\t\t\t})\n\t\t\t\tshowSuccess(t('dav', 'Absence saved'))\n\t\t\t} catch (error) {\n\t\t\t\tshowError(t('dav', 'Failed to save your absence settings'))\n\t\t\t\tlogger.error('Could not save absence', { error })\n\t\t\t} finally {\n\t\t\t\tthis.loading = false\n\t\t\t}\n\t\t},\n\n\t\tasync clearAbsence() {\n\t\t\tthis.loading = true\n\t\t\ttry {\n\t\t\t\tawait axios.delete(generateOcsUrl('/apps/dav/api/v1/outOfOffice/{userId}', { userId: getCurrentUser().uid }))\n\t\t\t\tthis.resetForm()\n\t\t\t\tshowSuccess(t('dav', 'Absence cleared'))\n\t\t\t} catch (error) {\n\t\t\t\tshowError(t('dav', 'Failed to clear your absence settings'))\n\t\t\t\tlogger.error('Could not clear absence', { error })\n\t\t\t} finally {\n\t\t\t\tthis.loading = false\n\t\t\t}\n\t\t},\n\t},\n}\n</script>\n\n<style module>\n.absenceForm {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 5px;\n}\n\n.absenceForm__pickerContainer {\n\tdisplay: flex;\n\tgap: 10px;\n\twidth: 100%;\n}\n\n.absenceForm__picker {\n\tflex: 1 auto;\n\n\t:global(.native-datetime-picker--input) {\n\t\tmargin-bottom: 0;\n\t}\n}\n\n.absenceForm__longMessage {\n\theight: calc(var(--default-line-height) * 6 * var(--font-size-small));\n}\n\n.absenceForm__longMessageContainer {\n\theight: calc(var(--default-line-height) * 6 * var(--font-size-small) + var(--default-grid-baseline) * 2);\n\tdisplay: flex;\n\tflex-direction: column;\n\tjustify-content: start;\n}\n\n.absenceForm__actions {\n\tdisplay: flex;\n\tgap: 5px;\n}\n</style>\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.zonesMap = exports.defaultStart = void 0;\nexports.defaultStart = \"19700101T000000\";\nexports.zonesMap = new Map([\n    [\n        \"Africa/Abidjan\",\n        {\n            \"s\": {\n                \"f\": \"+0000\",\n                \"n\": \"GMT\"\n            }\n        }\n    ],\n    [\n        \"Africa/Accra\",\n        {\n            \"s\": {\n                \"f\": \"+0000\",\n                \"n\": \"GMT\"\n            }\n        }\n    ],\n    [\n        \"Africa/Addis_Ababa\",\n        {\n            \"s\": {\n                \"f\": \"+0300\",\n                \"n\": \"EAT\"\n            }\n        }\n    ],\n    [\n        \"Africa/Algiers\",\n        {\n            \"s\": {\n                \"f\": \"+0100\",\n                \"n\": \"CET\"\n            }\n        }\n    ],\n    [\n        \"Africa/Asmara\",\n        {\n            \"s\": {\n                \"f\": \"+0300\",\n                \"n\": \"EAT\"\n            }\n        }\n    ],\n    [\n        \"Africa/Bamako\",\n        {\n            \"s\": {\n                \"f\": \"+0000\",\n                \"n\": \"GMT\"\n            }\n        }\n    ],\n    [\n        \"Africa/Bangui\",\n        {\n            \"s\": {\n                \"f\": \"+0100\",\n                \"n\": \"WAT\"\n            }\n        }\n    ],\n    [\n        \"Africa/Banjul\",\n        {\n            \"s\": {\n                \"f\": \"+0000\",\n                \"n\": \"GMT\"\n            }\n        }\n    ],\n    [\n        \"Africa/Bissau\",\n        {\n            \"s\": {\n                \"f\": \"+0000\",\n                \"n\": \"GMT\"\n            }\n        }\n    ],\n    [\n        \"Africa/Blantyre\",\n        {\n            \"s\": {\n                \"f\": \"+0200\",\n                \"n\": \"CAT\"\n            }\n        }\n    ],\n    [\n        \"Africa/Brazzaville\",\n        {\n            \"s\": {\n                \"f\": \"+0100\",\n                \"n\": \"WAT\"\n            }\n        }\n    ],\n    [\n        \"Africa/Bujumbura\",\n        {\n            \"s\": {\n                \"f\": \"+0200\",\n                \"n\": \"CAT\"\n            }\n        }\n    ],\n    [\n        \"Africa/Cairo\",\n        {\n            \"s\": {\n                \"f\": \"+0200\",\n                \"n\": \"EET\"\n            }\n        }\n    ],\n    [\n        \"Africa/Casablanca\",\n        {\n            \"s\": {\n                \"f\": \"+0100\",\n                \"n\": \"+01\"\n            }\n        }\n    ],\n    [\n        \"Africa/Ceuta\",\n        {\n            \"s\": {\n                \"f\": \"+0200\",\n                \"t\": \"+0100\",\n                \"n\": \"CET\",\n                \"s\": \"19701025T030000\",\n                \"r\": {\n                    \"m\": 10,\n                    \"d\": \"-1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"+0100\",\n                \"t\": \"+0200\",\n                \"n\": \"CEST\",\n                \"s\": \"19700329T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"-1SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"Africa/Conakry\",\n        {\n            \"s\": {\n                \"f\": \"+0000\",\n                \"n\": \"GMT\"\n            }\n        }\n    ],\n    [\n        \"Africa/Dakar\",\n        {\n            \"s\": {\n                \"f\": \"+0000\",\n                \"n\": \"GMT\"\n            }\n        }\n    ],\n    [\n        \"Africa/Dar_es_Salaam\",\n        {\n            \"s\": {\n                \"f\": \"+0300\",\n                \"n\": \"EAT\"\n            }\n        }\n    ],\n    [\n        \"Africa/Djibouti\",\n        {\n            \"s\": {\n                \"f\": \"+0300\",\n                \"n\": \"EAT\"\n            }\n        }\n    ],\n    [\n        \"Africa/Douala\",\n        {\n            \"s\": {\n                \"f\": \"+0100\",\n                \"n\": \"WAT\"\n            }\n        }\n    ],\n    [\n        \"Africa/El_Aaiun\",\n        {\n            \"s\": {\n                \"f\": \"+0100\",\n                \"n\": \"+01\"\n            }\n        }\n    ],\n    [\n        \"Africa/Freetown\",\n        {\n            \"s\": {\n                \"f\": \"+0000\",\n                \"n\": \"GMT\"\n            }\n        }\n    ],\n    [\n        \"Africa/Gaborone\",\n        {\n            \"s\": {\n                \"f\": \"+0200\",\n                \"n\": \"CAT\"\n            }\n        }\n    ],\n    [\n        \"Africa/Harare\",\n        {\n            \"s\": {\n                \"f\": \"+0200\",\n                \"n\": \"CAT\"\n            }\n        }\n    ],\n    [\n        \"Africa/Johannesburg\",\n        {\n            \"s\": {\n                \"f\": \"+0200\",\n                \"n\": \"SAST\"\n            }\n        }\n    ],\n    [\n        \"Africa/Juba\",\n        {\n            \"s\": {\n                \"f\": \"+0300\",\n                \"n\": \"EAT\"\n            }\n        }\n    ],\n    [\n        \"Africa/Kampala\",\n        {\n            \"s\": {\n                \"f\": \"+0300\",\n                \"n\": \"EAT\"\n            }\n        }\n    ],\n    [\n        \"Africa/Khartoum\",\n        {\n            \"s\": {\n                \"f\": \"+0200\",\n                \"n\": \"CAT\"\n            }\n        }\n    ],\n    [\n        \"Africa/Kigali\",\n        {\n            \"s\": {\n                \"f\": \"+0200\",\n                \"n\": \"CAT\"\n            }\n        }\n    ],\n    [\n        \"Africa/Kinshasa\",\n        {\n            \"s\": {\n                \"f\": \"+0100\",\n                \"n\": \"WAT\"\n            }\n        }\n    ],\n    [\n        \"Africa/Lagos\",\n        {\n            \"s\": {\n                \"f\": \"+0100\",\n                \"n\": \"WAT\"\n            }\n        }\n    ],\n    [\n        \"Africa/Libreville\",\n        {\n            \"s\": {\n                \"f\": \"+0100\",\n                \"n\": \"WAT\"\n            }\n        }\n    ],\n    [\n        \"Africa/Lome\",\n        {\n            \"s\": {\n                \"f\": \"+0000\",\n                \"n\": \"GMT\"\n            }\n        }\n    ],\n    [\n        \"Africa/Luanda\",\n        {\n            \"s\": {\n                \"f\": \"+0100\",\n                \"n\": \"WAT\"\n            }\n        }\n    ],\n    [\n        \"Africa/Lubumbashi\",\n        {\n            \"s\": {\n                \"f\": \"+0200\",\n                \"n\": \"CAT\"\n            }\n        }\n    ],\n    [\n        \"Africa/Lusaka\",\n        {\n            \"s\": {\n                \"f\": \"+0200\",\n                \"n\": \"CAT\"\n            }\n        }\n    ],\n    [\n        \"Africa/Malabo\",\n        {\n            \"s\": {\n                \"f\": \"+0100\",\n                \"n\": \"WAT\"\n            }\n        }\n    ],\n    [\n        \"Africa/Maputo\",\n        {\n            \"s\": {\n                \"f\": \"+0200\",\n                \"n\": \"CAT\"\n            }\n        }\n    ],\n    [\n        \"Africa/Maseru\",\n        {\n            \"s\": {\n                \"f\": \"+0200\",\n                \"n\": \"SAST\"\n            }\n        }\n    ],\n    [\n        \"Africa/Mbabane\",\n        {\n            \"s\": {\n                \"f\": \"+0200\",\n                \"n\": \"SAST\"\n            }\n        }\n    ],\n    [\n        \"Africa/Mogadishu\",\n        {\n            \"s\": {\n                \"f\": \"+0300\",\n                \"n\": \"EAT\"\n            }\n        }\n    ],\n    [\n        \"Africa/Monrovia\",\n        {\n            \"s\": {\n                \"f\": \"+0000\",\n                \"n\": \"GMT\"\n            }\n        }\n    ],\n    [\n        \"Africa/Nairobi\",\n        {\n            \"s\": {\n                \"f\": \"+0300\",\n                \"n\": \"EAT\"\n            }\n        }\n    ],\n    [\n        \"Africa/Ndjamena\",\n        {\n            \"s\": {\n                \"f\": \"+0100\",\n                \"n\": \"WAT\"\n            }\n        }\n    ],\n    [\n        \"Africa/Niamey\",\n        {\n            \"s\": {\n                \"f\": \"+0100\",\n                \"n\": \"WAT\"\n            }\n        }\n    ],\n    [\n        \"Africa/Nouakchott\",\n        {\n            \"s\": {\n                \"f\": \"+0000\",\n                \"n\": \"GMT\"\n            }\n        }\n    ],\n    [\n        \"Africa/Ouagadougou\",\n        {\n            \"s\": {\n                \"f\": \"+0000\",\n                \"n\": \"GMT\"\n            }\n        }\n    ],\n    [\n        \"Africa/Porto-Novo\",\n        {\n            \"s\": {\n                \"f\": \"+0100\",\n                \"n\": \"WAT\"\n            }\n        }\n    ],\n    [\n        \"Africa/Sao_Tome\",\n        {\n            \"s\": {\n                \"f\": \"+0100\",\n                \"n\": \"WAT\"\n            }\n        }\n    ],\n    [\n        \"Africa/Tripoli\",\n        {\n            \"s\": {\n                \"f\": \"+0200\",\n                \"n\": \"EET\"\n            }\n        }\n    ],\n    [\n        \"Africa/Tunis\",\n        {\n            \"s\": {\n                \"f\": \"+0100\",\n                \"n\": \"CET\"\n            }\n        }\n    ],\n    [\n        \"Africa/Windhoek\",\n        {\n            \"s\": {\n                \"f\": \"+0200\",\n                \"n\": \"CAT\"\n            }\n        }\n    ],\n    [\n        \"America/Adak\",\n        {\n            \"s\": {\n                \"f\": \"-0900\",\n                \"t\": \"-1000\",\n                \"n\": \"HST\",\n                \"s\": \"19701101T020000\",\n                \"r\": {\n                    \"m\": 11,\n                    \"d\": \"1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"-1000\",\n                \"t\": \"-0900\",\n                \"n\": \"HDT\",\n                \"s\": \"19700308T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"2SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"America/Anchorage\",\n        {\n            \"s\": {\n                \"f\": \"-0800\",\n                \"t\": \"-0900\",\n                \"n\": \"AKST\",\n                \"s\": \"19701101T020000\",\n                \"r\": {\n                    \"m\": 11,\n                    \"d\": \"1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"-0900\",\n                \"t\": \"-0800\",\n                \"n\": \"AKDT\",\n                \"s\": \"19700308T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"2SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"America/Anguilla\",\n        {\n            \"s\": {\n                \"f\": \"-0400\",\n                \"n\": \"AST\"\n            }\n        }\n    ],\n    [\n        \"America/Antigua\",\n        {\n            \"s\": {\n                \"f\": \"-0400\",\n                \"n\": \"AST\"\n            }\n        }\n    ],\n    [\n        \"America/Araguaina\",\n        {\n            \"s\": {\n                \"f\": \"-0300\",\n                \"n\": \"-03\"\n            }\n        }\n    ],\n    [\n        \"America/Argentina/Buenos_Aires\",\n        {\n            \"s\": {\n                \"f\": \"-0300\",\n                \"n\": \"-03\"\n            }\n        }\n    ],\n    [\n        \"America/Argentina/Catamarca\",\n        {\n            \"s\": {\n                \"f\": \"-0300\",\n                \"n\": \"-03\"\n            }\n        }\n    ],\n    [\n        \"America/Argentina/Cordoba\",\n        {\n            \"s\": {\n                \"f\": \"-0300\",\n                \"n\": \"-03\"\n            }\n        }\n    ],\n    [\n        \"America/Argentina/Jujuy\",\n        {\n            \"s\": {\n                \"f\": \"-0300\",\n                \"n\": \"-03\"\n            }\n        }\n    ],\n    [\n        \"America/Argentina/La_Rioja\",\n        {\n            \"s\": {\n                \"f\": \"-0300\",\n                \"n\": \"-03\"\n            }\n        }\n    ],\n    [\n        \"America/Argentina/Mendoza\",\n        {\n            \"s\": {\n                \"f\": \"-0300\",\n                \"n\": \"-03\"\n            }\n        }\n    ],\n    [\n        \"America/Argentina/Rio_Gallegos\",\n        {\n            \"s\": {\n                \"f\": \"-0300\",\n                \"n\": \"-03\"\n            }\n        }\n    ],\n    [\n        \"America/Argentina/Salta\",\n        {\n            \"s\": {\n                \"f\": \"-0300\",\n                \"n\": \"-03\"\n            }\n        }\n    ],\n    [\n        \"America/Argentina/San_Juan\",\n        {\n            \"s\": {\n                \"f\": \"-0300\",\n                \"n\": \"-03\"\n            }\n        }\n    ],\n    [\n        \"America/Argentina/San_Luis\",\n        {\n            \"s\": {\n                \"f\": \"-0300\",\n                \"n\": \"-03\"\n            }\n        }\n    ],\n    [\n        \"America/Argentina/Tucuman\",\n        {\n            \"s\": {\n                \"f\": \"-0300\",\n                \"n\": \"-03\"\n            }\n        }\n    ],\n    [\n        \"America/Argentina/Ushuaia\",\n        {\n            \"s\": {\n                \"f\": \"-0300\",\n                \"n\": \"-03\"\n            }\n        }\n    ],\n    [\n        \"America/Aruba\",\n        {\n            \"s\": {\n                \"f\": \"-0400\",\n                \"n\": \"AST\"\n            }\n        }\n    ],\n    [\n        \"America/Asuncion\",\n        {\n            \"s\": {\n                \"f\": \"-0300\",\n                \"t\": \"-0400\",\n                \"n\": \"-04\",\n                \"s\": \"19700322T000000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"4SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"-0400\",\n                \"t\": \"-0300\",\n                \"n\": \"-03\",\n                \"s\": \"19701004T000000\",\n                \"r\": {\n                    \"m\": 10,\n                    \"d\": \"1SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"America/Atikokan\",\n        {\n            \"s\": {\n                \"f\": \"-0500\",\n                \"n\": \"EST\"\n            }\n        }\n    ],\n    [\n        \"America/Bahia_Banderas\",\n        {\n            \"s\": {\n                \"f\": \"-0500\",\n                \"t\": \"-0600\",\n                \"n\": \"CST\",\n                \"s\": \"19701025T020000\",\n                \"r\": {\n                    \"m\": 10,\n                    \"d\": \"-1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"-0600\",\n                \"t\": \"-0500\",\n                \"n\": \"CDT\",\n                \"s\": \"19700405T020000\",\n                \"r\": {\n                    \"m\": 4,\n                    \"d\": \"1SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"America/Bahia\",\n        {\n            \"s\": {\n                \"f\": \"-0300\",\n                \"n\": \"-03\"\n            }\n        }\n    ],\n    [\n        \"America/Barbados\",\n        {\n            \"s\": {\n                \"f\": \"-0400\",\n                \"n\": \"AST\"\n            }\n        }\n    ],\n    [\n        \"America/Belem\",\n        {\n            \"s\": {\n                \"f\": \"-0300\",\n                \"n\": \"-03\"\n            }\n        }\n    ],\n    [\n        \"America/Belize\",\n        {\n            \"s\": {\n                \"f\": \"-0600\",\n                \"n\": \"CST\"\n            }\n        }\n    ],\n    [\n        \"America/Blanc-Sablon\",\n        {\n            \"s\": {\n                \"f\": \"-0400\",\n                \"n\": \"AST\"\n            }\n        }\n    ],\n    [\n        \"America/Boa_Vista\",\n        {\n            \"s\": {\n                \"f\": \"-0400\",\n                \"n\": \"-04\"\n            }\n        }\n    ],\n    [\n        \"America/Bogota\",\n        {\n            \"s\": {\n                \"f\": \"-0500\",\n                \"n\": \"-05\"\n            }\n        }\n    ],\n    [\n        \"America/Boise\",\n        {\n            \"s\": {\n                \"f\": \"-0600\",\n                \"t\": \"-0700\",\n                \"n\": \"MST\",\n                \"s\": \"19701101T020000\",\n                \"r\": {\n                    \"m\": 11,\n                    \"d\": \"1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"-0700\",\n                \"t\": \"-0600\",\n                \"n\": \"MDT\",\n                \"s\": \"19700308T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"2SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"America/Cambridge_Bay\",\n        {\n            \"s\": {\n                \"f\": \"-0600\",\n                \"t\": \"-0700\",\n                \"n\": \"MST\",\n                \"s\": \"19701101T020000\",\n                \"r\": {\n                    \"m\": 11,\n                    \"d\": \"1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"-0700\",\n                \"t\": \"-0600\",\n                \"n\": \"MDT\",\n                \"s\": \"19700308T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"2SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"America/Campo_Grande\",\n        {\n            \"s\": {\n                \"f\": \"-0400\",\n                \"n\": \"-04\",\n                \"s\": \"19700215T000000\",\n                \"r\": {\n                    \"m\": 2,\n                    \"d\": \"3SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"-0400\",\n                \"t\": \"-0300\",\n                \"n\": \"-03\",\n                \"s\": \"19701101T000000\",\n                \"r\": {\n                    \"m\": 11,\n                    \"d\": \"1SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"America/Cancun\",\n        {\n            \"s\": {\n                \"f\": \"-0500\",\n                \"n\": \"EST\"\n            }\n        }\n    ],\n    [\n        \"America/Caracas\",\n        {\n            \"s\": {\n                \"f\": \"-0400\",\n                \"n\": \"-04\"\n            }\n        }\n    ],\n    [\n        \"America/Cayenne\",\n        {\n            \"s\": {\n                \"f\": \"-0300\",\n                \"n\": \"-03\"\n            }\n        }\n    ],\n    [\n        \"America/Cayman\",\n        {\n            \"s\": {\n                \"f\": \"-0500\",\n                \"n\": \"EST\"\n            }\n        }\n    ],\n    [\n        \"America/Chicago\",\n        {\n            \"s\": {\n                \"f\": \"-0500\",\n                \"t\": \"-0600\",\n                \"n\": \"CST\",\n                \"s\": \"19701101T020000\",\n                \"r\": {\n                    \"m\": 11,\n                    \"d\": \"1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"-0600\",\n                \"t\": \"-0500\",\n                \"n\": \"CDT\",\n                \"s\": \"19700308T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"2SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"America/Chihuahua\",\n        {\n            \"s\": {\n                \"f\": \"-0600\",\n                \"t\": \"-0700\",\n                \"n\": \"MST\",\n                \"s\": \"19701025T020000\",\n                \"r\": {\n                    \"m\": 10,\n                    \"d\": \"-1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"-0700\",\n                \"t\": \"-0600\",\n                \"n\": \"MDT\",\n                \"s\": \"19700405T020000\",\n                \"r\": {\n                    \"m\": 4,\n                    \"d\": \"1SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"America/Costa_Rica\",\n        {\n            \"s\": {\n                \"f\": \"-0600\",\n                \"n\": \"CST\"\n            }\n        }\n    ],\n    [\n        \"America/Creston\",\n        {\n            \"s\": {\n                \"f\": \"-0700\",\n                \"n\": \"MST\"\n            }\n        }\n    ],\n    [\n        \"America/Cuiaba\",\n        {\n            \"s\": {\n                \"f\": \"-0400\",\n                \"n\": \"-04\",\n                \"s\": \"19700215T000000\",\n                \"r\": {\n                    \"m\": 2,\n                    \"d\": \"3SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"-0400\",\n                \"t\": \"-0300\",\n                \"n\": \"-03\",\n                \"s\": \"19701101T000000\",\n                \"r\": {\n                    \"m\": 11,\n                    \"d\": \"1SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"America/Curacao\",\n        {\n            \"s\": {\n                \"f\": \"-0400\",\n                \"n\": \"AST\"\n            }\n        }\n    ],\n    [\n        \"America/Danmarkshavn\",\n        {\n            \"s\": {\n                \"f\": \"+0000\",\n                \"n\": \"GMT\"\n            }\n        }\n    ],\n    [\n        \"America/Dawson_Creek\",\n        {\n            \"s\": {\n                \"f\": \"-0700\",\n                \"n\": \"MST\"\n            }\n        }\n    ],\n    [\n        \"America/Dawson\",\n        {\n            \"s\": {\n                \"f\": \"-0700\",\n                \"t\": \"-0800\",\n                \"n\": \"PST\",\n                \"s\": \"19701101T020000\",\n                \"r\": {\n                    \"m\": 11,\n                    \"d\": \"1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"-0800\",\n                \"t\": \"-0700\",\n                \"n\": \"PDT\",\n                \"s\": \"19700308T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"2SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"America/Denver\",\n        {\n            \"s\": {\n                \"f\": \"-0600\",\n                \"t\": \"-0700\",\n                \"n\": \"MST\",\n                \"s\": \"19701101T020000\",\n                \"r\": {\n                    \"m\": 11,\n                    \"d\": \"1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"-0700\",\n                \"t\": \"-0600\",\n                \"n\": \"MDT\",\n                \"s\": \"19700308T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"2SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"America/Detroit\",\n        {\n            \"s\": {\n                \"f\": \"-0400\",\n                \"t\": \"-0500\",\n                \"n\": \"EST\",\n                \"s\": \"19701101T020000\",\n                \"r\": {\n                    \"m\": 11,\n                    \"d\": \"1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"-0500\",\n                \"t\": \"-0400\",\n                \"n\": \"EDT\",\n                \"s\": \"19700308T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"2SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"America/Dominica\",\n        {\n            \"s\": {\n                \"f\": \"-0400\",\n                \"n\": \"AST\"\n            }\n        }\n    ],\n    [\n        \"America/Edmonton\",\n        {\n            \"s\": {\n                \"f\": \"-0600\",\n                \"t\": \"-0700\",\n                \"n\": \"MST\",\n                \"s\": \"19701101T020000\",\n                \"r\": {\n                    \"m\": 11,\n                    \"d\": \"1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"-0700\",\n                \"t\": \"-0600\",\n                \"n\": \"MDT\",\n                \"s\": \"19700308T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"2SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"America/Eirunepe\",\n        {\n            \"s\": {\n                \"f\": \"-0500\",\n                \"n\": \"-05\"\n            }\n        }\n    ],\n    [\n        \"America/El_Salvador\",\n        {\n            \"s\": {\n                \"f\": \"-0600\",\n                \"n\": \"CST\"\n            }\n        }\n    ],\n    [\n        \"America/Fort_Nelson\",\n        {\n            \"s\": {\n                \"f\": \"-0700\",\n                \"n\": \"MST\"\n            }\n        }\n    ],\n    [\n        \"America/Fortaleza\",\n        {\n            \"s\": {\n                \"f\": \"-0300\",\n                \"n\": \"-03\"\n            }\n        }\n    ],\n    [\n        \"America/Glace_Bay\",\n        {\n            \"s\": {\n                \"f\": \"-0300\",\n                \"t\": \"-0400\",\n                \"n\": \"AST\",\n                \"s\": \"19701101T020000\",\n                \"r\": {\n                    \"m\": 11,\n                    \"d\": \"1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"-0400\",\n                \"t\": \"-0300\",\n                \"n\": \"ADT\",\n                \"s\": \"19700308T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"2SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"America/Godthab\",\n        {\n            \"s\": {\n                \"f\": \"-0200\",\n                \"t\": \"-0300\",\n                \"n\": \"-03\",\n                \"s\": \"19701024T230000\",\n                \"r\": {\n                    \"m\": 10,\n                    \"d\": \"-1SA\"\n                }\n            },\n            \"d\": {\n                \"f\": \"-0300\",\n                \"t\": \"-0200\",\n                \"n\": \"-02\",\n                \"s\": \"19700328T220000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"-1SA\"\n                }\n            }\n        }\n    ],\n    [\n        \"America/Goose_Bay\",\n        {\n            \"s\": {\n                \"f\": \"-0300\",\n                \"t\": \"-0400\",\n                \"n\": \"AST\",\n                \"s\": \"19701101T020000\",\n                \"r\": {\n                    \"m\": 11,\n                    \"d\": \"1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"-0400\",\n                \"t\": \"-0300\",\n                \"n\": \"ADT\",\n                \"s\": \"19700308T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"2SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"America/Grand_Turk\",\n        {\n            \"s\": {\n                \"f\": \"-0400\",\n                \"t\": \"-0500\",\n                \"n\": \"EST\",\n                \"s\": \"19701101T020000\",\n                \"r\": {\n                    \"m\": 11,\n                    \"d\": \"1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"-0500\",\n                \"t\": \"-0400\",\n                \"n\": \"EDT\",\n                \"s\": \"19700308T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"2SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"America/Grenada\",\n        {\n            \"s\": {\n                \"f\": \"-0400\",\n                \"n\": \"AST\"\n            }\n        }\n    ],\n    [\n        \"America/Guadeloupe\",\n        {\n            \"s\": {\n                \"f\": \"-0400\",\n                \"n\": \"AST\"\n            }\n        }\n    ],\n    [\n        \"America/Guatemala\",\n        {\n            \"s\": {\n                \"f\": \"-0600\",\n                \"n\": \"CST\"\n            }\n        }\n    ],\n    [\n        \"America/Guayaquil\",\n        {\n            \"s\": {\n                \"f\": \"-0500\",\n                \"n\": \"-05\"\n            }\n        }\n    ],\n    [\n        \"America/Guyana\",\n        {\n            \"s\": {\n                \"f\": \"-0400\",\n                \"n\": \"-04\"\n            }\n        }\n    ],\n    [\n        \"America/Halifax\",\n        {\n            \"s\": {\n                \"f\": \"-0300\",\n                \"t\": \"-0400\",\n                \"n\": \"AST\",\n                \"s\": \"19701101T020000\",\n                \"r\": {\n                    \"m\": 11,\n                    \"d\": \"1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"-0400\",\n                \"t\": \"-0300\",\n                \"n\": \"ADT\",\n                \"s\": \"19700308T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"2SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"America/Havana\",\n        {\n            \"s\": {\n                \"f\": \"-0400\",\n                \"t\": \"-0500\",\n                \"n\": \"CST\",\n                \"s\": \"19701101T010000\",\n                \"r\": {\n                    \"m\": 11,\n                    \"d\": \"1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"-0500\",\n                \"t\": \"-0400\",\n                \"n\": \"CDT\",\n                \"s\": \"19700308T000000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"2SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"America/Hermosillo\",\n        {\n            \"s\": {\n                \"f\": \"-0700\",\n                \"n\": \"MST\"\n            }\n        }\n    ],\n    [\n        \"America/Indiana/Indianapolis\",\n        {\n            \"s\": {\n                \"f\": \"-0400\",\n                \"t\": \"-0500\",\n                \"n\": \"EST\",\n                \"s\": \"19701101T020000\",\n                \"r\": {\n                    \"m\": 11,\n                    \"d\": \"1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"-0500\",\n                \"t\": \"-0400\",\n                \"n\": \"EDT\",\n                \"s\": \"19700308T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"2SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"America/Indiana/Knox\",\n        {\n            \"s\": {\n                \"f\": \"-0500\",\n                \"t\": \"-0600\",\n                \"n\": \"CST\",\n                \"s\": \"19701101T020000\",\n                \"r\": {\n                    \"m\": 11,\n                    \"d\": \"1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"-0600\",\n                \"t\": \"-0500\",\n                \"n\": \"CDT\",\n                \"s\": \"19700308T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"2SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"America/Indiana/Marengo\",\n        {\n            \"s\": {\n                \"f\": \"-0400\",\n                \"t\": \"-0500\",\n                \"n\": \"EST\",\n                \"s\": \"19701101T020000\",\n                \"r\": {\n                    \"m\": 11,\n                    \"d\": \"1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"-0500\",\n                \"t\": \"-0400\",\n                \"n\": \"EDT\",\n                \"s\": \"19700308T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"2SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"America/Indiana/Petersburg\",\n        {\n            \"s\": {\n                \"f\": \"-0400\",\n                \"t\": \"-0500\",\n                \"n\": \"EST\",\n                \"s\": \"19701101T020000\",\n                \"r\": {\n                    \"m\": 11,\n                    \"d\": \"1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"-0500\",\n                \"t\": \"-0400\",\n                \"n\": \"EDT\",\n                \"s\": \"19700308T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"2SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"America/Indiana/Tell_City\",\n        {\n            \"s\": {\n                \"f\": \"-0500\",\n                \"t\": \"-0600\",\n                \"n\": \"CST\",\n                \"s\": \"19701101T020000\",\n                \"r\": {\n                    \"m\": 11,\n                    \"d\": \"1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"-0600\",\n                \"t\": \"-0500\",\n                \"n\": \"CDT\",\n                \"s\": \"19700308T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"2SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"America/Indiana/Vevay\",\n        {\n            \"s\": {\n                \"f\": \"-0400\",\n                \"t\": \"-0500\",\n                \"n\": \"EST\",\n                \"s\": \"19701101T020000\",\n                \"r\": {\n                    \"m\": 11,\n                    \"d\": \"1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"-0500\",\n                \"t\": \"-0400\",\n                \"n\": \"EDT\",\n                \"s\": \"19700308T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"2SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"America/Indiana/Vincennes\",\n        {\n            \"s\": {\n                \"f\": \"-0400\",\n                \"t\": \"-0500\",\n                \"n\": \"EST\",\n                \"s\": \"19701101T020000\",\n                \"r\": {\n                    \"m\": 11,\n                    \"d\": \"1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"-0500\",\n                \"t\": \"-0400\",\n                \"n\": \"EDT\",\n                \"s\": \"19700308T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"2SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"America/Indiana/Winamac\",\n        {\n            \"s\": {\n                \"f\": \"-0400\",\n                \"t\": \"-0500\",\n                \"n\": \"EST\",\n                \"s\": \"19701101T020000\",\n                \"r\": {\n                    \"m\": 11,\n                    \"d\": \"1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"-0500\",\n                \"t\": \"-0400\",\n                \"n\": \"EDT\",\n                \"s\": \"19700308T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"2SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"America/Inuvik\",\n        {\n            \"s\": {\n                \"f\": \"-0600\",\n                \"t\": \"-0700\",\n                \"n\": \"MST\",\n                \"s\": \"19701101T020000\",\n                \"r\": {\n                    \"m\": 11,\n                    \"d\": \"1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"-0700\",\n                \"t\": \"-0600\",\n                \"n\": \"MDT\",\n                \"s\": \"19700308T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"2SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"America/Iqaluit\",\n        {\n            \"s\": {\n                \"f\": \"-0400\",\n                \"t\": \"-0500\",\n                \"n\": \"EST\",\n                \"s\": \"19701101T020000\",\n                \"r\": {\n                    \"m\": 11,\n                    \"d\": \"1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"-0500\",\n                \"t\": \"-0400\",\n                \"n\": \"EDT\",\n                \"s\": \"19700308T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"2SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"America/Jamaica\",\n        {\n            \"s\": {\n                \"f\": \"-0500\",\n                \"n\": \"EST\"\n            }\n        }\n    ],\n    [\n        \"America/Juneau\",\n        {\n            \"s\": {\n                \"f\": \"-0800\",\n                \"t\": \"-0900\",\n                \"n\": \"AKST\",\n                \"s\": \"19701101T020000\",\n                \"r\": {\n                    \"m\": 11,\n                    \"d\": \"1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"-0900\",\n                \"t\": \"-0800\",\n                \"n\": \"AKDT\",\n                \"s\": \"19700308T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"2SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"America/Kentucky/Louisville\",\n        {\n            \"s\": {\n                \"f\": \"-0400\",\n                \"t\": \"-0500\",\n                \"n\": \"EST\",\n                \"s\": \"19701101T020000\",\n                \"r\": {\n                    \"m\": 11,\n                    \"d\": \"1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"-0500\",\n                \"t\": \"-0400\",\n                \"n\": \"EDT\",\n                \"s\": \"19700308T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"2SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"America/Kentucky/Monticello\",\n        {\n            \"s\": {\n                \"f\": \"-0400\",\n                \"t\": \"-0500\",\n                \"n\": \"EST\",\n                \"s\": \"19701101T020000\",\n                \"r\": {\n                    \"m\": 11,\n                    \"d\": \"1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"-0500\",\n                \"t\": \"-0400\",\n                \"n\": \"EDT\",\n                \"s\": \"19700308T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"2SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"America/Kralendijk\",\n        {\n            \"s\": {\n                \"f\": \"-0400\",\n                \"n\": \"AST\"\n            }\n        }\n    ],\n    [\n        \"America/La_Paz\",\n        {\n            \"s\": {\n                \"f\": \"-0400\",\n                \"n\": \"-04\"\n            }\n        }\n    ],\n    [\n        \"America/Lima\",\n        {\n            \"s\": {\n                \"f\": \"-0500\",\n                \"n\": \"-05\"\n            }\n        }\n    ],\n    [\n        \"America/Los_Angeles\",\n        {\n            \"s\": {\n                \"f\": \"-0700\",\n                \"t\": \"-0800\",\n                \"n\": \"PST\",\n                \"s\": \"19701101T020000\",\n                \"r\": {\n                    \"m\": 11,\n                    \"d\": \"1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"-0800\",\n                \"t\": \"-0700\",\n                \"n\": \"PDT\",\n                \"s\": \"19700308T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"2SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"America/Lower_Princes\",\n        {\n            \"s\": {\n                \"f\": \"-0400\",\n                \"n\": \"AST\"\n            }\n        }\n    ],\n    [\n        \"America/Maceio\",\n        {\n            \"s\": {\n                \"f\": \"-0300\",\n                \"n\": \"-03\"\n            }\n        }\n    ],\n    [\n        \"America/Managua\",\n        {\n            \"s\": {\n                \"f\": \"-0600\",\n                \"n\": \"CST\"\n            }\n        }\n    ],\n    [\n        \"America/Manaus\",\n        {\n            \"s\": {\n                \"f\": \"-0400\",\n                \"n\": \"-04\"\n            }\n        }\n    ],\n    [\n        \"America/Marigot\",\n        {\n            \"s\": {\n                \"f\": \"-0400\",\n                \"n\": \"AST\"\n            }\n        }\n    ],\n    [\n        \"America/Martinique\",\n        {\n            \"s\": {\n                \"f\": \"-0400\",\n                \"n\": \"AST\"\n            }\n        }\n    ],\n    [\n        \"America/Matamoros\",\n        {\n            \"s\": {\n                \"f\": \"-0500\",\n                \"t\": \"-0600\",\n                \"n\": \"CST\",\n                \"s\": \"19701101T020000\",\n                \"r\": {\n                    \"m\": 11,\n                    \"d\": \"1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"-0600\",\n                \"t\": \"-0500\",\n                \"n\": \"CDT\",\n                \"s\": \"19700308T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"2SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"America/Mazatlan\",\n        {\n            \"s\": {\n                \"f\": \"-0600\",\n                \"t\": \"-0700\",\n                \"n\": \"MST\",\n                \"s\": \"19701025T020000\",\n                \"r\": {\n                    \"m\": 10,\n                    \"d\": \"-1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"-0700\",\n                \"t\": \"-0600\",\n                \"n\": \"MDT\",\n                \"s\": \"19700405T020000\",\n                \"r\": {\n                    \"m\": 4,\n                    \"d\": \"1SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"America/Menominee\",\n        {\n            \"s\": {\n                \"f\": \"-0500\",\n                \"t\": \"-0600\",\n                \"n\": \"CST\",\n                \"s\": \"19701101T020000\",\n                \"r\": {\n                    \"m\": 11,\n                    \"d\": \"1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"-0600\",\n                \"t\": \"-0500\",\n                \"n\": \"CDT\",\n                \"s\": \"19700308T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"2SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"America/Merida\",\n        {\n            \"s\": {\n                \"f\": \"-0500\",\n                \"t\": \"-0600\",\n                \"n\": \"CST\",\n                \"s\": \"19701025T020000\",\n                \"r\": {\n                    \"m\": 10,\n                    \"d\": \"-1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"-0600\",\n                \"t\": \"-0500\",\n                \"n\": \"CDT\",\n                \"s\": \"19700405T020000\",\n                \"r\": {\n                    \"m\": 4,\n                    \"d\": \"1SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"America/Metlakatla\",\n        {\n            \"s\": {\n                \"f\": \"-0800\",\n                \"t\": \"-0900\",\n                \"n\": \"AKST\",\n                \"s\": \"19701101T020000\",\n                \"r\": {\n                    \"m\": 11,\n                    \"d\": \"1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"-0900\",\n                \"t\": \"-0800\",\n                \"n\": \"AKDT\",\n                \"s\": \"19700308T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"2SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"America/Mexico_City\",\n        {\n            \"s\": {\n                \"f\": \"-0500\",\n                \"t\": \"-0600\",\n                \"n\": \"CST\",\n                \"s\": \"19701025T020000\",\n                \"r\": {\n                    \"m\": 10,\n                    \"d\": \"-1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"-0600\",\n                \"t\": \"-0500\",\n                \"n\": \"CDT\",\n                \"s\": \"19700405T020000\",\n                \"r\": {\n                    \"m\": 4,\n                    \"d\": \"1SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"America/Miquelon\",\n        {\n            \"s\": {\n                \"f\": \"-0200\",\n                \"t\": \"-0300\",\n                \"n\": \"-03\",\n                \"s\": \"19701101T020000\",\n                \"r\": {\n                    \"m\": 11,\n                    \"d\": \"1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"-0300\",\n                \"t\": \"-0200\",\n                \"n\": \"-02\",\n                \"s\": \"19700308T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"2SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"America/Moncton\",\n        {\n            \"s\": {\n                \"f\": \"-0300\",\n                \"t\": \"-0400\",\n                \"n\": \"AST\",\n                \"s\": \"19701101T020000\",\n                \"r\": {\n                    \"m\": 11,\n                    \"d\": \"1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"-0400\",\n                \"t\": \"-0300\",\n                \"n\": \"ADT\",\n                \"s\": \"19700308T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"2SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"America/Monterrey\",\n        {\n            \"s\": {\n                \"f\": \"-0500\",\n                \"t\": \"-0600\",\n                \"n\": \"CST\",\n                \"s\": \"19701025T020000\",\n                \"r\": {\n                    \"m\": 10,\n                    \"d\": \"-1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"-0600\",\n                \"t\": \"-0500\",\n                \"n\": \"CDT\",\n                \"s\": \"19700405T020000\",\n                \"r\": {\n                    \"m\": 4,\n                    \"d\": \"1SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"America/Montevideo\",\n        {\n            \"s\": {\n                \"f\": \"-0300\",\n                \"n\": \"-03\"\n            }\n        }\n    ],\n    [\n        \"America/Montserrat\",\n        {\n            \"s\": {\n                \"f\": \"-0400\",\n                \"n\": \"AST\"\n            }\n        }\n    ],\n    [\n        \"America/Nassau\",\n        {\n            \"s\": {\n                \"f\": \"-0400\",\n                \"t\": \"-0500\",\n                \"n\": \"EST\",\n                \"s\": \"19701101T020000\",\n                \"r\": {\n                    \"m\": 11,\n                    \"d\": \"1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"-0500\",\n                \"t\": \"-0400\",\n                \"n\": \"EDT\",\n                \"s\": \"19700308T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"2SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"America/New_York\",\n        {\n            \"s\": {\n                \"f\": \"-0400\",\n                \"t\": \"-0500\",\n                \"n\": \"EST\",\n                \"s\": \"19701101T020000\",\n                \"r\": {\n                    \"m\": 11,\n                    \"d\": \"1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"-0500\",\n                \"t\": \"-0400\",\n                \"n\": \"EDT\",\n                \"s\": \"19700308T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"2SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"America/Nipigon\",\n        {\n            \"s\": {\n                \"f\": \"-0400\",\n                \"t\": \"-0500\",\n                \"n\": \"EST\",\n                \"s\": \"19701101T020000\",\n                \"r\": {\n                    \"m\": 11,\n                    \"d\": \"1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"-0500\",\n                \"t\": \"-0400\",\n                \"n\": \"EDT\",\n                \"s\": \"19700308T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"2SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"America/Nome\",\n        {\n            \"s\": {\n                \"f\": \"-0800\",\n                \"t\": \"-0900\",\n                \"n\": \"AKST\",\n                \"s\": \"19701101T020000\",\n                \"r\": {\n                    \"m\": 11,\n                    \"d\": \"1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"-0900\",\n                \"t\": \"-0800\",\n                \"n\": \"AKDT\",\n                \"s\": \"19700308T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"2SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"America/Noronha\",\n        {\n            \"s\": {\n                \"f\": \"-0200\",\n                \"n\": \"-02\"\n            }\n        }\n    ],\n    [\n        \"America/North_Dakota/Beulah\",\n        {\n            \"s\": {\n                \"f\": \"-0500\",\n                \"t\": \"-0600\",\n                \"n\": \"CST\",\n                \"s\": \"19701101T020000\",\n                \"r\": {\n                    \"m\": 11,\n                    \"d\": \"1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"-0600\",\n                \"t\": \"-0500\",\n                \"n\": \"CDT\",\n                \"s\": \"19700308T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"2SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"America/North_Dakota/Center\",\n        {\n            \"s\": {\n                \"f\": \"-0500\",\n                \"t\": \"-0600\",\n                \"n\": \"CST\",\n                \"s\": \"19701101T020000\",\n                \"r\": {\n                    \"m\": 11,\n                    \"d\": \"1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"-0600\",\n                \"t\": \"-0500\",\n                \"n\": \"CDT\",\n                \"s\": \"19700308T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"2SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"America/North_Dakota/New_Salem\",\n        {\n            \"s\": {\n                \"f\": \"-0500\",\n                \"t\": \"-0600\",\n                \"n\": \"CST\",\n                \"s\": \"19701101T020000\",\n                \"r\": {\n                    \"m\": 11,\n                    \"d\": \"1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"-0600\",\n                \"t\": \"-0500\",\n                \"n\": \"CDT\",\n                \"s\": \"19700308T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"2SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"America/Ojinaga\",\n        {\n            \"s\": {\n                \"f\": \"-0600\",\n                \"t\": \"-0700\",\n                \"n\": \"MST\",\n                \"s\": \"19701101T020000\",\n                \"r\": {\n                    \"m\": 11,\n                    \"d\": \"1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"-0700\",\n                \"t\": \"-0600\",\n                \"n\": \"MDT\",\n                \"s\": \"19700308T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"2SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"America/Panama\",\n        {\n            \"s\": {\n                \"f\": \"-0500\",\n                \"n\": \"EST\"\n            }\n        }\n    ],\n    [\n        \"America/Pangnirtung\",\n        {\n            \"s\": {\n                \"f\": \"-0400\",\n                \"t\": \"-0500\",\n                \"n\": \"EST\",\n                \"s\": \"19701101T020000\",\n                \"r\": {\n                    \"m\": 11,\n                    \"d\": \"1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"-0500\",\n                \"t\": \"-0400\",\n                \"n\": \"EDT\",\n                \"s\": \"19700308T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"2SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"America/Paramaribo\",\n        {\n            \"s\": {\n                \"f\": \"-0300\",\n                \"n\": \"-03\"\n            }\n        }\n    ],\n    [\n        \"America/Phoenix\",\n        {\n            \"s\": {\n                \"f\": \"-0700\",\n                \"n\": \"MST\"\n            }\n        }\n    ],\n    [\n        \"America/Port_of_Spain\",\n        {\n            \"s\": {\n                \"f\": \"-0400\",\n                \"n\": \"AST\"\n            }\n        }\n    ],\n    [\n        \"America/Port-au-Prince\",\n        {\n            \"s\": {\n                \"f\": \"-0400\",\n                \"t\": \"-0500\",\n                \"n\": \"EST\",\n                \"s\": \"19701101T020000\",\n                \"r\": {\n                    \"m\": 11,\n                    \"d\": \"1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"-0500\",\n                \"t\": \"-0400\",\n                \"n\": \"EDT\",\n                \"s\": \"19700308T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"2SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"America/Porto_Velho\",\n        {\n            \"s\": {\n                \"f\": \"-0400\",\n                \"n\": \"-04\"\n            }\n        }\n    ],\n    [\n        \"America/Puerto_Rico\",\n        {\n            \"s\": {\n                \"f\": \"-0400\",\n                \"n\": \"AST\"\n            }\n        }\n    ],\n    [\n        \"America/Punta_Arenas\",\n        {\n            \"s\": {\n                \"f\": \"-0300\",\n                \"n\": \"-03\"\n            }\n        }\n    ],\n    [\n        \"America/Rainy_River\",\n        {\n            \"s\": {\n                \"f\": \"-0500\",\n                \"t\": \"-0600\",\n                \"n\": \"CST\",\n                \"s\": \"19701101T020000\",\n                \"r\": {\n                    \"m\": 11,\n                    \"d\": \"1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"-0600\",\n                \"t\": \"-0500\",\n                \"n\": \"CDT\",\n                \"s\": \"19700308T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"2SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"America/Rankin_Inlet\",\n        {\n            \"s\": {\n                \"f\": \"-0500\",\n                \"t\": \"-0600\",\n                \"n\": \"CST\",\n                \"s\": \"19701101T020000\",\n                \"r\": {\n                    \"m\": 11,\n                    \"d\": \"1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"-0600\",\n                \"t\": \"-0500\",\n                \"n\": \"CDT\",\n                \"s\": \"19700308T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"2SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"America/Recife\",\n        {\n            \"s\": {\n                \"f\": \"-0300\",\n                \"n\": \"-03\"\n            }\n        }\n    ],\n    [\n        \"America/Regina\",\n        {\n            \"s\": {\n                \"f\": \"-0600\",\n                \"n\": \"CST\"\n            }\n        }\n    ],\n    [\n        \"America/Resolute\",\n        {\n            \"s\": {\n                \"f\": \"-0500\",\n                \"t\": \"-0600\",\n                \"n\": \"CST\",\n                \"s\": \"19701101T020000\",\n                \"r\": {\n                    \"m\": 11,\n                    \"d\": \"1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"-0600\",\n                \"t\": \"-0500\",\n                \"n\": \"CDT\",\n                \"s\": \"19700308T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"2SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"America/Rio_Branco\",\n        {\n            \"s\": {\n                \"f\": \"-0500\",\n                \"n\": \"-05\"\n            }\n        }\n    ],\n    [\n        \"America/Santarem\",\n        {\n            \"s\": {\n                \"f\": \"-0300\",\n                \"n\": \"-03\"\n            }\n        }\n    ],\n    [\n        \"America/Santiago\",\n        {\n            \"s\": {\n                \"f\": \"-0300\",\n                \"t\": \"-0400\",\n                \"n\": \"-04\",\n                \"s\": \"19700405T000000\",\n                \"r\": {\n                    \"m\": 4,\n                    \"d\": \"1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"-0400\",\n                \"t\": \"-0300\",\n                \"n\": \"-03\",\n                \"s\": \"19700906T000000\",\n                \"r\": {\n                    \"m\": 9,\n                    \"d\": \"1SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"America/Santo_Domingo\",\n        {\n            \"s\": {\n                \"f\": \"-0400\",\n                \"n\": \"AST\"\n            }\n        }\n    ],\n    [\n        \"America/Sao_Paulo\",\n        {\n            \"s\": {\n                \"f\": \"-0300\",\n                \"n\": \"-03\",\n                \"s\": \"19700215T000000\",\n                \"r\": {\n                    \"m\": 2,\n                    \"d\": \"3SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"-0300\",\n                \"t\": \"-0200\",\n                \"n\": \"-02\",\n                \"s\": \"19701101T000000\",\n                \"r\": {\n                    \"m\": 11,\n                    \"d\": \"1SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"America/Scoresbysund\",\n        {\n            \"s\": {\n                \"f\": \"+0000\",\n                \"t\": \"-0100\",\n                \"n\": \"-01\",\n                \"s\": \"19701025T010000\",\n                \"r\": {\n                    \"m\": 10,\n                    \"d\": \"-1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"-0100\",\n                \"t\": \"+0000\",\n                \"n\": \"+00\",\n                \"s\": \"19700329T000000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"-1SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"America/Sitka\",\n        {\n            \"s\": {\n                \"f\": \"-0800\",\n                \"t\": \"-0900\",\n                \"n\": \"AKST\",\n                \"s\": \"19701101T020000\",\n                \"r\": {\n                    \"m\": 11,\n                    \"d\": \"1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"-0900\",\n                \"t\": \"-0800\",\n                \"n\": \"AKDT\",\n                \"s\": \"19700308T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"2SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"America/St_Barthelemy\",\n        {\n            \"s\": {\n                \"f\": \"-0400\",\n                \"n\": \"AST\"\n            }\n        }\n    ],\n    [\n        \"America/St_Johns\",\n        {\n            \"s\": {\n                \"f\": \"-0230\",\n                \"t\": \"-0330\",\n                \"n\": \"NST\",\n                \"s\": \"19701101T020000\",\n                \"r\": {\n                    \"m\": 11,\n                    \"d\": \"1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"-0330\",\n                \"t\": \"-0230\",\n                \"n\": \"NDT\",\n                \"s\": \"19700308T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"2SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"America/St_Kitts\",\n        {\n            \"s\": {\n                \"f\": \"-0400\",\n                \"n\": \"AST\"\n            }\n        }\n    ],\n    [\n        \"America/St_Lucia\",\n        {\n            \"s\": {\n                \"f\": \"-0400\",\n                \"n\": \"AST\"\n            }\n        }\n    ],\n    [\n        \"America/St_Thomas\",\n        {\n            \"s\": {\n                \"f\": \"-0400\",\n                \"n\": \"AST\"\n            }\n        }\n    ],\n    [\n        \"America/St_Vincent\",\n        {\n            \"s\": {\n                \"f\": \"-0400\",\n                \"n\": \"AST\"\n            }\n        }\n    ],\n    [\n        \"America/Swift_Current\",\n        {\n            \"s\": {\n                \"f\": \"-0600\",\n                \"n\": \"CST\"\n            }\n        }\n    ],\n    [\n        \"America/Tegucigalpa\",\n        {\n            \"s\": {\n                \"f\": \"-0600\",\n                \"n\": \"CST\"\n            }\n        }\n    ],\n    [\n        \"America/Thule\",\n        {\n            \"s\": {\n                \"f\": \"-0300\",\n                \"t\": \"-0400\",\n                \"n\": \"AST\",\n                \"s\": \"19701101T020000\",\n                \"r\": {\n                    \"m\": 11,\n                    \"d\": \"1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"-0400\",\n                \"t\": \"-0300\",\n                \"n\": \"ADT\",\n                \"s\": \"19700308T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"2SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"America/Thunder_Bay\",\n        {\n            \"s\": {\n                \"f\": \"-0400\",\n                \"t\": \"-0500\",\n                \"n\": \"EST\",\n                \"s\": \"19701101T020000\",\n                \"r\": {\n                    \"m\": 11,\n                    \"d\": \"1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"-0500\",\n                \"t\": \"-0400\",\n                \"n\": \"EDT\",\n                \"s\": \"19700308T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"2SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"America/Tijuana\",\n        {\n            \"s\": {\n                \"f\": \"-0700\",\n                \"t\": \"-0800\",\n                \"n\": \"PST\",\n                \"s\": \"19701101T020000\",\n                \"r\": {\n                    \"m\": 11,\n                    \"d\": \"1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"-0800\",\n                \"t\": \"-0700\",\n                \"n\": \"PDT\",\n                \"s\": \"19700308T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"2SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"America/Toronto\",\n        {\n            \"s\": {\n                \"f\": \"-0400\",\n                \"t\": \"-0500\",\n                \"n\": \"EST\",\n                \"s\": \"19701101T020000\",\n                \"r\": {\n                    \"m\": 11,\n                    \"d\": \"1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"-0500\",\n                \"t\": \"-0400\",\n                \"n\": \"EDT\",\n                \"s\": \"19700308T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"2SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"America/Tortola\",\n        {\n            \"s\": {\n                \"f\": \"-0400\",\n                \"n\": \"AST\"\n            }\n        }\n    ],\n    [\n        \"America/Vancouver\",\n        {\n            \"s\": {\n                \"f\": \"-0700\",\n                \"t\": \"-0800\",\n                \"n\": \"PST\",\n                \"s\": \"19701101T020000\",\n                \"r\": {\n                    \"m\": 11,\n                    \"d\": \"1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"-0800\",\n                \"t\": \"-0700\",\n                \"n\": \"PDT\",\n                \"s\": \"19700308T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"2SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"America/Whitehorse\",\n        {\n            \"s\": {\n                \"f\": \"-0700\",\n                \"t\": \"-0800\",\n                \"n\": \"PST\",\n                \"s\": \"19701101T020000\",\n                \"r\": {\n                    \"m\": 11,\n                    \"d\": \"1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"-0800\",\n                \"t\": \"-0700\",\n                \"n\": \"PDT\",\n                \"s\": \"19700308T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"2SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"America/Winnipeg\",\n        {\n            \"s\": {\n                \"f\": \"-0500\",\n                \"t\": \"-0600\",\n                \"n\": \"CST\",\n                \"s\": \"19701101T020000\",\n                \"r\": {\n                    \"m\": 11,\n                    \"d\": \"1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"-0600\",\n                \"t\": \"-0500\",\n                \"n\": \"CDT\",\n                \"s\": \"19700308T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"2SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"America/Yakutat\",\n        {\n            \"s\": {\n                \"f\": \"-0800\",\n                \"t\": \"-0900\",\n                \"n\": \"AKST\",\n                \"s\": \"19701101T020000\",\n                \"r\": {\n                    \"m\": 11,\n                    \"d\": \"1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"-0900\",\n                \"t\": \"-0800\",\n                \"n\": \"AKDT\",\n                \"s\": \"19700308T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"2SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"America/Yellowknife\",\n        {\n            \"s\": {\n                \"f\": \"-0600\",\n                \"t\": \"-0700\",\n                \"n\": \"MST\",\n                \"s\": \"19701101T020000\",\n                \"r\": {\n                    \"m\": 11,\n                    \"d\": \"1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"-0700\",\n                \"t\": \"-0600\",\n                \"n\": \"MDT\",\n                \"s\": \"19700308T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"2SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"Antarctica/Casey\",\n        {\n            \"s\": {\n                \"f\": \"+0800\",\n                \"n\": \"+08\"\n            }\n        }\n    ],\n    [\n        \"Antarctica/Davis\",\n        {\n            \"s\": {\n                \"f\": \"+0700\",\n                \"n\": \"+07\"\n            }\n        }\n    ],\n    [\n        \"Antarctica/DumontDUrville\",\n        {\n            \"s\": {\n                \"f\": \"+1000\",\n                \"n\": \"+10\"\n            }\n        }\n    ],\n    [\n        \"Antarctica/Macquarie\",\n        {\n            \"s\": {\n                \"f\": \"+1100\",\n                \"n\": \"+11\"\n            }\n        }\n    ],\n    [\n        \"Antarctica/Mawson\",\n        {\n            \"s\": {\n                \"f\": \"+0500\",\n                \"n\": \"+05\"\n            }\n        }\n    ],\n    [\n        \"Antarctica/McMurdo\",\n        {\n            \"s\": {\n                \"f\": \"+1300\",\n                \"t\": \"+1200\",\n                \"n\": \"NZST\",\n                \"s\": \"19700405T030000\",\n                \"r\": {\n                    \"m\": 4,\n                    \"d\": \"1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"+1200\",\n                \"t\": \"+1300\",\n                \"n\": \"NZDT\",\n                \"s\": \"19700927T020000\",\n                \"r\": {\n                    \"m\": 9,\n                    \"d\": \"-1SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"Antarctica/Palmer\",\n        {\n            \"s\": {\n                \"f\": \"-0300\",\n                \"n\": \"-03\"\n            }\n        }\n    ],\n    [\n        \"Antarctica/Rothera\",\n        {\n            \"s\": {\n                \"f\": \"-0300\",\n                \"n\": \"-03\"\n            }\n        }\n    ],\n    [\n        \"Antarctica/Syowa\",\n        {\n            \"s\": {\n                \"f\": \"+0300\",\n                \"n\": \"+03\"\n            }\n        }\n    ],\n    [\n        \"Antarctica/Troll\",\n        {\n            \"s\": {\n                \"f\": \"+0200\",\n                \"t\": \"+0000\",\n                \"n\": \"+00\",\n                \"s\": \"19701025T030000\",\n                \"r\": {\n                    \"m\": 10,\n                    \"d\": \"-1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"+0000\",\n                \"t\": \"+0200\",\n                \"n\": \"+02\",\n                \"s\": \"19700329T010000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"-1SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"Antarctica/Vostok\",\n        {\n            \"s\": {\n                \"f\": \"+0600\",\n                \"n\": \"+06\"\n            }\n        }\n    ],\n    [\n        \"Arctic/Longyearbyen\",\n        {\n            \"s\": {\n                \"f\": \"+0200\",\n                \"t\": \"+0100\",\n                \"n\": \"CET\",\n                \"s\": \"19701025T030000\",\n                \"r\": {\n                    \"m\": 10,\n                    \"d\": \"-1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"+0100\",\n                \"t\": \"+0200\",\n                \"n\": \"CEST\",\n                \"s\": \"19700329T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"-1SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"Asia/Aden\",\n        {\n            \"s\": {\n                \"f\": \"+0300\",\n                \"n\": \"+03\"\n            }\n        }\n    ],\n    [\n        \"Asia/Almaty\",\n        {\n            \"s\": {\n                \"f\": \"+0600\",\n                \"n\": \"+06\"\n            }\n        }\n    ],\n    [\n        \"Asia/Amman\",\n        {\n            \"s\": {\n                \"f\": \"+0300\",\n                \"t\": \"+0200\",\n                \"n\": \"EET\",\n                \"s\": \"19701030T010000\",\n                \"r\": {\n                    \"m\": 10,\n                    \"d\": \"-1FR\"\n                }\n            },\n            \"d\": {\n                \"f\": \"+0200\",\n                \"t\": \"+0300\",\n                \"n\": \"EEST\",\n                \"s\": \"19700326T235959\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"-1TH\"\n                }\n            }\n        }\n    ],\n    [\n        \"Asia/Anadyr\",\n        {\n            \"s\": {\n                \"f\": \"+1200\",\n                \"n\": \"+12\"\n            }\n        }\n    ],\n    [\n        \"Asia/Aqtau\",\n        {\n            \"s\": {\n                \"f\": \"+0500\",\n                \"n\": \"+05\"\n            }\n        }\n    ],\n    [\n        \"Asia/Aqtobe\",\n        {\n            \"s\": {\n                \"f\": \"+0500\",\n                \"n\": \"+05\"\n            }\n        }\n    ],\n    [\n        \"Asia/Ashgabat\",\n        {\n            \"s\": {\n                \"f\": \"+0500\",\n                \"n\": \"+05\"\n            }\n        }\n    ],\n    [\n        \"Asia/Atyrau\",\n        {\n            \"s\": {\n                \"f\": \"+0500\",\n                \"n\": \"+05\"\n            }\n        }\n    ],\n    [\n        \"Asia/Baghdad\",\n        {\n            \"s\": {\n                \"f\": \"+0300\",\n                \"n\": \"+03\"\n            }\n        }\n    ],\n    [\n        \"Asia/Bahrain\",\n        {\n            \"s\": {\n                \"f\": \"+0300\",\n                \"n\": \"+03\"\n            }\n        }\n    ],\n    [\n        \"Asia/Baku\",\n        {\n            \"s\": {\n                \"f\": \"+0400\",\n                \"n\": \"+04\"\n            }\n        }\n    ],\n    [\n        \"Asia/Bangkok\",\n        {\n            \"s\": {\n                \"f\": \"+0700\",\n                \"n\": \"+07\"\n            }\n        }\n    ],\n    [\n        \"Asia/Barnaul\",\n        {\n            \"s\": {\n                \"f\": \"+0700\",\n                \"n\": \"+07\"\n            }\n        }\n    ],\n    [\n        \"Asia/Beirut\",\n        {\n            \"s\": {\n                \"f\": \"+0300\",\n                \"t\": \"+0200\",\n                \"n\": \"EET\",\n                \"s\": \"19701025T000000\",\n                \"r\": {\n                    \"m\": 10,\n                    \"d\": \"-1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"+0200\",\n                \"t\": \"+0300\",\n                \"n\": \"EEST\",\n                \"s\": \"19700329T000000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"-1SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"Asia/Bishkek\",\n        {\n            \"s\": {\n                \"f\": \"+0600\",\n                \"n\": \"+06\"\n            }\n        }\n    ],\n    [\n        \"Asia/Brunei\",\n        {\n            \"s\": {\n                \"f\": \"+0800\",\n                \"n\": \"+08\"\n            }\n        }\n    ],\n    [\n        \"Asia/Chita\",\n        {\n            \"s\": {\n                \"f\": \"+0900\",\n                \"n\": \"+09\"\n            }\n        }\n    ],\n    [\n        \"Asia/Choibalsan\",\n        {\n            \"s\": {\n                \"f\": \"+0800\",\n                \"n\": \"+08\"\n            }\n        }\n    ],\n    [\n        \"Asia/Colombo\",\n        {\n            \"s\": {\n                \"f\": \"+0530\",\n                \"n\": \"+0530\"\n            }\n        }\n    ],\n    [\n        \"Asia/Damascus\",\n        {\n            \"s\": {\n                \"f\": \"+0300\",\n                \"t\": \"+0200\",\n                \"n\": \"EET\",\n                \"s\": \"19701030T000000\",\n                \"r\": {\n                    \"m\": 10,\n                    \"d\": \"-1FR\"\n                }\n            },\n            \"d\": {\n                \"f\": \"+0200\",\n                \"t\": \"+0300\",\n                \"n\": \"EEST\",\n                \"s\": \"19700327T000000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"-1FR\"\n                }\n            }\n        }\n    ],\n    [\n        \"Asia/Dhaka\",\n        {\n            \"s\": {\n                \"f\": \"+0600\",\n                \"n\": \"+06\"\n            }\n        }\n    ],\n    [\n        \"Asia/Dili\",\n        {\n            \"s\": {\n                \"f\": \"+0900\",\n                \"n\": \"+09\"\n            }\n        }\n    ],\n    [\n        \"Asia/Dubai\",\n        {\n            \"s\": {\n                \"f\": \"+0400\",\n                \"n\": \"+04\"\n            }\n        }\n    ],\n    [\n        \"Asia/Dushanbe\",\n        {\n            \"s\": {\n                \"f\": \"+0500\",\n                \"n\": \"+05\"\n            }\n        }\n    ],\n    [\n        \"Asia/Famagusta\",\n        {\n            \"s\": {\n                \"f\": \"+0300\",\n                \"t\": \"+0200\",\n                \"n\": \"EET\",\n                \"s\": \"19701025T040000\",\n                \"r\": {\n                    \"m\": 10,\n                    \"d\": \"-1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"+0200\",\n                \"t\": \"+0300\",\n                \"n\": \"EEST\",\n                \"s\": \"19700329T030000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"-1SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"Asia/Gaza\",\n        {\n            \"s\": {\n                \"f\": \"+0300\",\n                \"t\": \"+0200\",\n                \"n\": \"EET\",\n                \"s\": \"19701031T010000\",\n                \"r\": {\n                    \"m\": 10,\n                    \"d\": \"-1SA\"\n                }\n            },\n            \"d\": {\n                \"f\": \"+0200\",\n                \"t\": \"+0300\",\n                \"n\": \"EEST\",\n                \"s\": \"19700328T010000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"4SA\"\n                }\n            }\n        }\n    ],\n    [\n        \"Asia/Hebron\",\n        {\n            \"s\": {\n                \"f\": \"+0300\",\n                \"t\": \"+0200\",\n                \"n\": \"EET\",\n                \"s\": \"19701031T010000\",\n                \"r\": {\n                    \"m\": 10,\n                    \"d\": \"-1SA\"\n                }\n            },\n            \"d\": {\n                \"f\": \"+0200\",\n                \"t\": \"+0300\",\n                \"n\": \"EEST\",\n                \"s\": \"19700328T010000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"4SA\"\n                }\n            }\n        }\n    ],\n    [\n        \"Asia/Ho_Chi_Minh\",\n        {\n            \"s\": {\n                \"f\": \"+0700\",\n                \"n\": \"+07\"\n            }\n        }\n    ],\n    [\n        \"Asia/Hong_Kong\",\n        {\n            \"s\": {\n                \"f\": \"+0800\",\n                \"n\": \"HKT\"\n            }\n        }\n    ],\n    [\n        \"Asia/Hovd\",\n        {\n            \"s\": {\n                \"f\": \"+0700\",\n                \"n\": \"+07\"\n            }\n        }\n    ],\n    [\n        \"Asia/Irkutsk\",\n        {\n            \"s\": {\n                \"f\": \"+0800\",\n                \"n\": \"+08\"\n            }\n        }\n    ],\n    [\n        \"Asia/Istanbul\",\n        {\n            \"s\": {\n                \"f\": \"+0300\",\n                \"n\": \"+03\"\n            }\n        }\n    ],\n    [\n        \"Asia/Jakarta\",\n        {\n            \"s\": {\n                \"f\": \"+0700\",\n                \"n\": \"WIB\"\n            }\n        }\n    ],\n    [\n        \"Asia/Jayapura\",\n        {\n            \"s\": {\n                \"f\": \"+0900\",\n                \"n\": \"WIT\"\n            }\n        }\n    ],\n    [\n        \"Asia/Jerusalem\",\n        {\n            \"s\": {\n                \"f\": \"+0300\",\n                \"t\": \"+0200\",\n                \"n\": \"IST\",\n                \"s\": \"19701025T020000\",\n                \"r\": {\n                    \"m\": 10,\n                    \"d\": \"-1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"+0200\",\n                \"t\": \"+0300\",\n                \"n\": \"IDT\",\n                \"s\": \"19700327T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"-1FR\"\n                }\n            }\n        }\n    ],\n    [\n        \"Asia/Kabul\",\n        {\n            \"s\": {\n                \"f\": \"+0430\",\n                \"n\": \"+0430\"\n            }\n        }\n    ],\n    [\n        \"Asia/Kamchatka\",\n        {\n            \"s\": {\n                \"f\": \"+1200\",\n                \"n\": \"+12\"\n            }\n        }\n    ],\n    [\n        \"Asia/Karachi\",\n        {\n            \"s\": {\n                \"f\": \"+0500\",\n                \"n\": \"PKT\"\n            }\n        }\n    ],\n    [\n        \"Asia/Kathmandu\",\n        {\n            \"s\": {\n                \"f\": \"+0545\",\n                \"n\": \"+0545\"\n            }\n        }\n    ],\n    [\n        \"Asia/Khandyga\",\n        {\n            \"s\": {\n                \"f\": \"+0900\",\n                \"n\": \"+09\"\n            }\n        }\n    ],\n    [\n        \"Asia/Kolkata\",\n        {\n            \"s\": {\n                \"f\": \"+0530\",\n                \"n\": \"IST\"\n            }\n        }\n    ],\n    [\n        \"Asia/Krasnoyarsk\",\n        {\n            \"s\": {\n                \"f\": \"+0700\",\n                \"n\": \"+07\"\n            }\n        }\n    ],\n    [\n        \"Asia/Kuala_Lumpur\",\n        {\n            \"s\": {\n                \"f\": \"+0800\",\n                \"n\": \"+08\"\n            }\n        }\n    ],\n    [\n        \"Asia/Kuching\",\n        {\n            \"s\": {\n                \"f\": \"+0800\",\n                \"n\": \"+08\"\n            }\n        }\n    ],\n    [\n        \"Asia/Kuwait\",\n        {\n            \"s\": {\n                \"f\": \"+0300\",\n                \"n\": \"+03\"\n            }\n        }\n    ],\n    [\n        \"Asia/Macau\",\n        {\n            \"s\": {\n                \"f\": \"+0800\",\n                \"n\": \"CST\"\n            }\n        }\n    ],\n    [\n        \"Asia/Magadan\",\n        {\n            \"s\": {\n                \"f\": \"+1100\",\n                \"n\": \"+11\"\n            }\n        }\n    ],\n    [\n        \"Asia/Makassar\",\n        {\n            \"s\": {\n                \"f\": \"+0800\",\n                \"n\": \"WITA\"\n            }\n        }\n    ],\n    [\n        \"Asia/Manila\",\n        {\n            \"s\": {\n                \"f\": \"+0800\",\n                \"n\": \"PST\"\n            }\n        }\n    ],\n    [\n        \"Asia/Muscat\",\n        {\n            \"s\": {\n                \"f\": \"+0400\",\n                \"n\": \"+04\"\n            }\n        }\n    ],\n    [\n        \"Asia/Nicosia\",\n        {\n            \"s\": {\n                \"f\": \"+0300\",\n                \"t\": \"+0200\",\n                \"n\": \"EET\",\n                \"s\": \"19701025T040000\",\n                \"r\": {\n                    \"m\": 10,\n                    \"d\": \"-1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"+0200\",\n                \"t\": \"+0300\",\n                \"n\": \"EEST\",\n                \"s\": \"19700329T030000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"-1SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"Asia/Novokuznetsk\",\n        {\n            \"s\": {\n                \"f\": \"+0700\",\n                \"n\": \"+07\"\n            }\n        }\n    ],\n    [\n        \"Asia/Novosibirsk\",\n        {\n            \"s\": {\n                \"f\": \"+0700\",\n                \"n\": \"+07\"\n            }\n        }\n    ],\n    [\n        \"Asia/Omsk\",\n        {\n            \"s\": {\n                \"f\": \"+0600\",\n                \"n\": \"+06\"\n            }\n        }\n    ],\n    [\n        \"Asia/Oral\",\n        {\n            \"s\": {\n                \"f\": \"+0500\",\n                \"n\": \"+05\"\n            }\n        }\n    ],\n    [\n        \"Asia/Phnom_Penh\",\n        {\n            \"s\": {\n                \"f\": \"+0700\",\n                \"n\": \"+07\"\n            }\n        }\n    ],\n    [\n        \"Asia/Pontianak\",\n        {\n            \"s\": {\n                \"f\": \"+0700\",\n                \"n\": \"WIB\"\n            }\n        }\n    ],\n    [\n        \"Asia/Pyongyang\",\n        {\n            \"s\": {\n                \"f\": \"+0900\",\n                \"n\": \"KST\"\n            }\n        }\n    ],\n    [\n        \"Asia/Qatar\",\n        {\n            \"s\": {\n                \"f\": \"+0300\",\n                \"n\": \"+03\"\n            }\n        }\n    ],\n    [\n        \"Asia/Qyzylorda\",\n        {\n            \"s\": {\n                \"f\": \"+0600\",\n                \"n\": \"+06\"\n            }\n        }\n    ],\n    [\n        \"Asia/Riyadh\",\n        {\n            \"s\": {\n                \"f\": \"+0300\",\n                \"n\": \"+03\"\n            }\n        }\n    ],\n    [\n        \"Asia/Sakhalin\",\n        {\n            \"s\": {\n                \"f\": \"+1100\",\n                \"n\": \"+11\"\n            }\n        }\n    ],\n    [\n        \"Asia/Samarkand\",\n        {\n            \"s\": {\n                \"f\": \"+0500\",\n                \"n\": \"+05\"\n            }\n        }\n    ],\n    [\n        \"Asia/Seoul\",\n        {\n            \"s\": {\n                \"f\": \"+0900\",\n                \"n\": \"KST\"\n            }\n        }\n    ],\n    [\n        \"Asia/Shanghai\",\n        {\n            \"s\": {\n                \"f\": \"+0800\",\n                \"n\": \"CST\"\n            }\n        }\n    ],\n    [\n        \"Asia/Singapore\",\n        {\n            \"s\": {\n                \"f\": \"+0800\",\n                \"n\": \"+08\"\n            }\n        }\n    ],\n    [\n        \"Asia/Srednekolymsk\",\n        {\n            \"s\": {\n                \"f\": \"+1100\",\n                \"n\": \"+11\"\n            }\n        }\n    ],\n    [\n        \"Asia/Taipei\",\n        {\n            \"s\": {\n                \"f\": \"+0800\",\n                \"n\": \"CST\"\n            }\n        }\n    ],\n    [\n        \"Asia/Tashkent\",\n        {\n            \"s\": {\n                \"f\": \"+0500\",\n                \"n\": \"+05\"\n            }\n        }\n    ],\n    [\n        \"Asia/Tbilisi\",\n        {\n            \"s\": {\n                \"f\": \"+0400\",\n                \"n\": \"+04\"\n            }\n        }\n    ],\n    [\n        \"Asia/Tehran\",\n        {\n            \"s\": {\n                \"f\": \"+0430\",\n                \"t\": \"+0330\",\n                \"n\": \"+0330\",\n                \"s\": \"19700921T000000\",\n                \"r\": {\n                    \"m\": 9,\n                    \"d\": \"3SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"+0330\",\n                \"t\": \"+0430\",\n                \"n\": \"+0430\",\n                \"s\": \"19700321T000000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"3SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"Asia/Thimphu\",\n        {\n            \"s\": {\n                \"f\": \"+0600\",\n                \"n\": \"+06\"\n            }\n        }\n    ],\n    [\n        \"Asia/Tokyo\",\n        {\n            \"s\": {\n                \"f\": \"+0900\",\n                \"n\": \"JST\"\n            }\n        }\n    ],\n    [\n        \"Asia/Tomsk\",\n        {\n            \"s\": {\n                \"f\": \"+0700\",\n                \"n\": \"+07\"\n            }\n        }\n    ],\n    [\n        \"Asia/Ulaanbaatar\",\n        {\n            \"s\": {\n                \"f\": \"+0800\",\n                \"n\": \"+08\"\n            }\n        }\n    ],\n    [\n        \"Asia/Urumqi\",\n        {\n            \"s\": {\n                \"f\": \"+0600\",\n                \"n\": \"+06\"\n            }\n        }\n    ],\n    [\n        \"Asia/Ust-Nera\",\n        {\n            \"s\": {\n                \"f\": \"+1000\",\n                \"n\": \"+10\"\n            }\n        }\n    ],\n    [\n        \"Asia/Vientiane\",\n        {\n            \"s\": {\n                \"f\": \"+0700\",\n                \"n\": \"+07\"\n            }\n        }\n    ],\n    [\n        \"Asia/Vladivostok\",\n        {\n            \"s\": {\n                \"f\": \"+1000\",\n                \"n\": \"+10\"\n            }\n        }\n    ],\n    [\n        \"Asia/Yakutsk\",\n        {\n            \"s\": {\n                \"f\": \"+0900\",\n                \"n\": \"+09\"\n            }\n        }\n    ],\n    [\n        \"Asia/Yangon\",\n        {\n            \"s\": {\n                \"f\": \"+0630\",\n                \"n\": \"+0630\"\n            }\n        }\n    ],\n    [\n        \"Asia/Yekaterinburg\",\n        {\n            \"s\": {\n                \"f\": \"+0500\",\n                \"n\": \"+05\"\n            }\n        }\n    ],\n    [\n        \"Asia/Yerevan\",\n        {\n            \"s\": {\n                \"f\": \"+0400\",\n                \"n\": \"+04\"\n            }\n        }\n    ],\n    [\n        \"Atlantic/Azores\",\n        {\n            \"s\": {\n                \"f\": \"+0000\",\n                \"t\": \"-0100\",\n                \"n\": \"-01\",\n                \"s\": \"19701025T010000\",\n                \"r\": {\n                    \"m\": 10,\n                    \"d\": \"-1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"-0100\",\n                \"t\": \"+0000\",\n                \"n\": \"+00\",\n                \"s\": \"19700329T000000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"-1SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"Atlantic/Bermuda\",\n        {\n            \"s\": {\n                \"f\": \"-0300\",\n                \"t\": \"-0400\",\n                \"n\": \"AST\",\n                \"s\": \"19701101T020000\",\n                \"r\": {\n                    \"m\": 11,\n                    \"d\": \"1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"-0400\",\n                \"t\": \"-0300\",\n                \"n\": \"ADT\",\n                \"s\": \"19700308T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"2SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"Atlantic/Canary\",\n        {\n            \"s\": {\n                \"f\": \"+0100\",\n                \"t\": \"+0000\",\n                \"n\": \"WET\",\n                \"s\": \"19701025T020000\",\n                \"r\": {\n                    \"m\": 10,\n                    \"d\": \"-1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"+0000\",\n                \"t\": \"+0100\",\n                \"n\": \"WEST\",\n                \"s\": \"19700329T010000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"-1SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"Atlantic/Cape_Verde\",\n        {\n            \"s\": {\n                \"f\": \"-0100\",\n                \"n\": \"-01\"\n            }\n        }\n    ],\n    [\n        \"Atlantic/Faroe\",\n        {\n            \"s\": {\n                \"f\": \"+0100\",\n                \"t\": \"+0000\",\n                \"n\": \"WET\",\n                \"s\": \"19701025T020000\",\n                \"r\": {\n                    \"m\": 10,\n                    \"d\": \"-1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"+0000\",\n                \"t\": \"+0100\",\n                \"n\": \"WEST\",\n                \"s\": \"19700329T010000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"-1SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"Atlantic/Madeira\",\n        {\n            \"s\": {\n                \"f\": \"+0100\",\n                \"t\": \"+0000\",\n                \"n\": \"WET\",\n                \"s\": \"19701025T020000\",\n                \"r\": {\n                    \"m\": 10,\n                    \"d\": \"-1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"+0000\",\n                \"t\": \"+0100\",\n                \"n\": \"WEST\",\n                \"s\": \"19700329T010000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"-1SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"Atlantic/Reykjavik\",\n        {\n            \"s\": {\n                \"f\": \"+0000\",\n                \"n\": \"GMT\"\n            }\n        }\n    ],\n    [\n        \"Atlantic/South_Georgia\",\n        {\n            \"s\": {\n                \"f\": \"-0200\",\n                \"n\": \"-02\"\n            }\n        }\n    ],\n    [\n        \"Atlantic/St_Helena\",\n        {\n            \"s\": {\n                \"f\": \"+0000\",\n                \"n\": \"GMT\"\n            }\n        }\n    ],\n    [\n        \"Atlantic/Stanley\",\n        {\n            \"s\": {\n                \"f\": \"-0300\",\n                \"n\": \"-03\"\n            }\n        }\n    ],\n    [\n        \"Australia/Adelaide\",\n        {\n            \"s\": {\n                \"f\": \"+1030\",\n                \"t\": \"+0930\",\n                \"n\": \"ACST\",\n                \"s\": \"19700405T030000\",\n                \"r\": {\n                    \"m\": 4,\n                    \"d\": \"1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"+0930\",\n                \"t\": \"+1030\",\n                \"n\": \"ACDT\",\n                \"s\": \"19701004T020000\",\n                \"r\": {\n                    \"m\": 10,\n                    \"d\": \"1SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"Australia/Brisbane\",\n        {\n            \"s\": {\n                \"f\": \"+1000\",\n                \"n\": \"AEST\"\n            }\n        }\n    ],\n    [\n        \"Australia/Broken_Hill\",\n        {\n            \"s\": {\n                \"f\": \"+1030\",\n                \"t\": \"+0930\",\n                \"n\": \"ACST\",\n                \"s\": \"19700405T030000\",\n                \"r\": {\n                    \"m\": 4,\n                    \"d\": \"1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"+0930\",\n                \"t\": \"+1030\",\n                \"n\": \"ACDT\",\n                \"s\": \"19701004T020000\",\n                \"r\": {\n                    \"m\": 10,\n                    \"d\": \"1SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"Australia/Currie\",\n        {\n            \"s\": {\n                \"f\": \"+1100\",\n                \"t\": \"+1000\",\n                \"n\": \"AEST\",\n                \"s\": \"19700405T030000\",\n                \"r\": {\n                    \"m\": 4,\n                    \"d\": \"1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"+1000\",\n                \"t\": \"+1100\",\n                \"n\": \"AEDT\",\n                \"s\": \"19701004T020000\",\n                \"r\": {\n                    \"m\": 10,\n                    \"d\": \"1SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"Australia/Darwin\",\n        {\n            \"s\": {\n                \"f\": \"+0930\",\n                \"n\": \"ACST\"\n            }\n        }\n    ],\n    [\n        \"Australia/Eucla\",\n        {\n            \"s\": {\n                \"f\": \"+0845\",\n                \"n\": \"+0845\"\n            }\n        }\n    ],\n    [\n        \"Australia/Hobart\",\n        {\n            \"s\": {\n                \"f\": \"+1100\",\n                \"t\": \"+1000\",\n                \"n\": \"AEST\",\n                \"s\": \"19700405T030000\",\n                \"r\": {\n                    \"m\": 4,\n                    \"d\": \"1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"+1000\",\n                \"t\": \"+1100\",\n                \"n\": \"AEDT\",\n                \"s\": \"19701004T020000\",\n                \"r\": {\n                    \"m\": 10,\n                    \"d\": \"1SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"Australia/Lindeman\",\n        {\n            \"s\": {\n                \"f\": \"+1000\",\n                \"n\": \"AEST\"\n            }\n        }\n    ],\n    [\n        \"Australia/Lord_Howe\",\n        {\n            \"s\": {\n                \"f\": \"+1100\",\n                \"t\": \"+1030\",\n                \"n\": \"+1030\",\n                \"s\": \"19700405T020000\",\n                \"r\": {\n                    \"m\": 4,\n                    \"d\": \"1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"+1030\",\n                \"t\": \"+1100\",\n                \"n\": \"+11\",\n                \"s\": \"19701004T020000\",\n                \"r\": {\n                    \"m\": 10,\n                    \"d\": \"1SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"Australia/Melbourne\",\n        {\n            \"s\": {\n                \"f\": \"+1100\",\n                \"t\": \"+1000\",\n                \"n\": \"AEST\",\n                \"s\": \"19700405T030000\",\n                \"r\": {\n                    \"m\": 4,\n                    \"d\": \"1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"+1000\",\n                \"t\": \"+1100\",\n                \"n\": \"AEDT\",\n                \"s\": \"19701004T020000\",\n                \"r\": {\n                    \"m\": 10,\n                    \"d\": \"1SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"Australia/Perth\",\n        {\n            \"s\": {\n                \"f\": \"+0800\",\n                \"n\": \"AWST\"\n            }\n        }\n    ],\n    [\n        \"Australia/Sydney\",\n        {\n            \"s\": {\n                \"f\": \"+1100\",\n                \"t\": \"+1000\",\n                \"n\": \"AEST\",\n                \"s\": \"19700405T030000\",\n                \"r\": {\n                    \"m\": 4,\n                    \"d\": \"1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"+1000\",\n                \"t\": \"+1100\",\n                \"n\": \"AEDT\",\n                \"s\": \"19701004T020000\",\n                \"r\": {\n                    \"m\": 10,\n                    \"d\": \"1SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"Etc/GMT-0\",\n        {\n            \"s\": {\n                \"f\": \"+0000\",\n                \"n\": \"GMT\"\n            }\n        }\n    ],\n    [\n        \"Etc/GMT-1\",\n        {\n            \"s\": {\n                \"f\": \"-0100\",\n                \"n\": \"-01\"\n            }\n        }\n    ],\n    [\n        \"Etc/GMT-10\",\n        {\n            \"s\": {\n                \"f\": \"-1000\",\n                \"n\": \"-10\"\n            }\n        }\n    ],\n    [\n        \"Etc/GMT-11\",\n        {\n            \"s\": {\n                \"f\": \"-1100\",\n                \"n\": \"-11\"\n            }\n        }\n    ],\n    [\n        \"Etc/GMT-12\",\n        {\n            \"s\": {\n                \"f\": \"-1200\",\n                \"n\": \"-12\"\n            }\n        }\n    ],\n    [\n        \"Etc/GMT-2\",\n        {\n            \"s\": {\n                \"f\": \"-0200\",\n                \"n\": \"-02\"\n            }\n        }\n    ],\n    [\n        \"Etc/GMT-3\",\n        {\n            \"s\": {\n                \"f\": \"-0300\",\n                \"n\": \"-03\"\n            }\n        }\n    ],\n    [\n        \"Etc/GMT-4\",\n        {\n            \"s\": {\n                \"f\": \"-0400\",\n                \"n\": \"-04\"\n            }\n        }\n    ],\n    [\n        \"Etc/GMT-5\",\n        {\n            \"s\": {\n                \"f\": \"-0500\",\n                \"n\": \"-05\"\n            }\n        }\n    ],\n    [\n        \"Etc/GMT-6\",\n        {\n            \"s\": {\n                \"f\": \"-0600\",\n                \"n\": \"-06\"\n            }\n        }\n    ],\n    [\n        \"Etc/GMT-7\",\n        {\n            \"s\": {\n                \"f\": \"-0700\",\n                \"n\": \"-07\"\n            }\n        }\n    ],\n    [\n        \"Etc/GMT-8\",\n        {\n            \"s\": {\n                \"f\": \"-0800\",\n                \"n\": \"-08\"\n            }\n        }\n    ],\n    [\n        \"Etc/GMT-9\",\n        {\n            \"s\": {\n                \"f\": \"-0900\",\n                \"n\": \"-09\"\n            }\n        }\n    ],\n    [\n        \"Etc/GMT\",\n        {\n            \"s\": {\n                \"f\": \"+0000\",\n                \"n\": \"GMT\"\n            }\n        }\n    ],\n    [\n        \"Etc/GMT+0\",\n        {\n            \"s\": {\n                \"f\": \"+0000\",\n                \"n\": \"GMT\"\n            }\n        }\n    ],\n    [\n        \"Etc/GMT+1\",\n        {\n            \"s\": {\n                \"f\": \"+0100\",\n                \"n\": \"+01\"\n            }\n        }\n    ],\n    [\n        \"Etc/GMT+10\",\n        {\n            \"s\": {\n                \"f\": \"+1000\",\n                \"n\": \"+10\"\n            }\n        }\n    ],\n    [\n        \"Etc/GMT+11\",\n        {\n            \"s\": {\n                \"f\": \"+1100\",\n                \"n\": \"+11\"\n            }\n        }\n    ],\n    [\n        \"Etc/GMT+12\",\n        {\n            \"s\": {\n                \"f\": \"+1200\",\n                \"n\": \"+12\"\n            }\n        }\n    ],\n    [\n        \"Etc/GMT+13\",\n        {\n            \"s\": {\n                \"f\": \"+1300\",\n                \"n\": \"+13\"\n            }\n        }\n    ],\n    [\n        \"Etc/GMT+14\",\n        {\n            \"s\": {\n                \"f\": \"+1400\",\n                \"n\": \"+14\"\n            }\n        }\n    ],\n    [\n        \"Etc/GMT+2\",\n        {\n            \"s\": {\n                \"f\": \"+0200\",\n                \"n\": \"+02\"\n            }\n        }\n    ],\n    [\n        \"Etc/GMT+3\",\n        {\n            \"s\": {\n                \"f\": \"+0300\",\n                \"n\": \"+03\"\n            }\n        }\n    ],\n    [\n        \"Etc/GMT+4\",\n        {\n            \"s\": {\n                \"f\": \"+0400\",\n                \"n\": \"+04\"\n            }\n        }\n    ],\n    [\n        \"Etc/GMT+5\",\n        {\n            \"s\": {\n                \"f\": \"+0500\",\n                \"n\": \"+05\"\n            }\n        }\n    ],\n    [\n        \"Etc/GMT+6\",\n        {\n            \"s\": {\n                \"f\": \"+0600\",\n                \"n\": \"+06\"\n            }\n        }\n    ],\n    [\n        \"Etc/GMT+7\",\n        {\n            \"s\": {\n                \"f\": \"+0700\",\n                \"n\": \"+07\"\n            }\n        }\n    ],\n    [\n        \"Etc/GMT+8\",\n        {\n            \"s\": {\n                \"f\": \"+0800\",\n                \"n\": \"+08\"\n            }\n        }\n    ],\n    [\n        \"Etc/GMT+9\",\n        {\n            \"s\": {\n                \"f\": \"+0900\",\n                \"n\": \"+09\"\n            }\n        }\n    ],\n    [\n        \"Etc/GMT0\",\n        {\n            \"s\": {\n                \"f\": \"+0000\",\n                \"n\": \"GMT\"\n            }\n        }\n    ],\n    [\n        \"Etc/Greenwich\",\n        {\n            \"s\": {\n                \"f\": \"+0000\",\n                \"n\": \"GMT\"\n            }\n        }\n    ],\n    [\n        \"Etc/UCT\",\n        {\n            \"s\": {\n                \"f\": \"+0000\",\n                \"n\": \"UCT\"\n            }\n        }\n    ],\n    [\n        \"Etc/Universal\",\n        {\n            \"s\": {\n                \"f\": \"+0000\",\n                \"n\": \"UTC\"\n            }\n        }\n    ],\n    [\n        \"Etc/UTC\",\n        {\n            \"s\": {\n                \"f\": \"+0000\",\n                \"n\": \"UTC\"\n            }\n        }\n    ],\n    [\n        \"Etc/Zulu\",\n        {\n            \"s\": {\n                \"f\": \"+0000\",\n                \"n\": \"UTC\"\n            }\n        }\n    ],\n    [\n        \"Europe/Amsterdam\",\n        {\n            \"s\": {\n                \"f\": \"+0200\",\n                \"t\": \"+0100\",\n                \"n\": \"CET\",\n                \"s\": \"19701025T030000\",\n                \"r\": {\n                    \"m\": 10,\n                    \"d\": \"-1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"+0100\",\n                \"t\": \"+0200\",\n                \"n\": \"CEST\",\n                \"s\": \"19700329T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"-1SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"Europe/Andorra\",\n        {\n            \"s\": {\n                \"f\": \"+0200\",\n                \"t\": \"+0100\",\n                \"n\": \"CET\",\n                \"s\": \"19701025T030000\",\n                \"r\": {\n                    \"m\": 10,\n                    \"d\": \"-1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"+0100\",\n                \"t\": \"+0200\",\n                \"n\": \"CEST\",\n                \"s\": \"19700329T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"-1SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"Europe/Astrakhan\",\n        {\n            \"s\": {\n                \"f\": \"+0400\",\n                \"n\": \"+04\"\n            }\n        }\n    ],\n    [\n        \"Europe/Athens\",\n        {\n            \"s\": {\n                \"f\": \"+0300\",\n                \"t\": \"+0200\",\n                \"n\": \"EET\",\n                \"s\": \"19701025T040000\",\n                \"r\": {\n                    \"m\": 10,\n                    \"d\": \"-1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"+0200\",\n                \"t\": \"+0300\",\n                \"n\": \"EEST\",\n                \"s\": \"19700329T030000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"-1SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"Europe/Belgrade\",\n        {\n            \"s\": {\n                \"f\": \"+0200\",\n                \"t\": \"+0100\",\n                \"n\": \"CET\",\n                \"s\": \"19701025T030000\",\n                \"r\": {\n                    \"m\": 10,\n                    \"d\": \"-1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"+0100\",\n                \"t\": \"+0200\",\n                \"n\": \"CEST\",\n                \"s\": \"19700329T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"-1SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"Europe/Berlin\",\n        {\n            \"s\": {\n                \"f\": \"+0200\",\n                \"t\": \"+0100\",\n                \"n\": \"CET\",\n                \"s\": \"19701025T030000\",\n                \"r\": {\n                    \"m\": 10,\n                    \"d\": \"-1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"+0100\",\n                \"t\": \"+0200\",\n                \"n\": \"CEST\",\n                \"s\": \"19700329T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"-1SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"Europe/Bratislava\",\n        {\n            \"s\": {\n                \"f\": \"+0200\",\n                \"t\": \"+0100\",\n                \"n\": \"CET\",\n                \"s\": \"19701025T030000\",\n                \"r\": {\n                    \"m\": 10,\n                    \"d\": \"-1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"+0100\",\n                \"t\": \"+0200\",\n                \"n\": \"CEST\",\n                \"s\": \"19700329T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"-1SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"Europe/Brussels\",\n        {\n            \"s\": {\n                \"f\": \"+0200\",\n                \"t\": \"+0100\",\n                \"n\": \"CET\",\n                \"s\": \"19701025T030000\",\n                \"r\": {\n                    \"m\": 10,\n                    \"d\": \"-1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"+0100\",\n                \"t\": \"+0200\",\n                \"n\": \"CEST\",\n                \"s\": \"19700329T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"-1SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"Europe/Bucharest\",\n        {\n            \"s\": {\n                \"f\": \"+0300\",\n                \"t\": \"+0200\",\n                \"n\": \"EET\",\n                \"s\": \"19701025T040000\",\n                \"r\": {\n                    \"m\": 10,\n                    \"d\": \"-1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"+0200\",\n                \"t\": \"+0300\",\n                \"n\": \"EEST\",\n                \"s\": \"19700329T030000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"-1SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"Europe/Budapest\",\n        {\n            \"s\": {\n                \"f\": \"+0200\",\n                \"t\": \"+0100\",\n                \"n\": \"CET\",\n                \"s\": \"19701025T030000\",\n                \"r\": {\n                    \"m\": 10,\n                    \"d\": \"-1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"+0100\",\n                \"t\": \"+0200\",\n                \"n\": \"CEST\",\n                \"s\": \"19700329T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"-1SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"Europe/Busingen\",\n        {\n            \"s\": {\n                \"f\": \"+0200\",\n                \"t\": \"+0100\",\n                \"n\": \"CET\",\n                \"s\": \"19701025T030000\",\n                \"r\": {\n                    \"m\": 10,\n                    \"d\": \"-1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"+0100\",\n                \"t\": \"+0200\",\n                \"n\": \"CEST\",\n                \"s\": \"19700329T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"-1SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"Europe/Chisinau\",\n        {\n            \"s\": {\n                \"f\": \"+0300\",\n                \"t\": \"+0200\",\n                \"n\": \"EET\",\n                \"s\": \"19701025T030000\",\n                \"r\": {\n                    \"m\": 10,\n                    \"d\": \"-1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"+0200\",\n                \"t\": \"+0300\",\n                \"n\": \"EEST\",\n                \"s\": \"19700329T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"-1SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"Europe/Copenhagen\",\n        {\n            \"s\": {\n                \"f\": \"+0200\",\n                \"t\": \"+0100\",\n                \"n\": \"CET\",\n                \"s\": \"19701025T030000\",\n                \"r\": {\n                    \"m\": 10,\n                    \"d\": \"-1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"+0100\",\n                \"t\": \"+0200\",\n                \"n\": \"CEST\",\n                \"s\": \"19700329T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"-1SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"Europe/Dublin\",\n        {\n            \"s\": {\n                \"f\": \"+0100\",\n                \"t\": \"+0000\",\n                \"n\": \"GMT\",\n                \"s\": \"19701025T020000\",\n                \"r\": {\n                    \"m\": 10,\n                    \"d\": \"-1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"+0000\",\n                \"t\": \"+0100\",\n                \"n\": \"IST\",\n                \"s\": \"19700329T010000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"-1SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"Europe/Gibraltar\",\n        {\n            \"s\": {\n                \"f\": \"+0200\",\n                \"t\": \"+0100\",\n                \"n\": \"CET\",\n                \"s\": \"19701025T030000\",\n                \"r\": {\n                    \"m\": 10,\n                    \"d\": \"-1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"+0100\",\n                \"t\": \"+0200\",\n                \"n\": \"CEST\",\n                \"s\": \"19700329T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"-1SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"Europe/Guernsey\",\n        {\n            \"s\": {\n                \"f\": \"+0100\",\n                \"t\": \"+0000\",\n                \"n\": \"GMT\",\n                \"s\": \"19701025T020000\",\n                \"r\": {\n                    \"m\": 10,\n                    \"d\": \"-1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"+0000\",\n                \"t\": \"+0100\",\n                \"n\": \"BST\",\n                \"s\": \"19700329T010000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"-1SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"Europe/Helsinki\",\n        {\n            \"s\": {\n                \"f\": \"+0300\",\n                \"t\": \"+0200\",\n                \"n\": \"EET\",\n                \"s\": \"19701025T040000\",\n                \"r\": {\n                    \"m\": 10,\n                    \"d\": \"-1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"+0200\",\n                \"t\": \"+0300\",\n                \"n\": \"EEST\",\n                \"s\": \"19700329T030000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"-1SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"Europe/Isle_of_Man\",\n        {\n            \"s\": {\n                \"f\": \"+0100\",\n                \"t\": \"+0000\",\n                \"n\": \"GMT\",\n                \"s\": \"19701025T020000\",\n                \"r\": {\n                    \"m\": 10,\n                    \"d\": \"-1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"+0000\",\n                \"t\": \"+0100\",\n                \"n\": \"BST\",\n                \"s\": \"19700329T010000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"-1SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"Europe/Istanbul\",\n        {\n            \"s\": {\n                \"f\": \"+0300\",\n                \"n\": \"+03\"\n            }\n        }\n    ],\n    [\n        \"Europe/Jersey\",\n        {\n            \"s\": {\n                \"f\": \"+0100\",\n                \"t\": \"+0000\",\n                \"n\": \"GMT\",\n                \"s\": \"19701025T020000\",\n                \"r\": {\n                    \"m\": 10,\n                    \"d\": \"-1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"+0000\",\n                \"t\": \"+0100\",\n                \"n\": \"BST\",\n                \"s\": \"19700329T010000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"-1SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"Europe/Kaliningrad\",\n        {\n            \"s\": {\n                \"f\": \"+0200\",\n                \"n\": \"EET\"\n            }\n        }\n    ],\n    [\n        \"Europe/Kiev\",\n        {\n            \"s\": {\n                \"f\": \"+0300\",\n                \"t\": \"+0200\",\n                \"n\": \"EET\",\n                \"s\": \"19701025T040000\",\n                \"r\": {\n                    \"m\": 10,\n                    \"d\": \"-1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"+0200\",\n                \"t\": \"+0300\",\n                \"n\": \"EEST\",\n                \"s\": \"19700329T030000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"-1SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"Europe/Kirov\",\n        {\n            \"s\": {\n                \"f\": \"+0300\",\n                \"n\": \"+03\"\n            }\n        }\n    ],\n    [\n        \"Europe/Lisbon\",\n        {\n            \"s\": {\n                \"f\": \"+0100\",\n                \"t\": \"+0000\",\n                \"n\": \"WET\",\n                \"s\": \"19701025T020000\",\n                \"r\": {\n                    \"m\": 10,\n                    \"d\": \"-1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"+0000\",\n                \"t\": \"+0100\",\n                \"n\": \"WEST\",\n                \"s\": \"19700329T010000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"-1SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"Europe/Ljubljana\",\n        {\n            \"s\": {\n                \"f\": \"+0200\",\n                \"t\": \"+0100\",\n                \"n\": \"CET\",\n                \"s\": \"19701025T030000\",\n                \"r\": {\n                    \"m\": 10,\n                    \"d\": \"-1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"+0100\",\n                \"t\": \"+0200\",\n                \"n\": \"CEST\",\n                \"s\": \"19700329T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"-1SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"Europe/London\",\n        {\n            \"s\": {\n                \"f\": \"+0100\",\n                \"t\": \"+0000\",\n                \"n\": \"GMT\",\n                \"s\": \"19701025T020000\",\n                \"r\": {\n                    \"m\": 10,\n                    \"d\": \"-1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"+0000\",\n                \"t\": \"+0100\",\n                \"n\": \"BST\",\n                \"s\": \"19700329T010000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"-1SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"Europe/Luxembourg\",\n        {\n            \"s\": {\n                \"f\": \"+0200\",\n                \"t\": \"+0100\",\n                \"n\": \"CET\",\n                \"s\": \"19701025T030000\",\n                \"r\": {\n                    \"m\": 10,\n                    \"d\": \"-1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"+0100\",\n                \"t\": \"+0200\",\n                \"n\": \"CEST\",\n                \"s\": \"19700329T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"-1SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"Europe/Madrid\",\n        {\n            \"s\": {\n                \"f\": \"+0200\",\n                \"t\": \"+0100\",\n                \"n\": \"CET\",\n                \"s\": \"19701025T030000\",\n                \"r\": {\n                    \"m\": 10,\n                    \"d\": \"-1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"+0100\",\n                \"t\": \"+0200\",\n                \"n\": \"CEST\",\n                \"s\": \"19700329T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"-1SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"Europe/Malta\",\n        {\n            \"s\": {\n                \"f\": \"+0200\",\n                \"t\": \"+0100\",\n                \"n\": \"CET\",\n                \"s\": \"19701025T030000\",\n                \"r\": {\n                    \"m\": 10,\n                    \"d\": \"-1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"+0100\",\n                \"t\": \"+0200\",\n                \"n\": \"CEST\",\n                \"s\": \"19700329T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"-1SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"Europe/Mariehamn\",\n        {\n            \"s\": {\n                \"f\": \"+0300\",\n                \"t\": \"+0200\",\n                \"n\": \"EET\",\n                \"s\": \"19701025T040000\",\n                \"r\": {\n                    \"m\": 10,\n                    \"d\": \"-1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"+0200\",\n                \"t\": \"+0300\",\n                \"n\": \"EEST\",\n                \"s\": \"19700329T030000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"-1SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"Europe/Minsk\",\n        {\n            \"s\": {\n                \"f\": \"+0300\",\n                \"n\": \"+03\"\n            }\n        }\n    ],\n    [\n        \"Europe/Monaco\",\n        {\n            \"s\": {\n                \"f\": \"+0200\",\n                \"t\": \"+0100\",\n                \"n\": \"CET\",\n                \"s\": \"19701025T030000\",\n                \"r\": {\n                    \"m\": 10,\n                    \"d\": \"-1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"+0100\",\n                \"t\": \"+0200\",\n                \"n\": \"CEST\",\n                \"s\": \"19700329T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"-1SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"Europe/Moscow\",\n        {\n            \"s\": {\n                \"f\": \"+0300\",\n                \"n\": \"MSK\"\n            }\n        }\n    ],\n    [\n        \"Europe/Nicosia\",\n        {\n            \"s\": {\n                \"f\": \"+0300\",\n                \"t\": \"+0200\",\n                \"n\": \"EET\",\n                \"s\": \"19701025T040000\",\n                \"r\": {\n                    \"m\": 10,\n                    \"d\": \"-1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"+0200\",\n                \"t\": \"+0300\",\n                \"n\": \"EEST\",\n                \"s\": \"19700329T030000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"-1SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"Europe/Oslo\",\n        {\n            \"s\": {\n                \"f\": \"+0200\",\n                \"t\": \"+0100\",\n                \"n\": \"CET\",\n                \"s\": \"19701025T030000\",\n                \"r\": {\n                    \"m\": 10,\n                    \"d\": \"-1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"+0100\",\n                \"t\": \"+0200\",\n                \"n\": \"CEST\",\n                \"s\": \"19700329T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"-1SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"Europe/Paris\",\n        {\n            \"s\": {\n                \"f\": \"+0200\",\n                \"t\": \"+0100\",\n                \"n\": \"CET\",\n                \"s\": \"19701025T030000\",\n                \"r\": {\n                    \"m\": 10,\n                    \"d\": \"-1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"+0100\",\n                \"t\": \"+0200\",\n                \"n\": \"CEST\",\n                \"s\": \"19700329T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"-1SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"Europe/Podgorica\",\n        {\n            \"s\": {\n                \"f\": \"+0200\",\n                \"t\": \"+0100\",\n                \"n\": \"CET\",\n                \"s\": \"19701025T030000\",\n                \"r\": {\n                    \"m\": 10,\n                    \"d\": \"-1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"+0100\",\n                \"t\": \"+0200\",\n                \"n\": \"CEST\",\n                \"s\": \"19700329T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"-1SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"Europe/Prague\",\n        {\n            \"s\": {\n                \"f\": \"+0200\",\n                \"t\": \"+0100\",\n                \"n\": \"CET\",\n                \"s\": \"19701025T030000\",\n                \"r\": {\n                    \"m\": 10,\n                    \"d\": \"-1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"+0100\",\n                \"t\": \"+0200\",\n                \"n\": \"CEST\",\n                \"s\": \"19700329T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"-1SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"Europe/Riga\",\n        {\n            \"s\": {\n                \"f\": \"+0300\",\n                \"t\": \"+0200\",\n                \"n\": \"EET\",\n                \"s\": \"19701025T040000\",\n                \"r\": {\n                    \"m\": 10,\n                    \"d\": \"-1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"+0200\",\n                \"t\": \"+0300\",\n                \"n\": \"EEST\",\n                \"s\": \"19700329T030000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"-1SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"Europe/Rome\",\n        {\n            \"s\": {\n                \"f\": \"+0200\",\n                \"t\": \"+0100\",\n                \"n\": \"CET\",\n                \"s\": \"19701025T030000\",\n                \"r\": {\n                    \"m\": 10,\n                    \"d\": \"-1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"+0100\",\n                \"t\": \"+0200\",\n                \"n\": \"CEST\",\n                \"s\": \"19700329T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"-1SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"Europe/Samara\",\n        {\n            \"s\": {\n                \"f\": \"+0400\",\n                \"n\": \"+04\"\n            }\n        }\n    ],\n    [\n        \"Europe/San_Marino\",\n        {\n            \"s\": {\n                \"f\": \"+0200\",\n                \"t\": \"+0100\",\n                \"n\": \"CET\",\n                \"s\": \"19701025T030000\",\n                \"r\": {\n                    \"m\": 10,\n                    \"d\": \"-1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"+0100\",\n                \"t\": \"+0200\",\n                \"n\": \"CEST\",\n                \"s\": \"19700329T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"-1SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"Europe/Sarajevo\",\n        {\n            \"s\": {\n                \"f\": \"+0200\",\n                \"t\": \"+0100\",\n                \"n\": \"CET\",\n                \"s\": \"19701025T030000\",\n                \"r\": {\n                    \"m\": 10,\n                    \"d\": \"-1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"+0100\",\n                \"t\": \"+0200\",\n                \"n\": \"CEST\",\n                \"s\": \"19700329T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"-1SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"Europe/Saratov\",\n        {\n            \"s\": {\n                \"f\": \"+0400\",\n                \"n\": \"+04\"\n            }\n        }\n    ],\n    [\n        \"Europe/Simferopol\",\n        {\n            \"s\": {\n                \"f\": \"+0300\",\n                \"n\": \"MSK\"\n            }\n        }\n    ],\n    [\n        \"Europe/Skopje\",\n        {\n            \"s\": {\n                \"f\": \"+0200\",\n                \"t\": \"+0100\",\n                \"n\": \"CET\",\n                \"s\": \"19701025T030000\",\n                \"r\": {\n                    \"m\": 10,\n                    \"d\": \"-1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"+0100\",\n                \"t\": \"+0200\",\n                \"n\": \"CEST\",\n                \"s\": \"19700329T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"-1SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"Europe/Sofia\",\n        {\n            \"s\": {\n                \"f\": \"+0300\",\n                \"t\": \"+0200\",\n                \"n\": \"EET\",\n                \"s\": \"19701025T040000\",\n                \"r\": {\n                    \"m\": 10,\n                    \"d\": \"-1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"+0200\",\n                \"t\": \"+0300\",\n                \"n\": \"EEST\",\n                \"s\": \"19700329T030000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"-1SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"Europe/Stockholm\",\n        {\n            \"s\": {\n                \"f\": \"+0200\",\n                \"t\": \"+0100\",\n                \"n\": \"CET\",\n                \"s\": \"19701025T030000\",\n                \"r\": {\n                    \"m\": 10,\n                    \"d\": \"-1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"+0100\",\n                \"t\": \"+0200\",\n                \"n\": \"CEST\",\n                \"s\": \"19700329T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"-1SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"Europe/Tallinn\",\n        {\n            \"s\": {\n                \"f\": \"+0300\",\n                \"t\": \"+0200\",\n                \"n\": \"EET\",\n                \"s\": \"19701025T040000\",\n                \"r\": {\n                    \"m\": 10,\n                    \"d\": \"-1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"+0200\",\n                \"t\": \"+0300\",\n                \"n\": \"EEST\",\n                \"s\": \"19700329T030000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"-1SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"Europe/Tirane\",\n        {\n            \"s\": {\n                \"f\": \"+0200\",\n                \"t\": \"+0100\",\n                \"n\": \"CET\",\n                \"s\": \"19701025T030000\",\n                \"r\": {\n                    \"m\": 10,\n                    \"d\": \"-1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"+0100\",\n                \"t\": \"+0200\",\n                \"n\": \"CEST\",\n                \"s\": \"19700329T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"-1SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"Europe/Ulyanovsk\",\n        {\n            \"s\": {\n                \"f\": \"+0400\",\n                \"n\": \"+04\"\n            }\n        }\n    ],\n    [\n        \"Europe/Uzhgorod\",\n        {\n            \"s\": {\n                \"f\": \"+0300\",\n                \"t\": \"+0200\",\n                \"n\": \"EET\",\n                \"s\": \"19701025T040000\",\n                \"r\": {\n                    \"m\": 10,\n                    \"d\": \"-1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"+0200\",\n                \"t\": \"+0300\",\n                \"n\": \"EEST\",\n                \"s\": \"19700329T030000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"-1SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"Europe/Vaduz\",\n        {\n            \"s\": {\n                \"f\": \"+0200\",\n                \"t\": \"+0100\",\n                \"n\": \"CET\",\n                \"s\": \"19701025T030000\",\n                \"r\": {\n                    \"m\": 10,\n                    \"d\": \"-1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"+0100\",\n                \"t\": \"+0200\",\n                \"n\": \"CEST\",\n                \"s\": \"19700329T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"-1SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"Europe/Vatican\",\n        {\n            \"s\": {\n                \"f\": \"+0200\",\n                \"t\": \"+0100\",\n                \"n\": \"CET\",\n                \"s\": \"19701025T030000\",\n                \"r\": {\n                    \"m\": 10,\n                    \"d\": \"-1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"+0100\",\n                \"t\": \"+0200\",\n                \"n\": \"CEST\",\n                \"s\": \"19700329T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"-1SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"Europe/Vienna\",\n        {\n            \"s\": {\n                \"f\": \"+0200\",\n                \"t\": \"+0100\",\n                \"n\": \"CET\",\n                \"s\": \"19701025T030000\",\n                \"r\": {\n                    \"m\": 10,\n                    \"d\": \"-1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"+0100\",\n                \"t\": \"+0200\",\n                \"n\": \"CEST\",\n                \"s\": \"19700329T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"-1SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"Europe/Vilnius\",\n        {\n            \"s\": {\n                \"f\": \"+0300\",\n                \"t\": \"+0200\",\n                \"n\": \"EET\",\n                \"s\": \"19701025T040000\",\n                \"r\": {\n                    \"m\": 10,\n                    \"d\": \"-1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"+0200\",\n                \"t\": \"+0300\",\n                \"n\": \"EEST\",\n                \"s\": \"19700329T030000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"-1SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"Europe/Volgograd\",\n        {\n            \"s\": {\n                \"f\": \"+0400\",\n                \"n\": \"+04\"\n            }\n        }\n    ],\n    [\n        \"Europe/Warsaw\",\n        {\n            \"s\": {\n                \"f\": \"+0200\",\n                \"t\": \"+0100\",\n                \"n\": \"CET\",\n                \"s\": \"19701025T030000\",\n                \"r\": {\n                    \"m\": 10,\n                    \"d\": \"-1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"+0100\",\n                \"t\": \"+0200\",\n                \"n\": \"CEST\",\n                \"s\": \"19700329T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"-1SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"Europe/Zagreb\",\n        {\n            \"s\": {\n                \"f\": \"+0200\",\n                \"t\": \"+0100\",\n                \"n\": \"CET\",\n                \"s\": \"19701025T030000\",\n                \"r\": {\n                    \"m\": 10,\n                    \"d\": \"-1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"+0100\",\n                \"t\": \"+0200\",\n                \"n\": \"CEST\",\n                \"s\": \"19700329T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"-1SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"Europe/Zaporozhye\",\n        {\n            \"s\": {\n                \"f\": \"+0300\",\n                \"t\": \"+0200\",\n                \"n\": \"EET\",\n                \"s\": \"19701025T040000\",\n                \"r\": {\n                    \"m\": 10,\n                    \"d\": \"-1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"+0200\",\n                \"t\": \"+0300\",\n                \"n\": \"EEST\",\n                \"s\": \"19700329T030000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"-1SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"Europe/Zurich\",\n        {\n            \"s\": {\n                \"f\": \"+0200\",\n                \"t\": \"+0100\",\n                \"n\": \"CET\",\n                \"s\": \"19701025T030000\",\n                \"r\": {\n                    \"m\": 10,\n                    \"d\": \"-1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"+0100\",\n                \"t\": \"+0200\",\n                \"n\": \"CEST\",\n                \"s\": \"19700329T020000\",\n                \"r\": {\n                    \"m\": 3,\n                    \"d\": \"-1SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"Indian/Antananarivo\",\n        {\n            \"s\": {\n                \"f\": \"+0300\",\n                \"n\": \"EAT\"\n            }\n        }\n    ],\n    [\n        \"Indian/Chagos\",\n        {\n            \"s\": {\n                \"f\": \"+0600\",\n                \"n\": \"+06\"\n            }\n        }\n    ],\n    [\n        \"Indian/Christmas\",\n        {\n            \"s\": {\n                \"f\": \"+0700\",\n                \"n\": \"+07\"\n            }\n        }\n    ],\n    [\n        \"Indian/Cocos\",\n        {\n            \"s\": {\n                \"f\": \"+0630\",\n                \"n\": \"+0630\"\n            }\n        }\n    ],\n    [\n        \"Indian/Comoro\",\n        {\n            \"s\": {\n                \"f\": \"+0300\",\n                \"n\": \"EAT\"\n            }\n        }\n    ],\n    [\n        \"Indian/Kerguelen\",\n        {\n            \"s\": {\n                \"f\": \"+0500\",\n                \"n\": \"+05\"\n            }\n        }\n    ],\n    [\n        \"Indian/Mahe\",\n        {\n            \"s\": {\n                \"f\": \"+0400\",\n                \"n\": \"+04\"\n            }\n        }\n    ],\n    [\n        \"Indian/Maldives\",\n        {\n            \"s\": {\n                \"f\": \"+0500\",\n                \"n\": \"+05\"\n            }\n        }\n    ],\n    [\n        \"Indian/Mauritius\",\n        {\n            \"s\": {\n                \"f\": \"+0400\",\n                \"n\": \"+04\"\n            }\n        }\n    ],\n    [\n        \"Indian/Mayotte\",\n        {\n            \"s\": {\n                \"f\": \"+0300\",\n                \"n\": \"EAT\"\n            }\n        }\n    ],\n    [\n        \"Indian/Reunion\",\n        {\n            \"s\": {\n                \"f\": \"+0400\",\n                \"n\": \"+04\"\n            }\n        }\n    ],\n    [\n        \"Pacific/Apia\",\n        {\n            \"s\": {\n                \"f\": \"+1400\",\n                \"t\": \"+1300\",\n                \"n\": \"+13\",\n                \"s\": \"19700405T040000\",\n                \"r\": {\n                    \"m\": 4,\n                    \"d\": \"1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"+1300\",\n                \"t\": \"+1400\",\n                \"n\": \"+14\",\n                \"s\": \"19700927T030000\",\n                \"r\": {\n                    \"m\": 9,\n                    \"d\": \"-1SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"Pacific/Auckland\",\n        {\n            \"s\": {\n                \"f\": \"+1300\",\n                \"t\": \"+1200\",\n                \"n\": \"NZST\",\n                \"s\": \"19700405T030000\",\n                \"r\": {\n                    \"m\": 4,\n                    \"d\": \"1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"+1200\",\n                \"t\": \"+1300\",\n                \"n\": \"NZDT\",\n                \"s\": \"19700927T020000\",\n                \"r\": {\n                    \"m\": 9,\n                    \"d\": \"-1SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"Pacific/Bougainville\",\n        {\n            \"s\": {\n                \"f\": \"+1100\",\n                \"n\": \"+11\"\n            }\n        }\n    ],\n    [\n        \"Pacific/Chatham\",\n        {\n            \"s\": {\n                \"f\": \"+1345\",\n                \"t\": \"+1245\",\n                \"n\": \"+1245\",\n                \"s\": \"19700405T034500\",\n                \"r\": {\n                    \"m\": 4,\n                    \"d\": \"1SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"+1245\",\n                \"t\": \"+1345\",\n                \"n\": \"+1345\",\n                \"s\": \"19700927T024500\",\n                \"r\": {\n                    \"m\": 9,\n                    \"d\": \"-1SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"Pacific/Chuuk\",\n        {\n            \"s\": {\n                \"f\": \"+1000\",\n                \"n\": \"+10\"\n            }\n        }\n    ],\n    [\n        \"Pacific/Easter\",\n        {\n            \"s\": {\n                \"f\": \"-0500\",\n                \"t\": \"-0600\",\n                \"n\": \"-06\",\n                \"s\": \"19700404T220000\",\n                \"r\": {\n                    \"m\": 4,\n                    \"d\": \"1SA\"\n                }\n            },\n            \"d\": {\n                \"f\": \"-0600\",\n                \"t\": \"-0500\",\n                \"n\": \"-05\",\n                \"s\": \"19700905T220000\",\n                \"r\": {\n                    \"m\": 9,\n                    \"d\": \"1SA\"\n                }\n            }\n        }\n    ],\n    [\n        \"Pacific/Efate\",\n        {\n            \"s\": {\n                \"f\": \"+1100\",\n                \"n\": \"+11\"\n            }\n        }\n    ],\n    [\n        \"Pacific/Enderbury\",\n        {\n            \"s\": {\n                \"f\": \"+1300\",\n                \"n\": \"+13\"\n            }\n        }\n    ],\n    [\n        \"Pacific/Fakaofo\",\n        {\n            \"s\": {\n                \"f\": \"+1300\",\n                \"n\": \"+13\"\n            }\n        }\n    ],\n    [\n        \"Pacific/Fiji\",\n        {\n            \"s\": {\n                \"f\": \"+1300\",\n                \"t\": \"+1200\",\n                \"n\": \"+12\",\n                \"s\": \"19700118T030000\",\n                \"r\": {\n                    \"m\": 1,\n                    \"d\": \"-2SU\"\n                }\n            },\n            \"d\": {\n                \"f\": \"+1200\",\n                \"t\": \"+1300\",\n                \"n\": \"+13\",\n                \"s\": \"19701101T020000\",\n                \"r\": {\n                    \"m\": 11,\n                    \"d\": \"1SU\"\n                }\n            }\n        }\n    ],\n    [\n        \"Pacific/Funafuti\",\n        {\n            \"s\": {\n                \"f\": \"+1200\",\n                \"n\": \"+12\"\n            }\n        }\n    ],\n    [\n        \"Pacific/Galapagos\",\n        {\n            \"s\": {\n                \"f\": \"-0600\",\n                \"n\": \"-06\"\n            }\n        }\n    ],\n    [\n        \"Pacific/Gambier\",\n        {\n            \"s\": {\n                \"f\": \"-0900\",\n                \"n\": \"-09\"\n            }\n        }\n    ],\n    [\n        \"Pacific/Guadalcanal\",\n        {\n            \"s\": {\n                \"f\": \"+1100\",\n                \"n\": \"+11\"\n            }\n        }\n    ],\n    [\n        \"Pacific/Guam\",\n        {\n            \"s\": {\n                \"f\": \"+1000\",\n                \"n\": \"ChST\"\n            }\n        }\n    ],\n    [\n        \"Pacific/Honolulu\",\n        {\n            \"s\": {\n                \"f\": \"-1000\",\n                \"n\": \"HST\"\n            }\n        }\n    ],\n    [\n        \"Pacific/Kiritimati\",\n        {\n            \"s\": {\n                \"f\": \"+1400\",\n                \"n\": \"+14\"\n            }\n        }\n    ],\n    [\n        \"Pacific/Kosrae\",\n        {\n            \"s\": {\n                \"f\": \"+1100\",\n                \"n\": \"+11\"\n            }\n        }\n    ],\n    [\n        \"Pacific/Kwajalein\",\n        {\n            \"s\": {\n                \"f\": \"+1200\",\n                \"n\": \"+12\"\n            }\n        }\n    ],\n    [\n        \"Pacific/Majuro\",\n        {\n            \"s\": {\n                \"f\": \"+1200\",\n                \"n\": \"+12\"\n            }\n        }\n    ],\n    [\n        \"Pacific/Marquesas\",\n        {\n            \"s\": {\n                \"f\": \"-0930\",\n                \"n\": \"-0930\"\n            }\n        }\n    ],\n    [\n        \"Pacific/Midway\",\n        {\n            \"s\": {\n                \"f\": \"-1100\",\n                \"n\": \"SST\"\n            }\n        }\n    ],\n    [\n        \"Pacific/Nauru\",\n        {\n            \"s\": {\n                \"f\": \"+1200\",\n                \"n\": \"+12\"\n            }\n        }\n    ],\n    [\n        \"Pacific/Niue\",\n        {\n            \"s\": {\n                \"f\": \"-1100\",\n                \"n\": \"-11\"\n            }\n        }\n    ],\n    [\n        \"Pacific/Norfolk\",\n        {\n            \"s\": {\n                \"f\": \"+1100\",\n                \"n\": \"+11\"\n            }\n        }\n    ],\n    [\n        \"Pacific/Noumea\",\n        {\n            \"s\": {\n                \"f\": \"+1100\",\n                \"n\": \"+11\"\n            }\n        }\n    ],\n    [\n        \"Pacific/Pago_Pago\",\n        {\n            \"s\": {\n                \"f\": \"-1100\",\n                \"n\": \"SST\"\n            }\n        }\n    ],\n    [\n        \"Pacific/Palau\",\n        {\n            \"s\": {\n                \"f\": \"+0900\",\n                \"n\": \"+09\"\n            }\n        }\n    ],\n    [\n        \"Pacific/Pitcairn\",\n        {\n            \"s\": {\n                \"f\": \"-0800\",\n                \"n\": \"-08\"\n            }\n        }\n    ],\n    [\n        \"Pacific/Pohnpei\",\n        {\n            \"s\": {\n                \"f\": \"+1100\",\n                \"n\": \"+11\"\n            }\n        }\n    ],\n    [\n        \"Pacific/Port_Moresby\",\n        {\n            \"s\": {\n                \"f\": \"+1000\",\n                \"n\": \"+10\"\n            }\n        }\n    ],\n    [\n        \"Pacific/Rarotonga\",\n        {\n            \"s\": {\n                \"f\": \"-1000\",\n                \"n\": \"-10\"\n            }\n        }\n    ],\n    [\n        \"Pacific/Saipan\",\n        {\n            \"s\": {\n                \"f\": \"+1000\",\n                \"n\": \"ChST\"\n            }\n        }\n    ],\n    [\n        \"Pacific/Tahiti\",\n        {\n            \"s\": {\n                \"f\": \"-1000\",\n                \"n\": \"-10\"\n            }\n        }\n    ],\n    [\n        \"Pacific/Tarawa\",\n        {\n            \"s\": {\n                \"f\": \"+1200\",\n                \"n\": \"+12\"\n            }\n        }\n    ],\n    [\n        \"Pacific/Tongatapu\",\n        {\n            \"s\": {\n                \"f\": \"+1300\",\n                \"n\": \"+13\"\n            }\n        }\n    ],\n    [\n        \"Pacific/Wake\",\n        {\n            \"s\": {\n                \"f\": \"+1200\",\n                \"n\": \"+12\"\n            }\n        }\n    ],\n    [\n        \"Pacific/Wallis\",\n        {\n            \"s\": {\n                \"f\": \"+1200\",\n                \"n\": \"+12\"\n            }\n        }\n    ]\n]);\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getZoneString = exports.getZoneLines = void 0;\nconst zones_1 = require(\"./zones\"); // This module must be generated with `yarn run build-zones`.\nfunction renderZoneSub(data) {\n    const { n, f, t, r, s } = data;\n    return [\n        `TZNAME:${n}`,\n        `TZOFFSETFROM:${f}`,\n        `TZOFFSETTO:${t || f}`,\n        `DTSTART:${s || zones_1.defaultStart}`,\n        ...(r ? [`RRULE:FREQ=${r.f || 'YEARLY'};BYMONTH=${r.m};BYDAY=${r.d}`] : []),\n    ];\n}\n/**\n * Tries to resolve a given time zone to iCalendar time zone component\n * (`VTIMEZONE`) as string array (usually for further processing).\n * @param zoneName Time zone name (e.g. `America/Los_Angeles`)\n * @param includeWrapper Set to `false` to avoid including lines for\n * `BEGIN:VTIMEZONE` and `END:VTIMEZONE`.\n * @returns Lines of the iCalendar time zone component (`VTIMEZONE`), each line\n * individually as an array of strings.\n */\nfunction getZoneLines(zoneName, includeWrapper = true) {\n    const zoneData = zones_1.zonesMap.get(zoneName);\n    if (zoneData) {\n        const { s, d } = zoneData;\n        const lines = [\n            ...(includeWrapper ? ['BEGIN:VTIMEZONE'] : []),\n            `TZID:${zoneName}`,\n            // `X-LIC-LOCATION:${zoneName}`, // Who uses this?\n            'BEGIN:STANDARD',\n            ...renderZoneSub(s),\n            'END:STANDARD',\n            ...(d ? [\n                'BEGIN:DAYLIGHT',\n                ...renderZoneSub(d),\n                'END:DAYLIGHT',\n            ] : []),\n            ...(includeWrapper ? ['END:VTIMEZONE'] : []),\n        ];\n        return lines;\n    }\n}\nexports.getZoneLines = getZoneLines;\n/**\n * Tries to resolve a given time zone to iCalendar time zone component\n * (`VTIMEZONE`) as string.\n * @param zoneName Time zone name (e.g. `America/Los_Angeles`)\n * @param includeWrapper Set to `false` to avoid including lines for\n * `BEGIN:VTIMEZONE` and `END:VTIMEZONE`.\n * @returns The iCalendar time zone component (`VTIMEZONE`) as string\n * with `\\r\\n` line breaks.\n */\nfunction getZoneString(zoneName, includeWrapper = true) {\n    const lines = getZoneLines(zoneName, includeWrapper);\n    return lines === null || lines === void 0 ? void 0 : lines.join('\\r\\n');\n}\nexports.getZoneString = getZoneString;\n","/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/.\n * Portions Copyright (C) Philipp Kewisch */\n\n/**\n * Represents the BINARY value type, which contains extra methods for encoding and decoding.\n *\n * @memberof ICAL\n */\nclass Binary {\n  /**\n   * Creates a binary value from the given string.\n   *\n   * @param {String} aString        The binary value string\n   * @return {Binary}               The binary value instance\n   */\n  static fromString(aString) {\n    return new Binary(aString);\n  }\n\n  /**\n   * Creates a new ICAL.Binary instance\n   *\n   * @param {String} aValue     The binary data for this value\n   */\n  constructor(aValue) {\n    this.value = aValue;\n  }\n\n  /**\n   * The type name, to be used in the jCal object.\n   * @default \"binary\"\n   * @constant\n   */\n  icaltype = \"binary\";\n\n  /**\n   * Base64 decode the current value\n   *\n   * @return {String}         The base64-decoded value\n   */\n  decodeValue() {\n    return this._b64_decode(this.value);\n  }\n\n  /**\n   * Encodes the passed parameter with base64 and sets the internal\n   * value to the result.\n   *\n   * @param {String} aValue      The raw binary value to encode\n   */\n  setEncodedValue(aValue) {\n    this.value = this._b64_encode(aValue);\n  }\n\n  _b64_encode(data) {\n    // http://kevin.vanzonneveld.net\n    // +   original by: Tyler Akins (http://rumkin.com)\n    // +   improved by: Bayron Guevara\n    // +   improved by: Thunder.m\n    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)\n    // +   bugfixed by: Pellentesque Malesuada\n    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)\n    // +   improved by: Rafał Kukawski (http://kukawski.pl)\n    // *     example 1: base64_encode('Kevin van Zonneveld');\n    // *     returns 1: 'S2V2aW4gdmFuIFpvbm5ldmVsZA=='\n    // mozilla has this native\n    // - but breaks in 2.0.0.12!\n    //if (typeof this.window['atob'] == 'function') {\n    //    return atob(data);\n    //}\n    let b64 = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\" +\n              \"abcdefghijklmnopqrstuvwxyz0123456789+/=\";\n    let o1, o2, o3, h1, h2, h3, h4, bits, i = 0,\n      ac = 0,\n      enc = \"\",\n      tmp_arr = [];\n\n    if (!data) {\n      return data;\n    }\n\n    do { // pack three octets into four hexets\n      o1 = data.charCodeAt(i++);\n      o2 = data.charCodeAt(i++);\n      o3 = data.charCodeAt(i++);\n\n      bits = o1 << 16 | o2 << 8 | o3;\n\n      h1 = bits >> 18 & 0x3f;\n      h2 = bits >> 12 & 0x3f;\n      h3 = bits >> 6 & 0x3f;\n      h4 = bits & 0x3f;\n\n      // use hexets to index into b64, and append result to encoded string\n      tmp_arr[ac++] = b64.charAt(h1) + b64.charAt(h2) + b64.charAt(h3) + b64.charAt(h4);\n    } while (i < data.length);\n\n    enc = tmp_arr.join('');\n\n    let r = data.length % 3;\n\n    return (r ? enc.slice(0, r - 3) : enc) + '==='.slice(r || 3);\n\n  }\n\n  _b64_decode(data) {\n    // http://kevin.vanzonneveld.net\n    // +   original by: Tyler Akins (http://rumkin.com)\n    // +   improved by: Thunder.m\n    // +      input by: Aman Gupta\n    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)\n    // +   bugfixed by: Onno Marsman\n    // +   bugfixed by: Pellentesque Malesuada\n    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)\n    // +      input by: Brett Zamir (http://brett-zamir.me)\n    // +   bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)\n    // *     example 1: base64_decode('S2V2aW4gdmFuIFpvbm5ldmVsZA==');\n    // *     returns 1: 'Kevin van Zonneveld'\n    // mozilla has this native\n    // - but breaks in 2.0.0.12!\n    //if (typeof this.window['btoa'] == 'function') {\n    //    return btoa(data);\n    //}\n    let b64 = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\" +\n              \"abcdefghijklmnopqrstuvwxyz0123456789+/=\";\n    let o1, o2, o3, h1, h2, h3, h4, bits, i = 0,\n      ac = 0,\n      dec = \"\",\n      tmp_arr = [];\n\n    if (!data) {\n      return data;\n    }\n\n    data += '';\n\n    do { // unpack four hexets into three octets using index points in b64\n      h1 = b64.indexOf(data.charAt(i++));\n      h2 = b64.indexOf(data.charAt(i++));\n      h3 = b64.indexOf(data.charAt(i++));\n      h4 = b64.indexOf(data.charAt(i++));\n\n      bits = h1 << 18 | h2 << 12 | h3 << 6 | h4;\n\n      o1 = bits >> 16 & 0xff;\n      o2 = bits >> 8 & 0xff;\n      o3 = bits & 0xff;\n\n      if (h3 == 64) {\n        tmp_arr[ac++] = String.fromCharCode(o1);\n      } else if (h4 == 64) {\n        tmp_arr[ac++] = String.fromCharCode(o1, o2);\n      } else {\n        tmp_arr[ac++] = String.fromCharCode(o1, o2, o3);\n      }\n    } while (i < data.length);\n\n    dec = tmp_arr.join('');\n\n    return dec;\n  }\n\n  /**\n   * The string representation of this value\n   * @return {String}\n   */\n  toString() {\n    return this.value;\n  }\n}\n\n/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/.\n * Portions Copyright (C) Philipp Kewisch */\n\n\nconst DURATION_LETTERS = /([PDWHMTS]{1,1})/;\nconst DATA_PROPS_TO_COPY = [\"weeks\", \"days\", \"hours\", \"minutes\", \"seconds\", \"isNegative\"];\n\n/**\n * This class represents the \"duration\" value type, with various calculation\n * and manipulation methods.\n *\n * @memberof ICAL\n */\nclass Duration {\n  /**\n   * Returns a new ICAL.Duration instance from the passed seconds value.\n   *\n   * @param {Number} aSeconds       The seconds to create the instance from\n   * @return {Duration}             The newly created duration instance\n   */\n  static fromSeconds(aSeconds) {\n    return (new Duration()).fromSeconds(aSeconds);\n  }\n\n  /**\n   * Checks if the given string is an iCalendar duration value.\n   *\n   * @param {String} value      The raw ical value\n   * @return {Boolean}          True, if the given value is of the\n   *                              duration ical type\n   */\n  static isValueString(string) {\n    return (string[0] === 'P' || string[1] === 'P');\n  }\n\n  /**\n   * Creates a new {@link ICAL.Duration} instance from the passed string.\n   *\n   * @param {String} aStr       The string to parse\n   * @return {Duration}         The created duration instance\n   */\n  static fromString(aStr) {\n    let pos = 0;\n    let dict = Object.create(null);\n    let chunks = 0;\n\n    while ((pos = aStr.search(DURATION_LETTERS)) !== -1) {\n      let type = aStr[pos];\n      let numeric = aStr.slice(0, Math.max(0, pos));\n      aStr = aStr.slice(pos + 1);\n\n      chunks += parseDurationChunk(type, numeric, dict);\n    }\n\n    if (chunks < 2) {\n      // There must be at least a chunk with \"P\" and some unit chunk\n      throw new Error(\n        'invalid duration value: Not enough duration components in \"' + aStr + '\"'\n      );\n    }\n\n    return new Duration(dict);\n  }\n\n  /**\n   * Creates a new ICAL.Duration instance from the given data object.\n   *\n   * @param {Object} aData                An object with members of the duration\n   * @param {Number=} aData.weeks         Duration in weeks\n   * @param {Number=} aData.days          Duration in days\n   * @param {Number=} aData.hours         Duration in hours\n   * @param {Number=} aData.minutes       Duration in minutes\n   * @param {Number=} aData.seconds       Duration in seconds\n   * @param {Boolean=} aData.isNegative   If true, the duration is negative\n   * @return {Duration}                   The createad duration instance\n   */\n  static fromData(aData) {\n    return new Duration(aData);\n  }\n\n  /**\n   * Creates a new ICAL.Duration instance.\n   *\n   * @param {Object} data                 An object with members of the duration\n   * @param {Number=} data.weeks          Duration in weeks\n   * @param {Number=} data.days           Duration in days\n   * @param {Number=} data.hours          Duration in hours\n   * @param {Number=} data.minutes        Duration in minutes\n   * @param {Number=} data.seconds        Duration in seconds\n   * @param {Boolean=} data.isNegative    If true, the duration is negative\n   */\n  constructor(data) {\n    this.wrappedJSObject = this;\n    this.fromData(data);\n  }\n\n  /**\n   * The weeks in this duration\n   * @type {Number}\n   * @default 0\n   */\n  weeks = 0;\n\n  /**\n   * The days in this duration\n   * @type {Number}\n   * @default 0\n   */\n  days = 0;\n\n  /**\n   * The days in this duration\n   * @type {Number}\n   * @default 0\n   */\n  hours = 0;\n\n  /**\n   * The minutes in this duration\n   * @type {Number}\n   * @default 0\n   */\n  minutes = 0;\n\n  /**\n   * The seconds in this duration\n   * @type {Number}\n   * @default 0\n   */\n  seconds = 0;\n\n  /**\n   * The seconds in this duration\n   * @type {Boolean}\n   * @default false\n   */\n  isNegative = false;\n\n  /**\n   * The class identifier.\n   * @constant\n   * @type {String}\n   * @default \"icalduration\"\n   */\n  icalclass = \"icalduration\";\n\n  /**\n   * The type name, to be used in the jCal object.\n   * @constant\n   * @type {String}\n   * @default \"duration\"\n   */\n  icaltype = \"duration\";\n\n  /**\n   * Returns a clone of the duration object.\n   *\n   * @return {Duration}      The cloned object\n   */\n  clone() {\n    return Duration.fromData(this);\n  }\n\n  /**\n   * The duration value expressed as a number of seconds.\n   *\n   * @return {Number}             The duration value in seconds\n   */\n  toSeconds() {\n    let seconds = this.seconds + 60 * this.minutes + 3600 * this.hours +\n                  86400 * this.days + 7 * 86400 * this.weeks;\n    return (this.isNegative ? -seconds : seconds);\n  }\n\n  /**\n   * Reads the passed seconds value into this duration object. Afterwards,\n   * members like {@link ICAL.Duration#days days} and {@link ICAL.Duration#weeks weeks} will be set up\n   * accordingly.\n   *\n   * @param {Number} aSeconds     The duration value in seconds\n   * @return {Duration}           Returns this instance\n   */\n  fromSeconds(aSeconds) {\n    let secs = Math.abs(aSeconds);\n\n    this.isNegative = (aSeconds < 0);\n    this.days = trunc(secs / 86400);\n\n    // If we have a flat number of weeks, use them.\n    if (this.days % 7 == 0) {\n      this.weeks = this.days / 7;\n      this.days = 0;\n    } else {\n      this.weeks = 0;\n    }\n\n    secs -= (this.days + 7 * this.weeks) * 86400;\n\n    this.hours = trunc(secs / 3600);\n    secs -= this.hours * 3600;\n\n    this.minutes = trunc(secs / 60);\n    secs -= this.minutes * 60;\n\n    this.seconds = secs;\n    return this;\n  }\n\n  /**\n   * Sets up the current instance using members from the passed data object.\n   *\n   * @param {Object} aData                An object with members of the duration\n   * @param {Number=} aData.weeks         Duration in weeks\n   * @param {Number=} aData.days          Duration in days\n   * @param {Number=} aData.hours         Duration in hours\n   * @param {Number=} aData.minutes       Duration in minutes\n   * @param {Number=} aData.seconds       Duration in seconds\n   * @param {Boolean=} aData.isNegative   If true, the duration is negative\n   */\n  fromData(aData) {\n    for (let prop of DATA_PROPS_TO_COPY) {\n      if (aData && prop in aData) {\n        this[prop] = aData[prop];\n      } else {\n        this[prop] = 0;\n      }\n    }\n  }\n\n  /**\n   * Resets the duration instance to the default values, i.e. PT0S\n   */\n  reset() {\n    this.isNegative = false;\n    this.weeks = 0;\n    this.days = 0;\n    this.hours = 0;\n    this.minutes = 0;\n    this.seconds = 0;\n  }\n\n  /**\n   * Compares the duration instance with another one.\n   *\n   * @param {Duration} aOther             The instance to compare with\n   * @return {Number}                     -1, 0 or 1 for less/equal/greater\n   */\n  compare(aOther) {\n    let thisSeconds = this.toSeconds();\n    let otherSeconds = aOther.toSeconds();\n    return (thisSeconds > otherSeconds) - (thisSeconds < otherSeconds);\n  }\n\n  /**\n   * Normalizes the duration instance. For example, a duration with a value\n   * of 61 seconds will be normalized to 1 minute and 1 second.\n   */\n  normalize() {\n    this.fromSeconds(this.toSeconds());\n  }\n\n  /**\n   * The string representation of this duration.\n   * @return {String}\n   */\n  toString() {\n    if (this.toSeconds() == 0) {\n      return \"PT0S\";\n    } else {\n      let str = \"\";\n      if (this.isNegative) str += \"-\";\n      str += \"P\";\n      let hasWeeks = false;\n      if (this.weeks) {\n        if (this.days || this.hours || this.minutes || this.seconds) {\n          str += (this.weeks * 7 + this.days) + \"D\";\n        } else {\n          str += (this.weeks + \"W\");\n          hasWeeks = true;\n        }\n      } else if (this.days) {\n        str += (this.days + \"D\");\n      }\n\n      if (!hasWeeks) {\n        if (this.hours || this.minutes || this.seconds) {\n          str += \"T\";\n          if (this.hours) {\n            str += this.hours + \"H\";\n          }\n\n          if (this.minutes) {\n            str += this.minutes + \"M\";\n          }\n\n          if (this.seconds) {\n            str += this.seconds + \"S\";\n          }\n        }\n      }\n\n      return str;\n    }\n  }\n\n  /**\n   * The iCalendar string representation of this duration.\n   * @return {String}\n   */\n  toICALString() {\n    return this.toString();\n  }\n}\n\n/**\n * Internal helper function to handle a chunk of a duration.\n *\n * @private\n * @param {String} letter type of duration chunk\n * @param {String} number numeric value or -/+\n * @param {Object} dict target to assign values to\n */\nfunction parseDurationChunk(letter, number, object) {\n  let type;\n  switch (letter) {\n    case 'P':\n      if (number && number === '-') {\n        object.isNegative = true;\n      } else {\n        object.isNegative = false;\n      }\n      // period\n      break;\n    case 'D':\n      type = 'days';\n      break;\n    case 'W':\n      type = 'weeks';\n      break;\n    case 'H':\n      type = 'hours';\n      break;\n    case 'M':\n      type = 'minutes';\n      break;\n    case 'S':\n      type = 'seconds';\n      break;\n    default:\n      // Not a valid chunk\n      return 0;\n  }\n\n  if (type) {\n    if (!number && number !== 0) {\n      throw new Error(\n        'invalid duration value: Missing number before \"' + letter + '\"'\n      );\n    }\n    let num = parseInt(number, 10);\n    if (isStrictlyNaN(num)) {\n      throw new Error(\n        'invalid duration value: Invalid number \"' + number + '\" before \"' + letter + '\"'\n      );\n    }\n    object[type] = num;\n  }\n\n  return 1;\n}\n\n/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/.\n * Portions Copyright (C) Philipp Kewisch */\n\n\n/**\n * This lets typescript resolve our custom types in the\n * generated d.ts files (jsdoc typedefs are converted to typescript types).\n * Ignore prevents the typedefs from being documented more than once.\n * @ignore\n * @typedef {import(\"./types.js\").jCalComponent} jCalComponent\n * Imports the 'occurrenceDetails' type from the \"types.js\" module\n */\n\n/**\n * This class represents the \"period\" value type, with various calculation and manipulation methods.\n *\n * @memberof ICAL\n */\nclass Period {\n  /**\n   * Creates a new {@link ICAL.Period} instance from the passed string.\n   *\n   * @param {String} str            The string to parse\n   * @param {Property} prop         The property this period will be on\n   * @return {Period}               The created period instance\n   */\n  static fromString(str, prop) {\n    let parts = str.split('/');\n\n    if (parts.length !== 2) {\n      throw new Error(\n        'Invalid string value: \"' + str + '\" must contain a \"/\" char.'\n      );\n    }\n\n    let options = {\n      start: Time.fromDateTimeString(parts[0], prop)\n    };\n\n    let end = parts[1];\n\n    if (Duration.isValueString(end)) {\n      options.duration = Duration.fromString(end);\n    } else {\n      options.end = Time.fromDateTimeString(end, prop);\n    }\n\n    return new Period(options);\n  }\n\n  /**\n   * Creates a new {@link ICAL.Period} instance from the given data object.\n   * The passed data object cannot contain both and end date and a duration.\n   *\n   * @param {Object} aData                  An object with members of the period\n   * @param {Time=} aData.start             The start of the period\n   * @param {Time=} aData.end               The end of the period\n   * @param {Duration=} aData.duration      The duration of the period\n   * @return {Period}                       The period instance\n   */\n  static fromData(aData) {\n    return new Period(aData);\n  }\n\n  /**\n   * Returns a new period instance from the given jCal data array. The first\n   * member is always the start date string, the second member is either a\n   * duration or end date string.\n   *\n   * @param {jCalComponent} aData           The jCal data array\n   * @param {Property} aProp                The property this jCal data is on\n   * @param {Boolean} aLenient              If true, data value can be both date and date-time\n   * @return {Period}                       The period instance\n   */\n  static fromJSON(aData, aProp, aLenient) {\n    function fromDateOrDateTimeString(aValue, dateProp) {\n      if (aLenient) {\n        return Time.fromString(aValue, dateProp);\n      } else {\n        return Time.fromDateTimeString(aValue, dateProp);\n      }\n    }\n\n    if (Duration.isValueString(aData[1])) {\n      return Period.fromData({\n        start: fromDateOrDateTimeString(aData[0], aProp),\n        duration: Duration.fromString(aData[1])\n      });\n    } else {\n      return Period.fromData({\n        start: fromDateOrDateTimeString(aData[0], aProp),\n        end: fromDateOrDateTimeString(aData[1], aProp)\n      });\n    }\n  }\n\n  /**\n   * Creates a new ICAL.Period instance. The passed data object cannot contain both and end date and\n   * a duration.\n   *\n   * @param {Object} aData                  An object with members of the period\n   * @param {Time=} aData.start             The start of the period\n   * @param {Time=} aData.end               The end of the period\n   * @param {Duration=} aData.duration      The duration of the period\n   */\n  constructor(aData) {\n    this.wrappedJSObject = this;\n\n    if (aData && 'start' in aData) {\n      if (aData.start && !(aData.start instanceof Time)) {\n        throw new TypeError('.start must be an instance of ICAL.Time');\n      }\n      this.start = aData.start;\n    }\n\n    if (aData && aData.end && aData.duration) {\n      throw new Error('cannot accept both end and duration');\n    }\n\n    if (aData && 'end' in aData) {\n      if (aData.end && !(aData.end instanceof Time)) {\n        throw new TypeError('.end must be an instance of ICAL.Time');\n      }\n      this.end = aData.end;\n    }\n\n    if (aData && 'duration' in aData) {\n      if (aData.duration && !(aData.duration instanceof Duration)) {\n        throw new TypeError('.duration must be an instance of ICAL.Duration');\n      }\n      this.duration = aData.duration;\n    }\n  }\n\n\n  /**\n   * The start of the period\n   * @type {Time}\n   */\n  start = null;\n\n  /**\n   * The end of the period\n   * @type {Time}\n   */\n  end = null;\n\n  /**\n   * The duration of the period\n   * @type {Duration}\n   */\n  duration = null;\n\n  /**\n   * The class identifier.\n   * @constant\n   * @type {String}\n   * @default \"icalperiod\"\n   */\n  icalclass = \"icalperiod\";\n\n  /**\n   * The type name, to be used in the jCal object.\n   * @constant\n   * @type {String}\n   * @default \"period\"\n   */\n  icaltype = \"period\";\n\n  /**\n   * Returns a clone of the duration object.\n   *\n   * @return {Period}      The cloned object\n   */\n  clone() {\n    return Period.fromData({\n      start: this.start ? this.start.clone() : null,\n      end: this.end ? this.end.clone() : null,\n      duration: this.duration ? this.duration.clone() : null\n    });\n  }\n\n  /**\n   * Calculates the duration of the period, either directly or by subtracting\n   * start from end date.\n   *\n   * @return {Duration}      The calculated duration\n   */\n  getDuration() {\n    if (this.duration) {\n      return this.duration;\n    } else {\n      return this.end.subtractDate(this.start);\n    }\n  }\n\n  /**\n   * Calculates the end date of the period, either directly or by adding\n   * duration to start date.\n   *\n   * @return {Time}          The calculated end date\n   */\n  getEnd() {\n    if (this.end) {\n      return this.end;\n    } else {\n      let end = this.start.clone();\n      end.addDuration(this.duration);\n      return end;\n    }\n  }\n\n  /**\n   * Compare this period with a date or other period. To maintain the logic where a.compare(b)\n   * returns 1 when a > b, this function will return 1 when the period is after the date, 0 when the\n   * date is within the period, and -1 when the period is before the date. When comparing two\n   * periods, as soon as they overlap in any way this will return 0.\n   *\n   * @param {Time|Period} dt    The date or other period to compare with\n   */\n  compare(dt) {\n    if (dt.compare(this.start) < 0) {\n      return 1;\n    } else if (dt.compare(this.getEnd()) > 0) {\n      return -1;\n    } else {\n      return 0;\n    }\n  }\n\n  /**\n   * The string representation of this period.\n   * @return {String}\n   */\n  toString() {\n    return this.start + \"/\" + (this.end || this.duration);\n  }\n\n  /**\n   * The jCal representation of this period type.\n   * @return {Object}\n   */\n  toJSON() {\n    return [this.start.toString(), (this.end || this.duration).toString()];\n  }\n\n  /**\n   * The iCalendar string representation of this period.\n   * @return {String}\n   */\n  toICALString() {\n    return this.start.toICALString() + \"/\" +\n           (this.end || this.duration).toICALString();\n  }\n}\n\n/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/.\n * Portions Copyright (C) Philipp Kewisch */\n\n\n/**\n * This lets typescript resolve our custom types in the\n * generated d.ts files (jsdoc typedefs are converted to typescript types).\n * Ignore prevents the typedefs from being documented more than once.\n *\n * @ignore\n * @typedef {import(\"./types.js\").weekDay} weekDay\n * Imports the 'weekDay' type from the \"types.js\" module\n *\n * @ignore\n * @typedef {import(\"./types.js\").timeInit} timeInit\n * Imports the 'timeInit' type from the \"types.js\" module\n */\n\n/**\n * @classdesc\n * iCalendar Time representation (similar to JS Date object).  Fully\n * independent of system (OS) timezone / time.  Unlike JS Date, the month\n * January is 1, not zero.\n *\n * @example\n * var time = new ICAL.Time({\n *   year: 2012,\n *   month: 10,\n *   day: 11\n *   minute: 0,\n *   second: 0,\n *   isDate: false\n * });\n *\n *\n * @memberof ICAL\n*/\nclass Time {\n  static _dowCache = {};\n  static _wnCache = {};\n\n  /**\n   * Returns the days in the given month\n   *\n   * @param {Number} month      The month to check\n   * @param {Number} year       The year to check\n   * @return {Number}           The number of days in the month\n   */\n  static daysInMonth(month, year) {\n    let _daysInMonth = [0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\n    let days = 30;\n\n    if (month < 1 || month > 12) return days;\n\n    days = _daysInMonth[month];\n\n    if (month == 2) {\n      days += Time.isLeapYear(year);\n    }\n\n    return days;\n  }\n\n  /**\n   * Checks if the year is a leap year\n   *\n   * @param {Number} year       The year to check\n   * @return {Boolean}          True, if the year is a leap year\n   */\n  static isLeapYear(year) {\n    if (year <= 1752) {\n      return ((year % 4) == 0);\n    } else {\n      return (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0));\n    }\n  }\n\n  /**\n   * Create a new ICAL.Time from the day of year and year. The date is returned\n   * in floating timezone.\n   *\n   * @param {Number} aDayOfYear     The day of year\n   * @param {Number} aYear          The year to create the instance in\n   * @return {Time}                 The created instance with the calculated date\n   */\n  static fromDayOfYear(aDayOfYear, aYear) {\n    let year = aYear;\n    let doy = aDayOfYear;\n    let tt = new Time();\n    tt.auto_normalize = false;\n    let is_leap = (Time.isLeapYear(year) ? 1 : 0);\n\n    if (doy < 1) {\n      year--;\n      is_leap = (Time.isLeapYear(year) ? 1 : 0);\n      doy += Time.daysInYearPassedMonth[is_leap][12];\n      return Time.fromDayOfYear(doy, year);\n    } else if (doy > Time.daysInYearPassedMonth[is_leap][12]) {\n      is_leap = (Time.isLeapYear(year) ? 1 : 0);\n      doy -= Time.daysInYearPassedMonth[is_leap][12];\n      year++;\n      return Time.fromDayOfYear(doy, year);\n    }\n\n    tt.year = year;\n    tt.isDate = true;\n\n    for (let month = 11; month >= 0; month--) {\n      if (doy > Time.daysInYearPassedMonth[is_leap][month]) {\n        tt.month = month + 1;\n        tt.day = doy - Time.daysInYearPassedMonth[is_leap][month];\n        break;\n      }\n    }\n\n    tt.auto_normalize = true;\n    return tt;\n  }\n\n  /**\n   * Returns a new ICAL.Time instance from a date string, e.g 2015-01-02.\n   *\n   * @deprecated                Use {@link ICAL.Time.fromDateString} instead\n   * @param {String} str        The string to create from\n   * @return {Time}             The date/time instance\n   */\n  static fromStringv2(str) {\n    return new Time({\n      year: parseInt(str.slice(0, 4), 10),\n      month: parseInt(str.slice(5, 7), 10),\n      day: parseInt(str.slice(8, 10), 10),\n      isDate: true\n    });\n  }\n\n  /**\n   * Returns a new ICAL.Time instance from a date string, e.g 2015-01-02.\n   *\n   * @param {String} aValue     The string to create from\n   * @return {Time}             The date/time instance\n   */\n  static fromDateString(aValue) {\n    // Dates should have no timezone.\n    // Google likes to sometimes specify Z on dates\n    // we specifically ignore that to avoid issues.\n\n    // YYYY-MM-DD\n    // 2012-10-10\n    return new Time({\n      year: strictParseInt(aValue.slice(0, 4)),\n      month: strictParseInt(aValue.slice(5, 7)),\n      day: strictParseInt(aValue.slice(8, 10)),\n      isDate: true\n    });\n  }\n\n  /**\n   * Returns a new ICAL.Time instance from a date-time string, e.g\n   * 2015-01-02T03:04:05. If a property is specified, the timezone is set up\n   * from the property's TZID parameter.\n   *\n   * @param {String} aValue         The string to create from\n   * @param {Property=} prop        The property the date belongs to\n   * @return {Time}                 The date/time instance\n   */\n  static fromDateTimeString(aValue, prop) {\n    if (aValue.length < 19) {\n      throw new Error(\n        'invalid date-time value: \"' + aValue + '\"'\n      );\n    }\n\n    let zone;\n    let zoneId;\n\n    if (aValue.slice(-1) === 'Z') {\n      zone = Timezone.utcTimezone;\n    } else if (prop) {\n      zoneId = prop.getParameter('tzid');\n\n      if (prop.parent) {\n        if (prop.parent.name === 'standard' || prop.parent.name === 'daylight') {\n          // Per RFC 5545 3.8.2.4 and 3.8.2.2, start/end date-times within\n          // these components MUST be specified in local time.\n          zone = Timezone.localTimezone;\n        } else if (zoneId) {\n          // If the desired time zone is defined within the component tree,\n          // fetch its definition and prefer that.\n          zone = prop.parent.getTimeZoneByID(zoneId);\n        }\n      }\n    }\n\n    const timeData = {\n      year: strictParseInt(aValue.slice(0, 4)),\n      month: strictParseInt(aValue.slice(5, 7)),\n      day: strictParseInt(aValue.slice(8, 10)),\n      hour: strictParseInt(aValue.slice(11, 13)),\n      minute: strictParseInt(aValue.slice(14, 16)),\n      second: strictParseInt(aValue.slice(17, 19)),\n    };\n\n    // Although RFC 5545 requires that all TZIDs used within a file have a\n    // corresponding time zone definition, we may not be parsing the full file\n    // or we may be dealing with a non-compliant file; in either case, we can\n    // check our own time zone service for the TZID in a last-ditch effort.\n    if (zoneId && !zone) {\n      timeData.timezone = zoneId;\n    }\n\n    // 2012-10-10T10:10:10(Z)?\n    return new Time(timeData, zone);\n  }\n\n  /**\n   * Returns a new ICAL.Time instance from a date or date-time string,\n   *\n   * @param {String} aValue         The string to create from\n   * @param {Property=} prop        The property the date belongs to\n   * @return {Time}                 The date/time instance\n   */\n  static fromString(aValue, aProperty) {\n    if (aValue.length > 10) {\n      return Time.fromDateTimeString(aValue, aProperty);\n    } else {\n      return Time.fromDateString(aValue);\n    }\n  }\n\n  /**\n   * Creates a new ICAL.Time instance from the given Javascript Date.\n   *\n   * @param {?Date} aDate             The Javascript Date to read, or null to reset\n   * @param {Boolean} [useUTC=false]  If true, the UTC values of the date will be used\n   */\n  static fromJSDate(aDate, useUTC) {\n    let tt = new Time();\n    return tt.fromJSDate(aDate, useUTC);\n  }\n\n  /**\n   * Creates a new ICAL.Time instance from the the passed data object.\n   *\n   * @param {timeInit} aData          Time initialization\n   * @param {Timezone=} aZone         Timezone this position occurs in\n   */\n  static fromData = function fromData(aData, aZone) {\n    let t = new Time();\n    return t.fromData(aData, aZone);\n  };\n\n  /**\n   * Creates a new ICAL.Time instance from the current moment.\n   * The instance is “floating” - has no timezone relation.\n   * To create an instance considering the time zone, call\n   * ICAL.Time.fromJSDate(new Date(), true)\n   * @return {Time}\n   */\n  static now() {\n    return Time.fromJSDate(new Date(), false);\n  }\n\n  /**\n   * Returns the date on which ISO week number 1 starts.\n   *\n   * @see Time#weekNumber\n   * @param {Number} aYear                  The year to search in\n   * @param {weekDay=} aWeekStart           The week start weekday, used for calculation.\n   * @return {Time}                         The date on which week number 1 starts\n   */\n  static weekOneStarts(aYear, aWeekStart) {\n    let t = Time.fromData({\n      year: aYear,\n      month: 1,\n      day: 1,\n      isDate: true\n    });\n\n    let dow = t.dayOfWeek();\n    let wkst = aWeekStart || Time.DEFAULT_WEEK_START;\n    if (dow > Time.THURSDAY) {\n      t.day += 7;\n    }\n    if (wkst > Time.THURSDAY) {\n      t.day -= 7;\n    }\n\n    t.day -= dow - wkst;\n\n    return t;\n  }\n\n  /**\n   * Get the dominical letter for the given year. Letters range from A - G for\n   * common years, and AG to GF for leap years.\n   *\n   * @param {Number} yr           The year to retrieve the letter for\n   * @return {String}             The dominical letter.\n   */\n  static getDominicalLetter(yr) {\n    let LTRS = \"GFEDCBA\";\n    let dom = (yr + (yr / 4 | 0) + (yr / 400 | 0) - (yr / 100 | 0) - 1) % 7;\n    let isLeap = Time.isLeapYear(yr);\n    if (isLeap) {\n      return LTRS[(dom + 6) % 7] + LTRS[dom];\n    } else {\n      return LTRS[dom];\n    }\n  }\n\n  static #epochTime = null;\n  /**\n   * January 1st, 1970 as an ICAL.Time.\n   * @type {Time}\n   * @constant\n   * @instance\n   */\n  static get epochTime() {\n    if (!this.#epochTime) {\n      this.#epochTime = Time.fromData({\n        year: 1970,\n        month: 1,\n        day: 1,\n        hour: 0,\n        minute: 0,\n        second: 0,\n        isDate: false,\n        timezone: \"Z\"\n      });\n    }\n    return this.#epochTime;\n  }\n\n  static _cmp_attr(a, b, attr) {\n    if (a[attr] > b[attr]) return 1;\n    if (a[attr] < b[attr]) return -1;\n    return 0;\n  }\n\n  /**\n   * The days that have passed in the year after a given month. The array has\n   * two members, one being an array of passed days for non-leap years, the\n   * other analog for leap years.\n   * @example\n   * var isLeapYear = ICAL.Time.isLeapYear(year);\n   * var passedDays = ICAL.Time.daysInYearPassedMonth[isLeapYear][month];\n   * @type {Array.<Array.<Number>>}\n   */\n  static daysInYearPassedMonth = [\n    [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365],\n    [0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366]\n  ];\n\n  static SUNDAY = 1;\n  static MONDAY = 2;\n  static TUESDAY = 3;\n  static WEDNESDAY = 4;\n  static THURSDAY = 5;\n  static FRIDAY = 6;\n  static SATURDAY = 7;\n\n  /**\n   * The default weekday for the WKST part.\n   * @constant\n   * @default ICAL.Time.MONDAY\n   */\n  static DEFAULT_WEEK_START = 2; // MONDAY\n\n  /**\n   * Creates a new ICAL.Time instance.\n   *\n   * @param {timeInit} data           Time initialization\n   * @param {Timezone} zone           timezone this position occurs in\n   */\n  constructor(data, zone) {\n    this.wrappedJSObject = this;\n\n    /**\n     * @type {timeInit}\n     * @private\n     */\n    this._time = Object.create(null);\n\n    /* time defaults */\n    this._time.year = 0;\n    this._time.month = 1;\n    this._time.day = 1;\n    this._time.hour = 0;\n    this._time.minute = 0;\n    this._time.second = 0;\n    this._time.isDate = false;\n\n    this.fromData(data, zone);\n  }\n\n  /**\n   * The class identifier.\n   * @constant\n   * @type {String}\n   * @default \"icaltime\"\n   */\n  icalclass = \"icaltime\";\n  _cachedUnixTime = null;\n\n  /**\n   * The type name, to be used in the jCal object. This value may change and\n   * is strictly defined by the {@link ICAL.Time#isDate isDate} member.\n   * @type {String}\n   * @default \"date-time\"\n   */\n  get icaltype() {\n    return this.isDate ? 'date' : 'date-time';\n  }\n\n  /**\n   * The timezone for this time.\n   * @type {Timezone}\n   */\n  zone = null;\n\n  /**\n   * Internal uses to indicate that a change has been made and the next read\n   * operation must attempt to normalize the value (for example changing the\n   * day to 33).\n   *\n   * @type {Boolean}\n   * @private\n   */\n  _pendingNormalization = false;\n\n  /**\n   * The year of this date.\n   * @type {Number}\n   */\n  get year() {\n    return this._getTimeAttr('year');\n  }\n\n  set year(val) {\n    this._setTimeAttr('year', val);\n  }\n\n  /**\n   * The month of this date.\n   * @type {Number}\n   */\n  get month() {\n    return this._getTimeAttr('month');\n  }\n\n  set month(val) {\n    this._setTimeAttr('month', val);\n  }\n\n  /**\n   * The day of this date.\n   * @type {Number}\n   */\n  get day() {\n    return this._getTimeAttr('day');\n  }\n\n  set day(val) {\n    this._setTimeAttr('day', val);\n  }\n\n  /**\n   * The hour of this date-time.\n   * @type {Number}\n   */\n  get hour() {\n    return this._getTimeAttr('hour');\n  }\n\n  set hour(val) {\n    this._setTimeAttr('hour', val);\n  }\n\n  /**\n   * The minute of this date-time.\n   * @type {Number}\n   */\n  get minute() {\n    return this._getTimeAttr('minute');\n  }\n\n  set minute(val) {\n    this._setTimeAttr('minute', val);\n  }\n\n  /**\n   * The second of this date-time.\n   * @type {Number}\n   */\n  get second() {\n    return this._getTimeAttr('second');\n  }\n\n  set second(val) {\n    this._setTimeAttr('second', val);\n  }\n\n  /**\n   * If true, the instance represents a date (as opposed to a date-time)\n   * @type {Boolean}\n   */\n  get isDate() {\n    return this._getTimeAttr('isDate');\n  }\n\n  set isDate(val) {\n    this._setTimeAttr('isDate', val);\n  }\n\n  /**\n   * @private\n   * @param {String} attr             Attribute to get (one of: year, month,\n   *                                  day, hour, minute, second, isDate)\n   * @return {Number|Boolean}         Current value for the attribute\n   */\n  _getTimeAttr(attr) {\n    if (this._pendingNormalization) {\n      this._normalize();\n      this._pendingNormalization = false;\n    }\n\n    return this._time[attr];\n  }\n\n  /**\n   * @private\n   * @param {String} attr             Attribute to set (one of: year, month,\n   *                                  day, hour, minute, second, isDate)\n   * @param {Number|Boolean} val      New value for the attribute\n   */\n  _setTimeAttr(attr, val) {\n    // Check if isDate will be set and if was not set to normalize date.\n    // This avoids losing days when seconds, minutes and hours are zeroed\n    // what normalize will do when time is a date.\n    if (attr === \"isDate\" && val && !this._time.isDate) {\n      this.adjust(0, 0, 0, 0);\n    }\n    this._cachedUnixTime = null;\n    this._pendingNormalization = true;\n    this._time[attr] = val;\n  }\n\n  /**\n   * Returns a clone of the time object.\n   *\n   * @return {Time}              The cloned object\n   */\n  clone() {\n    return new Time(this._time, this.zone);\n  }\n\n  /**\n   * Reset the time instance to epoch time\n   */\n  reset() {\n    this.fromData(Time.epochTime);\n    this.zone = Timezone.utcTimezone;\n  }\n\n  /**\n   * Reset the time instance to the given date/time values.\n   *\n   * @param {Number} year             The year to set\n   * @param {Number} month            The month to set\n   * @param {Number} day              The day to set\n   * @param {Number} hour             The hour to set\n   * @param {Number} minute           The minute to set\n   * @param {Number} second           The second to set\n   * @param {Timezone} timezone       The timezone to set\n   */\n  resetTo(year, month, day, hour, minute, second, timezone) {\n    this.fromData({\n      year: year,\n      month: month,\n      day: day,\n      hour: hour,\n      minute: minute,\n      second: second,\n      zone: timezone\n    });\n  }\n\n  /**\n   * Set up the current instance from the Javascript date value.\n   *\n   * @param {?Date} aDate             The Javascript Date to read, or null to reset\n   * @param {Boolean} [useUTC=false]  If true, the UTC values of the date will be used\n   */\n  fromJSDate(aDate, useUTC) {\n    if (!aDate) {\n      this.reset();\n    } else {\n      if (useUTC) {\n        this.zone = Timezone.utcTimezone;\n        this.year = aDate.getUTCFullYear();\n        this.month = aDate.getUTCMonth() + 1;\n        this.day = aDate.getUTCDate();\n        this.hour = aDate.getUTCHours();\n        this.minute = aDate.getUTCMinutes();\n        this.second = aDate.getUTCSeconds();\n      } else {\n        this.zone = Timezone.localTimezone;\n        this.year = aDate.getFullYear();\n        this.month = aDate.getMonth() + 1;\n        this.day = aDate.getDate();\n        this.hour = aDate.getHours();\n        this.minute = aDate.getMinutes();\n        this.second = aDate.getSeconds();\n      }\n    }\n    this._cachedUnixTime = null;\n    return this;\n  }\n\n  /**\n   * Sets up the current instance using members from the passed data object.\n   *\n   * @param {timeInit} aData          Time initialization\n   * @param {Timezone=} aZone         Timezone this position occurs in\n   */\n  fromData(aData, aZone) {\n    if (aData) {\n      for (let [key, value] of Object.entries(aData)) {\n          // ical type cannot be set\n          if (key === 'icaltype') continue;\n        this[key] = value;\n      }\n    }\n\n    if (aZone) {\n      this.zone = aZone;\n    }\n\n    if (aData && !(\"isDate\" in aData)) {\n      this.isDate = !(\"hour\" in aData);\n    } else if (aData && (\"isDate\" in aData)) {\n      this.isDate = aData.isDate;\n    }\n\n    if (aData && \"timezone\" in aData) {\n      let zone = TimezoneService.get(\n        aData.timezone\n      );\n\n      this.zone = zone || Timezone.localTimezone;\n    }\n\n    if (aData && \"zone\" in aData) {\n      this.zone = aData.zone;\n    }\n\n    if (!this.zone) {\n      this.zone = Timezone.localTimezone;\n    }\n\n    this._cachedUnixTime = null;\n    return this;\n  }\n\n  /**\n   * Calculate the day of week.\n   * @param {weekDay=} aWeekStart\n   *        The week start weekday, defaults to SUNDAY\n   * @return {weekDay}\n   */\n  dayOfWeek(aWeekStart) {\n    let firstDow = aWeekStart || Time.SUNDAY;\n    let dowCacheKey = (this.year << 12) + (this.month << 8) + (this.day << 3) + firstDow;\n    if (dowCacheKey in Time._dowCache) {\n      return Time._dowCache[dowCacheKey];\n    }\n\n    // Using Zeller's algorithm\n    let q = this.day;\n    let m = this.month + (this.month < 3 ? 12 : 0);\n    let Y = this.year - (this.month < 3 ? 1 : 0);\n\n    let h = (q + Y + trunc(((m + 1) * 26) / 10) + trunc(Y / 4));\n    { // eslint-disable-line no-constant-condition\n      h += trunc(Y / 100) * 6 + trunc(Y / 400);\n    }\n\n    // Normalize to 1 = wkst\n    h = ((h + 7 - firstDow) % 7) + 1;\n    Time._dowCache[dowCacheKey] = h;\n    return h;\n  }\n\n  /**\n   * Calculate the day of year.\n   * @return {Number}\n   */\n  dayOfYear() {\n    let is_leap = (Time.isLeapYear(this.year) ? 1 : 0);\n    let diypm = Time.daysInYearPassedMonth;\n    return diypm[is_leap][this.month - 1] + this.day;\n  }\n\n  /**\n   * Returns a copy of the current date/time, rewound to the start of the\n   * week. The resulting ICAL.Time instance is of icaltype date, even if this\n   * is a date-time.\n   *\n   * @param {weekDay=} aWeekStart\n   *        The week start weekday, defaults to SUNDAY\n   * @return {Time}      The start of the week (cloned)\n   */\n  startOfWeek(aWeekStart) {\n    let firstDow = aWeekStart || Time.SUNDAY;\n    let result = this.clone();\n    result.day -= ((this.dayOfWeek() + 7 - firstDow) % 7);\n    result.isDate = true;\n    result.hour = 0;\n    result.minute = 0;\n    result.second = 0;\n    return result;\n  }\n\n  /**\n   * Returns a copy of the current date/time, shifted to the end of the week.\n   * The resulting ICAL.Time instance is of icaltype date, even if this is a\n   * date-time.\n   *\n   * @param {weekDay=} aWeekStart\n   *        The week start weekday, defaults to SUNDAY\n   * @return {Time}      The end of the week (cloned)\n   */\n  endOfWeek(aWeekStart) {\n    let firstDow = aWeekStart || Time.SUNDAY;\n    let result = this.clone();\n    result.day += (7 - this.dayOfWeek() + firstDow - Time.SUNDAY) % 7;\n    result.isDate = true;\n    result.hour = 0;\n    result.minute = 0;\n    result.second = 0;\n    return result;\n  }\n\n  /**\n   * Returns a copy of the current date/time, rewound to the start of the\n   * month. The resulting ICAL.Time instance is of icaltype date, even if\n   * this is a date-time.\n   *\n   * @return {Time}      The start of the month (cloned)\n   */\n  startOfMonth() {\n    let result = this.clone();\n    result.day = 1;\n    result.isDate = true;\n    result.hour = 0;\n    result.minute = 0;\n    result.second = 0;\n    return result;\n  }\n\n  /**\n   * Returns a copy of the current date/time, shifted to the end of the\n   * month.  The resulting ICAL.Time instance is of icaltype date, even if\n   * this is a date-time.\n   *\n   * @return {Time}      The end of the month (cloned)\n   */\n  endOfMonth() {\n    let result = this.clone();\n    result.day = Time.daysInMonth(result.month, result.year);\n    result.isDate = true;\n    result.hour = 0;\n    result.minute = 0;\n    result.second = 0;\n    return result;\n  }\n\n  /**\n   * Returns a copy of the current date/time, rewound to the start of the\n   * year. The resulting ICAL.Time instance is of icaltype date, even if\n   * this is a date-time.\n   *\n   * @return {Time}      The start of the year (cloned)\n   */\n  startOfYear() {\n    let result = this.clone();\n    result.day = 1;\n    result.month = 1;\n    result.isDate = true;\n    result.hour = 0;\n    result.minute = 0;\n    result.second = 0;\n    return result;\n  }\n\n  /**\n   * Returns a copy of the current date/time, shifted to the end of the\n   * year.  The resulting ICAL.Time instance is of icaltype date, even if\n   * this is a date-time.\n   *\n   * @return {Time}      The end of the year (cloned)\n   */\n  endOfYear() {\n    let result = this.clone();\n    result.day = 31;\n    result.month = 12;\n    result.isDate = true;\n    result.hour = 0;\n    result.minute = 0;\n    result.second = 0;\n    return result;\n  }\n\n  /**\n   * First calculates the start of the week, then returns the day of year for\n   * this date. If the day falls into the previous year, the day is zero or negative.\n   *\n   * @param {weekDay=} aFirstDayOfWeek\n   *        The week start weekday, defaults to SUNDAY\n   * @return {Number}     The calculated day of year\n   */\n  startDoyWeek(aFirstDayOfWeek) {\n    let firstDow = aFirstDayOfWeek || Time.SUNDAY;\n    let delta = this.dayOfWeek() - firstDow;\n    if (delta < 0) delta += 7;\n    return this.dayOfYear() - delta;\n  }\n\n  /**\n   * Get the dominical letter for the current year. Letters range from A - G\n   * for common years, and AG to GF for leap years.\n   *\n   * @param {Number} yr           The year to retrieve the letter for\n   * @return {String}             The dominical letter.\n   */\n  getDominicalLetter() {\n    return Time.getDominicalLetter(this.year);\n  }\n\n  /**\n   * Finds the nthWeekDay relative to the current month (not day).  The\n   * returned value is a day relative the month that this month belongs to so\n   * 1 would indicate the first of the month and 40 would indicate a day in\n   * the following month.\n   *\n   * @param {Number} aDayOfWeek   Day of the week see the day name constants\n   * @param {Number} aPos         Nth occurrence of a given week day values\n   *        of 1 and 0 both indicate the first weekday of that type. aPos may\n   *        be either positive or negative\n   *\n   * @return {Number} numeric value indicating a day relative\n   *                   to the current month of this time object\n   */\n  nthWeekDay(aDayOfWeek, aPos) {\n    let daysInMonth = Time.daysInMonth(this.month, this.year);\n    let weekday;\n    let pos = aPos;\n\n    let start = 0;\n\n    let otherDay = this.clone();\n\n    if (pos >= 0) {\n      otherDay.day = 1;\n\n      // because 0 means no position has been given\n      // 1 and 0 indicate the same day.\n      if (pos != 0) {\n        // remove the extra numeric value\n        pos--;\n      }\n\n      // set current start offset to current day.\n      start = otherDay.day;\n\n      // find the current day of week\n      let startDow = otherDay.dayOfWeek();\n\n      // calculate the difference between current\n      // day of the week and desired day of the week\n      let offset = aDayOfWeek - startDow;\n\n\n      // if the offset goes into the past\n      // week we add 7 so it goes into the next\n      // week. We only want to go forward in time here.\n      if (offset < 0)\n        // this is really important otherwise we would\n        // end up with dates from in the past.\n        offset += 7;\n\n      // add offset to start so start is the same\n      // day of the week as the desired day of week.\n      start += offset;\n\n      // because we are going to add (and multiply)\n      // the numeric value of the day we subtract it\n      // from the start position so not to add it twice.\n      start -= aDayOfWeek;\n\n      // set week day\n      weekday = aDayOfWeek;\n    } else {\n\n      // then we set it to the last day in the current month\n      otherDay.day = daysInMonth;\n\n      // find the ends weekday\n      let endDow = otherDay.dayOfWeek();\n\n      pos++;\n\n      weekday = (endDow - aDayOfWeek);\n\n      if (weekday < 0) {\n        weekday += 7;\n      }\n\n      weekday = daysInMonth - weekday;\n    }\n\n    weekday += pos * 7;\n\n    return start + weekday;\n  }\n\n  /**\n   * Checks if current time is the nth weekday, relative to the current\n   * month.  Will always return false when rule resolves outside of current\n   * month.\n   *\n   * @param {weekDay} aDayOfWeek                 Day of week to check\n   * @param {Number} aPos                        Relative position\n   * @return {Boolean}                           True, if it is the nth weekday\n   */\n  isNthWeekDay(aDayOfWeek, aPos) {\n    let dow = this.dayOfWeek();\n\n    if (aPos === 0 && dow === aDayOfWeek) {\n      return true;\n    }\n\n    // get pos\n    let day = this.nthWeekDay(aDayOfWeek, aPos);\n\n    if (day === this.day) {\n      return true;\n    }\n\n    return false;\n  }\n\n  /**\n   * Calculates the ISO 8601 week number. The first week of a year is the\n   * week that contains the first Thursday. The year can have 53 weeks, if\n   * January 1st is a Friday.\n   *\n   * Note there are regions where the first week of the year is the one that\n   * starts on January 1st, which may offset the week number. Also, if a\n   * different week start is specified, this will also affect the week\n   * number.\n   *\n   * @see Time.weekOneStarts\n   * @param {weekDay} aWeekStart                  The weekday the week starts with\n   * @return {Number}                             The ISO week number\n   */\n  weekNumber(aWeekStart) {\n    let wnCacheKey = (this.year << 12) + (this.month << 8) + (this.day << 3) + aWeekStart;\n    if (wnCacheKey in Time._wnCache) {\n      return Time._wnCache[wnCacheKey];\n    }\n    // This function courtesty of Julian Bucknall, published under the MIT license\n    // http://www.boyet.com/articles/publishedarticles/calculatingtheisoweeknumb.html\n    // plus some fixes to be able to use different week starts.\n    let week1;\n\n    let dt = this.clone();\n    dt.isDate = true;\n    let isoyear = this.year;\n\n    if (dt.month == 12 && dt.day > 25) {\n      week1 = Time.weekOneStarts(isoyear + 1, aWeekStart);\n      if (dt.compare(week1) < 0) {\n        week1 = Time.weekOneStarts(isoyear, aWeekStart);\n      } else {\n        isoyear++;\n      }\n    } else {\n      week1 = Time.weekOneStarts(isoyear, aWeekStart);\n      if (dt.compare(week1) < 0) {\n        week1 = Time.weekOneStarts(--isoyear, aWeekStart);\n      }\n    }\n\n    let daysBetween = (dt.subtractDate(week1).toSeconds() / 86400);\n    let answer = trunc(daysBetween / 7) + 1;\n    Time._wnCache[wnCacheKey] = answer;\n    return answer;\n  }\n\n  /**\n   * Adds the duration to the current time. The instance is modified in\n   * place.\n   *\n   * @param {Duration} aDuration         The duration to add\n   */\n  addDuration(aDuration) {\n    let mult = (aDuration.isNegative ? -1 : 1);\n\n    // because of the duration optimizations it is much\n    // more efficient to grab all the values up front\n    // then set them directly (which will avoid a normalization call).\n    // So we don't actually normalize until we need it.\n    let second = this.second;\n    let minute = this.minute;\n    let hour = this.hour;\n    let day = this.day;\n\n    second += mult * aDuration.seconds;\n    minute += mult * aDuration.minutes;\n    hour += mult * aDuration.hours;\n    day += mult * aDuration.days;\n    day += mult * 7 * aDuration.weeks;\n\n    this.second = second;\n    this.minute = minute;\n    this.hour = hour;\n    this.day = day;\n\n    this._cachedUnixTime = null;\n  }\n\n  /**\n   * Subtract the date details (_excluding_ timezone).  Useful for finding\n   * the relative difference between two time objects excluding their\n   * timezone differences.\n   *\n   * @param {Time} aDate     The date to subtract\n   * @return {Duration}      The difference as a duration\n   */\n  subtractDate(aDate) {\n    let unixTime = this.toUnixTime() + this.utcOffset();\n    let other = aDate.toUnixTime() + aDate.utcOffset();\n    return Duration.fromSeconds(unixTime - other);\n  }\n\n  /**\n   * Subtract the date details, taking timezones into account.\n   *\n   * @param {Time} aDate  The date to subtract\n   * @return {Duration}   The difference in duration\n   */\n  subtractDateTz(aDate) {\n    let unixTime = this.toUnixTime();\n    let other = aDate.toUnixTime();\n    return Duration.fromSeconds(unixTime - other);\n  }\n\n  /**\n   * Compares the ICAL.Time instance with another one, or a period.\n   *\n   * @param {Time|Period} aOther                  The instance to compare with\n   * @return {Number}                             -1, 0 or 1 for less/equal/greater\n   */\n  compare(other) {\n    if (other instanceof Period) {\n      return -1 * other.compare(this);\n    } else {\n      let a = this.toUnixTime();\n      let b = other.toUnixTime();\n\n      if (a > b) return 1;\n      if (b > a) return -1;\n      return 0;\n    }\n  }\n\n  /**\n   * Compares only the date part of this instance with another one.\n   *\n   * @param {Time} other                  The instance to compare with\n   * @param {Timezone} tz                 The timezone to compare in\n   * @return {Number}                     -1, 0 or 1 for less/equal/greater\n   */\n  compareDateOnlyTz(other, tz) {\n    let a = this.convertToZone(tz);\n    let b = other.convertToZone(tz);\n    let rc = 0;\n\n    if ((rc = Time._cmp_attr(a, b, \"year\")) != 0) return rc;\n    if ((rc = Time._cmp_attr(a, b, \"month\")) != 0) return rc;\n    if ((rc = Time._cmp_attr(a, b, \"day\")) != 0) return rc;\n\n    return rc;\n  }\n\n  /**\n   * Convert the instance into another timezone. The returned ICAL.Time\n   * instance is always a copy.\n   *\n   * @param {Timezone} zone      The zone to convert to\n   * @return {Time}              The copy, converted to the zone\n   */\n  convertToZone(zone) {\n    let copy = this.clone();\n    let zone_equals = (this.zone.tzid == zone.tzid);\n\n    if (!this.isDate && !zone_equals) {\n      Timezone.convert_time(copy, this.zone, zone);\n    }\n\n    copy.zone = zone;\n    return copy;\n  }\n\n  /**\n   * Calculates the UTC offset of the current date/time in the timezone it is\n   * in.\n   *\n   * @return {Number}     UTC offset in seconds\n   */\n  utcOffset() {\n    if (this.zone == Timezone.localTimezone ||\n        this.zone == Timezone.utcTimezone) {\n      return 0;\n    } else {\n      return this.zone.utcOffset(this);\n    }\n  }\n\n  /**\n   * Returns an RFC 5545 compliant ical representation of this object.\n   *\n   * @return {String} ical date/date-time\n   */\n  toICALString() {\n    let string = this.toString();\n\n    if (string.length > 10) {\n      return design.icalendar.value['date-time'].toICAL(string);\n    } else {\n      return design.icalendar.value.date.toICAL(string);\n    }\n  }\n\n  /**\n   * The string representation of this date/time, in jCal form\n   * (including : and - separators).\n   * @return {String}\n   */\n  toString() {\n    let result = this.year + '-' +\n                 pad2(this.month) + '-' +\n                 pad2(this.day);\n\n    if (!this.isDate) {\n        result += 'T' + pad2(this.hour) + ':' +\n                  pad2(this.minute) + ':' +\n                  pad2(this.second);\n\n      if (this.zone === Timezone.utcTimezone) {\n        result += 'Z';\n      }\n    }\n\n    return result;\n  }\n\n  /**\n   * Converts the current instance to a Javascript date\n   * @return {Date}\n   */\n  toJSDate() {\n    if (this.zone == Timezone.localTimezone) {\n      if (this.isDate) {\n        return new Date(this.year, this.month - 1, this.day);\n      } else {\n        return new Date(this.year, this.month - 1, this.day,\n                        this.hour, this.minute, this.second, 0);\n      }\n    } else {\n      return new Date(this.toUnixTime() * 1000);\n    }\n  }\n\n  _normalize() {\n    if (this._time.isDate) {\n      this._time.hour = 0;\n      this._time.minute = 0;\n      this._time.second = 0;\n    }\n    this.adjust(0, 0, 0, 0);\n\n    return this;\n  }\n\n  /**\n   * Adjust the date/time by the given offset\n   *\n   * @param {Number} aExtraDays       The extra amount of days\n   * @param {Number} aExtraHours      The extra amount of hours\n   * @param {Number} aExtraMinutes    The extra amount of minutes\n   * @param {Number} aExtraSeconds    The extra amount of seconds\n   * @param {Number=} aTime           The time to adjust, defaults to the\n   *                                    current instance.\n   */\n  adjust(aExtraDays, aExtraHours, aExtraMinutes, aExtraSeconds, aTime) {\n\n    let minutesOverflow, hoursOverflow,\n        daysOverflow = 0, yearsOverflow = 0;\n\n    let second, minute, hour, day;\n    let daysInMonth;\n\n    let time = aTime || this._time;\n\n    if (!time.isDate) {\n      second = time.second + aExtraSeconds;\n      time.second = second % 60;\n      minutesOverflow = trunc(second / 60);\n      if (time.second < 0) {\n        time.second += 60;\n        minutesOverflow--;\n      }\n\n      minute = time.minute + aExtraMinutes + minutesOverflow;\n      time.minute = minute % 60;\n      hoursOverflow = trunc(minute / 60);\n      if (time.minute < 0) {\n        time.minute += 60;\n        hoursOverflow--;\n      }\n\n      hour = time.hour + aExtraHours + hoursOverflow;\n\n      time.hour = hour % 24;\n      daysOverflow = trunc(hour / 24);\n      if (time.hour < 0) {\n        time.hour += 24;\n        daysOverflow--;\n      }\n    }\n\n\n    // Adjust month and year first, because we need to know what month the day\n    // is in before adjusting it.\n    if (time.month > 12) {\n      yearsOverflow = trunc((time.month - 1) / 12);\n    } else if (time.month < 1) {\n      yearsOverflow = trunc(time.month / 12) - 1;\n    }\n\n    time.year += yearsOverflow;\n    time.month -= 12 * yearsOverflow;\n\n    // Now take care of the days (and adjust month if needed)\n    day = time.day + aExtraDays + daysOverflow;\n\n    if (day > 0) {\n      for (;;) {\n        daysInMonth = Time.daysInMonth(time.month, time.year);\n        if (day <= daysInMonth) {\n          break;\n        }\n\n        time.month++;\n        if (time.month > 12) {\n          time.year++;\n          time.month = 1;\n        }\n\n        day -= daysInMonth;\n      }\n    } else {\n      while (day <= 0) {\n        if (time.month == 1) {\n          time.year--;\n          time.month = 12;\n        } else {\n          time.month--;\n        }\n\n        day += Time.daysInMonth(time.month, time.year);\n      }\n    }\n\n    time.day = day;\n\n    this._cachedUnixTime = null;\n    return this;\n  }\n\n  /**\n   * Sets up the current instance from unix time, the number of seconds since\n   * January 1st, 1970.\n   *\n   * @param {Number} seconds      The seconds to set up with\n   */\n  fromUnixTime(seconds) {\n    this.zone = Timezone.utcTimezone;\n    // We could use `fromJSDate` here, but this is about twice as fast.\n    // We could also clone `epochTime` and use `adjust` for a more\n    // ical.js-centric approach, but this is about 100 times as fast.\n    let date = new Date(seconds * 1000);\n    this.year = date.getUTCFullYear();\n    this.month = date.getUTCMonth() + 1;\n    this.day = date.getUTCDate();\n    if (this._time.isDate) {\n      this.hour = 0;\n      this.minute = 0;\n      this.second = 0;\n    } else {\n      this.hour = date.getUTCHours();\n      this.minute = date.getUTCMinutes();\n      this.second = date.getUTCSeconds();\n    }\n\n    this._cachedUnixTime = null;\n  }\n\n  /**\n   * Converts the current instance to seconds since January 1st 1970.\n   *\n   * @return {Number}         Seconds since 1970\n   */\n  toUnixTime() {\n    if (this._cachedUnixTime !== null) {\n      return this._cachedUnixTime;\n    }\n    let offset = this.utcOffset();\n\n    // we use the offset trick to ensure\n    // that we are getting the actual UTC time\n    let ms = Date.UTC(\n      this.year,\n      this.month - 1,\n      this.day,\n      this.hour,\n      this.minute,\n      this.second - offset\n    );\n\n    // seconds\n    this._cachedUnixTime = ms / 1000;\n    return this._cachedUnixTime;\n  }\n\n  /**\n   * Converts time to into Object which can be serialized then re-created\n   * using the constructor.\n   *\n   * @example\n   * // toJSON will automatically be called\n   * var json = JSON.stringify(mytime);\n   *\n   * var deserialized = JSON.parse(json);\n   *\n   * var time = new ICAL.Time(deserialized);\n   *\n   * @return {Object}\n   */\n  toJSON() {\n    let copy = [\n      'year',\n      'month',\n      'day',\n      'hour',\n      'minute',\n      'second',\n      'isDate'\n    ];\n\n    let result = Object.create(null);\n\n    let i = 0;\n    let len = copy.length;\n    let prop;\n\n    for (; i < len; i++) {\n      prop = copy[i];\n      result[prop] = this[prop];\n    }\n\n    if (this.zone) {\n      result.timezone = this.zone.tzid;\n    }\n\n    return result;\n  }\n}\n\n/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/.\n * Portions Copyright (C) Philipp Kewisch */\n\n\n/**\n * This lets typescript resolve our custom types in the\n * generated d.ts files (jsdoc typedefs are converted to typescript types).\n * Ignore prevents the typedefs from being documented more than once.\n *\n * @ignore\n * @typedef {import(\"./types.js\").parserState} parserState\n * Imports the 'parserState' type from the \"types.js\" module\n * @typedef {import(\"./types.js\").designSet} designSet\n * Imports the 'designSet' type from the \"types.js\" module\n */\n\nconst CHAR = /[^ \\t]/;\nconst VALUE_DELIMITER = ':';\nconst PARAM_DELIMITER = ';';\nconst PARAM_NAME_DELIMITER = '=';\nconst DEFAULT_VALUE_TYPE$1 = 'unknown';\nconst DEFAULT_PARAM_TYPE = 'text';\nconst RFC6868_REPLACE_MAP$1 = { \"^'\": '\"', \"^n\": \"\\n\", \"^^\": \"^\" };\n\n/**\n * Parses iCalendar or vCard data into a raw jCal object. Consult\n * documentation on the {@tutorial layers|layers of parsing} for more\n * details.\n *\n * @function ICAL.parse\n * @memberof ICAL\n * @variation function\n * @todo Fix the API to be more clear on the return type\n * @param {String} input      The string data to parse\n * @return {Object|Object[]}  A single jCal object, or an array thereof\n */\nfunction parse(input) {\n  let state = {};\n  let root = state.component = [];\n\n  state.stack = [root];\n\n  parse._eachLine(input, function(err, line) {\n    parse._handleContentLine(line, state);\n  });\n\n\n  // when there are still items on the stack\n  // throw a fatal error, a component was not closed\n  // correctly in that case.\n  if (state.stack.length > 1) {\n    throw new ParserError(\n      'invalid ical body. component began but did not end'\n    );\n  }\n\n  state = null;\n\n  return (root.length == 1 ? root[0] : root);\n}\n\n/**\n * Parse an iCalendar property value into the jCal for a single property\n *\n * @function ICAL.parse.property\n * @param {String} str\n *   The iCalendar property string to parse\n * @param {designSet=} designSet\n *   The design data to use for this property\n * @return {Object}\n *   The jCal Object containing the property\n */\nparse.property = function(str, designSet) {\n  let state = {\n    component: [[], []],\n    designSet: designSet || design.defaultSet\n  };\n  parse._handleContentLine(str, state);\n  return state.component[1][0];\n};\n\n/**\n * Convenience method to parse a component. You can use ICAL.parse() directly\n * instead.\n *\n * @function ICAL.parse.component\n * @see ICAL.parse(function)\n * @param {String} str    The iCalendar component string to parse\n * @return {Object}       The jCal Object containing the component\n */\nparse.component = function(str) {\n  return parse(str);\n};\n\n\n/**\n * An error that occurred during parsing.\n *\n * @param {String} message        The error message\n * @memberof ICAL.parse\n * @extends {Error}\n */\nclass ParserError extends Error {\n  name = this.constructor.name;\n}\n\n// classes & constants\nparse.ParserError = ParserError;\n\n\n/**\n * Handles a single line of iCalendar/vCard, updating the state.\n *\n * @private\n * @function ICAL.parse._handleContentLine\n * @param {String} line          The content line to process\n * @param {parserState} state    The current state of the line parsing\n */\nparse._handleContentLine = function(line, state) {\n  // break up the parts of the line\n  let valuePos = line.indexOf(VALUE_DELIMITER);\n  let paramPos = line.indexOf(PARAM_DELIMITER);\n\n  let lastParamIndex;\n  let lastValuePos;\n\n  // name of property or begin/end\n  let name;\n  let value;\n  // params is only overridden if paramPos !== -1.\n  // we can't do params = params || {} later on\n  // because it sacrifices ops.\n  let params = {};\n\n  /**\n   * Different property cases\n   *\n   *\n   * 1. RRULE:FREQ=foo\n   *    // FREQ= is not a param but the value\n   *\n   * 2. ATTENDEE;ROLE=REQ-PARTICIPANT;\n   *    // ROLE= is a param because : has not happened yet\n   */\n    // when the parameter delimiter is after the\n    // value delimiter then it is not a parameter.\n\n  if ((paramPos !== -1 && valuePos !== -1)) {\n    // when the parameter delimiter is after the\n    // value delimiter then it is not a parameter.\n    if (paramPos > valuePos) {\n      paramPos = -1;\n    }\n  }\n\n  let parsedParams;\n  if (paramPos !== -1) {\n    name = line.slice(0, Math.max(0, paramPos)).toLowerCase();\n    parsedParams = parse._parseParameters(line.slice(Math.max(0, paramPos)), 0, state.designSet);\n    if (parsedParams[2] == -1) {\n      throw new ParserError(\"Invalid parameters in '\" + line + \"'\");\n    }\n    params = parsedParams[0];\n    // Handle parameter values with multiple entries\n    let parsedParamLength;\n    if (typeof parsedParams[1] === 'string') {\n      parsedParamLength = parsedParams[1].length;\n    } else {\n      parsedParamLength = parsedParams[1].reduce((accumulator, currentValue) => {\n        return accumulator + currentValue.length;\n      }, 0);\n    }\n    lastParamIndex = parsedParamLength + parsedParams[2] + paramPos;\n    if ((lastValuePos =\n      line.slice(Math.max(0, lastParamIndex)).indexOf(VALUE_DELIMITER)) !== -1) {\n      value = line.slice(Math.max(0, lastParamIndex + lastValuePos + 1));\n    } else {\n      throw new ParserError(\"Missing parameter value in '\" + line + \"'\");\n    }\n  } else if (valuePos !== -1) {\n    // without parmeters (BEGIN:VCAENDAR, CLASS:PUBLIC)\n    name = line.slice(0, Math.max(0, valuePos)).toLowerCase();\n    value = line.slice(Math.max(0, valuePos + 1));\n\n    if (name === 'begin') {\n      let newComponent = [value.toLowerCase(), [], []];\n      if (state.stack.length === 1) {\n        state.component.push(newComponent);\n      } else {\n        state.component[2].push(newComponent);\n      }\n      state.stack.push(state.component);\n      state.component = newComponent;\n      if (!state.designSet) {\n        state.designSet = design.getDesignSet(state.component[0]);\n      }\n      return;\n    } else if (name === 'end') {\n      state.component = state.stack.pop();\n      return;\n    }\n    // If it is not begin/end, then this is a property with an empty value,\n    // which should be considered valid.\n  } else {\n    /**\n     * Invalid line.\n     * The rational to throw an error is we will\n     * never be certain that the rest of the file\n     * is sane and it is unlikely that we can serialize\n     * the result correctly either.\n     */\n    throw new ParserError(\n      'invalid line (no token \";\" or \":\") \"' + line + '\"'\n    );\n  }\n\n  let valueType;\n  let multiValue = false;\n  let structuredValue = false;\n  let propertyDetails;\n  let splitName;\n  let ungroupedName;\n\n  // fetch the ungrouped part of the name\n  if (state.designSet.propertyGroups && name.indexOf('.') !== -1) {\n    splitName = name.split('.');\n    params.group = splitName[0];\n    ungroupedName = splitName[1];\n  } else {\n    ungroupedName = name;\n  }\n\n  if (ungroupedName in state.designSet.property) {\n    propertyDetails = state.designSet.property[ungroupedName];\n\n    if ('multiValue' in propertyDetails) {\n      multiValue = propertyDetails.multiValue;\n    }\n\n    if ('structuredValue' in propertyDetails) {\n      structuredValue = propertyDetails.structuredValue;\n    }\n\n    if (value && 'detectType' in propertyDetails) {\n      valueType = propertyDetails.detectType(value);\n    }\n  }\n\n  // attempt to determine value\n  if (!valueType) {\n    if (!('value' in params)) {\n      if (propertyDetails) {\n        valueType = propertyDetails.defaultType;\n      } else {\n        valueType = DEFAULT_VALUE_TYPE$1;\n      }\n    } else {\n      // possible to avoid this?\n      valueType = params.value.toLowerCase();\n    }\n  }\n\n  delete params.value;\n\n  /**\n   * Note on `var result` juggling:\n   *\n   * I observed that building the array in pieces has adverse\n   * effects on performance, so where possible we inline the creation.\n   * It is a little ugly but resulted in ~2000 additional ops/sec.\n   */\n\n  let result;\n  if (multiValue && structuredValue) {\n    value = parse._parseMultiValue(value, structuredValue, valueType, [], multiValue, state.designSet, structuredValue);\n    result = [ungroupedName, params, valueType, value];\n  } else if (multiValue) {\n    result = [ungroupedName, params, valueType];\n    parse._parseMultiValue(value, multiValue, valueType, result, null, state.designSet, false);\n  } else if (structuredValue) {\n    value = parse._parseMultiValue(value, structuredValue, valueType, [], null, state.designSet, structuredValue);\n    result = [ungroupedName, params, valueType, value];\n  } else {\n    value = parse._parseValue(value, valueType, state.designSet, false);\n    result = [ungroupedName, params, valueType, value];\n  }\n  // rfc6350 requires that in vCard 4.0 the first component is the VERSION\n  // component with as value 4.0, note that 3.0 does not have this requirement.\n  if (state.component[0] === 'vcard' && state.component[1].length === 0 &&\n          !(name === 'version' && value === '4.0')) {\n    state.designSet = design.getDesignSet(\"vcard3\");\n  }\n  state.component[1].push(result);\n};\n\n/**\n * Parse a value from the raw value into the jCard/jCal value.\n *\n * @private\n * @function ICAL.parse._parseValue\n * @param {String} value          Original value\n * @param {String} type           Type of value\n * @param {Object} designSet      The design data to use for this value\n * @return {Object} varies on type\n */\nparse._parseValue = function(value, type, designSet, structuredValue) {\n  if (type in designSet.value && 'fromICAL' in designSet.value[type]) {\n    return designSet.value[type].fromICAL(value, structuredValue);\n  }\n  return value;\n};\n\n/**\n * Parse parameters from a string to object.\n *\n * @function ICAL.parse._parseParameters\n * @private\n * @param {String} line               A single unfolded line\n * @param {Number} start              Position to start looking for properties\n * @param {Object} designSet          The design data to use for this property\n * @return {Array}                    Array containing key/valye pairs of parsed parameters, the\n *                                      parsed value, and the position of the last parameter found\n */\nparse._parseParameters = function(line, start, designSet) {\n  let lastParam = start;\n  let pos = 0;\n  let delim = PARAM_NAME_DELIMITER;\n  let result = {};\n  let name, lcname;\n  let value, valuePos = -1;\n  let type, multiValue, mvdelim;\n\n  // find the next '=' sign\n  // use lastParam and pos to find name\n  // check if \" is used if so get value from \"->\"\n  // then increment pos to find next ;\n\n  while ((pos !== false) &&\n         (pos = line.indexOf(delim, pos + 1)) !== -1) {\n\n    name = line.slice(lastParam + 1, pos);\n    if (name.length == 0) {\n      throw new ParserError(\"Empty parameter name in '\" + line + \"'\");\n    }\n    lcname = name.toLowerCase();\n    mvdelim = false;\n    multiValue = false;\n\n    if (lcname in designSet.param && designSet.param[lcname].valueType) {\n      type = designSet.param[lcname].valueType;\n    } else {\n      type = DEFAULT_PARAM_TYPE;\n    }\n\n    if (lcname in designSet.param) {\n      multiValue = designSet.param[lcname].multiValue;\n      if (designSet.param[lcname].multiValueSeparateDQuote) {\n        mvdelim = parse._rfc6868Escape('\"' + multiValue + '\"');\n      }\n    }\n\n    let nextChar = line[pos + 1];\n    if (nextChar === '\"') {\n      valuePos = pos + 2;\n      pos = line.indexOf('\"', valuePos);\n      if (multiValue && pos != -1) {\n          let extendedValue = true;\n          while (extendedValue) {\n            if (line[pos + 1] == multiValue && line[pos + 2] == '\"') {\n              pos = line.indexOf('\"', pos + 3);\n            } else {\n              extendedValue = false;\n            }\n          }\n        }\n      if (pos === -1) {\n        throw new ParserError(\n          'invalid line (no matching double quote) \"' + line + '\"'\n        );\n      }\n      value = line.slice(valuePos, pos);\n      lastParam = line.indexOf(PARAM_DELIMITER, pos);\n      let propValuePos = line.indexOf(VALUE_DELIMITER, pos);\n      // if either no next parameter or delimeter in property value, let's stop here\n      if (lastParam === -1 || (propValuePos !== -1 && lastParam > propValuePos)) {\n        pos = false;\n      }\n    } else {\n      valuePos = pos + 1;\n\n      // move to next \";\"\n      let nextPos = line.indexOf(PARAM_DELIMITER, valuePos);\n      let propValuePos = line.indexOf(VALUE_DELIMITER, valuePos);\n      if (propValuePos !== -1 && nextPos > propValuePos) {\n        // this is a delimiter in the property value, let's stop here\n        nextPos = propValuePos;\n        pos = false;\n      } else if (nextPos === -1) {\n        // no \";\"\n        if (propValuePos === -1) {\n          nextPos = line.length;\n        } else {\n          nextPos = propValuePos;\n        }\n        pos = false;\n      } else {\n        lastParam = nextPos;\n        pos = nextPos;\n      }\n\n      value = line.slice(valuePos, nextPos);\n    }\n\n    const length_before = value.length;\n    value = parse._rfc6868Escape(value);\n    valuePos += length_before - value.length;\n    if (multiValue) {\n      let delimiter = mvdelim || multiValue;\n      value = parse._parseMultiValue(value, delimiter, type, [], null, designSet);\n    } else {\n      value = parse._parseValue(value, type, designSet);\n    }\n\n    if (multiValue && (lcname in result)) {\n      if (Array.isArray(result[lcname])) {\n        result[lcname].push(value);\n      } else {\n        result[lcname] = [\n          result[lcname],\n          value\n        ];\n      }\n    } else {\n      result[lcname] = value;\n    }\n  }\n  return [result, value, valuePos];\n};\n\n/**\n * Internal helper for rfc6868. Exposing this on ICAL.parse so that\n * hackers can disable the rfc6868 parsing if the really need to.\n *\n * @function ICAL.parse._rfc6868Escape\n * @param {String} val        The value to escape\n * @return {String}           The escaped value\n */\nparse._rfc6868Escape = function(val) {\n  return val.replace(/\\^['n^]/g, function(x) {\n    return RFC6868_REPLACE_MAP$1[x];\n  });\n};\n\n/**\n * Parse a multi value string. This function is used either for parsing\n * actual multi-value property's values, or for handling parameter values. It\n * can be used for both multi-value properties and structured value properties.\n *\n * @private\n * @function ICAL.parse._parseMultiValue\n * @param {String} buffer           The buffer containing the full value\n * @param {String} delim            The multi-value delimiter\n * @param {String} type             The value type to be parsed\n * @param {Array.<?>} result        The array to append results to, varies on value type\n * @param {String} innerMulti       The inner delimiter to split each value with\n * @param {designSet} designSet     The design data for this value\n * @return {?|Array.<?>}            Either an array of results, or the first result\n */\nparse._parseMultiValue = function(buffer, delim, type, result, innerMulti, designSet, structuredValue) {\n  let pos = 0;\n  let lastPos = 0;\n  let value;\n  if (delim.length === 0) {\n    return buffer;\n  }\n\n  // split each piece\n  while ((pos = unescapedIndexOf(buffer, delim, lastPos)) !== -1) {\n    value = buffer.slice(lastPos, pos);\n    if (innerMulti) {\n      value = parse._parseMultiValue(value, innerMulti, type, [], null, designSet, structuredValue);\n    } else {\n      value = parse._parseValue(value, type, designSet, structuredValue);\n    }\n    result.push(value);\n    lastPos = pos + delim.length;\n  }\n\n  // on the last piece take the rest of string\n  value = buffer.slice(lastPos);\n  if (innerMulti) {\n    value = parse._parseMultiValue(value, innerMulti, type, [], null, designSet, structuredValue);\n  } else {\n    value = parse._parseValue(value, type, designSet, structuredValue);\n  }\n  result.push(value);\n\n  return result.length == 1 ? result[0] : result;\n};\n\n/**\n * Process a complete buffer of iCalendar/vCard data line by line, correctly\n * unfolding content. Each line will be processed with the given callback\n *\n * @private\n * @function ICAL.parse._eachLine\n * @param {String} buffer                         The buffer to process\n * @param {function(?String, String)} callback    The callback for each line\n */\nparse._eachLine = function(buffer, callback) {\n  let len = buffer.length;\n  let lastPos = buffer.search(CHAR);\n  let pos = lastPos;\n  let line;\n  let firstChar;\n\n  let newlineOffset;\n\n  do {\n    pos = buffer.indexOf('\\n', lastPos) + 1;\n\n    if (pos > 1 && buffer[pos - 2] === '\\r') {\n      newlineOffset = 2;\n    } else {\n      newlineOffset = 1;\n    }\n\n    if (pos === 0) {\n      pos = len;\n      newlineOffset = 0;\n    }\n\n    firstChar = buffer[lastPos];\n\n    if (firstChar === ' ' || firstChar === '\\t') {\n      // add to line\n      line += buffer.slice(lastPos + 1, pos - newlineOffset);\n    } else {\n      if (line)\n        callback(null, line);\n      // push line\n      line = buffer.slice(lastPos, pos - newlineOffset);\n    }\n\n    lastPos = pos;\n  } while (pos !== len);\n\n  // extra ending line\n  line = line.trim();\n\n  if (line.length)\n    callback(null, line);\n};\n\n/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/.\n * Portions Copyright (C) Philipp Kewisch */\n\n\nconst OPTIONS = [\"tzid\", \"location\", \"tznames\", \"latitude\", \"longitude\"];\n\n/**\n * Timezone representation.\n *\n * @example\n * var vcalendar;\n * var timezoneComp = vcalendar.getFirstSubcomponent('vtimezone');\n * var tzid = timezoneComp.getFirstPropertyValue('tzid');\n *\n * var timezone = new ICAL.Timezone({\n *   component: timezoneComp,\n *   tzid\n * });\n *\n * @memberof ICAL\n */\nclass Timezone {\n  static _compare_change_fn(a, b) {\n    if (a.year < b.year) return -1;\n    else if (a.year > b.year) return 1;\n\n    if (a.month < b.month) return -1;\n    else if (a.month > b.month) return 1;\n\n    if (a.day < b.day) return -1;\n    else if (a.day > b.day) return 1;\n\n    if (a.hour < b.hour) return -1;\n    else if (a.hour > b.hour) return 1;\n\n    if (a.minute < b.minute) return -1;\n    else if (a.minute > b.minute) return 1;\n\n    if (a.second < b.second) return -1;\n    else if (a.second > b.second) return 1;\n\n    return 0;\n  }\n\n  /**\n   * Convert the date/time from one zone to the next.\n   *\n   * @param {Time} tt                  The time to convert\n   * @param {Timezone} from_zone       The source zone to convert from\n   * @param {Timezone} to_zone         The target zone to convert to\n   * @return {Time}                    The converted date/time object\n   */\n  static convert_time(tt, from_zone, to_zone) {\n    if (tt.isDate ||\n        from_zone.tzid == to_zone.tzid ||\n        from_zone == Timezone.localTimezone ||\n        to_zone == Timezone.localTimezone) {\n      tt.zone = to_zone;\n      return tt;\n    }\n\n    let utcOffset = from_zone.utcOffset(tt);\n    tt.adjust(0, 0, 0, - utcOffset);\n\n    utcOffset = to_zone.utcOffset(tt);\n    tt.adjust(0, 0, 0, utcOffset);\n\n    return null;\n  }\n\n  /**\n   * Creates a new ICAL.Timezone instance from the passed data object.\n   *\n   * @param {Component|Object} aData options for class\n   * @param {String|Component} aData.component\n   *        If aData is a simple object, then this member can be set to either a\n   *        string containing the component data, or an already parsed\n   *        ICAL.Component\n   * @param {String} aData.tzid      The timezone identifier\n   * @param {String} aData.location  The timezone locationw\n   * @param {String} aData.tznames   An alternative string representation of the\n   *                                  timezone\n   * @param {Number} aData.latitude  The latitude of the timezone\n   * @param {Number} aData.longitude The longitude of the timezone\n   */\n  static fromData(aData) {\n    let tt = new Timezone();\n    return tt.fromData(aData);\n  }\n\n  /**\n   * The instance describing the UTC timezone\n   * @type {Timezone}\n   * @constant\n   * @instance\n   */\n  static #utcTimezone = null;\n  static get utcTimezone() {\n    if (!this.#utcTimezone) {\n      this.#utcTimezone = Timezone.fromData({\n        tzid: \"UTC\"\n      });\n    }\n    return this.#utcTimezone;\n  }\n\n  /**\n   * The instance describing the local timezone\n   * @type {Timezone}\n   * @constant\n   * @instance\n   */\n  static #localTimezone = null;\n  static get localTimezone() {\n    if (!this.#localTimezone) {\n      this.#localTimezone = Timezone.fromData({\n        tzid: \"floating\"\n      });\n    }\n    return this.#localTimezone;\n  }\n\n  /**\n   * Adjust a timezone change object.\n   * @private\n   * @param {Object} change     The timezone change object\n   * @param {Number} days       The extra amount of days\n   * @param {Number} hours      The extra amount of hours\n   * @param {Number} minutes    The extra amount of minutes\n   * @param {Number} seconds    The extra amount of seconds\n   */\n  static adjust_change(change, days, hours, minutes, seconds) {\n    return Time.prototype.adjust.call(\n      change,\n      days,\n      hours,\n      minutes,\n      seconds,\n      change\n    );\n  }\n\n  static _minimumExpansionYear = -1;\n  static EXTRA_COVERAGE = 5;\n\n  /**\n   * Creates a new ICAL.Timezone instance, by passing in a tzid and component.\n   *\n   * @param {Component|Object} data options for class\n   * @param {String|Component} data.component\n   *        If data is a simple object, then this member can be set to either a\n   *        string containing the component data, or an already parsed\n   *        ICAL.Component\n   * @param {String} data.tzid      The timezone identifier\n   * @param {String} data.location  The timezone locationw\n   * @param {String} data.tznames   An alternative string representation of the\n   *                                  timezone\n   * @param {Number} data.latitude  The latitude of the timezone\n   * @param {Number} data.longitude The longitude of the timezone\n   */\n  constructor(data) {\n    this.wrappedJSObject = this;\n    this.fromData(data);\n  }\n\n\n  /**\n   * Timezone identifier\n   * @type {String}\n   */\n  tzid = \"\";\n\n  /**\n   * Timezone location\n   * @type {String}\n   */\n  location = \"\";\n\n  /**\n   * Alternative timezone name, for the string representation\n   * @type {String}\n   */\n  tznames = \"\";\n\n  /**\n   * The primary latitude for the timezone.\n   * @type {Number}\n   */\n  latitude = 0.0;\n\n  /**\n   * The primary longitude for the timezone.\n   * @type {Number}\n   */\n  longitude = 0.0;\n\n  /**\n   * The vtimezone component for this timezone.\n   * @type {Component}\n   */\n  component = null;\n\n  /**\n   * The year this timezone has been expanded to. All timezone transition\n   * dates until this year are known and can be used for calculation\n   *\n   * @private\n   * @type {Number}\n   */\n  expandedUntilYear = 0;\n\n  /**\n   * The class identifier.\n   * @constant\n   * @type {String}\n   * @default \"icaltimezone\"\n   */\n  icalclass = \"icaltimezone\";\n\n  /**\n   * Sets up the current instance using members from the passed data object.\n   *\n   * @param {Component|Object} aData options for class\n   * @param {String|Component} aData.component\n   *        If aData is a simple object, then this member can be set to either a\n   *        string containing the component data, or an already parsed\n   *        ICAL.Component\n   * @param {String} aData.tzid      The timezone identifier\n   * @param {String} aData.location  The timezone locationw\n   * @param {String} aData.tznames   An alternative string representation of the\n   *                                  timezone\n   * @param {Number} aData.latitude  The latitude of the timezone\n   * @param {Number} aData.longitude The longitude of the timezone\n   */\n  fromData(aData) {\n    this.expandedUntilYear = 0;\n    this.changes = [];\n\n    if (aData instanceof Component) {\n      // Either a component is passed directly\n      this.component = aData;\n    } else {\n      // Otherwise the component may be in the data object\n      if (aData && \"component\" in aData) {\n        if (typeof aData.component == \"string\") {\n          // If a string was passed, parse it as a component\n          let jCal = parse(aData.component);\n          this.component = new Component(jCal);\n        } else if (aData.component instanceof Component) {\n          // If it was a component already, then just set it\n          this.component = aData.component;\n        } else {\n          // Otherwise just null out the component\n          this.component = null;\n        }\n      }\n\n      // Copy remaining passed properties\n      for (let prop of OPTIONS) {\n        if (aData && prop in aData) {\n          this[prop] = aData[prop];\n        }\n      }\n    }\n\n    // If we have a component but no TZID, attempt to get it from the\n    // component's properties.\n    if (this.component instanceof Component && !this.tzid) {\n      this.tzid = this.component.getFirstPropertyValue('tzid');\n    }\n\n    return this;\n  }\n\n  /**\n   * Finds the utcOffset the given time would occur in this timezone.\n   *\n   * @param {Time} tt         The time to check for\n   * @return {Number}         utc offset in seconds\n   */\n  utcOffset(tt) {\n    if (this == Timezone.utcTimezone || this == Timezone.localTimezone) {\n      return 0;\n    }\n\n    this._ensureCoverage(tt.year);\n\n    if (!this.changes.length) {\n      return 0;\n    }\n\n    let tt_change = {\n      year: tt.year,\n      month: tt.month,\n      day: tt.day,\n      hour: tt.hour,\n      minute: tt.minute,\n      second: tt.second\n    };\n\n    let change_num = this._findNearbyChange(tt_change);\n    let change_num_to_use = -1;\n    let step = 1;\n\n    // TODO: replace with bin search?\n    for (;;) {\n      let change = clone(this.changes[change_num], true);\n      if (change.utcOffset < change.prevUtcOffset) {\n        Timezone.adjust_change(change, 0, 0, 0, change.utcOffset);\n      } else {\n        Timezone.adjust_change(change, 0, 0, 0,\n                                        change.prevUtcOffset);\n      }\n\n      let cmp = Timezone._compare_change_fn(tt_change, change);\n\n      if (cmp >= 0) {\n        change_num_to_use = change_num;\n      } else {\n        step = -1;\n      }\n\n      if (step == -1 && change_num_to_use != -1) {\n        break;\n      }\n\n      change_num += step;\n\n      if (change_num < 0) {\n        return 0;\n      }\n\n      if (change_num >= this.changes.length) {\n        break;\n      }\n    }\n\n    let zone_change = this.changes[change_num_to_use];\n    let utcOffset_change = zone_change.utcOffset - zone_change.prevUtcOffset;\n\n    if (utcOffset_change < 0 && change_num_to_use > 0) {\n      let tmp_change = clone(zone_change, true);\n      Timezone.adjust_change(tmp_change, 0, 0, 0, tmp_change.prevUtcOffset);\n\n      if (Timezone._compare_change_fn(tt_change, tmp_change) < 0) {\n        let prev_zone_change = this.changes[change_num_to_use - 1];\n\n        let want_daylight = false; // TODO\n\n        if (zone_change.is_daylight != want_daylight &&\n            prev_zone_change.is_daylight == want_daylight) {\n          zone_change = prev_zone_change;\n        }\n      }\n    }\n\n    // TODO return is_daylight?\n    return zone_change.utcOffset;\n  }\n\n  _findNearbyChange(change) {\n    // find the closest match\n    let idx = binsearchInsert(\n      this.changes,\n      change,\n      Timezone._compare_change_fn\n    );\n\n    if (idx >= this.changes.length) {\n      return this.changes.length - 1;\n    }\n\n    return idx;\n  }\n\n  _ensureCoverage(aYear) {\n    if (Timezone._minimumExpansionYear == -1) {\n      let today = Time.now();\n      Timezone._minimumExpansionYear = today.year;\n    }\n\n    let changesEndYear = aYear;\n    if (changesEndYear < Timezone._minimumExpansionYear) {\n      changesEndYear = Timezone._minimumExpansionYear;\n    }\n\n    changesEndYear += Timezone.EXTRA_COVERAGE;\n\n    if (!this.changes.length || this.expandedUntilYear < aYear) {\n      let subcomps = this.component.getAllSubcomponents();\n      let compLen = subcomps.length;\n      let compIdx = 0;\n\n      for (; compIdx < compLen; compIdx++) {\n        this._expandComponent(\n          subcomps[compIdx], changesEndYear, this.changes\n        );\n      }\n\n      this.changes.sort(Timezone._compare_change_fn);\n      this.expandedUntilYear = changesEndYear;\n    }\n  }\n\n  _expandComponent(aComponent, aYear, changes) {\n    if (!aComponent.hasProperty(\"dtstart\") ||\n        !aComponent.hasProperty(\"tzoffsetto\") ||\n        !aComponent.hasProperty(\"tzoffsetfrom\")) {\n      return null;\n    }\n\n    let dtstart = aComponent.getFirstProperty(\"dtstart\").getFirstValue();\n    let change;\n\n    function convert_tzoffset(offset) {\n      return offset.factor * (offset.hours * 3600 + offset.minutes * 60);\n    }\n\n    function init_changes() {\n      let changebase = {};\n      changebase.is_daylight = (aComponent.name == \"daylight\");\n      changebase.utcOffset = convert_tzoffset(\n        aComponent.getFirstProperty(\"tzoffsetto\").getFirstValue()\n      );\n\n      changebase.prevUtcOffset = convert_tzoffset(\n        aComponent.getFirstProperty(\"tzoffsetfrom\").getFirstValue()\n      );\n\n      return changebase;\n    }\n\n    if (!aComponent.hasProperty(\"rrule\") && !aComponent.hasProperty(\"rdate\")) {\n      change = init_changes();\n      change.year = dtstart.year;\n      change.month = dtstart.month;\n      change.day = dtstart.day;\n      change.hour = dtstart.hour;\n      change.minute = dtstart.minute;\n      change.second = dtstart.second;\n\n      Timezone.adjust_change(change, 0, 0, 0, -change.prevUtcOffset);\n      changes.push(change);\n    } else {\n      let props = aComponent.getAllProperties(\"rdate\");\n      for (let rdate of props) {\n        let time = rdate.getFirstValue();\n        change = init_changes();\n\n        change.year = time.year;\n        change.month = time.month;\n        change.day = time.day;\n\n        if (time.isDate) {\n          change.hour = dtstart.hour;\n          change.minute = dtstart.minute;\n          change.second = dtstart.second;\n\n          if (dtstart.zone != Timezone.utcTimezone) {\n            Timezone.adjust_change(change, 0, 0, 0, -change.prevUtcOffset);\n          }\n        } else {\n          change.hour = time.hour;\n          change.minute = time.minute;\n          change.second = time.second;\n\n          if (time.zone != Timezone.utcTimezone) {\n            Timezone.adjust_change(change, 0, 0, 0, -change.prevUtcOffset);\n          }\n        }\n\n        changes.push(change);\n      }\n\n      let rrule = aComponent.getFirstProperty(\"rrule\");\n\n      if (rrule) {\n        rrule = rrule.getFirstValue();\n        change = init_changes();\n\n        if (rrule.until && rrule.until.zone == Timezone.utcTimezone) {\n          rrule.until.adjust(0, 0, 0, change.prevUtcOffset);\n          rrule.until.zone = Timezone.localTimezone;\n        }\n\n        let iterator = rrule.iterator(dtstart);\n\n        let occ;\n        while ((occ = iterator.next())) {\n          change = init_changes();\n          if (occ.year > aYear || !occ) {\n            break;\n          }\n\n          change.year = occ.year;\n          change.month = occ.month;\n          change.day = occ.day;\n          change.hour = occ.hour;\n          change.minute = occ.minute;\n          change.second = occ.second;\n          change.isDate = occ.isDate;\n\n          Timezone.adjust_change(change, 0, 0, 0, -change.prevUtcOffset);\n          changes.push(change);\n        }\n      }\n    }\n\n    return changes;\n  }\n\n  /**\n   * The string representation of this timezone.\n   * @return {String}\n   */\n  toString() {\n    return (this.tznames ? this.tznames : this.tzid);\n  }\n}\n\n/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/.\n * Portions Copyright (C) Philipp Kewisch */\n\n\nlet zones = null;\n\n/**\n * @classdesc\n * Singleton class to contain timezones.  Right now it is all manual registry in\n * the future we may use this class to download timezone information or handle\n * loading pre-expanded timezones.\n *\n * @exports module:ICAL.TimezoneService\n * @memberof ICAL\n */\nconst TimezoneService = {\n  get count() {\n    if (zones === null) {\n      return 0;\n    }\n\n    return Object.keys(zones).length;\n  },\n\n  reset: function() {\n    zones = Object.create(null);\n    let utc = Timezone.utcTimezone;\n\n    zones.Z = utc;\n    zones.UTC = utc;\n    zones.GMT = utc;\n  },\n  _hard_reset: function() {\n    zones = null;\n  },\n\n  /**\n   * Checks if timezone id has been registered.\n   *\n   * @param {String} tzid     Timezone identifier (e.g. America/Los_Angeles)\n   * @return {Boolean}        False, when not present\n   */\n  has: function(tzid) {\n    if (zones === null) {\n      return false;\n    }\n\n    return !!zones[tzid];\n  },\n\n  /**\n   * Returns a timezone by its tzid if present.\n   *\n   * @param {String} tzid               Timezone identifier (e.g. America/Los_Angeles)\n   * @return {Timezone | undefined}     The timezone, or undefined if not found\n   */\n  get: function(tzid) {\n    if (zones === null) {\n      this.reset();\n    }\n\n    return zones[tzid];\n  },\n\n  /**\n   * Registers a timezone object or component.\n   *\n   * @param {Component|Timezone} timezone\n   *        The initialized zone or vtimezone.\n   *\n   * @param {String=} name\n   *        The name of the timezone. Defaults to the component's TZID if not\n   *        passed.\n   */\n  register: function(timezone, name) {\n    if (zones === null) {\n      this.reset();\n    }\n\n    // This avoids a breaking change by the change of argument order\n    // TODO remove in v3\n    if (typeof timezone === \"string\" && name instanceof Timezone) {\n      [timezone, name] = [name, timezone];\n    }\n\n    if (!name) {\n      if (timezone instanceof Timezone) {\n        name = timezone.tzid;\n      } else {\n        if (timezone.name === 'vtimezone') {\n          timezone = new Timezone(timezone);\n          name = timezone.tzid;\n        }\n      }\n    }\n\n    if (!name) {\n      throw new TypeError(\"Neither a timezone nor a name was passed\");\n    }\n\n    if (timezone instanceof Timezone) {\n      zones[name] = timezone;\n    } else {\n      throw new TypeError('timezone must be ICAL.Timezone or ICAL.Component');\n    }\n  },\n\n  /**\n   * Removes a timezone by its tzid from the list.\n   *\n   * @param {String} tzid     Timezone identifier (e.g. America/Los_Angeles)\n   * @return {?Timezone}      The removed timezone, or null if not registered\n   */\n  remove: function(tzid) {\n    if (zones === null) {\n      return null;\n    }\n\n    return (delete zones[tzid]);\n  }\n};\n\n/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/.\n * Portions Copyright (C) Philipp Kewisch */\n\n\n/**\n * Helper functions used in various places within ical.js\n * @module ICAL.helpers\n */\n\n/**\n * Compiles a list of all referenced TZIDs in all subcomponents and\n * removes any extra VTIMEZONE subcomponents. In addition, if any TZIDs\n * are referenced by a component, but a VTIMEZONE does not exist,\n * an attempt will be made to generate a VTIMEZONE using ICAL.TimezoneService.\n *\n * @param {Component} vcal     The top-level VCALENDAR component.\n * @return {Component}         The ICAL.Component that was passed in.\n */\nfunction updateTimezones(vcal) {\n  let allsubs, properties, vtimezones, reqTzid, i;\n\n  if (!vcal || vcal.name !== \"vcalendar\") {\n    //not a top-level vcalendar component\n    return vcal;\n  }\n\n  //Store vtimezone subcomponents in an object reference by tzid.\n  //Store properties from everything else in another array\n  allsubs = vcal.getAllSubcomponents();\n  properties = [];\n  vtimezones = {};\n  for (i = 0; i < allsubs.length; i++) {\n    if (allsubs[i].name === \"vtimezone\") {\n      let tzid = allsubs[i].getFirstProperty(\"tzid\").getFirstValue();\n      vtimezones[tzid] = allsubs[i];\n    } else {\n      properties = properties.concat(allsubs[i].getAllProperties());\n    }\n  }\n\n  //create an object with one entry for each required tz\n  reqTzid = {};\n  for (i = 0; i < properties.length; i++) {\n    let tzid = properties[i].getParameter(\"tzid\");\n    if (tzid) {\n      reqTzid[tzid] = true;\n    }\n  }\n\n  //delete any vtimezones that are not on the reqTzid list.\n  for (let [tzid, comp] of Object.entries(vtimezones)) {\n    if (!reqTzid[tzid]) {\n      vcal.removeSubcomponent(comp);\n    }\n  }\n\n  //create any missing, but registered timezones\n  for (let tzid of Object.keys(reqTzid)) {\n    if (!vtimezones[tzid] && TimezoneService.has(tzid)) {\n      vcal.addSubcomponent(TimezoneService.get(tzid).component);\n    }\n  }\n\n  return vcal;\n}\n\n/**\n * Checks if the given type is of the number type and also NaN.\n *\n * @param {Number} number     The number to check\n * @return {Boolean}          True, if the number is strictly NaN\n */\nfunction isStrictlyNaN(number) {\n  return typeof(number) === 'number' && isNaN(number);\n}\n\n/**\n * Parses a string value that is expected to be an integer, when the valid is\n * not an integer throws a decoration error.\n *\n * @param {String} string     Raw string input\n * @return {Number}           Parsed integer\n */\nfunction strictParseInt(string) {\n  let result = parseInt(string, 10);\n\n  if (isStrictlyNaN(result)) {\n    throw new Error(\n      'Could not extract integer from \"' + string + '\"'\n    );\n  }\n\n  return result;\n}\n\n/**\n * Creates or returns a class instance of a given type with the initialization\n * data if the data is not already an instance of the given type.\n *\n * @example\n * var time = new ICAL.Time(...);\n * var result = ICAL.helpers.formatClassType(time, ICAL.Time);\n *\n * (result instanceof ICAL.Time)\n * // => true\n *\n * result = ICAL.helpers.formatClassType({}, ICAL.Time);\n * (result isntanceof ICAL.Time)\n * // => true\n *\n *\n * @param {Object} data       object initialization data\n * @param {Object} type       object type (like ICAL.Time)\n * @return {?}                An instance of the found type.\n */\nfunction formatClassType(data, type) {\n  if (typeof(data) === 'undefined') {\n    return undefined;\n  }\n\n  if (data instanceof type) {\n    return data;\n  }\n  return new type(data);\n}\n\n/**\n * Identical to indexOf but will only match values when they are not preceded\n * by a backslash character.\n *\n * @param {String} buffer         String to search\n * @param {String} search         Value to look for\n * @param {Number} pos            Start position\n * @return {Number}               The position, or -1 if not found\n */\nfunction unescapedIndexOf(buffer, search, pos) {\n  while ((pos = buffer.indexOf(search, pos)) !== -1) {\n    if (pos > 0 && buffer[pos - 1] === '\\\\') {\n      pos += 1;\n    } else {\n      return pos;\n    }\n  }\n  return -1;\n}\n\n/**\n * Find the index for insertion using binary search.\n *\n * @param {Array} list            The list to search\n * @param {?} seekVal             The value to insert\n * @param {function(?,?)} cmpfunc The comparison func, that can\n *                                  compare two seekVals\n * @return {Number}               The insert position\n */\nfunction binsearchInsert(list, seekVal, cmpfunc) {\n  if (!list.length)\n    return 0;\n\n  let low = 0, high = list.length - 1,\n      mid, cmpval;\n\n  while (low <= high) {\n    mid = low + Math.floor((high - low) / 2);\n    cmpval = cmpfunc(seekVal, list[mid]);\n\n    if (cmpval < 0)\n      high = mid - 1;\n    else if (cmpval > 0)\n      low = mid + 1;\n    else\n      break;\n  }\n\n  if (cmpval < 0)\n    return mid; // insertion is displacing, so use mid outright.\n  else if (cmpval > 0)\n    return mid + 1;\n  else\n    return mid;\n}\n\n/**\n * Clone the passed object or primitive. By default a shallow clone will be\n * executed.\n *\n * @param {*} aSrc            The thing to clone\n * @param {Boolean=} aDeep    If true, a deep clone will be performed\n * @return {*}                The copy of the thing\n */\nfunction clone(aSrc, aDeep) {\n  if (!aSrc || typeof aSrc != \"object\") {\n    return aSrc;\n  } else if (aSrc instanceof Date) {\n    return new Date(aSrc.getTime());\n  } else if (\"clone\" in aSrc) {\n    return aSrc.clone();\n  } else if (Array.isArray(aSrc)) {\n    let arr = [];\n    for (let i = 0; i < aSrc.length; i++) {\n      arr.push(aDeep ? clone(aSrc[i], true) : aSrc[i]);\n    }\n    return arr;\n  } else {\n    let obj = {};\n    for (let [name, value] of Object.entries(aSrc)) {\n      if (aDeep) {\n        obj[name] = clone(value, true);\n      } else {\n        obj[name] = value;\n      }\n    }\n    return obj;\n  }\n}\n\n/**\n * Performs iCalendar line folding. A line ending character is inserted and\n * the next line begins with a whitespace.\n *\n * @example\n * SUMMARY:This line will be fold\n *  ed right in the middle of a word.\n *\n * @param {String} aLine      The line to fold\n * @return {String}           The folded line\n */\nfunction foldline(aLine) {\n  let result = \"\";\n  let line = aLine || \"\", pos = 0, line_length = 0;\n  //pos counts position in line for the UTF-16 presentation\n  //line_length counts the bytes for the UTF-8 presentation\n  while (line.length) {\n    let cp = line.codePointAt(pos);\n    if (cp < 128) ++line_length;\n    else if (cp < 2048) line_length += 2;//needs 2 UTF-8 bytes\n    else if (cp < 65536) line_length += 3;\n    else line_length += 4; //cp is less than 1114112\n    if (line_length < ICALmodule.foldLength + 1)\n      pos += cp > 65535 ? 2 : 1;\n    else {\n      result += ICALmodule.newLineChar + \" \" + line.slice(0, Math.max(0, pos));\n      line = line.slice(Math.max(0, pos));\n      pos = line_length = 0;\n    }\n  }\n  return result.slice(ICALmodule.newLineChar.length + 1);\n}\n\n/**\n * Pads the given string or number with zeros so it will have at least two\n * characters.\n *\n * @param {String|Number} data    The string or number to pad\n * @return {String}               The number padded as a string\n */\nfunction pad2(data) {\n  if (typeof(data) !== 'string') {\n    // handle fractions.\n    if (typeof(data) === 'number') {\n      data = parseInt(data);\n    }\n    data = String(data);\n  }\n\n  let len = data.length;\n\n  switch (len) {\n    case 0:\n      return '00';\n    case 1:\n      return '0' + data;\n    default:\n      return data;\n  }\n}\n\n/**\n * Truncates the given number, correctly handling negative numbers.\n *\n * @param {Number} number     The number to truncate\n * @return {Number}           The truncated number\n */\nfunction trunc(number) {\n  return (number < 0 ? Math.ceil(number) : Math.floor(number));\n}\n\n/**\n * Poor-man's cross-browser object extension. Doesn't support all the\n * features, but enough for our usage. Note that the target's properties are\n * not overwritten with the source properties.\n *\n * @example\n * var child = ICAL.helpers.extend(parent, {\n *   \"bar\": 123\n * });\n *\n * @param {Object} source     The object to extend\n * @param {Object} target     The object to extend with\n * @return {Object}           Returns the target.\n */\nfunction extend(source, target) {\n  for (let key in source) {\n    let descr = Object.getOwnPropertyDescriptor(source, key);\n    if (descr && !Object.getOwnPropertyDescriptor(target, key)) {\n      Object.defineProperty(target, key, descr);\n    }\n  }\n  return target;\n}\n\nvar helpers = /*#__PURE__*/Object.freeze({\n  __proto__: null,\n  binsearchInsert: binsearchInsert,\n  clone: clone,\n  extend: extend,\n  foldline: foldline,\n  formatClassType: formatClassType,\n  isStrictlyNaN: isStrictlyNaN,\n  pad2: pad2,\n  strictParseInt: strictParseInt,\n  trunc: trunc,\n  unescapedIndexOf: unescapedIndexOf,\n  updateTimezones: updateTimezones\n});\n\n/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/.\n * Portions Copyright (C) Philipp Kewisch */\n\n\n/**\n * This class represents the \"utc-offset\" value type, with various calculation and manipulation\n * methods.\n *\n * @memberof ICAL\n */\nclass UtcOffset {\n  /**\n   * Creates a new {@link ICAL.UtcOffset} instance from the passed string.\n   *\n   * @param {String} aString    The string to parse\n   * @return {Duration}         The created utc-offset instance\n   */\n  static fromString(aString) {\n    // -05:00\n    let options = {};\n    //TODO: support seconds per rfc5545 ?\n    options.factor = (aString[0] === '+') ? 1 : -1;\n    options.hours = strictParseInt(aString.slice(1, 3));\n    options.minutes = strictParseInt(aString.slice(4, 6));\n\n    return new UtcOffset(options);\n  }\n\n  /**\n   * Creates a new {@link ICAL.UtcOffset} instance from the passed seconds\n   * value.\n   *\n   * @param {Number} aSeconds       The number of seconds to convert\n   */\n  static fromSeconds(aSeconds) {\n    let instance = new UtcOffset();\n    instance.fromSeconds(aSeconds);\n    return instance;\n  }\n\n  /**\n   * Creates a new ICAL.UtcOffset instance.\n   *\n   * @param {Object} aData          An object with members of the utc offset\n   * @param {Number=} aData.hours   The hours for the utc offset\n   * @param {Number=} aData.minutes The minutes in the utc offset\n   * @param {Number=} aData.factor  The factor for the utc-offset, either -1 or 1\n   */\n  constructor(aData) {\n    this.fromData(aData);\n  }\n\n  /**\n   * The hours in the utc-offset\n   * @type {Number}\n   */\n  hours = 0;\n\n  /**\n   * The minutes in the utc-offset\n   * @type {Number}\n   */\n  minutes = 0;\n\n  /**\n   * The sign of the utc offset, 1 for positive offset, -1 for negative\n   * offsets.\n   * @type {Number}\n   */\n  factor = 1;\n\n  /**\n   * The type name, to be used in the jCal object.\n   * @constant\n   * @type {String}\n   * @default \"utc-offset\"\n   */\n  icaltype = \"utc-offset\";\n\n  /**\n   * Returns a clone of the utc offset object.\n   *\n   * @return {UtcOffset}     The cloned object\n   */\n  clone() {\n    return UtcOffset.fromSeconds(this.toSeconds());\n  }\n\n  /**\n   * Sets up the current instance using members from the passed data object.\n   *\n   * @param {Object} aData          An object with members of the utc offset\n   * @param {Number=} aData.hours   The hours for the utc offset\n   * @param {Number=} aData.minutes The minutes in the utc offset\n   * @param {Number=} aData.factor  The factor for the utc-offset, either -1 or 1\n   */\n  fromData(aData) {\n    if (aData) {\n      for (let [key, value] of Object.entries(aData)) {\n        this[key] = value;\n      }\n    }\n    this._normalize();\n  }\n\n  /**\n   * Sets up the current instance from the given seconds value. The seconds\n   * value is truncated to the minute. Offsets are wrapped when the world\n   * ends, the hour after UTC+14:00 is UTC-12:00.\n   *\n   * @param {Number} aSeconds         The seconds to convert into an offset\n   */\n  fromSeconds(aSeconds) {\n    let secs = Math.abs(aSeconds);\n\n    this.factor = aSeconds < 0 ? -1 : 1;\n    this.hours = trunc(secs / 3600);\n\n    secs -= (this.hours * 3600);\n    this.minutes = trunc(secs / 60);\n    return this;\n  }\n\n  /**\n   * Convert the current offset to a value in seconds\n   *\n   * @return {Number}                 The offset in seconds\n   */\n  toSeconds() {\n    return this.factor * (60 * this.minutes + 3600 * this.hours);\n  }\n\n  /**\n   * Compare this utc offset with another one.\n   *\n   * @param {UtcOffset} other             The other offset to compare with\n   * @return {Number}                     -1, 0 or 1 for less/equal/greater\n   */\n  compare(other) {\n    let a = this.toSeconds();\n    let b = other.toSeconds();\n    return (a > b) - (b > a);\n  }\n\n  _normalize() {\n    // Range: 97200 seconds (with 1 hour inbetween)\n    let secs = this.toSeconds();\n    let factor = this.factor;\n    while (secs < -43200) { // = UTC-12:00\n      secs += 97200;\n    }\n    while (secs > 50400) { // = UTC+14:00\n      secs -= 97200;\n    }\n\n    this.fromSeconds(secs);\n\n    // Avoid changing the factor when on zero seconds\n    if (secs == 0) {\n      this.factor = factor;\n    }\n  }\n\n  /**\n   * The iCalendar string representation of this utc-offset.\n   * @return {String}\n   */\n  toICALString() {\n    return design.icalendar.value['utc-offset'].toICAL(this.toString());\n  }\n\n  /**\n   * The string representation of this utc-offset.\n   * @return {String}\n   */\n  toString() {\n    return (this.factor == 1 ? \"+\" : \"-\") + pad2(this.hours) + ':' + pad2(this.minutes);\n  }\n}\n\n/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/.\n * Portions Copyright (C) Philipp Kewisch */\n\n\n/**\n * Describes a vCard time, which has slight differences to the ICAL.Time.\n * Properties can be null if not specified, for example for dates with\n * reduced accuracy or truncation.\n *\n * Note that currently not all methods are correctly re-implemented for\n * VCardTime. For example, comparison will have undefined results when some\n * members are null.\n *\n * Also, normalization is not yet implemented for this class!\n *\n * @memberof ICAL\n * @extends {Time}\n */\nclass VCardTime extends Time {\n  /**\n   * Returns a new ICAL.VCardTime instance from a date and/or time string.\n   *\n   * @param {String} aValue     The string to create from\n   * @param {String} aIcalType  The type for this instance, e.g. date-and-or-time\n   * @return {VCardTime}        The date/time instance\n   */\n  static fromDateAndOrTimeString(aValue, aIcalType) {\n    function part(v, s, e) {\n      return v ? strictParseInt(v.slice(s, s + e)) : null;\n    }\n    let parts = aValue.split('T');\n    let dt = parts[0], tmz = parts[1];\n    let splitzone = tmz ? design.vcard.value.time._splitZone(tmz) : [];\n    let zone = splitzone[0], tm = splitzone[1];\n\n    let dtlen = dt ? dt.length : 0;\n    let tmlen = tm ? tm.length : 0;\n\n    let hasDashDate = dt && dt[0] == '-' && dt[1] == '-';\n    let hasDashTime = tm && tm[0] == '-';\n\n    let o = {\n      year: hasDashDate ? null : part(dt, 0, 4),\n      month: hasDashDate && (dtlen == 4 || dtlen == 7) ? part(dt, 2, 2) : dtlen == 7 ? part(dt, 5, 2) : dtlen == 10 ? part(dt, 5, 2) : null,\n      day: dtlen == 5 ? part(dt, 3, 2) : dtlen == 7 && hasDashDate ? part(dt, 5, 2) : dtlen == 10 ? part(dt, 8, 2) : null,\n\n      hour: hasDashTime ? null : part(tm, 0, 2),\n      minute: hasDashTime && tmlen == 3 ? part(tm, 1, 2) : tmlen > 4 ? hasDashTime ? part(tm, 1, 2) : part(tm, 3, 2) : null,\n      second: tmlen == 4 ? part(tm, 2, 2) : tmlen == 6 ? part(tm, 4, 2) : tmlen == 8 ? part(tm, 6, 2) : null\n    };\n\n    if (zone == 'Z') {\n      zone = Timezone.utcTimezone;\n    } else if (zone && zone[3] == ':') {\n      zone = UtcOffset.fromString(zone);\n    } else {\n      zone = null;\n    }\n\n    return new VCardTime(o, zone, aIcalType);\n  }\n\n\n  /**\n   * Creates a new ICAL.VCardTime instance.\n   *\n   * @param {Object} data                           The data for the time instance\n   * @param {Number=} data.year                     The year for this date\n   * @param {Number=} data.month                    The month for this date\n   * @param {Number=} data.day                      The day for this date\n   * @param {Number=} data.hour                     The hour for this date\n   * @param {Number=} data.minute                   The minute for this date\n   * @param {Number=} data.second                   The second for this date\n   * @param {Timezone|UtcOffset} zone               The timezone to use\n   * @param {String} icaltype                       The type for this date/time object\n   */\n  constructor(data, zone, icaltype) {\n    super(data, zone);\n    this.icaltype = icaltype || \"date-and-or-time\";\n  }\n\n  /**\n   * The class identifier.\n   * @constant\n   * @type {String}\n   * @default \"vcardtime\"\n   */\n  icalclass = \"vcardtime\";\n\n  /**\n   * The type name, to be used in the jCal object.\n   * @type {String}\n   * @default \"date-and-or-time\"\n   */\n  icaltype = \"date-and-or-time\";\n\n  /**\n   * Returns a clone of the vcard date/time object.\n   *\n   * @return {VCardTime}     The cloned object\n   */\n  clone() {\n    return new VCardTime(this._time, this.zone, this.icaltype);\n  }\n\n  _normalize() {\n    return this;\n  }\n\n  /**\n   * @inheritdoc\n   */\n  utcOffset() {\n    if (this.zone instanceof UtcOffset) {\n      return this.zone.toSeconds();\n    } else {\n      return Time.prototype.utcOffset.apply(this, arguments);\n    }\n  }\n\n  /**\n   * Returns an RFC 6350 compliant representation of this object.\n   *\n   * @return {String}         vcard date/time string\n   */\n  toICALString() {\n    return design.vcard.value[this.icaltype].toICAL(this.toString());\n  }\n\n  /**\n   * The string representation of this date/time, in jCard form\n   * (including : and - separators).\n   * @return {String}\n   */\n  toString() {\n    let y = this.year, m = this.month, d = this.day;\n    let h = this.hour, mm = this.minute, s = this.second;\n\n    let hasYear = y !== null, hasMonth = m !== null, hasDay = d !== null;\n    let hasHour = h !== null, hasMinute = mm !== null, hasSecond = s !== null;\n\n    let datepart = (hasYear ? pad2(y) + (hasMonth || hasDay ? '-' : '') : (hasMonth || hasDay ? '--' : '')) +\n                   (hasMonth ? pad2(m) : '') +\n                   (hasDay ? '-' + pad2(d) : '');\n    let timepart = (hasHour ? pad2(h) : '-') + (hasHour && hasMinute ? ':' : '') +\n                   (hasMinute ? pad2(mm) : '') + (!hasHour && !hasMinute ? '-' : '') +\n                   (hasMinute && hasSecond ? ':' : '') +\n                   (hasSecond ? pad2(s) : '');\n\n    let zone;\n    if (this.zone === Timezone.utcTimezone) {\n      zone = 'Z';\n    } else if (this.zone instanceof UtcOffset) {\n      zone = this.zone.toString();\n    } else if (this.zone === Timezone.localTimezone) {\n      zone = '';\n    } else if (this.zone instanceof Timezone) {\n      let offset = UtcOffset.fromSeconds(this.zone.utcOffset(this));\n      zone = offset.toString();\n    } else {\n      zone = '';\n    }\n\n    switch (this.icaltype) {\n      case \"time\":\n        return timepart + zone;\n      case \"date-and-or-time\":\n      case \"date-time\":\n        return datepart + (timepart == '--' ? '' : 'T' + timepart + zone);\n      case \"date\":\n        return datepart;\n    }\n    return null;\n  }\n}\n\n/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/.\n * Portions Copyright (C) Philipp Kewisch */\n\n\n/**\n * This lets typescript resolve our custom types in the\n * generated d.ts files (jsdoc typedefs are converted to typescript types).\n * Ignore prevents the typedefs from being documented more than once.\n *\n * @ignore\n * @typedef {import(\"./types.js\").weekDay} weekDay\n * Imports the 'weekDay' type from the \"types.js\" module\n */\n\n/**\n * An iterator for a single recurrence rule. This class usually doesn't have to be instanciated\n * directly, the convenience method {@link ICAL.Recur#iterator} can be used.\n *\n * @memberof ICAL\n */\nclass RecurIterator {\n  static _indexMap = {\n    \"BYSECOND\": 0,\n    \"BYMINUTE\": 1,\n    \"BYHOUR\": 2,\n    \"BYDAY\": 3,\n    \"BYMONTHDAY\": 4,\n    \"BYYEARDAY\": 5,\n    \"BYWEEKNO\": 6,\n    \"BYMONTH\": 7,\n    \"BYSETPOS\": 8\n  };\n\n  static _expandMap = {\n    \"SECONDLY\": [1, 1, 1, 1, 1, 1, 1, 1],\n    \"MINUTELY\": [2, 1, 1, 1, 1, 1, 1, 1],\n    \"HOURLY\": [2, 2, 1, 1, 1, 1, 1, 1],\n    \"DAILY\": [2, 2, 2, 1, 1, 1, 1, 1],\n    \"WEEKLY\": [2, 2, 2, 2, 3, 3, 1, 1],\n    \"MONTHLY\": [2, 2, 2, 2, 2, 3, 3, 1],\n    \"YEARLY\": [2, 2, 2, 2, 2, 2, 2, 2]\n  };\n\n  static UNKNOWN = 0;\n  static CONTRACT = 1;\n  static EXPAND = 2;\n  static ILLEGAL = 3;\n\n  /**\n   * Creates a new ICAL.RecurIterator instance. The options object may contain additional members\n   * when resuming iteration from a previous run.\n   *\n   * @param {Object} options                The iterator options\n   * @param {Recur} options.rule            The rule to iterate.\n   * @param {Time} options.dtstart          The start date of the event.\n   * @param {Boolean=} options.initialized  When true, assume that options are\n   *        from a previously constructed iterator. Initialization will not be\n   *        repeated.\n   */\n  constructor(options) {\n    this.fromData(options);\n  }\n\n  /**\n   * True when iteration is finished.\n   * @type {Boolean}\n   */\n  completed = false;\n\n  /**\n   * The rule that is being iterated\n   * @type {Recur}\n   */\n  rule = null;\n\n  /**\n   * The start date of the event being iterated.\n   * @type {Time}\n   */\n  dtstart = null;\n\n  /**\n   * The last occurrence that was returned from the\n   * {@link RecurIterator#next} method.\n   * @type {Time}\n   */\n  last = null;\n\n  /**\n   * The sequence number from the occurrence\n   * @type {Number}\n   */\n  occurrence_number = 0;\n\n  /**\n   * The indices used for the {@link ICAL.RecurIterator#by_data} object.\n   * @type {Object}\n   * @private\n   */\n  by_indices = null;\n\n  /**\n   * If true, the iterator has already been initialized\n   * @type {Boolean}\n   * @private\n   */\n  initialized = false;\n\n  /**\n   * The initializd by-data.\n   * @type {Object}\n   * @private\n   */\n  by_data = null;\n\n  /**\n   * The expanded yeardays\n   * @type {Array}\n   * @private\n   */\n  days = null;\n\n  /**\n   * The index in the {@link ICAL.RecurIterator#days} array.\n   * @type {Number}\n   * @private\n   */\n  days_index = 0;\n\n  /**\n   * Initialize the recurrence iterator from the passed data object. This\n   * method is usually not called directly, you can initialize the iterator\n   * through the constructor.\n   *\n   * @param {Object} options                The iterator options\n   * @param {Recur} options.rule            The rule to iterate.\n   * @param {Time} options.dtstart          The start date of the event.\n   * @param {Boolean=} options.initialized  When true, assume that options are\n   *        from a previously constructed iterator. Initialization will not be\n   *        repeated.\n   */\n  fromData(options) {\n    this.rule = formatClassType(options.rule, Recur);\n\n    if (!this.rule) {\n      throw new Error('iterator requires a (ICAL.Recur) rule');\n    }\n\n    this.dtstart = formatClassType(options.dtstart, Time);\n\n    if (!this.dtstart) {\n      throw new Error('iterator requires a (ICAL.Time) dtstart');\n    }\n\n    if (options.by_data) {\n      this.by_data = options.by_data;\n    } else {\n      this.by_data = clone(this.rule.parts, true);\n    }\n\n    if (options.occurrence_number)\n      this.occurrence_number = options.occurrence_number;\n\n    this.days = options.days || [];\n    if (options.last) {\n      this.last = formatClassType(options.last, Time);\n    }\n\n    this.by_indices = options.by_indices;\n\n    if (!this.by_indices) {\n      this.by_indices = {\n        \"BYSECOND\": 0,\n        \"BYMINUTE\": 0,\n        \"BYHOUR\": 0,\n        \"BYDAY\": 0,\n        \"BYMONTH\": 0,\n        \"BYWEEKNO\": 0,\n        \"BYMONTHDAY\": 0\n      };\n    }\n\n    this.initialized = options.initialized || false;\n\n    if (!this.initialized) {\n      try {\n        this.init();\n      } catch (e) {\n        if (e instanceof InvalidRecurrenceRuleError) {\n          // Init may error if there are no possible recurrence instances from\n          // the rule, but we don't want to bubble this error up. Instead, we\n          // create an empty iterator.\n          this.completed = true;\n        } else {\n          // Propagate other errors to consumers.\n          throw e;\n        }\n      }\n    }\n  }\n\n  /**\n   * Initialize the iterator\n   * @private\n   */\n  init() {\n    this.initialized = true;\n    this.last = this.dtstart.clone();\n    let parts = this.by_data;\n\n    if (\"BYDAY\" in parts) {\n      // libical does this earlier when the rule is loaded, but we postpone to\n      // now so we can preserve the original order.\n      this.sort_byday_rules(parts.BYDAY);\n    }\n\n    // The BYYEARDAY may only appear with BYDAY\n    if (\"BYYEARDAY\" in parts) {\n      if (\"BYMONTH\" in parts || \"BYWEEKNO\" in parts ||\n          \"BYMONTHDAY\" in parts) {\n        throw new Error(\"Invalid BYYEARDAY rule\");\n      }\n    }\n\n    // BYWEEKNO and BYMONTHDAY rule parts may not both appear\n    if (\"BYWEEKNO\" in parts && \"BYMONTHDAY\" in parts) {\n      throw new Error(\"BYWEEKNO does not fit to BYMONTHDAY\");\n    }\n\n    // For MONTHLY recurrences (FREQ=MONTHLY) neither BYYEARDAY nor\n    // BYWEEKNO may appear.\n    if (this.rule.freq == \"MONTHLY\" &&\n        (\"BYYEARDAY\" in parts || \"BYWEEKNO\" in parts)) {\n      throw new Error(\"For MONTHLY recurrences neither BYYEARDAY nor BYWEEKNO may appear\");\n    }\n\n    // For WEEKLY recurrences (FREQ=WEEKLY) neither BYMONTHDAY nor\n    // BYYEARDAY may appear.\n    if (this.rule.freq == \"WEEKLY\" &&\n        (\"BYYEARDAY\" in parts || \"BYMONTHDAY\" in parts)) {\n      throw new Error(\"For WEEKLY recurrences neither BYMONTHDAY nor BYYEARDAY may appear\");\n    }\n\n    // BYYEARDAY may only appear in YEARLY rules\n    if (this.rule.freq != \"YEARLY\" && \"BYYEARDAY\" in parts) {\n      throw new Error(\"BYYEARDAY may only appear in YEARLY rules\");\n    }\n\n    this.last.second = this.setup_defaults(\"BYSECOND\", \"SECONDLY\", this.dtstart.second);\n    this.last.minute = this.setup_defaults(\"BYMINUTE\", \"MINUTELY\", this.dtstart.minute);\n    this.last.hour = this.setup_defaults(\"BYHOUR\", \"HOURLY\", this.dtstart.hour);\n    this.last.day = this.setup_defaults(\"BYMONTHDAY\", \"DAILY\", this.dtstart.day);\n    this.last.month = this.setup_defaults(\"BYMONTH\", \"MONTHLY\", this.dtstart.month);\n\n    if (this.rule.freq == \"WEEKLY\") {\n      if (\"BYDAY\" in parts) {\n        let [, dow] = this.ruleDayOfWeek(parts.BYDAY[0], this.rule.wkst);\n        let wkdy = dow - this.last.dayOfWeek(this.rule.wkst);\n        if ((this.last.dayOfWeek(this.rule.wkst) < dow && wkdy >= 0) || wkdy < 0) {\n          // Initial time is after first day of BYDAY data\n          this.last.day += wkdy;\n        }\n      } else {\n        let dayName = Recur.numericDayToIcalDay(this.dtstart.dayOfWeek());\n        parts.BYDAY = [dayName];\n      }\n    }\n\n    if (this.rule.freq == \"YEARLY\") {\n      // Some yearly recurrence rules may be specific enough to not actually\n      // occur on a yearly basis, e.g. the 29th day of February or the fifth\n      // Monday of a given month. The standard isn't clear on the intended\n      // behavior in these cases, but `libical` at least will iterate until it\n      // finds a matching year.\n      // CAREFUL: Some rules may specify an occurrence that can never happen,\n      // e.g. the first Monday of April so long as it falls on the 15th\n      // through the 21st. Detecting these is non-trivial, so ensure that we\n      // stop iterating at some point.\n      const untilYear = this.rule.until ? this.rule.until.year : 20000;\n      while (this.last.year <= untilYear) {\n        this.expand_year_days(this.last.year);\n        if (this.days.length > 0) {\n          break;\n        }\n        this.increment_year(this.rule.interval);\n      }\n\n      if (this.days.length == 0) {\n        throw new InvalidRecurrenceRuleError();\n      }\n\n      // If there's no occurrence in this year, try the following years. This\n      // would only happen looking for day 366 or -366.\n      if (!this._nextByYearDay() && !this.next_year() && !this.next_year() && !this.next_year()) {\n        // This should not be possible, but just in case it is, stop.\n        throw new InvalidRecurrenceRuleError();\n      }\n    }\n\n    if (this.rule.freq == \"MONTHLY\") {\n      if (this.has_by_data(\"BYDAY\")) {\n        let tempLast = null;\n        let initLast = this.last.clone();\n        let daysInMonth = Time.daysInMonth(this.last.month, this.last.year);\n\n        // Check every weekday in BYDAY with relative dow and pos.\n        for (let bydow of this.by_data.BYDAY) {\n          this.last = initLast.clone();\n          let [pos, dow] = this.ruleDayOfWeek(bydow);\n          let dayOfMonth = this.last.nthWeekDay(dow, pos);\n\n          // If |pos| >= 6, the byday is invalid for a monthly rule.\n          if (pos >= 6 || pos <= -6) {\n            throw new Error(\"Malformed values in BYDAY part\");\n          }\n\n          // If a Byday with pos=+/-5 is not in the current month it\n          // must be searched in the next months.\n          if (dayOfMonth > daysInMonth || dayOfMonth <= 0) {\n            // Skip if we have already found a \"last\" in this month.\n            if (tempLast && tempLast.month == initLast.month) {\n              continue;\n            }\n            while (dayOfMonth > daysInMonth || dayOfMonth <= 0) {\n              this.increment_month();\n              daysInMonth = Time.daysInMonth(this.last.month, this.last.year);\n              dayOfMonth = this.last.nthWeekDay(dow, pos);\n            }\n          }\n\n          this.last.day = dayOfMonth;\n          if (!tempLast || this.last.compare(tempLast) < 0) {\n            tempLast = this.last.clone();\n          }\n        }\n        this.last = tempLast.clone();\n\n        //XXX: This feels like a hack, but we need to initialize\n        //     the BYMONTHDAY case correctly and byDayAndMonthDay handles\n        //     this case. It accepts a special flag which will avoid incrementing\n        //     the initial value without the flag days that match the start time\n        //     would be missed.\n        if (this.has_by_data('BYMONTHDAY')) {\n          this._byDayAndMonthDay(true);\n        }\n\n        if (this.last.day > daysInMonth || this.last.day == 0) {\n          throw new Error(\"Malformed values in BYDAY part\");\n        }\n      } else if (this.has_by_data(\"BYMONTHDAY\")) {\n        // Change the day value so that normalisation won't change the month.\n        this.last.day = 1;\n\n        // Get a sorted list of days in the starting month that match the rule.\n        let normalized = this.normalizeByMonthDayRules(\n          this.last.year,\n          this.last.month,\n          this.rule.parts.BYMONTHDAY\n        ).filter(d => d >= this.last.day);\n\n        if (normalized.length) {\n          // There's at least one valid day, use it.\n          this.last.day = normalized[0];\n          this.by_data.BYMONTHDAY = normalized;\n        } else {\n          // There's no occurrence in this month, find the next valid month.\n          // The longest possible sequence of skipped months is February-April-June,\n          // so we might need to call next_month up to three times.\n          if (!this.next_month() && !this.next_month() && !this.next_month()) {\n            throw new InvalidRecurrenceRuleError();\n          }\n        }\n      }\n    }\n  }\n\n  /**\n   * Retrieve the next occurrence from the iterator.\n   * @return {Time}\n   */\n  next(again = false) {\n    let before = (this.last ? this.last.clone() : null);\n\n    if ((this.rule.count && this.occurrence_number >= this.rule.count) ||\n        (this.rule.until && this.last.compare(this.rule.until) > 0)) {\n      this.completed = true;\n    }\n\n    if (this.completed) {\n      return null;\n    }\n\n    if (this.occurrence_number == 0 && this.last.compare(this.dtstart) >= 0) {\n      // First of all, give the instance that was initialized\n      this.occurrence_number++;\n      return this.last;\n    }\n\n    let valid;\n    let invalid_count = 0;\n    do {\n      valid = 1;\n\n      switch (this.rule.freq) {\n      case \"SECONDLY\":\n        this.next_second();\n        break;\n      case \"MINUTELY\":\n        this.next_minute();\n        break;\n      case \"HOURLY\":\n        this.next_hour();\n        break;\n      case \"DAILY\":\n        this.next_day();\n        break;\n      case \"WEEKLY\":\n        this.next_week();\n        break;\n      case \"MONTHLY\":\n        valid = this.next_month();\n        if (valid) {\n          invalid_count = 0;\n        } else if (++invalid_count == 336) {\n          // We've been through all 91 month variations and not found a recurrence. Stop.\n          // (12 months and 29-day February × 7 starting days.)\n          this.completed = true;\n          return null;\n        }\n        break;\n      case \"YEARLY\":\n        valid = this.next_year();\n        if (valid) {\n          invalid_count = 0;\n        } else if (++invalid_count == 28) {\n          // We've been through all 14 year variations and not found a recurrence. Stop.\n          // (365-day and 366-day years × 7 starting days.)\n          this.completed = true;\n          return null;\n        }\n        break;\n\n      default:\n        return null;\n      }\n    } while (!this.check_contracting_rules() ||\n             this.last.compare(this.dtstart) < 0 ||\n             !valid);\n\n    if (this.last.compare(before) == 0) {\n      if (again) {\n        throw new Error(\"Same occurrence found twice, protecting you from death by recursion\");\n      }\n      this.next(true);\n    }\n\n    if (this.rule.until && this.last.compare(this.rule.until) > 0) {\n      this.completed = true;\n      return null;\n    } else {\n      this.occurrence_number++;\n      return this.last;\n    }\n  }\n\n  next_second() {\n    return this.next_generic(\"BYSECOND\", \"SECONDLY\", \"second\", \"minute\");\n  }\n\n  increment_second(inc) {\n    return this.increment_generic(inc, \"second\", 60, \"minute\");\n  }\n\n  next_minute() {\n    return this.next_generic(\"BYMINUTE\", \"MINUTELY\",\n                             \"minute\", \"hour\", \"next_second\");\n  }\n\n  increment_minute(inc) {\n    return this.increment_generic(inc, \"minute\", 60, \"hour\");\n  }\n\n  next_hour() {\n    return this.next_generic(\"BYHOUR\", \"HOURLY\", \"hour\",\n                             \"monthday\", \"next_minute\");\n  }\n\n  increment_hour(inc) {\n    this.increment_generic(inc, \"hour\", 24, \"monthday\");\n  }\n\n  next_day() {\n    let this_freq = (this.rule.freq == \"DAILY\");\n\n    if (this.next_hour() == 0) {\n      return 0;\n    }\n\n    if (this_freq) {\n      this.increment_monthday(this.rule.interval);\n    } else {\n      this.increment_monthday(1);\n    }\n\n    return 0;\n  }\n\n  next_week() {\n    let end_of_data = 0;\n\n    if (this.next_weekday_by_week() == 0) {\n      return end_of_data;\n    }\n\n    if (this.has_by_data(\"BYWEEKNO\")) {\n      this.by_indices.BYWEEKNO++;\n\n      if (this.by_indices.BYWEEKNO == this.by_data.BYWEEKNO.length) {\n        this.by_indices.BYWEEKNO = 0;\n        end_of_data = 1;\n      }\n\n      // HACK should be first month of the year\n      this.last.month = 1;\n      this.last.day = 1;\n\n      let week_no = this.by_data.BYWEEKNO[this.by_indices.BYWEEKNO];\n\n      this.last.day += 7 * week_no;\n\n      if (end_of_data) {\n        this.increment_year(1);\n      }\n    } else {\n      // Jump to the next week\n      this.increment_monthday(7 * this.rule.interval);\n    }\n\n    return end_of_data;\n  }\n\n  /**\n   * Normalize each by day rule for a given year/month.\n   * Takes into account ordering and negative rules\n   *\n   * @private\n   * @param {Number} year         Current year.\n   * @param {Number} month        Current month.\n   * @param {Array}  rules        Array of rules.\n   *\n   * @return {Array} sorted and normalized rules.\n   *                 Negative rules will be expanded to their\n   *                 correct positive values for easier processing.\n   */\n  normalizeByMonthDayRules(year, month, rules) {\n    let daysInMonth = Time.daysInMonth(month, year);\n\n    // XXX: This is probably bad for performance to allocate\n    //      a new array for each month we scan, if possible\n    //      we should try to optimize this...\n    let newRules = [];\n\n    let ruleIdx = 0;\n    let len = rules.length;\n    let rule;\n\n    for (; ruleIdx < len; ruleIdx++) {\n      rule = parseInt(rules[ruleIdx], 10);\n      if (isNaN(rule)) {\n        throw new Error('Invalid BYMONTHDAY value');\n      }\n\n      // if this rule falls outside of given\n      // month discard it.\n      if (Math.abs(rule) > daysInMonth) {\n        continue;\n      }\n\n      // negative case\n      if (rule < 0) {\n        // we add (not subtract it is a negative number)\n        // one from the rule because 1 === last day of month\n        rule = daysInMonth + (rule + 1);\n      } else if (rule === 0) {\n        // skip zero: it is invalid.\n        continue;\n      }\n\n      // only add unique items...\n      if (newRules.indexOf(rule) === -1) {\n        newRules.push(rule);\n      }\n\n    }\n\n    // unique and sort\n    return newRules.sort(function(a, b) { return a - b; });\n  }\n\n  /**\n   * NOTES:\n   * We are given a list of dates in the month (BYMONTHDAY) (23, etc..)\n   * Also we are given a list of days (BYDAY) (MO, 2SU, etc..) when\n   * both conditions match a given date (this.last.day) iteration stops.\n   *\n   * @private\n   * @param {Boolean=} isInit     When given true will not increment the\n   *                                current day (this.last).\n   */\n  _byDayAndMonthDay(isInit) {\n    let byMonthDay; // setup in initMonth\n    let byDay = this.by_data.BYDAY;\n\n    let date;\n    let dateIdx = 0;\n    let dateLen; // setup in initMonth\n    let dayLen = byDay.length;\n\n    // we are not valid by default\n    let dataIsValid = 0;\n\n    let daysInMonth;\n    let self = this;\n    // we need a copy of this, because a DateTime gets normalized\n    // automatically if the day is out of range. At some points we\n    // set the last day to 0 to start counting.\n    let lastDay = this.last.day;\n\n    function initMonth() {\n      daysInMonth = Time.daysInMonth(\n        self.last.month, self.last.year\n      );\n\n      byMonthDay = self.normalizeByMonthDayRules(\n        self.last.year,\n        self.last.month,\n        self.by_data.BYMONTHDAY\n      );\n\n      dateLen = byMonthDay.length;\n\n      // For the case of more than one occurrence in one month\n      // we have to be sure to start searching after the last\n      // found date or at the last BYMONTHDAY, unless we are\n      // initializing the iterator because in this case we have\n      // to consider the last found date too.\n      while (byMonthDay[dateIdx] <= lastDay &&\n             !(isInit && byMonthDay[dateIdx] == lastDay) &&\n             dateIdx < dateLen - 1) {\n        dateIdx++;\n      }\n    }\n\n    function nextMonth() {\n      // since the day is incremented at the start\n      // of the loop below, we need to start at 0\n      lastDay = 0;\n      self.increment_month();\n      dateIdx = 0;\n      initMonth();\n    }\n\n    initMonth();\n\n    // should come after initMonth\n    if (isInit) {\n      lastDay -= 1;\n    }\n\n    // Use a counter to avoid an infinite loop with malformed rules.\n    // Stop checking after 4 years so we consider also a leap year.\n    let monthsCounter = 48;\n\n    while (!dataIsValid && monthsCounter) {\n      monthsCounter--;\n      // increment the current date. This is really\n      // important otherwise we may fall into the infinite\n      // loop trap. The initial date takes care of the case\n      // where the current date is the date we are looking\n      // for.\n      date = lastDay + 1;\n\n      if (date > daysInMonth) {\n        nextMonth();\n        continue;\n      }\n\n      // find next date\n      let next = byMonthDay[dateIdx++];\n\n      // this logic is dependent on the BYMONTHDAYS\n      // being in order (which is done by #normalizeByMonthDayRules)\n      if (next >= date) {\n        // if the next month day is in the future jump to it.\n        lastDay = next;\n      } else {\n        // in this case the 'next' monthday has past\n        // we must move to the month.\n        nextMonth();\n        continue;\n      }\n\n      // Now we can loop through the day rules to see\n      // if one matches the current month date.\n      for (let dayIdx = 0; dayIdx < dayLen; dayIdx++) {\n        let parts = this.ruleDayOfWeek(byDay[dayIdx]);\n        let pos = parts[0];\n        let dow = parts[1];\n\n        this.last.day = lastDay;\n        if (this.last.isNthWeekDay(dow, pos)) {\n          // when we find the valid one we can mark\n          // the conditions as met and break the loop.\n          // (Because we have this condition above\n          //  it will also break the parent loop).\n          dataIsValid = 1;\n          break;\n        }\n      }\n\n      // It is completely possible that the combination\n      // cannot be matched in the current month.\n      // When we reach the end of possible combinations\n      // in the current month we iterate to the next one.\n      // since dateIdx is incremented right after getting\n      // \"next\", we don't need dateLen -1 here.\n      if (!dataIsValid && dateIdx === dateLen) {\n        nextMonth();\n        continue;\n      }\n    }\n\n    if (monthsCounter <= 0) {\n      // Checked 4 years without finding a Byday that matches\n      // a Bymonthday. Maybe the rule is not correct.\n      throw new Error(\"Malformed values in BYDAY combined with BYMONTHDAY parts\");\n    }\n\n\n    return dataIsValid;\n  }\n\n  next_month() {\n    let data_valid = 1;\n\n    if (this.next_hour() == 0) {\n      return data_valid;\n    }\n\n    if (this.has_by_data(\"BYDAY\") && this.has_by_data(\"BYMONTHDAY\")) {\n      data_valid = this._byDayAndMonthDay();\n    } else if (this.has_by_data(\"BYDAY\")) {\n      let daysInMonth = Time.daysInMonth(this.last.month, this.last.year);\n      let setpos = 0;\n      let setpos_total = 0;\n\n      if (this.has_by_data(\"BYSETPOS\")) {\n        let last_day = this.last.day;\n        for (let day = 1; day <= daysInMonth; day++) {\n          this.last.day = day;\n          if (this.is_day_in_byday(this.last)) {\n            setpos_total++;\n            if (day <= last_day) {\n              setpos++;\n            }\n          }\n        }\n        this.last.day = last_day;\n      }\n\n      data_valid = 0;\n      let day;\n      for (day = this.last.day + 1; day <= daysInMonth; day++) {\n        this.last.day = day;\n\n        if (this.is_day_in_byday(this.last)) {\n          if (!this.has_by_data(\"BYSETPOS\") ||\n              this.check_set_position(++setpos) ||\n              this.check_set_position(setpos - setpos_total - 1)) {\n\n            data_valid = 1;\n            break;\n          }\n        }\n      }\n\n      if (day > daysInMonth) {\n        this.last.day = 1;\n        this.increment_month();\n\n        if (this.is_day_in_byday(this.last)) {\n          if (!this.has_by_data(\"BYSETPOS\") || this.check_set_position(1)) {\n            data_valid = 1;\n          }\n        } else {\n          data_valid = 0;\n        }\n      }\n    } else if (this.has_by_data(\"BYMONTHDAY\")) {\n      this.by_indices.BYMONTHDAY++;\n\n      if (this.by_indices.BYMONTHDAY >= this.by_data.BYMONTHDAY.length) {\n        this.by_indices.BYMONTHDAY = 0;\n        this.increment_month();\n        if (this.by_indices.BYMONTHDAY >= this.by_data.BYMONTHDAY.length) {\n          return 0;\n        }\n      }\n\n      let daysInMonth = Time.daysInMonth(this.last.month, this.last.year);\n      let day = this.by_data.BYMONTHDAY[this.by_indices.BYMONTHDAY];\n\n      if (day < 0) {\n        day = daysInMonth + day + 1;\n      }\n\n      if (day > daysInMonth) {\n        this.last.day = 1;\n        data_valid = this.is_day_in_byday(this.last);\n      } else {\n        this.last.day = day;\n      }\n    } else {\n      this.increment_month();\n      let daysInMonth = Time.daysInMonth(this.last.month, this.last.year);\n      if (this.by_data.BYMONTHDAY[0] > daysInMonth) {\n        data_valid = 0;\n      } else {\n        this.last.day = this.by_data.BYMONTHDAY[0];\n      }\n    }\n\n    return data_valid;\n  }\n\n  next_weekday_by_week() {\n    let end_of_data = 0;\n\n    if (this.next_hour() == 0) {\n      return end_of_data;\n    }\n\n    if (!this.has_by_data(\"BYDAY\")) {\n      return 1;\n    }\n\n    for (;;) {\n      let tt = new Time();\n      this.by_indices.BYDAY++;\n\n      if (this.by_indices.BYDAY == Object.keys(this.by_data.BYDAY).length) {\n        this.by_indices.BYDAY = 0;\n        end_of_data = 1;\n      }\n\n      let coded_day = this.by_data.BYDAY[this.by_indices.BYDAY];\n      let parts = this.ruleDayOfWeek(coded_day);\n      let dow = parts[1];\n\n      dow -= this.rule.wkst;\n\n      if (dow < 0) {\n        dow += 7;\n      }\n\n      tt.year = this.last.year;\n      tt.month = this.last.month;\n      tt.day = this.last.day;\n\n      let startOfWeek = tt.startDoyWeek(this.rule.wkst);\n\n      if (dow + startOfWeek < 1) {\n        // The selected date is in the previous year\n        if (!end_of_data) {\n          continue;\n        }\n      }\n\n      let next = Time.fromDayOfYear(startOfWeek + dow, this.last.year);\n\n      /**\n       * The normalization horrors below are due to\n       * the fact that when the year/month/day changes\n       * it can effect the other operations that come after.\n       */\n      this.last.year = next.year;\n      this.last.month = next.month;\n      this.last.day = next.day;\n\n      return end_of_data;\n    }\n  }\n\n  next_year() {\n    if (this.next_hour() == 0) {\n      return 0;\n    }\n\n    if (this.days.length == 0 || ++this.days_index == this.days.length) {\n      this.days_index = 0;\n      this.increment_year(this.rule.interval);\n      if (this.has_by_data(\"BYMONTHDAY\")) {\n        this.by_data.BYMONTHDAY = this.normalizeByMonthDayRules(\n          this.last.year,\n          this.last.month,\n          this.rule.parts.BYMONTHDAY\n        );\n      }\n      this.expand_year_days(this.last.year);\n      if (this.days.length == 0) {\n        return 0;\n      }\n    }\n\n    return this._nextByYearDay();\n  }\n\n  _nextByYearDay() {\n    let doy = this.days[this.days_index];\n    let year = this.last.year;\n\n    if (Math.abs(doy) == 366 && !Time.isLeapYear(this.last.year)) {\n      return 0;\n    }\n\n    if (doy < 1) {\n        // Time.fromDayOfYear(doy, year) indexes relative to the\n        // start of the given year. That is different from the\n        // semantics of BYYEARDAY where negative indexes are an\n        // offset from the end of the given year.\n        doy += 1;\n        year += 1;\n    }\n    let next = Time.fromDayOfYear(doy, year);\n    this.last.day = next.day;\n    this.last.month = next.month;\n\n    return 1;\n  }\n\n  /**\n   * @param dow (eg: '1TU', '-1MO')\n   * @param {weekDay=} aWeekStart The week start weekday\n   * @return [pos, numericDow] (eg: [1, 3]) numericDow is relative to aWeekStart\n   */\n  ruleDayOfWeek(dow, aWeekStart) {\n    let matches = dow.match(/([+-]?[0-9])?(MO|TU|WE|TH|FR|SA|SU)/);\n    if (matches) {\n      let pos = parseInt(matches[1] || 0, 10);\n      dow = Recur.icalDayToNumericDay(matches[2], aWeekStart);\n      return [pos, dow];\n    } else {\n      return [0, 0];\n    }\n  }\n\n  next_generic(aRuleType, aInterval, aDateAttr, aFollowingAttr, aPreviousIncr) {\n    let has_by_rule = (aRuleType in this.by_data);\n    let this_freq = (this.rule.freq == aInterval);\n    let end_of_data = 0;\n\n    if (aPreviousIncr && this[aPreviousIncr]() == 0) {\n      return end_of_data;\n    }\n\n    if (has_by_rule) {\n      this.by_indices[aRuleType]++;\n      let dta = this.by_data[aRuleType];\n\n      if (this.by_indices[aRuleType] == dta.length) {\n        this.by_indices[aRuleType] = 0;\n        end_of_data = 1;\n      }\n      this.last[aDateAttr] = dta[this.by_indices[aRuleType]];\n    } else if (this_freq) {\n      this[\"increment_\" + aDateAttr](this.rule.interval);\n    }\n\n    if (has_by_rule && end_of_data && this_freq) {\n      this[\"increment_\" + aFollowingAttr](1);\n    }\n\n    return end_of_data;\n  }\n\n  increment_monthday(inc) {\n    for (let i = 0; i < inc; i++) {\n      let daysInMonth = Time.daysInMonth(this.last.month, this.last.year);\n      this.last.day++;\n\n      if (this.last.day > daysInMonth) {\n        this.last.day -= daysInMonth;\n        this.increment_month();\n      }\n    }\n  }\n\n  increment_month() {\n    this.last.day = 1;\n    if (this.has_by_data(\"BYMONTH\")) {\n      this.by_indices.BYMONTH++;\n\n      if (this.by_indices.BYMONTH == this.by_data.BYMONTH.length) {\n        this.by_indices.BYMONTH = 0;\n        this.increment_year(1);\n      }\n\n      this.last.month = this.by_data.BYMONTH[this.by_indices.BYMONTH];\n    } else {\n      if (this.rule.freq == \"MONTHLY\") {\n        this.last.month += this.rule.interval;\n      } else {\n        this.last.month++;\n      }\n\n      this.last.month--;\n      let years = trunc(this.last.month / 12);\n      this.last.month %= 12;\n      this.last.month++;\n\n      if (years != 0) {\n        this.increment_year(years);\n      }\n    }\n\n    if (this.has_by_data(\"BYMONTHDAY\")) {\n      this.by_data.BYMONTHDAY = this.normalizeByMonthDayRules(\n        this.last.year,\n        this.last.month,\n        this.rule.parts.BYMONTHDAY\n      );\n    }\n  }\n\n  increment_year(inc) {\n    // Don't jump into the next month if this.last is Feb 29.\n    this.last.day = 1;\n    this.last.year += inc;\n  }\n\n  increment_generic(inc, aDateAttr, aFactor, aNextIncrement) {\n    this.last[aDateAttr] += inc;\n    let nextunit = trunc(this.last[aDateAttr] / aFactor);\n    this.last[aDateAttr] %= aFactor;\n    if (nextunit != 0) {\n      this[\"increment_\" + aNextIncrement](nextunit);\n    }\n  }\n\n  has_by_data(aRuleType) {\n    return (aRuleType in this.rule.parts);\n  }\n\n  expand_year_days(aYear) {\n    let t = new Time();\n    this.days = [];\n\n    // We need our own copy with a few keys set\n    let parts = {};\n    let rules = [\"BYDAY\", \"BYWEEKNO\", \"BYMONTHDAY\", \"BYMONTH\", \"BYYEARDAY\"];\n    for (let part of rules) {\n      if (part in this.rule.parts) {\n        parts[part] = this.rule.parts[part];\n      }\n    }\n\n    if (\"BYMONTH\" in parts && \"BYWEEKNO\" in parts) {\n      let valid = 1;\n      let validWeeks = {};\n      t.year = aYear;\n      t.isDate = true;\n\n      for (let monthIdx = 0; monthIdx < this.by_data.BYMONTH.length; monthIdx++) {\n        let month = this.by_data.BYMONTH[monthIdx];\n        t.month = month;\n        t.day = 1;\n        let first_week = t.weekNumber(this.rule.wkst);\n        t.day = Time.daysInMonth(month, aYear);\n        let last_week = t.weekNumber(this.rule.wkst);\n        for (monthIdx = first_week; monthIdx < last_week; monthIdx++) {\n          validWeeks[monthIdx] = 1;\n        }\n      }\n\n      for (let weekIdx = 0; weekIdx < this.by_data.BYWEEKNO.length && valid; weekIdx++) {\n        let weekno = this.by_data.BYWEEKNO[weekIdx];\n        if (weekno < 52) {\n          valid &= validWeeks[weekIdx];\n        } else {\n          valid = 0;\n        }\n      }\n\n      if (valid) {\n        delete parts.BYMONTH;\n      } else {\n        delete parts.BYWEEKNO;\n      }\n    }\n\n    let partCount = Object.keys(parts).length;\n\n    if (partCount == 0) {\n      let t1 = this.dtstart.clone();\n      t1.year = this.last.year;\n      this.days.push(t1.dayOfYear());\n    } else if (partCount == 1 && \"BYMONTH\" in parts) {\n      for (let month of this.by_data.BYMONTH) {\n        let t2 = this.dtstart.clone();\n        t2.year = aYear;\n        t2.month = month;\n        t2.isDate = true;\n        this.days.push(t2.dayOfYear());\n      }\n    } else if (partCount == 1 && \"BYMONTHDAY\" in parts) {\n      for (let monthday of this.by_data.BYMONTHDAY) {\n        let t3 = this.dtstart.clone();\n        if (monthday < 0) {\n          let daysInMonth = Time.daysInMonth(t3.month, aYear);\n          monthday = monthday + daysInMonth + 1;\n        }\n        t3.day = monthday;\n        t3.year = aYear;\n        t3.isDate = true;\n        this.days.push(t3.dayOfYear());\n      }\n    } else if (partCount == 2 &&\n               \"BYMONTHDAY\" in parts &&\n               \"BYMONTH\" in parts) {\n      for (let month of this.by_data.BYMONTH) {\n        let daysInMonth = Time.daysInMonth(month, aYear);\n        for (let monthday of this.by_data.BYMONTHDAY) {\n          if (monthday < 0) {\n            monthday = monthday + daysInMonth + 1;\n          }\n          t.day = monthday;\n          t.month = month;\n          t.year = aYear;\n          t.isDate = true;\n\n          this.days.push(t.dayOfYear());\n        }\n      }\n    } else if (partCount == 1 && \"BYWEEKNO\" in parts) ; else if (partCount == 2 &&\n               \"BYWEEKNO\" in parts &&\n               \"BYMONTHDAY\" in parts) ; else if (partCount == 1 && \"BYDAY\" in parts) {\n      this.days = this.days.concat(this.expand_by_day(aYear));\n    } else if (partCount == 2 && \"BYDAY\" in parts && \"BYMONTH\" in parts) {\n      for (let month of this.by_data.BYMONTH) {\n        let daysInMonth = Time.daysInMonth(month, aYear);\n\n        t.year = aYear;\n        t.month = month;\n        t.day = 1;\n        t.isDate = true;\n\n        let first_dow = t.dayOfWeek();\n        let doy_offset = t.dayOfYear() - 1;\n\n        t.day = daysInMonth;\n        let last_dow = t.dayOfWeek();\n\n        if (this.has_by_data(\"BYSETPOS\")) {\n          let by_month_day = [];\n          for (let day = 1; day <= daysInMonth; day++) {\n            t.day = day;\n            if (this.is_day_in_byday(t)) {\n              by_month_day.push(day);\n            }\n          }\n\n          for (let spIndex = 0; spIndex < by_month_day.length; spIndex++) {\n            if (this.check_set_position(spIndex + 1) ||\n                this.check_set_position(spIndex - by_month_day.length)) {\n              this.days.push(doy_offset + by_month_day[spIndex]);\n            }\n          }\n        } else {\n          for (let coded_day of this.by_data.BYDAY) {\n            let bydayParts = this.ruleDayOfWeek(coded_day);\n            let pos = bydayParts[0];\n            let dow = bydayParts[1];\n            let month_day;\n\n            let first_matching_day = ((dow + 7 - first_dow) % 7) + 1;\n            let last_matching_day = daysInMonth - ((last_dow + 7 - dow) % 7);\n\n            if (pos == 0) {\n              for (let day = first_matching_day; day <= daysInMonth; day += 7) {\n                this.days.push(doy_offset + day);\n              }\n            } else if (pos > 0) {\n              month_day = first_matching_day + (pos - 1) * 7;\n\n              if (month_day <= daysInMonth) {\n                this.days.push(doy_offset + month_day);\n              }\n            } else {\n              month_day = last_matching_day + (pos + 1) * 7;\n\n              if (month_day > 0) {\n                this.days.push(doy_offset + month_day);\n              }\n            }\n          }\n        }\n      }\n      // Return dates in order of occurrence (1,2,3,...) instead\n      // of by groups of weekdays (1,8,15,...,2,9,16,...).\n      this.days.sort(function(a, b) { return a - b; }); // Comparator function allows to sort numbers.\n    } else if (partCount == 2 && \"BYDAY\" in parts && \"BYMONTHDAY\" in parts) {\n      let expandedDays = this.expand_by_day(aYear);\n\n      for (let day of expandedDays) {\n        let tt = Time.fromDayOfYear(day, aYear);\n        if (this.by_data.BYMONTHDAY.indexOf(tt.day) >= 0) {\n          this.days.push(day);\n        }\n      }\n    } else if (partCount == 3 &&\n               \"BYDAY\" in parts &&\n               \"BYMONTHDAY\" in parts &&\n               \"BYMONTH\" in parts) {\n      let expandedDays = this.expand_by_day(aYear);\n\n      for (let day of expandedDays) {\n        let tt = Time.fromDayOfYear(day, aYear);\n\n        if (this.by_data.BYMONTH.indexOf(tt.month) >= 0 &&\n            this.by_data.BYMONTHDAY.indexOf(tt.day) >= 0) {\n          this.days.push(day);\n        }\n      }\n    } else if (partCount == 2 && \"BYDAY\" in parts && \"BYWEEKNO\" in parts) {\n      let expandedDays = this.expand_by_day(aYear);\n\n      for (let day of expandedDays) {\n        let tt = Time.fromDayOfYear(day, aYear);\n        let weekno = tt.weekNumber(this.rule.wkst);\n\n        if (this.by_data.BYWEEKNO.indexOf(weekno)) {\n          this.days.push(day);\n        }\n      }\n    } else if (partCount == 3 &&\n               \"BYDAY\" in parts &&\n               \"BYWEEKNO\" in parts &&\n               \"BYMONTHDAY\" in parts) ; else if (partCount == 1 && \"BYYEARDAY\" in parts) {\n      this.days = this.days.concat(this.by_data.BYYEARDAY);\n    } else if (partCount == 2 && \"BYYEARDAY\" in parts && \"BYDAY\" in parts) {\n      let daysInYear = Time.isLeapYear(aYear) ? 366 : 365;\n      let expandedDays = new Set(this.expand_by_day(aYear));\n\n      for (let doy of this.by_data.BYYEARDAY) {\n        if (doy < 0) {\n          doy += daysInYear + 1;\n        }\n\n        if (expandedDays.has(doy)) {\n          this.days.push(doy);\n        }\n      }\n    } else {\n      this.days = [];\n    }\n\n    let daysInYear = Time.isLeapYear(aYear) ? 366 : 365;\n    this.days.sort((a, b) => {\n      if (a < 0) a += daysInYear + 1;\n      if (b < 0) b += daysInYear + 1;\n      return a - b;\n    });\n\n    return 0;\n  }\n\n  expand_by_day(aYear) {\n\n    let days_list = [];\n    let tmp = this.last.clone();\n\n    tmp.year = aYear;\n    tmp.month = 1;\n    tmp.day = 1;\n    tmp.isDate = true;\n\n    let start_dow = tmp.dayOfWeek();\n\n    tmp.month = 12;\n    tmp.day = 31;\n    tmp.isDate = true;\n\n    let end_dow = tmp.dayOfWeek();\n    let end_year_day = tmp.dayOfYear();\n\n    for (let day of this.by_data.BYDAY) {\n      let parts = this.ruleDayOfWeek(day);\n      let pos = parts[0];\n      let dow = parts[1];\n\n      if (pos == 0) {\n        let tmp_start_doy = ((dow + 7 - start_dow) % 7) + 1;\n\n        for (let doy = tmp_start_doy; doy <= end_year_day; doy += 7) {\n          days_list.push(doy);\n        }\n\n      } else if (pos > 0) {\n        let first;\n        if (dow >= start_dow) {\n          first = dow - start_dow + 1;\n        } else {\n          first = dow - start_dow + 8;\n        }\n\n        days_list.push(first + (pos - 1) * 7);\n      } else {\n        let last;\n        pos = -pos;\n\n        if (dow <= end_dow) {\n          last = end_year_day - end_dow + dow;\n        } else {\n          last = end_year_day - end_dow + dow - 7;\n        }\n\n        days_list.push(last - (pos - 1) * 7);\n      }\n    }\n    return days_list;\n  }\n\n  is_day_in_byday(tt) {\n    if (this.by_data.BYDAY) {\n      for (let day of this.by_data.BYDAY) {\n        let parts = this.ruleDayOfWeek(day);\n        let pos = parts[0];\n        let dow = parts[1];\n        let this_dow = tt.dayOfWeek();\n\n        if ((pos == 0 && dow == this_dow) ||\n            (tt.nthWeekDay(dow, pos) == tt.day)) {\n          return 1;\n        }\n      }\n    }\n\n    return 0;\n  }\n\n  /**\n   * Checks if given value is in BYSETPOS.\n   *\n   * @private\n   * @param {Numeric} aPos position to check for.\n   * @return {Boolean} false unless BYSETPOS rules exist\n   *                   and the given value is present in rules.\n   */\n  check_set_position(aPos) {\n    if (this.has_by_data('BYSETPOS')) {\n      let idx = this.by_data.BYSETPOS.indexOf(aPos);\n      // negative numbers are not false-y\n      return idx !== -1;\n    }\n    return false;\n  }\n\n  sort_byday_rules(aRules) {\n    for (let i = 0; i < aRules.length; i++) {\n      for (let j = 0; j < i; j++) {\n        let one = this.ruleDayOfWeek(aRules[j], this.rule.wkst)[1];\n        let two = this.ruleDayOfWeek(aRules[i], this.rule.wkst)[1];\n\n        if (one > two) {\n          let tmp = aRules[i];\n          aRules[i] = aRules[j];\n          aRules[j] = tmp;\n        }\n      }\n    }\n  }\n\n  check_contract_restriction(aRuleType, v) {\n    let indexMapValue = RecurIterator._indexMap[aRuleType];\n    let ruleMapValue = RecurIterator._expandMap[this.rule.freq][indexMapValue];\n    let pass = false;\n\n    if (aRuleType in this.by_data &&\n        ruleMapValue == RecurIterator.CONTRACT) {\n\n      let ruleType = this.by_data[aRuleType];\n\n      for (let bydata of ruleType) {\n        if (bydata == v) {\n          pass = true;\n          break;\n        }\n      }\n    } else {\n      // Not a contracting byrule or has no data, test passes\n      pass = true;\n    }\n    return pass;\n  }\n\n  check_contracting_rules() {\n    let dow = this.last.dayOfWeek();\n    let weekNo = this.last.weekNumber(this.rule.wkst);\n    let doy = this.last.dayOfYear();\n\n    return (this.check_contract_restriction(\"BYSECOND\", this.last.second) &&\n            this.check_contract_restriction(\"BYMINUTE\", this.last.minute) &&\n            this.check_contract_restriction(\"BYHOUR\", this.last.hour) &&\n            this.check_contract_restriction(\"BYDAY\", Recur.numericDayToIcalDay(dow)) &&\n            this.check_contract_restriction(\"BYWEEKNO\", weekNo) &&\n            this.check_contract_restriction(\"BYMONTHDAY\", this.last.day) &&\n            this.check_contract_restriction(\"BYMONTH\", this.last.month) &&\n            this.check_contract_restriction(\"BYYEARDAY\", doy));\n  }\n\n  setup_defaults(aRuleType, req, deftime) {\n    let indexMapValue = RecurIterator._indexMap[aRuleType];\n    let ruleMapValue = RecurIterator._expandMap[this.rule.freq][indexMapValue];\n\n    if (ruleMapValue != RecurIterator.CONTRACT) {\n      if (!(aRuleType in this.by_data)) {\n        this.by_data[aRuleType] = [deftime];\n      }\n      if (this.rule.freq != req) {\n        return this.by_data[aRuleType][0];\n      }\n    }\n    return deftime;\n  }\n\n  /**\n   * Convert iterator into a serialize-able object.  Will preserve current\n   * iteration sequence to ensure the seamless continuation of the recurrence\n   * rule.\n   * @return {Object}\n   */\n  toJSON() {\n    let result = Object.create(null);\n\n    result.initialized = this.initialized;\n    result.rule = this.rule.toJSON();\n    result.dtstart = this.dtstart.toJSON();\n    result.by_data = this.by_data;\n    result.days = this.days;\n    result.last = this.last.toJSON();\n    result.by_indices = this.by_indices;\n    result.occurrence_number = this.occurrence_number;\n\n    return result;\n  }\n}\n\n/**\n * An error indicating that a recurrence rule is invalid and produces no\n * occurrences.\n *\n * @extends {Error}\n * @class\n */\nclass InvalidRecurrenceRuleError extends Error {\n  constructor() {\n    super(\"Recurrence rule has no valid occurrences\");\n  }\n}\n\n/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/.\n * Portions Copyright (C) Philipp Kewisch */\n\n\n/**\n * This lets typescript resolve our custom types in the\n * generated d.ts files (jsdoc typedefs are converted to typescript types).\n * Ignore prevents the typedefs from being documented more than once.\n *\n * @ignore\n * @typedef {import(\"./types.js\").weekDay} weekDay\n * Imports the 'weekDay' type from the \"types.js\" module\n * @typedef {import(\"./types.js\").frequencyValues} frequencyValues\n * Imports the 'frequencyValues' type from the \"types.js\" module\n */\n\nconst VALID_DAY_NAMES = /^(SU|MO|TU|WE|TH|FR|SA)$/;\nconst VALID_BYDAY_PART = /^([+-])?(5[0-3]|[1-4][0-9]|[1-9])?(SU|MO|TU|WE|TH|FR|SA)$/;\nconst DOW_MAP = {\n  SU: Time.SUNDAY,\n  MO: Time.MONDAY,\n  TU: Time.TUESDAY,\n  WE: Time.WEDNESDAY,\n  TH: Time.THURSDAY,\n  FR: Time.FRIDAY,\n  SA: Time.SATURDAY\n};\n\nconst REVERSE_DOW_MAP = Object.fromEntries(Object.entries(DOW_MAP).map(entry => entry.reverse()));\n\nconst ALLOWED_FREQ = ['SECONDLY', 'MINUTELY', 'HOURLY',\n                      'DAILY', 'WEEKLY', 'MONTHLY', 'YEARLY'];\n\n/**\n * This class represents the \"recur\" value type, used for example by RRULE. It provides methods to\n * calculate occurrences among others.\n *\n * @memberof ICAL\n */\nclass Recur {\n  /**\n   * Creates a new {@link ICAL.Recur} instance from the passed string.\n   *\n   * @param {String} string         The string to parse\n   * @return {Recur}                The created recurrence instance\n   */\n  static fromString(string) {\n    let data = this._stringToData(string, false);\n    return new Recur(data);\n  }\n\n  /**\n   * Creates a new {@link ICAL.Recur} instance using members from the passed\n   * data object.\n   *\n   * @param {Object} aData                              An object with members of the recurrence\n   * @param {frequencyValues=} aData.freq               The frequency value\n   * @param {Number=} aData.interval                    The INTERVAL value\n   * @param {weekDay=} aData.wkst                       The week start value\n   * @param {Time=} aData.until                         The end of the recurrence set\n   * @param {Number=} aData.count                       The number of occurrences\n   * @param {Array.<Number>=} aData.bysecond            The seconds for the BYSECOND part\n   * @param {Array.<Number>=} aData.byminute            The minutes for the BYMINUTE part\n   * @param {Array.<Number>=} aData.byhour              The hours for the BYHOUR part\n   * @param {Array.<String>=} aData.byday               The BYDAY values\n   * @param {Array.<Number>=} aData.bymonthday          The days for the BYMONTHDAY part\n   * @param {Array.<Number>=} aData.byyearday           The days for the BYYEARDAY part\n   * @param {Array.<Number>=} aData.byweekno            The weeks for the BYWEEKNO part\n   * @param {Array.<Number>=} aData.bymonth             The month for the BYMONTH part\n   * @param {Array.<Number>=} aData.bysetpos            The positionals for the BYSETPOS part\n   */\n  static fromData(aData) {\n    return new Recur(aData);\n  }\n\n  /**\n   * Converts a recurrence string to a data object, suitable for the fromData\n   * method.\n   *\n   * @private\n   * @param {String} string     The string to parse\n   * @param {Boolean} fmtIcal   If true, the string is considered to be an\n   *                              iCalendar string\n   * @return {Recur}            The recurrence instance\n   */\n  static _stringToData(string, fmtIcal) {\n    let dict = Object.create(null);\n\n    // split is slower in FF but fast enough.\n    // v8 however this is faster then manual split?\n    let values = string.split(';');\n    let len = values.length;\n\n    for (let i = 0; i < len; i++) {\n      let parts = values[i].split('=');\n      let ucname = parts[0].toUpperCase();\n      let lcname = parts[0].toLowerCase();\n      let name = (fmtIcal ? lcname : ucname);\n      let value = parts[1];\n\n      if (ucname in partDesign) {\n        let partArr = value.split(',');\n        let partSet = new Set();\n\n        for (let part of partArr) {\n          partSet.add(partDesign[ucname](part));\n        }\n        partArr = [...partSet];\n\n        dict[name] = (partArr.length == 1 ? partArr[0] : partArr);\n      } else if (ucname in optionDesign) {\n        optionDesign[ucname](value, dict, fmtIcal);\n      } else {\n        // Don't swallow unknown values. Just set them as they are.\n        dict[lcname] = value;\n      }\n    }\n\n    return dict;\n  }\n\n  /**\n   * Convert an ical representation of a day (SU, MO, etc..)\n   * into a numeric value of that day.\n   *\n   * @param {String} string     The iCalendar day name\n   * @param {weekDay=} aWeekStart\n   *        The week start weekday, defaults to SUNDAY\n   * @return {Number}           Numeric value of given day\n   */\n  static icalDayToNumericDay(string, aWeekStart) {\n    //XXX: this is here so we can deal\n    //     with possibly invalid string values.\n    let firstDow = aWeekStart || Time.SUNDAY;\n    return ((DOW_MAP[string] - firstDow + 7) % 7) + 1;\n  }\n\n  /**\n   * Convert a numeric day value into its ical representation (SU, MO, etc..)\n   *\n   * @param {Number} num        Numeric value of given day\n   * @param {weekDay=} aWeekStart\n   *        The week start weekday, defaults to SUNDAY\n   * @return {String}           The ICAL day value, e.g SU,MO,...\n   */\n  static numericDayToIcalDay(num, aWeekStart) {\n    //XXX: this is here so we can deal with possibly invalid number values.\n    //     Also, this allows consistent mapping between day numbers and day\n    //     names for external users.\n    let firstDow = aWeekStart || Time.SUNDAY;\n    let dow = (num + firstDow - Time.SUNDAY);\n    if (dow > 7) {\n      dow -= 7;\n    }\n    return REVERSE_DOW_MAP[dow];\n  }\n\n  /**\n   * Create a new instance of the Recur class.\n   *\n   * @param {Object} data                               An object with members of the recurrence\n   * @param {frequencyValues=} data.freq                The frequency value\n   * @param {Number=} data.interval                     The INTERVAL value\n   * @param {weekDay=} data.wkst                        The week start value\n   * @param {Time=} data.until                          The end of the recurrence set\n   * @param {Number=} data.count                        The number of occurrences\n   * @param {Array.<Number>=} data.bysecond             The seconds for the BYSECOND part\n   * @param {Array.<Number>=} data.byminute             The minutes for the BYMINUTE part\n   * @param {Array.<Number>=} data.byhour               The hours for the BYHOUR part\n   * @param {Array.<String>=} data.byday                The BYDAY values\n   * @param {Array.<Number>=} data.bymonthday           The days for the BYMONTHDAY part\n   * @param {Array.<Number>=} data.byyearday            The days for the BYYEARDAY part\n   * @param {Array.<Number>=} data.byweekno             The weeks for the BYWEEKNO part\n   * @param {Array.<Number>=} data.bymonth              The month for the BYMONTH part\n   * @param {Array.<Number>=} data.bysetpos             The positionals for the BYSETPOS part\n   */\n  constructor(data) {\n    this.wrappedJSObject = this;\n    this.parts = {};\n\n    if (data && typeof(data) === 'object') {\n      this.fromData(data);\n    }\n  }\n\n  /**\n   * An object holding the BY-parts of the recurrence rule\n   * @memberof ICAL.Recur\n   * @typedef {Object} byParts\n   * @property {Array.<Number>=} BYSECOND            The seconds for the BYSECOND part\n   * @property {Array.<Number>=} BYMINUTE            The minutes for the BYMINUTE part\n   * @property {Array.<Number>=} BYHOUR              The hours for the BYHOUR part\n   * @property {Array.<String>=} BYDAY               The BYDAY values\n   * @property {Array.<Number>=} BYMONTHDAY          The days for the BYMONTHDAY part\n   * @property {Array.<Number>=} BYYEARDAY           The days for the BYYEARDAY part\n   * @property {Array.<Number>=} BYWEEKNO            The weeks for the BYWEEKNO part\n   * @property {Array.<Number>=} BYMONTH             The month for the BYMONTH part\n   * @property {Array.<Number>=} BYSETPOS            The positionals for the BYSETPOS part\n   */\n\n  /**\n   * An object holding the BY-parts of the recurrence rule\n   * @type {byParts}\n   */\n  parts = null;\n\n  /**\n   * The interval value for the recurrence rule.\n   * @type {Number}\n   */\n  interval = 1;\n\n  /**\n   * The week start day\n   *\n   * @type {weekDay}\n   * @default ICAL.Time.MONDAY\n   */\n  wkst = Time.MONDAY;\n\n  /**\n   * The end of the recurrence\n   * @type {?Time}\n   */\n  until = null;\n\n  /**\n   * The maximum number of occurrences\n   * @type {?Number}\n   */\n  count = null;\n\n  /**\n   * The frequency value.\n   * @type {frequencyValues}\n   */\n  freq = null;\n\n  /**\n   * The class identifier.\n   * @constant\n   * @type {String}\n   * @default \"icalrecur\"\n   */\n  icalclass = \"icalrecur\";\n\n  /**\n   * The type name, to be used in the jCal object.\n   * @constant\n   * @type {String}\n   * @default \"recur\"\n   */\n  icaltype = \"recur\";\n\n  /**\n   * Create a new iterator for this recurrence rule. The passed start date\n   * must be the start date of the event, not the start of the range to\n   * search in.\n   *\n   * @example\n   * let recur = comp.getFirstPropertyValue('rrule');\n   * let dtstart = comp.getFirstPropertyValue('dtstart');\n   * let iter = recur.iterator(dtstart);\n   * for (let next = iter.next(); next; next = iter.next()) {\n   *   if (next.compare(rangeStart) < 0) {\n   *     continue;\n   *   }\n   *   console.log(next.toString());\n   * }\n   *\n   * @param {Time} aStart        The item's start date\n   * @return {RecurIterator}     The recurrence iterator\n   */\n  iterator(aStart) {\n    return new RecurIterator({\n      rule: this,\n      dtstart: aStart\n    });\n  }\n\n  /**\n   * Returns a clone of the recurrence object.\n   *\n   * @return {Recur}      The cloned object\n   */\n  clone() {\n    return new Recur(this.toJSON());\n  }\n\n  /**\n   * Checks if the current rule is finite, i.e. has a count or until part.\n   *\n   * @return {Boolean}        True, if the rule is finite\n   */\n  isFinite() {\n    return !!(this.count || this.until);\n  }\n\n  /**\n   * Checks if the current rule has a count part, and not limited by an until\n   * part.\n   *\n   * @return {Boolean}        True, if the rule is by count\n   */\n  isByCount() {\n    return !!(this.count && !this.until);\n  }\n\n  /**\n   * Adds a component (part) to the recurrence rule. This is not a component\n   * in the sense of {@link ICAL.Component}, but a part of the recurrence\n   * rule, i.e. BYMONTH.\n   *\n   * @param {String} aType            The name of the component part\n   * @param {Array|String} aValue     The component value\n   */\n  addComponent(aType, aValue) {\n    let ucname = aType.toUpperCase();\n    if (ucname in this.parts) {\n      this.parts[ucname].push(aValue);\n    } else {\n      this.parts[ucname] = [aValue];\n    }\n  }\n\n  /**\n   * Sets the component value for the given by-part.\n   *\n   * @param {String} aType        The component part name\n   * @param {Array} aValues       The component values\n   */\n  setComponent(aType, aValues) {\n    this.parts[aType.toUpperCase()] = aValues.slice();\n  }\n\n  /**\n   * Gets (a copy) of the requested component value.\n   *\n   * @param {String} aType        The component part name\n   * @return {Array}              The component part value\n   */\n  getComponent(aType) {\n    let ucname = aType.toUpperCase();\n    return (ucname in this.parts ? this.parts[ucname].slice() : []);\n  }\n\n  /**\n   * Retrieves the next occurrence after the given recurrence id. See the\n   * guide on {@tutorial terminology} for more details.\n   *\n   * NOTE: Currently, this method iterates all occurrences from the start\n   * date. It should not be called in a loop for performance reasons. If you\n   * would like to get more than one occurrence, you can iterate the\n   * occurrences manually, see the example on the\n   * {@link ICAL.Recur#iterator iterator} method.\n   *\n   * @param {Time} aStartTime        The start of the event series\n   * @param {Time} aRecurrenceId     The date of the last occurrence\n   * @return {Time}                  The next occurrence after\n   */\n  getNextOccurrence(aStartTime, aRecurrenceId) {\n    let iter = this.iterator(aStartTime);\n    let next;\n\n    do {\n      next = iter.next();\n    } while (next && next.compare(aRecurrenceId) <= 0);\n\n    if (next && aRecurrenceId.zone) {\n      next.zone = aRecurrenceId.zone;\n    }\n\n    return next;\n  }\n\n  /**\n   * Sets up the current instance using members from the passed data object.\n   *\n   * @param {Object} data                               An object with members of the recurrence\n   * @param {frequencyValues=} data.freq                The frequency value\n   * @param {Number=} data.interval                     The INTERVAL value\n   * @param {weekDay=} data.wkst                        The week start value\n   * @param {Time=} data.until                          The end of the recurrence set\n   * @param {Number=} data.count                        The number of occurrences\n   * @param {Array.<Number>=} data.bysecond             The seconds for the BYSECOND part\n   * @param {Array.<Number>=} data.byminute             The minutes for the BYMINUTE part\n   * @param {Array.<Number>=} data.byhour               The hours for the BYHOUR part\n   * @param {Array.<String>=} data.byday                The BYDAY values\n   * @param {Array.<Number>=} data.bymonthday           The days for the BYMONTHDAY part\n   * @param {Array.<Number>=} data.byyearday            The days for the BYYEARDAY part\n   * @param {Array.<Number>=} data.byweekno             The weeks for the BYWEEKNO part\n   * @param {Array.<Number>=} data.bymonth              The month for the BYMONTH part\n   * @param {Array.<Number>=} data.bysetpos             The positionals for the BYSETPOS part\n   */\n  fromData(data) {\n    for (let key in data) {\n      let uckey = key.toUpperCase();\n\n      if (uckey in partDesign) {\n        if (Array.isArray(data[key])) {\n          this.parts[uckey] = data[key];\n        } else {\n          this.parts[uckey] = [data[key]];\n        }\n      } else {\n        this[key] = data[key];\n      }\n    }\n\n    if (this.interval && typeof this.interval != \"number\") {\n      optionDesign.INTERVAL(this.interval, this);\n    }\n\n    if (this.wkst && typeof this.wkst != \"number\") {\n      this.wkst = Recur.icalDayToNumericDay(this.wkst);\n    }\n\n    if (this.until && !(this.until instanceof Time)) {\n      this.until = Time.fromString(this.until);\n    }\n  }\n\n  /**\n   * The jCal representation of this recurrence type.\n   * @return {Object}\n   */\n  toJSON() {\n    let res = Object.create(null);\n    res.freq = this.freq;\n\n    if (this.count) {\n      res.count = this.count;\n    }\n\n    if (this.interval > 1) {\n      res.interval = this.interval;\n    }\n\n    for (let [k, kparts] of Object.entries(this.parts)) {\n      if (Array.isArray(kparts) && kparts.length == 1) {\n        res[k.toLowerCase()] = kparts[0];\n      } else {\n        res[k.toLowerCase()] = clone(kparts);\n      }\n    }\n\n    if (this.until) {\n      res.until = this.until.toString();\n    }\n    if ('wkst' in this && this.wkst !== Time.DEFAULT_WEEK_START) {\n      res.wkst = Recur.numericDayToIcalDay(this.wkst);\n    }\n    return res;\n  }\n\n  /**\n   * The string representation of this recurrence rule.\n   * @return {String}\n   */\n  toString() {\n    // TODO retain order\n    let str = \"FREQ=\" + this.freq;\n    if (this.count) {\n      str += \";COUNT=\" + this.count;\n    }\n    if (this.interval > 1) {\n      str += \";INTERVAL=\" + this.interval;\n    }\n    for (let [k, v] of Object.entries(this.parts)) {\n      str += \";\" + k + \"=\" + v;\n    }\n    if (this.until) {\n      str += ';UNTIL=' + this.until.toICALString();\n    }\n    if ('wkst' in this && this.wkst !== Time.DEFAULT_WEEK_START) {\n      str += ';WKST=' + Recur.numericDayToIcalDay(this.wkst);\n    }\n    return str;\n  }\n}\n\nfunction parseNumericValue(type, min, max, value) {\n  let result = value;\n\n  if (value[0] === '+') {\n    result = value.slice(1);\n  }\n\n  result = strictParseInt(result);\n\n  if (min !== undefined && value < min) {\n    throw new Error(\n      type + ': invalid value \"' + value + '\" must be > ' + min\n    );\n  }\n\n  if (max !== undefined && value > max) {\n    throw new Error(\n      type + ': invalid value \"' + value + '\" must be < ' + min\n    );\n  }\n\n  return result;\n}\n\nconst optionDesign = {\n  FREQ: function(value, dict, fmtIcal) {\n    // yes this is actually equal or faster then regex.\n    // upside here is we can enumerate the valid values.\n    if (ALLOWED_FREQ.indexOf(value) !== -1) {\n      dict.freq = value;\n    } else {\n      throw new Error(\n        'invalid frequency \"' + value + '\" expected: \"' +\n        ALLOWED_FREQ.join(', ') + '\"'\n      );\n    }\n  },\n\n  COUNT: function(value, dict, fmtIcal) {\n    dict.count = strictParseInt(value);\n  },\n\n  INTERVAL: function(value, dict, fmtIcal) {\n    dict.interval = strictParseInt(value);\n    if (dict.interval < 1) {\n      // 0 or negative values are not allowed, some engines seem to generate\n      // it though. Assume 1 instead.\n      dict.interval = 1;\n    }\n  },\n\n  UNTIL: function(value, dict, fmtIcal) {\n    if (value.length > 10) {\n      dict.until = design.icalendar.value['date-time'].fromICAL(value);\n    } else {\n      dict.until = design.icalendar.value.date.fromICAL(value);\n    }\n    if (!fmtIcal) {\n      dict.until = Time.fromString(dict.until);\n    }\n  },\n\n  WKST: function(value, dict, fmtIcal) {\n    if (VALID_DAY_NAMES.test(value)) {\n      dict.wkst = Recur.icalDayToNumericDay(value);\n    } else {\n      throw new Error('invalid WKST value \"' + value + '\"');\n    }\n  }\n};\n\nconst partDesign = {\n  BYSECOND: parseNumericValue.bind(undefined, 'BYSECOND', 0, 60),\n  BYMINUTE: parseNumericValue.bind(undefined, 'BYMINUTE', 0, 59),\n  BYHOUR: parseNumericValue.bind(undefined, 'BYHOUR', 0, 23),\n  BYDAY: function(value) {\n    if (VALID_BYDAY_PART.test(value)) {\n      return value;\n    } else {\n      throw new Error('invalid BYDAY value \"' + value + '\"');\n    }\n  },\n  BYMONTHDAY: parseNumericValue.bind(undefined, 'BYMONTHDAY', -31, 31),\n  BYYEARDAY: parseNumericValue.bind(undefined, 'BYYEARDAY', -366, 366),\n  BYWEEKNO: parseNumericValue.bind(undefined, 'BYWEEKNO', -53, 53),\n  BYMONTH: parseNumericValue.bind(undefined, 'BYMONTH', 1, 12),\n  BYSETPOS: parseNumericValue.bind(undefined, 'BYSETPOS', -366, 366)\n};\n\n/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/.\n * Portions Copyright (C) Philipp Kewisch */\n\n\n/**\n * This lets typescript resolve our custom types in the\n * generated d.ts files (jsdoc typedefs are converted to typescript types).\n * Ignore prevents the typedefs from being documented more than once.\n * @ignore\n * @typedef {import(\"./types.js\").designSet} designSet\n * Imports the 'designSet' type from the \"types.js\" module\n */\n\n/** @module ICAL.design */\n\nconst FROM_ICAL_NEWLINE = /\\\\\\\\|\\\\;|\\\\,|\\\\[Nn]/g;\nconst TO_ICAL_NEWLINE = /\\\\|;|,|\\n/g;\nconst FROM_VCARD_NEWLINE = /\\\\\\\\|\\\\,|\\\\[Nn]/g;\nconst TO_VCARD_NEWLINE = /\\\\|,|\\n/g;\n\nfunction createTextType(fromNewline, toNewline) {\n  let result = {\n    matches: /.*/,\n\n    fromICAL: function(aValue, structuredEscape) {\n      return replaceNewline(aValue, fromNewline, structuredEscape);\n    },\n\n    toICAL: function(aValue, structuredEscape) {\n      let regEx = toNewline;\n      if (structuredEscape)\n         regEx = new RegExp(regEx.source + '|' + structuredEscape, regEx.flags);\n      return aValue.replace(regEx, function(str) {\n        switch (str) {\n        case \"\\\\\":\n          return \"\\\\\\\\\";\n        case \";\":\n          return \"\\\\;\";\n        case \",\":\n          return \"\\\\,\";\n        case \"\\n\":\n          return \"\\\\n\";\n        /* c8 ignore next 2 */\n        default:\n          return str;\n        }\n      });\n    }\n  };\n  return result;\n}\n\n// default types used multiple times\nconst DEFAULT_TYPE_TEXT = { defaultType: \"text\" };\nconst DEFAULT_TYPE_TEXT_MULTI = { defaultType: \"text\", multiValue: \",\" };\nconst DEFAULT_TYPE_TEXT_STRUCTURED = { defaultType: \"text\", structuredValue: \";\" };\nconst DEFAULT_TYPE_INTEGER = { defaultType: \"integer\" };\nconst DEFAULT_TYPE_DATETIME_DATE = { defaultType: \"date-time\", allowedTypes: [\"date-time\", \"date\"] };\nconst DEFAULT_TYPE_DATETIME = { defaultType: \"date-time\" };\nconst DEFAULT_TYPE_URI = { defaultType: \"uri\" };\nconst DEFAULT_TYPE_UTCOFFSET = { defaultType: \"utc-offset\" };\nconst DEFAULT_TYPE_RECUR = { defaultType: \"recur\" };\nconst DEFAULT_TYPE_DATE_ANDOR_TIME = { defaultType: \"date-and-or-time\", allowedTypes: [\"date-time\", \"date\", \"text\"] };\n\nfunction replaceNewlineReplace(string) {\n  switch (string) {\n    case \"\\\\\\\\\":\n      return \"\\\\\";\n    case \"\\\\;\":\n      return \";\";\n    case \"\\\\,\":\n      return \",\";\n    case \"\\\\n\":\n    case \"\\\\N\":\n      return \"\\n\";\n    /* c8 ignore next 2 */\n    default:\n      return string;\n  }\n}\n\nfunction replaceNewline(value, newline, structuredEscape) {\n  // avoid regex when possible.\n  if (value.indexOf('\\\\') === -1) {\n    return value;\n  }\n  if (structuredEscape)\n     newline = new RegExp(newline.source + '|\\\\\\\\' + structuredEscape, newline.flags);\n  return value.replace(newline, replaceNewlineReplace);\n}\n\nlet commonProperties = {\n  \"categories\": DEFAULT_TYPE_TEXT_MULTI,\n  \"url\": DEFAULT_TYPE_URI,\n  \"version\": DEFAULT_TYPE_TEXT,\n  \"uid\": DEFAULT_TYPE_TEXT\n};\n\nlet commonValues = {\n  \"boolean\": {\n    values: [\"TRUE\", \"FALSE\"],\n\n    fromICAL: function(aValue) {\n      switch (aValue) {\n        case 'TRUE':\n          return true;\n        case 'FALSE':\n          return false;\n        default:\n          //TODO: parser warning\n          return false;\n      }\n    },\n\n    toICAL: function(aValue) {\n      if (aValue) {\n        return 'TRUE';\n      }\n      return 'FALSE';\n    }\n\n  },\n  float: {\n    matches: /^[+-]?\\d+\\.\\d+$/,\n\n    fromICAL: function(aValue) {\n      let parsed = parseFloat(aValue);\n      if (isStrictlyNaN(parsed)) {\n        // TODO: parser warning\n        return 0.0;\n      }\n      return parsed;\n    },\n\n    toICAL: function(aValue) {\n      return String(aValue);\n    }\n  },\n  integer: {\n    fromICAL: function(aValue) {\n      let parsed = parseInt(aValue);\n      if (isStrictlyNaN(parsed)) {\n        return 0;\n      }\n      return parsed;\n    },\n\n    toICAL: function(aValue) {\n      return String(aValue);\n    }\n  },\n  \"utc-offset\": {\n    toICAL: function(aValue) {\n      if (aValue.length < 7) {\n        // no seconds\n        // -0500\n        return aValue.slice(0, 3) +\n               aValue.slice(4, 6);\n      } else {\n        // seconds\n        // -050000\n        return aValue.slice(0, 3) +\n               aValue.slice(4, 6) +\n               aValue.slice(7, 9);\n      }\n    },\n\n    fromICAL: function(aValue) {\n      if (aValue.length < 6) {\n        // no seconds\n        // -05:00\n        return aValue.slice(0, 3) + ':' +\n               aValue.slice(3, 5);\n      } else {\n        // seconds\n        // -05:00:00\n        return aValue.slice(0, 3) + ':' +\n               aValue.slice(3, 5) + ':' +\n               aValue.slice(5, 7);\n      }\n    },\n\n    decorate: function(aValue) {\n      return UtcOffset.fromString(aValue);\n    },\n\n    undecorate: function(aValue) {\n      return aValue.toString();\n    }\n  }\n};\n\nlet icalParams = {\n  // Although the syntax is DQUOTE uri DQUOTE, I don't think we should\n  // enforce anything aside from it being a valid content line.\n  //\n  // At least some params require - if multi values are used - DQUOTEs\n  // for each of its values - e.g. delegated-from=\"uri1\",\"uri2\"\n  // To indicate this, I introduced the new k/v pair\n  // multiValueSeparateDQuote: true\n  //\n  // \"ALTREP\": { ... },\n\n  // CN just wants a param-value\n  // \"CN\": { ... }\n\n  \"cutype\": {\n    values: [\"INDIVIDUAL\", \"GROUP\", \"RESOURCE\", \"ROOM\", \"UNKNOWN\"],\n    allowXName: true,\n    allowIanaToken: true\n  },\n\n  \"delegated-from\": {\n    valueType: \"cal-address\",\n    multiValue: \",\",\n    multiValueSeparateDQuote: true\n  },\n  \"delegated-to\": {\n    valueType: \"cal-address\",\n    multiValue: \",\",\n    multiValueSeparateDQuote: true\n  },\n  // \"DIR\": { ... }, // See ALTREP\n  \"encoding\": {\n    values: [\"8BIT\", \"BASE64\"]\n  },\n  // \"FMTTYPE\": { ... }, // See ALTREP\n  \"fbtype\": {\n    values: [\"FREE\", \"BUSY\", \"BUSY-UNAVAILABLE\", \"BUSY-TENTATIVE\"],\n    allowXName: true,\n    allowIanaToken: true\n  },\n  // \"LANGUAGE\": { ... }, // See ALTREP\n  \"member\": {\n    valueType: \"cal-address\",\n    multiValue: \",\",\n    multiValueSeparateDQuote: true\n  },\n  \"partstat\": {\n    // TODO These values are actually different per-component\n    values: [\"NEEDS-ACTION\", \"ACCEPTED\", \"DECLINED\", \"TENTATIVE\",\n             \"DELEGATED\", \"COMPLETED\", \"IN-PROCESS\"],\n    allowXName: true,\n    allowIanaToken: true\n  },\n  \"range\": {\n    values: [\"THISANDFUTURE\"]\n  },\n  \"related\": {\n    values: [\"START\", \"END\"]\n  },\n  \"reltype\": {\n    values: [\"PARENT\", \"CHILD\", \"SIBLING\"],\n    allowXName: true,\n    allowIanaToken: true\n  },\n  \"role\": {\n    values: [\"REQ-PARTICIPANT\", \"CHAIR\",\n             \"OPT-PARTICIPANT\", \"NON-PARTICIPANT\"],\n    allowXName: true,\n    allowIanaToken: true\n  },\n  \"rsvp\": {\n    values: [\"TRUE\", \"FALSE\"]\n  },\n  \"sent-by\": {\n    valueType: \"cal-address\"\n  },\n  \"tzid\": {\n    matches: /^\\//\n  },\n  \"value\": {\n    // since the value here is a 'type' lowercase is used.\n    values: [\"binary\", \"boolean\", \"cal-address\", \"date\", \"date-time\",\n             \"duration\", \"float\", \"integer\", \"period\", \"recur\", \"text\",\n             \"time\", \"uri\", \"utc-offset\"],\n    allowXName: true,\n    allowIanaToken: true\n  }\n};\n\n// When adding a value here, be sure to add it to the parameter types!\nconst icalValues = extend(commonValues, {\n  text: createTextType(FROM_ICAL_NEWLINE, TO_ICAL_NEWLINE),\n\n  uri: {\n    // TODO\n    /* ... */\n  },\n\n  \"binary\": {\n    decorate: function(aString) {\n      return Binary.fromString(aString);\n    },\n\n    undecorate: function(aBinary) {\n      return aBinary.toString();\n    }\n  },\n  \"cal-address\": {\n    // needs to be an uri\n  },\n  \"date\": {\n    decorate: function(aValue, aProp) {\n      if (design.strict) {\n        return Time.fromDateString(aValue, aProp);\n      } else {\n        return Time.fromString(aValue, aProp);\n      }\n    },\n\n    /**\n     * undecorates a time object.\n     */\n    undecorate: function(aValue) {\n      return aValue.toString();\n    },\n\n    fromICAL: function(aValue) {\n      // from: 20120901\n      // to: 2012-09-01\n      if (!design.strict && aValue.length >= 15) {\n        // This is probably a date-time, e.g. 20120901T130000Z\n        return icalValues[\"date-time\"].fromICAL(aValue);\n      } else {\n        return aValue.slice(0, 4) + '-' +\n               aValue.slice(4, 6) + '-' +\n               aValue.slice(6, 8);\n      }\n    },\n\n    toICAL: function(aValue) {\n      // from: 2012-09-01\n      // to: 20120901\n      let len = aValue.length;\n\n      if (len == 10) {\n        return aValue.slice(0, 4) +\n               aValue.slice(5, 7) +\n               aValue.slice(8, 10);\n      } else if (len >= 19) {\n        return icalValues[\"date-time\"].toICAL(aValue);\n      } else {\n        //TODO: serialize warning?\n        return aValue;\n      }\n\n    }\n  },\n  \"date-time\": {\n    fromICAL: function(aValue) {\n      // from: 20120901T130000\n      // to: 2012-09-01T13:00:00\n      if (!design.strict && aValue.length == 8) {\n        // This is probably a date, e.g. 20120901\n        return icalValues.date.fromICAL(aValue);\n      } else {\n        let result = aValue.slice(0, 4) + '-' +\n                     aValue.slice(4, 6) + '-' +\n                     aValue.slice(6, 8) + 'T' +\n                     aValue.slice(9, 11) + ':' +\n                     aValue.slice(11, 13) + ':' +\n                     aValue.slice(13, 15);\n\n        if (aValue[15] && aValue[15] === 'Z') {\n          result += 'Z';\n        }\n\n        return result;\n      }\n    },\n\n    toICAL: function(aValue) {\n      // from: 2012-09-01T13:00:00\n      // to: 20120901T130000\n      let len = aValue.length;\n\n      if (len == 10 && !design.strict) {\n        return icalValues.date.toICAL(aValue);\n      } else if (len >= 19) {\n        let result = aValue.slice(0, 4) +\n                     aValue.slice(5, 7) +\n                     // grab the (DDTHH) segment\n                     aValue.slice(8, 13) +\n                     // MM\n                     aValue.slice(14, 16) +\n                     // SS\n                     aValue.slice(17, 19);\n\n        if (aValue[19] && aValue[19] === 'Z') {\n          result += 'Z';\n        }\n        return result;\n      } else {\n        // TODO: error\n        return aValue;\n      }\n    },\n\n    decorate: function(aValue, aProp) {\n      if (design.strict) {\n        return Time.fromDateTimeString(aValue, aProp);\n      } else {\n        return Time.fromString(aValue, aProp);\n      }\n    },\n\n    undecorate: function(aValue) {\n      return aValue.toString();\n    }\n  },\n  duration: {\n    decorate: function(aValue) {\n      return Duration.fromString(aValue);\n    },\n    undecorate: function(aValue) {\n      return aValue.toString();\n    }\n  },\n  period: {\n    fromICAL: function(string) {\n      let parts = string.split('/');\n      parts[0] = icalValues['date-time'].fromICAL(parts[0]);\n\n      if (!Duration.isValueString(parts[1])) {\n        parts[1] = icalValues['date-time'].fromICAL(parts[1]);\n      }\n\n      return parts;\n    },\n\n    toICAL: function(parts) {\n      parts = parts.slice();\n      if (!design.strict && parts[0].length == 10) {\n        parts[0] = icalValues.date.toICAL(parts[0]);\n      } else {\n        parts[0] = icalValues['date-time'].toICAL(parts[0]);\n      }\n\n      if (!Duration.isValueString(parts[1])) {\n        if (!design.strict && parts[1].length == 10) {\n          parts[1] = icalValues.date.toICAL(parts[1]);\n        } else {\n          parts[1] = icalValues['date-time'].toICAL(parts[1]);\n        }\n      }\n\n      return parts.join(\"/\");\n    },\n\n    decorate: function(aValue, aProp) {\n      return Period.fromJSON(aValue, aProp, !design.strict);\n    },\n\n    undecorate: function(aValue) {\n      return aValue.toJSON();\n    }\n  },\n  recur: {\n    fromICAL: function(string) {\n      return Recur._stringToData(string, true);\n    },\n\n    toICAL: function(data) {\n      let str = \"\";\n      for (let [k, val] of Object.entries(data)) {\n        if (k == \"until\") {\n          if (val.length > 10) {\n            val = icalValues['date-time'].toICAL(val);\n          } else {\n            val = icalValues.date.toICAL(val);\n          }\n        } else if (k == \"wkst\") {\n          if (typeof val === 'number') {\n            val = Recur.numericDayToIcalDay(val);\n          }\n        } else if (Array.isArray(val)) {\n          val = val.join(\",\");\n        }\n        str += k.toUpperCase() + \"=\" + val + \";\";\n      }\n      return str.slice(0, Math.max(0, str.length - 1));\n    },\n\n    decorate: function decorate(aValue) {\n      return Recur.fromData(aValue);\n    },\n\n    undecorate: function(aRecur) {\n      return aRecur.toJSON();\n    }\n  },\n\n  time: {\n    fromICAL: function(aValue) {\n      // from: MMHHSS(Z)?\n      // to: HH:MM:SS(Z)?\n      if (aValue.length < 6) {\n        // TODO: parser exception?\n        return aValue;\n      }\n\n      // HH::MM::SSZ?\n      let result = aValue.slice(0, 2) + ':' +\n                   aValue.slice(2, 4) + ':' +\n                   aValue.slice(4, 6);\n\n      if (aValue[6] === 'Z') {\n        result += 'Z';\n      }\n\n      return result;\n    },\n\n    toICAL: function(aValue) {\n      // from: HH:MM:SS(Z)?\n      // to: MMHHSS(Z)?\n      if (aValue.length < 8) {\n        //TODO: error\n        return aValue;\n      }\n\n      let result = aValue.slice(0, 2) +\n                   aValue.slice(3, 5) +\n                   aValue.slice(6, 8);\n\n      if (aValue[8] === 'Z') {\n        result += 'Z';\n      }\n\n      return result;\n    }\n  }\n});\n\nlet icalProperties = extend(commonProperties, {\n\n  \"action\": DEFAULT_TYPE_TEXT,\n  \"attach\": { defaultType: \"uri\" },\n  \"attendee\": { defaultType: \"cal-address\" },\n  \"calscale\": DEFAULT_TYPE_TEXT,\n  \"class\": DEFAULT_TYPE_TEXT,\n  \"comment\": DEFAULT_TYPE_TEXT,\n  \"completed\": DEFAULT_TYPE_DATETIME,\n  \"contact\": DEFAULT_TYPE_TEXT,\n  \"created\": DEFAULT_TYPE_DATETIME,\n  \"description\": DEFAULT_TYPE_TEXT,\n  \"dtend\": DEFAULT_TYPE_DATETIME_DATE,\n  \"dtstamp\": DEFAULT_TYPE_DATETIME,\n  \"dtstart\": DEFAULT_TYPE_DATETIME_DATE,\n  \"due\": DEFAULT_TYPE_DATETIME_DATE,\n  \"duration\": { defaultType: \"duration\" },\n  \"exdate\": {\n    defaultType: \"date-time\",\n    allowedTypes: [\"date-time\", \"date\"],\n    multiValue: ','\n  },\n  \"exrule\": DEFAULT_TYPE_RECUR,\n  \"freebusy\": { defaultType: \"period\", multiValue: \",\" },\n  \"geo\": { defaultType: \"float\", structuredValue: \";\" },\n  \"last-modified\": DEFAULT_TYPE_DATETIME,\n  \"location\": DEFAULT_TYPE_TEXT,\n  \"method\": DEFAULT_TYPE_TEXT,\n  \"organizer\": { defaultType: \"cal-address\" },\n  \"percent-complete\": DEFAULT_TYPE_INTEGER,\n  \"priority\": DEFAULT_TYPE_INTEGER,\n  \"prodid\": DEFAULT_TYPE_TEXT,\n  \"related-to\": DEFAULT_TYPE_TEXT,\n  \"repeat\": DEFAULT_TYPE_INTEGER,\n  \"rdate\": {\n    defaultType: \"date-time\",\n    allowedTypes: [\"date-time\", \"date\", \"period\"],\n    multiValue: ',',\n    detectType: function(string) {\n      if (string.indexOf('/') !== -1) {\n        return 'period';\n      }\n      return (string.indexOf('T') === -1) ? 'date' : 'date-time';\n    }\n  },\n  \"recurrence-id\": DEFAULT_TYPE_DATETIME_DATE,\n  \"resources\": DEFAULT_TYPE_TEXT_MULTI,\n  \"request-status\": DEFAULT_TYPE_TEXT_STRUCTURED,\n  \"rrule\": DEFAULT_TYPE_RECUR,\n  \"sequence\": DEFAULT_TYPE_INTEGER,\n  \"status\": DEFAULT_TYPE_TEXT,\n  \"summary\": DEFAULT_TYPE_TEXT,\n  \"transp\": DEFAULT_TYPE_TEXT,\n  \"trigger\": { defaultType: \"duration\", allowedTypes: [\"duration\", \"date-time\"] },\n  \"tzoffsetfrom\": DEFAULT_TYPE_UTCOFFSET,\n  \"tzoffsetto\": DEFAULT_TYPE_UTCOFFSET,\n  \"tzurl\": DEFAULT_TYPE_URI,\n  \"tzid\": DEFAULT_TYPE_TEXT,\n  \"tzname\": DEFAULT_TYPE_TEXT\n});\n\n// When adding a value here, be sure to add it to the parameter types!\nconst vcardValues = extend(commonValues, {\n  text: createTextType(FROM_VCARD_NEWLINE, TO_VCARD_NEWLINE),\n  uri: createTextType(FROM_VCARD_NEWLINE, TO_VCARD_NEWLINE),\n\n  date: {\n    decorate: function(aValue) {\n      return VCardTime.fromDateAndOrTimeString(aValue, \"date\");\n    },\n    undecorate: function(aValue) {\n      return aValue.toString();\n    },\n    fromICAL: function(aValue) {\n      if (aValue.length == 8) {\n        return icalValues.date.fromICAL(aValue);\n      } else if (aValue[0] == '-' && aValue.length == 6) {\n        return aValue.slice(0, 4) + '-' + aValue.slice(4);\n      } else {\n        return aValue;\n      }\n    },\n    toICAL: function(aValue) {\n      if (aValue.length == 10) {\n        return icalValues.date.toICAL(aValue);\n      } else if (aValue[0] == '-' && aValue.length == 7) {\n        return aValue.slice(0, 4) + aValue.slice(5);\n      } else {\n        return aValue;\n      }\n    }\n  },\n\n  time: {\n    decorate: function(aValue) {\n      return VCardTime.fromDateAndOrTimeString(\"T\" + aValue, \"time\");\n    },\n    undecorate: function(aValue) {\n      return aValue.toString();\n    },\n    fromICAL: function(aValue) {\n      let splitzone = vcardValues.time._splitZone(aValue, true);\n      let zone = splitzone[0], value = splitzone[1];\n\n      //console.log(\"SPLIT: \",splitzone);\n\n      if (value.length == 6) {\n        value = value.slice(0, 2) + ':' +\n                value.slice(2, 4) + ':' +\n                value.slice(4, 6);\n      } else if (value.length == 4 && value[0] != '-') {\n        value = value.slice(0, 2) + ':' + value.slice(2, 4);\n      } else if (value.length == 5) {\n        value = value.slice(0, 3) + ':' + value.slice(3, 5);\n      }\n\n      if (zone.length == 5 && (zone[0] == '-' || zone[0] == '+')) {\n        zone = zone.slice(0, 3) + ':' + zone.slice(3);\n      }\n\n      return value + zone;\n    },\n\n    toICAL: function(aValue) {\n      let splitzone = vcardValues.time._splitZone(aValue);\n      let zone = splitzone[0], value = splitzone[1];\n\n      if (value.length == 8) {\n        value = value.slice(0, 2) +\n                value.slice(3, 5) +\n                value.slice(6, 8);\n      } else if (value.length == 5 && value[0] != '-') {\n        value = value.slice(0, 2) + value.slice(3, 5);\n      } else if (value.length == 6) {\n        value = value.slice(0, 3) + value.slice(4, 6);\n      }\n\n      if (zone.length == 6 && (zone[0] == '-' || zone[0] == '+')) {\n        zone = zone.slice(0, 3) + zone.slice(4);\n      }\n\n      return value + zone;\n    },\n\n    _splitZone: function(aValue, isFromIcal) {\n      let lastChar = aValue.length - 1;\n      let signChar = aValue.length - (isFromIcal ? 5 : 6);\n      let sign = aValue[signChar];\n      let zone, value;\n\n      if (aValue[lastChar] == 'Z') {\n        zone = aValue[lastChar];\n        value = aValue.slice(0, Math.max(0, lastChar));\n      } else if (aValue.length > 6 && (sign == '-' || sign == '+')) {\n        zone = aValue.slice(signChar);\n        value = aValue.slice(0, Math.max(0, signChar));\n      } else {\n        zone = \"\";\n        value = aValue;\n      }\n\n      return [zone, value];\n    }\n  },\n\n  \"date-time\": {\n    decorate: function(aValue) {\n      return VCardTime.fromDateAndOrTimeString(aValue, \"date-time\");\n    },\n\n    undecorate: function(aValue) {\n      return aValue.toString();\n    },\n\n    fromICAL: function(aValue) {\n      return vcardValues['date-and-or-time'].fromICAL(aValue);\n    },\n\n    toICAL: function(aValue) {\n      return vcardValues['date-and-or-time'].toICAL(aValue);\n    }\n  },\n\n  \"date-and-or-time\": {\n    decorate: function(aValue) {\n      return VCardTime.fromDateAndOrTimeString(aValue, \"date-and-or-time\");\n    },\n\n    undecorate: function(aValue) {\n      return aValue.toString();\n    },\n\n    fromICAL: function(aValue) {\n      let parts = aValue.split('T');\n      return (parts[0] ? vcardValues.date.fromICAL(parts[0]) : '') +\n             (parts[1] ? 'T' + vcardValues.time.fromICAL(parts[1]) : '');\n    },\n\n    toICAL: function(aValue) {\n      let parts = aValue.split('T');\n      return vcardValues.date.toICAL(parts[0]) +\n             (parts[1] ? 'T' + vcardValues.time.toICAL(parts[1]) : '');\n\n    }\n  },\n  timestamp: icalValues['date-time'],\n  \"language-tag\": {\n    matches: /^[a-zA-Z0-9-]+$/ // Could go with a more strict regex here\n  },\n  \"phone-number\": {\n    fromICAL: function(aValue) {\n      return Array.from(aValue).filter(function(c) {\n          return c === '\\\\' ? undefined : c;\n        }).join('');\n    },\n    toICAL: function(aValue) {\n      return Array.from(aValue).map(function(c) {\n        return c === ',' || c === \";\" ? '\\\\' + c : c;\n      }).join('');\n    }\n  }\n});\n\nlet vcardParams = {\n  \"type\": {\n    valueType: \"text\",\n    multiValue: \",\"\n  },\n  \"value\": {\n    // since the value here is a 'type' lowercase is used.\n    values: [\"text\", \"uri\", \"date\", \"time\", \"date-time\", \"date-and-or-time\",\n             \"timestamp\", \"boolean\", \"integer\", \"float\", \"utc-offset\",\n             \"language-tag\"],\n    allowXName: true,\n    allowIanaToken: true\n  }\n};\n\nlet vcardProperties = extend(commonProperties, {\n  \"adr\": { defaultType: \"text\", structuredValue: \";\", multiValue: \",\" },\n  \"anniversary\": DEFAULT_TYPE_DATE_ANDOR_TIME,\n  \"bday\": DEFAULT_TYPE_DATE_ANDOR_TIME,\n  \"caladruri\": DEFAULT_TYPE_URI,\n  \"caluri\": DEFAULT_TYPE_URI,\n  \"clientpidmap\": DEFAULT_TYPE_TEXT_STRUCTURED,\n  \"email\": DEFAULT_TYPE_TEXT,\n  \"fburl\": DEFAULT_TYPE_URI,\n  \"fn\": DEFAULT_TYPE_TEXT,\n  \"gender\": DEFAULT_TYPE_TEXT_STRUCTURED,\n  \"geo\": DEFAULT_TYPE_URI,\n  \"impp\": DEFAULT_TYPE_URI,\n  \"key\": DEFAULT_TYPE_URI,\n  \"kind\": DEFAULT_TYPE_TEXT,\n  \"lang\": { defaultType: \"language-tag\" },\n  \"logo\": DEFAULT_TYPE_URI,\n  \"member\": DEFAULT_TYPE_URI,\n  \"n\": { defaultType: \"text\", structuredValue: \";\", multiValue: \",\" },\n  \"nickname\": DEFAULT_TYPE_TEXT_MULTI,\n  \"note\": DEFAULT_TYPE_TEXT,\n  \"org\": { defaultType: \"text\", structuredValue: \";\" },\n  \"photo\": DEFAULT_TYPE_URI,\n  \"related\": DEFAULT_TYPE_URI,\n  \"rev\": { defaultType: \"timestamp\" },\n  \"role\": DEFAULT_TYPE_TEXT,\n  \"sound\": DEFAULT_TYPE_URI,\n  \"source\": DEFAULT_TYPE_URI,\n  \"tel\": { defaultType: \"uri\", allowedTypes: [\"uri\", \"text\"] },\n  \"title\": DEFAULT_TYPE_TEXT,\n  \"tz\": { defaultType: \"text\", allowedTypes: [\"text\", \"utc-offset\", \"uri\"] },\n  \"xml\": DEFAULT_TYPE_TEXT\n});\n\nlet vcard3Values = extend(commonValues, {\n  binary: icalValues.binary,\n  date: vcardValues.date,\n  \"date-time\": vcardValues[\"date-time\"],\n  \"phone-number\": vcardValues[\"phone-number\"],\n  uri: icalValues.uri,\n  text: vcardValues.text,\n  time: icalValues.time,\n  vcard: icalValues.text,\n  \"utc-offset\": {\n    toICAL: function(aValue) {\n      return aValue.slice(0, 7);\n    },\n\n    fromICAL: function(aValue) {\n      return aValue.slice(0, 7);\n    },\n\n    decorate: function(aValue) {\n      return UtcOffset.fromString(aValue);\n    },\n\n    undecorate: function(aValue) {\n      return aValue.toString();\n    }\n  }\n});\n\nlet vcard3Params = {\n  \"type\": {\n    valueType: \"text\",\n    multiValue: \",\"\n  },\n  \"value\": {\n    // since the value here is a 'type' lowercase is used.\n    values: [\"text\", \"uri\", \"date\", \"date-time\", \"phone-number\", \"time\",\n             \"boolean\", \"integer\", \"float\", \"utc-offset\", \"vcard\", \"binary\"],\n    allowXName: true,\n    allowIanaToken: true\n  }\n};\n\nlet vcard3Properties = extend(commonProperties, {\n  fn: DEFAULT_TYPE_TEXT,\n  n: { defaultType: \"text\", structuredValue: \";\", multiValue: \",\" },\n  nickname: DEFAULT_TYPE_TEXT_MULTI,\n  photo: { defaultType: \"binary\", allowedTypes: [\"binary\", \"uri\"] },\n  bday: {\n    defaultType: \"date-time\",\n    allowedTypes: [\"date-time\", \"date\"],\n    detectType: function(string) {\n      return (string.indexOf('T') === -1) ? 'date' : 'date-time';\n    }\n  },\n\n  adr: { defaultType: \"text\", structuredValue: \";\", multiValue: \",\" },\n  label: DEFAULT_TYPE_TEXT,\n\n  tel: { defaultType: \"phone-number\" },\n  email: DEFAULT_TYPE_TEXT,\n  mailer: DEFAULT_TYPE_TEXT,\n\n  tz: { defaultType: \"utc-offset\", allowedTypes: [\"utc-offset\", \"text\"] },\n  geo: { defaultType: \"float\", structuredValue: \";\" },\n\n  title: DEFAULT_TYPE_TEXT,\n  role: DEFAULT_TYPE_TEXT,\n  logo: { defaultType: \"binary\", allowedTypes: [\"binary\", \"uri\"] },\n  agent: { defaultType: \"vcard\", allowedTypes: [\"vcard\", \"text\", \"uri\"] },\n  org: DEFAULT_TYPE_TEXT_STRUCTURED,\n\n  note: DEFAULT_TYPE_TEXT_MULTI,\n  prodid: DEFAULT_TYPE_TEXT,\n  rev: {\n    defaultType: \"date-time\",\n    allowedTypes: [\"date-time\", \"date\"],\n    detectType: function(string) {\n      return (string.indexOf('T') === -1) ? 'date' : 'date-time';\n    }\n  },\n  \"sort-string\": DEFAULT_TYPE_TEXT,\n  sound: { defaultType: \"binary\", allowedTypes: [\"binary\", \"uri\"] },\n\n  class: DEFAULT_TYPE_TEXT,\n  key: { defaultType: \"binary\", allowedTypes: [\"binary\", \"text\"] }\n});\n\n/**\n * iCalendar design set\n * @type {designSet}\n */\nlet icalSet = {\n  name: \"ical\",\n  value: icalValues,\n  param: icalParams,\n  property: icalProperties,\n  propertyGroups: false\n};\n\n/**\n * vCard 4.0 design set\n * @type {designSet}\n */\nlet vcardSet = {\n  name: \"vcard4\",\n  value: vcardValues,\n  param: vcardParams,\n  property: vcardProperties,\n  propertyGroups: true\n};\n\n/**\n * vCard 3.0 design set\n * @type {designSet}\n */\nlet vcard3Set = {\n  name: \"vcard3\",\n  value: vcard3Values,\n  param: vcard3Params,\n  property: vcard3Properties,\n  propertyGroups: true\n};\n\n/**\n * The design data, used by the parser to determine types for properties and\n * other metadata needed to produce correct jCard/jCal data.\n *\n * @alias ICAL.design\n * @exports module:ICAL.design\n */\nconst design = {\n  /**\n   * Can be set to false to make the parser more lenient.\n   */\n  strict: true,\n\n  /**\n   * The default set for new properties and components if none is specified.\n   * @type {designSet}\n   */\n  defaultSet: icalSet,\n\n  /**\n   * The default type for unknown properties\n   * @type {String}\n   */\n  defaultType: 'unknown',\n\n  /**\n   * Holds the design set for known top-level components\n   *\n   * @type {Object}\n   * @property {designSet} vcard       vCard VCARD\n   * @property {designSet} vevent      iCalendar VEVENT\n   * @property {designSet} vtodo       iCalendar VTODO\n   * @property {designSet} vjournal    iCalendar VJOURNAL\n   * @property {designSet} valarm      iCalendar VALARM\n   * @property {designSet} vtimezone   iCalendar VTIMEZONE\n   * @property {designSet} daylight    iCalendar DAYLIGHT\n   * @property {designSet} standard    iCalendar STANDARD\n   *\n   * @example\n   * let propertyName = 'fn';\n   * let componentDesign = ICAL.design.components.vcard;\n   * let propertyDetails = componentDesign.property[propertyName];\n   * if (propertyDetails.defaultType == 'text') {\n   *   // Yep, sure is...\n   * }\n   */\n  components: {\n    vcard: vcardSet,\n    vcard3: vcard3Set,\n    vevent: icalSet,\n    vtodo: icalSet,\n    vjournal: icalSet,\n    valarm: icalSet,\n    vtimezone: icalSet,\n    daylight: icalSet,\n    standard: icalSet\n  },\n\n\n  /**\n   * The design set for iCalendar (rfc5545/rfc7265) components.\n   * @type {designSet}\n   */\n  icalendar: icalSet,\n\n  /**\n   * The design set for vCard (rfc6350/rfc7095) components.\n   * @type {designSet}\n   */\n  vcard: vcardSet,\n\n  /**\n   * The design set for vCard (rfc2425/rfc2426/rfc7095) components.\n   * @type {designSet}\n   */\n  vcard3: vcard3Set,\n\n  /**\n   * Gets the design set for the given component name.\n   *\n   * @param {String} componentName        The name of the component\n   * @return {designSet}      The design set for the component\n   */\n  getDesignSet: function(componentName) {\n    let isInDesign = componentName && componentName in design.components;\n    return isInDesign ? design.components[componentName] : design.defaultSet;\n  }\n};\n\n/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/.\n * Portions Copyright (C) Philipp Kewisch */\n\n\n/**\n * This lets typescript resolve our custom types in the\n * generated d.ts files (jsdoc typedefs are converted to typescript types).\n * Ignore prevents the typedefs from being documented more than once.\n *\n * @ignore\n * @typedef {import(\"./types.js\").designSet} designSet\n * Imports the 'designSet' type from the \"types.js\" module\n */\n\nconst LINE_ENDING = '\\r\\n';\nconst DEFAULT_VALUE_TYPE = 'unknown';\nconst RFC6868_REPLACE_MAP = { '\"': \"^'\", \"\\n\": \"^n\", \"^\": \"^^\" };\n\n/**\n * Convert a full jCal/jCard array into a iCalendar/vCard string.\n *\n * @function ICAL.stringify\n * @variation function\n * @param {Array} jCal    The jCal/jCard document\n * @return {String}       The stringified iCalendar/vCard document\n */\nfunction stringify(jCal) {\n  if (typeof jCal[0] == \"string\") {\n    // This is a single component\n    jCal = [jCal];\n  }\n\n  let i = 0;\n  let len = jCal.length;\n  let result = '';\n\n  for (; i < len; i++) {\n    result += stringify.component(jCal[i]) + LINE_ENDING;\n  }\n\n  return result;\n}\n\n/**\n * Converts an jCal component array into a ICAL string.\n * Recursive will resolve sub-components.\n *\n * Exact component/property order is not saved all\n * properties will come before subcomponents.\n *\n * @function ICAL.stringify.component\n * @param {Array} component\n *        jCal/jCard fragment of a component\n * @param {designSet} designSet\n *        The design data to use for this component\n * @return {String}       The iCalendar/vCard string\n */\nstringify.component = function(component, designSet) {\n  let name = component[0].toUpperCase();\n  let result = 'BEGIN:' + name + LINE_ENDING;\n\n  let props = component[1];\n  let propIdx = 0;\n  let propLen = props.length;\n\n  let designSetName = component[0];\n  // rfc6350 requires that in vCard 4.0 the first component is the VERSION\n  // component with as value 4.0, note that 3.0 does not have this requirement.\n  if (designSetName === 'vcard' && component[1].length > 0 &&\n          !(component[1][0][0] === \"version\" && component[1][0][3] === \"4.0\")) {\n    designSetName = \"vcard3\";\n  }\n  designSet = designSet || design.getDesignSet(designSetName);\n\n  for (; propIdx < propLen; propIdx++) {\n    result += stringify.property(props[propIdx], designSet) + LINE_ENDING;\n  }\n\n  // Ignore subcomponents if none exist, e.g. in vCard.\n  let comps = component[2] || [];\n  let compIdx = 0;\n  let compLen = comps.length;\n\n  for (; compIdx < compLen; compIdx++) {\n    result += stringify.component(comps[compIdx], designSet) + LINE_ENDING;\n  }\n\n  result += 'END:' + name;\n  return result;\n};\n\n/**\n * Converts a single jCal/jCard property to a iCalendar/vCard string.\n *\n * @function ICAL.stringify.property\n * @param {Array} property\n *        jCal/jCard property array\n * @param {designSet} designSet\n *        The design data to use for this property\n * @param {Boolean} noFold\n *        If true, the line is not folded\n * @return {String}       The iCalendar/vCard string\n */\nstringify.property = function(property, designSet, noFold) {\n  let name = property[0].toUpperCase();\n  let jsName = property[0];\n  let params = property[1];\n\n  if (!designSet) {\n    designSet = design.defaultSet;\n  }\n\n  let groupName = params.group;\n  let line;\n  if (designSet.propertyGroups && groupName) {\n    line = groupName.toUpperCase() + \".\" + name;\n  } else {\n    line = name;\n  }\n\n  for (let [paramName, value] of Object.entries(params)) {\n    if (designSet.propertyGroups && paramName == 'group') {\n      continue;\n    }\n\n    let paramDesign = designSet.param[paramName];\n    let multiValue = paramDesign && paramDesign.multiValue;\n    if (multiValue && Array.isArray(value)) {\n      value = value.map(function(val) {\n        val = stringify._rfc6868Unescape(val);\n        val = stringify.paramPropertyValue(val, paramDesign.multiValueSeparateDQuote);\n        return val;\n      });\n      value = stringify.multiValue(value, multiValue, \"unknown\", null, designSet);\n    } else {\n      value = stringify._rfc6868Unescape(value);\n      value = stringify.paramPropertyValue(value);\n    }\n\n    line += ';' + paramName.toUpperCase() + '=' + value;\n  }\n\n  if (property.length === 3) {\n    // If there are no values, we must assume a blank value\n    return line + ':';\n  }\n\n  let valueType = property[2];\n\n  let propDetails;\n  let multiValue = false;\n  let structuredValue = false;\n  let isDefault = false;\n\n  if (jsName in designSet.property) {\n    propDetails = designSet.property[jsName];\n\n    if ('multiValue' in propDetails) {\n      multiValue = propDetails.multiValue;\n    }\n\n    if (('structuredValue' in propDetails) && Array.isArray(property[3])) {\n      structuredValue = propDetails.structuredValue;\n    }\n\n    if ('defaultType' in propDetails) {\n      if (valueType === propDetails.defaultType) {\n        isDefault = true;\n      }\n    } else {\n      if (valueType === DEFAULT_VALUE_TYPE) {\n        isDefault = true;\n      }\n    }\n  } else {\n    if (valueType === DEFAULT_VALUE_TYPE) {\n      isDefault = true;\n    }\n  }\n\n  // push the VALUE property if type is not the default\n  // for the current property.\n  if (!isDefault) {\n    // value will never contain ;/:/, so we don't escape it here.\n    line += ';VALUE=' + valueType.toUpperCase();\n  }\n\n  line += ':';\n\n  if (multiValue && structuredValue) {\n    line += stringify.multiValue(\n      property[3], structuredValue, valueType, multiValue, designSet, structuredValue\n    );\n  } else if (multiValue) {\n    line += stringify.multiValue(\n      property.slice(3), multiValue, valueType, null, designSet, false\n    );\n  } else if (structuredValue) {\n    line += stringify.multiValue(\n      property[3], structuredValue, valueType, null, designSet, structuredValue\n    );\n  } else {\n    line += stringify.value(property[3], valueType, designSet, false);\n  }\n\n  return noFold ? line : foldline(line);\n};\n\n/**\n * Handles escaping of property values that may contain:\n *\n *    COLON (:), SEMICOLON (;), or COMMA (,)\n *\n * If any of the above are present the result is wrapped\n * in double quotes.\n *\n * @function ICAL.stringify.paramPropertyValue\n * @param {String} value      Raw property value\n * @param {boolean} force     If value should be escaped even when unnecessary\n * @return {String}           Given or escaped value when needed\n */\nstringify.paramPropertyValue = function(value, force) {\n  if (!force &&\n      (value.indexOf(',') === -1) &&\n      (value.indexOf(':') === -1) &&\n      (value.indexOf(';') === -1)) {\n\n    return value;\n  }\n\n  return '\"' + value + '\"';\n};\n\n/**\n * Converts an array of ical values into a single\n * string based on a type and a delimiter value (like \",\").\n *\n * @function ICAL.stringify.multiValue\n * @param {Array} values      List of values to convert\n * @param {String} delim      Used to join the values (\",\", \";\", \":\")\n * @param {String} type       Lowecase ical value type\n *        (like boolean, date-time, etc..)\n * @param {?String} innerMulti If set, each value will again be processed\n *        Used for structured values\n * @param {designSet} designSet\n *        The design data to use for this property\n *\n * @return {String}           iCalendar/vCard string for value\n */\nstringify.multiValue = function(values, delim, type, innerMulti, designSet, structuredValue) {\n  let result = '';\n  let len = values.length;\n  let i = 0;\n\n  for (; i < len; i++) {\n    if (innerMulti && Array.isArray(values[i])) {\n      result += stringify.multiValue(values[i], innerMulti, type, null, designSet, structuredValue);\n    } else {\n      result += stringify.value(values[i], type, designSet, structuredValue);\n    }\n\n    if (i !== (len - 1)) {\n      result += delim;\n    }\n  }\n\n  return result;\n};\n\n/**\n * Processes a single ical value runs the associated \"toICAL\" method from the\n * design value type if available to convert the value.\n *\n * @function ICAL.stringify.value\n * @param {String|Number} value       A formatted value\n * @param {String} type               Lowercase iCalendar/vCard value type\n *  (like boolean, date-time, etc..)\n * @return {String}                   iCalendar/vCard value for single value\n */\nstringify.value = function(value, type, designSet, structuredValue) {\n  if (type in designSet.value && 'toICAL' in designSet.value[type]) {\n    return designSet.value[type].toICAL(value, structuredValue);\n  }\n  return value;\n};\n\n/**\n * Internal helper for rfc6868. Exposing this on ICAL.stringify so that\n * hackers can disable the rfc6868 parsing if the really need to.\n *\n * @param {String} val        The value to unescape\n * @return {String}           The escaped value\n */\nstringify._rfc6868Unescape = function(val) {\n  return val.replace(/[\\n^\"]/g, function(x) {\n    return RFC6868_REPLACE_MAP[x];\n  });\n};\n\n/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/.\n * Portions Copyright (C) Philipp Kewisch */\n\nconst NAME_INDEX$1 = 0;\nconst PROP_INDEX = 1;\nconst TYPE_INDEX = 2;\nconst VALUE_INDEX = 3;\n\n/**\n * This lets typescript resolve our custom types in the\n * generated d.ts files (jsdoc typedefs are converted to typescript types).\n * Ignore prevents the typedefs from being documented more than once.\n * @ignore\n * @typedef {import(\"./types.js\").designSet} designSet\n * Imports the 'designSet' type from the \"types.js\" module\n * @typedef {import(\"./types.js\").Geo} Geo\n * Imports the 'Geo' type from the \"types.js\" module\n */\n\n/**\n * Provides a layer on top of the raw jCal object for manipulating a single property, with its\n * parameters and value.\n *\n * @memberof ICAL\n */\nclass Property {\n  /**\n   * Create an {@link ICAL.Property} by parsing the passed iCalendar string.\n   *\n   * @param {String} str            The iCalendar string to parse\n   * @param {designSet=} designSet  The design data to use for this property\n   * @return {Property}             The created iCalendar property\n   */\n  static fromString(str, designSet) {\n    return new Property(parse.property(str, designSet));\n  }\n\n  /**\n   * Creates a new ICAL.Property instance.\n   *\n   * It is important to note that mutations done in the wrapper directly mutate the jCal object used\n   * to initialize.\n   *\n   * Can also be used to create new properties by passing the name of the property (as a String).\n   *\n   * @param {Array|String} jCal         Raw jCal representation OR the new name of the property\n   * @param {Component=} parent         Parent component\n   */\n  constructor(jCal, parent) {\n    this._parent = parent || null;\n\n    if (typeof(jCal) === 'string') {\n      // We are creating the property by name and need to detect the type\n      this.jCal = [jCal, {}, design.defaultType];\n      this.jCal[TYPE_INDEX] = this.getDefaultType();\n    } else {\n      this.jCal = jCal;\n    }\n    this._updateType();\n  }\n\n  /**\n   * The value type for this property\n   * @type {String}\n   */\n  get type() {\n    return this.jCal[TYPE_INDEX];\n  }\n\n  /**\n   * The name of this property, in lowercase.\n   * @type {String}\n   */\n  get name() {\n    return this.jCal[NAME_INDEX$1];\n  }\n\n  /**\n   * The parent component for this property.\n   * @type {Component}\n   */\n  get parent() {\n    return this._parent;\n  }\n\n  set parent(p) {\n    // Before setting the parent, check if the design set has changed. If it\n    // has, we later need to update the type if it was unknown before.\n    let designSetChanged = !this._parent || (p && p._designSet != this._parent._designSet);\n\n    this._parent = p;\n\n    if (this.type == design.defaultType && designSetChanged) {\n      this.jCal[TYPE_INDEX] = this.getDefaultType();\n      this._updateType();\n    }\n  }\n\n  /**\n   * The design set for this property, e.g. icalendar vs vcard\n   *\n   * @type {designSet}\n   * @private\n   */\n  get _designSet() {\n    return this.parent ? this.parent._designSet : design.defaultSet;\n  }\n\n  /**\n   * Updates the type metadata from the current jCal type and design set.\n   *\n   * @private\n   */\n  _updateType() {\n    let designSet = this._designSet;\n\n    if (this.type in designSet.value) {\n      if ('decorate' in designSet.value[this.type]) {\n        this.isDecorated = true;\n      } else {\n        this.isDecorated = false;\n      }\n\n      if (this.name in designSet.property) {\n        this.isMultiValue = ('multiValue' in designSet.property[this.name]);\n        this.isStructuredValue = ('structuredValue' in designSet.property[this.name]);\n      }\n    }\n  }\n\n  /**\n   * Hydrate a single value. The act of hydrating means turning the raw jCal\n   * value into a potentially wrapped object, for example {@link ICAL.Time}.\n   *\n   * @private\n   * @param {Number} index        The index of the value to hydrate\n   * @return {?Object}             The decorated value.\n   */\n  _hydrateValue(index) {\n    if (this._values && this._values[index]) {\n      return this._values[index];\n    }\n\n    // for the case where there is no value.\n    if (this.jCal.length <= (VALUE_INDEX + index)) {\n      return null;\n    }\n\n    if (this.isDecorated) {\n      if (!this._values) {\n        this._values = [];\n      }\n      return (this._values[index] = this._decorate(\n        this.jCal[VALUE_INDEX + index]\n      ));\n    } else {\n      return this.jCal[VALUE_INDEX + index];\n    }\n  }\n\n  /**\n   * Decorate a single value, returning its wrapped object. This is used by\n   * the hydrate function to actually wrap the value.\n   *\n   * @private\n   * @param {?} value         The value to decorate\n   * @return {Object}         The decorated value\n   */\n  _decorate(value) {\n    return this._designSet.value[this.type].decorate(value, this);\n  }\n\n  /**\n   * Undecorate a single value, returning its raw jCal data.\n   *\n   * @private\n   * @param {Object} value         The value to undecorate\n   * @return {?}                   The undecorated value\n   */\n  _undecorate(value) {\n    return this._designSet.value[this.type].undecorate(value, this);\n  }\n\n  /**\n   * Sets the value at the given index while also hydrating it. The passed\n   * value can either be a decorated or undecorated value.\n   *\n   * @private\n   * @param {?} value             The value to set\n   * @param {Number} index        The index to set it at\n   */\n  _setDecoratedValue(value, index) {\n    if (!this._values) {\n      this._values = [];\n    }\n\n    if (typeof(value) === 'object' && 'icaltype' in value) {\n      // decorated value\n      this.jCal[VALUE_INDEX + index] = this._undecorate(value);\n      this._values[index] = value;\n    } else {\n      // undecorated value\n      this.jCal[VALUE_INDEX + index] = value;\n      this._values[index] = this._decorate(value);\n    }\n  }\n\n  /**\n   * Gets a parameter on the property.\n   *\n   * @param {String}        name   Parameter name (lowercase)\n   * @return {Array|String}        Parameter value\n   */\n  getParameter(name) {\n    if (name in this.jCal[PROP_INDEX]) {\n      return this.jCal[PROP_INDEX][name];\n    } else {\n      return undefined;\n    }\n  }\n\n  /**\n   * Gets first parameter on the property.\n   *\n   * @param {String}        name   Parameter name (lowercase)\n   * @return {String}        Parameter value\n   */\n  getFirstParameter(name) {\n    let parameters = this.getParameter(name);\n\n    if (Array.isArray(parameters)) {\n      return parameters[0];\n    }\n\n    return parameters;\n  }\n\n  /**\n   * Sets a parameter on the property.\n   *\n   * @param {String}       name     The parameter name\n   * @param {Array|String} value    The parameter value\n   */\n  setParameter(name, value) {\n    let lcname = name.toLowerCase();\n    if (typeof value === \"string\" &&\n        lcname in this._designSet.param &&\n        'multiValue' in this._designSet.param[lcname]) {\n        value = [value];\n    }\n    this.jCal[PROP_INDEX][name] = value;\n  }\n\n  /**\n   * Removes a parameter\n   *\n   * @param {String} name     The parameter name\n   */\n  removeParameter(name) {\n    delete this.jCal[PROP_INDEX][name];\n  }\n\n  /**\n   * Get the default type based on this property's name.\n   *\n   * @return {String}     The default type for this property\n   */\n  getDefaultType() {\n    let name = this.jCal[NAME_INDEX$1];\n    let designSet = this._designSet;\n\n    if (name in designSet.property) {\n      let details = designSet.property[name];\n      if ('defaultType' in details) {\n        return details.defaultType;\n      }\n    }\n    return design.defaultType;\n  }\n\n  /**\n   * Sets type of property and clears out any existing values of the current\n   * type.\n   *\n   * @param {String} type     New iCAL type (see design.*.values)\n   */\n  resetType(type) {\n    this.removeAllValues();\n    this.jCal[TYPE_INDEX] = type;\n    this._updateType();\n  }\n\n  /**\n   * Finds the first property value.\n   *\n   * @return {Binary | Duration | Period |\n   * Recur | Time | UtcOffset | Geo | string | null}         First property value\n   */\n  getFirstValue() {\n    return this._hydrateValue(0);\n  }\n\n  /**\n   * Gets all values on the property.\n   *\n   * NOTE: this creates an array during each call.\n   *\n   * @return {Array}          List of values\n   */\n  getValues() {\n    let len = this.jCal.length - VALUE_INDEX;\n\n    if (len < 1) {\n      // it is possible for a property to have no value.\n      return [];\n    }\n\n    let i = 0;\n    let result = [];\n\n    for (; i < len; i++) {\n      result[i] = this._hydrateValue(i);\n    }\n\n    return result;\n  }\n\n  /**\n   * Removes all values from this property\n   */\n  removeAllValues() {\n    if (this._values) {\n      this._values.length = 0;\n    }\n    this.jCal.length = 3;\n  }\n\n  /**\n   * Sets the values of the property.  Will overwrite the existing values.\n   * This can only be used for multi-value properties.\n   *\n   * @param {Array} values    An array of values\n   */\n  setValues(values) {\n    if (!this.isMultiValue) {\n      throw new Error(\n        this.name + ': does not not support mulitValue.\\n' +\n        'override isMultiValue'\n      );\n    }\n\n    let len = values.length;\n    let i = 0;\n    this.removeAllValues();\n\n    if (len > 0 &&\n        typeof(values[0]) === 'object' &&\n        'icaltype' in values[0]) {\n      this.resetType(values[0].icaltype);\n    }\n\n    if (this.isDecorated) {\n      for (; i < len; i++) {\n        this._setDecoratedValue(values[i], i);\n      }\n    } else {\n      for (; i < len; i++) {\n        this.jCal[VALUE_INDEX + i] = values[i];\n      }\n    }\n  }\n\n  /**\n   * Sets the current value of the property. If this is a multi-value\n   * property, all other values will be removed.\n   *\n   * @param {String|Object} value     New property value.\n   */\n  setValue(value) {\n    this.removeAllValues();\n    if (typeof(value) === 'object' && 'icaltype' in value) {\n      this.resetType(value.icaltype);\n    }\n\n    if (this.isDecorated) {\n      this._setDecoratedValue(value, 0);\n    } else {\n      this.jCal[VALUE_INDEX] = value;\n    }\n  }\n\n  /**\n   * Returns the Object representation of this component. The returned object\n   * is a live jCal object and should be cloned if modified.\n   * @return {Object}\n   */\n  toJSON() {\n    return this.jCal;\n  }\n\n  /**\n   * The string representation of this component.\n   * @return {String}\n   */\n  toICALString() {\n    return stringify.property(\n      this.jCal, this._designSet, true\n    );\n  }\n}\n\n/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/.\n * Portions Copyright (C) Philipp Kewisch */\n\n\n/**\n * This lets typescript resolve our custom types in the\n * generated d.ts files (jsdoc typedefs are converted to typescript types).\n * Ignore prevents the typedefs from being documented more than once.\n * @ignore\n * @typedef {import(\"./types.js\").designSet} designSet\n * Imports the 'designSet' type from the \"types.js\" module\n * @typedef {import(\"./types.js\").Geo} Geo\n * Imports the 'Geo' type from the \"types.js\" module\n */\n\nconst NAME_INDEX = 0;\nconst PROPERTY_INDEX = 1;\nconst COMPONENT_INDEX = 2;\n\nconst PROPERTY_NAME_INDEX = 0;\nconst PROPERTY_VALUE_INDEX = 3;\n\n/**\n * Wraps a jCal component, adding convenience methods to add, remove and update subcomponents and\n * properties.\n *\n * @memberof ICAL\n */\nclass Component {\n  /**\n   * Create an {@link ICAL.Component} by parsing the passed iCalendar string.\n   *\n   * @param {String} str        The iCalendar string to parse\n   */\n  static fromString(str) {\n    return new Component(parse.component(str));\n  }\n\n  /**\n   * Creates a new Component instance.\n   *\n   * @param {Array|String} jCal         Raw jCal component data OR name of new\n   *                                      component\n   * @param {Component=} parent     Parent component to associate\n   */\n  constructor(jCal, parent) {\n    if (typeof(jCal) === 'string') {\n      // jCal spec (name, properties, components)\n      jCal = [jCal, [], []];\n    }\n\n    // mostly for legacy reasons.\n    this.jCal = jCal;\n\n    this.parent = parent || null;\n\n    if (!this.parent && this.name === 'vcalendar') {\n      this._timezoneCache = new Map();\n    }\n  }\n\n  /**\n   * Hydrated properties are inserted into the _properties array at the same\n   * position as in the jCal array, so it is possible that the array contains\n   * undefined values for unhydrdated properties. To avoid iterating the\n   * array when checking if all properties have been hydrated, we save the\n   * count here.\n   *\n   * @type {Number}\n   * @private\n   */\n  _hydratedPropertyCount = 0;\n\n  /**\n   * The same count as for _hydratedPropertyCount, but for subcomponents\n   *\n   * @type {Number}\n   * @private\n   */\n  _hydratedComponentCount = 0;\n\n  /**\n   * A cache of hydrated time zone objects which may be used by consumers, keyed\n   * by time zone ID.\n   *\n   * @type {Map}\n   * @private\n   */\n  _timezoneCache = null;\n\n  /**\n   * @private\n   */\n  _components = null;\n\n  /**\n   * @private\n   */\n  _properties = null;\n\n  /**\n   * The name of this component\n   *\n   * @type {String}\n   */\n  get name() {\n    return this.jCal[NAME_INDEX];\n  }\n\n  /**\n   * The design set for this component, e.g. icalendar vs vcard\n   *\n   * @type {designSet}\n   * @private\n   */\n  get _designSet() {\n    let parentDesign = this.parent && this.parent._designSet;\n    if (!parentDesign && this.name == \"vcard\") {\n      // We can't decide on vcard3 vs vcard4 just based on the component name, the version number is\n      // in the version property. We also can't use hydrated properties here because it would lead\n      // to recursion, but the spec says that the version property needs to be the very first one.\n      let versionProp = this.jCal[PROPERTY_INDEX]?.[0];\n\n      if (versionProp && versionProp[PROPERTY_NAME_INDEX] == \"version\" && versionProp[PROPERTY_VALUE_INDEX] == \"3.0\") {\n        return design.getDesignSet(\"vcard3\");\n      }\n    }\n\n    return parentDesign || design.getDesignSet(this.name);\n  }\n\n  /**\n   * @private\n   */\n  _hydrateComponent(index) {\n    if (!this._components) {\n      this._components = [];\n      this._hydratedComponentCount = 0;\n    }\n\n    if (this._components[index]) {\n      return this._components[index];\n    }\n\n    let comp = new Component(\n      this.jCal[COMPONENT_INDEX][index],\n      this\n    );\n\n    this._hydratedComponentCount++;\n    return (this._components[index] = comp);\n  }\n\n  /**\n   * @private\n   */\n  _hydrateProperty(index) {\n    if (!this._properties) {\n      this._properties = [];\n      this._hydratedPropertyCount = 0;\n    }\n\n    if (this._properties[index]) {\n      return this._properties[index];\n    }\n\n    let prop = new Property(\n      this.jCal[PROPERTY_INDEX][index],\n      this\n    );\n\n    this._hydratedPropertyCount++;\n    return (this._properties[index] = prop);\n  }\n\n  /**\n   * Finds first sub component, optionally filtered by name.\n   *\n   * @param {String=} name        Optional name to filter by\n   * @return {?Component}     The found subcomponent\n   */\n  getFirstSubcomponent(name) {\n    if (name) {\n      let i = 0;\n      let comps = this.jCal[COMPONENT_INDEX];\n      let len = comps.length;\n\n      for (; i < len; i++) {\n        if (comps[i][NAME_INDEX] === name) {\n          let result = this._hydrateComponent(i);\n          return result;\n        }\n      }\n    } else {\n      if (this.jCal[COMPONENT_INDEX].length) {\n        return this._hydrateComponent(0);\n      }\n    }\n\n    // ensure we return a value (strict mode)\n    return null;\n  }\n\n  /**\n   * Finds all sub components, optionally filtering by name.\n   *\n   * @param {String=} name            Optional name to filter by\n   * @return {Component[]}       The found sub components\n   */\n  getAllSubcomponents(name) {\n    let jCalLen = this.jCal[COMPONENT_INDEX].length;\n    let i = 0;\n\n    if (name) {\n      let comps = this.jCal[COMPONENT_INDEX];\n      let result = [];\n\n      for (; i < jCalLen; i++) {\n        if (name === comps[i][NAME_INDEX]) {\n          result.push(\n            this._hydrateComponent(i)\n          );\n        }\n      }\n      return result;\n    } else {\n      if (!this._components ||\n          (this._hydratedComponentCount !== jCalLen)) {\n        for (; i < jCalLen; i++) {\n          this._hydrateComponent(i);\n        }\n      }\n\n      return this._components || [];\n    }\n  }\n\n  /**\n   * Returns true when a named property exists.\n   *\n   * @param {String} name     The property name\n   * @return {Boolean}        True, when property is found\n   */\n  hasProperty(name) {\n    let props = this.jCal[PROPERTY_INDEX];\n    let len = props.length;\n\n    let i = 0;\n    for (; i < len; i++) {\n      // 0 is property name\n      if (props[i][NAME_INDEX] === name) {\n        return true;\n      }\n    }\n\n    return false;\n  }\n\n  /**\n   * Finds the first property, optionally with the given name.\n   *\n   * @param {String=} name        Lowercase property name\n   * @return {?Property}     The found property\n   */\n  getFirstProperty(name) {\n    if (name) {\n      let i = 0;\n      let props = this.jCal[PROPERTY_INDEX];\n      let len = props.length;\n\n      for (; i < len; i++) {\n        if (props[i][NAME_INDEX] === name) {\n          let result = this._hydrateProperty(i);\n          return result;\n        }\n      }\n    } else {\n      if (this.jCal[PROPERTY_INDEX].length) {\n        return this._hydrateProperty(0);\n      }\n    }\n\n    return null;\n  }\n\n  /**\n   * Returns first property's value, if available.\n   *\n   * @param {String=} name                    Lowercase property name\n   * @return {Binary | Duration | Period |\n   * Recur | Time | UtcOffset | Geo | string | null}         The found property value.\n   */\n  getFirstPropertyValue(name) {\n    let prop = this.getFirstProperty(name);\n    if (prop) {\n      return prop.getFirstValue();\n    }\n\n    return null;\n  }\n\n  /**\n   * Get all properties in the component, optionally filtered by name.\n   *\n   * @param {String=} name        Lowercase property name\n   * @return {Property[]}    List of properties\n   */\n  getAllProperties(name) {\n    let jCalLen = this.jCal[PROPERTY_INDEX].length;\n    let i = 0;\n\n    if (name) {\n      let props = this.jCal[PROPERTY_INDEX];\n      let result = [];\n\n      for (; i < jCalLen; i++) {\n        if (name === props[i][NAME_INDEX]) {\n          result.push(\n            this._hydrateProperty(i)\n          );\n        }\n      }\n      return result;\n    } else {\n      if (!this._properties ||\n          (this._hydratedPropertyCount !== jCalLen)) {\n        for (; i < jCalLen; i++) {\n          this._hydrateProperty(i);\n        }\n      }\n\n      return this._properties || [];\n    }\n  }\n\n  /**\n   * @private\n   */\n  _removeObjectByIndex(jCalIndex, cache, index) {\n    cache = cache || [];\n    // remove cached version\n    if (cache[index]) {\n      let obj = cache[index];\n      if (\"parent\" in obj) {\n          obj.parent = null;\n      }\n    }\n\n    cache.splice(index, 1);\n\n    // remove it from the jCal\n    this.jCal[jCalIndex].splice(index, 1);\n  }\n\n  /**\n   * @private\n   */\n  _removeObject(jCalIndex, cache, nameOrObject) {\n    let i = 0;\n    let objects = this.jCal[jCalIndex];\n    let len = objects.length;\n    let cached = this[cache];\n\n    if (typeof(nameOrObject) === 'string') {\n      for (; i < len; i++) {\n        if (objects[i][NAME_INDEX] === nameOrObject) {\n          this._removeObjectByIndex(jCalIndex, cached, i);\n          return true;\n        }\n      }\n    } else if (cached) {\n      for (; i < len; i++) {\n        if (cached[i] && cached[i] === nameOrObject) {\n          this._removeObjectByIndex(jCalIndex, cached, i);\n          return true;\n        }\n      }\n    }\n\n    return false;\n  }\n\n  /**\n   * @private\n   */\n  _removeAllObjects(jCalIndex, cache, name) {\n    let cached = this[cache];\n\n    // Unfortunately we have to run through all children to reset their\n    // parent property.\n    let objects = this.jCal[jCalIndex];\n    let i = objects.length - 1;\n\n    // descending search required because splice\n    // is used and will effect the indices.\n    for (; i >= 0; i--) {\n      if (!name || objects[i][NAME_INDEX] === name) {\n        this._removeObjectByIndex(jCalIndex, cached, i);\n      }\n    }\n  }\n\n  /**\n   * Adds a single sub component.\n   *\n   * @param {Component} component        The component to add\n   * @return {Component}                 The passed in component\n   */\n  addSubcomponent(component) {\n    if (!this._components) {\n      this._components = [];\n      this._hydratedComponentCount = 0;\n    }\n\n    if (component.parent) {\n      component.parent.removeSubcomponent(component);\n    }\n\n    let idx = this.jCal[COMPONENT_INDEX].push(component.jCal);\n    this._components[idx - 1] = component;\n    this._hydratedComponentCount++;\n    component.parent = this;\n    return component;\n  }\n\n  /**\n   * Removes a single component by name or the instance of a specific\n   * component.\n   *\n   * @param {Component|String} nameOrComp    Name of component, or component\n   * @return {Boolean}                            True when comp is removed\n   */\n  removeSubcomponent(nameOrComp) {\n    let removed = this._removeObject(COMPONENT_INDEX, '_components', nameOrComp);\n    if (removed) {\n      this._hydratedComponentCount--;\n    }\n    return removed;\n  }\n\n  /**\n   * Removes all components or (if given) all components by a particular\n   * name.\n   *\n   * @param {String=} name            Lowercase component name\n   */\n  removeAllSubcomponents(name) {\n    let removed = this._removeAllObjects(COMPONENT_INDEX, '_components', name);\n    this._hydratedComponentCount = 0;\n    return removed;\n  }\n\n  /**\n   * Adds an {@link ICAL.Property} to the component.\n   *\n   * @param {Property} property      The property to add\n   * @return {Property}              The passed in property\n   */\n  addProperty(property) {\n    if (!(property instanceof Property)) {\n      throw new TypeError('must be instance of ICAL.Property');\n    }\n\n    if (!this._properties) {\n      this._properties = [];\n      this._hydratedPropertyCount = 0;\n    }\n\n    if (property.parent) {\n      property.parent.removeProperty(property);\n    }\n\n    let idx = this.jCal[PROPERTY_INDEX].push(property.jCal);\n    this._properties[idx - 1] = property;\n    this._hydratedPropertyCount++;\n    property.parent = this;\n    return property;\n  }\n\n  /**\n   * Helper method to add a property with a value to the component.\n   *\n   * @param {String}               name         Property name to add\n   * @param {String|Number|Object} value        Property value\n   * @return {Property}                    The created property\n   */\n  addPropertyWithValue(name, value) {\n    let prop = new Property(name);\n    prop.setValue(value);\n\n    this.addProperty(prop);\n\n    return prop;\n  }\n\n  /**\n   * Helper method that will update or create a property of the given name\n   * and sets its value. If multiple properties with the given name exist,\n   * only the first is updated.\n   *\n   * @param {String}               name         Property name to update\n   * @param {String|Number|Object} value        Property value\n   * @return {Property}                    The created property\n   */\n  updatePropertyWithValue(name, value) {\n    let prop = this.getFirstProperty(name);\n\n    if (prop) {\n      prop.setValue(value);\n    } else {\n      prop = this.addPropertyWithValue(name, value);\n    }\n\n    return prop;\n  }\n\n  /**\n   * Removes a single property by name or the instance of the specific\n   * property.\n   *\n   * @param {String|Property} nameOrProp     Property name or instance to remove\n   * @return {Boolean}                            True, when deleted\n   */\n  removeProperty(nameOrProp) {\n    let removed = this._removeObject(PROPERTY_INDEX, '_properties', nameOrProp);\n    if (removed) {\n      this._hydratedPropertyCount--;\n    }\n    return removed;\n  }\n\n  /**\n   * Removes all properties associated with this component, optionally\n   * filtered by name.\n   *\n   * @param {String=} name        Lowercase property name\n   * @return {Boolean}            True, when deleted\n   */\n  removeAllProperties(name) {\n    let removed = this._removeAllObjects(PROPERTY_INDEX, '_properties', name);\n    this._hydratedPropertyCount = 0;\n    return removed;\n  }\n\n  /**\n   * Returns the Object representation of this component. The returned object\n   * is a live jCal object and should be cloned if modified.\n   * @return {Object}\n   */\n  toJSON() {\n    return this.jCal;\n  }\n\n  /**\n   * The string representation of this component.\n   * @return {String}\n   */\n  toString() {\n    return stringify.component(\n      this.jCal, this._designSet\n    );\n  }\n\n  /**\n   * Retrieve a time zone definition from the component tree, if any is present.\n   * If the tree contains no time zone definitions or the TZID cannot be\n   * matched, returns null.\n   *\n   * @param {String} tzid     The ID of the time zone to retrieve\n   * @return {Timezone}  The time zone corresponding to the ID, or null\n   */\n  getTimeZoneByID(tzid) {\n    // VTIMEZONE components can only appear as a child of the VCALENDAR\n    // component; walk the tree if we're not the root.\n    if (this.parent) {\n      return this.parent.getTimeZoneByID(tzid);\n    }\n\n    // If there is no time zone cache, we are probably parsing an incomplete\n    // file and will have no time zone definitions.\n    if (!this._timezoneCache) {\n      return null;\n    }\n\n    if (this._timezoneCache.has(tzid)) {\n      return this._timezoneCache.get(tzid);\n    }\n\n    // If the time zone is not already cached, hydrate it from the\n    // subcomponents.\n    const zones = this.getAllSubcomponents('vtimezone');\n    for (const zone of zones) {\n      if (zone.getFirstProperty('tzid').getFirstValue() === tzid) {\n        const hydratedZone = new Timezone({\n          component: zone,\n          tzid: tzid,\n        });\n\n        this._timezoneCache.set(tzid, hydratedZone);\n\n        return hydratedZone;\n      }\n    }\n\n    // Per the standard, we should always have a time zone defined in a file\n    // for any referenced TZID, but don't blow up if the file is invalid.\n    return null;\n  }\n}\n\n/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/.\n * Portions Copyright (C) Philipp Kewisch */\n\n\n/**\n * Primary class for expanding recurring rules.  Can take multiple rrules, rdates, exdate(s) and\n * iterate (in order) over each next occurrence.\n *\n * Once initialized this class can also be serialized saved and continue iteration from the last\n * point.\n *\n * NOTE: it is intended that this class is to be used with {@link ICAL.Event} which handles recurrence\n * exceptions.\n *\n * @example\n * // assuming event is a parsed ical component\n * var event;\n *\n * var expand = new ICAL.RecurExpansion({\n *   component: event,\n *   dtstart: event.getFirstPropertyValue('dtstart')\n * });\n *\n * // remember there are infinite rules so it is a good idea to limit the scope of the iterations\n * // then resume later on.\n *\n * // next is always an ICAL.Time or null\n * var next;\n *\n * while (someCondition && (next = expand.next())) {\n *   // do something with next\n * }\n *\n * // save instance for later\n * var json = JSON.stringify(expand);\n *\n * //...\n *\n * // NOTE: if the component's properties have changed you will need to rebuild the class and start\n * // over. This only works when the component's recurrence info is the same.\n * var expand = new ICAL.RecurExpansion(JSON.parse(json));\n *\n * @memberof ICAL\n */\nclass RecurExpansion {\n  /**\n   * Creates a new ICAL.RecurExpansion instance.\n   *\n   * The options object can be filled with the specified initial values. It can also contain\n   * additional members, as a result of serializing a previous expansion state, as shown in the\n   * example.\n   *\n   * @param {Object} options\n   *        Recurrence expansion options\n   * @param {Time} options.dtstart\n   *        Start time of the event\n   * @param {Component=} options.component\n   *        Component for expansion, required if not resuming.\n   */\n  constructor(options) {\n    this.ruleDates = [];\n    this.exDates = [];\n    this.fromData(options);\n  }\n\n  /**\n   * True when iteration is fully completed.\n   * @type {Boolean}\n   */\n  complete = false;\n\n  /**\n   * Array of rrule iterators.\n   *\n   * @type {RecurIterator[]}\n   * @private\n   */\n  ruleIterators = null;\n\n  /**\n   * Array of rdate instances.\n   *\n   * @type {Time[]}\n   * @private\n   */\n  ruleDates = null;\n\n  /**\n   * Array of exdate instances.\n   *\n   * @type {Time[]}\n   * @private\n   */\n  exDates = null;\n\n  /**\n   * Current position in ruleDates array.\n   * @type {Number}\n   * @private\n   */\n  ruleDateInc = 0;\n\n  /**\n   * Current position in exDates array\n   * @type {Number}\n   * @private\n   */\n  exDateInc = 0;\n\n  /**\n   * Current negative date.\n   *\n   * @type {Time}\n   * @private\n   */\n  exDate = null;\n\n  /**\n   * Current additional date.\n   *\n   * @type {Time}\n   * @private\n   */\n  ruleDate = null;\n\n  /**\n   * Start date of recurring rules.\n   *\n   * @type {Time}\n   */\n  dtstart = null;\n\n  /**\n   * Last expanded time\n   *\n   * @type {Time}\n   */\n  last = null;\n\n  /**\n   * Initialize the recurrence expansion from the data object. The options\n   * object may also contain additional members, see the\n   * {@link ICAL.RecurExpansion constructor} for more details.\n   *\n   * @param {Object} options\n   *        Recurrence expansion options\n   * @param {Time} options.dtstart\n   *        Start time of the event\n   * @param {Component=} options.component\n   *        Component for expansion, required if not resuming.\n   */\n  fromData(options) {\n    let start = formatClassType(options.dtstart, Time);\n\n    if (!start) {\n      throw new Error('.dtstart (ICAL.Time) must be given');\n    } else {\n      this.dtstart = start;\n    }\n\n    if (options.component) {\n      this._init(options.component);\n    } else {\n      this.last = formatClassType(options.last, Time) || start.clone();\n\n      if (!options.ruleIterators) {\n        throw new Error('.ruleIterators or .component must be given');\n      }\n\n      this.ruleIterators = options.ruleIterators.map(function(item) {\n        return formatClassType(item, RecurIterator);\n      });\n\n      this.ruleDateInc = options.ruleDateInc;\n      this.exDateInc = options.exDateInc;\n\n      if (options.ruleDates) {\n        this.ruleDates = options.ruleDates.map(item => formatClassType(item, Time));\n        this.ruleDate = this.ruleDates[this.ruleDateInc];\n      }\n\n      if (options.exDates) {\n        this.exDates = options.exDates.map(item => formatClassType(item, Time));\n        this.exDate = this.exDates[this.exDateInc];\n      }\n\n      if (typeof(options.complete) !== 'undefined') {\n        this.complete = options.complete;\n      }\n    }\n  }\n\n  /**\n   * Compare two ICAL.Time objects.  When the second parameter is a DATE and the first parameter is\n   * DATE-TIME, strip the time and compare only the days.\n   *\n   * @private\n   * @param {Time} a   The one object to compare\n   * @param {Time} b   The other object to compare\n   */\n  _compare_special(a, b) {\n    if (!a.isDate && b.isDate)\n      return new Time({ year: a.year, month: a.month, day: a.day }).compare(b);\n    return a.compare(b);\n  }\n\n  /**\n   * Retrieve the next occurrence in the series.\n   * @return {Time}\n   */\n  next() {\n    let iter;\n    let next;\n    let compare;\n\n    let maxTries = 500;\n    let currentTry = 0;\n\n    while (true) {\n      if (currentTry++ > maxTries) {\n        throw new Error(\n          'max tries have occurred, rule may be impossible to fulfill.'\n        );\n      }\n\n      next = this.ruleDate;\n      iter = this._nextRecurrenceIter(this.last);\n\n      // no more matches\n      // because we increment the rule day or rule\n      // _after_ we choose a value this should be\n      // the only spot where we need to worry about the\n      // end of events.\n      if (!next && !iter) {\n        // there are no more iterators or rdates\n        this.complete = true;\n        break;\n      }\n\n      // no next rule day or recurrence rule is first.\n      if (!next || (iter && next.compare(iter.last) > 0)) {\n        // must be cloned, recur will reuse the time element.\n        next = iter.last.clone();\n        // move to next so we can continue\n        iter.next();\n      }\n\n      // if the ruleDate is still next increment it.\n      if (this.ruleDate === next) {\n        this._nextRuleDay();\n      }\n\n      this.last = next;\n\n      // check the negative rules\n      if (this.exDate) {\n        // EXDATE can be in DATE format, but DTSTART is in DATE-TIME format\n        compare = this._compare_special(this.last, this.exDate);\n\n        if (compare > 0) {\n          this._nextExDay();\n        }\n\n        // if the current rule is excluded skip it.\n        if (compare === 0) {\n          this._nextExDay();\n          continue;\n        }\n      }\n\n      //XXX: The spec states that after we resolve the final\n      //     list of dates we execute exdate this seems somewhat counter\n      //     intuitive to what I have seen most servers do so for now\n      //     I exclude based on the original date not the one that may\n      //     have been modified by the exception.\n      return this.last;\n    }\n  }\n\n  /**\n   * Converts object into a serialize-able format. This format can be passed\n   * back into the expansion to resume iteration.\n   * @return {Object}\n   */\n  toJSON() {\n    function toJSON(item) {\n      return item.toJSON();\n    }\n\n    let result = Object.create(null);\n    result.ruleIterators = this.ruleIterators.map(toJSON);\n\n    if (this.ruleDates) {\n      result.ruleDates = this.ruleDates.map(toJSON);\n    }\n\n    if (this.exDates) {\n      result.exDates = this.exDates.map(toJSON);\n    }\n\n    result.ruleDateInc = this.ruleDateInc;\n    result.exDateInc = this.exDateInc;\n    result.last = this.last.toJSON();\n    result.dtstart = this.dtstart.toJSON();\n    result.complete = this.complete;\n\n    return result;\n  }\n\n  /**\n   * Extract all dates from the properties in the given component. The\n   * properties will be filtered by the property name.\n   *\n   * @private\n   * @param {Component} component             The component to search in\n   * @param {String} propertyName             The property name to search for\n   * @return {Time[]}                         The extracted dates.\n   */\n  _extractDates(component, propertyName) {\n    let result = [];\n    let props = component.getAllProperties(propertyName);\n\n    for (let i = 0, len = props.length; i < len; i++) {\n      for (let prop of props[i].getValues()) {\n        let idx = binsearchInsert(\n          result,\n          prop,\n          (a, b) => a.compare(b)\n        );\n\n        // ordered insert\n        result.splice(idx, 0, prop);\n      }\n    }\n\n    return result;\n  }\n\n  /**\n   * Initialize the recurrence expansion.\n   *\n   * @private\n   * @param {Component} component    The component to initialize from.\n   */\n  _init(component) {\n    this.ruleIterators = [];\n\n    this.last = this.dtstart.clone();\n\n    // to provide api consistency non-recurring\n    // events can also use the iterator though it will\n    // only return a single time.\n    if (!component.hasProperty('rdate') &&\n        !component.hasProperty('rrule') &&\n        !component.hasProperty('recurrence-id')) {\n      this.ruleDate = this.last.clone();\n      this.complete = true;\n      return;\n    }\n\n    if (component.hasProperty('rdate')) {\n      this.ruleDates = this._extractDates(component, 'rdate');\n\n      // special hack for cases where first rdate is prior\n      // to the start date. We only check for the first rdate.\n      // This is mostly for google's crazy recurring date logic\n      // (contacts birthdays).\n      if ((this.ruleDates[0]) &&\n          (this.ruleDates[0].compare(this.dtstart) < 0)) {\n\n        this.ruleDateInc = 0;\n        this.last = this.ruleDates[0].clone();\n      } else {\n        this.ruleDateInc = binsearchInsert(\n          this.ruleDates,\n          this.last,\n          (a, b) => a.compare(b)\n        );\n      }\n\n      this.ruleDate = this.ruleDates[this.ruleDateInc];\n    }\n\n    if (component.hasProperty('rrule')) {\n      let rules = component.getAllProperties('rrule');\n      let i = 0;\n      let len = rules.length;\n\n      let rule;\n      let iter;\n\n      for (; i < len; i++) {\n        rule = rules[i].getFirstValue();\n        iter = rule.iterator(this.dtstart);\n        this.ruleIterators.push(iter);\n\n        // increment to the next occurrence so future\n        // calls to next return times beyond the initial iteration.\n        // XXX: I find this suspicious might be a bug?\n        iter.next();\n      }\n    }\n\n    if (component.hasProperty('exdate')) {\n      this.exDates = this._extractDates(component, 'exdate');\n      // if we have a .last day we increment the index to beyond it.\n      // When DTSTART is in DATE-TIME format, EXDATE is in DATE format and EXDATE is\n      // the date of DTSTART, _compare_special finds this out and compareTime fails.\n      this.exDateInc = binsearchInsert(\n        this.exDates,\n        this.last,\n        this._compare_special\n      );\n\n      this.exDate = this.exDates[this.exDateInc];\n    }\n  }\n\n  /**\n   * Advance to the next exdate\n   * @private\n   */\n  _nextExDay() {\n    this.exDate = this.exDates[++this.exDateInc];\n  }\n\n  /**\n   * Advance to the next rule date\n   * @private\n   */\n  _nextRuleDay() {\n    this.ruleDate = this.ruleDates[++this.ruleDateInc];\n  }\n\n  /**\n   * Find and return the recurrence rule with the most recent event and\n   * return it.\n   *\n   * @private\n   * @return {?RecurIterator}    Found iterator.\n   */\n  _nextRecurrenceIter() {\n    let iters = this.ruleIterators;\n\n    if (iters.length === 0) {\n      return null;\n    }\n\n    let len = iters.length;\n    let iter;\n    let iterTime;\n    let iterIdx = 0;\n    let chosenIter;\n\n    // loop through each iterator\n    for (; iterIdx < len; iterIdx++) {\n      iter = iters[iterIdx];\n      iterTime = iter.last;\n\n      // if iteration is complete\n      // then we must exclude it from\n      // the search and remove it.\n      if (iter.completed) {\n        len--;\n        if (iterIdx !== 0) {\n          iterIdx--;\n        }\n        iters.splice(iterIdx, 1);\n        continue;\n      }\n\n      // find the most recent possible choice\n      if (!chosenIter || chosenIter.last.compare(iterTime) > 0) {\n        // that iterator is saved\n        chosenIter = iter;\n      }\n    }\n\n    // the chosen iterator is returned but not mutated\n    // this iterator contains the most recent event.\n    return chosenIter;\n  }\n}\n\n/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/.\n * Portions Copyright (C) Philipp Kewisch */\n\n\n/**\n * This lets typescript resolve our custom types in the\n * generated d.ts files (jsdoc typedefs are converted to typescript types).\n * Ignore prevents the typedefs from being documented more than once.\n * @ignore\n * @typedef {import(\"./types.js\").frequencyValues} frequencyValues\n * Imports the 'frequencyValues' type from the \"types.js\" module\n * @typedef {import(\"./types.js\").occurrenceDetails} occurrenceDetails\n * Imports the 'occurrenceDetails' type from the \"types.js\" module\n */\n\n/**\n * ICAL.js is organized into multiple layers. The bottom layer is a raw jCal\n * object, followed by the component/property layer. The highest level is the\n * event representation, which this class is part of. See the\n * {@tutorial layers} guide for more details.\n *\n * @memberof ICAL\n */\nclass Event {\n  /**\n   * Creates a new ICAL.Event instance.\n   *\n   * @param {Component=} component              The ICAL.Component to base this event on\n   * @param {Object} [options]                  Options for this event\n   * @param {Boolean=} options.strictExceptions  When true, will verify exceptions are related by\n   *                                              their UUID\n   * @param {Array<Component|Event>=} options.exceptions\n   *          Exceptions to this event, either as components or events. If not\n   *            specified exceptions will automatically be set in relation of\n   *            component's parent\n   */\n  constructor(component, options) {\n    if (!(component instanceof Component)) {\n      options = component;\n      component = null;\n    }\n\n    if (component) {\n      this.component = component;\n    } else {\n      this.component = new Component('vevent');\n    }\n\n    this._rangeExceptionCache = Object.create(null);\n    this.exceptions = Object.create(null);\n    this.rangeExceptions = [];\n\n    if (options && options.strictExceptions) {\n      this.strictExceptions = options.strictExceptions;\n    }\n\n    if (options && options.exceptions) {\n      options.exceptions.forEach(this.relateException, this);\n    } else if (this.component.parent && !this.isRecurrenceException()) {\n      this.component.parent.getAllSubcomponents('vevent').forEach(function(event) {\n        if (event.hasProperty('recurrence-id')) {\n          this.relateException(event);\n        }\n      }, this);\n    }\n  }\n\n\n  static THISANDFUTURE = 'THISANDFUTURE';\n\n  /**\n   * List of related event exceptions.\n   *\n   * @type {Event[]}\n   */\n  exceptions = null;\n\n  /**\n   * When true, will verify exceptions are related by their UUID.\n   *\n   * @type {Boolean}\n   */\n  strictExceptions = false;\n\n  /**\n   * Relates a given event exception to this object.  If the given component\n   * does not share the UID of this event it cannot be related and will throw\n   * an exception.\n   *\n   * If this component is an exception it cannot have other exceptions\n   * related to it.\n   *\n   * @param {Component|Event} obj       Component or event\n   */\n  relateException(obj) {\n    if (this.isRecurrenceException()) {\n      throw new Error('cannot relate exception to exceptions');\n    }\n\n    if (obj instanceof Component) {\n      obj = new Event(obj);\n    }\n\n    if (this.strictExceptions && obj.uid !== this.uid) {\n      throw new Error('attempted to relate unrelated exception');\n    }\n\n    let id = obj.recurrenceId.toString();\n\n    // we don't sort or manage exceptions directly\n    // here the recurrence expander handles that.\n    this.exceptions[id] = obj;\n\n    // index RANGE=THISANDFUTURE exceptions so we can\n    // look them up later in getOccurrenceDetails.\n    if (obj.modifiesFuture()) {\n      let item = [\n        obj.recurrenceId.toUnixTime(), id\n      ];\n\n      // we keep them sorted so we can find the nearest\n      // value later on...\n      let idx = binsearchInsert(\n        this.rangeExceptions,\n        item,\n        compareRangeException\n      );\n\n      this.rangeExceptions.splice(idx, 0, item);\n    }\n  }\n\n  /**\n   * Checks if this record is an exception and has the RANGE=THISANDFUTURE\n   * value.\n   *\n   * @return {Boolean}        True, when exception is within range\n   */\n  modifiesFuture() {\n    if (!this.component.hasProperty('recurrence-id')) {\n      return false;\n    }\n\n    let range = this.component.getFirstProperty('recurrence-id').getParameter('range');\n    return range === Event.THISANDFUTURE;\n  }\n\n  /**\n   * Finds the range exception nearest to the given date.\n   *\n   * @param {Time} time   usually an occurrence time of an event\n   * @return {?Event}     the related event/exception or null\n   */\n  findRangeException(time) {\n    if (!this.rangeExceptions.length) {\n      return null;\n    }\n\n    let utc = time.toUnixTime();\n    let idx = binsearchInsert(\n      this.rangeExceptions,\n      [utc],\n      compareRangeException\n    );\n\n    idx -= 1;\n\n    // occurs before\n    if (idx < 0) {\n      return null;\n    }\n\n    let rangeItem = this.rangeExceptions[idx];\n\n    /* c8 ignore next 4 */\n    if (utc < rangeItem[0]) {\n      // sanity check only\n      return null;\n    }\n\n    return rangeItem[1];\n  }\n\n  /**\n   * Returns the occurrence details based on its start time.  If the\n   * occurrence has an exception will return the details for that exception.\n   *\n   * NOTE: this method is intend to be used in conjunction\n   *       with the {@link ICAL.Event#iterator iterator} method.\n   *\n   * @param {Time} occurrence               time occurrence\n   * @return {occurrenceDetails}            Information about the occurrence\n   */\n  getOccurrenceDetails(occurrence) {\n    let id = occurrence.toString();\n    let utcId = occurrence.convertToZone(Timezone.utcTimezone).toString();\n    let item;\n    let result = {\n      //XXX: Clone?\n      recurrenceId: occurrence\n    };\n\n    if (id in this.exceptions) {\n      item = result.item = this.exceptions[id];\n      result.startDate = item.startDate;\n      result.endDate = item.endDate;\n      result.item = item;\n    } else if (utcId in this.exceptions) {\n      item = this.exceptions[utcId];\n      result.startDate = item.startDate;\n      result.endDate = item.endDate;\n      result.item = item;\n    } else {\n      // range exceptions (RANGE=THISANDFUTURE) have a\n      // lower priority then direct exceptions but\n      // must be accounted for first. Their item is\n      // always the first exception with the range prop.\n      let rangeExceptionId = this.findRangeException(\n        occurrence\n      );\n      let end;\n\n      if (rangeExceptionId) {\n        let exception = this.exceptions[rangeExceptionId];\n\n        // range exception must modify standard time\n        // by the difference (if any) in start/end times.\n        result.item = exception;\n\n        let startDiff = this._rangeExceptionCache[rangeExceptionId];\n\n        if (!startDiff) {\n          let original = exception.recurrenceId.clone();\n          let newStart = exception.startDate.clone();\n\n          // zones must be same otherwise subtract may be incorrect.\n          original.zone = newStart.zone;\n          startDiff = newStart.subtractDate(original);\n\n          this._rangeExceptionCache[rangeExceptionId] = startDiff;\n        }\n\n        let start = occurrence.clone();\n        start.zone = exception.startDate.zone;\n        start.addDuration(startDiff);\n\n        end = start.clone();\n        end.addDuration(exception.duration);\n\n        result.startDate = start;\n        result.endDate = end;\n      } else {\n        // no range exception standard expansion\n        end = occurrence.clone();\n        end.addDuration(this.duration);\n\n        result.endDate = end;\n        result.startDate = occurrence;\n        result.item = this;\n      }\n    }\n\n    return result;\n  }\n\n  /**\n   * Builds a recur expansion instance for a specific point in time (defaults\n   * to startDate).\n   *\n   * @param {Time=} startTime     Starting point for expansion\n   * @return {RecurExpansion}    Expansion object\n   */\n  iterator(startTime) {\n    return new RecurExpansion({\n      component: this.component,\n      dtstart: startTime || this.startDate\n    });\n  }\n\n  /**\n   * Checks if the event is recurring\n   *\n   * @return {Boolean}        True, if event is recurring\n   */\n  isRecurring() {\n    let comp = this.component;\n    return comp.hasProperty('rrule') || comp.hasProperty('rdate');\n  }\n\n  /**\n   * Checks if the event describes a recurrence exception. See\n   * {@tutorial terminology} for details.\n   *\n   * @return {Boolean}    True, if the event describes a recurrence exception\n   */\n  isRecurrenceException() {\n    return this.component.hasProperty('recurrence-id');\n  }\n\n  /**\n   * Returns the types of recurrences this event may have.\n   *\n   * Returned as an object with the following possible keys:\n   *\n   *    - YEARLY\n   *    - MONTHLY\n   *    - WEEKLY\n   *    - DAILY\n   *    - MINUTELY\n   *    - SECONDLY\n   *\n   * @return {Object.<frequencyValues, Boolean>}\n   *          Object of recurrence flags\n   */\n  getRecurrenceTypes() {\n    let rules = this.component.getAllProperties('rrule');\n    let i = 0;\n    let len = rules.length;\n    let result = Object.create(null);\n\n    for (; i < len; i++) {\n      let value = rules[i].getFirstValue();\n      result[value.freq] = true;\n    }\n\n    return result;\n  }\n\n  /**\n   * The uid of this event\n   * @type {String}\n   */\n  get uid() {\n    return this._firstProp('uid');\n  }\n\n  set uid(value) {\n    this._setProp('uid', value);\n  }\n\n  /**\n   * The start date\n   * @type {Time}\n   */\n  get startDate() {\n    return this._firstProp('dtstart');\n  }\n\n  set startDate(value) {\n    this._setTime('dtstart', value);\n  }\n\n  /**\n   * The end date. This can be the result directly from the property, or the\n   * end date calculated from start date and duration. Setting the property\n   * will remove any duration properties.\n   * @type {Time}\n   */\n  get endDate() {\n    let endDate = this._firstProp('dtend');\n    if (!endDate) {\n        let duration = this._firstProp('duration');\n        endDate = this.startDate.clone();\n        if (duration) {\n            endDate.addDuration(duration);\n        } else if (endDate.isDate) {\n            endDate.day += 1;\n        }\n    }\n    return endDate;\n  }\n\n  set endDate(value) {\n    if (this.component.hasProperty('duration')) {\n      this.component.removeProperty('duration');\n    }\n    this._setTime('dtend', value);\n  }\n\n  /**\n   * The duration. This can be the result directly from the property, or the\n   * duration calculated from start date and end date. Setting the property\n   * will remove any `dtend` properties.\n   * @type {Duration}\n   */\n  get duration() {\n    let duration = this._firstProp('duration');\n    if (!duration) {\n      return this.endDate.subtractDateTz(this.startDate);\n    }\n    return duration;\n  }\n\n  set duration(value) {\n    if (this.component.hasProperty('dtend')) {\n      this.component.removeProperty('dtend');\n    }\n\n    this._setProp('duration', value);\n  }\n\n  /**\n   * The location of the event.\n   * @type {String}\n   */\n  get location() {\n    return this._firstProp('location');\n  }\n\n  set location(value) {\n    this._setProp('location', value);\n  }\n\n  /**\n   * The attendees in the event\n   * @type {Property[]}\n   */\n  get attendees() {\n    //XXX: This is way lame we should have a better\n    //     data structure for this later.\n    return this.component.getAllProperties('attendee');\n  }\n\n  /**\n   * The event summary\n   * @type {String}\n   */\n  get summary() {\n    return this._firstProp('summary');\n  }\n\n  set summary(value) {\n    this._setProp('summary', value);\n  }\n\n  /**\n   * The event description.\n   * @type {String}\n   */\n  get description() {\n    return this._firstProp('description');\n  }\n\n  set description(value) {\n    this._setProp('description', value);\n  }\n\n  /**\n   * The event color from [rfc7986](https://datatracker.ietf.org/doc/html/rfc7986)\n   * @type {String}\n   */\n  get color() {\n    return this._firstProp('color');\n  }\n\n  set color(value) {\n    this._setProp('color', value);\n  }\n\n  /**\n   * The organizer value as an uri. In most cases this is a mailto: uri, but\n   * it can also be something else, like urn:uuid:...\n   * @type {String}\n   */\n  get organizer() {\n    return this._firstProp('organizer');\n  }\n\n  set organizer(value) {\n    this._setProp('organizer', value);\n  }\n\n  /**\n   * The sequence value for this event. Used for scheduling\n   * see {@tutorial terminology}.\n   * @type {Number}\n   */\n  get sequence() {\n    return this._firstProp('sequence');\n  }\n\n  set sequence(value) {\n    this._setProp('sequence', value);\n  }\n\n  /**\n   * The recurrence id for this event. See {@tutorial terminology} for details.\n   * @type {Time}\n   */\n  get recurrenceId() {\n    return this._firstProp('recurrence-id');\n  }\n\n  set recurrenceId(value) {\n    this._setTime('recurrence-id', value);\n  }\n\n  /**\n   * Set/update a time property's value.\n   * This will also update the TZID of the property.\n   *\n   * TODO: this method handles the case where we are switching\n   * from a known timezone to an implied timezone (one without TZID).\n   * This does _not_ handle the case of moving between a known\n   *  (by TimezoneService) timezone to an unknown timezone...\n   *\n   * We will not add/remove/update the VTIMEZONE subcomponents\n   *  leading to invalid ICAL data...\n   * @private\n   * @param {String} propName     The property name\n   * @param {Time} time           The time to set\n   */\n  _setTime(propName, time) {\n    let prop = this.component.getFirstProperty(propName);\n\n    if (!prop) {\n      prop = new Property(propName);\n      this.component.addProperty(prop);\n    }\n\n    // utc and local don't get a tzid\n    if (\n      time.zone === Timezone.localTimezone ||\n      time.zone === Timezone.utcTimezone\n    ) {\n      // remove the tzid\n      prop.removeParameter('tzid');\n    } else {\n      prop.setParameter('tzid', time.zone.tzid);\n    }\n\n    prop.setValue(time);\n  }\n\n  _setProp(name, value) {\n    this.component.updatePropertyWithValue(name, value);\n  }\n\n  _firstProp(name) {\n    return this.component.getFirstPropertyValue(name);\n  }\n\n  /**\n   * The string representation of this event.\n   * @return {String}\n   */\n  toString() {\n    return this.component.toString();\n  }\n}\n\nfunction compareRangeException(a, b) {\n  if (a[0] > b[0]) return 1;\n  if (b[0] > a[0]) return -1;\n  return 0;\n}\n\n/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/.\n * Portions Copyright (C) Philipp Kewisch */\n\n\n/**\n * The ComponentParser is used to process a String or jCal Object,\n * firing callbacks for various found components, as well as completion.\n *\n * @example\n * var options = {\n *   // when false no events will be emitted for type\n *   parseEvent: true,\n *   parseTimezone: true\n * };\n *\n * var parser = new ICAL.ComponentParser(options);\n *\n * parser.onevent(eventComponent) {\n *   //...\n * }\n *\n * // ontimezone, etc...\n *\n * parser.oncomplete = function() {\n *\n * };\n *\n * parser.process(stringOrComponent);\n *\n * @memberof ICAL\n */\nclass ComponentParser {\n  /**\n   * Creates a new ICAL.ComponentParser instance.\n   *\n   * @param {Object=} options                   Component parser options\n   * @param {Boolean} options.parseEvent        Whether events should be parsed\n   * @param {Boolean} options.parseTimezeone    Whether timezones should be parsed\n   */\n  constructor(options) {\n    if (typeof(options) === 'undefined') {\n      options = {};\n    }\n\n    for (let [key, value] of Object.entries(options)) {\n      this[key] = value;\n    }\n  }\n\n  /**\n   * When true, parse events\n   *\n   * @type {Boolean}\n   */\n  parseEvent = true;\n\n  /**\n   * When true, parse timezones\n   *\n   * @type {Boolean}\n   */\n  parseTimezone = true;\n\n\n  /* SAX like events here for reference */\n\n  /**\n   * Fired when parsing is complete\n   * @callback\n   */\n  oncomplete = /* c8 ignore next */ function() {};\n\n  /**\n   * Fired if an error occurs during parsing.\n   *\n   * @callback\n   * @param {Error} err details of error\n   */\n  onerror = /* c8 ignore next */ function(err) {};\n\n  /**\n   * Fired when a top level component (VTIMEZONE) is found\n   *\n   * @callback\n   * @param {Timezone} component     Timezone object\n   */\n  ontimezone = /* c8 ignore next */ function(component) {};\n\n  /**\n   * Fired when a top level component (VEVENT) is found.\n   *\n   * @callback\n   * @param {Event} component    Top level component\n   */\n  onevent = /* c8 ignore next */ function(component) {};\n\n  /**\n   * Process a string or parse ical object.  This function itself will return\n   * nothing but will start the parsing process.\n   *\n   * Events must be registered prior to calling this method.\n   *\n   * @param {Component|String|Object} ical      The component to process,\n   *        either in its final form, as a jCal Object, or string representation\n   */\n  process(ical) {\n    //TODO: this is sync now in the future we will have a incremental parser.\n    if (typeof(ical) === 'string') {\n      ical = parse(ical);\n    }\n\n    if (!(ical instanceof Component)) {\n      ical = new Component(ical);\n    }\n\n    let components = ical.getAllSubcomponents();\n    let i = 0;\n    let len = components.length;\n    let component;\n\n    for (; i < len; i++) {\n      component = components[i];\n\n      switch (component.name) {\n        case 'vtimezone':\n          if (this.parseTimezone) {\n            let tzid = component.getFirstPropertyValue('tzid');\n            if (tzid) {\n              this.ontimezone(new Timezone({\n                tzid: tzid,\n                component: component\n              }));\n            }\n          }\n          break;\n        case 'vevent':\n          if (this.parseEvent) {\n            this.onevent(new Event(component));\n          }\n          break;\n        default:\n          continue;\n      }\n    }\n\n    //XXX: ideally we should do a \"nextTick\" here\n    //     so in all cases this is actually async.\n    this.oncomplete();\n  }\n}\n\n/* This Source Code Form is subject to the terms of the Mozilla Public\n * License, v. 2.0. If a copy of the MPL was not distributed with this\n * file, You can obtain one at http://mozilla.org/MPL/2.0/.\n * Portions Copyright (C) Philipp Kewisch */\n\n\n/**\n * The main ICAL module. Provides access to everything else.\n *\n * @alias ICAL\n * @namespace ICAL\n * @property {ICAL.design} design\n * @property {ICAL.helpers} helpers\n */\nvar ICALmodule = {\n  /**\n   * The number of characters before iCalendar line folding should occur\n   * @type {Number}\n   * @default 75\n   */\n  foldLength: 75,\n\n  debug: false,\n\n  /**\n   * The character(s) to be used for a newline. The default value is provided by\n   * rfc5545.\n   * @type {String}\n   * @default \"\\r\\n\"\n   */\n  newLineChar: '\\r\\n',\n\n  Binary,\n  Component,\n  ComponentParser,\n  Duration,\n  Event,\n  Period,\n  Property,\n  Recur,\n  RecurExpansion,\n  RecurIterator,\n  Time,\n  Timezone,\n  TimezoneService,\n  UtcOffset,\n  VCardTime,\n\n  parse,\n  stringify,\n\n  design,\n  helpers\n};\n\nexport { ICALmodule as default };\n","import validate from './validate.js';\nconst byteToHex = [];\nfor (let i = 0; i < 256; ++i) {\n    byteToHex.push((i + 0x100).toString(16).slice(1));\n}\nexport function unsafeStringify(arr, offset = 0) {\n    return (byteToHex[arr[offset + 0]] +\n        byteToHex[arr[offset + 1]] +\n        byteToHex[arr[offset + 2]] +\n        byteToHex[arr[offset + 3]] +\n        '-' +\n        byteToHex[arr[offset + 4]] +\n        byteToHex[arr[offset + 5]] +\n        '-' +\n        byteToHex[arr[offset + 6]] +\n        byteToHex[arr[offset + 7]] +\n        '-' +\n        byteToHex[arr[offset + 8]] +\n        byteToHex[arr[offset + 9]] +\n        '-' +\n        byteToHex[arr[offset + 10]] +\n        byteToHex[arr[offset + 11]] +\n        byteToHex[arr[offset + 12]] +\n        byteToHex[arr[offset + 13]] +\n        byteToHex[arr[offset + 14]] +\n        byteToHex[arr[offset + 15]]).toLowerCase();\n}\nfunction stringify(arr, offset = 0) {\n    const uuid = unsafeStringify(arr, offset);\n    if (!validate(uuid)) {\n        throw TypeError('Stringified UUID is invalid');\n    }\n    return uuid;\n}\nexport default stringify;\n","let getRandomValues;\nconst rnds8 = new Uint8Array(16);\nexport default function rng() {\n    if (!getRandomValues) {\n        if (typeof crypto === 'undefined' || !crypto.getRandomValues) {\n            throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');\n        }\n        getRandomValues = crypto.getRandomValues.bind(crypto);\n    }\n    return getRandomValues(rnds8);\n}\n","const randomUUID = typeof crypto !== 'undefined' && crypto.randomUUID && crypto.randomUUID.bind(crypto);\nexport default { randomUUID };\n","import native from './native.js';\nimport rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\nfunction _v4(options, buf, offset) {\n    options = options || {};\n    const rnds = options.random ?? options.rng?.() ?? rng();\n    if (rnds.length < 16) {\n        throw new Error('Random bytes length must be >= 16');\n    }\n    rnds[6] = (rnds[6] & 0x0f) | 0x40;\n    rnds[8] = (rnds[8] & 0x3f) | 0x80;\n    if (buf) {\n        offset = offset || 0;\n        if (offset < 0 || offset + 16 > buf.length) {\n            throw new RangeError(`UUID byte range ${offset}:${offset + 15} is out of buffer bounds`);\n        }\n        for (let i = 0; i < 16; ++i) {\n            buf[offset + i] = rnds[i];\n        }\n        return buf;\n    }\n    return unsafeStringify(rnds);\n}\nfunction v4(options, buf, offset) {\n    if (native.randomUUID && !buf && !options) {\n        return native.randomUUID();\n    }\n    return _v4(options, buf, offset);\n}\nexport default v4;\n","import './assets/index-CkcnNJJ0.css';\nimport { NcButton, NcDateTimePickerNative } from \"@nextcloud/vue\";\nimport IconDelete from \"vue-material-design-icons/TrashCanOutline.vue\";\nimport IconAdd from \"vue-material-design-icons/Plus.vue\";\nimport { getFirstDay } from \"@nextcloud/l10n\";\nimport { resolveComponent, createElementBlock, openBlock, Fragment, renderList, createElementVNode, createBlock, toDisplayString, createCommentVNode, createVNode, withCtx } from \"vue\";\nimport { getZoneString } from \"icalzone\";\nimport ICAL from \"ical.js\";\nimport { v4 } from \"uuid\";\nimport { getLoggerBuilder } from \"@nextcloud/logger\";\nconst _export_sfc = (sfc, props) => {\n  const target = sfc.__vccOpts || sfc;\n  for (const [key, val] of props) {\n    target[key] = val;\n  }\n  return target;\n};\nconst _sfc_main = {\n  name: \"CalendarAvailability\",\n  components: {\n    NcDateTimePickerNative,\n    NcButton,\n    IconAdd,\n    IconDelete\n  },\n  props: {\n    slots: {\n      type: Object,\n      required: true\n    },\n    loading: {\n      type: Boolean,\n      default: false\n    },\n    l10nTo: {\n      type: String,\n      required: true\n    },\n    l10nDeleteSlot: {\n      type: String,\n      required: true\n    },\n    l10nEmptyDay: {\n      type: String,\n      required: true\n    },\n    l10nAddSlot: {\n      type: String,\n      required: true\n    },\n    l10nWeekDayListLabel: {\n      type: String,\n      default: \"Weekdays\"\n    },\n    l10nMonday: {\n      type: String,\n      required: true\n    },\n    l10nTuesday: {\n      type: String,\n      required: true\n    },\n    l10nWednesday: {\n      type: String,\n      required: true\n    },\n    l10nThursday: {\n      type: String,\n      required: true\n    },\n    l10nFriday: {\n      type: String,\n      required: true\n    },\n    l10nSaturday: {\n      type: String,\n      required: true\n    },\n    l10nSunday: {\n      type: String,\n      required: true\n    },\n    l10nStartPickerLabel: {\n      type: Function,\n      default: (dayName) => `Pick a start time for ${dayName}`\n    },\n    l10nEndPickerLabel: {\n      type: Function,\n      default: (dayName) => `Pick a end time for ${dayName}`\n    }\n  },\n  data() {\n    return {\n      internalSlots: this.slotsToInternalData(this.slots)\n    };\n  },\n  watch: {\n    slots() {\n      this.internalSlots = this.slotsToInternalData(this.slots);\n    }\n  },\n  methods: {\n    timeStampSlotsToDateObjectSlots(slots) {\n      return slots.map((slot) => ({\n        start: new Date(slot.start * 1e3),\n        end: new Date(slot.end * 1e3)\n      }));\n    },\n    slotsToInternalData() {\n      const moToSa = [\n        {\n          id: \"MO\",\n          displayName: this.l10nMonday,\n          slots: this.timeStampSlotsToDateObjectSlots(this.slots.MO)\n        },\n        {\n          id: \"TU\",\n          displayName: this.l10nTuesday,\n          slots: this.timeStampSlotsToDateObjectSlots(this.slots.TU)\n        },\n        {\n          id: \"WE\",\n          displayName: this.l10nWednesday,\n          slots: this.timeStampSlotsToDateObjectSlots(this.slots.WE)\n        },\n        {\n          id: \"TH\",\n          displayName: this.l10nThursday,\n          slots: this.timeStampSlotsToDateObjectSlots(this.slots.TH)\n        },\n        {\n          id: \"FR\",\n          displayName: this.l10nFriday,\n          slots: this.timeStampSlotsToDateObjectSlots(this.slots.FR)\n        },\n        {\n          id: \"SA\",\n          displayName: this.l10nSaturday,\n          slots: this.timeStampSlotsToDateObjectSlots(this.slots.SA)\n        }\n      ];\n      const sunday = {\n        id: \"SU\",\n        displayName: this.l10nSunday,\n        slots: this.timeStampSlotsToDateObjectSlots(this.slots.SU)\n      };\n      return getFirstDay() === 1 ? [...moToSa, sunday] : [sunday, ...moToSa];\n    },\n    internalDataToSlots() {\n      const converted = {};\n      this.internalSlots.forEach(({ id, slots }) => {\n        converted[id] = slots.map((slot) => ({\n          start: Math.round(slot.start.getTime() / 1e3),\n          end: Math.round(slot.end.getTime() / 1e3)\n        }));\n      });\n      return converted;\n    },\n    addSlot(day) {\n      const start = /* @__PURE__ */ new Date();\n      start.setHours(9, 0, 0, 0);\n      const end = /* @__PURE__ */ new Date();\n      end.setHours(17, 0, 0, 0);\n      day.slots.push({\n        start,\n        end\n      });\n      this.onChangeSlots();\n    },\n    removeSlot(day, idx) {\n      day.slots.splice(idx, 1);\n      this.onChangeSlots();\n    },\n    onChangeSlots() {\n      this.$emit(\"update:slots\", this.internalDataToSlots());\n    }\n  }\n};\nconst _hoisted_1 = [\"aria-label\"];\nconst _hoisted_2 = { class: \"label-weekday\" };\nconst _hoisted_3 = [\"id\"];\nconst _hoisted_4 = { class: \"availability-slot-group\" };\nconst _hoisted_5 = { class: \"to-text\" };\nconst _hoisted_6 = {\n  key: 0,\n  class: \"empty-content\"\n};\nfunction _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {\n  const _component_NcDateTimePickerNative = resolveComponent(\"NcDateTimePickerNative\");\n  const _component_IconDelete = resolveComponent(\"IconDelete\");\n  const _component_NcButton = resolveComponent(\"NcButton\");\n  const _component_IconAdd = resolveComponent(\"IconAdd\");\n  return openBlock(), createElementBlock(\"ul\", {\n    class: \"week-day-container\",\n    \"aria-label\": $props.l10nWeekDayListLabel\n  }, [\n    (openBlock(true), createElementBlock(Fragment, null, renderList($data.internalSlots, (day) => {\n      return openBlock(), createElementBlock(\"li\", {\n        key: `day-label-${day.id}`,\n        class: \"day-container\"\n      }, [\n        createElementVNode(\"div\", _hoisted_2, [\n          createElementVNode(\"span\", {\n            id: day.displayName + \"-label\"\n          }, toDisplayString(day.displayName), 9, _hoisted_3)\n        ]),\n        (openBlock(), createElementBlock(\"div\", {\n          key: `day-slots-${day.id}`,\n          class: \"availability-slots\"\n        }, [\n          createElementVNode(\"div\", _hoisted_4, [\n            (openBlock(true), createElementBlock(Fragment, null, renderList(day.slots, (slot, idx) => {\n              return openBlock(), createElementBlock(\"div\", {\n                key: `slot-${day.id}-${idx}`,\n                class: \"availability-slot\"\n              }, [\n                createVNode(_component_NcDateTimePickerNative, {\n                  id: `start-${day.id}-${idx}`,\n                  modelValue: slot.start,\n                  \"onUpdate:modelValue\": ($event) => slot.start = $event,\n                  type: \"time\",\n                  label: $props.l10nStartPickerLabel?.(day.displayName),\n                  \"hide-label\": true,\n                  class: \"start-date\",\n                  onChange: $options.onChangeSlots\n                }, null, 8, [\"id\", \"modelValue\", \"onUpdate:modelValue\", \"label\", \"onChange\"]),\n                createElementVNode(\"span\", _hoisted_5, toDisplayString($props.l10nTo), 1),\n                createVNode(_component_NcDateTimePickerNative, {\n                  id: `end-${day.id}-${idx}`,\n                  modelValue: slot.end,\n                  \"onUpdate:modelValue\": ($event) => slot.end = $event,\n                  type: \"time\",\n                  label: $props.l10nEndPickerLabel?.(day.displayName),\n                  \"hide-label\": true,\n                  class: \"end-date\",\n                  onChange: $options.onChangeSlots\n                }, null, 8, [\"id\", \"modelValue\", \"onUpdate:modelValue\", \"label\", \"onChange\"]),\n                (openBlock(), createBlock(_component_NcButton, {\n                  key: `slot-${day.id}-${idx}-btn`,\n                  type: \"tertiary\",\n                  class: \"button\",\n                  \"aria-label\": $props.l10nDeleteSlot,\n                  title: $props.l10nDeleteSlot,\n                  onClick: ($event) => $options.removeSlot(day, idx)\n                }, {\n                  icon: withCtx(() => [\n                    createVNode(_component_IconDelete, { size: 20 })\n                  ]),\n                  _: 2\n                }, 1032, [\"aria-label\", \"title\", \"onClick\"]))\n              ]);\n            }), 128))\n          ]),\n          day.slots.length === 0 ? (openBlock(), createElementBlock(\"span\", _hoisted_6, toDisplayString($props.l10nEmptyDay), 1)) : createCommentVNode(\"\", true)\n        ])),\n        (openBlock(), createBlock(_component_NcButton, {\n          key: `add-slot-${day.id}`,\n          disabled: $props.loading,\n          class: \"add-another button\",\n          title: $props.l10nAddSlot,\n          \"aria-label\": $props.l10nAddSlot,\n          onClick: ($event) => $options.addSlot(day)\n        }, {\n          icon: withCtx(() => [\n            createVNode(_component_IconAdd, { size: 20 })\n          ]),\n          _: 2\n        }, 1032, [\"disabled\", \"title\", \"aria-label\", \"onClick\"]))\n      ]);\n    }), 128))\n  ], 8, _hoisted_1);\n}\nconst CalendarAvailability = /* @__PURE__ */ _export_sfc(_sfc_main, [[\"render\", _sfc_render], [\"__scopeId\", \"data-v-3ef03e87\"]]);\nconst logger = getLoggerBuilder().detectUser().setApp(\"@nextcloud/calendar-availability-vue\").build();\nfunction getEmptySlots() {\n  return {\n    MO: [],\n    TU: [],\n    WE: [],\n    TH: [],\n    FR: [],\n    SA: [],\n    SU: []\n  };\n}\nfunction vavailabilityToSlots(vavailability) {\n  const parsedIcal = ICAL.parse(vavailability);\n  const vcalendarComp = new ICAL.Component(parsedIcal);\n  const vavailabilityComp = vcalendarComp.getFirstSubcomponent(\"vavailability\");\n  let timezoneId;\n  const timezoneComp = vcalendarComp.getFirstSubcomponent(\"vtimezone\");\n  if (timezoneComp) {\n    timezoneId = timezoneComp.getFirstProperty(\"tzid\").getFirstValue();\n  }\n  const availableComps = vavailabilityComp.getAllSubcomponents(\"available\");\n  const slots = getEmptySlots();\n  availableComps.forEach((availableComp) => {\n    const startIcalDate = availableComp.getFirstProperty(\"dtstart\").getFirstValue();\n    const endIcalDate = availableComp.getFirstProperty(\"dtend\").getFirstValue();\n    const rrule = availableComp.getFirstProperty(\"rrule\");\n    const start = /* @__PURE__ */ new Date();\n    start.setHours(startIcalDate.hour, startIcalDate.minute, 0, 0);\n    const end = /* @__PURE__ */ new Date();\n    end.setHours(endIcalDate.hour, endIcalDate.minute, 0, 0);\n    if (rrule.getFirstValue().freq !== \"WEEKLY\") {\n      logger.warn(\"rrule not supported\", {\n        rrule: rrule.toICALString()\n      });\n      return;\n    }\n    rrule.getFirstValue().getComponent(\"BYDAY\").forEach((day) => {\n      slots[day].push({\n        start: start.getTime() / 1e3,\n        end: end.getTime() / 1e3\n      });\n    });\n  });\n  return {\n    slots,\n    timezoneId\n  };\n}\nfunction slotsToVavailability(slots, timezoneId) {\n  const vcalendarComp = new ICAL.Component(\"vcalendar\");\n  vcalendarComp.addPropertyWithValue(\"prodid\", \"Nextcloud DAV app\");\n  const predefinedTimezoneIcal = getZoneString(timezoneId);\n  if (predefinedTimezoneIcal) {\n    const timezoneComp = new ICAL.Component(ICAL.parse(predefinedTimezoneIcal));\n    vcalendarComp.addSubcomponent(timezoneComp);\n  } else {\n    const timezoneComp = new ICAL.Component(\"vtimezone\");\n    timezoneComp.addPropertyWithValue(\"tzid\", timezoneId);\n    vcalendarComp.addSubcomponent(timezoneComp);\n  }\n  const vavailabilityComp = new ICAL.Component(\"vavailability\");\n  const deduplicated = slots.reduce((acc, slot) => {\n    const start = new Date(slot.start * 1e3);\n    const end = new Date(slot.end * 1e3);\n    const key = [\n      start.getHours(),\n      start.getMinutes(),\n      end.getHours(),\n      end.getMinutes()\n    ].join(\"-\");\n    return {\n      ...acc,\n      [key]: [...acc[key] ?? [], slot]\n    };\n  }, {});\n  Object.keys(deduplicated).map((key) => {\n    const slots2 = deduplicated[key];\n    const start = slots2[0].start;\n    const end = slots2[0].end;\n    const days = slots2.map((slot) => slot.day).filter((day, index, self) => self.indexOf(day) === index);\n    const availableComp = new ICAL.Component(\"available\");\n    const startTimeProp = availableComp.addPropertyWithValue(\"dtstart\", ICAL.Time.fromJSDate(new Date(start * 1e3), false));\n    startTimeProp.setParameter(\"tzid\", timezoneId);\n    const endTimeProp = availableComp.addPropertyWithValue(\"dtend\", ICAL.Time.fromJSDate(new Date(end * 1e3), false));\n    endTimeProp.setParameter(\"tzid\", timezoneId);\n    availableComp.addPropertyWithValue(\"uid\", v4());\n    availableComp.addPropertyWithValue(\"rrule\", {\n      freq: \"WEEKLY\",\n      byday: days\n    });\n    return availableComp;\n  }).map(vavailabilityComp.addSubcomponent.bind(vavailabilityComp));\n  vcalendarComp.addSubcomponent(vavailabilityComp);\n  return vcalendarComp.toString();\n}\nexport {\n  CalendarAvailability,\n  getEmptySlots,\n  slotsToVavailability,\n  vavailabilityToSlots\n};\n//# sourceMappingURL=index.mjs.map\n","/**\n * SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport type { WebDAVClient } from 'webdav'\n\nimport { getCurrentUser, getRequestToken, onRequestTokenUpdate } from '@nextcloud/auth'\nimport { generateRemoteUrl } from '@nextcloud/router'\nimport { createClient } from 'webdav'\n\nlet client: WebDAVClient | undefined = undefined\n\n/**\n * Get the WebDAV client for the current user on the calendars endpoint.\n */\nexport function getClient(): WebDAVClient {\n\tif (!client) {\n\t\t// init webdav client\n\t\tconst remote = generateRemoteUrl(`dav/calendars/${getCurrentUser()!.uid}`)\n\t\tclient = createClient(remote)\n\n\t\t// set CSRF token header\n\t\tconst setHeaders = (token) => {\n\t\t\tclient!.setHeaders({\n\t\t\t\t// Add this so the server knows it is an request from the browser\n\t\t\t\t'X-Requested-With': 'XMLHttpRequest',\n\t\t\t\t// Inject user auth\n\t\t\t\trequesttoken: token ?? '',\n\t\t\t})\n\t\t}\n\n\t\t// refresh headers when request token changes\n\t\tonRequestTokenUpdate(setHeaders)\n\t\tsetHeaders(getRequestToken())\n\t}\n\n\treturn client\n}\n","/**\n * SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport {\n\tslotsToVavailability,\n\tvavailabilityToSlots,\n} from '@nextcloud/calendar-availability-vue'\nimport { parseXML } from 'webdav'\nimport { getClient } from '../dav/client.ts'\nimport { logger } from './logger.ts'\n\n/**\n * Get an object representing empty time slots for each day of the week.\n */\nexport function getEmptySlots() {\n\treturn {\n\t\tMO: [],\n\t\tTU: [],\n\t\tWE: [],\n\t\tTH: [],\n\t\tFR: [],\n\t\tSA: [],\n\t\tSU: [],\n\t}\n}\n\n/**\n * Find the availability of the schedule inbox.\n */\nexport async function findScheduleInboxAvailability() {\n\tconst response = await getClient().customRequest('inbox', {\n\t\tmethod: 'PROPFIND',\n\t\tdata: `<?xml version=\"1.0\"?>\n\t\t\t<x0:propfind xmlns:x0=\"DAV:\">\n\t\t\t  <x0:prop>\n\t\t\t\t<x1:calendar-availability xmlns:x1=\"urn:ietf:params:xml:ns:caldav\"/>\n\t\t\t  </x0:prop>\n\t\t\t</x0:propfind>`,\n\t})\n\n\tconst xml = await parseXML(await response.text())\n\n\tif (!xml) {\n\t\treturn undefined\n\t}\n\n\tconst availability = xml?.multistatus?.response[0]?.propstat?.prop['calendar-availability']\n\tif (!availability) {\n\t\treturn undefined\n\t}\n\n\treturn vavailabilityToSlots(availability)\n}\n\n/**\n * Save the availability of the schedule inbox.\n *\n * @param slots - The availability slots to save.\n * @param timezoneId - The timezone identifier.\n */\nexport async function saveScheduleInboxAvailability(slots, timezoneId) {\n\tconst all = [...Object.keys(slots).flatMap((dayId) => slots[dayId].map((slot) => ({\n\t\t...slot,\n\t\tday: dayId,\n\t})))]\n\n\tconst vavailability = slotsToVavailability(all, timezoneId)\n\n\tlogger.debug('New availability ical created', {\n\t\tvavailability,\n\t})\n\n\tawait getClient().customRequest('inbox', {\n\t\tmethod: 'PROPPATCH',\n\t\tdata: `<?xml version=\"1.0\"?>\n\t\t\t<x0:propertyupdate xmlns:x0=\"DAV:\">\n\t\t\t  <x0:set>\n\t\t\t\t<x0:prop>\n\t\t\t\t  <x1:calendar-availability xmlns:x1=\"urn:ietf:params:xml:ns:caldav\">${vavailability}</x1:calendar-availability>\n\t\t\t\t</x0:prop>\n\t\t\t  </x0:set>\n\t\t\t</x0:propertyupdate>`,\n\t})\n}\n","/*!\n * SPDX-FileCopyrightText: 2022 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport axios from '@nextcloud/axios'\nimport { generateOcsUrl } from '@nextcloud/router'\n\n/**\n * Enable user status automation based on availability\n */\nexport async function enableUserStatusAutomation(): Promise<void> {\n\tawait axios.post(\n\t\tgenerateOcsUrl('/apps/provisioning_api/api/v1/config/users/{appId}/{configKey}', {\n\t\t\tappId: 'dav',\n\t\t\tconfigKey: 'user_status_automation',\n\t\t}),\n\t\t{\n\t\t\tconfigValue: 'yes',\n\t\t},\n\t)\n}\n\n/**\n * Disable user status automation based on availability\n */\nexport async function disableUserStatusAutomation(): Promise<void> {\n\tawait axios.delete(generateOcsUrl('/apps/provisioning_api/api/v1/config/users/{appId}/{configKey}', {\n\t\tappId: 'dav',\n\t\tconfigKey: 'user_status_automation',\n\t}))\n}\n","<!--\n  - SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors\n  - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<script setup lang=\"ts\">\nimport { CalendarAvailability } from '@nextcloud/calendar-availability-vue'\nimport { getCapabilities } from '@nextcloud/capabilities'\nimport { showError, showSuccess } from '@nextcloud/dialogs'\nimport { loadState } from '@nextcloud/initial-state'\nimport { t } from '@nextcloud/l10n'\nimport { onMounted, ref } from 'vue'\nimport NcButton from '@nextcloud/vue/components/NcButton'\nimport NcCheckboxRadioSwitch from '@nextcloud/vue/components/NcCheckboxRadioSwitch'\nimport {\n\tfindScheduleInboxAvailability,\n\tgetEmptySlots,\n\tsaveScheduleInboxAvailability,\n} from '../service/CalendarService.js'\nimport { logger } from '../service/logger.ts'\nimport {\n\tdisableUserStatusAutomation,\n\tenableUserStatusAutomation,\n} from '../service/PreferenceService.js'\n\n// @ts-expect-error capabilities is missing the capability to type it...\nconst timezone = getCapabilities().core.user?.timezone ?? Intl.DateTimeFormat().resolvedOptions().timeZone\n\nconst loading = ref(true)\nconst saving = ref(false)\nconst slots = ref(getEmptySlots())\nconst automated = ref(loadState('dav', 'user_status_automation') === 'yes')\n\nonMounted(async () => {\n\ttry {\n\t\tconst slotData = await findScheduleInboxAvailability()\n\t\tif (!slotData) {\n\t\t\tlogger.debug('no availability is set')\n\t\t} else {\n\t\t\tslots.value = slotData.slots\n\t\t\tlogger.debug('availability loaded', { slots: slots.value })\n\t\t}\n\t} catch (error) {\n\t\tlogger.error('could not load existing availability', { error })\n\t\tshowError(t('dav', 'Failed to load availability'))\n\t} finally {\n\t\tloading.value = false\n\t}\n})\n\n/**\n * Save current slots on the server\n */\nasync function save() {\n\tsaving.value = true\n\ttry {\n\t\tawait saveScheduleInboxAvailability(slots.value, timezone)\n\t\tif (automated.value) {\n\t\t\tawait enableUserStatusAutomation()\n\t\t} else {\n\t\t\tawait disableUserStatusAutomation()\n\t\t}\n\n\t\tshowSuccess(t('dav', 'Saved availability'))\n\t} catch (error) {\n\t\tlogger.error('could not save availability', { error })\n\t\tshowError(t('dav', 'Failed to save availability'))\n\t} finally {\n\t\tsaving.value = false\n\t}\n}\n</script>\n\n<template>\n\t<div>\n\t\t<CalendarAvailability\n\t\t\tv-model:slots=\"slots\"\n\t\t\t:loading=\"loading\"\n\t\t\t:l10nTo=\"t('dav', 'to')\"\n\t\t\t:l10nDeleteSlot=\"t('dav', 'Delete slot')\"\n\t\t\t:l10nEmptyDay=\"t('dav', 'No working hours set')\"\n\t\t\t:l10nAddSlot=\"t('dav', 'Add slot')\"\n\t\t\t:l10nWeekDayListLabel=\"t('dav', 'Weekdays')\"\n\t\t\t:l10nMonday=\"t('dav', 'Monday')\"\n\t\t\t:l10nTuesday=\"t('dav', 'Tuesday')\"\n\t\t\t:l10nWednesday=\"t('dav', 'Wednesday')\"\n\t\t\t:l10nThursday=\"t('dav', 'Thursday')\"\n\t\t\t:l10nFriday=\"t('dav', 'Friday')\"\n\t\t\t:l10nSaturday=\"t('dav', 'Saturday')\"\n\t\t\t:l10nSunday=\"t('dav', 'Sunday')\"\n\t\t\t:l10nStartPickerLabel=\"(dayName) => t('dav', 'Pick a start time for {dayName}', { dayName })\"\n\t\t\t:l10nEndPickerLabel=\"(dayName) => t('dav', 'Pick a end time for {dayName}', { dayName })\" />\n\n\t\t<NcCheckboxRadioSwitch v-model=\"automated\">\n\t\t\t{{ t('dav', 'Automatically set user status to \"Do not disturb\" outside of availability to mute all notifications.') }}\n\t\t</NcCheckboxRadioSwitch>\n\n\t\t<NcButton\n\t\t\t:disabled=\"loading || saving\"\n\t\t\tvariant=\"primary\"\n\t\t\t@click=\"save\">\n\t\t\t{{ t('dav', 'Save') }}\n\t\t</NcButton>\n\t</div>\n</template>\n\n<style lang=\"scss\" scoped>\n:deep(.availability-day) {\n\tpadding: 0 10px 0 10px;\n\tposition: absolute;\n}\n\n:deep(.availability-slots) {\n\tdisplay: flex;\n\twhite-space: normal;\n}\n\n:deep(.availability-slot) {\n\tdisplay: flex;\n\tflex-direction: row;\n\talign-items: center;\n\tflex-wrap: wrap;\n}\n\n:deep(.availability-slot-group) {\n\tdisplay: flex;\n\tflex-direction: column;\n}\n\n:deep(.mx-input-wrapper) {\n\twidth: 85px;\n}\n\n:deep(.mx-datepicker) {\n\twidth: 97px;\n}\n\n.time-zone {\n\tpadding-block: 32px 12px;\n\tpadding-inline: 0 12px;\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\n\t&__heading {\n\t\tmargin-inline-end: calc(var(--default-grid-baseline) * 2);\n\t\tline-height: var(--default-clickable-area);\n\t\tfont-weight: bold;\n\t}\n}\n\n.grid-table {\n\tdisplay: grid;\n\tmargin-bottom: 32px;\n\tcolumn-gap: 24px;\n\trow-gap: 6px;\n\tgrid-template-columns: min-content auto min-content;\n\tmax-width: 500px;\n}\n\n.button {\n\talign-self: flex-end;\n}\n\n:deep(.label-weekday) {\n\tposition: relative;\n\tdisplay: inline-flex;\n\tpadding-top: 4px;\n\talign-self: center;\n}\n\n:deep(.delete-slot) {\n\tpadding-bottom: unset;\n}\n\n:deep(.add-another) {\n\talign-self: center;\n}\n\n.to-text {\n\tpadding-inline-end: 12px;\n}\n\n.empty-content {\n\talign-self: center;\n\tcolor: var(--color-text-maxcontrast);\n\tmargin-block-start: var(--default-grid-baseline);\n}\n</style>\n","<!--\n  - SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors\n  - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<script setup lang=\"ts\">\nimport { loadState } from '@nextcloud/initial-state'\nimport { t } from '@nextcloud/l10n'\nimport NcSettingsSection from '@nextcloud/vue/components/NcSettingsSection'\nimport AbsenceForm from '../components/AbsenceForm.vue'\nimport AvailabilityForm from '../components/AvailabilityForm.vue'\n\nconst hideAbsenceSettings = loadState('dav', 'hide_absence_settings', true)\n</script>\n\n<template>\n\t<div>\n\t\t<NcSettingsSection\n\t\t\tid=\"availability\"\n\t\t\t:name=\"t('dav', 'Availability')\"\n\t\t\t:description=\"t('dav', 'If you configure your working hours, other people will see when you are out of office when they book a meeting.')\">\n\t\t\t<AvailabilityForm />\n\t\t</NcSettingsSection>\n\t\t<NcSettingsSection\n\t\t\tv-if=\"!hideAbsenceSettings\"\n\t\t\tid=\"absence\"\n\t\t\t:name=\"t('dav', 'Absence')\"\n\t\t\t:description=\"t('dav', 'Configure your next absence period.')\">\n\t\t\t<AbsenceForm />\n\t\t</NcSettingsSection>\n\t</div>\n</template>\n","/**\n * SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport { createApp } from 'vue'\nimport UserAvailability from './views/UserAvailability.vue'\n\nconst app = createApp(UserAvailability)\napp.mount('#settings-personal-availability')\n"],"names":["formatDateAsYMD","date","year","month","day","_sfc_main","NcButton","NcTextField","NcTextArea","NcDateTimePickerNative","NcSelectUsers","t","firstDay","lastDay","status","message","replacementUserId","replacementUserDisplayName","loadState","result","query","search","shareType","ShareType","request","axios","generateOcsUrl","error","logger","data","exact","rawExactSuggestions","rawSuggestions","exactSuggestions","share","suggestions","allSuggestions","nameCounts","item","debounce","args","getCurrentUser","showSuccess","showError","_hoisted_1","_createElementBlock","_normalizeClass","_ctx","$options","_createElementVNode","_createVNode","_component_NcDateTimePickerNative","$data","$event","$setup","_toDisplayString","_component_NcSelectUsers","_component_NcTextField","_component_NcTextArea","_component_NcButton","zones","dist","zones_1","require$$0","renderZoneSub","n","f","r","s","getZoneLines","zoneName","includeWrapper","zoneData","d","getZoneString","Binary","aString","aValue","b64","o1","o2","o3","h1","h2","h3","h4","bits","i","ac","enc","tmp_arr","dec","DURATION_LETTERS","DATA_PROPS_TO_COPY","Duration","aSeconds","string","aStr","pos","dict","chunks","type","numeric","parseDurationChunk","aData","seconds","secs","trunc","prop","aOther","thisSeconds","otherSeconds","str","hasWeeks","letter","number","object","num","isStrictlyNaN","Period","parts","options","Time","end","aProp","aLenient","fromDateOrDateTimeString","dateProp","dt","_daysInMonth","days","aDayOfYear","aYear","doy","tt","is_leap","strictParseInt","zone","zoneId","Timezone","timeData","aProperty","aDate","useUTC","aZone","aWeekStart","dow","wkst","yr","LTRS","dom","#epochTime","a","b","attr","val","hour","minute","second","timezone","key","value","TimezoneService","firstDow","dowCacheKey","q","m","Y","h","aFirstDayOfWeek","delta","aDayOfWeek","aPos","daysInMonth","weekday","start","otherDay","startDow","offset","endDow","wnCacheKey","week1","isoyear","daysBetween","answer","aDuration","mult","unixTime","other","tz","rc","copy","zone_equals","design","pad2","aExtraDays","aExtraHours","aExtraMinutes","aExtraSeconds","aTime","minutesOverflow","hoursOverflow","daysOverflow","yearsOverflow","time","ms","len","CHAR","VALUE_DELIMITER","PARAM_DELIMITER","PARAM_NAME_DELIMITER","DEFAULT_VALUE_TYPE$1","DEFAULT_PARAM_TYPE","RFC6868_REPLACE_MAP$1","parse","input","state","root","err","line","ParserError","designSet","valuePos","paramPos","lastParamIndex","lastValuePos","name","params","parsedParams","parsedParamLength","accumulator","currentValue","newComponent","valueType","multiValue","structuredValue","propertyDetails","splitName","ungroupedName","lastParam","delim","lcname","mvdelim","extendedValue","propValuePos","nextPos","length_before","delimiter","x","buffer","innerMulti","lastPos","unescapedIndexOf","callback","firstChar","newlineOffset","OPTIONS","from_zone","to_zone","utcOffset","#utcTimezone","#localTimezone","change","hours","minutes","Component","jCal","tt_change","change_num","change_num_to_use","step","clone","zone_change","tmp_change","prev_zone_change","want_daylight","idx","binsearchInsert","today","changesEndYear","subcomps","compLen","compIdx","aComponent","changes","dtstart","convert_tzoffset","init_changes","changebase","props","rdate","rrule","iterator","occ","utc","tzid","updateTimezones","vcal","allsubs","properties","vtimezones","reqTzid","comp","formatClassType","list","seekVal","cmpfunc","low","high","mid","cmpval","aSrc","aDeep","arr","obj","foldline","aLine","line_length","cp","ICALmodule","extend","source","target","descr","helpers","UtcOffset","instance","factor","VCardTime","aIcalType","part","v","e","tmz","splitzone","tm","dtlen","tmlen","hasDashDate","hasDashTime","o","icaltype","y","mm","hasYear","hasMonth","hasDay","hasHour","hasMinute","hasSecond","datepart","timepart","RecurIterator","Recur","InvalidRecurrenceRuleError","wkdy","dayName","untilYear","tempLast","initLast","bydow","dayOfMonth","normalized","again","before","valid","invalid_count","inc","this_freq","end_of_data","week_no","rules","newRules","ruleIdx","rule","isInit","byMonthDay","byDay","dateIdx","dateLen","dayLen","dataIsValid","self","initMonth","nextMonth","monthsCounter","next","dayIdx","data_valid","setpos","setpos_total","last_day","coded_day","startOfWeek","matches","aRuleType","aInterval","aDateAttr","aFollowingAttr","aPreviousIncr","has_by_rule","dta","years","aFactor","aNextIncrement","nextunit","validWeeks","monthIdx","first_week","last_week","weekIdx","partCount","t1","t2","monthday","t3","first_dow","doy_offset","last_dow","by_month_day","spIndex","bydayParts","month_day","first_matching_day","last_matching_day","expandedDays","weekno","daysInYear","days_list","tmp","start_dow","end_dow","end_year_day","tmp_start_doy","first","last","this_dow","aRules","j","one","two","indexMapValue","ruleMapValue","pass","ruleType","bydata","weekNo","req","deftime","VALID_DAY_NAMES","VALID_BYDAY_PART","DOW_MAP","REVERSE_DOW_MAP","entry","ALLOWED_FREQ","fmtIcal","values","ucname","partDesign","partArr","partSet","optionDesign","aStart","aType","aValues","aStartTime","aRecurrenceId","iter","uckey","res","k","kparts","parseNumericValue","min","max","FROM_ICAL_NEWLINE","TO_ICAL_NEWLINE","FROM_VCARD_NEWLINE","TO_VCARD_NEWLINE","createTextType","fromNewline","toNewline","structuredEscape","replaceNewline","regEx","DEFAULT_TYPE_TEXT","DEFAULT_TYPE_TEXT_MULTI","DEFAULT_TYPE_TEXT_STRUCTURED","DEFAULT_TYPE_INTEGER","DEFAULT_TYPE_DATETIME_DATE","DEFAULT_TYPE_DATETIME","DEFAULT_TYPE_URI","DEFAULT_TYPE_UTCOFFSET","DEFAULT_TYPE_RECUR","DEFAULT_TYPE_DATE_ANDOR_TIME","replaceNewlineReplace","newline","commonProperties","commonValues","parsed","icalParams","icalValues","aBinary","aRecur","icalProperties","vcardValues","isFromIcal","lastChar","signChar","sign","c","vcardParams","vcardProperties","vcard3Values","vcard3Params","vcard3Properties","icalSet","vcardSet","vcard3Set","componentName","LINE_ENDING","DEFAULT_VALUE_TYPE","RFC6868_REPLACE_MAP","stringify","component","propIdx","propLen","designSetName","comps","property","noFold","jsName","groupName","paramName","paramDesign","propDetails","isDefault","force","NAME_INDEX$1","PROP_INDEX","TYPE_INDEX","VALUE_INDEX","Property","parent","p","designSetChanged","index","parameters","details","NAME_INDEX","PROPERTY_INDEX","COMPONENT_INDEX","PROPERTY_NAME_INDEX","PROPERTY_VALUE_INDEX","parentDesign","versionProp","jCalLen","jCalIndex","cache","nameOrObject","objects","cached","nameOrComp","removed","nameOrProp","hydratedZone","RecurExpansion","compare","maxTries","currentTry","toJSON","propertyName","iters","iterTime","iterIdx","chosenIter","Event","event","id","compareRangeException","rangeItem","occurrence","utcId","rangeExceptionId","exception","startDiff","original","newStart","startTime","endDate","duration","propName","ComponentParser","ical","components","byteToHex","unsafeStringify","getRandomValues","rnds8","rng","randomUUID","native","_v4","buf","rnds","v4","_export_sfc","sfc","IconAdd","IconDelete","slots","slot","moToSa","sunday","getFirstDay","converted","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_sfc_render","_cache","$props","resolveComponent","_component_IconDelete","_component_IconAdd","openBlock","createElementBlock","Fragment","renderList","createElementVNode","toDisplayString","createVNode","createBlock","withCtx","createCommentVNode","CalendarAvailability","getLoggerBuilder","getEmptySlots","vavailabilityToSlots","vavailability","parsedIcal","ICAL","vcalendarComp","vavailabilityComp","timezoneId","timezoneComp","availableComps","availableComp","startIcalDate","endIcalDate","slotsToVavailability","predefinedTimezoneIcal","deduplicated","acc","slots2","client","getClient","remote","generateRemoteUrl","createClient","setHeaders","token","onRequestTokenUpdate","getRequestToken","findScheduleInboxAvailability","response","xml","parseXML","availability","saveScheduleInboxAvailability","all","dayId","enableUserStatusAutomation","disableUserStatusAutomation","getCapabilities","loading","ref","saving","automated","onMounted","slotData","save","_unref","NcCheckboxRadioSwitch","hideAbsenceSettings","NcSettingsSection","AvailabilityForm","_createBlock","AbsenceForm","app","createApp","UserAvailability"],"mappings":"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,CACA,GAEI,CACI,gBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,kBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,qBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,mBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,eACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,oBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,eACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,MACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,MACzB,CACA,CACA,GAEI,CACI,iBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,eACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,uBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,kBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,gBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,kBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,kBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,kBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,gBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,sBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,MACrB,CACA,GAEI,CACI,cACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,iBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,kBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,gBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,kBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,eACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,oBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,cACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,gBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,oBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,gBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,gBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,gBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,gBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,MACrB,CACA,GAEI,CACI,iBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,MACrB,CACA,GAEI,CACI,mBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,kBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,iBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,kBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,gBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,oBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,qBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,oBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,kBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,iBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,eACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,kBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,eACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,KACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,CACA,CACA,GAEI,CACI,oBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,KACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,CACA,CACA,GAEI,CACI,mBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,kBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,oBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,iCACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,8BACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,4BACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,0BACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,6BACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,4BACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,iCACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,0BACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,6BACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,6BACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,4BACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,4BACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,gBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,mBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,KACzB,CACA,CACA,GAEI,CACI,mBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,yBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,MACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,CACA,CACA,GAEI,CACI,gBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,mBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,gBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,iBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,uBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,oBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,iBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,gBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,KACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,CACA,CACA,GAEI,CACI,wBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,KACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,CACA,CACA,GAEI,CACI,uBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,KACzB,CACA,CACA,GAEI,CACI,iBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,kBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,kBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,iBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,kBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,KACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,CACA,CACA,GAEI,CACI,oBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,MACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,CACA,CACA,GAEI,CACI,qBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,kBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,iBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,KACzB,CACA,CACA,GAEI,CACI,kBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,uBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,uBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,iBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,KACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,CACA,CACA,GAEI,CACI,iBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,KACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,CACA,CACA,GAEI,CACI,kBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,KACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,CACA,CACA,GAEI,CACI,mBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,mBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,KACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,CACA,CACA,GAEI,CACI,mBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,sBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,sBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,oBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,oBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,KACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,CACA,CACA,GAEI,CACI,kBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,MACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,MACzB,CACA,CACA,GAEI,CACI,oBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,KACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,CACA,CACA,GAEI,CACI,qBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,KACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,CACA,CACA,GAEI,CACI,kBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,qBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,oBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,oBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,iBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,kBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,KACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,CACA,CACA,GAEI,CACI,iBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,KACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,CACA,CACA,GAEI,CACI,qBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,+BACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,KACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,CACA,CACA,GAEI,CACI,uBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,KACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,CACA,CACA,GAEI,CACI,0BACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,KACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,CACA,CACA,GAEI,CACI,6BACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,KACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,CACA,CACA,GAEI,CACI,4BACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,KACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,CACA,CACA,GAEI,CACI,wBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,KACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,CACA,CACA,GAEI,CACI,4BACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,KACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,CACA,CACA,GAEI,CACI,0BACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,KACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,CACA,CACA,GAEI,CACI,iBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,KACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,CACA,CACA,GAEI,CACI,kBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,KACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,CACA,CACA,GAEI,CACI,kBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,iBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,KACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,CACA,CACA,GAEI,CACI,8BACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,KACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,CACA,CACA,GAEI,CACI,8BACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,KACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,CACA,CACA,GAEI,CACI,qBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,iBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,eACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,sBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,KACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,CACA,CACA,GAEI,CACI,wBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,iBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,kBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,iBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,kBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,qBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,oBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,KACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,CACA,CACA,GAEI,CACI,mBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,MACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,CACA,CACA,GAEI,CACI,oBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,KACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,CACA,CACA,GAEI,CACI,iBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,MACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,CACA,CACA,GAEI,CACI,qBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,KACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,CACA,CACA,GAEI,CACI,sBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,MACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,CACA,CACA,GAEI,CACI,mBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,KACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,CACA,CACA,GAEI,CACI,kBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,KACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,CACA,CACA,GAEI,CACI,oBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,MACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,CACA,CACA,GAEI,CACI,qBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,qBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,iBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,KACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,CACA,CACA,GAEI,CACI,mBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,KACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,CACA,CACA,GAEI,CACI,kBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,KACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,CACA,CACA,GAEI,CACI,eACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,KACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,CACA,CACA,GAEI,CACI,kBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,8BACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,KACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,CACA,CACA,GAEI,CACI,8BACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,KACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,CACA,CACA,GAEI,CACI,iCACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,KACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,CACA,CACA,GAEI,CACI,kBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,KACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,CACA,CACA,GAEI,CACI,iBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,sBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,KACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,CACA,CACA,GAEI,CACI,qBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,kBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,wBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,yBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,KACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,CACA,CACA,GAEI,CACI,sBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,sBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,uBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,sBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,KACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,CACA,CACA,GAEI,CACI,uBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,KACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,CACA,CACA,GAEI,CACI,iBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,iBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,mBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,KACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,CACA,CACA,GAEI,CACI,qBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,mBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,mBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,CACA,CACA,GAEI,CACI,wBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,oBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,KACzB,CACA,CACA,GAEI,CACI,uBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,MACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,MACzB,CACA,CACA,GAEI,CACI,gBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,KACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,CACA,CACA,GAEI,CACI,wBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,mBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,KACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,CACA,CACA,GAEI,CACI,mBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,mBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,oBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,qBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,wBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,sBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,gBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,KACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,CACA,CACA,GAEI,CACI,sBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,KACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,CACA,CACA,GAEI,CACI,kBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,KACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,CACA,CACA,GAEI,CACI,kBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,KACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,CACA,CACA,GAEI,CACI,kBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,oBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,KACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,CACA,CACA,GAEI,CACI,qBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,KACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,CACA,CACA,GAEI,CACI,mBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,KACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,CACA,CACA,GAEI,CACI,kBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,KACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,CACA,CACA,GAEI,CACI,sBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,KACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,CACA,CACA,GAEI,CACI,mBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,mBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,4BACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,uBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,oBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,qBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,MACzB,CACA,CACA,GAEI,CACI,oBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,qBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,mBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,mBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,MACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,MACzB,CACA,CACA,GAEI,CACI,oBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,sBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,MACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,MACzB,CACA,CACA,GAEI,CACI,YACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,cACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,aACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,MACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,MACzB,CACA,CACA,GAEI,CACI,cACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,aACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,cACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,gBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,cACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,eACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,eACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,YACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,eACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,eACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,cACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,MACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,MACzB,CACA,CACA,GAEI,CACI,eACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,cACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,aACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,kBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,eACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,OACrB,CACA,GAEI,CACI,gBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,MACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,MACzB,CACA,CACA,GAEI,CACI,aACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,YACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,aACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,gBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,iBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,MACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,MACzB,CACA,CACA,GAEI,CACI,YACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,MACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,CACA,CACA,GAEI,CACI,cACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,MACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,CACA,CACA,GAEI,CACI,mBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,iBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,YACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,eACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,gBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,eACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,gBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,iBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,MACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,MACzB,CACA,CACA,GAEI,CACI,aACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,OACrB,CACA,GAEI,CACI,iBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,eACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,iBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,OACrB,CACA,GAEI,CACI,gBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,eACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,mBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,oBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,eACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,cACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,aACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,eACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,gBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,MACrB,CACA,GAEI,CACI,cACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,cACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,eACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,MACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,MACzB,CACA,CACA,GAEI,CACI,oBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,mBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,YACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,YACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,kBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,iBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,iBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,aACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,iBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,cACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,gBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,iBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,aACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,gBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,iBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,qBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,cACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,gBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,eACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,cACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,QACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,QACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,CACA,CACA,GAEI,CACI,eACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,aACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,aACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,mBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,cACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,gBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,iBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,mBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,eACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,cACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,OACrB,CACA,GAEI,CACI,qBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,eACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,kBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,MACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,MACzB,CACA,CACA,GAEI,CACI,mBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,KACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,CACA,CACA,GAEI,CACI,kBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,MACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,MACzB,CACA,CACA,GAEI,CACI,sBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,iBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,MACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,MACzB,CACA,CACA,GAEI,CACI,mBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,MACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,MACzB,CACA,CACA,GAEI,CACI,qBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,yBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,qBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,mBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,qBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,KACzB,CACA,CACA,GAEI,CACI,qBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,MACrB,CACA,GAEI,CACI,wBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,KACzB,CACA,CACA,GAEI,CACI,mBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,KACzB,CACA,CACA,GAEI,CACI,mBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,MACrB,CACA,GAEI,CACI,kBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,OACrB,CACA,GAEI,CACI,mBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,KACzB,CACA,CACA,GAEI,CACI,qBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,MACrB,CACA,GAEI,CACI,sBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,QACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,KACzB,CACA,CACA,GAEI,CACI,sBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,KACzB,CACA,CACA,GAEI,CACI,kBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,MACrB,CACA,GAEI,CACI,mBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,KACzB,CACA,CACA,GAEI,CACI,YACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,YACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,aACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,aACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,aACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,YACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,YACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,YACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,YACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,YACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,YACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,YACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,YACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,UACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,YACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,YACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,aACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,aACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,aACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,aACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,aACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,YACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,YACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,YACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,YACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,YACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,YACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,YACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,YACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,WACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,gBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,UACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,gBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,UACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,WACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,mBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,MACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,MACzB,CACA,CACA,GAEI,CACI,iBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,MACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,MACzB,CACA,CACA,GAEI,CACI,mBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,gBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,MACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,MACzB,CACA,CACA,GAEI,CACI,kBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,MACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,MACzB,CACA,CACA,GAEI,CACI,gBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,MACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,MACzB,CACA,CACA,GAEI,CACI,oBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,MACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,MACzB,CACA,CACA,GAEI,CACI,kBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,MACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,MACzB,CACA,CACA,GAEI,CACI,mBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,MACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,MACzB,CACA,CACA,GAEI,CACI,kBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,MACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,MACzB,CACA,CACA,GAEI,CACI,kBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,MACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,MACzB,CACA,CACA,GAEI,CACI,kBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,MACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,MACzB,CACA,CACA,GAEI,CACI,oBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,MACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,MACzB,CACA,CACA,GAEI,CACI,gBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,MACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,MACzB,CACA,CACA,GAEI,CACI,mBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,MACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,MACzB,CACA,CACA,GAEI,CACI,kBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,MACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,MACzB,CACA,CACA,GAEI,CACI,kBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,MACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,MACzB,CACA,CACA,GAEI,CACI,qBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,MACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,MACzB,CACA,CACA,GAEI,CACI,kBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,gBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,MACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,MACzB,CACA,CACA,GAEI,CACI,qBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,cACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,MACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,MACzB,CACA,CACA,GAEI,CACI,eACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,gBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,MACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,MACzB,CACA,CACA,GAEI,CACI,mBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,MACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,MACzB,CACA,CACA,GAEI,CACI,gBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,MACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,MACzB,CACA,CACA,GAEI,CACI,oBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,MACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,MACzB,CACA,CACA,GAEI,CACI,gBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,MACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,MACzB,CACA,CACA,GAEI,CACI,eACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,MACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,MACzB,CACA,CACA,GAEI,CACI,mBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,MACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,MACzB,CACA,CACA,GAEI,CACI,eACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,gBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,MACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,MACzB,CACA,CACA,GAEI,CACI,gBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,iBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,MACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,MACzB,CACA,CACA,GAEI,CACI,cACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,MACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,MACzB,CACA,CACA,GAEI,CACI,eACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,MACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,MACzB,CACA,CACA,GAEI,CACI,mBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,MACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,MACzB,CACA,CACA,GAEI,CACI,gBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,MACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,MACzB,CACA,CACA,GAEI,CACI,cACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,MACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,MACzB,CACA,CACA,GAEI,CACI,cACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,MACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,MACzB,CACA,CACA,GAEI,CACI,gBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,oBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,MACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,MACzB,CACA,CACA,GAEI,CACI,kBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,MACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,MACzB,CACA,CACA,GAEI,CACI,iBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,oBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,gBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,MACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,MACzB,CACA,CACA,GAEI,CACI,eACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,MACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,MACzB,CACA,CACA,GAEI,CACI,mBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,MACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,MACzB,CACA,CACA,GAEI,CACI,iBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,MACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,MACzB,CACA,CACA,GAEI,CACI,gBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,MACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,MACzB,CACA,CACA,GAEI,CACI,mBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,kBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,MACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,MACzB,CACA,CACA,GAEI,CACI,eACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,MACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,MACzB,CACA,CACA,GAEI,CACI,iBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,MACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,MACzB,CACA,CACA,GAEI,CACI,gBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,MACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,MACzB,CACA,CACA,GAEI,CACI,iBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,MACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,MACzB,CACA,CACA,GAEI,CACI,mBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,gBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,MACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,MACzB,CACA,CACA,GAEI,CACI,gBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,MACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,MACzB,CACA,CACA,GAEI,CACI,oBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,MACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,MACzB,CACA,CACA,GAEI,CACI,gBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,MACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,MACzB,CACA,CACA,GAEI,CACI,sBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,gBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,mBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,eACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,OACrB,CACA,GAEI,CACI,gBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,mBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,cACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,kBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,mBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,iBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,iBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,eACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,MACzB,CACA,CACA,GAEI,CACI,mBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,OACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,MACzB,CACA,CACA,GAEI,CACI,uBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,kBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,QACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,QACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,MACzB,CACA,CACA,GAEI,CACI,gBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,iBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,KACzB,CACA,CACA,GAEI,CACI,gBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,oBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,kBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,eACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,EACL,EAAK,MACzB,GAEY,EAAK,CACD,EAAK,QACL,EAAK,QACL,EAAK,MACL,EAAK,kBACL,EAAK,CACD,EAAK,GACL,EAAK,KACzB,CACA,CACA,GAEI,CACI,mBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,oBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,kBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,sBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,eACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,MACrB,CACA,GAEI,CACI,mBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,qBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,iBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,oBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,iBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,oBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,OACrB,CACA,GAEI,CACI,iBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,gBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,eACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,kBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,iBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,oBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,gBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,mBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,kBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,uBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI,CACI,oBACA,CACI,EAAK,CACD,EAAK,QACL,EAAK,KACrB,CACA,GAEI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","x_google_ignoreList":[2,3,4,5,6,7,8,9]}