gitextract__ioz32a6/ ├── .editorconfig ├── .gitattributes ├── .github/ │ ├── CODE_OF_CONDUCT.md │ ├── CONTRIBUTING.md │ ├── FUNDING.yaml │ ├── ISSUE_TEMPLATE/ │ │ ├── bug_report.yml │ │ ├── change_request.yml │ │ ├── config.yml │ │ └── feature_request.yml │ ├── PULL_REQUEST_TEMPLATE.md │ ├── dependabot.yaml │ └── workflows/ │ ├── automated-tests.yaml │ ├── dep-review.yaml │ ├── electron-rebuild.yaml │ ├── enforce-pullrequest-rules.yaml │ ├── release-notes.yaml │ ├── spellcheck.yaml │ └── stale.yaml ├── .gitignore ├── .husky/ │ └── pre-commit ├── .markdownlint.json ├── .npmrc ├── .prettierignore ├── CHANGELOG.md ├── Collaboration.md ├── LICENSE.md ├── README.md ├── clientonly/ │ └── index.js ├── cspell.config.json ├── css/ │ ├── custom.css.sample │ ├── font-awesome.css │ ├── main.css │ └── roboto.css ├── eslint.config.mjs ├── index.html ├── jest.config.js ├── js/ │ ├── alias-resolver.js │ ├── animateCSS.js │ ├── app.js │ ├── check_config.js │ ├── class.js │ ├── defaults.js │ ├── deprecated.js │ ├── electron.js │ ├── ip_access_control.js │ ├── loader.js │ ├── logger.js │ ├── main.js │ ├── module.js │ ├── module_functions.js │ ├── node_helper.js │ ├── releasenotes.js │ ├── server.js │ ├── server_functions.js │ ├── socketclient.js │ ├── translator.js │ ├── utils.js │ └── vendor.js ├── jsconfig.json ├── module-types.ts ├── modules/ │ └── default/ │ ├── alert/ │ │ ├── README.md │ │ ├── alert.js │ │ ├── notificationFx.js │ │ ├── styles/ │ │ │ ├── center.css │ │ │ ├── left.css │ │ │ ├── notificationFx.css │ │ │ └── right.css │ │ ├── templates/ │ │ │ ├── alert.njk │ │ │ └── notification.njk │ │ └── translations/ │ │ ├── bg.json │ │ ├── da.json │ │ ├── de.json │ │ ├── el.json │ │ ├── en.json │ │ ├── eo.json │ │ ├── es.json │ │ ├── fr.json │ │ ├── hu.json │ │ ├── nl.json │ │ ├── pt-br.json │ │ ├── pt.json │ │ ├── ru.json │ │ └── th.json │ ├── calendar/ │ │ ├── README.md │ │ ├── calendar.css │ │ ├── calendar.js │ │ ├── calendarfetcher.js │ │ ├── calendarfetcherutils.js │ │ ├── calendarutils.js │ │ ├── debug.js │ │ ├── node_helper.js │ │ └── windowsZones.json │ ├── clock/ │ │ ├── README.md │ │ ├── clock.js │ │ └── clock_styles.css │ ├── compliments/ │ │ ├── README.md │ │ └── compliments.js │ ├── defaultmodules.js │ ├── helloworld/ │ │ ├── README.md │ │ ├── helloworld.js │ │ └── helloworld.njk │ ├── newsfeed/ │ │ ├── README.md │ │ ├── fullarticle.njk │ │ ├── newsfeed.css │ │ ├── newsfeed.js │ │ ├── newsfeed.njk │ │ ├── newsfeedfetcher.js │ │ ├── node_helper.js │ │ └── oldconfig.njk │ ├── updatenotification/ │ │ ├── README.md │ │ ├── git_helper.js │ │ ├── node_helper.js │ │ ├── update_helper.js │ │ ├── updatenotification.css │ │ ├── updatenotification.js │ │ └── updatenotification.njk │ ├── utils.js │ └── weather/ │ ├── README.md │ ├── current.njk │ ├── forecast.njk │ ├── hourly.njk │ ├── providers/ │ │ ├── README.md │ │ ├── envcanada.js │ │ ├── openmeteo.js │ │ ├── openweathermap.js │ │ ├── overrideWrapper.js │ │ ├── pirateweather.js │ │ ├── smhi.js │ │ ├── ukmetofficedatahub.js │ │ ├── weatherbit.js │ │ ├── weatherflow.js │ │ ├── weathergov.js │ │ └── yr.js │ ├── weather.css │ ├── weather.js │ ├── weatherobject.js │ ├── weatherprovider.js │ └── weatherutils.js ├── package.json ├── prettier.config.mjs ├── serveronly/ │ ├── index.js │ └── watcher.js ├── stylelint.config.mjs ├── tests/ │ ├── configs/ │ │ ├── customregions.js │ │ ├── default.js │ │ ├── empty_ipWhiteList.js │ │ ├── modules/ │ │ │ ├── alert/ │ │ │ │ ├── welcome_false.js │ │ │ │ ├── welcome_string.js │ │ │ │ └── welcome_true.js │ │ │ ├── calendar/ │ │ │ │ ├── 3_move_first_allday_repeating_event.js │ │ │ │ ├── auth-default.js │ │ │ │ ├── bad_rrule.js │ │ │ │ ├── basic-auth.js │ │ │ │ ├── berlin_end_of_day_repeating.js │ │ │ │ ├── berlin_multi.js │ │ │ │ ├── berlin_whole_day_event_moved_over_dst_change.js │ │ │ │ ├── changed-port.js │ │ │ │ ├── chicago-looking-at-ny-recurring.js │ │ │ │ ├── chicago_late_in_timezone.js │ │ │ │ ├── countCalendarEvents.js │ │ │ │ ├── custom.js │ │ │ │ ├── default.js │ │ │ │ ├── diff_tz_start_end.js │ │ │ │ ├── end_of_day_berlin_moved.js │ │ │ │ ├── event_with_time_over_multiple_days_non_repeating_display_end.js │ │ │ │ ├── event_with_time_over_multiple_days_non_repeating_no_display_end.js │ │ │ │ ├── exdate_and_recurrence_together.js │ │ │ │ ├── exdate_la_at_midnight_dst.js │ │ │ │ ├── exdate_la_at_midnight_std.js │ │ │ │ ├── exdate_la_before_midnight.js │ │ │ │ ├── exdate_syd_at_midnight_dst.js │ │ │ │ ├── exdate_syd_at_midnight_std.js │ │ │ │ ├── exdate_syd_before_midnight.js │ │ │ │ ├── fail-basic-auth.js │ │ │ │ ├── fullday_event_over_multiple_days_nonrepeating.js │ │ │ │ ├── fullday_until.js │ │ │ │ ├── germany_at_end_of_day_repeating.js │ │ │ │ ├── long-fullday-event.js │ │ │ │ ├── old-basic-auth.js │ │ │ │ ├── recurring.js │ │ │ │ ├── rrule_until.js │ │ │ │ ├── show-duplicates-in-calendar.js │ │ │ │ ├── single-fullday-event.js │ │ │ │ ├── sliceMultiDayEvents.js │ │ │ │ └── symboltest.js │ │ │ ├── clock/ │ │ │ │ ├── clock_12hr.js │ │ │ │ ├── clock_24hr.js │ │ │ │ ├── clock_analog.js │ │ │ │ ├── clock_displaySeconds_false.js │ │ │ │ ├── clock_showDateAnalog.js │ │ │ │ ├── clock_showPeriodUpper.js │ │ │ │ ├── clock_showSunMoon.js │ │ │ │ ├── clock_showSunNoEvent.js │ │ │ │ ├── clock_showTime.js │ │ │ │ ├── clock_showWeek.js │ │ │ │ ├── clock_showWeek_short.js │ │ │ │ ├── de/ │ │ │ │ │ ├── clock_showWeek.js │ │ │ │ │ └── clock_showWeek_short.js │ │ │ │ └── es/ │ │ │ │ ├── clock_12hr.js │ │ │ │ ├── clock_24hr.js │ │ │ │ ├── clock_showPeriodUpper.js │ │ │ │ ├── clock_showWeek.js │ │ │ │ └── clock_showWeek_short.js │ │ │ ├── compliments/ │ │ │ │ ├── compliments_animateCSS.js │ │ │ │ ├── compliments_animateCSS_fallbackToDefault.js │ │ │ │ ├── compliments_animateCSS_invertedAnimationName.js │ │ │ │ ├── compliments_anytime.js │ │ │ │ ├── compliments_cron_entry.js │ │ │ │ ├── compliments_date.js │ │ │ │ ├── compliments_e2e_cron_entry.js │ │ │ │ ├── compliments_evening.js │ │ │ │ ├── compliments_file.js │ │ │ │ ├── compliments_file_change.js │ │ │ │ ├── compliments_only_anytime.js │ │ │ │ ├── compliments_parts_day.js │ │ │ │ ├── compliments_remote.js │ │ │ │ ├── compliments_specialDayUnique_false.js │ │ │ │ └── compliments_specialDayUnique_true.js │ │ │ ├── display.js │ │ │ ├── helloworld/ │ │ │ │ ├── helloworld.js │ │ │ │ └── helloworld_default.js │ │ │ ├── newsfeed/ │ │ │ │ ├── default.js │ │ │ │ ├── ignore_items.js │ │ │ │ ├── incorrect_url.js │ │ │ │ └── prohibited_words.js │ │ │ ├── positions.js │ │ │ └── weather/ │ │ │ ├── currentweather_compliments.js │ │ │ ├── currentweather_default.js │ │ │ ├── currentweather_options.js │ │ │ ├── currentweather_units.js │ │ │ ├── forecastweather_absolute.js │ │ │ ├── forecastweather_default.js │ │ │ ├── forecastweather_options.js │ │ │ ├── forecastweather_units.js │ │ │ ├── hourlyweather_default.js │ │ │ ├── hourlyweather_options.js │ │ │ └── hourlyweather_showPrecipitation.js │ │ ├── noIpWhiteList.js │ │ ├── port_8090.js │ │ ├── port_variable.env │ │ ├── port_variable.js.template │ │ └── without_modules.js │ ├── e2e/ │ │ ├── animateCSS_spec.js │ │ ├── custom_module_regions_spec.js │ │ ├── env_spec.js │ │ ├── fonts_spec.js │ │ ├── helpers/ │ │ │ ├── basic-auth.js │ │ │ ├── global-setup.js │ │ │ └── weather-functions.js │ │ ├── ipWhitelist_spec.js │ │ ├── modules/ │ │ │ ├── alert_spec.js │ │ │ ├── calendar_spec.js │ │ │ ├── clock_de_spec.js │ │ │ ├── clock_es_spec.js │ │ │ ├── clock_spec.js │ │ │ ├── compliments_spec.js │ │ │ ├── helloworld_spec.js │ │ │ ├── newsfeed_spec.js │ │ │ ├── weather_current_spec.js │ │ │ ├── weather_forecast_spec.js │ │ │ └── weather_hourly_spec.js │ │ ├── modules_display_spec.js │ │ ├── modules_empty_spec.js │ │ ├── modules_position_spec.js │ │ ├── port_spec.js │ │ ├── serveronly_spec.js │ │ ├── template_spec.js │ │ ├── translations_spec.js │ │ └── vendor_spec.js │ ├── electron/ │ │ ├── env_spec.js │ │ ├── helpers/ │ │ │ ├── global-setup.js │ │ │ └── weather-setup.js │ │ └── modules/ │ │ ├── calendar_spec.js │ │ ├── compliments_spec.js │ │ └── weather_spec.js │ ├── mocks/ │ │ ├── 12_events.ics │ │ ├── 3_move_first_allday_repeating_event.ics │ │ ├── RepeatingEvent.Oct21.ics │ │ ├── bad_rrule.ics │ │ ├── calendar_duplicates_1.ics │ │ ├── calendar_duplicates_2.ics │ │ ├── calendar_test.ics │ │ ├── calendar_test_clone.ics │ │ ├── calendar_test_full_day_events.ics │ │ ├── calendar_test_icons.ics │ │ ├── calendar_test_multi_day_starting_today.ics │ │ ├── calendar_test_recurring.ics │ │ ├── chicago-nyedge.ics │ │ ├── chicago_late_in_timezone.ics │ │ ├── compliments_file.json │ │ ├── compliments_test.json │ │ ├── diff_tz_start_end.ics │ │ ├── end_of_day_berlin_moved.ics │ │ ├── event_with_time_over_multiple_days_non_repeating.ics │ │ ├── exdate_and_recurrence_together.ics │ │ ├── exdate_la_at_midnight_dst.ics │ │ ├── exdate_la_at_midnight_std.ics │ │ ├── exdate_la_before_midnight.ics │ │ ├── exdate_syd_at_midnight_dst.ics │ │ ├── exdate_syd_at_midnight_std.ics │ │ ├── exdate_syd_before_midnight.ics │ │ ├── fullday_event_over_multiple_days_nonrepeating.ics │ │ ├── fullday_until.ics │ │ ├── germany_at_end_of_day_repeating.ics │ │ ├── newsfeed_test.xml │ │ ├── rrule_until.ics │ │ ├── sliceMultiDayEvents.ics │ │ ├── testNotification/ │ │ │ └── testNotification.js │ │ ├── translation_test.json │ │ ├── weather_current.json │ │ ├── weather_forecast.json │ │ ├── weather_hourly.json │ │ └── whole_day_moved_over_dst_change_berlin.ics │ ├── unit/ │ │ ├── classes/ │ │ │ ├── class_spec.js │ │ │ ├── deprecated_spec.js │ │ │ ├── translator_spec.js │ │ │ └── utils_spec.js │ │ ├── functions/ │ │ │ ├── __snapshots__/ │ │ │ │ └── updatenotification_spec.js.snap │ │ │ ├── cmp_versions_spec.js │ │ │ ├── server_functions_spec.js │ │ │ └── updatenotification_spec.js │ │ ├── global_vars/ │ │ │ ├── defaults_modules_spec.js │ │ │ └── root_path_spec.js │ │ ├── helpers/ │ │ │ └── global-setup.js │ │ └── modules/ │ │ └── default/ │ │ ├── calendar/ │ │ │ ├── calendar_fetcher_utils_bad_rrule.js │ │ │ ├── calendar_fetcher_utils_spec.js │ │ │ └── calendar_utils_spec.js │ │ ├── compliments/ │ │ │ └── compliments_spec.js │ │ ├── utils_spec.js │ │ └── weather/ │ │ ├── weather_object_spec.js │ │ └── weather_utils_spec.js │ └── utils/ │ ├── vitest-setup.js │ └── weather_mocker.js ├── translations/ │ ├── af.json │ ├── ar.json │ ├── bg.json │ ├── ca.json │ ├── cs.json │ ├── cv.json │ ├── cy.json │ ├── da.json │ ├── de.json │ ├── el.json │ ├── en.json │ ├── eo.json │ ├── es.json │ ├── et.json │ ├── fi.json │ ├── fr.json │ ├── fy.json │ ├── gl.json │ ├── gu.json │ ├── he.json │ ├── hi.json │ ├── hr.json │ ├── hu.json │ ├── id.json │ ├── is.json │ ├── it.json │ ├── ja.json │ ├── ko.json │ ├── lt.json │ ├── ms-my.json │ ├── nb.json │ ├── nl.json │ ├── nn.json │ ├── pl.json │ ├── ps.json │ ├── pt-br.json │ ├── pt.json │ ├── ro.json │ ├── ru.json │ ├── sk.json │ ├── sv.json │ ├── th.json │ ├── tlh.json │ ├── tr.json │ ├── translations.js │ ├── uk.json │ ├── zh-cn.json │ └── zh-tw.json └── vitest.config.mjs