Compare commits

...

65 Commits

Author SHA1 Message Date
Ryan Mwangi 869beeb3d4 test(calendar): clean up merged calendars directory after tests 2024-11-27 13:25:35 +03:00
Ryan Mwangi 18215a89f6 build(logger): install winston for logging and add logs to .gitignore 2024-11-26 03:23:48 +03:00
Ryan Mwangi 577faabc3b test(logging): adjust logging to use debug levels 2024-11-26 03:09:49 +03:00
Ryan Mwangi 92c6fffe64 test(calendar): run tests for different calendar instances 2024-11-26 01:50:55 +03:00
Ryan Mwangi 51c4f5c31f test(calendar): make tests for merged date based calendars pass 2024-11-25 20:59:07 +03:00
Ryan Mwangi 5ec6341680 feat(calendar): Set the summary using prefix and override logic 2024-11-25 20:57:32 +03:00
Ryan Mwangi d6022eeb62 chore: Merge branch 'master' of forge.ftt.gmbh:janek/CalMerger 2024-11-25 20:09:02 +03:00
Ryan Mwangi 5ec42d07bb Clean up the merged calendars directory before tests 2024-11-25 20:00:36 +03:00
xeruf ff595a9f70 refactor(calendarUtil): addEventsToCalendar variable naming 2024-11-25 13:41:28 +01:00
xeruf 1706b9cad3 feat(calendarUtil): simplify event property copying 2024-11-25 13:32:47 +01:00
xeruf 2bd5c967af test(calendar): remove line ending normalization 2024-11-25 13:03:51 +01:00
xeruf c8f3771717 test(calendar): use correct subdirectory to run server 2024-11-25 13:03:47 +01:00
Ryan Mwangi 5b40bf5d75 test: add test for date based events 2024-11-25 14:35:55 +03:00
Ryan Mwangi 227ec8a211 fix(calendar): handle date events appropriately 2024-11-22 17:03:07 +03:00
Ryan Mwangi 5769c9ce5b test: update imports and add ESM-compatible __dirname handling 2024-11-21 19:56:48 +03:00
Ryan Mwangi 6a428c55e0 build(tests): ensure compatibility with ESM in Jest by updating test script - Updated test script in package.json to use with Jest. 2024-11-21 19:52:19 +03:00
Ryan Mwangi 56e5f69cbb docs: add instructions on how to build and run the server with docker 2024-11-21 15:35:48 +03:00
Ryan Mwangi e45c433797 build(docker): edit CMD to reference app.js to run the application 2024-11-21 14:53:09 +03:00
Ryan Mwangi c4c723d60a build(docker): create dockerfile and .dockerignore files 2024-11-20 19:05:39 +03:00
Ryan Mwangi 29208d8b4d build(babel): install babel/core, babel/plugin-transform-modules-commonjs, and babel-jest 2024-11-20 15:21:11 +03:00
Ryan Mwangi c1c6ae47de test: create jest.config,js file 2024-11-20 15:19:13 +03:00
Ryan Mwangi 174a845c78 fix(import): enable compatibility between ES modules and CommonJS for ical.jsRenamed ical.js to ical.cjs to explicitly mark it as a CommonJS module and used `createRequire` to import it into the ES module project. This resolves module system conflicts and ensures seamless integration without modifying ical.js content. 2024-11-20 13:58:35 +03:00
Ryan Mwangi ad3ec6f7a6 build: update start script to correctly point to src/app.js 2024-11-20 13:25:05 +03:00
Ryan Mwangi fab6753c5a fix: ensure accurate TZID inclusion in DTSTART/DTEND- Preserve TZID only when explicitly included in source calendar. - Added a helper function `hasTZID` to check for explicit TZID in raw properties.- Adjusted datetime processing logic in `processDateTimeProperty` to streamline handling of various cases. 2024-11-20 01:49:40 +03:00
Ryan Mwangi 379a79617b fix(lineendings): normalize calendar line endings to CRLF 2024-11-19 19:06:22 +03:00
Ryan Mwangi d15d0be707 feat(calendar): extract and include X-WR-TIMEZONE if available 2024-11-19 19:03:06 +03:00
Ryan Mwangi 5e3e8eab5b feat(calendar): add METHOD property to calendar component if provided 2024-11-19 15:59:23 +03:00
Ryan Mwangi 2283b82ba7 test: add google-calendar.ics test calendar 2024-11-19 15:27:07 +03:00
Ryan Mwangi 2f3b791e5d test: reorder calendar components in nextcloud-minimal test calendar 2024-11-19 15:26:06 +03:00
Ryan Mwangi ac26afe778 feat(calendars): reorder calendar components 2024-11-19 15:24:16 +03:00
Ryan Mwangi e5e9dbb680 test: add test calendar for google-calendar-minimal 2024-11-19 15:22:43 +03:00
Ryan Mwangi 8881361a1f text: create and run test for google-calendar-mininal 2024-11-19 15:21:19 +03:00
Ryan Mwangi 8965eaa319 fix(line-endings): normalize line endings to LF for cross-platform consistency- Normalized line endings in generated calendar content to LF.- Updated test assertions to handle line-ending discrepancies.- Ensured compatibility across Windows and UNIX-like systems. 2024-11-19 14:17:42 +03:00
Ryan Mwangi ca52065f66 feat(calendar): include CALSCALE and SEQUENCE details 2024-11-19 14:03:42 +03:00
Ryan Mwangi 8ab685dec0 test: run tests for nextcloud minimal alone first 2024-11-19 13:35:14 +03:00
Ryan Mwangi 585b83b03c test: run tests for nextcloud minimal alone first 2024-11-19 13:34:35 +03:00
Ryan Mwangi 73e46d7f99 feat(prodid): introduce custom PRODID for merged calendars 2024-11-19 13:32:55 +03:00
Ryan Mwangi d2b0234b4b feat(location): conditionally handle VEVENT location based on override flag 2024-11-19 13:21:22 +03:00
Ryan Mwangi 2b7002303c fix(calendar): align VEVENT property order and include time zone details 2024-11-19 01:29:32 +03:00
Ryan Mwangi 6cf5b8420e feat(calendar): copy summary, timestamps, and recurrence details for VEVENTs 2024-11-18 23:49:50 +03:00
Ryan Mwangi ddcfedbbdf feat(calendar): support extracting and writing VTIMEZONE subcomponents 2024-11-18 23:40:41 +03:00
xeruf bed3e47f8e test: add nextcloud tests 2024-11-18 13:34:14 +01:00
xeruf 1f19d8cf1f build(gitattributes): ics line feeds 2024-11-18 13:01:47 +01:00
xeruf 77e6963118 test: fix calendar paths 2024-11-18 13:00:24 +01:00
Ryan Mwangi 782e62d56d refactor:remove logging for ICAL and ICAL.component as it works now 2024-11-18 14:07:22 +03:00
Ryan Mwangi 9468e58132 test: validate fetchCalendarData reads and parses files accurately 2024-11-18 14:04:51 +03:00
Ryan Mwangi d4498cd0d8 fix: export ICAL in ical.timezones.js 2024-11-18 13:55:44 +03:00
Ryan Mwangi 3edc551031 test:add logging to confirm import and structure of ICAL 2024-11-16 02:53:06 +03:00
Ryan Mwangi 859d3f3db5 fix:pull changes from contrib 2024-11-15 13:14:53 +03:00
xeruf 00e152f08c chore(package.json): remove unused libraries 2024-11-14 13:49:01 +01:00
xeruf 864a3739b3 fix: adjust ical.js to fix import
https://github.com/kewisch/ical.js/issues/329
2024-11-14 13:45:23 +01:00
Ryan Mwangi 495fb57675 refactor:create gitattributes file 2024-11-14 15:12:43 +03:00
Ryan Mwangi ff32bb430d Merge remote-tracking branch 'contrib/master' 2024-11-14 14:04:47 +03:00
Ryan Mwangi 9a0a62675c fix:add ical.js and ical.timezones.js files in lib 2024-11-14 03:02:54 +03:00
xeruf 0a863a4eb2 test(calendarUtil): failing ical test 2024-11-13 17:43:13 +01:00
Ryan Mwangi a94727df56 build:install luxon to handle timezone parsing 2024-11-13 15:45:53 +03:00
Ryan Mwangi 7e2b846029 build:install date-fns and date-fns-tz to handle timezones 2024-11-13 15:18:25 +03:00
Ryan Mwangi cbdfdf6c97 test:update test forhandling timezones 2024-11-13 15:17:17 +03:00
Ryan Mwangi 2e9de0749d fix:handle timebased events 2024-11-13 02:54:42 +03:00
Ryan Mwangi d08d87f47c test:get date based calendar test to run 2024-11-12 23:23:59 +03:00
Ryan Mwangi 0114c94caa fix: get DTSTAMP to get parsed correctly and remain the same as the original 2024-11-12 23:13:56 +03:00
Ryan Mwangi e8582cd411 test:add logging to ensure DTSTAMP is correctly added to the new event 2024-11-12 22:53:25 +03:00
Ryan Mwangi 665c134597 test(in-progress): run tests for date based calendar 2024-11-12 22:40:28 +03:00
ryanmwangi 0b0ecaa0c2 Merge pull request 'test: preserve date-based calendar' (#4) from janek/CalMerger:master into master
Reviewed-on: #4
2024-11-12 15:38:31 +00:00
xeruf 4032e2c49d test: preserve date-based calendar 2024-11-12 16:20:53 +01:00
31 changed files with 10697 additions and 242 deletions

8
.dockerignore Normal file
View File

@ -0,0 +1,8 @@
node_modules
npm-debug.log
.DS_Store
tests
*.test.js
*.log
.git
.env

2
.gitattributes vendored Normal file
View File

@ -0,0 +1,2 @@
* text=auto eol=lf
*.ics text eol=crlf

1
.gitignore vendored
View File

@ -1,3 +1,4 @@
node_modules/
test/calendar/
calendar/
logs/

View File

@ -39,6 +39,50 @@ The application also generates a unique URL for the merged calendar and updates
```bash
npm start
```
## Building and Running with Docker
### 1. Build the Docker Image
Run the following command to build the Docker image:
```bash
docker build -t calmerger-app .
```
### 2. Run the Docker Container
To start the container, use:
```bash
docker run -d --name calmerger -p 3000:3000 calmerger-app
```
This maps the container's port `3000` to the host system's port `3000`. The application will be accessible at [http://localhost:3000](http://localhost:3000).
### 3. Using Docker Compose (Optional)
If you prefer to use Docker Compose, ensure you have a `docker-compose.yml` file in your project directory. Then, run:
```bash
docker-compose up -d
```
This will automatically build and start the container based on the configuration in the `docker-compose.yml` file.
### 4. Stopping the Docker Container
To stop the running container, use:
```bash
docker stop calmerger
```
To remove the container:
```bash
docker rm calmerger
```
## Running Tests

20
dockerfile Normal file
View File

@ -0,0 +1,20 @@
# Use an official Node.js runtime as a parent image
FROM node:18-alpine
# Set working directory inside the container
WORKDIR /usr/src/app
# Copy package.json and package-lock.json for installing dependencies
COPY package*.json ./
# Install dependencies
RUN npm install --production
# Copy the rest of the project files
COPY . .
# Expose the port your application runs on (if applicable)
EXPOSE 3000
# Command to run the application
CMD ["node", "src/app.js"]

7
jest.config.js Normal file
View File

@ -0,0 +1,7 @@
export default {
transform: {
'^.+\\.jsx?$': 'babel-jest',
},
moduleFileExtensions: ['js', 'jsx'],
testEnvironment: 'node',
};

287
package-lock.json generated
View File

@ -12,15 +12,17 @@
"axios": "^1.7.7",
"calendar-merger": "file:",
"express": "^4.17.1",
"ical": "^0.8.0",
"ical-generator": "^0.2.10",
"ical.js": "^2.1.0",
"node-cron": "^2.0.3",
"supertest": "^7.0.0"
"supertest": "^7.0.0",
"winston": "^3.17.0"
},
"devDependencies": {
"@babel/core": "^7.26.0",
"@babel/plugin-transform-modules-commonjs": "^7.25.9",
"@babel/preset-env": "^7.26.0",
"@babel/register": "^7.25.9",
"babel-jest": "^29.7.0",
"jest": "^29.7.0",
"rewire": "^7.0.0"
}
@ -1808,6 +1810,24 @@
"integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==",
"dev": true
},
"node_modules/@colors/colors": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz",
"integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==",
"engines": {
"node": ">=0.1.90"
}
},
"node_modules/@dabh/diagnostics": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz",
"integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==",
"dependencies": {
"colorspace": "1.1.x",
"enabled": "2.0.x",
"kuler": "^2.0.0"
}
},
"node_modules/@eslint-community/eslint-utils": {
"version": "4.4.1",
"resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz",
@ -2492,6 +2512,11 @@
"integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==",
"dev": true
},
"node_modules/@types/triple-beam": {
"version": "1.3.5",
"resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz",
"integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw=="
},
"node_modules/@types/yargs": {
"version": "17.0.33",
"resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz",
@ -2631,7 +2656,13 @@
"node_modules/asap": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
"integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA=="
"integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==",
"license": "MIT"
},
"node_modules/async": {
"version": "3.2.6",
"resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz",
"integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA=="
},
"node_modules/asynckit": {
"version": "0.4.0",
@ -3053,6 +3084,15 @@
"integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==",
"dev": true
},
"node_modules/color": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz",
"integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==",
"dependencies": {
"color-convert": "^1.9.3",
"color-string": "^1.6.0"
}
},
"node_modules/color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
@ -3068,8 +3108,38 @@
"node_modules/color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
"dev": true
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
},
"node_modules/color-string": {
"version": "1.9.1",
"resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz",
"integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==",
"dependencies": {
"color-name": "^1.0.0",
"simple-swizzle": "^0.2.2"
}
},
"node_modules/color/node_modules/color-convert": {
"version": "1.9.3",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
"integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
"dependencies": {
"color-name": "1.1.3"
}
},
"node_modules/color/node_modules/color-name": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
"integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
},
"node_modules/colorspace": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz",
"integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==",
"dependencies": {
"color": "^3.1.3",
"text-hex": "1.0.x"
}
},
"node_modules/combined-stream": {
"version": "1.0.8",
@ -3092,6 +3162,7 @@
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz",
"integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==",
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
@ -3143,7 +3214,8 @@
"node_modules/cookiejar": {
"version": "2.1.4",
"resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz",
"integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw=="
"integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==",
"license": "MIT"
},
"node_modules/core-js-compat": {
"version": "3.38.1",
@ -3180,9 +3252,9 @@
}
},
"node_modules/cross-spawn": {
"version": "7.0.3",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
"integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
"version": "7.0.6",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
"integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
"dev": true,
"dependencies": {
"path-key": "^3.1.0",
@ -3284,6 +3356,7 @@
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz",
"integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==",
"license": "ISC",
"dependencies": {
"asap": "^2.0.0",
"wrappy": "1"
@ -3339,6 +3412,11 @@
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
"dev": true
},
"node_modules/enabled": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz",
"integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ=="
},
"node_modules/encodeurl": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
@ -3798,7 +3876,8 @@
"node_modules/fast-safe-stringify": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz",
"integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA=="
"integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==",
"license": "MIT"
},
"node_modules/fastq": {
"version": "1.17.1",
@ -3818,6 +3897,11 @@
"bser": "2.1.1"
}
},
"node_modules/fecha": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz",
"integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw=="
},
"node_modules/file-entry-cache": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
@ -4001,6 +4085,11 @@
"integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==",
"dev": true
},
"node_modules/fn.name": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz",
"integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw=="
},
"node_modules/follow-redirects": {
"version": "1.15.9",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz",
@ -4037,6 +4126,7 @@
"version": "3.5.2",
"resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.2.tgz",
"integrity": "sha512-Jqc1btCy3QzRbJaICGwKcBfGWuLADRerLzDqi2NwSt/UkXLsHJw2TVResiaoBufHVHy9aSgClOHCeJsSsFLTbg==",
"license": "MIT",
"dependencies": {
"dezalgo": "^1.0.4",
"hexoid": "^2.0.0",
@ -4269,6 +4359,7 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/hexoid/-/hexoid-2.0.0.tgz",
"integrity": "sha512-qlspKUK7IlSQv2o+5I7yhUd7TxlOG2Vr5LTa3ve2XSNVKAL/n/u/7KLvKmFNimomDIKvZFXWHv0T12mv7rT8Aw==",
"license": "MIT",
"engines": {
"node": ">=8"
}
@ -4303,19 +4394,6 @@
"node": ">=10.17.0"
}
},
"node_modules/ical": {
"version": "0.8.0",
"resolved": "https://registry.npmjs.org/ical/-/ical-0.8.0.tgz",
"integrity": "sha512-/viUSb/RGLLnlgm0lWRlPBtVeQguQRErSPYl3ugnUaKUnzQswKqOG3M8/P1v1AB5NJwlHTuvTq1cs4mpeG2rCg==",
"dependencies": {
"rrule": "2.4.1"
}
},
"node_modules/ical-generator": {
"version": "0.2.10",
"resolved": "https://registry.npmjs.org/ical-generator/-/ical-generator-0.2.10.tgz",
"integrity": "sha512-q4TRRGIaG8McNeZRx9sF120vxVuZbPSAMiwn9GgI9+iRrrtUsLZnVUAO7dPP7XSXt+yrrrxP2LbQ+KEnUC6+JQ=="
},
"node_modules/ical.js": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/ical.js/-/ical.js-2.1.0.tgz",
@ -4512,7 +4590,6 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
"integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
"dev": true,
"engines": {
"node": ">=8"
},
@ -5297,6 +5374,11 @@
"node": ">=6"
}
},
"node_modules/kuler": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz",
"integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A=="
},
"node_modules/leven": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
@ -5349,6 +5431,27 @@
"integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
"dev": true
},
"node_modules/logform": {
"version": "2.7.0",
"resolved": "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz",
"integrity": "sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==",
"dependencies": {
"@colors/colors": "1.6.0",
"@types/triple-beam": "^1.3.2",
"fecha": "^4.2.0",
"ms": "^2.1.1",
"safe-stable-stringify": "^2.3.1",
"triple-beam": "^1.3.0"
},
"engines": {
"node": ">= 12.0.0"
}
},
"node_modules/logform/node_modules/ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
},
"node_modules/lru-cache": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
@ -5358,15 +5461,6 @@
"yallist": "^3.0.2"
}
},
"node_modules/luxon": {
"version": "1.28.1",
"resolved": "https://registry.npmjs.org/luxon/-/luxon-1.28.1.tgz",
"integrity": "sha512-gYHAa180mKrNIUJCbwpmD0aTu9kV0dREDrwNnuyFAsO1Wt0EVYSZelPnJlbj9HplzXX/YWXHFTL45kvZ53M0pw==",
"optional": true,
"engines": {
"node": "*"
}
},
"node_modules/make-dir": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz",
@ -5592,6 +5686,14 @@
"wrappy": "1"
}
},
"node_modules/one-time": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz",
"integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==",
"dependencies": {
"fn.name": "1.x.x"
}
},
"node_modules/onetime": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
@ -5959,6 +6061,19 @@
"integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
"dev": true
},
"node_modules/readable-stream": {
"version": "3.6.2",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
"integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
"dependencies": {
"inherits": "^2.0.3",
"string_decoder": "^1.1.1",
"util-deprecate": "^1.0.1"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/regenerate": {
"version": "1.4.2",
"resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
@ -6118,14 +6233,6 @@
"url": "https://github.com/sponsors/isaacs"
}
},
"node_modules/rrule": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/rrule/-/rrule-2.4.1.tgz",
"integrity": "sha512-+NcvhETefswZq13T8nkuEnnQ6YgUeZaqMqVbp+ZiFDPCbp3AVgQIwUvNVDdMNrP05bKZG9ddDULFp0qZZYDrxg==",
"optionalDependencies": {
"luxon": "^1.3.3"
}
},
"node_modules/run-parallel": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
@ -6168,6 +6275,14 @@
}
]
},
"node_modules/safe-stable-stringify": {
"version": "2.5.0",
"resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz",
"integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==",
"engines": {
"node": ">=10"
}
},
"node_modules/safer-buffer": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
@ -6309,6 +6424,19 @@
"integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
"dev": true
},
"node_modules/simple-swizzle": {
"version": "0.2.2",
"resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
"integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==",
"dependencies": {
"is-arrayish": "^0.3.1"
}
},
"node_modules/simple-swizzle/node_modules/is-arrayish": {
"version": "0.3.2",
"resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
"integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ=="
},
"node_modules/sisteransi": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz",
@ -6349,6 +6477,14 @@
"integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
"dev": true
},
"node_modules/stack-trace": {
"version": "0.0.10",
"resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
"integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==",
"engines": {
"node": "*"
}
},
"node_modules/stack-utils": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz",
@ -6369,6 +6505,14 @@
"node": ">= 0.8"
}
},
"node_modules/string_decoder": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
"integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
"dependencies": {
"safe-buffer": "~5.2.0"
}
},
"node_modules/string-length": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz",
@ -6442,6 +6586,7 @@
"version": "9.0.2",
"resolved": "https://registry.npmjs.org/superagent/-/superagent-9.0.2.tgz",
"integrity": "sha512-xuW7dzkUpcJq7QnhOsnNUgtYp3xRwpt2F7abdRYIpCsAt0hhUqia0EdxyXZQQpNmGtsCzYHryaKSV3q3GJnq7w==",
"license": "MIT",
"dependencies": {
"component-emitter": "^1.3.0",
"cookiejar": "^2.1.4",
@ -6461,6 +6606,7 @@
"version": "4.3.7",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
"integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
"license": "MIT",
"dependencies": {
"ms": "^2.1.3"
},
@ -6477,6 +6623,7 @@
"version": "2.6.0",
"resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz",
"integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==",
"license": "MIT",
"bin": {
"mime": "cli.js"
},
@ -6487,12 +6634,14 @@
"node_modules/superagent/node_modules/ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
"license": "MIT"
},
"node_modules/supertest": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/supertest/-/supertest-7.0.0.tgz",
"integrity": "sha512-qlsr7fIC0lSddmA3tzojvzubYxvlGtzumcdHgPwbFWMISQwL22MhM2Y3LNt+6w9Yyx7559VW5ab70dgphm8qQA==",
"license": "MIT",
"dependencies": {
"methods": "^1.1.2",
"superagent": "^9.0.1"
@ -6539,6 +6688,11 @@
"node": ">=8"
}
},
"node_modules/text-hex": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz",
"integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg=="
},
"node_modules/text-table": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
@ -6571,6 +6725,14 @@
"node": ">=0.6"
}
},
"node_modules/triple-beam": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz",
"integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==",
"engines": {
"node": ">= 14.0.0"
}
},
"node_modules/type-check": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
@ -6714,6 +6876,11 @@
"punycode": "^2.1.0"
}
},
"node_modules/util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
},
"node_modules/utils-merge": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
@ -6768,6 +6935,40 @@
"node": ">= 8"
}
},
"node_modules/winston": {
"version": "3.17.0",
"resolved": "https://registry.npmjs.org/winston/-/winston-3.17.0.tgz",
"integrity": "sha512-DLiFIXYC5fMPxaRg832S6F5mJYvePtmO5G9v9IgUFPhXm9/GkXarH/TUrBAVzhTCzAj9anE/+GjrgXp/54nOgw==",
"dependencies": {
"@colors/colors": "^1.6.0",
"@dabh/diagnostics": "^2.0.2",
"async": "^3.2.3",
"is-stream": "^2.0.0",
"logform": "^2.7.0",
"one-time": "^1.0.0",
"readable-stream": "^3.4.0",
"safe-stable-stringify": "^2.3.1",
"stack-trace": "0.0.x",
"triple-beam": "^1.3.0",
"winston-transport": "^4.9.0"
},
"engines": {
"node": ">= 12.0.0"
}
},
"node_modules/winston-transport": {
"version": "4.9.0",
"resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.9.0.tgz",
"integrity": "sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==",
"dependencies": {
"logform": "^2.7.0",
"readable-stream": "^3.6.2",
"triple-beam": "^1.3.0"
},
"engines": {
"node": ">= 12.0.0"
}
},
"node_modules/word-wrap": {
"version": "1.2.5",
"resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",

View File

@ -2,27 +2,29 @@
"name": "calendar-merger",
"version": "1.1.0",
"scripts": {
"start": "node app.js",
"test": "jest ./test"
"start": "node src/app.js",
"test": "node --experimental-vm-modules ./node_modules/jest/bin/jest.js ./test"
},
"dependencies": {
"axios": "^1.7.7",
"calendar-merger": "file:",
"express": "^4.17.1",
"ical": "^0.8.0",
"ical-generator": "^0.2.10",
"ical.js": "^2.1.0",
"node-cron": "^2.0.3",
"supertest": "^7.0.0"
"supertest": "^7.0.0",
"winston": "^3.17.0"
},
"description": "calmerger",
"main": "server.js",
"type": "module",
"author": "Ryan",
"type": "module",
"license": "ISC",
"devDependencies": {
"@babel/core": "^7.26.0",
"@babel/plugin-transform-modules-commonjs": "^7.25.9",
"@babel/preset-env": "^7.26.0",
"@babel/register": "^7.25.9",
"babel-jest": "^29.7.0",
"jest": "^29.7.0",
"rewire": "^7.0.0"
}

View File

@ -1,7 +1,8 @@
import ICAL from 'ical.js';
import ICAL from './lib/ical.timezones.js';
import fs from 'fs';
import path from 'path';
import axios from 'axios';
import logger from './logger.js';
export const MERGED_CALENDARS_DIR = path.join(process.cwd(), 'calendar');
@ -16,52 +17,107 @@ export async function fetchCalendarData(calendar) {
const isFilePath = !calendar.url.startsWith('http');
try {
if (isFilePath) {
// logger.debug(`Reading calendar from file: ${calendar.url}`);
return { data: fs.readFileSync(path.resolve(calendar.url), 'utf-8'), ...calendar };
} else {
// logger.debug(`Fetching calendar from URL: ${calendar.url}`);
const response = await axios.get(calendar.url);
return { data: response.data, ...calendar };
}
} catch (error) {
logger.error(`Error retrieving calendar from ${calendar.url}: ${error.message}`);
throw new Error(`Error retrieving calendar from ${calendar.url}: ${error.message}`);
}
}
// Create a top-level VCALENDAR component
export function createCalendarComponent(name) {
logger.info(`Creating calendar component with name: ${name}`);
const calendarComponent = new ICAL.Component(['vcalendar', [], []]);
calendarComponent.updatePropertyWithValue('prodid', '-//Your Product ID//EN');
calendarComponent.updatePropertyWithValue('version', '2.0');
calendarComponent.updatePropertyWithValue('name', name);
calendarComponent.updatePropertyWithValue('prodid', '-//CalMerge//Calendar Merger 1.0//EN');
calendarComponent.updatePropertyWithValue('version', '2.0');
calendarComponent.updatePropertyWithValue('calscale', 'GREGORIAN');
return calendarComponent;
}
// Add events to the calendar component
export function addEventsToCalendar(calendarComponent, results) {
results.forEach((result) => {
const parsed = ICAL.parse(result.data);
const component = new ICAL.Component(parsed);
export function addEventsToCalendar(newCalendar, calendars) {
let defaultTimeZone = null; // To store the first found X-WR-TIMEZONE
calendars.forEach((calendarRaw) => {
try {
const { data, prefix, override } = calendarRaw; // Extract prefix and override
const calendar = new ICAL.Component(ICAL.parse(calendarRaw.data));
// Extract METHOD from the parsed data (if available)
const method = calendar.getFirstPropertyValue('method');
if (method) {
logger.info(`Extracted METHOD: ${method}`);
// Only add the METHOD property once
if (!newCalendar.getFirstPropertyValue('method')) {
newCalendar.updatePropertyWithValue('method', method.toUpperCase());
}
}
// Extract X-WR-TIMEZONE if available
const wrTimeZone = calendar.getFirstPropertyValue('x-wr-timezone');
if (wrTimeZone) {
logger.info(`Extracted X-WR-TIMEZONE: ${wrTimeZone}`);
// Set it as the default if not already set
if (!defaultTimeZone) {
defaultTimeZone = wrTimeZone;
if (!newCalendar.getFirstPropertyValue('x-wr-timezone')) {
newCalendar.updatePropertyWithValue('x-wr-timezone', defaultTimeZone);
}
}
}
component.getAllSubcomponents('vevent').forEach((event) => {
const vevent = new ICAL.Event(event);
const newEvent = new ICAL.Component('vevent');
// Extract and add VTIMEZONE components
const timezones = calendar.getAllSubcomponents('vtimezone');
timezones.forEach((timezone) => {
const tzid = timezone.getFirstPropertyValue('tzid');
if (!newCalendar.getFirstSubcomponent((comp) => comp.name === 'vtimezone' && comp.getFirstPropertyValue('tzid') === tzid)) {
logger.debug(`Adding VTIMEZONE: ${tzid}`);
newCalendar.addSubcomponent(timezone);
}
});
const startDate = vevent.startDate && ICAL.Time.fromJSDate(vevent.startDate.toJSDate());
const endDate = vevent.endDate && ICAL.Time.fromJSDate(vevent.endDate.toJSDate());
// Process VEVENT components
calendar.getAllSubcomponents('vevent').forEach((vevent) => {
const event = new ICAL.Event(vevent);
const newEvent = new ICAL.Event();
newEvent.updatePropertyWithValue('uid', vevent.uid);
newEvent.updatePropertyWithValue('summary', `${result.prefix} ${vevent.summary}`);
newEvent.updatePropertyWithValue('dtstart', startDate);
newEvent.updatePropertyWithValue('dtend', endDate);
newEvent.uid = event.uid;
newEvent.startDate = event.startDate;
newEvent.endDate = event.endDate;
calendarComponent.addSubcomponent(newEvent);
});
const dtstamp = vevent.getFirstPropertyValue('dtstamp');
if (dtstamp) newEvent.component.updatePropertyWithValue('dtstamp', dtstamp);
if (override) {
newEvent.summary = prefix || 'Busy';
} else {
newEvent.summary = prefix ? `${prefix} ${event.summary}` : event.summary;
if (event.location) newEvent.location = event.location;
}
const rrule = vevent.getFirstPropertyValue('rrule');
if (rrule) newEvent.component.updatePropertyWithValue('rrule', rrule);
// Add the VEVENT to the calendar
newCalendar.addSubcomponent(newEvent.component);
});
} catch (error) {
logger.error(`Error processing calendar: ${error.message}`);
}
});
}
// Save calendar data to file
export function saveCalendarFile(filename, content) {
const normalizedContent = content.replace(/\r?\n/g, '\r\n').trimEnd(); // Normalize to CRLF
const filePath = path.join(MERGED_CALENDARS_DIR, filename);
console.log(`Saving calendar data to file: ${filePath}`);
fs.writeFileSync(filePath, content);
logger.info(`Saving calendar data to file: ${filePath}`);
fs.writeFileSync(filePath, normalizedContent);
return filePath;
}

9501
src/lib/ical.cjs Normal file

File diff suppressed because it is too large Load Diff

348
src/lib/ical.timezones.js Normal file
View File

@ -0,0 +1,348 @@
import { createRequire } from 'module';
const require = createRequire(import.meta.url);
const ICAL = require('./ical.cjs');
(function() {
function register(tzdata) { ICAL.TimezoneService.register(ICAL.Component.fromString("BEGIN:VTIMEZONE\r\n" + tzdata + "\r\nEND:VTIMEZONE")) };
ICAL.TimezoneService.IANA_TZDB_VERSION = "2024b";
register("TZID:Africa/Abidjan\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Africa/Abidjan\r\nBEGIN:STANDARD\r\nTZNAME:GMT\r\nTZOFFSETFROM:+0000\r\nTZOFFSETTO:+0000\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Africa/Algiers\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Africa/Algiers\r\nBEGIN:STANDARD\r\nTZNAME:CET\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0100\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Africa/Bissau\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Africa/Bissau\r\nBEGIN:STANDARD\r\nTZNAME:GMT\r\nTZOFFSETFROM:+0000\r\nTZOFFSETTO:+0000\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Africa/Cairo\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Africa/Cairo\r\nBEGIN:DAYLIGHT\r\nTZNAME:EEST\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0300\r\nDTSTART:19700424T000000\r\nRRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=-1FR\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:EET\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0200\r\nDTSTART:19701030T000000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1FR\r\nEND:STANDARD");
register("TZID:Africa/Casablanca\r\nTZUNTIL:20870511T020001Z\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Africa/Casablanca\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0100\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Africa/Ceuta\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Africa/Ceuta\r\nBEGIN:DAYLIGHT\r\nTZNAME:CEST\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0200\r\nDTSTART:19700329T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:CET\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0100\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD");
register("TZID:Africa/El_Aaiun\r\nTZUNTIL:20870511T020001Z\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Africa/El_Aaiun\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0100\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Africa/Johannesburg\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Africa/Johannesburg\r\nBEGIN:STANDARD\r\nTZNAME:SAST\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0200\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Africa/Juba\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Africa/Juba\r\nBEGIN:STANDARD\r\nTZNAME:CAT\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0200\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Africa/Khartoum\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Africa/Khartoum\r\nBEGIN:STANDARD\r\nTZNAME:CAT\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0200\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Africa/Lagos\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Africa/Lagos\r\nBEGIN:STANDARD\r\nTZNAME:WAT\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0100\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Africa/Maputo\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Africa/Maputo\r\nBEGIN:STANDARD\r\nTZNAME:CAT\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0200\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Africa/Monrovia\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Africa/Monrovia\r\nBEGIN:STANDARD\r\nTZNAME:GMT\r\nTZOFFSETFROM:+0000\r\nTZOFFSETTO:+0000\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Africa/Nairobi\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Africa/Nairobi\r\nBEGIN:STANDARD\r\nTZNAME:EAT\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Africa/Ndjamena\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Africa/Ndjamena\r\nBEGIN:STANDARD\r\nTZNAME:WAT\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0100\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Africa/Sao_Tome\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Africa/Sao_Tome\r\nBEGIN:STANDARD\r\nTZNAME:GMT\r\nTZOFFSETFROM:+0000\r\nTZOFFSETTO:+0000\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Africa/Tripoli\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Africa/Tripoli\r\nBEGIN:STANDARD\r\nTZNAME:EET\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0200\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Africa/Tunis\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Africa/Tunis\r\nBEGIN:STANDARD\r\nTZNAME:CET\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0100\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Africa/Windhoek\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Africa/Windhoek\r\nBEGIN:STANDARD\r\nTZNAME:CAT\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0200\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Adak\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Adak\r\nBEGIN:DAYLIGHT\r\nTZNAME:HDT\r\nTZOFFSETFROM:-1000\r\nTZOFFSETTO:-0900\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:HST\r\nTZOFFSETFROM:-0900\r\nTZOFFSETTO:-1000\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/Anchorage\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Anchorage\r\nBEGIN:DAYLIGHT\r\nTZNAME:AKDT\r\nTZOFFSETFROM:-0900\r\nTZOFFSETTO:-0800\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:AKST\r\nTZOFFSETFROM:-0800\r\nTZOFFSETTO:-0900\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/Araguaina\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Araguaina\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Argentina/Buenos_Aires\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Argentina/Buenos_Aires\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Argentina/Catamarca\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Argentina/Catamarca\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Argentina/Cordoba\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Argentina/Cordoba\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Argentina/Jujuy\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Argentina/Jujuy\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Argentina/La_Rioja\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Argentina/La_Rioja\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Argentina/Mendoza\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Argentina/Mendoza\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Argentina/Rio_Gallegos\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Argentina/Rio_Gallegos\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Argentina/Salta\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Argentina/Salta\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Argentina/San_Juan\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Argentina/San_Juan\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Argentina/San_Luis\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Argentina/San_Luis\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Argentina/Tucuman\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Argentina/Tucuman\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Argentina/Ushuaia\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Argentina/Ushuaia\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Asuncion\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Asuncion\r\nBEGIN:DAYLIGHT\r\nTZNAME:%z\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0300\r\nDTSTART:19701004T000000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0400\r\nDTSTART:19700322T000000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=4SU\r\nEND:STANDARD");
register("TZID:America/Bahia\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Bahia\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Bahia_Banderas\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Bahia_Banderas\r\nBEGIN:STANDARD\r\nTZNAME:CST\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0600\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Barbados\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Barbados\r\nBEGIN:STANDARD\r\nTZNAME:AST\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0400\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Belem\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Belem\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Belize\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Belize\r\nBEGIN:STANDARD\r\nTZNAME:CST\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0600\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Boa_Vista\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Boa_Vista\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0400\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Bogota\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Bogota\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0500\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Boise\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Boise\r\nBEGIN:DAYLIGHT\r\nTZNAME:MDT\r\nTZOFFSETFROM:-0700\r\nTZOFFSETTO:-0600\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:MST\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0700\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/Cambridge_Bay\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Cambridge_Bay\r\nBEGIN:DAYLIGHT\r\nTZNAME:MDT\r\nTZOFFSETFROM:-0700\r\nTZOFFSETTO:-0600\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:MST\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0700\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/Campo_Grande\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Campo_Grande\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0400\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Cancun\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Cancun\r\nBEGIN:STANDARD\r\nTZNAME:EST\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0500\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Caracas\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Caracas\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0400\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Cayenne\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Cayenne\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Chicago\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Chicago\r\nBEGIN:DAYLIGHT\r\nTZNAME:CDT\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0500\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:CST\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0600\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/Chihuahua\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Chihuahua\r\nBEGIN:STANDARD\r\nTZNAME:CST\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0600\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Ciudad_Juarez\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Ciudad_Juarez\r\nBEGIN:DAYLIGHT\r\nTZNAME:MDT\r\nTZOFFSETFROM:-0700\r\nTZOFFSETTO:-0600\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:MST\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0700\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/Costa_Rica\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Costa_Rica\r\nBEGIN:STANDARD\r\nTZNAME:CST\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0600\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Cuiaba\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Cuiaba\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0400\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Danmarkshavn\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Danmarkshavn\r\nBEGIN:STANDARD\r\nTZNAME:GMT\r\nTZOFFSETFROM:+0000\r\nTZOFFSETTO:+0000\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Dawson\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Dawson\r\nBEGIN:STANDARD\r\nTZNAME:MST\r\nTZOFFSETFROM:-0700\r\nTZOFFSETTO:-0700\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Dawson_Creek\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Dawson_Creek\r\nBEGIN:STANDARD\r\nTZNAME:MST\r\nTZOFFSETFROM:-0700\r\nTZOFFSETTO:-0700\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Denver\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Denver\r\nBEGIN:DAYLIGHT\r\nTZNAME:MDT\r\nTZOFFSETFROM:-0700\r\nTZOFFSETTO:-0600\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:MST\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0700\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/Detroit\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Detroit\r\nBEGIN:DAYLIGHT\r\nTZNAME:EDT\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0400\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:EST\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0500\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/Edmonton\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Edmonton\r\nBEGIN:DAYLIGHT\r\nTZNAME:MDT\r\nTZOFFSETFROM:-0700\r\nTZOFFSETTO:-0600\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:MST\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0700\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/Eirunepe\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Eirunepe\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0500\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/El_Salvador\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/El_Salvador\r\nBEGIN:STANDARD\r\nTZNAME:CST\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0600\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Fort_Nelson\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Fort_Nelson\r\nBEGIN:STANDARD\r\nTZNAME:MST\r\nTZOFFSETFROM:-0700\r\nTZOFFSETTO:-0700\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Fortaleza\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Fortaleza\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Glace_Bay\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Glace_Bay\r\nBEGIN:DAYLIGHT\r\nTZNAME:ADT\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0300\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:AST\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0400\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/Goose_Bay\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Goose_Bay\r\nBEGIN:STANDARD\r\nTZNAME:AST\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0400\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZNAME:ADT\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0300\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT");
register("TZID:America/Grand_Turk\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Grand_Turk\r\nBEGIN:STANDARD\r\nTZNAME:EST\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0500\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZNAME:EDT\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0400\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT");
register("TZID:America/Guatemala\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Guatemala\r\nBEGIN:STANDARD\r\nTZNAME:CST\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0600\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Guayaquil\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Guayaquil\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0500\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Guyana\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Guyana\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0400\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Halifax\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Halifax\r\nBEGIN:DAYLIGHT\r\nTZNAME:ADT\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0300\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:AST\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0400\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/Havana\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Havana\r\nBEGIN:STANDARD\r\nTZNAME:CST\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0500\r\nDTSTART:19701101T010000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZNAME:CDT\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0400\r\nDTSTART:19700308T000000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT");
register("TZID:America/Hermosillo\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Hermosillo\r\nBEGIN:STANDARD\r\nTZNAME:MST\r\nTZOFFSETFROM:-0700\r\nTZOFFSETTO:-0700\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Indiana/Indianapolis\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Indiana/Indianapolis\r\nBEGIN:DAYLIGHT\r\nTZNAME:EDT\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0400\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:EST\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0500\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/Indiana/Knox\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Indiana/Knox\r\nBEGIN:DAYLIGHT\r\nTZNAME:CDT\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0500\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:CST\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0600\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/Indiana/Marengo\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Indiana/Marengo\r\nBEGIN:DAYLIGHT\r\nTZNAME:EDT\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0400\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:EST\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0500\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/Indiana/Petersburg\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Indiana/Petersburg\r\nBEGIN:DAYLIGHT\r\nTZNAME:EDT\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0400\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:EST\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0500\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/Indiana/Tell_City\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Indiana/Tell_City\r\nBEGIN:DAYLIGHT\r\nTZNAME:CDT\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0500\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:CST\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0600\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/Indiana/Vevay\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Indiana/Vevay\r\nBEGIN:DAYLIGHT\r\nTZNAME:EDT\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0400\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:EST\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0500\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/Indiana/Vincennes\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Indiana/Vincennes\r\nBEGIN:DAYLIGHT\r\nTZNAME:EDT\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0400\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:EST\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0500\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/Indiana/Winamac\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Indiana/Winamac\r\nBEGIN:STANDARD\r\nTZNAME:EST\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0500\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZNAME:EDT\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0400\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT");
register("TZID:America/Inuvik\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Inuvik\r\nBEGIN:DAYLIGHT\r\nTZNAME:MDT\r\nTZOFFSETFROM:-0700\r\nTZOFFSETTO:-0600\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:MST\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0700\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/Iqaluit\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Iqaluit\r\nBEGIN:DAYLIGHT\r\nTZNAME:EDT\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0400\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:EST\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0500\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/Jamaica\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Jamaica\r\nBEGIN:STANDARD\r\nTZNAME:EST\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0500\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Juneau\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Juneau\r\nBEGIN:DAYLIGHT\r\nTZNAME:AKDT\r\nTZOFFSETFROM:-0900\r\nTZOFFSETTO:-0800\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:AKST\r\nTZOFFSETFROM:-0800\r\nTZOFFSETTO:-0900\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/Kentucky/Louisville\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Kentucky/Louisville\r\nBEGIN:DAYLIGHT\r\nTZNAME:EDT\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0400\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:EST\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0500\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/Kentucky/Monticello\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Kentucky/Monticello\r\nBEGIN:DAYLIGHT\r\nTZNAME:EDT\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0400\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:EST\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0500\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/La_Paz\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/La_Paz\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0400\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Lima\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Lima\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0500\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Los_Angeles\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Los_Angeles\r\nBEGIN:DAYLIGHT\r\nTZNAME:PDT\r\nTZOFFSETFROM:-0800\r\nTZOFFSETTO:-0700\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:PST\r\nTZOFFSETFROM:-0700\r\nTZOFFSETTO:-0800\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/Maceio\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Maceio\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Managua\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Managua\r\nBEGIN:STANDARD\r\nTZNAME:CST\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0600\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Manaus\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Manaus\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0400\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Martinique\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Martinique\r\nBEGIN:STANDARD\r\nTZNAME:AST\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0400\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Matamoros\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Matamoros\r\nBEGIN:DAYLIGHT\r\nTZNAME:CDT\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0500\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:CST\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0600\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/Mazatlan\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Mazatlan\r\nBEGIN:STANDARD\r\nTZNAME:MST\r\nTZOFFSETFROM:-0700\r\nTZOFFSETTO:-0700\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Menominee\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Menominee\r\nBEGIN:DAYLIGHT\r\nTZNAME:CDT\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0500\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:CST\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0600\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/Merida\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Merida\r\nBEGIN:STANDARD\r\nTZNAME:CST\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0600\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Metlakatla\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Metlakatla\r\nBEGIN:DAYLIGHT\r\nTZNAME:AKDT\r\nTZOFFSETFROM:-0900\r\nTZOFFSETTO:-0800\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:AKST\r\nTZOFFSETFROM:-0800\r\nTZOFFSETTO:-0900\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/Mexico_City\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Mexico_City\r\nBEGIN:STANDARD\r\nTZNAME:CST\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0600\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Miquelon\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Miquelon\r\nBEGIN:DAYLIGHT\r\nTZNAME:%z\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0200\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0200\r\nTZOFFSETTO:-0300\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/Moncton\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Moncton\r\nBEGIN:DAYLIGHT\r\nTZNAME:ADT\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0300\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:AST\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0400\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/Monterrey\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Monterrey\r\nBEGIN:STANDARD\r\nTZNAME:CST\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0600\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Montevideo\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Montevideo\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/New_York\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/New_York\r\nBEGIN:DAYLIGHT\r\nTZNAME:EDT\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0400\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:EST\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0500\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/Nome\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Nome\r\nBEGIN:DAYLIGHT\r\nTZNAME:AKDT\r\nTZOFFSETFROM:-0900\r\nTZOFFSETTO:-0800\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:AKST\r\nTZOFFSETFROM:-0800\r\nTZOFFSETTO:-0900\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/Noronha\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Noronha\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0200\r\nTZOFFSETTO:-0200\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/North_Dakota/Beulah\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/North_Dakota/Beulah\r\nBEGIN:DAYLIGHT\r\nTZNAME:CDT\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0500\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:CST\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0600\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/North_Dakota/Center\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/North_Dakota/Center\r\nBEGIN:DAYLIGHT\r\nTZNAME:CDT\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0500\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:CST\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0600\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/North_Dakota/New_Salem\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/North_Dakota/New_Salem\r\nBEGIN:DAYLIGHT\r\nTZNAME:CDT\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0500\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:CST\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0600\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/Nuuk\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Nuuk\r\nBEGIN:DAYLIGHT\r\nTZNAME:%z\r\nTZOFFSETFROM:-0200\r\nTZOFFSETTO:-0100\r\nDTSTART:19700328T230000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SA\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0100\r\nTZOFFSETTO:-0200\r\nDTSTART:19701025T000000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD");
register("TZID:America/Ojinaga\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Ojinaga\r\nBEGIN:DAYLIGHT\r\nTZNAME:CDT\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0500\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:CST\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0600\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/Panama\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Panama\r\nBEGIN:STANDARD\r\nTZNAME:EST\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0500\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Paramaribo\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Paramaribo\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Phoenix\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Phoenix\r\nBEGIN:STANDARD\r\nTZNAME:MST\r\nTZOFFSETFROM:-0700\r\nTZOFFSETTO:-0700\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Port-au-Prince\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Port-au-Prince\r\nBEGIN:DAYLIGHT\r\nTZNAME:EDT\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0400\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:EST\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0500\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/Porto_Velho\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Porto_Velho\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0400\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Puerto_Rico\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Puerto_Rico\r\nBEGIN:STANDARD\r\nTZNAME:AST\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0400\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Punta_Arenas\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Punta_Arenas\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Rankin_Inlet\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Rankin_Inlet\r\nBEGIN:DAYLIGHT\r\nTZNAME:CDT\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0500\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:CST\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0600\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/Recife\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Recife\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Regina\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Regina\r\nBEGIN:STANDARD\r\nTZNAME:CST\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0600\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Resolute\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Resolute\r\nBEGIN:STANDARD\r\nTZNAME:CST\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0600\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZNAME:CDT\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0500\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT");
register("TZID:America/Rio_Branco\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Rio_Branco\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0500\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Santarem\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Santarem\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Santiago\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Santiago\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0400\r\nDTSTART:19700405T000000\r\nRRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZNAME:%z\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0300\r\nDTSTART:19700906T000000\r\nRRULE:FREQ=YEARLY;BYMONTH=9;BYDAY=1SU\r\nEND:DAYLIGHT");
register("TZID:America/Santo_Domingo\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Santo_Domingo\r\nBEGIN:STANDARD\r\nTZNAME:AST\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0400\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Sao_Paulo\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Sao_Paulo\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Scoresbysund\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Scoresbysund\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0100\r\nTZOFFSETTO:-0200\r\nDTSTART:19701025T000000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZNAME:%z\r\nTZOFFSETFROM:-0200\r\nTZOFFSETTO:-0100\r\nDTSTART:19700328T230000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SA\r\nEND:DAYLIGHT");
register("TZID:America/Sitka\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Sitka\r\nBEGIN:DAYLIGHT\r\nTZNAME:AKDT\r\nTZOFFSETFROM:-0900\r\nTZOFFSETTO:-0800\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:AKST\r\nTZOFFSETFROM:-0800\r\nTZOFFSETTO:-0900\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/St_Johns\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/St_Johns\r\nBEGIN:STANDARD\r\nTZNAME:NST\r\nTZOFFSETFROM:-0230\r\nTZOFFSETTO:-0330\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZNAME:NDT\r\nTZOFFSETFROM:-0330\r\nTZOFFSETTO:-0230\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT");
register("TZID:America/Swift_Current\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Swift_Current\r\nBEGIN:STANDARD\r\nTZNAME:CST\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0600\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Tegucigalpa\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Tegucigalpa\r\nBEGIN:STANDARD\r\nTZNAME:CST\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0600\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Thule\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Thule\r\nBEGIN:DAYLIGHT\r\nTZNAME:ADT\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0300\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:AST\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0400\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/Tijuana\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Tijuana\r\nBEGIN:DAYLIGHT\r\nTZNAME:PDT\r\nTZOFFSETFROM:-0800\r\nTZOFFSETTO:-0700\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:PST\r\nTZOFFSETFROM:-0700\r\nTZOFFSETTO:-0800\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/Toronto\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Toronto\r\nBEGIN:DAYLIGHT\r\nTZNAME:EDT\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0400\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:EST\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0500\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/Vancouver\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Vancouver\r\nBEGIN:DAYLIGHT\r\nTZNAME:PDT\r\nTZOFFSETFROM:-0800\r\nTZOFFSETTO:-0700\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:PST\r\nTZOFFSETFROM:-0700\r\nTZOFFSETTO:-0800\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/Whitehorse\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Whitehorse\r\nBEGIN:STANDARD\r\nTZNAME:MST\r\nTZOFFSETFROM:-0700\r\nTZOFFSETTO:-0700\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:America/Winnipeg\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Winnipeg\r\nBEGIN:DAYLIGHT\r\nTZNAME:CDT\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0500\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:CST\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0600\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:America/Yakutat\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:America/Yakutat\r\nBEGIN:DAYLIGHT\r\nTZNAME:AKDT\r\nTZOFFSETFROM:-0900\r\nTZOFFSETTO:-0800\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:AKST\r\nTZOFFSETFROM:-0800\r\nTZOFFSETTO:-0900\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:Antarctica/Casey\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Antarctica/Casey\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0800\r\nTZOFFSETTO:+0800\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Antarctica/Davis\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Antarctica/Davis\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0700\r\nTZOFFSETTO:+0700\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Antarctica/Macquarie\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Antarctica/Macquarie\r\nBEGIN:STANDARD\r\nTZNAME:AEST\r\nTZOFFSETFROM:+1100\r\nTZOFFSETTO:+1000\r\nDTSTART:19700405T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZNAME:AEDT\r\nTZOFFSETFROM:+1000\r\nTZOFFSETTO:+1100\r\nDTSTART:19701004T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1SU\r\nEND:DAYLIGHT");
register("TZID:Antarctica/Mawson\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Antarctica/Mawson\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0500\r\nTZOFFSETTO:+0500\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Antarctica/Palmer\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Antarctica/Palmer\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Antarctica/Rothera\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Antarctica/Rothera\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Antarctica/Troll\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Antarctica/Troll\r\nBEGIN:DAYLIGHT\r\nTZNAME:+02\r\nTZOFFSETFROM:+0000\r\nTZOFFSETTO:+0200\r\nDTSTART:19700329T010000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:+00\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0000\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD");
register("TZID:Antarctica/Vostok\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Antarctica/Vostok\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0500\r\nTZOFFSETTO:+0500\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Almaty\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Almaty\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0500\r\nTZOFFSETTO:+0500\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Amman\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Amman\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Anadyr\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Anadyr\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+1200\r\nTZOFFSETTO:+1200\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Aqtau\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Aqtau\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0500\r\nTZOFFSETTO:+0500\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Aqtobe\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Aqtobe\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0500\r\nTZOFFSETTO:+0500\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Ashgabat\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Ashgabat\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0500\r\nTZOFFSETTO:+0500\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Atyrau\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Atyrau\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0500\r\nTZOFFSETTO:+0500\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Baghdad\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Baghdad\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Baku\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Baku\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0400\r\nTZOFFSETTO:+0400\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Bangkok\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Bangkok\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0700\r\nTZOFFSETTO:+0700\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Barnaul\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Barnaul\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0700\r\nTZOFFSETTO:+0700\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Beirut\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Beirut\r\nBEGIN:DAYLIGHT\r\nTZNAME:EEST\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0300\r\nDTSTART:19700329T000000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:EET\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0200\r\nDTSTART:19701025T000000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD");
register("TZID:Asia/Bishkek\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Bishkek\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0600\r\nTZOFFSETTO:+0600\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Chita\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Chita\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0900\r\nTZOFFSETTO:+0900\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Colombo\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Colombo\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0530\r\nTZOFFSETTO:+0530\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Damascus\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Damascus\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Dhaka\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Dhaka\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0600\r\nTZOFFSETTO:+0600\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Dili\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Dili\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0900\r\nTZOFFSETTO:+0900\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Dubai\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Dubai\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0400\r\nTZOFFSETTO:+0400\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Dushanbe\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Dushanbe\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0500\r\nTZOFFSETTO:+0500\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Famagusta\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Famagusta\r\nBEGIN:DAYLIGHT\r\nTZNAME:EEST\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0300\r\nDTSTART:19700329T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:EET\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0200\r\nDTSTART:19701025T040000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD");
register("TZID:Asia/Gaza\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Gaza\r\nBEGIN:DAYLIGHT\r\nTZNAME:EEST\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0300\r\nDTSTART:19700328T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SA\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:EET\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0200\r\nDTSTART:19701024T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SA\r\nEND:STANDARD");
register("TZID:Asia/Hebron\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Hebron\r\nBEGIN:DAYLIGHT\r\nTZNAME:EEST\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0300\r\nDTSTART:19700328T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SA\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:EET\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0200\r\nDTSTART:19701024T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SA\r\nEND:STANDARD");
register("TZID:Asia/Ho_Chi_Minh\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Ho_Chi_Minh\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0700\r\nTZOFFSETTO:+0700\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Hong_Kong\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Hong_Kong\r\nBEGIN:STANDARD\r\nTZNAME:HKT\r\nTZOFFSETFROM:+0800\r\nTZOFFSETTO:+0800\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Hovd\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Hovd\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0700\r\nTZOFFSETTO:+0700\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Irkutsk\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Irkutsk\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0800\r\nTZOFFSETTO:+0800\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Jakarta\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Jakarta\r\nBEGIN:STANDARD\r\nTZNAME:WIB\r\nTZOFFSETFROM:+0700\r\nTZOFFSETTO:+0700\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Jayapura\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Jayapura\r\nBEGIN:STANDARD\r\nTZNAME:WIT\r\nTZOFFSETFROM:+0900\r\nTZOFFSETTO:+0900\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Jerusalem\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Jerusalem\r\nBEGIN:DAYLIGHT\r\nTZNAME:IDT\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0300\r\nDTSTART:19700327T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1FR\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:IST\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0200\r\nDTSTART:19701025T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD");
register("TZID:Asia/Kabul\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Kabul\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0430\r\nTZOFFSETTO:+0430\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Kamchatka\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Kamchatka\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+1200\r\nTZOFFSETTO:+1200\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Karachi\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Karachi\r\nBEGIN:STANDARD\r\nTZNAME:PKT\r\nTZOFFSETFROM:+0500\r\nTZOFFSETTO:+0500\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Kathmandu\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Kathmandu\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0545\r\nTZOFFSETTO:+0545\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Khandyga\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Khandyga\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0900\r\nTZOFFSETTO:+0900\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Kolkata\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Kolkata\r\nBEGIN:STANDARD\r\nTZNAME:IST\r\nTZOFFSETFROM:+0530\r\nTZOFFSETTO:+0530\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Krasnoyarsk\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Krasnoyarsk\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0700\r\nTZOFFSETTO:+0700\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Kuching\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Kuching\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0800\r\nTZOFFSETTO:+0800\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Macau\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Macau\r\nBEGIN:STANDARD\r\nTZNAME:CST\r\nTZOFFSETFROM:+0800\r\nTZOFFSETTO:+0800\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Magadan\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Magadan\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+1100\r\nTZOFFSETTO:+1100\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Makassar\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Makassar\r\nBEGIN:STANDARD\r\nTZNAME:WITA\r\nTZOFFSETFROM:+0800\r\nTZOFFSETTO:+0800\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Manila\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Manila\r\nBEGIN:STANDARD\r\nTZNAME:PST\r\nTZOFFSETFROM:+0800\r\nTZOFFSETTO:+0800\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Nicosia\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Nicosia\r\nBEGIN:STANDARD\r\nTZNAME:EET\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0200\r\nDTSTART:19701025T040000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZNAME:EEST\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0300\r\nDTSTART:19700329T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT");
register("TZID:Asia/Novokuznetsk\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Novokuznetsk\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0700\r\nTZOFFSETTO:+0700\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Novosibirsk\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Novosibirsk\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0700\r\nTZOFFSETTO:+0700\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Omsk\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Omsk\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0600\r\nTZOFFSETTO:+0600\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Oral\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Oral\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0500\r\nTZOFFSETTO:+0500\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Pontianak\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Pontianak\r\nBEGIN:STANDARD\r\nTZNAME:WIB\r\nTZOFFSETFROM:+0700\r\nTZOFFSETTO:+0700\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Pyongyang\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Pyongyang\r\nBEGIN:STANDARD\r\nTZNAME:KST\r\nTZOFFSETFROM:+0900\r\nTZOFFSETTO:+0900\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Qatar\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Qatar\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Qostanay\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Qostanay\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0500\r\nTZOFFSETTO:+0500\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Qyzylorda\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Qyzylorda\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0500\r\nTZOFFSETTO:+0500\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Riyadh\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Riyadh\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Sakhalin\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Sakhalin\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+1100\r\nTZOFFSETTO:+1100\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Samarkand\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Samarkand\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0500\r\nTZOFFSETTO:+0500\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Seoul\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Seoul\r\nBEGIN:STANDARD\r\nTZNAME:KST\r\nTZOFFSETFROM:+0900\r\nTZOFFSETTO:+0900\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Shanghai\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Shanghai\r\nBEGIN:STANDARD\r\nTZNAME:CST\r\nTZOFFSETFROM:+0800\r\nTZOFFSETTO:+0800\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Singapore\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Singapore\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0800\r\nTZOFFSETTO:+0800\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Srednekolymsk\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Srednekolymsk\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+1100\r\nTZOFFSETTO:+1100\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Taipei\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Taipei\r\nBEGIN:STANDARD\r\nTZNAME:CST\r\nTZOFFSETFROM:+0800\r\nTZOFFSETTO:+0800\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Tashkent\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Tashkent\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0500\r\nTZOFFSETTO:+0500\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Tbilisi\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Tbilisi\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0400\r\nTZOFFSETTO:+0400\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Tehran\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Tehran\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0330\r\nTZOFFSETTO:+0330\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Thimphu\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Thimphu\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0600\r\nTZOFFSETTO:+0600\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Tokyo\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Tokyo\r\nBEGIN:STANDARD\r\nTZNAME:JST\r\nTZOFFSETFROM:+0900\r\nTZOFFSETTO:+0900\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Tomsk\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Tomsk\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0700\r\nTZOFFSETTO:+0700\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Ulaanbaatar\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Ulaanbaatar\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0800\r\nTZOFFSETTO:+0800\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Urumqi\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Urumqi\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0600\r\nTZOFFSETTO:+0600\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Ust-Nera\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Ust-Nera\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+1000\r\nTZOFFSETTO:+1000\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Vladivostok\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Vladivostok\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+1000\r\nTZOFFSETTO:+1000\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Yakutsk\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Yakutsk\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0900\r\nTZOFFSETTO:+0900\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Yangon\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Yangon\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0630\r\nTZOFFSETTO:+0630\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Yekaterinburg\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Yekaterinburg\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0500\r\nTZOFFSETTO:+0500\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Asia/Yerevan\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Asia/Yerevan\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0400\r\nTZOFFSETTO:+0400\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Atlantic/Azores\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Atlantic/Azores\r\nBEGIN:DAYLIGHT\r\nTZNAME:%z\r\nTZOFFSETFROM:-0100\r\nTZOFFSETTO:+0000\r\nDTSTART:19700329T000000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0000\r\nTZOFFSETTO:-0100\r\nDTSTART:19701025T010000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD");
register("TZID:Atlantic/Bermuda\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Atlantic/Bermuda\r\nBEGIN:DAYLIGHT\r\nTZNAME:ADT\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0300\r\nDTSTART:19700308T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:AST\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0400\r\nDTSTART:19701101T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:Atlantic/Canary\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Atlantic/Canary\r\nBEGIN:DAYLIGHT\r\nTZNAME:WEST\r\nTZOFFSETFROM:+0000\r\nTZOFFSETTO:+0100\r\nDTSTART:19700329T010000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:WET\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0000\r\nDTSTART:19701025T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD");
register("TZID:Atlantic/Cape_Verde\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Atlantic/Cape_Verde\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0100\r\nTZOFFSETTO:-0100\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Atlantic/Faroe\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Atlantic/Faroe\r\nBEGIN:DAYLIGHT\r\nTZNAME:WEST\r\nTZOFFSETFROM:+0000\r\nTZOFFSETTO:+0100\r\nDTSTART:19700329T010000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:WET\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0000\r\nDTSTART:19701025T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD");
register("TZID:Atlantic/Madeira\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Atlantic/Madeira\r\nBEGIN:DAYLIGHT\r\nTZNAME:WEST\r\nTZOFFSETFROM:+0000\r\nTZOFFSETTO:+0100\r\nDTSTART:19700329T010000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:WET\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0000\r\nDTSTART:19701025T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD");
register("TZID:Atlantic/South_Georgia\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Atlantic/South_Georgia\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0200\r\nTZOFFSETTO:-0200\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Atlantic/Stanley\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Atlantic/Stanley\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Australia/Adelaide\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Australia/Adelaide\r\nBEGIN:STANDARD\r\nTZNAME:ACST\r\nTZOFFSETFROM:+1030\r\nTZOFFSETTO:+0930\r\nDTSTART:19700405T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZNAME:ACDT\r\nTZOFFSETFROM:+0930\r\nTZOFFSETTO:+1030\r\nDTSTART:19701004T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1SU\r\nEND:DAYLIGHT");
register("TZID:Australia/Brisbane\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Australia/Brisbane\r\nBEGIN:STANDARD\r\nTZNAME:AEST\r\nTZOFFSETFROM:+1000\r\nTZOFFSETTO:+1000\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Australia/Broken_Hill\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Australia/Broken_Hill\r\nBEGIN:STANDARD\r\nTZNAME:ACST\r\nTZOFFSETFROM:+1030\r\nTZOFFSETTO:+0930\r\nDTSTART:19700405T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZNAME:ACDT\r\nTZOFFSETFROM:+0930\r\nTZOFFSETTO:+1030\r\nDTSTART:19701004T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1SU\r\nEND:DAYLIGHT");
register("TZID:Australia/Darwin\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Australia/Darwin\r\nBEGIN:STANDARD\r\nTZNAME:ACST\r\nTZOFFSETFROM:+0930\r\nTZOFFSETTO:+0930\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Australia/Eucla\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Australia/Eucla\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0845\r\nTZOFFSETTO:+0845\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Australia/Hobart\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Australia/Hobart\r\nBEGIN:DAYLIGHT\r\nTZNAME:AEDT\r\nTZOFFSETFROM:+1000\r\nTZOFFSETTO:+1100\r\nDTSTART:19701004T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:AEST\r\nTZOFFSETFROM:+1100\r\nTZOFFSETTO:+1000\r\nDTSTART:19700405T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:Australia/Lindeman\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Australia/Lindeman\r\nBEGIN:STANDARD\r\nTZNAME:AEST\r\nTZOFFSETFROM:+1000\r\nTZOFFSETTO:+1000\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Australia/Lord_Howe\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Australia/Lord_Howe\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+1100\r\nTZOFFSETTO:+1030\r\nDTSTART:19700405T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZNAME:%z\r\nTZOFFSETFROM:+1030\r\nTZOFFSETTO:+1100\r\nDTSTART:19701004T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1SU\r\nEND:DAYLIGHT");
register("TZID:Australia/Melbourne\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Australia/Melbourne\r\nBEGIN:STANDARD\r\nTZNAME:AEST\r\nTZOFFSETFROM:+1100\r\nTZOFFSETTO:+1000\r\nDTSTART:19700405T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZNAME:AEDT\r\nTZOFFSETFROM:+1000\r\nTZOFFSETTO:+1100\r\nDTSTART:19701004T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1SU\r\nEND:DAYLIGHT");
register("TZID:Australia/Perth\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Australia/Perth\r\nBEGIN:STANDARD\r\nTZNAME:AWST\r\nTZOFFSETFROM:+0800\r\nTZOFFSETTO:+0800\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Australia/Sydney\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Australia/Sydney\r\nBEGIN:STANDARD\r\nTZNAME:AEST\r\nTZOFFSETFROM:+1100\r\nTZOFFSETTO:+1000\r\nDTSTART:19700405T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZNAME:AEDT\r\nTZOFFSETFROM:+1000\r\nTZOFFSETTO:+1100\r\nDTSTART:19701004T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1SU\r\nEND:DAYLIGHT");
register("TZID:Etc/GMT\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Etc/GMT\r\nBEGIN:STANDARD\r\nTZNAME:GMT\r\nTZOFFSETFROM:+0000\r\nTZOFFSETTO:+0000\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Etc/GMT+1\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Etc/GMT+1\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0100\r\nTZOFFSETTO:-0100\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Etc/GMT+10\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Etc/GMT+10\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-1000\r\nTZOFFSETTO:-1000\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Etc/GMT+11\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Etc/GMT+11\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-1100\r\nTZOFFSETTO:-1100\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Etc/GMT+12\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Etc/GMT+12\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-1200\r\nTZOFFSETTO:-1200\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Etc/GMT+2\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Etc/GMT+2\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0200\r\nTZOFFSETTO:-0200\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Etc/GMT+3\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Etc/GMT+3\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0300\r\nTZOFFSETTO:-0300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Etc/GMT+4\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Etc/GMT+4\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0400\r\nTZOFFSETTO:-0400\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Etc/GMT+5\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Etc/GMT+5\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0500\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Etc/GMT+6\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Etc/GMT+6\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0600\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Etc/GMT+7\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Etc/GMT+7\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0700\r\nTZOFFSETTO:-0700\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Etc/GMT+8\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Etc/GMT+8\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0800\r\nTZOFFSETTO:-0800\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Etc/GMT+9\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Etc/GMT+9\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0900\r\nTZOFFSETTO:-0900\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Etc/GMT-1\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Etc/GMT-1\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0100\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Etc/GMT-10\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Etc/GMT-10\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+1000\r\nTZOFFSETTO:+1000\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Etc/GMT-11\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Etc/GMT-11\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+1100\r\nTZOFFSETTO:+1100\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Etc/GMT-12\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Etc/GMT-12\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+1200\r\nTZOFFSETTO:+1200\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Etc/GMT-13\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Etc/GMT-13\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+1300\r\nTZOFFSETTO:+1300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Etc/GMT-14\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Etc/GMT-14\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+1400\r\nTZOFFSETTO:+1400\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Etc/GMT-2\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Etc/GMT-2\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0200\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Etc/GMT-3\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Etc/GMT-3\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Etc/GMT-4\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Etc/GMT-4\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0400\r\nTZOFFSETTO:+0400\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Etc/GMT-5\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Etc/GMT-5\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0500\r\nTZOFFSETTO:+0500\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Etc/GMT-6\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Etc/GMT-6\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0600\r\nTZOFFSETTO:+0600\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Etc/GMT-7\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Etc/GMT-7\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0700\r\nTZOFFSETTO:+0700\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Etc/GMT-8\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Etc/GMT-8\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0800\r\nTZOFFSETTO:+0800\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Etc/GMT-9\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Etc/GMT-9\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0900\r\nTZOFFSETTO:+0900\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Etc/UTC\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Etc/UTC\r\nBEGIN:STANDARD\r\nTZNAME:UTC\r\nTZOFFSETFROM:+0000\r\nTZOFFSETTO:+0000\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Europe/Andorra\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Europe/Andorra\r\nBEGIN:DAYLIGHT\r\nTZNAME:CEST\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0200\r\nDTSTART:19700329T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:CET\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0100\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD");
register("TZID:Europe/Astrakhan\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Europe/Astrakhan\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0400\r\nTZOFFSETTO:+0400\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Europe/Athens\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Europe/Athens\r\nBEGIN:DAYLIGHT\r\nTZNAME:EEST\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0300\r\nDTSTART:19700329T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:EET\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0200\r\nDTSTART:19701025T040000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD");
register("TZID:Europe/Belgrade\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Europe/Belgrade\r\nBEGIN:DAYLIGHT\r\nTZNAME:CEST\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0200\r\nDTSTART:19700329T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:CET\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0100\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD");
register("TZID:Europe/Berlin\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Europe/Berlin\r\nBEGIN:DAYLIGHT\r\nTZNAME:CEST\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0200\r\nDTSTART:19700329T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:CET\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0100\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD");
register("TZID:Europe/Brussels\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Europe/Brussels\r\nBEGIN:DAYLIGHT\r\nTZNAME:CEST\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0200\r\nDTSTART:19700329T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:CET\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0100\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD");
register("TZID:Europe/Bucharest\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Europe/Bucharest\r\nBEGIN:DAYLIGHT\r\nTZNAME:EEST\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0300\r\nDTSTART:19700329T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:EET\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0200\r\nDTSTART:19701025T040000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD");
register("TZID:Europe/Budapest\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Europe/Budapest\r\nBEGIN:DAYLIGHT\r\nTZNAME:CEST\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0200\r\nDTSTART:19700329T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:CET\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0100\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD");
register("TZID:Europe/Chisinau\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Europe/Chisinau\r\nBEGIN:DAYLIGHT\r\nTZNAME:EEST\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0300\r\nDTSTART:19700329T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:EET\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0200\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD");
register("TZID:Europe/Dublin\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Europe/Dublin\r\nBEGIN:STANDARD\r\nTZNAME:IST\r\nTZOFFSETFROM:+0000\r\nTZOFFSETTO:+0100\r\nDTSTART:19700329T010000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZNAME:GMT\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0000\r\nDTSTART:19701025T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:DAYLIGHT");
register("TZID:Europe/Gibraltar\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Europe/Gibraltar\r\nBEGIN:DAYLIGHT\r\nTZNAME:CEST\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0200\r\nDTSTART:19700329T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:CET\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0100\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD");
register("TZID:Europe/Helsinki\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Europe/Helsinki\r\nBEGIN:DAYLIGHT\r\nTZNAME:EEST\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0300\r\nDTSTART:19700329T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:EET\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0200\r\nDTSTART:19701025T040000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD");
register("TZID:Europe/Istanbul\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Europe/Istanbul\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Europe/Kaliningrad\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Europe/Kaliningrad\r\nBEGIN:STANDARD\r\nTZNAME:EET\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0200\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Europe/Kirov\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Europe/Kirov\r\nBEGIN:STANDARD\r\nTZNAME:MSK\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Europe/Kyiv\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Europe/Kyiv\r\nBEGIN:STANDARD\r\nTZNAME:EET\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0200\r\nDTSTART:19701025T040000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZNAME:EEST\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0300\r\nDTSTART:19700329T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT");
register("TZID:Europe/Lisbon\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Europe/Lisbon\r\nBEGIN:STANDARD\r\nTZNAME:WET\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0000\r\nDTSTART:19701025T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZNAME:WEST\r\nTZOFFSETFROM:+0000\r\nTZOFFSETTO:+0100\r\nDTSTART:19700329T010000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT");
register("TZID:Europe/London\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Europe/London\r\nBEGIN:DAYLIGHT\r\nTZNAME:BST\r\nTZOFFSETFROM:+0000\r\nTZOFFSETTO:+0100\r\nDTSTART:19700329T010000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:GMT\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0000\r\nDTSTART:19701025T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD");
register("TZID:Europe/Madrid\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Europe/Madrid\r\nBEGIN:DAYLIGHT\r\nTZNAME:CEST\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0200\r\nDTSTART:19700329T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:CET\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0100\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD");
register("TZID:Europe/Malta\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Europe/Malta\r\nBEGIN:DAYLIGHT\r\nTZNAME:CEST\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0200\r\nDTSTART:19700329T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:CET\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0100\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD");
register("TZID:Europe/Minsk\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Europe/Minsk\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Europe/Moscow\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Europe/Moscow\r\nBEGIN:STANDARD\r\nTZNAME:MSK\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Europe/Paris\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Europe/Paris\r\nBEGIN:DAYLIGHT\r\nTZNAME:CEST\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0200\r\nDTSTART:19700329T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:CET\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0100\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD");
register("TZID:Europe/Prague\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Europe/Prague\r\nBEGIN:DAYLIGHT\r\nTZNAME:CEST\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0200\r\nDTSTART:19700329T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:CET\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0100\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD");
register("TZID:Europe/Riga\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Europe/Riga\r\nBEGIN:DAYLIGHT\r\nTZNAME:EEST\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0300\r\nDTSTART:19700329T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:EET\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0200\r\nDTSTART:19701025T040000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD");
register("TZID:Europe/Rome\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Europe/Rome\r\nBEGIN:DAYLIGHT\r\nTZNAME:CEST\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0200\r\nDTSTART:19700329T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:CET\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0100\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD");
register("TZID:Europe/Samara\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Europe/Samara\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0400\r\nTZOFFSETTO:+0400\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Europe/Saratov\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Europe/Saratov\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0400\r\nTZOFFSETTO:+0400\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Europe/Simferopol\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Europe/Simferopol\r\nBEGIN:STANDARD\r\nTZNAME:MSK\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Europe/Sofia\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Europe/Sofia\r\nBEGIN:DAYLIGHT\r\nTZNAME:EEST\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0300\r\nDTSTART:19700329T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:EET\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0200\r\nDTSTART:19701025T040000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD");
register("TZID:Europe/Tallinn\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Europe/Tallinn\r\nBEGIN:DAYLIGHT\r\nTZNAME:EEST\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0300\r\nDTSTART:19700329T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:EET\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0200\r\nDTSTART:19701025T040000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD");
register("TZID:Europe/Tirane\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Europe/Tirane\r\nBEGIN:DAYLIGHT\r\nTZNAME:CEST\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0200\r\nDTSTART:19700329T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:CET\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0100\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD");
register("TZID:Europe/Ulyanovsk\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Europe/Ulyanovsk\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0400\r\nTZOFFSETTO:+0400\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Europe/Vienna\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Europe/Vienna\r\nBEGIN:DAYLIGHT\r\nTZNAME:CEST\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0200\r\nDTSTART:19700329T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:CET\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0100\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD");
register("TZID:Europe/Vilnius\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Europe/Vilnius\r\nBEGIN:DAYLIGHT\r\nTZNAME:EEST\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0300\r\nDTSTART:19700329T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:EET\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0200\r\nDTSTART:19701025T040000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD");
register("TZID:Europe/Volgograd\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Europe/Volgograd\r\nBEGIN:STANDARD\r\nTZNAME:MSK\r\nTZOFFSETFROM:+0300\r\nTZOFFSETTO:+0300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Europe/Warsaw\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Europe/Warsaw\r\nBEGIN:DAYLIGHT\r\nTZNAME:CEST\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0200\r\nDTSTART:19700329T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:CET\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0100\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD");
register("TZID:Europe/Zurich\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Europe/Zurich\r\nBEGIN:DAYLIGHT\r\nTZNAME:CEST\r\nTZOFFSETFROM:+0100\r\nTZOFFSETTO:+0200\r\nDTSTART:19700329T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:CET\r\nTZOFFSETFROM:+0200\r\nTZOFFSETTO:+0100\r\nDTSTART:19701025T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU\r\nEND:STANDARD");
register("TZID:Indian/Chagos\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Indian/Chagos\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0600\r\nTZOFFSETTO:+0600\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Indian/Maldives\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Indian/Maldives\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0500\r\nTZOFFSETTO:+0500\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Indian/Mauritius\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Indian/Mauritius\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0400\r\nTZOFFSETTO:+0400\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Pacific/Apia\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Pacific/Apia\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+1300\r\nTZOFFSETTO:+1300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Pacific/Auckland\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Pacific/Auckland\r\nBEGIN:DAYLIGHT\r\nTZNAME:NZDT\r\nTZOFFSETFROM:+1200\r\nTZOFFSETTO:+1300\r\nDTSTART:19700927T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=9;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:NZST\r\nTZOFFSETFROM:+1300\r\nTZOFFSETTO:+1200\r\nDTSTART:19700405T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:Pacific/Bougainville\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Pacific/Bougainville\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+1100\r\nTZOFFSETTO:+1100\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Pacific/Chatham\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Pacific/Chatham\r\nBEGIN:DAYLIGHT\r\nTZNAME:%z\r\nTZOFFSETFROM:+1245\r\nTZOFFSETTO:+1345\r\nDTSTART:19700927T024500\r\nRRULE:FREQ=YEARLY;BYMONTH=9;BYDAY=-1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+1345\r\nTZOFFSETTO:+1245\r\nDTSTART:19700405T034500\r\nRRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:Pacific/Easter\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Pacific/Easter\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0500\r\nTZOFFSETTO:-0600\r\nDTSTART:19700404T220000\r\nRRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SA\r\nEND:STANDARD\r\nBEGIN:DAYLIGHT\r\nTZNAME:%z\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0500\r\nDTSTART:19700905T220000\r\nRRULE:FREQ=YEARLY;BYMONTH=9;BYDAY=1SA\r\nEND:DAYLIGHT");
register("TZID:Pacific/Efate\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Pacific/Efate\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+1100\r\nTZOFFSETTO:+1100\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Pacific/Fakaofo\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Pacific/Fakaofo\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+1300\r\nTZOFFSETTO:+1300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Pacific/Fiji\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Pacific/Fiji\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+1200\r\nTZOFFSETTO:+1200\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Pacific/Galapagos\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Pacific/Galapagos\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0600\r\nTZOFFSETTO:-0600\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Pacific/Gambier\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Pacific/Gambier\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0900\r\nTZOFFSETTO:-0900\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Pacific/Guadalcanal\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Pacific/Guadalcanal\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+1100\r\nTZOFFSETTO:+1100\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Pacific/Guam\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Pacific/Guam\r\nBEGIN:STANDARD\r\nTZNAME:ChST\r\nTZOFFSETFROM:+1000\r\nTZOFFSETTO:+1000\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Pacific/Honolulu\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Pacific/Honolulu\r\nBEGIN:STANDARD\r\nTZNAME:HST\r\nTZOFFSETFROM:-1000\r\nTZOFFSETTO:-1000\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Pacific/Kanton\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Pacific/Kanton\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+1300\r\nTZOFFSETTO:+1300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Pacific/Kiritimati\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Pacific/Kiritimati\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+1400\r\nTZOFFSETTO:+1400\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Pacific/Kosrae\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Pacific/Kosrae\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+1100\r\nTZOFFSETTO:+1100\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Pacific/Kwajalein\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Pacific/Kwajalein\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+1200\r\nTZOFFSETTO:+1200\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Pacific/Marquesas\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Pacific/Marquesas\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0930\r\nTZOFFSETTO:-0930\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Pacific/Nauru\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Pacific/Nauru\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+1200\r\nTZOFFSETTO:+1200\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Pacific/Niue\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Pacific/Niue\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-1100\r\nTZOFFSETTO:-1100\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Pacific/Norfolk\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Pacific/Norfolk\r\nBEGIN:DAYLIGHT\r\nTZNAME:%z\r\nTZOFFSETFROM:+1100\r\nTZOFFSETTO:+1200\r\nDTSTART:19701004T020000\r\nRRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=1SU\r\nEND:DAYLIGHT\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+1200\r\nTZOFFSETTO:+1100\r\nDTSTART:19700405T030000\r\nRRULE:FREQ=YEARLY;BYMONTH=4;BYDAY=1SU\r\nEND:STANDARD");
register("TZID:Pacific/Noumea\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Pacific/Noumea\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+1100\r\nTZOFFSETTO:+1100\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Pacific/Pago_Pago\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Pacific/Pago_Pago\r\nBEGIN:STANDARD\r\nTZNAME:SST\r\nTZOFFSETFROM:-1100\r\nTZOFFSETTO:-1100\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Pacific/Palau\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Pacific/Palau\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+0900\r\nTZOFFSETTO:+0900\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Pacific/Pitcairn\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Pacific/Pitcairn\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-0800\r\nTZOFFSETTO:-0800\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Pacific/Port_Moresby\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Pacific/Port_Moresby\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+1000\r\nTZOFFSETTO:+1000\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Pacific/Rarotonga\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Pacific/Rarotonga\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-1000\r\nTZOFFSETTO:-1000\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Pacific/Tahiti\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Pacific/Tahiti\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:-1000\r\nTZOFFSETTO:-1000\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Pacific/Tarawa\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Pacific/Tarawa\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+1200\r\nTZOFFSETTO:+1200\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
register("TZID:Pacific/Tongatapu\r\nLAST-MODIFIED:20241022T084017Z\r\nX-LIC-LOCATION:Pacific/Tongatapu\r\nBEGIN:STANDARD\r\nTZNAME:%z\r\nTZOFFSETFROM:+1300\r\nTZOFFSETTO:+1300\r\nDTSTART:19700101T000000\r\nEND:STANDARD");
})();
export default ICAL;

24
src/logger.js Normal file
View File

@ -0,0 +1,24 @@
import { createLogger, format, transports } from 'winston';
const { combine, timestamp, printf, colorize } = format;
// Define custom log format
const logFormat = printf(({ level, message, timestamp }) => {
return `[${timestamp}] ${level}: ${message}`;
});
//create logger
const logger = createLogger({
level: process.env.NODE_ENV === 'production' ? 'info' : 'debug',
format: combine(
timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
colorize(),
logFormat
),
transports: [
new transports.Console(),
new transports.File({ filename: 'logs/calmerge.log' })
]
});
export default logger;

View File

@ -47,9 +47,9 @@ async function refreshCalendarData(calendarName) {
// Read the JSON file to get the source URL and other details
const { calendars } = JSON.parse(fs.readFileSync(jsonFilePath, 'utf-8'));
const results = await Promise.all(calendars.map(fetchCalendarData));
const calendarResults = await Promise.all(calendars.map(fetchCalendarData));
const calendarComponent = createCalendarComponent(calendarName);
addEventsToCalendar(calendarComponent, results);
addEventsToCalendar(calendarComponent, calendarResults);
saveCalendarFile(`${calendarName}.ics`, calendarComponent.toString());
console.log('Calendar data refreshed and saved.');

View File

@ -2,13 +2,13 @@ import express from 'express';
import path from 'path';
import routes from './routes.js';
console.log(`Starting server in ${process.cwd()}`);
const app = express();
app.use(express.json());
// Serve static files from the 'public' directory
app.use(express.static(path.join(process.cwd(), 'public')));
app.use('/', routes);
export default app;
export default app;

View File

@ -1,32 +1,41 @@
import request from 'supertest';
import express from 'express';
import fs from 'fs';
import path from 'path';
import { fileURLToPath } from 'url';
const CALENDARS_DIR = path.join(__dirname, 'calendar')
// ESM equivalent of __dirname
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const CALENDARS_DIR = path.join(__dirname, 'calendar');
const TEST_CALENDARS_DIR = path.join(__dirname, 'test_calendars');
const EXPECTED_OUTPUTS_DIR = path.join(__dirname, 'expected_outputs');
let server;
process.chdir(__dirname)
console.log(process.cwd());
const app = require('../src/server').default;
const app = await import('../src/server');
describe('Calendar Merging API', () => {
beforeAll(async () => {
// Start the server
server = app.listen(0);
server = app.default.listen(0);
});
afterAll(async () => {
// Ensure the server is closed before cleanup
await new Promise(resolve => server.close(resolve));
// Clean up the merged calendars directory after tests
fs.rmdirSync(CALENDARS_DIR, { recursive: true });
if (fs.existsSync(CALENDARS_DIR)) {
fs.rmdirSync(CALENDARS_DIR, { recursive: true });
}
// Optional: Add a delay to ensure all handles are released
await new Promise(resolve => setTimeout(resolve, 100));
});
const loadCalendarFile = (filename) => {
const getTestCalendarFilename = (filename) => {
return path.join(TEST_CALENDARS_DIR, filename);
};
@ -34,6 +43,88 @@ describe('Calendar Merging API', () => {
return fs.readFileSync(path.join(EXPECTED_OUTPUTS_DIR, filename), 'utf8');
};
test('Preserve nextcloud calendar', async () => {
const input = getTestCalendarFilename('nextcloud-minimal.ics');
const response = await request(server)
.post('/merge')
.send({
linkGroupName: 'nextcloud-minimal',
calendars: [
{
url: input,
prefix: '',
override: false,
},
],
});
expect(response.status).toBe(200);
// Check if the file was created in the test directory
const filePath = path.join(CALENDARS_DIR, 'nextcloud-minimal.ics');
console.log('Checking if file exists at:', filePath);
expect(fs.existsSync(filePath)).toBe(true);
// Load expected output
const expectedOutput = fs.readFileSync(input, 'utf8');
const actualOutput = fs.readFileSync(filePath, 'utf8');
//compare
expect(actualOutput).toBe(expectedOutput);
});
test('Preserve google calendar', async () => {
const input = getTestCalendarFilename('google-calendar-minimal.ics');
const response = await request(server)
.post('/merge')
.send({
linkGroupName: 'google-calendar-minimal',
calendars: [
{
url: input,
prefix: '',
override: false,
},
],
});
expect(response.status).toBe(200);
// Check if the file was created in the test directory
const filePath = path.join(CALENDARS_DIR, 'google-calendar-minimal.ics');
console.log('Checking if file exists at:', filePath);
expect(fs.existsSync(filePath)).toBe(true);
// Load expected output
const expectedOutput = fs.readFileSync(input, 'utf8');
const actualOutput = fs.readFileSync(filePath, 'utf8');
//compare
expect(actualOutput).toBe(expectedOutput);
});
test('Preserve date-based calendar', async () => {
const input = getTestCalendarFilename('US_Holidays.ics');
const response = await request(server)
.post('/merge')
.send({
linkGroupName: 'US Holidays',
calendars: [
{
url: input,
prefix: '',
override: false,
},
],
});
expect(response.status).toBe(200);
// Check if the file was created in the test directory
const filePath = path.join(CALENDARS_DIR, 'US_Holidays.ics');
console.log('Checking if file exists at:', filePath);
expect(fs.existsSync(filePath)).toBe(true);
// Load expected output and compare
const expectedOutput = fs.readFileSync(input, 'utf8');
const actualOutput = fs.readFileSync(filePath, 'utf8');
expect(actualOutput).toBe(expectedOutput);
});
test('Merge date-based calendar', async () => {
const response = await request(server)
.post('/merge')
@ -41,12 +132,12 @@ describe('Calendar Merging API', () => {
linkGroupName: 'Date Based Calendar',
calendars: [
{
url: loadCalendarFile('holiday_calendar_2023.ics'),
url: getTestCalendarFilename('holiday_calendar_2023.ics'),
prefix: 'holiday_calendar_2023',
override: false,
},
{
url: loadCalendarFile('US_Holidays.ics'),
url: getTestCalendarFilename('US_Holidays.ics'),
prefix: 'US_holidays',
override: false,
},
@ -65,21 +156,23 @@ describe('Calendar Merging API', () => {
const actualOutput = fs.readFileSync(filePath, 'utf8');
expect(actualOutput).toBe(expectedOutput);
});
//test Merge time-based calendar
test('Merge time-based calendar', async () => {
const input = getTestCalendarFilename('work_task_calendar.ics');
const response = await request(server)
.post('/merge')
.send({
linkGroupName: 'Time Based Calendar',
calendars: [
{
url: loadCalendarFile('team_meeting_calendar.ics'),
url: getTestCalendarFilename('team_meeting_calendar.ics'), // Time-based calendar
prefix: 'team_meeting_calendar',
override: false,
},
{
url: loadCalendarFile('work_task_calendar.ics'),
prefix: 'work_task',
url: getTestCalendarFilename('work_task_calendar.ics'), // Time-based calendar
prefix: 'Work_Task',
override: false,
},
],
@ -94,10 +187,11 @@ describe('Calendar Merging API', () => {
// Load expected output and compare
const expectedOutput = loadExpectedOutput('Time_Based_Calendar.ics');
const actualOutput = fs.readFileSync (filePath, 'utf8');
const actualOutput = fs.readFileSync(filePath, 'utf8');
expect(actualOutput).toBe(expectedOutput);
});
//test Merge calendar without prefix
test('Merge calendar without prefix', async () => {
const response = await request(server)
.post('/merge')
@ -105,7 +199,7 @@ describe('Calendar Merging API', () => {
linkGroupName: 'No Prefix Calendar',
calendars: [
{
url: loadCalendarFile('sf_public_holidays.ics'),
url: getTestCalendarFilename('sf_public_holidays.ics'),
prefix: '',
override: false,
},
@ -125,6 +219,7 @@ describe('Calendar Merging API', () => {
expect(actualOutput).toBe(expectedOutput);
});
//test Merge calendar with override
test('Merge calendar with override', async () => {
const response = await request(server)
.post('/merge')
@ -132,7 +227,7 @@ describe('Calendar Merging API', () => {
linkGroupName: 'Override Calendar',
calendars: [
{
url: loadCalendarFile('sf_public_holidays.ics'),
url: getTestCalendarFilename('sf_public_holidays.ics'),
prefix: 'Override Event',
override: true,
},
@ -152,37 +247,7 @@ describe('Calendar Merging API', () => {
expect(actualOutput).toBe(expectedOutput);
});
test('Merge UTC and EAT time zone calendar', async () => {
const response = await request(server)
.post('/merge')
.send({
linkGroupName: 'UTCEAT Time Zone Calendar',
calendars: [
{
url: loadCalendarFile('utc_time_zone_event.ics'),
prefix: 'UTC_Event',
override: false,
},
{
url: loadCalendarFile('eat_time_zone_event.ics'),
prefix: 'EAT_Event',
override: false,
},
],
});
expect(response.status).toBe(200);
expect(response.body.url).toMatch(new RegExp(`calendar/UTCEAT_Time_Zone_Calendar`));
// Check if the file was created in the test directory
const filePath = path.join(CALENDARS_DIR, 'UTCEAT_Time_Zone_Calendar.ics');
expect(fs.existsSync(filePath)).toBe(true);
// Load expected output and compare
const expectedOutput = loadExpectedOutput('UTCEAT_Time_Zone_Calendar.ics');
const actualOutput = fs.readFileSync(filePath, 'utf8');
expect(actualOutput).toBe(expectedOutput);
});
//test Merge date-based and time-based calendars
test('Merge date-based and time-based calendars', async () => {
const response = await request(server)
.post('/merge')
@ -190,12 +255,12 @@ describe('Calendar Merging API', () => {
linkGroupName: 'Merged Date and Time Based Calendar',
calendars: [
{
url: loadCalendarFile('holiday_calendar_2023.ics'), // Date-based calendar
url: getTestCalendarFilename('holiday_calendar_2023.ics'), // Date-based calendar
prefix: 'Holiday_2023',
override: false,
},
{
url: loadCalendarFile('work_task_calendar.ics'), // Time-based calendar
url: getTestCalendarFilename('work_task_calendar.ics'), // Time-based calendar
prefix: 'Work_Task',
override: false,
},

View File

@ -1,5 +1,13 @@
import fs from 'fs';
import ICAL from '../src/lib/ical.timezones';
import fs from 'fs';
import path from 'path';
import axios from 'axios';
import { jest } from '@jest/globals';
import { fileURLToPath } from 'url';
// ESM equivalent of __dirname
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
// Describe the test suite for Calendar Utility Functions
describe('Calendar Utility Functions', () => {
@ -32,20 +40,17 @@ describe('Calendar Utility Functions', () => {
});
// Test case: reading data from a file
it('reads data from a file', async () => {
const testCalendar = { url: './test_calendars/work_task_calendar.ics' };
// Mock the fs.readFileSync method to return specific test data
jest.spyOn(fs, 'readFileSync').mockReturnValue('file data');
// Call the fetchCalendarData function with the test calendar object
it('reads and parses data from a file', async () => {
const testCalendar = { url: path.join(__dirname, 'test_calendars', 'nextcloud.ics'), };
// Call the fetchCalendarData function
const result = await fetchCalendarData(testCalendar);
// Assert that the fetched result's data matches the expected file data
expect(result.data).toBe('file data');
// Restore the original fs.readFileSync method after the test
fs.readFileSync.mockRestore();
const parsed = ICAL.parse(result.data);
const component = new ICAL.Component(parsed);
const firstEvent = new ICAL.Event(component.getAllSubcomponents('vevent')[0]);
// Assert that the fetched and parsed data matches
expect(firstEvent.startDate.toJSON()).toEqual({"day": 20, "hour": 21, "isDate": false, "minute": 15, "month": 11, "second": 0, "timezone": "Europe/Berlin", "year": 2024});
});
});
});
});

View File

@ -1,17 +1,21 @@
BEGIN:VCALENDAR
PRODID:-//Your Product ID//EN
VERSION:2.0
NAME:Date Based Calendar
PRODID:-//CalMerge//Calendar Merger 1.0//EN
VERSION:2.0
CALSCALE:GREGORIAN
BEGIN:VEVENT
UID:20231225T000000-001@example.com
DTSTART;VALUE=DATE:20231225
DTEND;VALUE=DATE:20231226
DTSTAMP:20231225T000000Z
SUMMARY:holiday_calendar_2023 Christmas Day
DTSTART:20231225T000000
DTEND:20231226T000000
LOCATION:Germany
END:VEVENT
BEGIN:VEVENT
UID:20231225T000000-001@example.com
DTSTART;VALUE=DATE:20231225
DTEND;VALUE=DATE:20231226
DTSTAMP:20231225T000000Z
SUMMARY:US_holidays Christmas Day
DTSTART:20231225T000000
DTEND:20231226T000000
END:VEVENT
END:VCALENDAR

View File

@ -1,17 +1,21 @@
BEGIN:VCALENDAR
PRODID:-//Your Product ID//EN
VERSION:2.0
NAME:Merged Date and Time Based Calendar
PRODID:-//CalMerge//Calendar Merger 1.0//EN
VERSION:2.0
CALSCALE:GREGORIAN
BEGIN:VEVENT
UID:20231225T000000-001@example.com
DTSTART;VALUE=DATE:20231225
DTEND;VALUE=DATE:20231226
DTSTAMP:20231225T000000Z
SUMMARY:Holiday_2023 Christmas Day
DTSTART:20231225T000000
DTEND:20231226T000000
LOCATION:Germany
END:VEVENT
BEGIN:VEVENT
UID:20231108T090000-001@example.com
DTSTART:20231108T090000Z
DTEND:20231108T100000Z
DTSTAMP:20231108T090000Z
SUMMARY:Work_Task Work Task
DTSTART:20231108T120000
DTEND:20231108T130000
END:VEVENT
END:VCALENDAR

View File

@ -1,11 +1,14 @@
BEGIN:VCALENDAR
PRODID:-//Your Product ID//EN
VERSION:2.0
NAME:No Prefix Calendar
PRODID:-//CalMerge//Calendar Merger 1.0//EN
VERSION:2.0
CALSCALE:GREGORIAN
BEGIN:VEVENT
UID:20231225T000000-001@example.com
SUMMARY: Christmas Day
DTSTART:20231225T000000
DTEND:20231226T000000
DTSTART;VALUE=DATE:20231225
DTEND;VALUE=DATE:20231226
DTSTAMP:20231225T000000Z
SUMMARY:Christmas Day
LOCATION:San Francisco
END:VEVENT
END:VCALENDAR

View File

@ -1,11 +1,13 @@
BEGIN:VCALENDAR
PRODID:-//Your Product ID//EN
VERSION:2.0
NAME:Override Calendar
PRODID:-//CalMerge//Calendar Merger 1.0//EN
VERSION:2.0
CALSCALE:GREGORIAN
BEGIN:VEVENT
UID:20231225T000000-001@example.com
SUMMARY:Override Event Christmas Day
DTSTART:20231225T000000
DTEND:20231226T000000
DTSTART;VALUE=DATE:20231225
DTEND;VALUE=DATE:20231226
DTSTAMP:20231225T000000Z
SUMMARY:Override Event
END:VEVENT
END:VCALENDAR

View File

@ -1,17 +1,21 @@
BEGIN:VCALENDAR
PRODID:-//Your Product ID//EN
VERSION:2.0
NAME:Time Based Calendar
PRODID:-//CalMerge//Calendar Merger 1.0//EN
VERSION:2.0
CALSCALE:GREGORIAN
BEGIN:VEVENT
UID:20231109T110000-001@example.com
DTSTART:20231109T110000Z
DTEND:20231109T120000Z
DTSTAMP:20231109T110000Z
SUMMARY:team_meeting_calendar Team Meeting
DTSTART:20231109T140000
DTEND:20231109T150000
LOCATION:Virtual
END:VEVENT
BEGIN:VEVENT
UID:20231108T090000-001@example.com
SUMMARY:work_task Work Task
DTSTART:20231108T120000
DTEND:20231108T130000
DTSTART:20231108T090000Z
DTEND:20231108T100000Z
DTSTAMP:20231108T090000Z
SUMMARY:Work_Task Work Task
END:VEVENT
END:VCALENDAR

View File

@ -1,17 +0,0 @@
BEGIN:VCALENDAR
PRODID:-//Your Product ID//EN
VERSION:2.0
NAME:UTCEAT Time Zone Calendar
BEGIN:VEVENT
UID:20231108T100000Z-001@example.com
SUMMARY:UTC_Event UTC Event
DTSTART:20231108T130000
DTEND:20231108T140000
END:VEVENT
BEGIN:VEVENT
UID:20231108T090000+0300-001@example.com
SUMMARY:EAT_Event EAT Event
DTSTART:20231108T090000
DTEND:20231108T100000
END:VEVENT
END:VCALENDAR

View File

@ -1,15 +0,0 @@
{
"linkGroupName": "UTCEAT Time Zone Calendar",
"calendars": [
{
"url": "C:\\Users\\user\\OneDrive\\Desktop\\Internship_tasks\\final calmerg\\test\\test_calendars\\utc_time_zone_event.ics",
"prefix": "UTC_Event",
"override": false
},
{
"url": "C:\\Users\\user\\OneDrive\\Desktop\\Internship_tasks\\final calmerg\\test\\test_calendars\\eat_time_zone_event.ics",
"prefix": "EAT_Event",
"override": false
}
]
}

View File

@ -1,15 +1,13 @@
BEGIN:VCALENDAR
NAME:US Holidays
PRODID:-//CalMerge//Calendar Merger 1.0//EN
VERSION:2.0
PRODID:-//Example Corp//NONSGML Event//EN
CALSCALE:GREGORIAN
BEGIN:VEVENT
UID:20231225T000000-001@example.com
DTSTAMP:20231225T000000Z
DTSTART;VALUE=DATE:20231225
DTEND;VALUE=DATE:20231226
DTSTAMP:20231225T000000Z
SUMMARY:Christmas Day
DESCRIPTION:Public holiday for Christmas in The US.
LOCATION:San Francisco
STATUS:CONFIRMED
SEQUENCE:0
END:VEVENT
END:VCALENDAR
END:VCALENDAR

View File

@ -1,15 +0,0 @@
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Example Corp//NONSGML Event//EN
BEGIN:VEVENT
UID:20231108T090000+0300-001@example.com
DTSTAMP:20231108T090000+0300
DTSTART:20231108T090000+0300
DTEND:20231108T100000+0300
SUMMARY:EAT Event
DESCRIPTION:This event is scheduled in East Africa Time (UTC+3).
LOCATION:Virtual
STATUS:CONFIRMED
SEQUENCE:0
END:VEVENT
END:VCALENDAR

View File

@ -0,0 +1,15 @@
BEGIN:VCALENDAR
NAME:google-calendar-minimal
PRODID:-//CalMerge//Calendar Merger 1.0//EN
VERSION:2.0
CALSCALE:GREGORIAN
METHOD:PUBLISH
X-WR-TIMEZONE:Africa/Nairobi
BEGIN:VEVENT
UID:6tbrvsitniuu72li7kk15gou2b@google.com
DTSTART:20241003T190000Z
DTEND:20241003T200000Z
DTSTAMP:20241119T115316Z
SUMMARY:progodessey
END:VEVENT
END:VCALENDAR

View File

@ -0,0 +1,44 @@
BEGIN:VCALENDAR
PRODID:-//Google Inc//Google Calendar 70.9054//EN
VERSION:2.0
CALSCALE:GREGORIAN
METHOD:PUBLISH
X-WR-CALNAME:work
X-WR-TIMEZONE:Africa/Nairobi
BEGIN:VEVENT
DTSTART:20240930T113000Z
DTEND:20240930T123000Z
DTSTAMP:20241119T115316Z
UID:0d0p2hp0l26ebuk2r0kb1q9kuo@google.com
CREATED:20240930T111532Z
LAST-MODIFIED:20240930T111532Z
SEQUENCE:0
STATUS:CONFIRMED
SUMMARY:other work
TRANSP:OPAQUE
END:VEVENT
BEGIN:VEVENT
DTSTART:20241003T190000Z
DTEND:20241003T200000Z
DTSTAMP:20241119T115316Z
UID:6tbrvsitniuu72li7kk15gou2b@google.com
CREATED:20241001T194455Z
LAST-MODIFIED:20241001T194455Z
SEQUENCE:0
STATUS:CONFIRMED
SUMMARY:progodessey
TRANSP:OPAQUE
END:VEVENT
BEGIN:VEVENT
UID:7l7n9nltrudluv65gfgll2q930@google.com
DTSTART:20241009T173000Z
DTEND:20241009T183000Z
DTSTAMP:20241119T115316Z
CREATED:20241010T123337Z
LAST-MODIFIED:20241010T123337Z
SEQUENCE:0
STATUS:CONFIRMED
SUMMARY:do
TRANSP:OPAQUE
END:VEVENT
END:VCALENDAR

View File

@ -0,0 +1,32 @@
BEGIN:VCALENDAR
NAME:nextcloud-minimal
PRODID:-//CalMerge//Calendar Merger 1.0//EN
VERSION:2.0
CALSCALE:GREGORIAN
BEGIN:VTIMEZONE
TZID:Europe/Berlin
BEGIN:DAYLIGHT
TZOFFSETFROM:+0100
TZOFFSETTO:+0200
TZNAME:CEST
DTSTART:19700329T020000
RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
END:DAYLIGHT
BEGIN:STANDARD
TZOFFSETFROM:+0200
TZOFFSETTO:+0100
TZNAME:CET
DTSTART:19701025T030000
RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
END:STANDARD
END:VTIMEZONE
BEGIN:VEVENT
UID:5f4ad965-16a8-48eb-8233-78bf93a8b35e
DTSTART;TZID=Europe/Berlin:20241120T211500
DTEND;TZID=Europe/Berlin:20241120T215000
DTSTAMP:20241113T212909Z
SUMMARY:JR Weekly Check-In
LOCATION:FaceTime
RRULE:FREQ=WEEKLY;BYDAY=WE
END:VEVENT
END:VCALENDAR

View File

@ -0,0 +1,131 @@
BEGIN:VCALENDAR
VERSION:2.0
CALSCALE:GREGORIAN
PRODID:-//SabreDAV//SabreDAV//EN
X-WR-CALNAME:Progodyssey Ryan (stackspin-a51baefe-70df-4cce-9be1-048354b619
b8)
X-APPLE-CALENDAR-COLOR:#ddcb55
REFRESH-INTERVAL;VALUE=DURATION:PT4H
X-PUBLISHED-TTL:PT4H
BEGIN:VTIMEZONE
TZID:Europe/Berlin
BEGIN:DAYLIGHT
TZOFFSETFROM:+0100
TZOFFSETTO:+0200
TZNAME:CEST
DTSTART:19700329T020000
RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
END:DAYLIGHT
BEGIN:STANDARD
TZOFFSETFROM:+0200
TZOFFSETTO:+0100
TZNAME:CET
DTSTART:19701025T030000
RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
END:STANDARD
END:VTIMEZONE
BEGIN:VEVENT
CREATED:20241113T212909Z
DTEND;TZID=Europe/Berlin:20241120T215000
DTSTAMP:20241113T212909Z
DTSTART;TZID=Europe/Berlin:20241120T211500
LAST-MODIFIED:20241113T212909Z
LOCATION:FaceTime
RRULE:FREQ=WEEKLY;BYDAY=WE
SEQUENCE:0
STATUS:CONFIRMED
SUMMARY:JR Weekly Check-In
TRANSP:OPAQUE
UID:5f4ad965-16a8-48eb-8233-78bf93a8b35e
RELATED-TO;RELTYPE=SIBLING:17cf7d22-9bee-4a8e-9023-878b1a1b73a0
BEGIN:VALARM
ACKNOWLEDGED:20241113T202052Z
ACTION:DISPLAY
DESCRIPTION:This is an event reminder.
TRIGGER:-PT20M
UID:99250427-AB45-4111-A999-DB417FC290D1
X-WR-ALARMUID:99250427-AB45-4111-A999-DB417FC290D1
SUMMARY:JR Weekly Check-In
END:VALARM
END:VEVENT
BEGIN:VEVENT
CREATED:20241113T213036Z
DTEND;TZID=Europe/Berlin:20241204T212500
DTSTAMP:20241113T213036Z
DTSTART;TZID=Europe/Berlin:20241204T203000
LAST-MODIFIED:20241113T213036Z
LOCATION:FaceTime
SEQUENCE:1
STATUS:CONFIRMED
SUMMARY:JR Weekly Check-In
TRANSP:OPAQUE
UID:5f4ad965-16a8-48eb-8233-78bf93a8b35e
RELATED-TO;RELTYPE=SIBLING:17cf7d22-9bee-4a8e-9023-878b1a1b73a0
RECURRENCE-ID;TZID=Europe/Berlin:20241204T211500
BEGIN:VALARM
ACKNOWLEDGED:20241113T202052Z
ACTION:DISPLAY
DESCRIPTION:This is an event reminder.
TRIGGER:-PT20M
UID:99250427-AB45-4111-A999-DB417FC290D1
X-WR-ALARMUID:99250427-AB45-4111-A999-DB417FC290D1
SUMMARY:JR Weekly Check-In
END:VALARM
END:VEVENT
BEGIN:VEVENT
CREATED:20241107T101403Z
DTEND;TZID=Europe/Berlin:20241111T134500
DTSTAMP:20241118T103806Z
DTSTART;TZID=Europe/Berlin:20241111T121500
LAST-MODIFIED:20241118T103803Z
LOCATION:https://call.element.io/room/#/progodyssey?password=bU95nPdV2u-BGJ
4zw9cPGw&roomId=%21QsGQUxdyuMfGKhGvNH%3Acall.ems.host
RRULE:FREQ=WEEKLY;BYDAY=MO
SEQUENCE:4
STATUS:CONFIRMED
SUMMARY:JR Coprogramming Session
TRANSP:OPAQUE
UID:8c251542-6cbf-4396-b83d-490be79c97a9
BEGIN:VALARM
ACKNOWLEDGED:20241118T103803Z
ACTION:DISPLAY
DESCRIPTION:This is an event reminder.
SUMMARY:Coprogramming Session
TRIGGER:-PT1H
UID:55C3B462-E182-4A2B-A500-3F249FC860C2
X-WR-ALARMUID:55C3B462-E182-4A2B-A500-3F249FC860C2
END:VALARM
BEGIN:VALARM
ACTION:DISPLAY
DESCRIPTION:Reminder
TRIGGER:-PT1H
UID:9AABB2AB-A755-4723-87CF-10B119670E7F
X-APPLE-DEFAULT-ALARM:TRUE
X-WR-ALARMUID:9AABB2AB-A755-4723-87CF-10B119670E7F
END:VALARM
END:VEVENT
BEGIN:VEVENT
CREATED:20241107T101605Z
DTEND;TZID=Europe/Berlin:20241113T215500
DTSTAMP:20241113T212909Z
DTSTART;TZID=Europe/Berlin:20241113T213000
LAST-MODIFIED:20241113T212909Z
LOCATION:FaceTime
RRULE:FREQ=WEEKLY;BYDAY=WE;UNTIL=20241120T202959Z
SEQUENCE:4
STATUS:CONFIRMED
SUMMARY:JR Weekly Check-In
TRANSP:OPAQUE
UID:17cf7d22-9bee-4a8e-9023-878b1a1b73a0
RELATED-TO;RELTYPE=SIBLING:5f4ad965-16a8-48eb-8233-78bf93a8b35e
BEGIN:VALARM
ACKNOWLEDGED:20241113T202052Z
ACTION:DISPLAY
DESCRIPTION:This is an event reminder.
SUMMARY:JR Weekly Check-In
TRIGGER:-PT20M
UID:99250427-AB45-4111-A999-DB417FC290D1
X-WR-ALARMUID:99250427-AB45-4111-A999-DB417FC290D1
END:VALARM
END:VEVENT
END:VCALENDAR

View File

@ -1,15 +0,0 @@
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Example Corp//NONSGML Event//EN
BEGIN:VEVENT
UID:20231108T100000Z-001@example.com
DTSTAMP:20231108T100000Z
DTSTART:20231108T100000Z
DTEND:20231108T110000Z
SUMMARY:UTC Event
DESCRIPTION:This event is scheduled in UTC.
LOCATION:Virtual
STATUS:CONFIRMED
SEQUENCE:0
END:VEVENT
END:VCALENDAR

View File

@ -1,15 +1,11 @@
BEGIN:VCALENDAR
NAME:Time Based Calendar
VERSION:2.0
PRODID:-//Example Corp//NONSGML Event//EN
BEGIN:VEVENT
UID:20231108T090000-001@example.com
DTSTAMP:20231108T090000Z
DTSTART:20231108T090000Z
DTEND:20231108T100000Z
SUMMARY:Work Task
DESCRIPTION:Time-based work task event.
LOCATION:Office
STATUS:CONFIRMED
SEQUENCE:0
END:VEVENT
END:VCALENDAR
END:VCALENDAR