diff --git a/.eslintrc.json b/.eslintrc.json index 15d2efd..8893149 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,6 +1,3 @@ { - "parserOptions": { - "ecmaVersion": 2017, - "sourceType": "module" - } + "extends": "athom" } \ No newline at end of file diff --git a/.homeychangelog.json b/.homeychangelog.json index fdbc7cb..4d61162 100644 --- a/.homeychangelog.json +++ b/.homeychangelog.json @@ -1,4 +1,7 @@ { + "1.12.0": { + "en": ". " + }, "1.11.1": { "en": "Bug fix for the 'Holiday today' / 'Not a holiday today' action. Added 'Use automatic holiday' action to go back to automatic holidays. " }, diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..1ec82fc --- /dev/null +++ b/.npmrc @@ -0,0 +1,3 @@ +registry=https://registry.npmjs.org + +@balmli:registry=https://npm.pkg.github.com diff --git a/README.md b/README.md index 2e50649..4a89dfc 100644 --- a/README.md +++ b/README.md @@ -274,6 +274,10 @@ Please report issues on the [community forum page](https://community.homey.app/t ### Release Notes: +#### 1.12.0 + +- + #### 1.11.1 - Bug fix for the 'Holiday today' / 'Not a holiday today' action diff --git a/app.js b/app.js deleted file mode 100644 index 19ee22d..0000000 --- a/app.js +++ /dev/null @@ -1,189 +0,0 @@ -'use strict'; - -const Homey = require('homey'); -const moment = require('./lib/moment-timezone-with-data'); -const days = require('./lib/days'); -const holidays = require('./lib/holidays'); - -class HeatingControllerApp extends Homey.App { - - async onInit() { - days.setTimeZone(this.homey.clock.getTimezone()); - this.utilityBillApi = this.homey.api.getApiApp('no.almli.utilitycost'); - await this._initFlows(); - this.log('HeatingControllerApp is running...'); - } - - async _initFlows() { - this.homey.flow.getConditionCard('is_public_holiday') - .registerRunListener((args) => this.check(args, { 'public': true })); - this.homey.flow.getConditionCard('is_bank_holiday') - .registerRunListener((args) => this.check(args, { 'bank': true })); - this.homey.flow.getConditionCard('is_observance_holiday') - .registerRunListener((args) => this.check(args, { 'observance': true })); - this.homey.flow.getConditionCard('is_holiday') - .registerRunListener((args) => this.check(args, { 'public': true, 'bank': true, 'observance': true })); - - this.homey.flow.getConditionCard('is_workingday') - .registerRunListener((args) => { - const theDay = holidays.calcDate(moment(), args.condition); - return theDay.day() >= 1 && theDay.day() <= 5 && !this.check(args, { - 'public': true, - 'bank': true, - 'observance': true - }); - }); - - this.homey.flow.getDeviceTriggerCard('high_x_hours_of_day') - .registerRunListener((args, state) => args.device._heatingOffHighPriceComparer(args, state)); - this.homey.flow.getDeviceTriggerCard('low_x_hours_of_day') - .registerRunListener((args, state) => args.device._lowHoursComparer(args, state)); - - this.homey.flow.getConditionCard('is_home') - .registerRunListener((args, state) => args.device.getCapabilityValue('onoff')); - this.homey.flow.getConditionCard('is_home_override') - .registerRunListener((args, state) => args.device.getCapabilityValue('home_override')); - this.homey.flow.getConditionCard('is_night') - .registerRunListener((args, state) => args.device.getCapabilityValue('night')); - this.homey.flow.getConditionCard('is_at_work') - .registerRunListener((args, state) => args.device.getCapabilityValue('at_work')); - this.homey.flow.getConditionCard('is_heating_on') - .registerRunListener((args, state) => args.device.getCapabilityValue('heating')); - this.homey.flow.getConditionCard('current_price_below') - .registerRunListener(args => args.device._lastPrice && (args.price > args.device._lastPrice.price)); - - this.homey.flow.getConditionCard('high_x_hours_of_day_condition') - .registerRunListener((args, state) => { - state.high_price = true; - return args.device._highHoursComparer(args, state); - }); - - this.homey.flow.getConditionCard('low_x_hours_of_day_condition') - .registerRunListener((args, state) => { - state.low_price = true; - return args.device._lowHoursComparer(args, state); - }); - - this.homey.flow.getConditionCard('price_below_avg_condition') - .registerRunListener((args, state) => { - state.below = true; - return args.device._priceAvgComparer(args, state); - }); - - this.homey.flow.getConditionCard('price_below_avg_next_hours_condition') - .registerRunListener((args, state) => { - state.below = true; - return args.device._priceAvgComparer(args, state); - }); - - this.homey.flow.getConditionCard('price_above_avg_condition') - .registerRunListener((args, state) => { - state.below = false; - return args.device._priceAvgComparer(args, state); - }); - - this.homey.flow.getConditionCard('price_above_avg_next_hours_condition') - .registerRunListener((args, state) => { - state.below = false; - return args.device._priceAvgComparer(args, state); - }); - - this.homey.flow.getConditionCard('prices_among_lowest_condition') - .registerRunListener((args, state) => args.device._priceAmongLowestComparer(args, state)); - - this.homey.flow.getConditionCard('prices_among_highest_condition') - .registerRunListener((args, state) => args.device._priceAmongHighestComparer(args, state)); - - this.homey.flow.getConditionCard('price_lowest_among_in_period') - .registerRunListener((args, state) => args.device._priceLowestInPeriodComparer(args, state)); - - this.homey.flow.getConditionCard('price_highest_among_in_period') - .registerRunListener((args, state) => args.device._priceHighestInPeriodComparer(args, state)); - - this.homey.flow.getConditionCard('price_lower_next_hours') - .registerRunListener((args, state) => args.device._priceLowerNextHoursComparer(args, state)); - - this.homey.flow.getConditionCard('price_higher_next_hours') - .registerRunListener((args, state) => args.device._priceHigherNextHoursComparer(args, state)); - - this.homey.flow.getConditionCard('prices_lowest_next_hours') - .registerRunListener((args, state) => args.device._priceLowestNextHoursComparer(args, state)); - - this.homey.flow.getConditionCard('prices_highest_next_hours') - .registerRunListener((args, state) => args.device._priceHighestNextHoursComparer(args, state)); - - this.homey.flow.getConditionCard('price_diff_high_low') - .registerRunListener((args, state) => args.device._priceDiffHighLowComparer(args, state)); - - this.homey.flow.getConditionCard('price_diff_high_low2') - .registerRunListener((args, state) => args.device._priceDiffHighLowComparer2(args, state)); - - this.homey.flow.getActionCard('set_at_home_on') - .registerRunListener((args, state) => args.device.onActionSetAtHomeOn()); - - this.homey.flow.getActionCard('set_at_home_off') - .registerRunListener((args, state) => args.device.onActionSetAtHomeOff()); - - this.homey.flow.getActionCard('set_at_home_off_auto') - .registerRunListener((args, state) => args.device.onActionSetAtHomeOffAuto()); - - this.homey.flow.getActionCard('set_home_override_on') - .registerRunListener((args, state) => args.device.onActionSetHomeOverrideOn()); - - this.homey.flow.getActionCard('set_home_override_on_auto') - .registerRunListener((args, state) => args.device.onActionSetHomeOverrideOnAuto()); - - this.homey.flow.getActionCard('set_home_override_off') - .registerRunListener((args, state) => args.device.onActionSetHomeOverrideOff()); - - this.homey.flow.getActionCard('set_holiday_today') - .registerRunListener((args, state) => args.device.onActionSetHolidayToday(args)); - - this.homey.flow.getActionCard('clear_holiday_today') - .registerRunListener((args, state) => args.device.onActionClearHolidayToday()); - } - - check(args, types) { - if (!args.country || !args.condition) { - return false; - } - let hd; - try { - hd = holidays.isHoliday(args.country, moment(), args.condition); - } catch (err) { - console.error(err); - } - return hd && hd.type && hd.type in types; - } - - async _checkApi() { - try { - const isInstalled = await this.utilityBillApi.getInstalled(); - const version = await this.utilityBillApi.getVersion(); - if (isInstalled && !!version) { - const split = version.split('.'); - let apiOk = (Number(split[0]) >= 1 && Number(split[1]) >= 4); - this.log(`Utility Bill: ${version} installed${apiOk ? ' and ready' : ', but not ready'}`, split); - return apiOk; - } else { - this.log(`Utility Bill: not installed`); - } - } catch (err) { - this.log(`Checking Utility Bill API: ${err.message}`); - } - return false; - } - - async fetchPrices() { - if (await this._checkApi()) { - try { - return await this.utilityBillApi.get('/prices'); - } catch (err) { - this.log('Fetching prices from the Utility Bill app failed: ', err); - } - } - } - -} - -module.exports = HeatingControllerApp; diff --git a/app.ts b/app.ts new file mode 100644 index 0000000..64f04aa --- /dev/null +++ b/app.ts @@ -0,0 +1,191 @@ +import Homey from 'homey'; +import moment from 'moment-timezone'; + +import {holidays, Holiday} from '@balmli/homey-public-holidays' + +module.exports = class HeatingControllerApp extends Homey.App { + + utilityBillApi: any; + + async onInit() { + moment.tz.setDefault(this.homey.clock.getTimezone()); + this.utilityBillApi = this.homey.api.getApiApp('no.almli.utilitycost'); + await this._initFlows(); + this.log('HeatingControllerApp is running...'); + } + + async _initFlows() { + this.homey.flow.getConditionCard('is_public_holiday') + .registerRunListener((args) => this.check(args, {'public': true})); + this.homey.flow.getConditionCard('is_bank_holiday') + .registerRunListener((args) => this.check(args, {'bank': true})); + this.homey.flow.getConditionCard('is_observance_holiday') + .registerRunListener((args) => this.check(args, {'observance': true})); + this.homey.flow.getConditionCard('is_holiday') + .registerRunListener((args) => this.check(args, {'public': true, 'bank': true, 'observance': true})); + + this.homey.flow.getConditionCard('is_workingday') + .registerRunListener((args) => { + const theDay = holidays.calcDate(moment().toDate(), args.condition); + return theDay.getDay() >= 1 && theDay.getDay() <= 5 && !this.check(args, { + 'public': true, + 'bank': true, + 'observance': true + }); + }); + + this.homey.flow.getDeviceTriggerCard('high_x_hours_of_day') + .registerRunListener((args, state) => args.device.priceComparer.heatingOffHighPriceComparer(args, state)); + this.homey.flow.getDeviceTriggerCard('low_x_hours_of_day') + .registerRunListener((args, state) => args.device.priceComparer.lowHoursComparer(args, state)); + + this.homey.flow.getConditionCard('is_home') + .registerRunListener((args, state) => args.device.getCapabilityValue('onoff')); + this.homey.flow.getConditionCard('is_home_override') + .registerRunListener((args, state) => args.device.getCapabilityValue('home_override')); + this.homey.flow.getConditionCard('is_night') + .registerRunListener((args, state) => args.device.getCapabilityValue('night')); + this.homey.flow.getConditionCard('is_at_work') + .registerRunListener((args, state) => args.device.getCapabilityValue('at_work')); + this.homey.flow.getConditionCard('is_heating_on') + .registerRunListener((args, state) => args.device.getCapabilityValue('heating')); + this.homey.flow.getConditionCard('current_price_below') + .registerRunListener(args => args.device._lastPrice && (args.price > args.device._lastPrice.price)); + + this.homey.flow.getConditionCard('high_x_hours_of_day_condition') + .registerRunListener((args, state) => { + state.high_price = true; + return args.device.priceComparer.highHoursComparer(args, state); + }); + + this.homey.flow.getConditionCard('low_x_hours_of_day_condition') + .registerRunListener((args, state) => { + state.low_price = true; + return args.device.priceComparer.lowHoursComparer(args, state); + }); + + this.homey.flow.getConditionCard('price_below_avg_condition') + .registerRunListener((args, state) => { + state.below = true; + return args.device.priceComparer.priceAvgComparer(args, state); + }); + + this.homey.flow.getConditionCard('price_below_avg_next_hours_condition') + .registerRunListener((args, state) => { + state.below = true; + return args.device.priceComparer.priceAvgComparer(args, state); + }); + + this.homey.flow.getConditionCard('price_above_avg_condition') + .registerRunListener((args, state) => { + state.below = false; + return args.device.priceComparer.priceAvgComparer(args, state); + }); + + this.homey.flow.getConditionCard('price_above_avg_next_hours_condition') + .registerRunListener((args, state) => { + state.below = false; + return args.device.priceComparer.priceAvgComparer(args, state); + }); + + this.homey.flow.getConditionCard('prices_among_lowest_condition') + .registerRunListener((args, state) => args.device.priceComparer.priceAmongLowestComparer(args, state)); + + this.homey.flow.getConditionCard('prices_among_highest_condition') + .registerRunListener((args, state) => args.device.priceComparer.priceAmongHighestComparer(args, state)); + + this.homey.flow.getConditionCard('price_lowest_among_in_period') + .registerRunListener((args, state) => args.device.priceComparer.priceLowestInPeriodComparer(args, state)); + + this.homey.flow.getConditionCard('price_highest_among_in_period') + .registerRunListener((args, state) => args.device.priceComparer.priceHighestInPeriodComparer(args, state)); + + this.homey.flow.getConditionCard('price_lower_next_hours') + .registerRunListener((args, state) => args.device.priceComparer.priceLowerNextHoursComparer(args, state)); + + this.homey.flow.getConditionCard('price_higher_next_hours') + .registerRunListener((args, state) => args.device.priceComparer.priceHigherNextHoursComparer(args, state)); + + this.homey.flow.getConditionCard('prices_lowest_next_hours') + .registerRunListener((args, state) => args.device.priceComparer.priceLowestNextHoursComparer(args, state)); + + this.homey.flow.getConditionCard('prices_highest_next_hours') + .registerRunListener((args, state) => args.device.priceComparer.priceHighestNextHoursComparer(args, state)); + + this.homey.flow.getConditionCard('price_diff_high_low') + .registerRunListener((args, state) => args.device.priceComparer.priceDiffHighLowComparer(args, state)); + + this.homey.flow.getConditionCard('price_diff_high_low2') + .registerRunListener((args, state) => args.device.priceComparer.priceDiffHighLowComparer2(args, state)); + + this.homey.flow.getActionCard('set_at_home_on') + .registerRunListener((args, state) => args.device.onActionSetAtHomeOn()); + + this.homey.flow.getActionCard('set_at_home_off') + .registerRunListener((args, state) => args.device.onActionSetAtHomeOff()); + + this.homey.flow.getActionCard('set_at_home_off_auto') + .registerRunListener((args, state) => args.device.onActionSetAtHomeOffAuto()); + + this.homey.flow.getActionCard('set_home_override_on') + .registerRunListener((args, state) => args.device.onActionSetHomeOverrideOn()); + + this.homey.flow.getActionCard('set_home_override_on_auto') + .registerRunListener((args, state) => args.device.onActionSetHomeOverrideOnAuto()); + + this.homey.flow.getActionCard('set_home_override_off') + .registerRunListener((args, state) => args.device.onActionSetHomeOverrideOff()); + + this.homey.flow.getActionCard('set_holiday_today') + .registerRunListener((args, state) => args.device.onActionSetHolidayToday(args)); + + this.homey.flow.getActionCard('clear_holiday_today') + .registerRunListener((args, state) => args.device.onActionClearHolidayToday()); + } + + check(args: any, types: any) { + if (!args.country || !args.condition) { + return false; + } + let hd; + try { + hd = holidays.isHoliday(args.country, moment().toDate(), args.condition); + } catch (err) { + console.error(err); + } + if (hd == false) { + return false; + } + const hdd = hd as Holiday; + return hdd.type in types; + } + + async _checkApi() { + try { + const isInstalled = await this.utilityBillApi.getInstalled(); + const version = await this.utilityBillApi.getVersion(); + if (isInstalled && !!version) { + const split = version.split('.'); + let apiOk = (Number(split[0]) >= 1 && Number(split[1]) >= 4); + this.log(`Utility Bill: ${version} installed${apiOk ? ' and ready' : ', but not ready'}`, split); + return apiOk; + } else { + this.log(`Utility Bill: not installed`); + } + } catch (err: any) { + this.log(`Checking Utility Bill API: ${err.message}`); + } + return false; + } + + async fetchPrices() { + if (await this._checkApi()) { + try { + return await this.utilityBillApi.get('/prices'); + } catch (err) { + this.log('Fetching prices from the Utility Bill app failed: ', err); + } + } + } + +} diff --git a/drivers/HeatingController/device.js b/drivers/HeatingController/device.js deleted file mode 100644 index e5aac4f..0000000 --- a/drivers/HeatingController/device.js +++ /dev/null @@ -1,654 +0,0 @@ -'use strict'; - -const Homey = require('homey'); -const moment = require('../../lib/moment-timezone-with-data'); -const pricesLib = require('../../lib/prices'); -const nordpool = require('../../lib/nordpool'); -const heating = require('../../lib/heating'); - -module.exports = class HeatingControllerDevice extends Homey.Device { - - async onInit() { - await this.migrate(); - await this.fixPrice(this.getSetting('currency')); - this._at_home = undefined; - this._home_override = undefined; - this._home_on_next_period = false; - this._ho_off_next_period = false; - - this._lastFetchData = undefined; - this._lastPrice = undefined; - this._prices = undefined; - - this.registerCapabilityListener('onoff', async (value, opts) => { - this.log(this.getName() + ' -> onoff changed: ', value, opts); - await this.checkTime({ onoff: value }); - if (value) { - this.homey.flow.getDeviceTriggerCard('home_was_set_on').trigger(this, {}).catch(this.error); - } else { - this.homey.flow.getDeviceTriggerCard('home_was_set_off').trigger(this, {}).catch(this.error); - } - }); - - this.scheduleCheckTime(5); - this.log(this.getName() + ' -> device initialized'); - } - - async migrate() { - try { - if (!this.hasCapability('price_ratio')) { - await this.addCapability('price_ratio'); - } - this.log(this.getName() + ' -> migrated OK'); - } catch (err) { - this.error(err); - } - } - - async fixPrice(selectedCurrency) { - try { - if (this.hasCapability('price')) { - await this.removeCapability('price'); - } - for (let currency of ['DKK', 'EUR', 'NOK', 'SEK']) { - if (currency !== selectedCurrency && - this.hasCapability(`price_${currency}`)) { - await this.removeCapability(`price_${currency}`); - } - } - if (!this.hasCapability(`price_${selectedCurrency}`)) { - await this.addCapability(`price_${selectedCurrency}`); - } - } catch (err) { - this.error(err); - } - } - - async onSettings({ oldSettings, newSettings, changedKeys }) { - if (changedKeys.includes('currency') || changedKeys.includes('pricesFromUtilityBill')) { - await this.fixPrice(newSettings.currency); - this._lastFetchData = undefined; - this._lastPrice = undefined; - this.scheduleCheckTime(5); - } - } - - async onActionSetAtHomeOn() { - await this.setCapabilityValue('onoff', true).catch(this.error); - await this.homey.flow.getDeviceTriggerCard('home_was_set_on').trigger(this, {}).catch(this.error); - return this.checkTime({ onoff: true }); - } - - async onActionSetAtHomeOff() { - this._home_on_next_period = false; - await this.setCapabilityValue('onoff', false).catch(this.error); - await this.homey.flow.getDeviceTriggerCard('home_was_set_off').trigger(this, {}).catch(this.error); - return this.checkTime({ onoff: false }); - } - - async onActionSetAtHomeOffAuto() { - this._home_on_next_period = true; - await this.setCapabilityValue('onoff', false).catch(this.error); - await this.homey.flow.getDeviceTriggerCard('home_was_set_off').trigger(this, {}).catch(this.error); - return this.checkTime({ onoff: false }); - } - - async onActionSetHomeOverrideOn() { - this._ho_off_next_period = false; - await this.setCapabilityValue('home_override', true).catch(this.error); - await this.homey.flow.getDeviceTriggerCard('homeoverride_set_on').trigger(this, {}).catch(this.error); - return this.checkTime({ home_override: true}); - } - - async onActionSetHomeOverrideOnAuto() { - this._ho_off_next_period = true; - await this.setCapabilityValue('home_override', true).catch(this.error); - await this.homey.flow.getDeviceTriggerCard('homeoverride_set_on').trigger(this, {}).catch(this.error); - return this.checkTime({ home_override: true}); - } - - async onActionSetHomeOverrideOff() { - await this.setCapabilityValue('home_override', false).catch(this.error); - await this.homey.flow.getDeviceTriggerCard('home_override_set_off').trigger(this, {}).catch(this.error); - return this.checkTime({ home_override: false}); - } - - async onActionSetHolidayToday(args) { - await this.setSettings({ holiday_today: args.holiday }).catch(this.error); - return this.checkTime(); - } - - async onActionClearHolidayToday() { - await this.setSettings({ holiday_today: '' }).catch(this.error); - return this.checkTime(); - } - - onAdded() { - this.log(this.getName() + ' -> device added', this.getData().id); - } - - onDeleted() { - this._deleted = true; - this.clearCheckTime(); - this.log(this.getName() + ' -> device deleted'); - } - - clearCheckTime() { - if (this.curTimeout) { - this.homey.clearTimeout(this.curTimeout); - this.curTimeout = undefined; - } - } - - scheduleCheckTime(seconds = 60) { - if (this._deleted) { - return; - } - this.clearCheckTime(); - this.log(`Checking time in ${seconds} seconds`); - this.curTimeout = this.homey.setTimeout(this.checkTime.bind(this), seconds * 1000); - } - - async checkTime(props = {}) { - const onoff = props.onoff; - const home_override = props.home_override; - if (this._deleted) { - return; - } - try { - this.log('Checking: ', this.getData().id); - this.clearCheckTime(); - - if (onoff === false || onoff === true) { - this._at_home = onoff; - } else { - this._at_home = this.getCapabilityValue('onoff'); - } - if (this._at_home === undefined || this._at_home === null) { - this._at_home = true; - await this.setCapabilityValue('onoff', this._at_home).catch(this.error); - } - - if (home_override === false || home_override === true) { - this._home_override = home_override; - } else { - this._home_override = this.getCapabilityValue('home_override'); - } - if (this._home_override === undefined || this._home_override === null) { - this._home_override = false; - await this.setCapabilityValue('home_override', this._home_override).catch(this.error); - } - if (this.shallFetchData()) { - await this.fetchData(); - } - if (this._prices) { - await this.onData(); - } - } catch (err) { - this.error(err); - } finally { - this.scheduleCheckTime(); - } - } - - async fetchData() { - try { - const settings = this.getSettings(); - if (settings.pricesFromUtilityBill) { - const pricesUtilityBill = await this.homey.app.fetchPrices(); - this._lastFetchData = moment(); - this._prices = pricesUtilityBill ? pricesUtilityBill - .map(p => { - return { - startsAt: moment(p.time * 1000), - time: p.time, - price: p.price, - } - }) : undefined; - this.log('Got prices from the Utility Bill app:', this._prices ? this._prices.length : 0); - } else { - const priceArea = settings.priceArea || 'Oslo'; - const currency = settings.currency || 'EUR'; - this.log('Will fetch prices:', this.getData().id, priceArea, currency); - const localTime = moment().startOf('day'); - const prices = await nordpool.fetchPrices(localTime, { priceArea, currency }); - this._lastFetchData = moment(); - this._prices = prices; - this.log('Got prices:', this.getData().id, prices.length); - } - } catch (err) { - this.error(err); - } - } - - shallFetchData() { - return !this._prices - || !this._lastFetchData - || pricesLib.toHour(this._lastFetchData) !== pricesLib.toHour(moment()); - } - - async onData() { - try { - const localTime = moment(); - const heatingOptions = this._getHeatingOptions(); - let calcHeating = heating.calcHeating(localTime, this._at_home, this._home_override, heatingOptions); - this.log('Heating:', calcHeating); - - const curNight = this.getCapabilityValue('night'); - let nightChanged = false; - if (curNight === undefined || curNight === null || calcHeating.night !== curNight) { - nightChanged = true; - await this.setCapabilityValue('night', calcHeating.night).catch(this.error); - } - - const curAtWork = this.getCapabilityValue('at_work'); - let atWorkChanged = false; - if (curAtWork === undefined || curAtWork === null || calcHeating.atWork !== curAtWork) { - atWorkChanged = true; - await this.setCapabilityValue('at_work', calcHeating.atWork).catch(this.error); - } - - if (nightChanged || atWorkChanged) { - let recalcHeating = false; - if (this._home_on_next_period) { - recalcHeating = true; - this._home_on_next_period = false; - this._at_home = true; - await this.setCapabilityValue('onoff', true).catch(this.error); - await this.homey.flow.getDeviceTriggerCard('home_was_set_on').trigger(this, {}).catch(this.error); - this.log('Automatically set home mode'); - } - if (this._ho_off_next_period) { - recalcHeating = true; - this._ho_off_next_period = false; - this._home_override = false; - await this.setCapabilityValue('home_override', false).catch(this.error); - await this.homey.flow.getDeviceTriggerCard('home_override_set_off').trigger(this, {}).catch(this.error); - this.log('Automatically set home override off'); - } - if (recalcHeating) { - calcHeating = heating.calcHeating(localTime, this._at_home, this._home_override, heatingOptions); - this.log('Heating recalculated:', calcHeating); - } - } - - const curHeating = this.getCapabilityValue('heating'); - const heatChanged = curHeating === undefined || curHeating === null || calcHeating.heating !== curHeating; - if (heatChanged) { - await this.setCapabilityValue('heating', calcHeating.heating).catch(this.error); - } - - const currentPrice = pricesLib.currentPrice(this._prices, localTime); - const startAtHour = currentPrice ? pricesLib.toHour(currentPrice.startsAt) : undefined; - const priceRatio = pricesLib.priceRatio(this._prices, localTime); - const price = currentPrice ? currentPrice.price : undefined; - let priceChanged = false; - - if (currentPrice) { - this.log('Current price:', startAtHour, price); - - priceChanged = !this._lastPrice || startAtHour !== pricesLib.toHour(this._lastPrice.startsAt); - this._lastPrice = currentPrice; - const priceCapability = `price_${this.getSetting('currency')}`; - if (this.hasCapability(priceCapability)) { - await this.setCapabilityValue(priceCapability, price).catch(this.error); - } - if (priceRatio !== undefined && this.hasCapability('price_ratio')) { - await this.setCapabilityValue('price_ratio', priceRatio).catch(this.error); - } - } - - if (nightChanged) { - if (calcHeating.night) { - await this.homey.flow.getDeviceTriggerCard('night_starts').trigger(this, {}).catch(this.error); - this.log('Night starts trigger'); - } else { - await this.homey.flow.getDeviceTriggerCard('night_ends').trigger(this, {}).catch(this.error); - this.log('Night ends trigger'); - } - } - - if (atWorkChanged) { - if (calcHeating.atWork) { - await this.homey.flow.getDeviceTriggerCard('at_work_starts').trigger(this, {}).catch(this.error); - this.log('At work starts trigger'); - } else { - await this.homey.flow.getDeviceTriggerCard('at_work_ends').trigger(this, {}).catch(this.error); - this.log('At work ends trigger'); - } - } - - if (heatChanged) { - if (calcHeating.heating) { - await this.homey.flow.getDeviceTriggerCard('comfort_mode').trigger(this, {}).catch(this.error); - this.log('Comfort mode trigger'); - } else { - await this.homey.flow.getDeviceTriggerCard('eco_mode').trigger(this, {}).catch(this.error); - this.log('ECO mode trigger'); - } - } - - if (priceChanged) { - const sorted = pricesLib.pricesSorted(this._prices, localTime); - const priceMin = sorted.length > 0 ? sorted[0].price : undefined; - const priceMax = sorted.length > 0 ? sorted[sorted.length - 1].price : undefined; - const priceLevel = pricesLib.priceLevel(this._prices, localTime); - await this.homey.flow.getDeviceTriggerCard('price_changed').trigger(this, { - price, - heating: calcHeating.heating, - priceRatio, - priceMin, - priceMax, - priceLevel: priceLevel ? priceLevel.code : '', - priceLevelDescr: priceLevel ? priceLevel.description : '', - }).catch(this.error); - this.log('Price changed trigger', startAtHour, price, priceRatio); - } - - if (priceChanged || heatChanged) { - await this.homey.flow.getDeviceTriggerCard('high_x_hours_of_day').trigger(this, { - heating: calcHeating.heating, - high_price: true - }, { - atHome: this._at_home, - homeOverride: this._home_override, - high_price: true, - heatingOptions: heatingOptions - }).catch(this.error); - - await this.homey.flow.getDeviceTriggerCard('high_x_hours_of_day').trigger(this, { - heating: calcHeating.heating, - high_price: false - }, { - atHome: this._at_home, - homeOverride: this._home_override, - high_price: false, - heatingOptions: heatingOptions - }).catch(this.error); - - await this.homey.flow.getDeviceTriggerCard('low_x_hours_of_day').trigger(this, { - heating: calcHeating.heating, - low_price: true - }, { - low_price: true - }).catch(this.error); - - await this.homey.flow.getDeviceTriggerCard('low_x_hours_of_day').trigger(this, { - heating: calcHeating.heating, - low_price: false - }, { - low_price: false - }).catch(this.error); - } - } catch (err) { - this.error(err); - } - } - - async _heatingOffHighPriceComparer(args, state) { - if (!args.high_hours - || args.high_hours <= 0 - || args.high_hours >= 24 - || !this._prices) { - return false; - } - - const localTime = moment(); - - // Finds prices starting at 00:00 today - const pricesNextHours = pricesLib.pricesStarting(this._prices, localTime, 0, 24); - if (pricesNextHours.length === 0) { - return false; - } - - // Check if high price now. Must be ECO mode, and will skip consecutive hours. - const highPriceNow = pricesLib.checkHighPrice2(pricesNextHours, args.high_hours, localTime, state); - - return state.high_price === false && highPriceNow.length === 0 || state.high_price === true && highPriceNow.length === 1; - } - - async _highHoursComparer(args, state) { - if (!args.high_hours - || args.high_hours <= 0 - || args.high_hours >= 24 - || !this._prices) { - return false; - } - - const localTime = moment(); - - // Finds prices starting at 00:00 today - const pricesNextHours = pricesLib.pricesStarting(this._prices, localTime, 0, 24); - if (pricesNextHours.length === 0) { - return false; - } - - // Check if high price now. - const highPriceNow = pricesLib.checkHighPrice(pricesNextHours, args.high_hours, localTime); - - return state.high_price === false && highPriceNow.length === 0 || state.high_price === true && highPriceNow.length === 1; - } - - async _lowHoursComparer(args, state) { - if (!args.low_hours - || args.low_hours <= 0 - || args.low_hours >= 24 - || !this._prices) { - return false; - } - - const localTime = moment(); - - // Finds prices starting at 00:00 today - const pricesNextHours = pricesLib.pricesStarting(this._prices, localTime, 0, 24); - if (pricesNextHours.length === 0) { - return false; - } - - // Check if low price now - const lowPriceNow = pricesLib.checkLowPrice(pricesNextHours, args.low_hours, localTime); - - return state.low_price === true && lowPriceNow.length === 1 || state.low_price === false && lowPriceNow.length === 0; - } - - async _priceAvgComparer(args, state) { - if (!args.percentage - || args.percentage <= 0 - || args.percentage >= 100 - || !this._prices) { - return false; - } - const localTime = moment(); - let startHour = 0; - let numHours = 24; - if (args.hours) { - startHour = localTime.hour(); - numHours = args.hours; - } - - const currentPrice = pricesLib.currentPrice(this._prices, localTime); - - // Finds average of prices - const averagePrice = pricesLib.averagePricesStarting(this._prices, localTime, startHour, numHours); - if (!averagePrice) { - return false; - } - - return pricesLib.checkAveragePrice(currentPrice.price, averagePrice, state.below, args.percentage); - } - - async _priceAmongLowestComparer(args, state) { - if (!args.low_hours - || args.low_hours <= 0 - || args.low_hours >= 24 - || !this._prices) { - return false; - } - - const localTime = moment(); - let startHour = 0; - let numHours = 24; - let numLowestHours = 1; - if (args.hours) { - startHour = localTime.hour(); - numHours = args.hours; - numLowestHours = args.low_hours; - } - - return pricesLib.pricesAmongLowest(this._prices, localTime, startHour, numHours, numLowestHours); - } - - async _priceAmongHighestComparer(args, state) { - if (!args.high_hours - || args.high_hours <= 0 - || args.high_hours >= 24 - || !this._prices) { - return false; - } - - const localTime = moment(); - let startHour = 0; - let numHours = 24; - let numHighestHours = 1; - if (args.hours) { - startHour = localTime.hour(); - numHours = args.hours; - numHighestHours = args.high_hours; - } - - return pricesLib.pricesAmongHighest(this._prices, localTime, startHour, numHours, numHighestHours); - } - - async _priceLowestInPeriodComparer(args, state) { - if (args.start === undefined - || args.end === undefined - || !args.low_hours - || args.low_hours <= 0 - || args.low_hours >= 24 - || !this._prices) { - return false; - } - - const localTime = moment(); - const { startTs, endTs } = pricesLib.daysPeriod(localTime, args.start, args.end); - return pricesLib.pricesLowestInPeriod(this._prices, localTime, startTs, endTs, args.low_hours); - } - - async _priceHighestInPeriodComparer(args, state) { - if (args.start === undefined - || args.end === undefined - || !args.high_hours - || args.high_hours <= 0 - || args.high_hours >= 24 - || !this._prices) { - return false; - } - - const localTime = moment(); - const { startTs, endTs } = pricesLib.daysPeriod(localTime, args.start, args.end); - return pricesLib.pricesHighestInPeriod(this._prices, localTime, startTs, endTs, args.high_hours); - } - - _priceLowestNextHoursComparer(args, state) { - if (args.start === undefined - || args.end === undefined - || !args.hours - || args.hours <= 0 - || args.hours > 24 - || !this._prices) { - return false; - } - - const localTime = moment(); - const { startTs, endTs } = pricesLib.daysPeriod(localTime, args.start, args.end); - const sumPrice = pricesLib.checkSumPrices(this._prices, localTime, startTs, endTs, args.hours, true); - return !!sumPrice; - } - - _priceHighestNextHoursComparer(args, state) { - if (args.start === undefined - || args.end === undefined - || !args.hours - || args.hours <= 0 - || args.hours > 24 - || !this._prices) { - return false; - } - - const localTime = moment(); - const { startTs, endTs } = pricesLib.daysPeriod(localTime, args.start, args.end); - const sumPrice = pricesLib.checkSumPrices(this._prices, localTime, startTs, endTs, args.hours, false); - return !!sumPrice; - } - - _priceDiffHighLowComparer(args, state) { - if (!args.percentage - || args.percentage < 0 - || args.percentage > 9999 - || !this._prices) { - return false; - } - - const localTime = moment(); - const diffCheck = pricesLib.priceHighLow(this._prices, localTime); - return diffCheck.diffPercentage < args.percentage; - } - - _priceDiffHighLowComparer2(args, state) { - if (!args.amount - || args.amount < 0 - || args.amount > 9999 - || !this._prices) { - return false; - } - - const localTime = moment(); - const diffCheck = pricesLib.priceHighLow(this._prices, localTime); - return diffCheck.diffAmount < args.amount; - } - - _priceLowerNextHoursComparer(args, state) { - if (!args.hours - || args.hours <= 0 - || args.hours > 24 - || !this._prices) { - return false; - } - - const localTime = moment(); - return pricesLib.currentPriceLowerThanNext(this._prices, localTime, args.hours); - } - - _priceHigherNextHoursComparer(args, state) { - if (!args.hours - || args.hours <= 0 - || args.hours > 24 - || !this._prices) { - return false; - } - - const localTime = moment(); - return pricesLib.currentPriceHigherThanNext(this._prices, localTime, args.hours); - } - - _getHeatingOptions() { - const settings = this.getSettings(); - return { - workday: { - startHour: settings.workdayStartHour || 5, - endHour: settings.workdayEndHour || 22.5, - }, - notWorkday: { - startHour: settings.notWorkdayStartHour || 7, - endHour: settings.notWorkdayEndHour || 23, - }, - workHours: { - startHour: settings.workHoursStartHour || 7, - endHour: settings.workHoursEndHour || 14 - }, - country: settings.country, - holiday_today: settings.holiday_today - }; - } - -}; diff --git a/drivers/HeatingController/device.ts b/drivers/HeatingController/device.ts new file mode 100644 index 0000000..210b115 --- /dev/null +++ b/drivers/HeatingController/device.ts @@ -0,0 +1,418 @@ +const Homey = require('homey'); +import moment from 'moment-timezone'; + +import {heating, HeatingOptions, HolidayToday, NordpoolApi, PriceApi, PriceComparer} from '@balmli/homey-utility-prices' + +module.exports = class HeatingControllerDevice extends Homey.Device { + + priceApi = new PriceApi() + nordpool = new NordpoolApi() + priceComparer = new PriceComparer(this.priceApi) + + async onInit() { + await this.migrate(); + await this.fixPrice(this.getSetting('currency')); + this._at_home = undefined; + this._home_override = undefined; + this._home_on_next_period = false; + this._ho_off_next_period = false; + + this._lastFetchData = undefined; + this._lastPrice = undefined; + this._prices = undefined; + + this.registerCapabilityListener('onoff', async (value: any, opts: any) => { + this.log(this.getName() + ' -> onoff changed: ', value, opts); + await this.checkTime({onoff: value}); + if (value) { + this.homey.flow.getDeviceTriggerCard('home_was_set_on').trigger(this, {}).catch(this.error); + } else { + this.homey.flow.getDeviceTriggerCard('home_was_set_off').trigger(this, {}).catch(this.error); + } + }); + + this.scheduleCheckTime(5); + this.log(this.getName() + ' -> device initialized'); + } + + async migrate() { + try { + if (!this.hasCapability('price_ratio')) { + await this.addCapability('price_ratio'); + } + this.log(this.getName() + ' -> migrated OK'); + } catch (err) { + this.error(err); + } + } + + async fixPrice(selectedCurrency: string): Promise { + try { + if (this.hasCapability('price')) { + await this.removeCapability('price'); + } + for (let currency of ['DKK', 'EUR', 'NOK', 'SEK']) { + if (currency !== selectedCurrency && + this.hasCapability(`price_${currency}`)) { + await this.removeCapability(`price_${currency}`); + } + } + if (!this.hasCapability(`price_${selectedCurrency}`)) { + await this.addCapability(`price_${selectedCurrency}`); + } + } catch (err) { + this.error(err); + } + } + + async onSettings({oldSettings, newSettings, changedKeys}: { + oldSettings: any; + newSettings: any; + changedKeys: string[]; + }): Promise { + if (changedKeys.includes('currency') || changedKeys.includes('pricesFromUtilityBill')) { + await this.fixPrice(newSettings.currency); + this._lastFetchData = undefined; + this._lastPrice = undefined; + this.scheduleCheckTime(5); + } + } + + async onActionSetAtHomeOn() { + await this.setCapabilityValue('onoff', true).catch(this.error); + await this.homey.flow.getDeviceTriggerCard('home_was_set_on').trigger(this, {}).catch(this.error); + return this.checkTime({onoff: true}); + } + + async onActionSetAtHomeOff() { + this._home_on_next_period = false; + await this.setCapabilityValue('onoff', false).catch(this.error); + await this.homey.flow.getDeviceTriggerCard('home_was_set_off').trigger(this, {}).catch(this.error); + return this.checkTime({onoff: false}); + } + + async onActionSetAtHomeOffAuto() { + this._home_on_next_period = true; + await this.setCapabilityValue('onoff', false).catch(this.error); + await this.homey.flow.getDeviceTriggerCard('home_was_set_off').trigger(this, {}).catch(this.error); + return this.checkTime({onoff: false}); + } + + async onActionSetHomeOverrideOn() { + this._ho_off_next_period = false; + await this.setCapabilityValue('home_override', true).catch(this.error); + await this.homey.flow.getDeviceTriggerCard('homeoverride_set_on').trigger(this, {}).catch(this.error); + return this.checkTime({home_override: true}); + } + + async onActionSetHomeOverrideOnAuto() { + this._ho_off_next_period = true; + await this.setCapabilityValue('home_override', true).catch(this.error); + await this.homey.flow.getDeviceTriggerCard('homeoverride_set_on').trigger(this, {}).catch(this.error); + return this.checkTime({home_override: true}); + } + + async onActionSetHomeOverrideOff() { + await this.setCapabilityValue('home_override', false).catch(this.error); + await this.homey.flow.getDeviceTriggerCard('home_override_set_off').trigger(this, {}).catch(this.error); + return this.checkTime({home_override: false}); + } + + async onActionSetHolidayToday(args: any) { + await this.setSettings({holiday_today: args.holiday}).catch(this.error); + return this.checkTime(); + } + + async onActionClearHolidayToday() { + await this.setSettings({holiday_today: ''}).catch(this.error); + return this.checkTime(); + } + + onAdded() { + this.log(this.getName() + ' -> device added', this.getData().id); + } + + onDeleted() { + this._deleted = true; + this.clearCheckTime(); + this.log(this.getName() + ' -> device deleted'); + } + + clearCheckTime() { + if (this.curTimeout) { + this.homey.clearTimeout(this.curTimeout); + this.curTimeout = undefined; + } + } + + scheduleCheckTime(seconds = 60) { + if (this._deleted) { + return; + } + this.clearCheckTime(); + this.log(`Checking time in ${seconds} seconds`); + this.curTimeout = this.homey.setTimeout(this.checkTime.bind(this), seconds * 1000); + } + + async checkTime(props: any = {}) { + const onoff = props.onoff; + const home_override = props.home_override; + if (this._deleted) { + return; + } + try { + this.log('Checking: ', this.getData().id); + this.clearCheckTime(); + + if (onoff === false || onoff === true) { + this._at_home = onoff; + } else { + this._at_home = this.getCapabilityValue('onoff'); + } + if (this._at_home === undefined || this._at_home === null) { + this._at_home = true; + await this.setCapabilityValue('onoff', this._at_home).catch(this.error); + } + + if (home_override === false || home_override === true) { + this._home_override = home_override; + } else { + this._home_override = this.getCapabilityValue('home_override'); + } + if (this._home_override === undefined || this._home_override === null) { + this._home_override = false; + await this.setCapabilityValue('home_override', this._home_override).catch(this.error); + } + if (this.shallFetchData()) { + await this.fetchData(); + } + if (this._prices) { + await this.onData(); + } + } catch (err) { + this.error(err); + } finally { + this.scheduleCheckTime(); + } + } + + async fetchData() { + try { + const settings = this.getSettings(); + if (settings.pricesFromUtilityBill) { + const pricesUtilityBill = await this.homey.app.fetchPrices(); + this._lastFetchData = moment(); + this._prices = pricesUtilityBill ? pricesUtilityBill + .map((p: any) => { + return { + startsAt: moment(p.time * 1000), + time: p.time, + price: p.price, + } + }) : undefined; + this.priceComparer.updatePrices(this._prices); + this.log('Got prices from the Utility Bill app:', this._prices ? this._prices.length : 0); + } else { + const priceArea = settings.priceArea || 'Oslo'; + const currency = settings.currency || 'EUR'; + this.log('Will fetch prices:', this.getData().id, priceArea, currency); + const localTime = moment().startOf('day'); + const prices = await this.nordpool.fetchPrices(localTime, {priceArea, currency}); + this._lastFetchData = moment(); + this._prices = prices; + this.priceComparer.updatePrices(this._prices); + this.log('Got prices:', this.getData().id, prices.length); + } + } catch (err) { + this.error(err); + } + } + + shallFetchData() { + return !this._prices + || this._prices.length == 0 + || !this._lastFetchData + || this.priceApi.toHour(this._lastFetchData) !== this.priceApi.toHour(moment()); + } + + async onData() { + try { + const localTime = moment(); + const heatingOptions = this._getHeatingOptions(); + let calcHeating = heating.calcHeating(localTime, this._at_home, this._home_override, heatingOptions); + this.log('Heating:', calcHeating); + + const curNight = this.getCapabilityValue('night'); + let nightChanged = false; + if (curNight === undefined || curNight === null || calcHeating.night !== curNight) { + nightChanged = true; + await this.setCapabilityValue('night', calcHeating.night).catch(this.error); + } + + const curAtWork = this.getCapabilityValue('at_work'); + let atWorkChanged = false; + if (curAtWork === undefined || curAtWork === null || calcHeating.atWork !== curAtWork) { + atWorkChanged = true; + await this.setCapabilityValue('at_work', calcHeating.atWork).catch(this.error); + } + + if (nightChanged || atWorkChanged) { + let recalcHeating = false; + if (this._home_on_next_period) { + recalcHeating = true; + this._home_on_next_period = false; + this._at_home = true; + await this.setCapabilityValue('onoff', true).catch(this.error); + await this.homey.flow.getDeviceTriggerCard('home_was_set_on').trigger(this, {}).catch(this.error); + this.log('Automatically set home mode'); + } + if (this._ho_off_next_period) { + recalcHeating = true; + this._ho_off_next_period = false; + this._home_override = false; + await this.setCapabilityValue('home_override', false).catch(this.error); + await this.homey.flow.getDeviceTriggerCard('home_override_set_off').trigger(this, {}).catch(this.error); + this.log('Automatically set home override off'); + } + if (recalcHeating) { + calcHeating = heating.calcHeating(localTime, this._at_home, this._home_override, heatingOptions); + this.log('Heating recalculated:', calcHeating); + } + } + + const curHeating = this.getCapabilityValue('heating'); + const heatChanged = curHeating === undefined || curHeating === null || calcHeating.heating !== curHeating; + if (heatChanged) { + await this.setCapabilityValue('heating', calcHeating.heating).catch(this.error); + } + + const currentPrice = this.priceApi.currentPrice(this._prices, localTime); + const startAtHour = currentPrice ? this.priceApi.toHour(currentPrice.startsAt) : undefined; + const priceRatio = this.priceApi.priceRatio(this._prices, localTime); + const price = currentPrice ? currentPrice.price : undefined; + let priceChanged = false; + + if (currentPrice) { + this.log('Current price:', startAtHour, price); + + priceChanged = !this._lastPrice || startAtHour !== this.priceApi.toHour(this._lastPrice.startsAt); + this._lastPrice = currentPrice; + const priceCapability = `price_${this.getSetting('currency')}`; + if (this.hasCapability(priceCapability)) { + await this.setCapabilityValue(priceCapability, price).catch(this.error); + } + if (priceRatio !== undefined && this.hasCapability('price_ratio')) { + await this.setCapabilityValue('price_ratio', priceRatio).catch(this.error); + } + } + + if (nightChanged) { + if (calcHeating.night) { + await this.homey.flow.getDeviceTriggerCard('night_starts').trigger(this, {}).catch(this.error); + this.log('Night starts trigger'); + } else { + await this.homey.flow.getDeviceTriggerCard('night_ends').trigger(this, {}).catch(this.error); + this.log('Night ends trigger'); + } + } + + if (atWorkChanged) { + if (calcHeating.atWork) { + await this.homey.flow.getDeviceTriggerCard('at_work_starts').trigger(this, {}).catch(this.error); + this.log('At work starts trigger'); + } else { + await this.homey.flow.getDeviceTriggerCard('at_work_ends').trigger(this, {}).catch(this.error); + this.log('At work ends trigger'); + } + } + + if (heatChanged) { + if (calcHeating.heating) { + await this.homey.flow.getDeviceTriggerCard('comfort_mode').trigger(this, {}).catch(this.error); + this.log('Comfort mode trigger'); + } else { + await this.homey.flow.getDeviceTriggerCard('eco_mode').trigger(this, {}).catch(this.error); + this.log('ECO mode trigger'); + } + } + + if (priceChanged) { + const sorted = this.priceApi.pricesSorted(this._prices, localTime); + const priceMin = sorted.length > 0 ? sorted[0].price : undefined; + const priceMax = sorted.length > 0 ? sorted[sorted.length - 1].price : undefined; + const priceLevel = this.priceApi.priceLevel(this._prices, localTime); + await this.homey.flow.getDeviceTriggerCard('price_changed').trigger(this, { + price, + heating: calcHeating.heating, + priceRatio, + priceMin, + priceMax, + priceLevel: priceLevel ? priceLevel.code : '', + priceLevelDescr: priceLevel ? priceLevel.description : '', + }).catch(this.error); + this.log('Price changed trigger', startAtHour, price, priceRatio); + } + + if (priceChanged || heatChanged) { + await this.homey.flow.getDeviceTriggerCard('high_x_hours_of_day').trigger(this, { + heating: calcHeating.heating, + high_price: true + }, { + atHome: this._at_home, + homeOverride: this._home_override, + high_price: true, + heatingOptions: heatingOptions + }).catch(this.error); + + await this.homey.flow.getDeviceTriggerCard('high_x_hours_of_day').trigger(this, { + heating: calcHeating.heating, + high_price: false + }, { + atHome: this._at_home, + homeOverride: this._home_override, + high_price: false, + heatingOptions: heatingOptions + }).catch(this.error); + + await this.homey.flow.getDeviceTriggerCard('low_x_hours_of_day').trigger(this, { + heating: calcHeating.heating, + low_price: true + }, { + low_price: true + }).catch(this.error); + + await this.homey.flow.getDeviceTriggerCard('low_x_hours_of_day').trigger(this, { + heating: calcHeating.heating, + low_price: false + }, { + low_price: false + }).catch(this.error); + } + } catch (err) { + this.error(err); + } + } + + _getHeatingOptions(): HeatingOptions { + const settings = this.getSettings(); + return { + workday: { + startHour: settings.workdayStartHour || 5, + endHour: settings.workdayEndHour || 22.5, + }, + notWorkday: { + startHour: settings.notWorkdayStartHour || 7, + endHour: settings.notWorkdayEndHour || 23, + }, + workHours: { + startHour: settings.workHoursStartHour || 7, + endHour: settings.workHoursEndHour || 14 + }, + country: settings.country, + holiday_today: settings.holiday_today === 'holiday' ? HolidayToday.holiday : + settings.holiday_today === 'not_holiday' ? HolidayToday.not_holiday : + HolidayToday.automatic + }; + } + +}; diff --git a/drivers/HeatingController/driver.js b/drivers/HeatingController/driver.js deleted file mode 100644 index c3fbdde..0000000 --- a/drivers/HeatingController/driver.js +++ /dev/null @@ -1,30 +0,0 @@ -'use strict'; - -const Homey = require('homey'); - -module.exports = class HeatingControllerDriver extends Homey.Driver { - - async onInit() { - this.log('HeatingControllerDriver driver has been initialized'); - } - - async onPairListDevices() { - return [ - { - "name": "Heating Controller", - "data": { - "id": guid() - } - } - ]; - } - -}; - -function guid() { - function s4() { - return Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1); - } - - return s4() + s4() + '-' + s4() + '-' + s4() + '-' + s4() + '-' + s4() + s4() + s4(); -} diff --git a/drivers/HeatingController/driver.ts b/drivers/HeatingController/driver.ts new file mode 100644 index 0000000..1ecc184 --- /dev/null +++ b/drivers/HeatingController/driver.ts @@ -0,0 +1,28 @@ +const Homey = require('homey'); + +module.exports = class HeatingControllerDriver extends Homey.Driver { + + async onInit() { + this.log('HeatingControllerDriver driver has been initialized'); + } + + async onPairListDevices() { + return [ + { + "name": "Heating Controller", + "data": { + "id": guid() + } + } + ]; + } + +}; + +function guid() { + function s4() { + return Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1); + } + + return s4() + s4() + '-' + s4() + '-' + s4() + '-' + s4() + '-' + s4() + s4() + s4(); +} diff --git a/image.xcf b/image.xcf deleted file mode 100644 index 8fd1ce1..0000000 Binary files a/image.xcf and /dev/null differ diff --git a/lib/countries.js b/lib/countries.js deleted file mode 100644 index d86e0d1..0000000 --- a/lib/countries.js +++ /dev/null @@ -1,130 +0,0 @@ -'use strict'; - -const countries = [ - { - "id": "AU", - "name": "Australia" - }, - { - "id": "AT", - "name": "Austria" - }, - { - "id": "BE", - "name": "Belgium" - }, - { - "id": "BG", - "name": "Bulgaria" - }, - { - "id": "CZ", - "name": "Czech Republic" - }, - { - "id": "DK", - "name": "Denmark" - }, - { - "id": "EE", - "name": "Estonia" - }, - { - "id": "FI", - "name": "Finland" - }, - { - "id": "FR", - "name": "France" - }, - { - "id": "DE", - "name": "Germany" - }, - { - "id": "HU", - "name": "Hungary" - }, - { - "id": "IS", - "name": "Iceland" - }, - { - "id": "IE", - "name": "Ireland" - }, - { - "id": "IT", - "name": "Italy" - }, - { - "id": "LV", - "name": "Latvia" - }, - { - "id": "LI", - "name": "Lichtenstein" - }, - { - "id": "LT", - "name": "Lithuania" - }, - { - "id": "LU", - "name": "Luxembourg" - }, - { - "id": "NL", - "name": "Netherlands" - }, - { - "id": "NO", - "name": "Norway" - }, - { - "id": "PL", - "name": "Poland" - }, - { - "id": "PT", - "name": "Portugal" - }, - { - "id": "RO", - "name": "Romania" - }, - { - "id": "RU", - "name": "Russia" - }, - { - "id": "SG", - "name": "Singapore" - }, - { - "id": "SK", - "name": "Slovakia" - }, - { - "id": "SI", - "name": "Slovenia" - }, - { - "id": "ES", - "name": "Spain" - }, - { - "id": "SE", - "name": "Sweden" - }, - { - "id": "CH", - "name": "Switzerland" - }, - { - "id": "GB", - "name": "United Kingdom" - } -]; - -module.exports = countries; diff --git a/lib/days.js b/lib/days.js deleted file mode 100644 index 87ede7a..0000000 --- a/lib/days.js +++ /dev/null @@ -1,11 +0,0 @@ -'use strict'; - -const moment = require('./moment-timezone-with-data'); - -const setTimeZone = (tz) => { - moment.tz.setDefault(tz); -}; - -module.exports = { - setTimeZone -}; diff --git a/lib/heating.js b/lib/heating.js deleted file mode 100644 index aa010e4..0000000 --- a/lib/heating.js +++ /dev/null @@ -1,58 +0,0 @@ -'use strict'; - -const moment = require('./moment-timezone-with-data'); -const holidays = require('./holidays'); - -const isDay = function (aDate, opts) { - let hour = aDate.hour() + aDate.minute() / 60 + aDate.second() / 3600; - let workdayToday = isWorkDay(aDate, opts); - let workdayTomorrow = isWorkDay(moment(aDate).add(1, 'day'), opts); - let startHour = workdayToday ? opts.workday.startHour : opts.notWorkday.startHour; - let endHour = workdayToday ? opts.workday.endHour : opts.notWorkday.endHour; - let endHour1 = startHour <= endHour ? 0 : endHour; - let endHour2 = workdayTomorrow ? (opts.workday.startHour <= opts.workday.endHour ? opts.workday.endHour : 24) : - (opts.notWorkday.startHour <= opts.notWorkday.endHour ? opts.notWorkday.endHour : 24); - - return hour < endHour1 || hour >= startHour && hour < endHour2; -}; - -const isWorkDay = function (aDate, opts) { - return !isHoliday(aDate, opts) && aDate.day() >= 1 && aDate.day() <= 5; -}; - -const isWorkTime = function (aDate, opts) { - let hour = aDate.hour() + aDate.minute() / 60 + aDate.second() / 3600; - return isWorkDay(aDate, opts) && - (opts.workHours.startHour <= opts.workHours.endHour ? - hour >= opts.workHours.startHour && hour < opts.workHours.endHour : - hour >= opts.workHours.startHour || hour < opts.workHours.endHour); -}; - -const isHoliday = function (aDate, opts) { - if (opts && (opts.holiday_today === 'holiday' || opts.holiday_today === 'not_holiday')) { - return opts.holiday_today === 'holiday'; - } - let hd = holidays.isHoliday(opts.country || 'NO', aDate); - return hd && (hd.type === 'public' || hd.type === 'bank'); -}; - -const calcHeating = function (aDate, atHome, homeOverride, opts) { - let day = isDay(aDate, opts); - let night = !day; - let atWork = isWorkTime(aDate, opts); - return { - date: aDate.toISOString(), - lDate: aDate.format('YYYY-MM-DDTHH:mm:ss'), - atHome: atHome, - homeOverride: homeOverride, - day: day, - night: night, - atWork: atWork, - heating: atHome === true && night === false && atWork === false || homeOverride === true && night === false - } -}; - -module.exports = { - calcHeating -}; - diff --git a/lib/holidays.js b/lib/holidays.js deleted file mode 100644 index b3630f3..0000000 --- a/lib/holidays.js +++ /dev/null @@ -1,22 +0,0 @@ -'use strict'; - -const holidays_list = require('./holidays_list'); - -const calcDate = function (aDate, condition) { - if (condition === 'yesterday') { - return aDate.add(-1, 'day'); - } else if (condition === 'tomorrow') { - return aDate.add(1, 'day'); - } - return aDate; -}; - -const isHoliday = function (country, aDate, condition) { - const holi = holidays_list[`${country}-${calcDate(aDate, condition).format('YYYY-MM-DD')}`]; - return !holi ? false : holi; -}; - -module.exports = { - calcDate, - isHoliday -}; diff --git a/lib/holidays_list.js b/lib/holidays_list.js deleted file mode 100644 index 36c461c..0000000 --- a/lib/holidays_list.js +++ /dev/null @@ -1,1678 +0,0 @@ -'use strict'; -const holidays_list = { -"AU-2021-01-01":{"type":"public","name":"New Year's Day"}, -"AU-2021-01-26":{"type":"public","name":"Australia Day"}, -"AU-2021-04-02":{"type":"public","name":"Good Friday"}, -"AU-2021-04-03":{"type":"public","name":"Easter Saturday"}, -"AU-2021-04-04":{"type":"public","name":"Easter Sunday"}, -"AU-2021-04-05":{"type":"public","name":"Easter Monday"}, -"AU-2021-04-25":{"type":"public","name":"Anzac Day"}, -"AU-2021-12-25":{"type":"public","name":"Christmas Day"}, -"AU-2021-12-26":{"type":"public","name":"Boxing Day"}, -"AU-2021-12-27":{"type":"public","name":"Christmas Day (substitute day)"}, -"AU-2021-12-28":{"type":"public","name":"Boxing Day (substitute day)"}, -"AU-2022-01-01":{"type":"public","name":"New Year's Day"}, -"AU-2022-01-03":{"type":"public","name":"New Year's Day"}, -"AU-2022-01-26":{"type":"public","name":"Australia Day"}, -"AU-2022-04-15":{"type":"public","name":"Good Friday"}, -"AU-2022-04-16":{"type":"public","name":"Easter Saturday"}, -"AU-2022-04-17":{"type":"public","name":"Easter Sunday"}, -"AU-2022-04-18":{"type":"public","name":"Easter Monday"}, -"AU-2022-04-25":{"type":"public","name":"Anzac Day"}, -"AU-2022-12-25":{"type":"public","name":"Christmas Day"}, -"AU-2022-12-26":{"type":"public","name":"Boxing Day"}, -"AU-2022-12-27":{"type":"public","name":"Christmas Day (substitute day)"}, -"AU-2023-01-01":{"type":"public","name":"New Year's Day"}, -"AU-2023-01-02":{"type":"public","name":"New Year's Day"}, -"AU-2023-01-26":{"type":"public","name":"Australia Day"}, -"AU-2023-04-07":{"type":"public","name":"Good Friday"}, -"AU-2023-04-08":{"type":"public","name":"Easter Saturday"}, -"AU-2023-04-09":{"type":"public","name":"Easter Sunday"}, -"AU-2023-04-10":{"type":"public","name":"Easter Monday"}, -"AU-2023-04-25":{"type":"public","name":"Anzac Day"}, -"AU-2023-12-25":{"type":"public","name":"Christmas Day"}, -"AU-2023-12-26":{"type":"public","name":"Boxing Day"}, -"AT-2021-01-01":{"type":"public","name":"Neujahr"}, -"AT-2021-01-06":{"type":"public","name":"Heilige Drei Könige"}, -"AT-2021-04-02":{"type":"optional","name":"Karfreitag"}, -"AT-2021-04-03":{"type":"observance","name":"Karsamstag"}, -"AT-2021-04-04":{"type":"public","name":"Ostersonntag"}, -"AT-2021-04-05":{"type":"public","name":"Ostermontag"}, -"AT-2021-05-01":{"type":"public","name":"Staatsfeiertag"}, -"AT-2021-05-09":{"type":"observance","name":"Muttertag"}, -"AT-2021-05-13":{"type":"public","name":"Christi Himmelfahrt"}, -"AT-2021-05-23":{"type":"public","name":"Pfingstsonntag"}, -"AT-2021-05-24":{"type":"public","name":"Pfingstmontag"}, -"AT-2021-06-03":{"type":"public","name":"Fronleichnam"}, -"AT-2021-08-15":{"type":"public","name":"Mariä Himmelfahrt"}, -"AT-2021-10-26":{"type":"public","name":"Nationalfeiertag"}, -"AT-2021-11-01":{"type":"public","name":"Allerheiligen"}, -"AT-2021-12-08":{"type":"public","name":"Mariä Empfängnis"}, -"AT-2021-12-24":{"type":"bank","name":"Heiliger Abend"}, -"AT-2021-12-25":{"type":"public","name":"Christtag"}, -"AT-2021-12-26":{"type":"public","name":"Stefanitag"}, -"AT-2021-12-31":{"type":"bank","name":"Silvester"}, -"AT-2022-01-01":{"type":"public","name":"Neujahr"}, -"AT-2022-01-06":{"type":"public","name":"Heilige Drei Könige"}, -"AT-2022-04-15":{"type":"optional","name":"Karfreitag"}, -"AT-2022-04-16":{"type":"observance","name":"Karsamstag"}, -"AT-2022-04-17":{"type":"public","name":"Ostersonntag"}, -"AT-2022-04-18":{"type":"public","name":"Ostermontag"}, -"AT-2022-05-01":{"type":"public","name":"Staatsfeiertag"}, -"AT-2022-05-08":{"type":"observance","name":"Muttertag"}, -"AT-2022-05-26":{"type":"public","name":"Christi Himmelfahrt"}, -"AT-2022-06-05":{"type":"public","name":"Pfingstsonntag"}, -"AT-2022-06-06":{"type":"public","name":"Pfingstmontag"}, -"AT-2022-06-16":{"type":"public","name":"Fronleichnam"}, -"AT-2022-08-15":{"type":"public","name":"Mariä Himmelfahrt"}, -"AT-2022-10-26":{"type":"public","name":"Nationalfeiertag"}, -"AT-2022-11-01":{"type":"public","name":"Allerheiligen"}, -"AT-2022-12-08":{"type":"public","name":"Mariä Empfängnis"}, -"AT-2022-12-24":{"type":"bank","name":"Heiliger Abend"}, -"AT-2022-12-25":{"type":"public","name":"Christtag"}, -"AT-2022-12-26":{"type":"public","name":"Stefanitag"}, -"AT-2022-12-31":{"type":"bank","name":"Silvester"}, -"AT-2023-01-01":{"type":"public","name":"Neujahr"}, -"AT-2023-01-06":{"type":"public","name":"Heilige Drei Könige"}, -"AT-2023-04-07":{"type":"optional","name":"Karfreitag"}, -"AT-2023-04-08":{"type":"observance","name":"Karsamstag"}, -"AT-2023-04-09":{"type":"public","name":"Ostersonntag"}, -"AT-2023-04-10":{"type":"public","name":"Ostermontag"}, -"AT-2023-05-01":{"type":"public","name":"Staatsfeiertag"}, -"AT-2023-05-14":{"type":"observance","name":"Muttertag"}, -"AT-2023-05-18":{"type":"public","name":"Christi Himmelfahrt"}, -"AT-2023-05-28":{"type":"public","name":"Pfingstsonntag"}, -"AT-2023-05-29":{"type":"public","name":"Pfingstmontag"}, -"AT-2023-06-08":{"type":"public","name":"Fronleichnam"}, -"AT-2023-08-15":{"type":"public","name":"Mariä Himmelfahrt"}, -"AT-2023-10-26":{"type":"public","name":"Nationalfeiertag"}, -"AT-2023-11-01":{"type":"public","name":"Allerheiligen"}, -"AT-2023-12-08":{"type":"public","name":"Mariä Empfängnis"}, -"AT-2023-12-24":{"type":"bank","name":"Heiliger Abend"}, -"AT-2023-12-25":{"type":"public","name":"Christtag"}, -"AT-2023-12-26":{"type":"public","name":"Stefanitag"}, -"AT-2023-12-31":{"type":"bank","name":"Silvester"}, -"BE-2021-01-01":{"type":"public","name":"Nouvel An"}, -"BE-2021-01-06":{"type":"observance","name":"l'Épiphanie"}, -"BE-2021-02-14":{"type":"observance","name":"Saint-Valentin"}, -"BE-2021-04-04":{"type":"public","name":"Pâques"}, -"BE-2021-04-05":{"type":"public","name":"Lundi de Pâques"}, -"BE-2021-05-01":{"type":"public","name":"Fête du travail"}, -"BE-2021-05-09":{"type":"observance","name":"Fête des Mères"}, -"BE-2021-05-13":{"type":"public","name":"Ascension"}, -"BE-2021-05-23":{"type":"public","name":"Pentecôte"}, -"BE-2021-05-24":{"type":"public","name":"Lundi de Pentecôte"}, -"BE-2021-07-21":{"type":"public","name":"Fête nationale"}, -"BE-2021-08-15":{"type":"public","name":"Assomption"}, -"BE-2021-11-01":{"type":"public","name":"Toussaint"}, -"BE-2021-11-02":{"type":"observance","name":"Fête des morts"}, -"BE-2021-11-11":{"type":"public","name":"Armistice"}, -"BE-2021-11-15":{"type":"observance","name":"Fête du Roi"}, -"BE-2021-12-06":{"type":"observance","name":"Saint-Nicolas"}, -"BE-2021-12-25":{"type":"public","name":"Noël"}, -"BE-2022-01-01":{"type":"public","name":"Nouvel An"}, -"BE-2022-01-06":{"type":"observance","name":"l'Épiphanie"}, -"BE-2022-02-14":{"type":"observance","name":"Saint-Valentin"}, -"BE-2022-04-17":{"type":"public","name":"Pâques"}, -"BE-2022-04-18":{"type":"public","name":"Lundi de Pâques"}, -"BE-2022-05-01":{"type":"public","name":"Fête du travail"}, -"BE-2022-05-08":{"type":"observance","name":"Fête des Mères"}, -"BE-2022-05-26":{"type":"public","name":"Ascension"}, -"BE-2022-06-05":{"type":"public","name":"Pentecôte"}, -"BE-2022-06-06":{"type":"public","name":"Lundi de Pentecôte"}, -"BE-2022-07-21":{"type":"public","name":"Fête nationale"}, -"BE-2022-08-15":{"type":"public","name":"Assomption"}, -"BE-2022-11-01":{"type":"public","name":"Toussaint"}, -"BE-2022-11-02":{"type":"observance","name":"Fête des morts"}, -"BE-2022-11-11":{"type":"public","name":"Armistice"}, -"BE-2022-11-15":{"type":"observance","name":"Fête du Roi"}, -"BE-2022-12-06":{"type":"observance","name":"Saint-Nicolas"}, -"BE-2022-12-25":{"type":"public","name":"Noël"}, -"BE-2023-01-01":{"type":"public","name":"Nouvel An"}, -"BE-2023-01-06":{"type":"observance","name":"l'Épiphanie"}, -"BE-2023-02-14":{"type":"observance","name":"Saint-Valentin"}, -"BE-2023-04-09":{"type":"public","name":"Pâques"}, -"BE-2023-04-10":{"type":"public","name":"Lundi de Pâques"}, -"BE-2023-05-01":{"type":"public","name":"Fête du travail"}, -"BE-2023-05-14":{"type":"observance","name":"Fête des Mères"}, -"BE-2023-05-18":{"type":"public","name":"Ascension"}, -"BE-2023-05-28":{"type":"public","name":"Pentecôte"}, -"BE-2023-05-29":{"type":"public","name":"Lundi de Pentecôte"}, -"BE-2023-07-21":{"type":"public","name":"Fête nationale"}, -"BE-2023-08-15":{"type":"public","name":"Assomption"}, -"BE-2023-11-01":{"type":"public","name":"Toussaint"}, -"BE-2023-11-02":{"type":"observance","name":"Fête des morts"}, -"BE-2023-11-11":{"type":"public","name":"Armistice"}, -"BE-2023-11-15":{"type":"observance","name":"Fête du Roi"}, -"BE-2023-12-06":{"type":"observance","name":"Saint-Nicolas"}, -"BE-2023-12-25":{"type":"public","name":"Noël"}, -"BG-2021-01-01":{"type":"public","name":"Нова Година"}, -"BG-2021-03-01":{"type":"observance","name":"Баба Марта"}, -"BG-2021-03-03":{"type":"public","name":"Ден на Освобождението на България от Османската Империя"}, -"BG-2021-03-08":{"type":"observance","name":"Ден на жената"}, -"BG-2021-04-30":{"type":"public","name":"Разпети петък"}, -"BG-2021-05-01":{"type":"public","name":"Ден на труда"}, -"BG-2021-05-02":{"type":"public","name":"Великден"}, -"BG-2021-05-03":{"type":"public","name":"Велики понеделник"}, -"BG-2021-05-06":{"type":"public","name":"Гергьовден"}, -"BG-2021-05-07":{"type":"observance","name":"Ден на радиото и телевизията"}, -"BG-2021-05-24":{"type":"public","name":"Ден на азбуката, културата и просветата"}, -"BG-2021-09-06":{"type":"public","name":"Ден на съединението"}, -"BG-2021-09-22":{"type":"public","name":"Ден на независимостта"}, -"BG-2021-11-01":{"type":"school","name":"Ден на народните будители"}, -"BG-2021-12-24":{"type":"public","name":"Бъдни вечер"}, -"BG-2021-12-25":{"type":"public","name":"Коледа"}, -"BG-2021-12-26":{"type":"observance","name":"2-ри ден на Коледа"}, -"BG-2022-01-01":{"type":"public","name":"Нова Година"}, -"BG-2022-03-01":{"type":"observance","name":"Баба Марта"}, -"BG-2022-03-03":{"type":"public","name":"Ден на Освобождението на България от Османската Империя"}, -"BG-2022-03-08":{"type":"observance","name":"Ден на жената"}, -"BG-2022-04-22":{"type":"public","name":"Разпети петък"}, -"BG-2022-04-24":{"type":"public","name":"Великден"}, -"BG-2022-04-25":{"type":"public","name":"Велики понеделник"}, -"BG-2022-05-01":{"type":"public","name":"Ден на труда"}, -"BG-2022-05-06":{"type":"public","name":"Гергьовден"}, -"BG-2022-05-07":{"type":"observance","name":"Ден на радиото и телевизията"}, -"BG-2022-05-24":{"type":"public","name":"Ден на азбуката, културата и просветата"}, -"BG-2022-09-06":{"type":"public","name":"Ден на съединението"}, -"BG-2022-09-22":{"type":"public","name":"Ден на независимостта"}, -"BG-2022-11-01":{"type":"school","name":"Ден на народните будители"}, -"BG-2022-12-24":{"type":"public","name":"Бъдни вечер"}, -"BG-2022-12-25":{"type":"public","name":"Коледа"}, -"BG-2022-12-26":{"type":"observance","name":"2-ри ден на Коледа"}, -"BG-2023-01-01":{"type":"public","name":"Нова Година"}, -"BG-2023-03-01":{"type":"observance","name":"Баба Марта"}, -"BG-2023-03-03":{"type":"public","name":"Ден на Освобождението на България от Османската Империя"}, -"BG-2023-03-08":{"type":"observance","name":"Ден на жената"}, -"BG-2023-04-14":{"type":"public","name":"Разпети петък"}, -"BG-2023-04-16":{"type":"public","name":"Великден"}, -"BG-2023-04-17":{"type":"public","name":"Велики понеделник"}, -"BG-2023-05-01":{"type":"public","name":"Ден на труда"}, -"BG-2023-05-06":{"type":"public","name":"Гергьовден"}, -"BG-2023-05-07":{"type":"observance","name":"Ден на радиото и телевизията"}, -"BG-2023-05-24":{"type":"public","name":"Ден на азбуката, културата и просветата"}, -"BG-2023-09-06":{"type":"public","name":"Ден на съединението"}, -"BG-2023-09-22":{"type":"public","name":"Ден на независимостта"}, -"BG-2023-11-01":{"type":"school","name":"Ден на народните будители"}, -"BG-2023-12-24":{"type":"public","name":"Бъдни вечер"}, -"BG-2023-12-25":{"type":"public","name":"Коледа"}, -"BG-2023-12-26":{"type":"observance","name":"2-ри ден на Коледа"}, -"CZ-2021-01-01":{"type":"public","name":"Nový rok a Den obnovy samostatného českého státu"}, -"CZ-2021-03-31":{"type":"observance","name":"Škaredá středa"}, -"CZ-2021-04-01":{"type":"observance","name":"Zelený čtvrtek"}, -"CZ-2021-04-02":{"type":"public","name":"Velký pátek"}, -"CZ-2021-04-03":{"type":"observance","name":"Bílá sobota"}, -"CZ-2021-04-04":{"type":"observance","name":"Velikonoční neděle"}, -"CZ-2021-04-05":{"type":"public","name":"Velikonoční pondělí"}, -"CZ-2021-05-01":{"type":"public","name":"Svátek práce"}, -"CZ-2021-05-08":{"type":"public","name":"Den vítězství"}, -"CZ-2021-05-09":{"type":"observance","name":"Den matek"}, -"CZ-2021-07-05":{"type":"public","name":"Den slovanských věrozvěstů Cyrila a Metoděje"}, -"CZ-2021-07-06":{"type":"public","name":"Den upálení mistra Jana Husa"}, -"CZ-2021-09-28":{"type":"public","name":"Den české státnosti"}, -"CZ-2021-10-28":{"type":"public","name":"Den vzniku samostatného československého státu"}, -"CZ-2021-11-17":{"type":"public","name":"Den boje za svobodu a demokracii"}, -"CZ-2021-12-24":{"type":"public","name":"Štědrý den"}, -"CZ-2021-12-25":{"type":"public","name":"1. svátek vánoční"}, -"CZ-2021-12-26":{"type":"public","name":"2. svátek vánoční"}, -"CZ-2022-01-01":{"type":"public","name":"Nový rok a Den obnovy samostatného českého státu"}, -"CZ-2022-04-13":{"type":"observance","name":"Škaredá středa"}, -"CZ-2022-04-14":{"type":"observance","name":"Zelený čtvrtek"}, -"CZ-2022-04-15":{"type":"public","name":"Velký pátek"}, -"CZ-2022-04-16":{"type":"observance","name":"Bílá sobota"}, -"CZ-2022-04-17":{"type":"observance","name":"Velikonoční neděle"}, -"CZ-2022-04-18":{"type":"public","name":"Velikonoční pondělí"}, -"CZ-2022-05-01":{"type":"public","name":"Svátek práce"}, -"CZ-2022-05-08":{"type":"public","name":"Den vítězství"}, -"CZ-2022-07-05":{"type":"public","name":"Den slovanských věrozvěstů Cyrila a Metoděje"}, -"CZ-2022-07-06":{"type":"public","name":"Den upálení mistra Jana Husa"}, -"CZ-2022-09-28":{"type":"public","name":"Den české státnosti"}, -"CZ-2022-10-28":{"type":"public","name":"Den vzniku samostatného československého státu"}, -"CZ-2022-11-17":{"type":"public","name":"Den boje za svobodu a demokracii"}, -"CZ-2022-12-24":{"type":"public","name":"Štědrý den"}, -"CZ-2022-12-25":{"type":"public","name":"1. svátek vánoční"}, -"CZ-2022-12-26":{"type":"public","name":"2. svátek vánoční"}, -"CZ-2023-01-01":{"type":"public","name":"Nový rok a Den obnovy samostatného českého státu"}, -"CZ-2023-04-05":{"type":"observance","name":"Škaredá středa"}, -"CZ-2023-04-06":{"type":"observance","name":"Zelený čtvrtek"}, -"CZ-2023-04-07":{"type":"public","name":"Velký pátek"}, -"CZ-2023-04-08":{"type":"observance","name":"Bílá sobota"}, -"CZ-2023-04-09":{"type":"observance","name":"Velikonoční neděle"}, -"CZ-2023-04-10":{"type":"public","name":"Velikonoční pondělí"}, -"CZ-2023-05-01":{"type":"public","name":"Svátek práce"}, -"CZ-2023-05-08":{"type":"public","name":"Den vítězství"}, -"CZ-2023-05-14":{"type":"observance","name":"Den matek"}, -"CZ-2023-07-05":{"type":"public","name":"Den slovanských věrozvěstů Cyrila a Metoděje"}, -"CZ-2023-07-06":{"type":"public","name":"Den upálení mistra Jana Husa"}, -"CZ-2023-09-28":{"type":"public","name":"Den české státnosti"}, -"CZ-2023-10-28":{"type":"public","name":"Den vzniku samostatného československého státu"}, -"CZ-2023-11-17":{"type":"public","name":"Den boje za svobodu a demokracii"}, -"CZ-2023-12-24":{"type":"public","name":"Štědrý den"}, -"CZ-2023-12-25":{"type":"public","name":"1. svátek vánoční"}, -"CZ-2023-12-26":{"type":"public","name":"2. svátek vánoční"}, -"DK-2021-01-01":{"type":"public","name":"Nytår"}, -"DK-2021-02-15":{"type":"observance","name":"Fastelavn"}, -"DK-2021-04-01":{"type":"public","name":"Skærtorsdag"}, -"DK-2021-04-02":{"type":"public","name":"Langfredag"}, -"DK-2021-04-04":{"type":"public","name":"Påskesøndag"}, -"DK-2021-04-05":{"type":"public","name":"Anden påskedag"}, -"DK-2021-04-30":{"type":"public","name":"Store Bededag"}, -"DK-2021-05-01":{"type":"observance","name":"1. maj"}, -"DK-2021-05-09":{"type":"observance","name":"Mors Dag"}, -"DK-2021-05-13":{"type":"public","name":"Kristi Himmelfartsdag"}, -"DK-2021-05-23":{"type":"public","name":"Pinsedag"}, -"DK-2021-05-24":{"type":"public","name":"Anden Pinsedag"}, -"DK-2021-06-05":{"type":"observance","name":"Grundlovsdag"}, -"DK-2021-12-24":{"type":"observance","name":"Juleaften"}, -"DK-2021-12-25":{"type":"public","name":"Juledag"}, -"DK-2021-12-26":{"type":"public","name":"Anden Juledag"}, -"DK-2022-01-01":{"type":"public","name":"Nytår"}, -"DK-2022-02-28":{"type":"observance","name":"Fastelavn"}, -"DK-2022-04-14":{"type":"public","name":"Skærtorsdag"}, -"DK-2022-04-15":{"type":"public","name":"Langfredag"}, -"DK-2022-04-17":{"type":"public","name":"Påskesøndag"}, -"DK-2022-04-18":{"type":"public","name":"Anden påskedag"}, -"DK-2022-05-01":{"type":"observance","name":"1. maj"}, -"DK-2022-05-08":{"type":"observance","name":"Mors Dag"}, -"DK-2022-05-13":{"type":"public","name":"Store Bededag"}, -"DK-2022-05-26":{"type":"public","name":"Kristi Himmelfartsdag"}, -"DK-2022-06-05":{"type":"public","name":"Pinsedag"}, -"DK-2022-06-06":{"type":"public","name":"Anden Pinsedag"}, -"DK-2022-12-24":{"type":"observance","name":"Juleaften"}, -"DK-2022-12-25":{"type":"public","name":"Juledag"}, -"DK-2022-12-26":{"type":"public","name":"Anden Juledag"}, -"DK-2023-01-01":{"type":"public","name":"Nytår"}, -"DK-2023-02-20":{"type":"observance","name":"Fastelavn"}, -"DK-2023-04-06":{"type":"public","name":"Skærtorsdag"}, -"DK-2023-04-07":{"type":"public","name":"Langfredag"}, -"DK-2023-04-09":{"type":"public","name":"Påskesøndag"}, -"DK-2023-04-10":{"type":"public","name":"Anden påskedag"}, -"DK-2023-05-01":{"type":"observance","name":"1. maj"}, -"DK-2023-05-05":{"type":"public","name":"Store Bededag"}, -"DK-2023-05-14":{"type":"observance","name":"Mors Dag"}, -"DK-2023-05-18":{"type":"public","name":"Kristi Himmelfartsdag"}, -"DK-2023-05-28":{"type":"public","name":"Pinsedag"}, -"DK-2023-05-29":{"type":"public","name":"Anden Pinsedag"}, -"DK-2023-06-05":{"type":"observance","name":"Grundlovsdag"}, -"DK-2023-12-24":{"type":"observance","name":"Juleaften"}, -"DK-2023-12-25":{"type":"public","name":"Juledag"}, -"DK-2023-12-26":{"type":"public","name":"Anden Juledag"}, -"EE-2021-01-01":{"type":"public","name":"uusaasta"}, -"EE-2021-01-06":{"type":"observance","name":"kolmekuningapäev"}, -"EE-2021-02-02":{"type":"observance","name":"Tartu rahulepingu aastapäev"}, -"EE-2021-02-24":{"type":"public","name":"iseseisvuspäev"}, -"EE-2021-03-14":{"type":"observance","name":"emakeelepäev"}, -"EE-2021-04-02":{"type":"public","name":"suur reede"}, -"EE-2021-04-04":{"type":"public","name":"lihavõtted"}, -"EE-2021-05-01":{"type":"public","name":"kevadpüha"}, -"EE-2021-05-09":{"type":"observance","name":"emadepäev"}, -"EE-2021-05-23":{"type":"public","name":"nelipühade 1. püha"}, -"EE-2021-06-04":{"type":"observance","name":"Eesti lipu päev"}, -"EE-2021-06-14":{"type":"observance","name":"leinapäev"}, -"EE-2021-06-23":{"type":"public","name":"võidupüha"}, -"EE-2021-06-24":{"type":"public","name":"jaanipäev"}, -"EE-2021-08-20":{"type":"public","name":"taasiseseisvumispäev"}, -"EE-2021-08-23":{"type":"observance","name":"kommunismi ja natsismi ohvrite mälestuspäev"}, -"EE-2021-09-12":{"type":"observance","name":"vanavanemate päev"}, -"EE-2021-09-22":{"type":"observance","name":"vastupanuvõitluse päev"}, -"EE-2021-11-02":{"type":"observance","name":"hingedepäev"}, -"EE-2021-11-14":{"type":"observance","name":"isadepäev"}, -"EE-2021-11-16":{"type":"observance","name":"taassünni päev"}, -"EE-2021-12-24":{"type":"public","name":"jõululaupäev"}, -"EE-2021-12-25":{"type":"public","name":"esimene jõulupüha"}, -"EE-2021-12-26":{"type":"public","name":"teine jõulupüha"}, -"EE-2022-01-01":{"type":"public","name":"uusaasta"}, -"EE-2022-01-06":{"type":"observance","name":"kolmekuningapäev"}, -"EE-2022-02-02":{"type":"observance","name":"Tartu rahulepingu aastapäev"}, -"EE-2022-02-24":{"type":"public","name":"iseseisvuspäev"}, -"EE-2022-03-14":{"type":"observance","name":"emakeelepäev"}, -"EE-2022-04-15":{"type":"public","name":"suur reede"}, -"EE-2022-04-17":{"type":"public","name":"lihavõtted"}, -"EE-2022-05-01":{"type":"public","name":"kevadpüha"}, -"EE-2022-05-08":{"type":"observance","name":"emadepäev"}, -"EE-2022-06-04":{"type":"observance","name":"Eesti lipu päev"}, -"EE-2022-06-05":{"type":"public","name":"nelipühade 1. püha"}, -"EE-2022-06-14":{"type":"observance","name":"leinapäev"}, -"EE-2022-06-23":{"type":"public","name":"võidupüha"}, -"EE-2022-06-24":{"type":"public","name":"jaanipäev"}, -"EE-2022-08-20":{"type":"public","name":"taasiseseisvumispäev"}, -"EE-2022-08-23":{"type":"observance","name":"kommunismi ja natsismi ohvrite mälestuspäev"}, -"EE-2022-09-11":{"type":"observance","name":"vanavanemate päev"}, -"EE-2022-09-22":{"type":"observance","name":"vastupanuvõitluse päev"}, -"EE-2022-11-02":{"type":"observance","name":"hingedepäev"}, -"EE-2022-11-13":{"type":"observance","name":"isadepäev"}, -"EE-2022-11-16":{"type":"observance","name":"taassünni päev"}, -"EE-2022-12-24":{"type":"public","name":"jõululaupäev"}, -"EE-2022-12-25":{"type":"public","name":"esimene jõulupüha"}, -"EE-2022-12-26":{"type":"public","name":"teine jõulupüha"}, -"EE-2023-01-01":{"type":"public","name":"uusaasta"}, -"EE-2023-01-06":{"type":"observance","name":"kolmekuningapäev"}, -"EE-2023-02-02":{"type":"observance","name":"Tartu rahulepingu aastapäev"}, -"EE-2023-02-24":{"type":"public","name":"iseseisvuspäev"}, -"EE-2023-03-14":{"type":"observance","name":"emakeelepäev"}, -"EE-2023-04-07":{"type":"public","name":"suur reede"}, -"EE-2023-04-09":{"type":"public","name":"lihavõtted"}, -"EE-2023-05-01":{"type":"public","name":"kevadpüha"}, -"EE-2023-05-14":{"type":"observance","name":"emadepäev"}, -"EE-2023-05-28":{"type":"public","name":"nelipühade 1. püha"}, -"EE-2023-06-04":{"type":"observance","name":"Eesti lipu päev"}, -"EE-2023-06-14":{"type":"observance","name":"leinapäev"}, -"EE-2023-06-23":{"type":"public","name":"võidupüha"}, -"EE-2023-06-24":{"type":"public","name":"jaanipäev"}, -"EE-2023-08-20":{"type":"public","name":"taasiseseisvumispäev"}, -"EE-2023-08-23":{"type":"observance","name":"kommunismi ja natsismi ohvrite mälestuspäev"}, -"EE-2023-09-10":{"type":"observance","name":"vanavanemate päev"}, -"EE-2023-09-22":{"type":"observance","name":"vastupanuvõitluse päev"}, -"EE-2023-11-02":{"type":"observance","name":"hingedepäev"}, -"EE-2023-11-12":{"type":"observance","name":"isadepäev"}, -"EE-2023-11-16":{"type":"observance","name":"taassünni päev"}, -"EE-2023-12-24":{"type":"public","name":"jõululaupäev"}, -"EE-2023-12-25":{"type":"public","name":"esimene jõulupüha"}, -"EE-2023-12-26":{"type":"public","name":"teine jõulupüha"}, -"FI-2021-01-01":{"type":"public","name":"Uudenvuodenpäivä"}, -"FI-2021-01-06":{"type":"public","name":"Loppiainen"}, -"FI-2021-04-02":{"type":"public","name":"Pitkäperjantai"}, -"FI-2021-04-04":{"type":"public","name":"Pääsiäispäivä"}, -"FI-2021-04-05":{"type":"public","name":"2. pääsiäispäivä"}, -"FI-2021-05-01":{"type":"public","name":"Vappu"}, -"FI-2021-05-09":{"type":"observance","name":"Äitienpäivä"}, -"FI-2021-05-13":{"type":"public","name":"Helatorstai"}, -"FI-2021-05-23":{"type":"public","name":"Helluntaipäivä"}, -"FI-2021-06-25":{"type":"bank","name":"Juhannusaatto"}, -"FI-2021-06-26":{"type":"public","name":"Juhannuspäivä"}, -"FI-2021-11-06":{"type":"public","name":"Pyhäinpäivä"}, -"FI-2021-11-14":{"type":"observance","name":"Isänpäivä"}, -"FI-2021-12-06":{"type":"public","name":"Itsenäisyyspäivä"}, -"FI-2021-12-24":{"type":"bank","name":"Jouluaatto"}, -"FI-2021-12-25":{"type":"public","name":"Joulupäivä"}, -"FI-2021-12-26":{"type":"public","name":"2. joulupäivä"}, -"FI-2021-12-31":{"type":"bank","name":"Uudenvuodenaatto"}, -"FI-2022-01-01":{"type":"public","name":"Uudenvuodenpäivä"}, -"FI-2022-01-06":{"type":"public","name":"Loppiainen"}, -"FI-2022-04-15":{"type":"public","name":"Pitkäperjantai"}, -"FI-2022-04-17":{"type":"public","name":"Pääsiäispäivä"}, -"FI-2022-04-18":{"type":"public","name":"2. pääsiäispäivä"}, -"FI-2022-05-01":{"type":"public","name":"Vappu"}, -"FI-2022-05-08":{"type":"observance","name":"Äitienpäivä"}, -"FI-2022-05-26":{"type":"public","name":"Helatorstai"}, -"FI-2022-06-05":{"type":"public","name":"Helluntaipäivä"}, -"FI-2022-06-24":{"type":"bank","name":"Juhannusaatto"}, -"FI-2022-06-25":{"type":"public","name":"Juhannuspäivä"}, -"FI-2022-11-05":{"type":"public","name":"Pyhäinpäivä"}, -"FI-2022-11-13":{"type":"observance","name":"Isänpäivä"}, -"FI-2022-12-06":{"type":"public","name":"Itsenäisyyspäivä"}, -"FI-2022-12-24":{"type":"bank","name":"Jouluaatto"}, -"FI-2022-12-25":{"type":"public","name":"Joulupäivä"}, -"FI-2022-12-26":{"type":"public","name":"2. joulupäivä"}, -"FI-2022-12-31":{"type":"bank","name":"Uudenvuodenaatto"}, -"FI-2023-01-01":{"type":"public","name":"Uudenvuodenpäivä"}, -"FI-2023-01-06":{"type":"public","name":"Loppiainen"}, -"FI-2023-04-07":{"type":"public","name":"Pitkäperjantai"}, -"FI-2023-04-09":{"type":"public","name":"Pääsiäispäivä"}, -"FI-2023-04-10":{"type":"public","name":"2. pääsiäispäivä"}, -"FI-2023-05-01":{"type":"public","name":"Vappu"}, -"FI-2023-05-14":{"type":"observance","name":"Äitienpäivä"}, -"FI-2023-05-18":{"type":"public","name":"Helatorstai"}, -"FI-2023-05-28":{"type":"public","name":"Helluntaipäivä"}, -"FI-2023-06-23":{"type":"bank","name":"Juhannusaatto"}, -"FI-2023-06-24":{"type":"public","name":"Juhannuspäivä"}, -"FI-2023-11-04":{"type":"public","name":"Pyhäinpäivä"}, -"FI-2023-11-12":{"type":"observance","name":"Isänpäivä"}, -"FI-2023-12-06":{"type":"public","name":"Itsenäisyyspäivä"}, -"FI-2023-12-24":{"type":"bank","name":"Jouluaatto"}, -"FI-2023-12-25":{"type":"public","name":"Joulupäivä"}, -"FI-2023-12-26":{"type":"public","name":"2. joulupäivä"}, -"FI-2023-12-31":{"type":"bank","name":"Uudenvuodenaatto"}, -"FR-2021-01-01":{"type":"public","name":"Nouvel An"}, -"FR-2021-04-05":{"type":"public","name":"Lundi de Pâques"}, -"FR-2021-05-01":{"type":"public","name":"Fête du travail"}, -"FR-2021-05-08":{"type":"public","name":"Fête de la Victoire 1945"}, -"FR-2021-05-13":{"type":"public","name":"Ascension"}, -"FR-2021-05-23":{"type":"observance","name":"Pentecôte"}, -"FR-2021-05-24":{"type":"public","name":"Lundi de Pentecôte"}, -"FR-2021-05-30":{"type":"observance","name":"Fête des Mères"}, -"FR-2021-07-14":{"type":"public","name":"Fête Nationale de la France"}, -"FR-2021-08-15":{"type":"public","name":"Assomption"}, -"FR-2021-11-01":{"type":"public","name":"Toussaint"}, -"FR-2021-11-11":{"type":"public","name":"Armistice 1918"}, -"FR-2021-12-25":{"type":"public","name":"Noël"}, -"FR-2022-01-01":{"type":"public","name":"Nouvel An"}, -"FR-2022-04-18":{"type":"public","name":"Lundi de Pâques"}, -"FR-2022-05-01":{"type":"public","name":"Fête du travail"}, -"FR-2022-05-08":{"type":"public","name":"Fête de la Victoire 1945"}, -"FR-2022-05-26":{"type":"public","name":"Ascension"}, -"FR-2022-05-29":{"type":"observance","name":"Fête des Mères"}, -"FR-2022-06-05":{"type":"observance","name":"Pentecôte"}, -"FR-2022-06-06":{"type":"public","name":"Lundi de Pentecôte"}, -"FR-2022-07-14":{"type":"public","name":"Fête Nationale de la France"}, -"FR-2022-08-15":{"type":"public","name":"Assomption"}, -"FR-2022-11-01":{"type":"public","name":"Toussaint"}, -"FR-2022-11-11":{"type":"public","name":"Armistice 1918"}, -"FR-2022-12-25":{"type":"public","name":"Noël"}, -"FR-2023-01-01":{"type":"public","name":"Nouvel An"}, -"FR-2023-04-10":{"type":"public","name":"Lundi de Pâques"}, -"FR-2023-05-01":{"type":"public","name":"Fête du travail"}, -"FR-2023-05-08":{"type":"public","name":"Fête de la Victoire 1945"}, -"FR-2023-05-18":{"type":"public","name":"Ascension"}, -"FR-2023-05-28":{"type":"observance","name":"Fête des Mères"}, -"FR-2023-05-29":{"type":"public","name":"Lundi de Pentecôte"}, -"FR-2023-07-14":{"type":"public","name":"Fête Nationale de la France"}, -"FR-2023-08-15":{"type":"public","name":"Assomption"}, -"FR-2023-11-01":{"type":"public","name":"Toussaint"}, -"FR-2023-11-11":{"type":"public","name":"Armistice 1918"}, -"FR-2023-12-25":{"type":"public","name":"Noël"}, -"DE-2021-01-01":{"type":"public","name":"Neujahr"}, -"DE-2021-02-11":{"type":"observance","name":"Weiberfastnacht"}, -"DE-2021-02-14":{"type":"observance","name":"Valentinstag"}, -"DE-2021-02-15":{"type":"observance","name":"Rosenmontag"}, -"DE-2021-02-16":{"type":"observance","name":"Faschingsdienstag"}, -"DE-2021-02-17":{"type":"observance","name":"Aschermittwoch"}, -"DE-2021-04-01":{"type":"observance","name":"Gründonnerstag"}, -"DE-2021-04-02":{"type":"public","name":"Karfreitag"}, -"DE-2021-04-04":{"type":"observance","name":"Ostersonntag"}, -"DE-2021-04-05":{"type":"public","name":"Ostermontag"}, -"DE-2021-05-01":{"type":"public","name":"Maifeiertag"}, -"DE-2021-05-09":{"type":"observance","name":"Muttertag"}, -"DE-2021-05-13":{"type":"public","name":"Christi Himmelfahrt"}, -"DE-2021-05-23":{"type":"observance","name":"Pfingstsonntag"}, -"DE-2021-05-24":{"type":"public","name":"Pfingstmontag"}, -"DE-2021-10-03":{"type":"public","name":"Tag der Deutschen Einheit"}, -"DE-2021-11-01":{"type":"observance","name":"Allerheiligen"}, -"DE-2021-11-02":{"type":"observance","name":"Allerseelen"}, -"DE-2021-11-11":{"type":"observance","name":"Sankt Martin (Faschingsbeginn)"}, -"DE-2021-11-14":{"type":"observance","name":"Volkstrauertag"}, -"DE-2021-11-17":{"type":"observance","name":"Buß- und Bettag"}, -"DE-2021-11-21":{"type":"observance","name":"Totensonntag"}, -"DE-2021-11-28":{"type":"observance","name":"1. Advent"}, -"DE-2021-12-05":{"type":"observance","name":"2. Advent"}, -"DE-2021-12-12":{"type":"observance","name":"3. Advent"}, -"DE-2021-12-19":{"type":"observance","name":"4. Advent"}, -"DE-2021-12-24":{"type":"bank","name":"Heiliger Abend"}, -"DE-2021-12-25":{"type":"public","name":"1. Weihnachtstag"}, -"DE-2021-12-26":{"type":"public","name":"2. Weihnachtstag"}, -"DE-2021-12-31":{"type":"bank","name":"Silvester"}, -"DE-2022-01-01":{"type":"public","name":"Neujahr"}, -"DE-2022-02-14":{"type":"observance","name":"Valentinstag"}, -"DE-2022-02-24":{"type":"observance","name":"Weiberfastnacht"}, -"DE-2022-02-28":{"type":"observance","name":"Rosenmontag"}, -"DE-2022-03-01":{"type":"observance","name":"Faschingsdienstag"}, -"DE-2022-03-02":{"type":"observance","name":"Aschermittwoch"}, -"DE-2022-04-14":{"type":"observance","name":"Gründonnerstag"}, -"DE-2022-04-15":{"type":"public","name":"Karfreitag"}, -"DE-2022-04-17":{"type":"observance","name":"Ostersonntag"}, -"DE-2022-04-18":{"type":"public","name":"Ostermontag"}, -"DE-2022-05-01":{"type":"public","name":"Maifeiertag"}, -"DE-2022-05-08":{"type":"observance","name":"Muttertag"}, -"DE-2022-05-26":{"type":"public","name":"Christi Himmelfahrt"}, -"DE-2022-06-05":{"type":"observance","name":"Pfingstsonntag"}, -"DE-2022-06-06":{"type":"public","name":"Pfingstmontag"}, -"DE-2022-10-03":{"type":"public","name":"Tag der Deutschen Einheit"}, -"DE-2022-11-01":{"type":"observance","name":"Allerheiligen"}, -"DE-2022-11-02":{"type":"observance","name":"Allerseelen"}, -"DE-2022-11-11":{"type":"observance","name":"Sankt Martin (Faschingsbeginn)"}, -"DE-2022-11-13":{"type":"observance","name":"Volkstrauertag"}, -"DE-2022-11-16":{"type":"observance","name":"Buß- und Bettag"}, -"DE-2022-11-20":{"type":"observance","name":"Totensonntag"}, -"DE-2022-11-27":{"type":"observance","name":"1. Advent"}, -"DE-2022-12-04":{"type":"observance","name":"2. Advent"}, -"DE-2022-12-11":{"type":"observance","name":"3. Advent"}, -"DE-2022-12-18":{"type":"observance","name":"4. Advent"}, -"DE-2022-12-24":{"type":"bank","name":"Heiliger Abend"}, -"DE-2022-12-25":{"type":"public","name":"1. Weihnachtstag"}, -"DE-2022-12-26":{"type":"public","name":"2. Weihnachtstag"}, -"DE-2022-12-31":{"type":"bank","name":"Silvester"}, -"DE-2023-01-01":{"type":"public","name":"Neujahr"}, -"DE-2023-02-14":{"type":"observance","name":"Valentinstag"}, -"DE-2023-02-16":{"type":"observance","name":"Weiberfastnacht"}, -"DE-2023-02-20":{"type":"observance","name":"Rosenmontag"}, -"DE-2023-02-21":{"type":"observance","name":"Faschingsdienstag"}, -"DE-2023-02-22":{"type":"observance","name":"Aschermittwoch"}, -"DE-2023-04-06":{"type":"observance","name":"Gründonnerstag"}, -"DE-2023-04-07":{"type":"public","name":"Karfreitag"}, -"DE-2023-04-09":{"type":"observance","name":"Ostersonntag"}, -"DE-2023-04-10":{"type":"public","name":"Ostermontag"}, -"DE-2023-05-01":{"type":"public","name":"Maifeiertag"}, -"DE-2023-05-14":{"type":"observance","name":"Muttertag"}, -"DE-2023-05-18":{"type":"public","name":"Christi Himmelfahrt"}, -"DE-2023-05-28":{"type":"observance","name":"Pfingstsonntag"}, -"DE-2023-05-29":{"type":"public","name":"Pfingstmontag"}, -"DE-2023-10-03":{"type":"public","name":"Tag der Deutschen Einheit"}, -"DE-2023-11-01":{"type":"observance","name":"Allerheiligen"}, -"DE-2023-11-02":{"type":"observance","name":"Allerseelen"}, -"DE-2023-11-11":{"type":"observance","name":"Sankt Martin (Faschingsbeginn)"}, -"DE-2023-11-19":{"type":"observance","name":"Volkstrauertag"}, -"DE-2023-11-22":{"type":"observance","name":"Buß- und Bettag"}, -"DE-2023-11-26":{"type":"observance","name":"Totensonntag"}, -"DE-2023-12-03":{"type":"observance","name":"1. Advent"}, -"DE-2023-12-10":{"type":"observance","name":"2. Advent"}, -"DE-2023-12-17":{"type":"observance","name":"3. Advent"}, -"DE-2023-12-24":{"type":"observance","name":"4. Advent"}, -"DE-2023-12-25":{"type":"public","name":"1. Weihnachtstag"}, -"DE-2023-12-26":{"type":"public","name":"2. Weihnachtstag"}, -"DE-2023-12-31":{"type":"bank","name":"Silvester"}, -"HU-2021-01-01":{"type":"public","name":"Újév"}, -"HU-2021-02-01":{"type":"observance","name":"A köztársaság emléknapja"}, -"HU-2021-02-25":{"type":"observance","name":"A kommunista diktatúrák áldozatainak emléknapja"}, -"HU-2021-03-08":{"type":"observance","name":"Nemzetközi nőnap"}, -"HU-2021-03-15":{"type":"public","name":"1948-as forradalom"}, -"HU-2021-04-04":{"type":"public","name":"Húsvétvasárnap"}, -"HU-2021-04-05":{"type":"public","name":"Húsvéthétfő"}, -"HU-2021-04-16":{"type":"observance","name":"A holokauszt áldozatainak emléknapja"}, -"HU-2021-05-01":{"type":"public","name":"A munka ünnepe"}, -"HU-2021-05-02":{"type":"observance","name":"Anyák napja"}, -"HU-2021-05-21":{"type":"observance","name":"Honvédelmi nap"}, -"HU-2021-05-23":{"type":"public","name":"Pünkösdvasárnap"}, -"HU-2021-05-24":{"type":"public","name":"Pünkösdhétfő"}, -"HU-2021-06-04":{"type":"observance","name":"A nemzeti összetartozás napja"}, -"HU-2021-06-19":{"type":"observance","name":"A független Magyarország napja"}, -"HU-2021-08-20":{"type":"public","name":"Szent István ünnepe"}, -"HU-2021-10-06":{"type":"observance","name":"Az aradi vértanúk emléknapja"}, -"HU-2021-10-23":{"type":"public","name":"1956-os forradalom"}, -"HU-2021-11-01":{"type":"public","name":"Mindenszentek"}, -"HU-2021-12-06":{"type":"observance","name":"Mikulás"}, -"HU-2021-12-24":{"type":"optional","name":"Szenteste"}, -"HU-2021-12-25":{"type":"public","name":"Karácsony"}, -"HU-2021-12-26":{"type":"public","name":"Karácsony másnapja"}, -"HU-2021-12-31":{"type":"observance","name":"Szilveszter"}, -"HU-2022-01-01":{"type":"public","name":"Újév"}, -"HU-2022-02-01":{"type":"observance","name":"A köztársaság emléknapja"}, -"HU-2022-02-25":{"type":"observance","name":"A kommunista diktatúrák áldozatainak emléknapja"}, -"HU-2022-03-08":{"type":"observance","name":"Nemzetközi nőnap"}, -"HU-2022-03-15":{"type":"public","name":"1948-as forradalom"}, -"HU-2022-04-16":{"type":"observance","name":"A holokauszt áldozatainak emléknapja"}, -"HU-2022-04-17":{"type":"public","name":"Húsvétvasárnap"}, -"HU-2022-04-18":{"type":"public","name":"Húsvéthétfő"}, -"HU-2022-05-01":{"type":"public","name":"A munka ünnepe"}, -"HU-2022-05-21":{"type":"observance","name":"Honvédelmi nap"}, -"HU-2022-06-04":{"type":"observance","name":"A nemzeti összetartozás napja"}, -"HU-2022-06-05":{"type":"public","name":"Pünkösdvasárnap"}, -"HU-2022-06-06":{"type":"public","name":"Pünkösdhétfő"}, -"HU-2022-06-19":{"type":"observance","name":"A független Magyarország napja"}, -"HU-2022-08-20":{"type":"public","name":"Szent István ünnepe"}, -"HU-2022-10-06":{"type":"observance","name":"Az aradi vértanúk emléknapja"}, -"HU-2022-10-23":{"type":"public","name":"1956-os forradalom"}, -"HU-2022-11-01":{"type":"public","name":"Mindenszentek"}, -"HU-2022-12-06":{"type":"observance","name":"Mikulás"}, -"HU-2022-12-24":{"type":"optional","name":"Szenteste"}, -"HU-2022-12-25":{"type":"public","name":"Karácsony"}, -"HU-2022-12-26":{"type":"public","name":"Karácsony másnapja"}, -"HU-2022-12-31":{"type":"observance","name":"Szilveszter"}, -"HU-2023-01-01":{"type":"public","name":"Újév"}, -"HU-2023-02-01":{"type":"observance","name":"A köztársaság emléknapja"}, -"HU-2023-02-25":{"type":"observance","name":"A kommunista diktatúrák áldozatainak emléknapja"}, -"HU-2023-03-08":{"type":"observance","name":"Nemzetközi nőnap"}, -"HU-2023-03-15":{"type":"public","name":"1948-as forradalom"}, -"HU-2023-04-09":{"type":"public","name":"Húsvétvasárnap"}, -"HU-2023-04-10":{"type":"public","name":"Húsvéthétfő"}, -"HU-2023-04-16":{"type":"observance","name":"A holokauszt áldozatainak emléknapja"}, -"HU-2023-05-01":{"type":"public","name":"A munka ünnepe"}, -"HU-2023-05-07":{"type":"observance","name":"Anyák napja"}, -"HU-2023-05-21":{"type":"observance","name":"Honvédelmi nap"}, -"HU-2023-05-28":{"type":"public","name":"Pünkösdvasárnap"}, -"HU-2023-05-29":{"type":"public","name":"Pünkösdhétfő"}, -"HU-2023-06-04":{"type":"observance","name":"A nemzeti összetartozás napja"}, -"HU-2023-06-19":{"type":"observance","name":"A független Magyarország napja"}, -"HU-2023-08-20":{"type":"public","name":"Szent István ünnepe"}, -"HU-2023-10-06":{"type":"observance","name":"Az aradi vértanúk emléknapja"}, -"HU-2023-10-23":{"type":"public","name":"1956-os forradalom"}, -"HU-2023-11-01":{"type":"public","name":"Mindenszentek"}, -"HU-2023-12-06":{"type":"observance","name":"Mikulás"}, -"HU-2023-12-24":{"type":"optional","name":"Szenteste"}, -"HU-2023-12-25":{"type":"public","name":"Karácsony"}, -"HU-2023-12-26":{"type":"public","name":"Karácsony másnapja"}, -"HU-2023-12-31":{"type":"observance","name":"Szilveszter"}, -"IS-2021-01-01":{"type":"public","name":"Nýársdagur"}, -"IS-2021-01-06":{"type":"observance","name":"Þrettándinn"}, -"IS-2021-01-22":{"type":"observance","name":"Bóndadagur"}, -"IS-2021-02-15":{"type":"observance","name":"Bolludagur"}, -"IS-2021-02-16":{"type":"observance","name":"Sprengidagur"}, -"IS-2021-02-17":{"type":"observance","name":"Öskudagur"}, -"IS-2021-02-18":{"type":"observance","name":"Konudagur"}, -"IS-2021-03-28":{"type":"observance","name":"Pálmasunnudagur"}, -"IS-2021-04-01":{"type":"public","name":"Skírdagur"}, -"IS-2021-04-02":{"type":"public","name":"Föstudagurinn langi"}, -"IS-2021-04-04":{"type":"public","name":"Páskadagur"}, -"IS-2021-04-05":{"type":"public","name":"Annar í páskum"}, -"IS-2021-04-22":{"type":"public","name":"Sumardagurinn fyrsti"}, -"IS-2021-05-01":{"type":"public","name":"Hátíðisdagur Verkamanna"}, -"IS-2021-05-09":{"type":"observance","name":"Mæðradagurinn"}, -"IS-2021-05-13":{"type":"public","name":"Uppstigningardagur"}, -"IS-2021-05-23":{"type":"public","name":"Hvítasunnudagur"}, -"IS-2021-05-24":{"type":"public","name":"Annar í hvítasunnu"}, -"IS-2021-06-06":{"type":"observance","name":"Sjómannadagurinn"}, -"IS-2021-06-17":{"type":"public","name":"Íslenski þjóðhátíðardagurinn"}, -"IS-2021-08-02":{"type":"public","name":"Frídagur verslunarmanna"}, -"IS-2021-10-23":{"type":"observance","name":"Fyrsti vetrardagur"}, -"IS-2021-11-16":{"type":"observance","name":"Dagur íslenskrar tungu"}, -"IS-2021-12-23":{"type":"observance","name":"Þorláksmessa"}, -"IS-2021-12-24":{"type":"public","name":"Aðfangadagur"}, -"IS-2021-12-25":{"type":"public","name":"Jóladagur"}, -"IS-2021-12-26":{"type":"public","name":"Annar í jólum"}, -"IS-2021-12-31":{"type":"public","name":"Gamlársdagur"}, -"IS-2022-01-01":{"type":"public","name":"Nýársdagur"}, -"IS-2022-01-06":{"type":"observance","name":"Þrettándinn"}, -"IS-2022-01-21":{"type":"observance","name":"Bóndadagur"}, -"IS-2022-02-18":{"type":"observance","name":"Konudagur"}, -"IS-2022-02-28":{"type":"observance","name":"Bolludagur"}, -"IS-2022-03-01":{"type":"observance","name":"Sprengidagur"}, -"IS-2022-03-02":{"type":"observance","name":"Öskudagur"}, -"IS-2022-04-10":{"type":"observance","name":"Pálmasunnudagur"}, -"IS-2022-04-14":{"type":"public","name":"Skírdagur"}, -"IS-2022-04-15":{"type":"public","name":"Föstudagurinn langi"}, -"IS-2022-04-17":{"type":"public","name":"Páskadagur"}, -"IS-2022-04-18":{"type":"public","name":"Annar í páskum"}, -"IS-2022-04-21":{"type":"public","name":"Sumardagurinn fyrsti"}, -"IS-2022-05-01":{"type":"public","name":"Hátíðisdagur Verkamanna"}, -"IS-2022-05-08":{"type":"observance","name":"Mæðradagurinn"}, -"IS-2022-05-26":{"type":"public","name":"Uppstigningardagur"}, -"IS-2022-06-05":{"type":"public","name":"Hvítasunnudagur"}, -"IS-2022-06-06":{"type":"public","name":"Annar í hvítasunnu"}, -"IS-2022-06-17":{"type":"public","name":"Íslenski þjóðhátíðardagurinn"}, -"IS-2022-08-01":{"type":"public","name":"Frídagur verslunarmanna"}, -"IS-2022-10-22":{"type":"observance","name":"Fyrsti vetrardagur"}, -"IS-2022-11-16":{"type":"observance","name":"Dagur íslenskrar tungu"}, -"IS-2022-12-23":{"type":"observance","name":"Þorláksmessa"}, -"IS-2022-12-24":{"type":"public","name":"Aðfangadagur"}, -"IS-2022-12-25":{"type":"public","name":"Jóladagur"}, -"IS-2022-12-26":{"type":"public","name":"Annar í jólum"}, -"IS-2022-12-31":{"type":"public","name":"Gamlársdagur"}, -"IS-2023-01-01":{"type":"public","name":"Nýársdagur"}, -"IS-2023-01-06":{"type":"observance","name":"Þrettándinn"}, -"IS-2023-01-20":{"type":"observance","name":"Bóndadagur"}, -"IS-2023-02-18":{"type":"observance","name":"Konudagur"}, -"IS-2023-02-20":{"type":"observance","name":"Bolludagur"}, -"IS-2023-02-21":{"type":"observance","name":"Sprengidagur"}, -"IS-2023-02-22":{"type":"observance","name":"Öskudagur"}, -"IS-2023-04-02":{"type":"observance","name":"Pálmasunnudagur"}, -"IS-2023-04-06":{"type":"public","name":"Skírdagur"}, -"IS-2023-04-07":{"type":"public","name":"Föstudagurinn langi"}, -"IS-2023-04-09":{"type":"public","name":"Páskadagur"}, -"IS-2023-04-10":{"type":"public","name":"Annar í páskum"}, -"IS-2023-04-20":{"type":"public","name":"Sumardagurinn fyrsti"}, -"IS-2023-05-01":{"type":"public","name":"Hátíðisdagur Verkamanna"}, -"IS-2023-05-14":{"type":"observance","name":"Mæðradagurinn"}, -"IS-2023-05-18":{"type":"public","name":"Uppstigningardagur"}, -"IS-2023-05-28":{"type":"public","name":"Hvítasunnudagur"}, -"IS-2023-05-29":{"type":"public","name":"Annar í hvítasunnu"}, -"IS-2023-06-04":{"type":"observance","name":"Sjómannadagurinn"}, -"IS-2023-06-17":{"type":"public","name":"Íslenski þjóðhátíðardagurinn"}, -"IS-2023-08-07":{"type":"public","name":"Frídagur verslunarmanna"}, -"IS-2023-10-21":{"type":"observance","name":"Fyrsti vetrardagur"}, -"IS-2023-11-16":{"type":"observance","name":"Dagur íslenskrar tungu"}, -"IS-2023-12-23":{"type":"observance","name":"Þorláksmessa"}, -"IS-2023-12-24":{"type":"public","name":"Aðfangadagur"}, -"IS-2023-12-25":{"type":"public","name":"Jóladagur"}, -"IS-2023-12-26":{"type":"public","name":"Annar í jólum"}, -"IS-2023-12-31":{"type":"public","name":"Gamlársdagur"}, -"IE-2021-01-01":{"type":"public","name":"New Year's Day"}, -"IE-2021-03-14":{"type":"observance","name":"Mother's Day"}, -"IE-2021-03-17":{"type":"public","name":"St. Patrick’s Day"}, -"IE-2021-04-02":{"type":"bank","name":"Good Friday"}, -"IE-2021-04-04":{"type":"public","name":"Easter Sunday"}, -"IE-2021-04-05":{"type":"public","name":"Easter Monday"}, -"IE-2021-05-03":{"type":"public","name":"May Day"}, -"IE-2021-06-07":{"type":"public","name":"First Monday in June"}, -"IE-2021-08-02":{"type":"public","name":"First Monday in August"}, -"IE-2021-10-25":{"type":"public","name":"October Bank Holiday"}, -"IE-2021-12-25":{"type":"public","name":"Christmas Day"}, -"IE-2021-12-26":{"type":"public","name":"St. Stephen's Day"}, -"IE-2021-12-27":{"type":"bank","name":"St. Stephen's Day (substitute day)"}, -"IE-2022-01-01":{"type":"public","name":"New Year's Day"}, -"IE-2022-03-17":{"type":"public","name":"St. Patrick’s Day"}, -"IE-2022-03-27":{"type":"observance","name":"Mother's Day"}, -"IE-2022-04-15":{"type":"bank","name":"Good Friday"}, -"IE-2022-04-17":{"type":"public","name":"Easter Sunday"}, -"IE-2022-04-18":{"type":"public","name":"Easter Monday"}, -"IE-2022-05-02":{"type":"public","name":"May Day"}, -"IE-2022-06-06":{"type":"public","name":"First Monday in June"}, -"IE-2022-08-01":{"type":"public","name":"First Monday in August"}, -"IE-2022-10-24":{"type":"public","name":"October Bank Holiday"}, -"IE-2022-12-25":{"type":"public","name":"Christmas Day"}, -"IE-2022-12-26":{"type":"public","name":"St. Stephen's Day"}, -"IE-2022-12-27":{"type":"bank","name":"Christmas Bank Holiday"}, -"IE-2023-01-01":{"type":"public","name":"New Year's Day"}, -"IE-2023-03-17":{"type":"public","name":"St. Patrick’s Day"}, -"IE-2023-03-19":{"type":"observance","name":"Mother's Day"}, -"IE-2023-04-07":{"type":"bank","name":"Good Friday"}, -"IE-2023-04-09":{"type":"public","name":"Easter Sunday"}, -"IE-2023-04-10":{"type":"public","name":"Easter Monday"}, -"IE-2023-05-01":{"type":"public","name":"May Day"}, -"IE-2023-06-05":{"type":"public","name":"First Monday in June"}, -"IE-2023-08-07":{"type":"public","name":"First Monday in August"}, -"IE-2023-10-30":{"type":"public","name":"October Bank Holiday"}, -"IE-2023-12-25":{"type":"public","name":"Christmas Day"}, -"IE-2023-12-26":{"type":"public","name":"St. Stephen's Day"}, -"IE-2023-12-27":{"type":"bank","name":"Christmas Bank Holiday"}, -"IT-2021-01-01":{"type":"public","name":"Capodanno"}, -"IT-2021-01-06":{"type":"public","name":"Befana"}, -"IT-2021-04-04":{"type":"public","name":"Domenica di Pasqua"}, -"IT-2021-04-05":{"type":"public","name":"Lunedì dell’Angelo"}, -"IT-2021-04-25":{"type":"public","name":"Anniversario della Liberazione"}, -"IT-2021-05-01":{"type":"public","name":"Festa del Lavoro"}, -"IT-2021-05-09":{"type":"observance","name":"Festa della mamma"}, -"IT-2021-06-02":{"type":"public","name":"Festa della Repubblica"}, -"IT-2021-08-15":{"type":"public","name":"Ferragosto"}, -"IT-2021-11-01":{"type":"public","name":"Ognissanti"}, -"IT-2021-12-08":{"type":"public","name":"Immacolata Concezione"}, -"IT-2021-12-25":{"type":"public","name":"Natale"}, -"IT-2021-12-26":{"type":"public","name":"Santo Stefano"}, -"IT-2022-01-01":{"type":"public","name":"Capodanno"}, -"IT-2022-01-06":{"type":"public","name":"Befana"}, -"IT-2022-04-17":{"type":"public","name":"Domenica di Pasqua"}, -"IT-2022-04-18":{"type":"public","name":"Lunedì dell’Angelo"}, -"IT-2022-04-25":{"type":"public","name":"Anniversario della Liberazione"}, -"IT-2022-05-01":{"type":"public","name":"Festa del Lavoro"}, -"IT-2022-05-08":{"type":"observance","name":"Festa della mamma"}, -"IT-2022-06-02":{"type":"public","name":"Festa della Repubblica"}, -"IT-2022-08-15":{"type":"public","name":"Ferragosto"}, -"IT-2022-11-01":{"type":"public","name":"Ognissanti"}, -"IT-2022-12-08":{"type":"public","name":"Immacolata Concezione"}, -"IT-2022-12-25":{"type":"public","name":"Natale"}, -"IT-2022-12-26":{"type":"public","name":"Santo Stefano"}, -"IT-2023-01-01":{"type":"public","name":"Capodanno"}, -"IT-2023-01-06":{"type":"public","name":"Befana"}, -"IT-2023-04-09":{"type":"public","name":"Domenica di Pasqua"}, -"IT-2023-04-10":{"type":"public","name":"Lunedì dell’Angelo"}, -"IT-2023-04-25":{"type":"public","name":"Anniversario della Liberazione"}, -"IT-2023-05-01":{"type":"public","name":"Festa del Lavoro"}, -"IT-2023-05-14":{"type":"observance","name":"Festa della mamma"}, -"IT-2023-06-02":{"type":"public","name":"Festa della Repubblica"}, -"IT-2023-08-15":{"type":"public","name":"Ferragosto"}, -"IT-2023-11-01":{"type":"public","name":"Ognissanti"}, -"IT-2023-12-08":{"type":"public","name":"Immacolata Concezione"}, -"IT-2023-12-25":{"type":"public","name":"Natale"}, -"IT-2023-12-26":{"type":"public","name":"Santo Stefano"}, -"LV-2021-01-01":{"type":"public","name":"Jaunais Gads"}, -"LV-2021-04-02":{"type":"public","name":"Lielā Piektdiena"}, -"LV-2021-04-04":{"type":"public","name":"Lieldienas"}, -"LV-2021-04-05":{"type":"public","name":"Otrās Lieldienas"}, -"LV-2021-05-01":{"type":"public","name":"Darba svētki"}, -"LV-2021-05-04":{"type":"public","name":"Latvijas Republikas Neatkarības atjaunošanas diena"}, -"LV-2021-05-09":{"type":"observance","name":"Mātes diena"}, -"LV-2021-06-23":{"type":"public","name":"Līgo Diena"}, -"LV-2021-06-24":{"type":"public","name":"Jāņi"}, -"LV-2021-11-18":{"type":"public","name":"Latvijas Republikas proklamēšanas diena"}, -"LV-2021-12-24":{"type":"public","name":"Ziemassvētku vakars"}, -"LV-2021-12-25":{"type":"public","name":"Ziemassvētki"}, -"LV-2021-12-26":{"type":"public","name":"Otrie Ziemassvētki"}, -"LV-2021-12-31":{"type":"public","name":"Vecgada vakars"}, -"LV-2022-01-01":{"type":"public","name":"Jaunais Gads"}, -"LV-2022-04-15":{"type":"public","name":"Lielā Piektdiena"}, -"LV-2022-04-17":{"type":"public","name":"Lieldienas"}, -"LV-2022-04-18":{"type":"public","name":"Otrās Lieldienas"}, -"LV-2022-05-01":{"type":"public","name":"Darba svētki"}, -"LV-2022-05-04":{"type":"public","name":"Latvijas Republikas Neatkarības atjaunošanas diena"}, -"LV-2022-05-08":{"type":"observance","name":"Mātes diena"}, -"LV-2022-06-23":{"type":"public","name":"Līgo Diena"}, -"LV-2022-06-24":{"type":"public","name":"Jāņi"}, -"LV-2022-11-18":{"type":"public","name":"Latvijas Republikas proklamēšanas diena"}, -"LV-2022-12-24":{"type":"public","name":"Ziemassvētku vakars"}, -"LV-2022-12-25":{"type":"public","name":"Ziemassvētki"}, -"LV-2022-12-26":{"type":"public","name":"Otrie Ziemassvētki"}, -"LV-2022-12-31":{"type":"public","name":"Vecgada vakars"}, -"LV-2023-01-01":{"type":"public","name":"Jaunais Gads"}, -"LV-2023-04-07":{"type":"public","name":"Lielā Piektdiena"}, -"LV-2023-04-09":{"type":"public","name":"Lieldienas"}, -"LV-2023-04-10":{"type":"public","name":"Otrās Lieldienas"}, -"LV-2023-05-01":{"type":"public","name":"Darba svētki"}, -"LV-2023-05-04":{"type":"public","name":"Latvijas Republikas Neatkarības atjaunošanas diena"}, -"LV-2023-05-14":{"type":"observance","name":"Mātes diena"}, -"LV-2023-06-23":{"type":"public","name":"Līgo Diena"}, -"LV-2023-06-24":{"type":"public","name":"Jāņi"}, -"LV-2023-11-18":{"type":"public","name":"Latvijas Republikas proklamēšanas diena"}, -"LV-2023-11-20":{"type":"public","name":"Latvijas Republikas proklamēšanas diena (aizstājējs diena)"}, -"LV-2023-12-24":{"type":"public","name":"Ziemassvētku vakars"}, -"LV-2023-12-25":{"type":"public","name":"Ziemassvētki"}, -"LV-2023-12-26":{"type":"public","name":"Otrie Ziemassvētki"}, -"LV-2023-12-31":{"type":"public","name":"Vecgada vakars"}, -"LI-2021-01-01":{"type":"public","name":"Neujahr"}, -"LI-2021-01-02":{"type":"bank","name":"Berchtoldstag"}, -"LI-2021-01-06":{"type":"public","name":"Heilige Drei Könige"}, -"LI-2021-02-02":{"type":"observance","name":"Lichtmess"}, -"LI-2021-02-16":{"type":"bank","name":"Faschingsdienstag"}, -"LI-2021-03-19":{"type":"observance","name":"Josefstag"}, -"LI-2021-04-02":{"type":"public","name":"Karfreitag"}, -"LI-2021-04-04":{"type":"observance","name":"Ostersonntag"}, -"LI-2021-04-05":{"type":"public","name":"Ostermontag"}, -"LI-2021-05-01":{"type":"public","name":"Tag der Arbeit"}, -"LI-2021-05-09":{"type":"observance","name":"Muttertag"}, -"LI-2021-05-13":{"type":"public","name":"Auffahrt"}, -"LI-2021-05-14":{"type":"public","name":"Feiertagsbrücke"}, -"LI-2021-05-23":{"type":"observance","name":"Pfingstsonntag"}, -"LI-2021-05-24":{"type":"public","name":"Pfingstmontag"}, -"LI-2021-06-03":{"type":"public","name":"Fronleichnam"}, -"LI-2021-06-04":{"type":"public","name":"Feiertagsbrücke"}, -"LI-2021-08-15":{"type":"observance","name":"Staatsfeiertag"}, -"LI-2021-09-08":{"type":"public","name":"Mariä Geburt"}, -"LI-2021-11-01":{"type":"observance","name":"Allerheiligen"}, -"LI-2021-12-08":{"type":"public","name":"Mariä Empfängnis"}, -"LI-2021-12-24":{"type":"bank","name":"Heiliger Abend"}, -"LI-2021-12-25":{"type":"public","name":"Weihnachten"}, -"LI-2021-12-26":{"type":"public","name":"Stephanstag"}, -"LI-2021-12-31":{"type":"bank","name":"Silvester"}, -"LI-2022-01-01":{"type":"public","name":"Neujahr"}, -"LI-2022-01-02":{"type":"bank","name":"Berchtoldstag"}, -"LI-2022-01-06":{"type":"public","name":"Heilige Drei Könige"}, -"LI-2022-02-02":{"type":"observance","name":"Lichtmess"}, -"LI-2022-03-01":{"type":"bank","name":"Faschingsdienstag"}, -"LI-2022-03-19":{"type":"observance","name":"Josefstag"}, -"LI-2022-04-15":{"type":"public","name":"Karfreitag"}, -"LI-2022-04-17":{"type":"observance","name":"Ostersonntag"}, -"LI-2022-04-18":{"type":"public","name":"Ostermontag"}, -"LI-2022-05-01":{"type":"public","name":"Tag der Arbeit"}, -"LI-2022-05-08":{"type":"observance","name":"Muttertag"}, -"LI-2022-05-26":{"type":"public","name":"Auffahrt"}, -"LI-2022-05-27":{"type":"public","name":"Feiertagsbrücke"}, -"LI-2022-06-05":{"type":"observance","name":"Pfingstsonntag"}, -"LI-2022-06-06":{"type":"public","name":"Pfingstmontag"}, -"LI-2022-06-16":{"type":"public","name":"Fronleichnam"}, -"LI-2022-06-17":{"type":"public","name":"Feiertagsbrücke"}, -"LI-2022-08-15":{"type":"observance","name":"Staatsfeiertag"}, -"LI-2022-09-08":{"type":"public","name":"Mariä Geburt"}, -"LI-2022-11-01":{"type":"observance","name":"Allerheiligen"}, -"LI-2022-12-08":{"type":"public","name":"Mariä Empfängnis"}, -"LI-2022-12-24":{"type":"bank","name":"Heiliger Abend"}, -"LI-2022-12-25":{"type":"public","name":"Weihnachten"}, -"LI-2022-12-26":{"type":"public","name":"Stephanstag"}, -"LI-2022-12-31":{"type":"bank","name":"Silvester"}, -"LI-2023-01-01":{"type":"public","name":"Neujahr"}, -"LI-2023-01-02":{"type":"bank","name":"Berchtoldstag"}, -"LI-2023-01-06":{"type":"public","name":"Heilige Drei Könige"}, -"LI-2023-02-02":{"type":"observance","name":"Lichtmess"}, -"LI-2023-02-21":{"type":"bank","name":"Faschingsdienstag"}, -"LI-2023-03-19":{"type":"observance","name":"Josefstag"}, -"LI-2023-04-07":{"type":"public","name":"Karfreitag"}, -"LI-2023-04-09":{"type":"observance","name":"Ostersonntag"}, -"LI-2023-04-10":{"type":"public","name":"Ostermontag"}, -"LI-2023-05-01":{"type":"public","name":"Tag der Arbeit"}, -"LI-2023-05-14":{"type":"observance","name":"Muttertag"}, -"LI-2023-05-18":{"type":"public","name":"Auffahrt"}, -"LI-2023-05-19":{"type":"public","name":"Feiertagsbrücke"}, -"LI-2023-05-28":{"type":"observance","name":"Pfingstsonntag"}, -"LI-2023-05-29":{"type":"public","name":"Pfingstmontag"}, -"LI-2023-06-08":{"type":"public","name":"Fronleichnam"}, -"LI-2023-06-09":{"type":"public","name":"Feiertagsbrücke"}, -"LI-2023-08-15":{"type":"observance","name":"Staatsfeiertag"}, -"LI-2023-09-08":{"type":"public","name":"Mariä Geburt"}, -"LI-2023-11-01":{"type":"observance","name":"Allerheiligen"}, -"LI-2023-12-08":{"type":"public","name":"Mariä Empfängnis"}, -"LI-2023-12-24":{"type":"bank","name":"Heiliger Abend"}, -"LI-2023-12-25":{"type":"public","name":"Weihnachten"}, -"LI-2023-12-26":{"type":"public","name":"Stephanstag"}, -"LI-2023-12-31":{"type":"bank","name":"Silvester"}, -"LT-2021-01-01":{"type":"public","name":"Naujieji metai"}, -"LT-2021-02-16":{"type":"public","name":"Lietuvos valstybės atkūrimo diena"}, -"LT-2021-03-11":{"type":"public","name":"Lietuvos nepriklausomybės atkūrimo diena"}, -"LT-2021-04-04":{"type":"public","name":"Velykos"}, -"LT-2021-05-01":{"type":"public","name":"Tarptautinė darbo diena"}, -"LT-2021-05-02":{"type":"observance","name":"Motinos diena"}, -"LT-2021-06-06":{"type":"observance","name":"Tėvo diena"}, -"LT-2021-06-24":{"type":"public","name":"Joninės, Rasos"}, -"LT-2021-07-06":{"type":"public","name":"Valstybės diena"}, -"LT-2021-08-15":{"type":"public","name":"Žolinė"}, -"LT-2021-11-01":{"type":"public","name":"Visų šventųjų diena"}, -"LT-2021-11-02":{"type":"public","name":"Vėlinės"}, -"LT-2021-12-24":{"type":"public","name":"Šv. Kūčios"}, -"LT-2021-12-25":{"type":"public","name":"Šv. Kalėdos"}, -"LT-2021-12-26":{"type":"public","name":"2. Kalėdų diena"}, -"LT-2022-01-01":{"type":"public","name":"Naujieji metai"}, -"LT-2022-02-16":{"type":"public","name":"Lietuvos valstybės atkūrimo diena"}, -"LT-2022-03-11":{"type":"public","name":"Lietuvos nepriklausomybės atkūrimo diena"}, -"LT-2022-04-17":{"type":"public","name":"Velykos"}, -"LT-2022-05-01":{"type":"public","name":"Tarptautinė darbo diena"}, -"LT-2022-06-05":{"type":"observance","name":"Tėvo diena"}, -"LT-2022-06-24":{"type":"public","name":"Joninės, Rasos"}, -"LT-2022-07-06":{"type":"public","name":"Valstybės diena"}, -"LT-2022-08-15":{"type":"public","name":"Žolinė"}, -"LT-2022-11-01":{"type":"public","name":"Visų šventųjų diena"}, -"LT-2022-11-02":{"type":"public","name":"Vėlinės"}, -"LT-2022-12-24":{"type":"public","name":"Šv. Kūčios"}, -"LT-2022-12-25":{"type":"public","name":"Šv. Kalėdos"}, -"LT-2022-12-26":{"type":"public","name":"2. Kalėdų diena"}, -"LT-2023-01-01":{"type":"public","name":"Naujieji metai"}, -"LT-2023-02-16":{"type":"public","name":"Lietuvos valstybės atkūrimo diena"}, -"LT-2023-03-11":{"type":"public","name":"Lietuvos nepriklausomybės atkūrimo diena"}, -"LT-2023-04-09":{"type":"public","name":"Velykos"}, -"LT-2023-05-01":{"type":"public","name":"Tarptautinė darbo diena"}, -"LT-2023-05-07":{"type":"observance","name":"Motinos diena"}, -"LT-2023-06-04":{"type":"observance","name":"Tėvo diena"}, -"LT-2023-06-24":{"type":"public","name":"Joninės, Rasos"}, -"LT-2023-07-06":{"type":"public","name":"Valstybės diena"}, -"LT-2023-08-15":{"type":"public","name":"Žolinė"}, -"LT-2023-11-01":{"type":"public","name":"Visų šventųjų diena"}, -"LT-2023-11-02":{"type":"public","name":"Vėlinės"}, -"LT-2023-12-24":{"type":"public","name":"Šv. Kūčios"}, -"LT-2023-12-25":{"type":"public","name":"Šv. Kalėdos"}, -"LT-2023-12-26":{"type":"public","name":"2. Kalėdų diena"}, -"LU-2021-01-01":{"type":"public","name":"Nouvel An"}, -"LU-2021-04-02":{"type":"observance","name":"Vendredi saint"}, -"LU-2021-04-04":{"type":"observance","name":"Pâques"}, -"LU-2021-04-05":{"type":"public","name":"Lundi de Pâques"}, -"LU-2021-05-01":{"type":"public","name":"1er mai"}, -"LU-2021-05-09":{"type":"public","name":"Journée de l'Europe"}, -"LU-2021-05-13":{"type":"public","name":"Ascension"}, -"LU-2021-05-24":{"type":"public","name":"Lundi de Pentecôte"}, -"LU-2021-06-23":{"type":"public","name":"L’anniversaire du Grand-Duc"}, -"LU-2021-08-15":{"type":"public","name":"Assomption"}, -"LU-2021-11-01":{"type":"public","name":"Toussaint"}, -"LU-2021-12-25":{"type":"public","name":"Noël"}, -"LU-2021-12-26":{"type":"public","name":"Lendemain de Noël"}, -"LU-2022-01-01":{"type":"public","name":"Nouvel An"}, -"LU-2022-04-15":{"type":"observance","name":"Vendredi saint"}, -"LU-2022-04-17":{"type":"observance","name":"Pâques"}, -"LU-2022-04-18":{"type":"public","name":"Lundi de Pâques"}, -"LU-2022-05-01":{"type":"public","name":"1er mai"}, -"LU-2022-05-09":{"type":"public","name":"Journée de l'Europe"}, -"LU-2022-05-26":{"type":"public","name":"Ascension"}, -"LU-2022-06-06":{"type":"public","name":"Lundi de Pentecôte"}, -"LU-2022-06-23":{"type":"public","name":"L’anniversaire du Grand-Duc"}, -"LU-2022-08-15":{"type":"public","name":"Assomption"}, -"LU-2022-11-01":{"type":"public","name":"Toussaint"}, -"LU-2022-12-25":{"type":"public","name":"Noël"}, -"LU-2022-12-26":{"type":"public","name":"Lendemain de Noël"}, -"LU-2023-01-01":{"type":"public","name":"Nouvel An"}, -"LU-2023-04-07":{"type":"observance","name":"Vendredi saint"}, -"LU-2023-04-09":{"type":"observance","name":"Pâques"}, -"LU-2023-04-10":{"type":"public","name":"Lundi de Pâques"}, -"LU-2023-05-01":{"type":"public","name":"1er mai"}, -"LU-2023-05-09":{"type":"public","name":"Journée de l'Europe"}, -"LU-2023-05-18":{"type":"public","name":"Ascension"}, -"LU-2023-05-29":{"type":"public","name":"Lundi de Pentecôte"}, -"LU-2023-06-23":{"type":"public","name":"L’anniversaire du Grand-Duc"}, -"LU-2023-08-15":{"type":"public","name":"Assomption"}, -"LU-2023-11-01":{"type":"public","name":"Toussaint"}, -"LU-2023-12-25":{"type":"public","name":"Noël"}, -"LU-2023-12-26":{"type":"public","name":"Lendemain de Noël"}, -"NL-2021-01-01":{"type":"public","name":"Nieuwjaar"}, -"NL-2021-04-02":{"type":"public","name":"Goede Vrijdag"}, -"NL-2021-04-04":{"type":"public","name":"Pasen"}, -"NL-2021-04-05":{"type":"public","name":"Tweede paasdag"}, -"NL-2021-04-27":{"type":"public","name":"Koningsdag"}, -"NL-2021-05-04":{"type":"observance","name":"Nationale Dodenherdenking"}, -"NL-2021-05-05":{"type":"public","name":"Bevrijdingsdag"}, -"NL-2021-05-09":{"type":"observance","name":"Moederdag"}, -"NL-2021-05-13":{"type":"public","name":"O.L.H. Hemelvaart"}, -"NL-2021-05-23":{"type":"public","name":"Pinksteren"}, -"NL-2021-05-24":{"type":"public","name":"Tweede pinksterdag"}, -"NL-2021-06-20":{"type":"observance","name":"Vaderdag"}, -"NL-2021-09-21":{"type":"observance","name":"Prinsjesdag"}, -"NL-2021-11-11":{"type":"observance","name":"Sint Maarten"}, -"NL-2021-12-05":{"type":"observance","name":"Sinterklaasavond"}, -"NL-2021-12-15":{"type":"observance","name":"Koninkrijksdag"}, -"NL-2021-12-25":{"type":"public","name":"Kerstmis"}, -"NL-2021-12-26":{"type":"public","name":"Tweede kerstdag"}, -"NL-2021-12-31":{"type":"bank","name":"Oudejaarsavond"}, -"NL-2022-01-01":{"type":"public","name":"Nieuwjaar"}, -"NL-2022-04-15":{"type":"public","name":"Goede Vrijdag"}, -"NL-2022-04-17":{"type":"public","name":"Pasen"}, -"NL-2022-04-18":{"type":"public","name":"Tweede paasdag"}, -"NL-2022-04-27":{"type":"public","name":"Koningsdag"}, -"NL-2022-05-04":{"type":"observance","name":"Nationale Dodenherdenking"}, -"NL-2022-05-05":{"type":"public","name":"Bevrijdingsdag"}, -"NL-2022-05-08":{"type":"observance","name":"Moederdag"}, -"NL-2022-05-26":{"type":"public","name":"O.L.H. Hemelvaart"}, -"NL-2022-06-05":{"type":"public","name":"Pinksteren"}, -"NL-2022-06-06":{"type":"public","name":"Tweede pinksterdag"}, -"NL-2022-06-19":{"type":"observance","name":"Vaderdag"}, -"NL-2022-09-20":{"type":"observance","name":"Prinsjesdag"}, -"NL-2022-11-11":{"type":"observance","name":"Sint Maarten"}, -"NL-2022-12-05":{"type":"observance","name":"Sinterklaasavond"}, -"NL-2022-12-15":{"type":"observance","name":"Koninkrijksdag"}, -"NL-2022-12-25":{"type":"public","name":"Kerstmis"}, -"NL-2022-12-26":{"type":"public","name":"Tweede kerstdag"}, -"NL-2022-12-31":{"type":"bank","name":"Oudejaarsavond"}, -"NL-2023-01-01":{"type":"public","name":"Nieuwjaar"}, -"NL-2023-04-07":{"type":"public","name":"Goede Vrijdag"}, -"NL-2023-04-09":{"type":"public","name":"Pasen"}, -"NL-2023-04-10":{"type":"public","name":"Tweede paasdag"}, -"NL-2023-04-27":{"type":"public","name":"Koningsdag"}, -"NL-2023-05-04":{"type":"observance","name":"Nationale Dodenherdenking"}, -"NL-2023-05-05":{"type":"public","name":"Bevrijdingsdag"}, -"NL-2023-05-14":{"type":"observance","name":"Moederdag"}, -"NL-2023-05-18":{"type":"public","name":"O.L.H. Hemelvaart"}, -"NL-2023-05-28":{"type":"public","name":"Pinksteren"}, -"NL-2023-05-29":{"type":"public","name":"Tweede pinksterdag"}, -"NL-2023-06-18":{"type":"observance","name":"Vaderdag"}, -"NL-2023-09-19":{"type":"observance","name":"Prinsjesdag"}, -"NL-2023-11-11":{"type":"observance","name":"Sint Maarten"}, -"NL-2023-12-05":{"type":"observance","name":"Sinterklaasavond"}, -"NL-2023-12-15":{"type":"observance","name":"Koninkrijksdag"}, -"NL-2023-12-25":{"type":"public","name":"Kerstmis"}, -"NL-2023-12-26":{"type":"public","name":"Tweede kerstdag"}, -"NL-2023-12-31":{"type":"bank","name":"Oudejaarsavond"}, -"NO-2021-01-01":{"type":"public","name":"Første nyttårsdag"}, -"NO-2021-02-14":{"type":"observance","name":"Morsdag"}, -"NO-2021-03-28":{"type":"observance","name":"Palmesøndag"}, -"NO-2021-04-01":{"type":"public","name":"Skjærtorsdag"}, -"NO-2021-04-02":{"type":"public","name":"Langfredag"}, -"NO-2021-04-03":{"type":"public","name":"Påskeaften"}, -"NO-2021-04-04":{"type":"public","name":"Første påskedag"}, -"NO-2021-04-05":{"type":"public","name":"Andre påskedag"}, -"NO-2021-05-01":{"type":"public","name":"Arbeidernes dag"}, -"NO-2021-05-08":{"type":"observance","name":"Frigjøringsdagen"}, -"NO-2021-05-13":{"type":"public","name":"Kristi himmelfartsdag"}, -"NO-2021-05-17":{"type":"public","name":"17. mai"}, -"NO-2021-05-23":{"type":"public","name":"Første pinsedag"}, -"NO-2021-05-24":{"type":"public","name":"Andre pinsedag"}, -"NO-2021-06-23":{"type":"observance","name":"Sankthansaften"}, -"NO-2021-11-14":{"type":"observance","name":"Farsdag"}, -"NO-2021-11-28":{"type":"observance","name":"Første søndag i advent"}, -"NO-2021-12-05":{"type":"observance","name":"Andre søndag i advent"}, -"NO-2021-12-12":{"type":"observance","name":"Tredje søndag i advent"}, -"NO-2021-12-19":{"type":"observance","name":"Fjerde søndag i advent"}, -"NO-2021-12-24":{"type":"bank","name":"Julaften"}, -"NO-2021-12-25":{"type":"public","name":"Første Juledag"}, -"NO-2021-12-26":{"type":"public","name":"Andre juledag"}, -"NO-2021-12-31":{"type":"bank","name":"Nyttårsaften"}, -"NO-2022-01-01":{"type":"public","name":"Første nyttårsdag"}, -"NO-2022-02-13":{"type":"observance","name":"Morsdag"}, -"NO-2022-02-27":{"type":"observance","name":"Fastelavn"}, -"NO-2022-04-10":{"type":"observance","name":"Palmesøndag"}, -"NO-2022-04-14":{"type":"public","name":"Skjærtorsdag"}, -"NO-2022-04-15":{"type":"public","name":"Langfredag"}, -"NO-2022-04-16":{"type":"public","name":"Påskeaften"}, -"NO-2022-04-17":{"type":"public","name":"Første påskedag"}, -"NO-2022-04-18":{"type":"public","name":"Andre påskedag"}, -"NO-2022-05-01":{"type":"public","name":"Arbeidernes dag"}, -"NO-2022-05-08":{"type":"observance","name":"Frigjøringsdagen"}, -"NO-2022-05-17":{"type":"public","name":"17. mai"}, -"NO-2022-05-26":{"type":"public","name":"Kristi himmelfartsdag"}, -"NO-2022-06-05":{"type":"public","name":"Første pinsedag"}, -"NO-2022-06-06":{"type":"public","name":"Andre pinsedag"}, -"NO-2022-06-23":{"type":"observance","name":"Sankthansaften"}, -"NO-2022-11-13":{"type":"observance","name":"Farsdag"}, -"NO-2022-11-27":{"type":"observance","name":"Første søndag i advent"}, -"NO-2022-12-04":{"type":"observance","name":"Andre søndag i advent"}, -"NO-2022-12-11":{"type":"observance","name":"Tredje søndag i advent"}, -"NO-2022-12-18":{"type":"observance","name":"Fjerde søndag i advent"}, -"NO-2022-12-24":{"type":"bank","name":"Julaften"}, -"NO-2022-12-25":{"type":"public","name":"Første Juledag"}, -"NO-2022-12-26":{"type":"public","name":"Andre juledag"}, -"NO-2022-12-31":{"type":"bank","name":"Nyttårsaften"}, -"NO-2023-01-01":{"type":"public","name":"Første nyttårsdag"}, -"NO-2023-02-12":{"type":"observance","name":"Morsdag"}, -"NO-2023-02-19":{"type":"observance","name":"Fastelavn"}, -"NO-2023-04-02":{"type":"observance","name":"Palmesøndag"}, -"NO-2023-04-06":{"type":"public","name":"Skjærtorsdag"}, -"NO-2023-04-07":{"type":"public","name":"Langfredag"}, -"NO-2023-04-08":{"type":"public","name":"Påskeaften"}, -"NO-2023-04-09":{"type":"public","name":"Første påskedag"}, -"NO-2023-04-10":{"type":"public","name":"Andre påskedag"}, -"NO-2023-05-01":{"type":"public","name":"Arbeidernes dag"}, -"NO-2023-05-08":{"type":"observance","name":"Frigjøringsdagen"}, -"NO-2023-05-17":{"type":"public","name":"17. mai"}, -"NO-2023-05-18":{"type":"public","name":"Kristi himmelfartsdag"}, -"NO-2023-05-28":{"type":"public","name":"Første pinsedag"}, -"NO-2023-05-29":{"type":"public","name":"Andre pinsedag"}, -"NO-2023-06-23":{"type":"observance","name":"Sankthansaften"}, -"NO-2023-11-12":{"type":"observance","name":"Farsdag"}, -"NO-2023-11-26":{"type":"observance","name":"Første søndag i advent"}, -"NO-2023-12-03":{"type":"observance","name":"Andre søndag i advent"}, -"NO-2023-12-10":{"type":"observance","name":"Tredje søndag i advent"}, -"NO-2023-12-17":{"type":"observance","name":"Fjerde søndag i advent"}, -"NO-2023-12-24":{"type":"bank","name":"Julaften"}, -"NO-2023-12-25":{"type":"public","name":"Første Juledag"}, -"NO-2023-12-26":{"type":"public","name":"Andre juledag"}, -"NO-2023-12-31":{"type":"bank","name":"Nyttårsaften"}, -"PL-2021-01-01":{"type":"public","name":"Nowy Rok"}, -"PL-2021-01-06":{"type":"public","name":"Święto Trzech Króli"}, -"PL-2021-04-04":{"type":"public","name":"Niedziela Wielkanocna"}, -"PL-2021-04-05":{"type":"public","name":"Drugi dzień Wielkanocy"}, -"PL-2021-05-01":{"type":"public","name":"Święto Państwowe; Święto Pracy"}, -"PL-2021-05-03":{"type":"public","name":"Święto Narodowe Trzeciego Maja"}, -"PL-2021-05-23":{"type":"public","name":"Zielone Świątki"}, -"PL-2021-05-26":{"type":"observance","name":"Dzień Matki"}, -"PL-2021-06-03":{"type":"public","name":"Dzień Bożego Ciała"}, -"PL-2021-08-15":{"type":"public","name":"Wniebowzięcie Najświętszej Maryi Panny"}, -"PL-2021-11-01":{"type":"public","name":"Wszystkich Świętych"}, -"PL-2021-11-11":{"type":"public","name":"Narodowe Święto Niepodległości"}, -"PL-2021-12-25":{"type":"public","name":"Pierwszy dzień Bożego Narodzenia"}, -"PL-2021-12-26":{"type":"public","name":"Drugi dzień Bożego Narodzenia"}, -"PL-2022-01-01":{"type":"public","name":"Nowy Rok"}, -"PL-2022-01-06":{"type":"public","name":"Święto Trzech Króli"}, -"PL-2022-04-17":{"type":"public","name":"Niedziela Wielkanocna"}, -"PL-2022-04-18":{"type":"public","name":"Drugi dzień Wielkanocy"}, -"PL-2022-05-01":{"type":"public","name":"Święto Państwowe; Święto Pracy"}, -"PL-2022-05-03":{"type":"public","name":"Święto Narodowe Trzeciego Maja"}, -"PL-2022-05-26":{"type":"observance","name":"Dzień Matki"}, -"PL-2022-06-05":{"type":"public","name":"Zielone Świątki"}, -"PL-2022-06-16":{"type":"public","name":"Dzień Bożego Ciała"}, -"PL-2022-08-15":{"type":"public","name":"Wniebowzięcie Najświętszej Maryi Panny"}, -"PL-2022-11-01":{"type":"public","name":"Wszystkich Świętych"}, -"PL-2022-11-11":{"type":"public","name":"Narodowe Święto Niepodległości"}, -"PL-2022-12-25":{"type":"public","name":"Pierwszy dzień Bożego Narodzenia"}, -"PL-2022-12-26":{"type":"public","name":"Drugi dzień Bożego Narodzenia"}, -"PL-2023-01-01":{"type":"public","name":"Nowy Rok"}, -"PL-2023-01-06":{"type":"public","name":"Święto Trzech Króli"}, -"PL-2023-04-09":{"type":"public","name":"Niedziela Wielkanocna"}, -"PL-2023-04-10":{"type":"public","name":"Drugi dzień Wielkanocy"}, -"PL-2023-05-01":{"type":"public","name":"Święto Państwowe; Święto Pracy"}, -"PL-2023-05-03":{"type":"public","name":"Święto Narodowe Trzeciego Maja"}, -"PL-2023-05-26":{"type":"observance","name":"Dzień Matki"}, -"PL-2023-05-28":{"type":"public","name":"Zielone Świątki"}, -"PL-2023-06-08":{"type":"public","name":"Dzień Bożego Ciała"}, -"PL-2023-08-15":{"type":"public","name":"Wniebowzięcie Najświętszej Maryi Panny"}, -"PL-2023-11-01":{"type":"public","name":"Wszystkich Świętych"}, -"PL-2023-11-11":{"type":"public","name":"Narodowe Święto Niepodległości"}, -"PL-2023-12-25":{"type":"public","name":"Pierwszy dzień Bożego Narodzenia"}, -"PL-2023-12-26":{"type":"public","name":"Drugi dzień Bożego Narodzenia"}, -"PT-2021-01-01":{"type":"public","name":"Ano Novo"}, -"PT-2021-02-16":{"type":"observance","name":"Carnaval"}, -"PT-2021-04-02":{"type":"public","name":"Sexta-Feira Santa"}, -"PT-2021-04-04":{"type":"public","name":"Páscoa"}, -"PT-2021-04-25":{"type":"public","name":"Dia da Liberdade"}, -"PT-2021-05-01":{"type":"public","name":"Dia do trabalhador"}, -"PT-2021-05-02":{"type":"observance","name":"Dia das Mães"}, -"PT-2021-06-03":{"type":"public","name":"Corpo de Deus"}, -"PT-2021-06-10":{"type":"public","name":"Dia de Portugal"}, -"PT-2021-08-15":{"type":"public","name":"Assunção de Maria"}, -"PT-2021-10-05":{"type":"public","name":"Implantação da República"}, -"PT-2021-11-01":{"type":"public","name":"Todos os santos"}, -"PT-2021-12-01":{"type":"public","name":"Restauração da Independência"}, -"PT-2021-12-08":{"type":"public","name":"Imaculada Conceição"}, -"PT-2021-12-24":{"type":"observance","name":"Noite de Natal"}, -"PT-2021-12-25":{"type":"public","name":"Natal"}, -"PT-2021-12-31":{"type":"observance","name":"Véspera de Ano Novo"}, -"PT-2022-01-01":{"type":"public","name":"Ano Novo"}, -"PT-2022-03-01":{"type":"observance","name":"Carnaval"}, -"PT-2022-04-15":{"type":"public","name":"Sexta-Feira Santa"}, -"PT-2022-04-17":{"type":"public","name":"Páscoa"}, -"PT-2022-04-25":{"type":"public","name":"Dia da Liberdade"}, -"PT-2022-05-01":{"type":"public","name":"Dia do trabalhador"}, -"PT-2022-06-10":{"type":"public","name":"Dia de Portugal"}, -"PT-2022-06-16":{"type":"public","name":"Corpo de Deus"}, -"PT-2022-08-15":{"type":"public","name":"Assunção de Maria"}, -"PT-2022-10-05":{"type":"public","name":"Implantação da República"}, -"PT-2022-11-01":{"type":"public","name":"Todos os santos"}, -"PT-2022-12-01":{"type":"public","name":"Restauração da Independência"}, -"PT-2022-12-08":{"type":"public","name":"Imaculada Conceição"}, -"PT-2022-12-24":{"type":"observance","name":"Noite de Natal"}, -"PT-2022-12-25":{"type":"public","name":"Natal"}, -"PT-2022-12-31":{"type":"observance","name":"Véspera de Ano Novo"}, -"PT-2023-01-01":{"type":"public","name":"Ano Novo"}, -"PT-2023-02-21":{"type":"observance","name":"Carnaval"}, -"PT-2023-04-07":{"type":"public","name":"Sexta-Feira Santa"}, -"PT-2023-04-09":{"type":"public","name":"Páscoa"}, -"PT-2023-04-25":{"type":"public","name":"Dia da Liberdade"}, -"PT-2023-05-01":{"type":"public","name":"Dia do trabalhador"}, -"PT-2023-05-07":{"type":"observance","name":"Dia das Mães"}, -"PT-2023-06-08":{"type":"public","name":"Corpo de Deus"}, -"PT-2023-06-10":{"type":"public","name":"Dia de Portugal"}, -"PT-2023-08-15":{"type":"public","name":"Assunção de Maria"}, -"PT-2023-10-05":{"type":"public","name":"Implantação da República"}, -"PT-2023-11-01":{"type":"public","name":"Todos os santos"}, -"PT-2023-12-01":{"type":"public","name":"Restauração da Independência"}, -"PT-2023-12-08":{"type":"public","name":"Imaculada Conceição"}, -"PT-2023-12-24":{"type":"observance","name":"Noite de Natal"}, -"PT-2023-12-25":{"type":"public","name":"Natal"}, -"PT-2023-12-31":{"type":"observance","name":"Véspera de Ano Novo"}, -"RO-2021-01-01":{"type":"public","name":"Anul nou"}, -"RO-2021-01-24":{"type":"public","name":"Ziua Unirii"}, -"RO-2021-03-08":{"type":"observance","name":"Ziua Mamei"}, -"RO-2021-04-30":{"type":"public","name":"Vinerea Mare"}, -"RO-2021-05-01":{"type":"public","name":"Ziua muncii"}, -"RO-2021-05-02":{"type":"public","name":"Paștele"}, -"RO-2021-05-03":{"type":"public","name":"Două zi de Pasti"}, -"RO-2021-06-01":{"type":"public","name":"Ziua Copilului"}, -"RO-2021-06-10":{"type":"observance","name":"Ziua Eroilor"}, -"RO-2021-06-20":{"type":"public","name":"Rusaliile"}, -"RO-2021-06-21":{"type":"public","name":"Două zi de Rusalii"}, -"RO-2021-06-26":{"type":"observance","name":"Ziua drapelului national"}, -"RO-2021-07-29":{"type":"observance","name":"Ziua Imnului național"}, -"RO-2021-08-15":{"type":"public","name":"Adormirea Maicii Domnului"}, -"RO-2021-11-30":{"type":"public","name":"Sfântul Andrei"}, -"RO-2021-12-01":{"type":"public","name":"Ziua națională, Ziua Marii Uniri"}, -"RO-2021-12-08":{"type":"observance","name":"Ziua Constituției"}, -"RO-2021-12-25":{"type":"public","name":"Crăciunul"}, -"RO-2021-12-26":{"type":"public","name":"Două zi de Crăciun"}, -"RO-2022-01-01":{"type":"public","name":"Anul nou"}, -"RO-2022-01-24":{"type":"public","name":"Ziua Unirii"}, -"RO-2022-03-08":{"type":"observance","name":"Ziua Mamei"}, -"RO-2022-04-22":{"type":"public","name":"Vinerea Mare"}, -"RO-2022-04-24":{"type":"public","name":"Paștele"}, -"RO-2022-04-25":{"type":"public","name":"Două zi de Pasti"}, -"RO-2022-05-01":{"type":"public","name":"Ziua muncii"}, -"RO-2022-06-01":{"type":"public","name":"Ziua Copilului"}, -"RO-2022-06-02":{"type":"observance","name":"Ziua Eroilor"}, -"RO-2022-06-12":{"type":"public","name":"Rusaliile"}, -"RO-2022-06-13":{"type":"public","name":"Două zi de Rusalii"}, -"RO-2022-06-26":{"type":"observance","name":"Ziua drapelului national"}, -"RO-2022-07-29":{"type":"observance","name":"Ziua Imnului național"}, -"RO-2022-08-15":{"type":"public","name":"Adormirea Maicii Domnului"}, -"RO-2022-11-30":{"type":"public","name":"Sfântul Andrei"}, -"RO-2022-12-01":{"type":"public","name":"Ziua națională, Ziua Marii Uniri"}, -"RO-2022-12-08":{"type":"observance","name":"Ziua Constituției"}, -"RO-2022-12-25":{"type":"public","name":"Crăciunul"}, -"RO-2022-12-26":{"type":"public","name":"Două zi de Crăciun"}, -"RO-2023-01-01":{"type":"public","name":"Anul nou"}, -"RO-2023-01-24":{"type":"public","name":"Ziua Unirii"}, -"RO-2023-03-08":{"type":"observance","name":"Ziua Mamei"}, -"RO-2023-04-14":{"type":"public","name":"Vinerea Mare"}, -"RO-2023-04-16":{"type":"public","name":"Paștele"}, -"RO-2023-04-17":{"type":"public","name":"Două zi de Pasti"}, -"RO-2023-05-01":{"type":"public","name":"Ziua muncii"}, -"RO-2023-05-07":{"type":"observance","name":"Ziua Mamei"}, -"RO-2023-05-25":{"type":"observance","name":"Ziua Eroilor"}, -"RO-2023-06-01":{"type":"public","name":"Ziua Copilului"}, -"RO-2023-06-04":{"type":"public","name":"Rusaliile"}, -"RO-2023-06-05":{"type":"public","name":"Două zi de Rusalii"}, -"RO-2023-06-26":{"type":"observance","name":"Ziua drapelului national"}, -"RO-2023-07-29":{"type":"observance","name":"Ziua Imnului național"}, -"RO-2023-08-15":{"type":"public","name":"Adormirea Maicii Domnului"}, -"RO-2023-11-30":{"type":"public","name":"Sfântul Andrei"}, -"RO-2023-12-01":{"type":"public","name":"Ziua națională, Ziua Marii Uniri"}, -"RO-2023-12-08":{"type":"observance","name":"Ziua Constituției"}, -"RO-2023-12-25":{"type":"public","name":"Crăciunul"}, -"RO-2023-12-26":{"type":"public","name":"Două zi de Crăciun"}, -"RU-2021-01-01":{"type":"public","name":"Новый год"}, -"RU-2021-01-02":{"type":"public","name":"Новогодние каникулы"}, -"RU-2021-01-07":{"type":"public","name":"Рождество Христово"}, -"RU-2021-01-08":{"type":"public","name":"Новогодние каникулы"}, -"RU-2021-02-23":{"type":"public","name":"День защитника Отечества"}, -"RU-2021-03-08":{"type":"public","name":"Международный женский день"}, -"RU-2021-05-01":{"type":"public","name":"День весны и труда"}, -"RU-2021-05-09":{"type":"public","name":"День Победы"}, -"RU-2021-06-12":{"type":"public","name":"День России"}, -"RU-2021-08-22":{"type":"public","name":"День Государственного флага"}, -"RU-2021-11-04":{"type":"public","name":"День народного единства"}, -"RU-2022-01-01":{"type":"public","name":"Новый год"}, -"RU-2022-01-02":{"type":"public","name":"Новогодние каникулы"}, -"RU-2022-01-07":{"type":"public","name":"Рождество Христово"}, -"RU-2022-01-08":{"type":"public","name":"Новогодние каникулы"}, -"RU-2022-02-23":{"type":"public","name":"День защитника Отечества"}, -"RU-2022-03-08":{"type":"public","name":"Международный женский день"}, -"RU-2022-05-01":{"type":"public","name":"День весны и труда"}, -"RU-2022-05-09":{"type":"public","name":"День Победы"}, -"RU-2022-06-12":{"type":"public","name":"День России"}, -"RU-2022-08-22":{"type":"public","name":"День Государственного флага"}, -"RU-2022-11-04":{"type":"public","name":"День народного единства"}, -"RU-2023-01-01":{"type":"public","name":"Новый год"}, -"RU-2023-01-02":{"type":"public","name":"Новогодние каникулы"}, -"RU-2023-01-07":{"type":"public","name":"Рождество Христово"}, -"RU-2023-01-08":{"type":"public","name":"Новогодние каникулы"}, -"RU-2023-02-23":{"type":"public","name":"День защитника Отечества"}, -"RU-2023-03-08":{"type":"public","name":"Международный женский день"}, -"RU-2023-05-01":{"type":"public","name":"День весны и труда"}, -"RU-2023-05-09":{"type":"public","name":"День Победы"}, -"RU-2023-06-12":{"type":"public","name":"День России"}, -"RU-2023-08-22":{"type":"public","name":"День Государственного флага"}, -"RU-2023-11-04":{"type":"public","name":"День народного единства"}, -"SG-2021-01-01":{"type":"public","name":"New Year's Day"}, -"SG-2021-02-12":{"type":"public","name":"Chinese New Year"}, -"SG-2021-02-13":{"type":"public","name":"Chinese New Year"}, -"SG-2021-04-02":{"type":"public","name":"Good Friday"}, -"SG-2021-05-01":{"type":"public","name":"Labour Day"}, -"SG-2021-05-13":{"type":"public","name":"Hari Raya Puasa"}, -"SG-2021-05-26":{"type":"public","name":"Vesak Day"}, -"SG-2021-07-20":{"type":"public","name":"Hari Raya Haji"}, -"SG-2021-08-09":{"type":"public","name":"National Day"}, -"SG-2021-11-04":{"type":"public","name":"Deepavali"}, -"SG-2021-12-25":{"type":"public","name":"Christmas Day"}, -"SG-2022-01-01":{"type":"public","name":"New Year's Day"}, -"SG-2022-02-01":{"type":"public","name":"Chinese New Year"}, -"SG-2022-02-02":{"type":"public","name":"Chinese New Year"}, -"SG-2022-04-15":{"type":"public","name":"Good Friday"}, -"SG-2022-05-01":{"type":"public","name":"Labour Day"}, -"SG-2022-05-02":{"type":"public","name":"Labour Day (substitute day)"}, -"SG-2022-05-15":{"type":"public","name":"Vesak Day"}, -"SG-2022-05-16":{"type":"public","name":"Vesak Day"}, -"SG-2022-07-09":{"type":"public","name":"Hari Raya Haji"}, -"SG-2022-08-09":{"type":"public","name":"National Day"}, -"SG-2022-10-24":{"type":"public","name":"Deepavali"}, -"SG-2022-12-25":{"type":"public","name":"Christmas Day"}, -"SG-2022-12-26":{"type":"public","name":"Christmas Day (substitute day)"}, -"SG-2023-01-01":{"type":"public","name":"New Year's Day"}, -"SG-2023-01-02":{"type":"public","name":"New Year's Day (substitute day)"}, -"SG-2023-01-22":{"type":"public","name":"Chinese New Year"}, -"SG-2023-01-23":{"type":"public","name":"Chinese New Year"}, -"SG-2023-01-24":{"type":"public","name":"Chinese New Year (substitute day)"}, -"SG-2023-04-07":{"type":"public","name":"Good Friday"}, -"SG-2023-04-21":{"type":"public","name":"Hari Raya Puasa"}, -"SG-2023-05-01":{"type":"public","name":"Labour Day"}, -"SG-2023-05-05":{"type":"public","name":"Vesak Day"}, -"SG-2023-06-28":{"type":"public","name":"Hari Raya Haji"}, -"SG-2023-08-09":{"type":"public","name":"National Day"}, -"SG-2023-11-13":{"type":"public","name":"Deepavali"}, -"SG-2023-12-25":{"type":"public","name":"Christmas Day"}, -"SK-2021-01-01":{"type":"public","name":"Deň vzniku Slovenskej republiky"}, -"SK-2021-01-06":{"type":"public","name":"Zjavenie Pána"}, -"SK-2021-04-02":{"type":"public","name":"Veľkonočný piatok"}, -"SK-2021-04-04":{"type":"observance","name":"Veľká noc"}, -"SK-2021-04-05":{"type":"public","name":"Veľkonočný pondelok"}, -"SK-2021-05-01":{"type":"public","name":"Sviatok práce"}, -"SK-2021-05-08":{"type":"public","name":"Deň víťazstva nad fašizmom"}, -"SK-2021-05-09":{"type":"observance","name":"Mother's Day"}, -"SK-2021-07-05":{"type":"public","name":"Sviatok svätého Cyrila a Metoda"}, -"SK-2021-08-29":{"type":"public","name":"Výročie Slovenského národného povstania"}, -"SK-2021-09-01":{"type":"public","name":"Deň Ústavy"}, -"SK-2021-09-15":{"type":"public","name":"Sviatok Panny Márie Sedembolestnej"}, -"SK-2021-11-01":{"type":"public","name":"Sviatok všetkých svätých"}, -"SK-2021-11-17":{"type":"public","name":"Deň boja za slobodu a demokraciu"}, -"SK-2021-12-24":{"type":"public","name":"Štedrý deň"}, -"SK-2021-12-25":{"type":"public","name":"Prvý sviatok vianočný"}, -"SK-2021-12-26":{"type":"public","name":"Druhý sviatok vianočný"}, -"SK-2022-01-01":{"type":"public","name":"Deň vzniku Slovenskej republiky"}, -"SK-2022-01-06":{"type":"public","name":"Zjavenie Pána"}, -"SK-2022-04-15":{"type":"public","name":"Veľkonočný piatok"}, -"SK-2022-04-17":{"type":"observance","name":"Veľká noc"}, -"SK-2022-04-18":{"type":"public","name":"Veľkonočný pondelok"}, -"SK-2022-05-01":{"type":"public","name":"Sviatok práce"}, -"SK-2022-05-08":{"type":"public","name":"Deň víťazstva nad fašizmom"}, -"SK-2022-07-05":{"type":"public","name":"Sviatok svätého Cyrila a Metoda"}, -"SK-2022-08-29":{"type":"public","name":"Výročie Slovenského národného povstania"}, -"SK-2022-09-01":{"type":"public","name":"Deň Ústavy"}, -"SK-2022-09-15":{"type":"public","name":"Sviatok Panny Márie Sedembolestnej"}, -"SK-2022-11-01":{"type":"public","name":"Sviatok všetkých svätých"}, -"SK-2022-11-17":{"type":"public","name":"Deň boja za slobodu a demokraciu"}, -"SK-2022-12-24":{"type":"public","name":"Štedrý deň"}, -"SK-2022-12-25":{"type":"public","name":"Prvý sviatok vianočný"}, -"SK-2022-12-26":{"type":"public","name":"Druhý sviatok vianočný"}, -"SK-2023-01-01":{"type":"public","name":"Deň vzniku Slovenskej republiky"}, -"SK-2023-01-06":{"type":"public","name":"Zjavenie Pána"}, -"SK-2023-04-07":{"type":"public","name":"Veľkonočný piatok"}, -"SK-2023-04-09":{"type":"observance","name":"Veľká noc"}, -"SK-2023-04-10":{"type":"public","name":"Veľkonočný pondelok"}, -"SK-2023-05-01":{"type":"public","name":"Sviatok práce"}, -"SK-2023-05-08":{"type":"public","name":"Deň víťazstva nad fašizmom"}, -"SK-2023-05-14":{"type":"observance","name":"Mother's Day"}, -"SK-2023-07-05":{"type":"public","name":"Sviatok svätého Cyrila a Metoda"}, -"SK-2023-08-29":{"type":"public","name":"Výročie Slovenského národného povstania"}, -"SK-2023-09-01":{"type":"public","name":"Deň Ústavy"}, -"SK-2023-09-15":{"type":"public","name":"Sviatok Panny Márie Sedembolestnej"}, -"SK-2023-11-01":{"type":"public","name":"Sviatok všetkých svätých"}, -"SK-2023-11-17":{"type":"public","name":"Deň boja za slobodu a demokraciu"}, -"SK-2023-12-24":{"type":"public","name":"Štedrý deň"}, -"SK-2023-12-25":{"type":"public","name":"Prvý sviatok vianočný"}, -"SK-2023-12-26":{"type":"public","name":"Druhý sviatok vianočný"}, -"SI-2021-01-01":{"type":"public","name":"novo leto"}, -"SI-2021-01-02":{"type":"public","name":"novo leto"}, -"SI-2021-02-08":{"type":"public","name":"Prešernov dan"}, -"SI-2021-02-14":{"type":"observance","name":"pust"}, -"SI-2021-03-08":{"type":"observance","name":"Mednarodni dan žena"}, -"SI-2021-04-04":{"type":"public","name":"velika noč"}, -"SI-2021-04-05":{"type":"public","name":"Velikonočni ponedeljek"}, -"SI-2021-04-23":{"type":"observance","name":"jurjevanje"}, -"SI-2021-04-27":{"type":"public","name":"dan upora proti okupatorju"}, -"SI-2021-05-01":{"type":"public","name":"praznik dela"}, -"SI-2021-05-02":{"type":"public","name":"praznik dela"}, -"SI-2021-05-23":{"type":"public","name":"binkošti"}, -"SI-2021-06-08":{"type":"public","name":"dan Primoža Trubarja"}, -"SI-2021-06-25":{"type":"public","name":"dan državnosti"}, -"SI-2021-07-22":{"type":"observance","name":"dan vstaje"}, -"SI-2021-08-15":{"type":"public","name":"Marijino vnebovzetje"}, -"SI-2021-08-17":{"type":"observance","name":"združitev prekmurskih Slovencev z matičnim narodom"}, -"SI-2021-09-15":{"type":"observance","name":"vrnitev Primorske k matični domovini"}, -"SI-2021-10-25":{"type":"observance","name":"dan suverenosti"}, -"SI-2021-10-31":{"type":"public","name":"dan reformacije"}, -"SI-2021-11-01":{"type":"public","name":"dan spomina na mrtve or dan mrtvih"}, -"SI-2021-11-11":{"type":"observance","name":"martinovanje"}, -"SI-2021-11-23":{"type":"observance","name":"dan Rudolfa Maistra"}, -"SI-2021-12-06":{"type":"observance","name":"miklavž"}, -"SI-2021-12-25":{"type":"public","name":"božič"}, -"SI-2021-12-26":{"type":"public","name":"dan samostojnosti in enotnosti"}, -"SI-2022-01-01":{"type":"public","name":"novo leto"}, -"SI-2022-01-02":{"type":"public","name":"novo leto"}, -"SI-2022-02-08":{"type":"public","name":"Prešernov dan"}, -"SI-2022-02-27":{"type":"observance","name":"pust"}, -"SI-2022-03-08":{"type":"observance","name":"Mednarodni dan žena"}, -"SI-2022-04-17":{"type":"public","name":"velika noč"}, -"SI-2022-04-18":{"type":"public","name":"Velikonočni ponedeljek"}, -"SI-2022-04-23":{"type":"observance","name":"jurjevanje"}, -"SI-2022-04-27":{"type":"public","name":"dan upora proti okupatorju"}, -"SI-2022-05-01":{"type":"public","name":"praznik dela"}, -"SI-2022-05-02":{"type":"public","name":"praznik dela"}, -"SI-2022-06-05":{"type":"public","name":"binkošti"}, -"SI-2022-06-08":{"type":"public","name":"dan Primoža Trubarja"}, -"SI-2022-06-25":{"type":"public","name":"dan državnosti"}, -"SI-2022-07-22":{"type":"observance","name":"dan vstaje"}, -"SI-2022-08-15":{"type":"public","name":"Marijino vnebovzetje"}, -"SI-2022-08-17":{"type":"observance","name":"združitev prekmurskih Slovencev z matičnim narodom"}, -"SI-2022-09-15":{"type":"observance","name":"vrnitev Primorske k matični domovini"}, -"SI-2022-10-25":{"type":"observance","name":"dan suverenosti"}, -"SI-2022-10-31":{"type":"public","name":"dan reformacije"}, -"SI-2022-11-01":{"type":"public","name":"dan spomina na mrtve or dan mrtvih"}, -"SI-2022-11-11":{"type":"observance","name":"martinovanje"}, -"SI-2022-11-23":{"type":"observance","name":"dan Rudolfa Maistra"}, -"SI-2022-12-06":{"type":"observance","name":"miklavž"}, -"SI-2022-12-25":{"type":"public","name":"božič"}, -"SI-2022-12-26":{"type":"public","name":"dan samostojnosti in enotnosti"}, -"SI-2023-01-01":{"type":"public","name":"novo leto"}, -"SI-2023-01-02":{"type":"public","name":"novo leto"}, -"SI-2023-02-08":{"type":"public","name":"Prešernov dan"}, -"SI-2023-02-19":{"type":"observance","name":"pust"}, -"SI-2023-03-08":{"type":"observance","name":"Mednarodni dan žena"}, -"SI-2023-04-09":{"type":"public","name":"velika noč"}, -"SI-2023-04-10":{"type":"public","name":"Velikonočni ponedeljek"}, -"SI-2023-04-23":{"type":"observance","name":"jurjevanje"}, -"SI-2023-04-27":{"type":"public","name":"dan upora proti okupatorju"}, -"SI-2023-05-01":{"type":"public","name":"praznik dela"}, -"SI-2023-05-02":{"type":"public","name":"praznik dela"}, -"SI-2023-05-28":{"type":"public","name":"binkošti"}, -"SI-2023-06-08":{"type":"public","name":"dan Primoža Trubarja"}, -"SI-2023-06-25":{"type":"public","name":"dan državnosti"}, -"SI-2023-07-22":{"type":"observance","name":"dan vstaje"}, -"SI-2023-08-15":{"type":"public","name":"Marijino vnebovzetje"}, -"SI-2023-08-17":{"type":"observance","name":"združitev prekmurskih Slovencev z matičnim narodom"}, -"SI-2023-09-15":{"type":"observance","name":"vrnitev Primorske k matični domovini"}, -"SI-2023-10-25":{"type":"observance","name":"dan suverenosti"}, -"SI-2023-10-31":{"type":"public","name":"dan reformacije"}, -"SI-2023-11-01":{"type":"public","name":"dan spomina na mrtve or dan mrtvih"}, -"SI-2023-11-11":{"type":"observance","name":"martinovanje"}, -"SI-2023-11-23":{"type":"observance","name":"dan Rudolfa Maistra"}, -"SI-2023-12-06":{"type":"observance","name":"miklavž"}, -"SI-2023-12-25":{"type":"public","name":"božič"}, -"SI-2023-12-26":{"type":"public","name":"dan samostojnosti in enotnosti"}, -"ES-2021-01-01":{"type":"public","name":"Año Nuevo"}, -"ES-2021-01-06":{"type":"public","name":"Día de los Reyes Magos"}, -"ES-2021-03-19":{"type":"observance","name":"San José"}, -"ES-2021-04-01":{"type":"observance","name":"Jueves Santo"}, -"ES-2021-04-02":{"type":"public","name":"Viernes Santo"}, -"ES-2021-04-04":{"type":"observance","name":"Pascua"}, -"ES-2021-05-01":{"type":"public","name":"Fiesta del trabajo"}, -"ES-2021-05-02":{"type":"observance","name":"Día de la Madre"}, -"ES-2021-05-23":{"type":"observance","name":"Pentecostés"}, -"ES-2021-07-25":{"type":"observance","name":"Santiago Apostol"}, -"ES-2021-08-15":{"type":"public","name":"Asunción"}, -"ES-2021-08-16":{"type":"observance","name":"Asunción (día sustituto)"}, -"ES-2021-10-12":{"type":"public","name":"Fiesta Nacional de España"}, -"ES-2021-11-01":{"type":"public","name":"Todos los Santos"}, -"ES-2021-12-06":{"type":"public","name":"Día de la Constitución Española"}, -"ES-2021-12-08":{"type":"public","name":"La inmaculada concepción"}, -"ES-2021-12-25":{"type":"public","name":"Navidad"}, -"ES-2022-01-01":{"type":"public","name":"Año Nuevo"}, -"ES-2022-01-06":{"type":"public","name":"Día de los Reyes Magos"}, -"ES-2022-03-19":{"type":"observance","name":"San José"}, -"ES-2022-04-14":{"type":"observance","name":"Jueves Santo"}, -"ES-2022-04-15":{"type":"public","name":"Viernes Santo"}, -"ES-2022-04-17":{"type":"observance","name":"Pascua"}, -"ES-2022-05-01":{"type":"public","name":"Fiesta del trabajo"}, -"ES-2022-05-02":{"type":"observance","name":"Fiesta del trabajo (día sustituto)"}, -"ES-2022-06-05":{"type":"observance","name":"Pentecostés"}, -"ES-2022-07-25":{"type":"observance","name":"Santiago Apostol"}, -"ES-2022-08-15":{"type":"public","name":"Asunción"}, -"ES-2022-10-12":{"type":"public","name":"Fiesta Nacional de España"}, -"ES-2022-11-01":{"type":"public","name":"Todos los Santos"}, -"ES-2022-12-06":{"type":"public","name":"Día de la Constitución Española"}, -"ES-2022-12-08":{"type":"public","name":"La inmaculada concepción"}, -"ES-2022-12-25":{"type":"public","name":"Navidad"}, -"ES-2022-12-26":{"type":"observance","name":"Navidad (día sustituto)"}, -"ES-2023-01-01":{"type":"public","name":"Año Nuevo"}, -"ES-2023-01-02":{"type":"observance","name":"Año Nuevo (día sustituto)"}, -"ES-2023-01-06":{"type":"public","name":"Día de los Reyes Magos"}, -"ES-2023-03-19":{"type":"observance","name":"San José"}, -"ES-2023-04-06":{"type":"observance","name":"Jueves Santo"}, -"ES-2023-04-07":{"type":"public","name":"Viernes Santo"}, -"ES-2023-04-09":{"type":"observance","name":"Pascua"}, -"ES-2023-05-01":{"type":"public","name":"Fiesta del trabajo"}, -"ES-2023-05-07":{"type":"observance","name":"Día de la Madre"}, -"ES-2023-05-28":{"type":"observance","name":"Pentecostés"}, -"ES-2023-07-25":{"type":"observance","name":"Santiago Apostol"}, -"ES-2023-08-15":{"type":"public","name":"Asunción"}, -"ES-2023-10-12":{"type":"public","name":"Fiesta Nacional de España"}, -"ES-2023-11-01":{"type":"public","name":"Todos los Santos"}, -"ES-2023-12-06":{"type":"public","name":"Día de la Constitución Española"}, -"ES-2023-12-08":{"type":"public","name":"La inmaculada concepción"}, -"ES-2023-12-25":{"type":"public","name":"Navidad"}, -"SE-2021-01-01":{"type":"public","name":"Nyårsdagen"}, -"SE-2021-01-05":{"type":"public","name":"Trettondagsafton"}, -"SE-2021-01-06":{"type":"public","name":"Trettondedag jul"}, -"SE-2021-01-13":{"type":"observance","name":"Tjugondag Knut"}, -"SE-2021-03-07":{"type":"observance","name":"Vasaloppet"}, -"SE-2021-03-25":{"type":"observance","name":"Marie Bebådelsedag"}, -"SE-2021-04-01":{"type":"observance","name":"Skärtorsdagen"}, -"SE-2021-04-02":{"type":"public","name":"Långfredagen"}, -"SE-2021-04-03":{"type":"public","name":"Påskafton"}, -"SE-2021-04-04":{"type":"observance","name":"Påskdagen"}, -"SE-2021-04-05":{"type":"public","name":"Annandag påsk"}, -"SE-2021-04-30":{"type":"observance","name":"Valborgsmässoafton"}, -"SE-2021-05-01":{"type":"public","name":"Första Maj"}, -"SE-2021-05-13":{"type":"public","name":"Kristi himmelfärds dag"}, -"SE-2021-05-22":{"type":"public","name":"Pingstafton"}, -"SE-2021-05-23":{"type":"public","name":"Pingstdagen"}, -"SE-2021-05-24":{"type":"observance","name":"Annandag pingst"}, -"SE-2021-05-30":{"type":"observance","name":"Mors dag"}, -"SE-2021-06-06":{"type":"public","name":"Sveriges nationaldag"}, -"SE-2021-06-25":{"type":"bank","name":"Midsommarafton"}, -"SE-2021-06-26":{"type":"public","name":"Midsommardagen"}, -"SE-2021-11-05":{"type":"observance","name":"Allhelgonaafton"}, -"SE-2021-11-06":{"type":"public","name":"Alla Helgons dag"}, -"SE-2021-11-11":{"type":"observance","name":"Mårtensgås"}, -"SE-2021-12-10":{"type":"observance","name":"Nobeldagen"}, -"SE-2021-12-13":{"type":"observance","name":"Luciadagen"}, -"SE-2021-12-24":{"type":"bank","name":"Julafton"}, -"SE-2021-12-25":{"type":"public","name":"Juldagen"}, -"SE-2021-12-26":{"type":"public","name":"Annandag jul"}, -"SE-2021-12-31":{"type":"bank","name":"Nyårsafton"}, -"SE-2022-01-01":{"type":"public","name":"Nyårsdagen"}, -"SE-2022-01-05":{"type":"public","name":"Trettondagsafton"}, -"SE-2022-01-06":{"type":"public","name":"Trettondedag jul"}, -"SE-2022-01-13":{"type":"observance","name":"Tjugondag Knut"}, -"SE-2022-03-06":{"type":"observance","name":"Vasaloppet"}, -"SE-2022-03-25":{"type":"observance","name":"Marie Bebådelsedag"}, -"SE-2022-04-14":{"type":"observance","name":"Skärtorsdagen"}, -"SE-2022-04-15":{"type":"public","name":"Långfredagen"}, -"SE-2022-04-16":{"type":"public","name":"Påskafton"}, -"SE-2022-04-17":{"type":"observance","name":"Påskdagen"}, -"SE-2022-04-18":{"type":"public","name":"Annandag påsk"}, -"SE-2022-04-30":{"type":"observance","name":"Valborgsmässoafton"}, -"SE-2022-05-01":{"type":"public","name":"Första Maj"}, -"SE-2022-05-26":{"type":"public","name":"Kristi himmelfärds dag"}, -"SE-2022-05-29":{"type":"observance","name":"Mors dag"}, -"SE-2022-06-04":{"type":"public","name":"Pingstafton"}, -"SE-2022-06-05":{"type":"public","name":"Pingstdagen"}, -"SE-2022-06-06":{"type":"public","name":"Sveriges nationaldag"}, -"SE-2022-06-24":{"type":"bank","name":"Midsommarafton"}, -"SE-2022-06-25":{"type":"public","name":"Midsommardagen"}, -"SE-2022-11-04":{"type":"observance","name":"Allhelgonaafton"}, -"SE-2022-11-05":{"type":"public","name":"Alla Helgons dag"}, -"SE-2022-11-06":{"type":"observance","name":"Gustav-Adolf-dagen"}, -"SE-2022-11-11":{"type":"observance","name":"Mårtensgås"}, -"SE-2022-12-10":{"type":"observance","name":"Nobeldagen"}, -"SE-2022-12-13":{"type":"observance","name":"Luciadagen"}, -"SE-2022-12-24":{"type":"bank","name":"Julafton"}, -"SE-2022-12-25":{"type":"public","name":"Juldagen"}, -"SE-2022-12-26":{"type":"public","name":"Annandag jul"}, -"SE-2022-12-31":{"type":"bank","name":"Nyårsafton"}, -"SE-2023-01-01":{"type":"public","name":"Nyårsdagen"}, -"SE-2023-01-05":{"type":"public","name":"Trettondagsafton"}, -"SE-2023-01-06":{"type":"public","name":"Trettondedag jul"}, -"SE-2023-01-13":{"type":"observance","name":"Tjugondag Knut"}, -"SE-2023-03-05":{"type":"observance","name":"Vasaloppet"}, -"SE-2023-03-25":{"type":"observance","name":"Marie Bebådelsedag"}, -"SE-2023-04-06":{"type":"observance","name":"Skärtorsdagen"}, -"SE-2023-04-07":{"type":"public","name":"Långfredagen"}, -"SE-2023-04-08":{"type":"public","name":"Påskafton"}, -"SE-2023-04-09":{"type":"observance","name":"Påskdagen"}, -"SE-2023-04-10":{"type":"public","name":"Annandag påsk"}, -"SE-2023-04-30":{"type":"observance","name":"Valborgsmässoafton"}, -"SE-2023-05-01":{"type":"public","name":"Första Maj"}, -"SE-2023-05-18":{"type":"public","name":"Kristi himmelfärds dag"}, -"SE-2023-05-27":{"type":"public","name":"Pingstafton"}, -"SE-2023-05-28":{"type":"public","name":"Pingstdagen"}, -"SE-2023-05-29":{"type":"observance","name":"Annandag pingst"}, -"SE-2023-06-06":{"type":"public","name":"Sveriges nationaldag"}, -"SE-2023-06-23":{"type":"bank","name":"Midsommarafton"}, -"SE-2023-06-24":{"type":"public","name":"Midsommardagen"}, -"SE-2023-11-03":{"type":"observance","name":"Allhelgonaafton"}, -"SE-2023-11-04":{"type":"public","name":"Alla Helgons dag"}, -"SE-2023-11-06":{"type":"observance","name":"Gustav-Adolf-dagen"}, -"SE-2023-11-11":{"type":"observance","name":"Mårtensgås"}, -"SE-2023-12-10":{"type":"observance","name":"Nobeldagen"}, -"SE-2023-12-13":{"type":"observance","name":"Luciadagen"}, -"SE-2023-12-24":{"type":"bank","name":"Julafton"}, -"SE-2023-12-25":{"type":"public","name":"Juldagen"}, -"SE-2023-12-26":{"type":"public","name":"Annandag jul"}, -"SE-2023-12-31":{"type":"bank","name":"Nyårsafton"}, -"CH-2021-01-01":{"type":"public","name":"Neujahr"}, -"CH-2021-04-02":{"type":"public","name":"Karfreitag"}, -"CH-2021-04-04":{"type":"public","name":"Ostersonntag"}, -"CH-2021-04-05":{"type":"public","name":"Ostermontag"}, -"CH-2021-05-09":{"type":"observance","name":"Muttertag"}, -"CH-2021-05-13":{"type":"public","name":"Auffahrt"}, -"CH-2021-05-23":{"type":"public","name":"Pfingstsonntag"}, -"CH-2021-05-24":{"type":"public","name":"Pfingstmontag"}, -"CH-2021-06-06":{"type":"observance","name":"Vätertag"}, -"CH-2021-08-01":{"type":"public","name":"Bundesfeiertag"}, -"CH-2021-09-19":{"type":"public","name":"Eidg. Dank-, Buss- und Bettag"}, -"CH-2021-12-25":{"type":"public","name":"Weihnachtstag"}, -"CH-2021-12-26":{"type":"public","name":"Stephanstag"}, -"CH-2022-01-01":{"type":"public","name":"Neujahr"}, -"CH-2022-04-15":{"type":"public","name":"Karfreitag"}, -"CH-2022-04-17":{"type":"public","name":"Ostersonntag"}, -"CH-2022-04-18":{"type":"public","name":"Ostermontag"}, -"CH-2022-05-08":{"type":"observance","name":"Muttertag"}, -"CH-2022-05-26":{"type":"public","name":"Auffahrt"}, -"CH-2022-06-05":{"type":"public","name":"Pfingstsonntag"}, -"CH-2022-06-06":{"type":"public","name":"Pfingstmontag"}, -"CH-2022-08-01":{"type":"public","name":"Bundesfeiertag"}, -"CH-2022-09-18":{"type":"public","name":"Eidg. Dank-, Buss- und Bettag"}, -"CH-2022-12-25":{"type":"public","name":"Weihnachtstag"}, -"CH-2022-12-26":{"type":"public","name":"Stephanstag"}, -"CH-2023-01-01":{"type":"public","name":"Neujahr"}, -"CH-2023-04-07":{"type":"public","name":"Karfreitag"}, -"CH-2023-04-09":{"type":"public","name":"Ostersonntag"}, -"CH-2023-04-10":{"type":"public","name":"Ostermontag"}, -"CH-2023-05-14":{"type":"observance","name":"Muttertag"}, -"CH-2023-05-18":{"type":"public","name":"Auffahrt"}, -"CH-2023-05-28":{"type":"public","name":"Pfingstsonntag"}, -"CH-2023-05-29":{"type":"public","name":"Pfingstmontag"}, -"CH-2023-06-04":{"type":"observance","name":"Vätertag"}, -"CH-2023-08-01":{"type":"public","name":"Bundesfeiertag"}, -"CH-2023-09-17":{"type":"public","name":"Eidg. Dank-, Buss- und Bettag"}, -"CH-2023-12-25":{"type":"public","name":"Weihnachtstag"}, -"CH-2023-12-26":{"type":"public","name":"Stephanstag"}, -"GB-2021-01-01":{"type":"public","name":"New Year's Day"}, -"GB-2021-03-14":{"type":"observance","name":"Mother's Day"}, -"GB-2021-04-02":{"type":"public","name":"Good Friday"}, -"GB-2021-04-04":{"type":"public","name":"Easter Sunday"}, -"GB-2021-04-05":{"type":"public","name":"Easter Monday"}, -"GB-2021-05-03":{"type":"public","name":"Early May bank holiday"}, -"GB-2021-05-31":{"type":"public","name":"Spring bank holiday"}, -"GB-2021-12-25":{"type":"public","name":"Christmas Day"}, -"GB-2021-12-26":{"type":"public","name":"Boxing Day"}, -"GB-2021-12-27":{"type":"public","name":"Christmas Day (substitute day)"}, -"GB-2021-12-28":{"type":"public","name":"Boxing Day (substitute day)"}, -"GB-2022-01-01":{"type":"public","name":"New Year's Day"}, -"GB-2022-01-03":{"type":"public","name":"New Year's Day (substitute day)"}, -"GB-2022-03-27":{"type":"observance","name":"Mother's Day"}, -"GB-2022-04-15":{"type":"public","name":"Good Friday"}, -"GB-2022-04-17":{"type":"public","name":"Easter Sunday"}, -"GB-2022-04-18":{"type":"public","name":"Easter Monday"}, -"GB-2022-05-02":{"type":"public","name":"Early May bank holiday"}, -"GB-2022-06-02":{"type":"public","name":"Queen’s Platinum Jubilee"}, -"GB-2022-06-03":{"type":"public","name":"Queen’s Platinum Jubilee"}, -"GB-2022-12-25":{"type":"public","name":"Christmas Day"}, -"GB-2022-12-26":{"type":"public","name":"Boxing Day"}, -"GB-2022-12-27":{"type":"public","name":"Christmas Day (substitute day)"}, -"GB-2023-01-01":{"type":"public","name":"New Year's Day"}, -"GB-2023-01-02":{"type":"public","name":"New Year's Day (substitute day)"}, -"GB-2023-03-19":{"type":"observance","name":"Mother's Day"}, -"GB-2023-04-07":{"type":"public","name":"Good Friday"}, -"GB-2023-04-09":{"type":"public","name":"Easter Sunday"}, -"GB-2023-04-10":{"type":"public","name":"Easter Monday"}, -"GB-2023-05-01":{"type":"public","name":"Early May bank holiday"}, -"GB-2023-05-29":{"type":"public","name":"Spring bank holiday"}, -"GB-2023-12-25":{"type":"public","name":"Christmas Day"}, -"GB-2023-12-26":{"type":"public","name":"Boxing Day"}, -}; -module.exports = holidays_list; diff --git a/lib/moment-timezone-with-data.js b/lib/moment-timezone-with-data.js deleted file mode 100644 index 1592f07..0000000 --- a/lib/moment-timezone-with-data.js +++ /dev/null @@ -1,1545 +0,0 @@ -//! moment-timezone.js -//! version : 0.5.33 -//! Copyright (c) JS Foundation and other contributors -//! license : MIT -//! github.com/moment/moment-timezone - -(function (root, factory) { - "use strict"; - - /*global define*/ - if (typeof module === 'object' && module.exports) { - module.exports = factory(require('./moment.min')); // Node - } else if (typeof define === 'function' && define.amd) { - define(['moment'], factory); // AMD - } else { - factory(root.moment); // Browser - } -}(this, function (moment) { - "use strict"; - - // Resolves es6 module loading issue - if (moment.version === undefined && moment.default) { - moment = moment.default; - } - - // Do not load moment-timezone a second time. - // if (moment.tz !== undefined) { - // logError('Moment Timezone ' + moment.tz.version + ' was already loaded ' + (moment.tz.dataVersion ? 'with data from ' : 'without any data') + moment.tz.dataVersion); - // return moment; - // } - - var VERSION = "0.5.33", - zones = {}, - links = {}, - countries = {}, - names = {}, - guesses = {}, - cachedGuess; - - if (!moment || typeof moment.version !== 'string') { - logError('Moment Timezone requires Moment.js. See https://momentjs.com/timezone/docs/#/use-it/browser/'); - } - - var momentVersion = moment.version.split('.'), - major = +momentVersion[0], - minor = +momentVersion[1]; - - // Moment.js version check - if (major < 2 || (major === 2 && minor < 6)) { - logError('Moment Timezone requires Moment.js >= 2.6.0. You are using Moment.js ' + moment.version + '. See momentjs.com'); - } - - /************************************ - Unpacking - ************************************/ - - function charCodeToInt(charCode) { - if (charCode > 96) { - return charCode - 87; - } else if (charCode > 64) { - return charCode - 29; - } - return charCode - 48; - } - - function unpackBase60(string) { - var i = 0, - parts = string.split('.'), - whole = parts[0], - fractional = parts[1] || '', - multiplier = 1, - num, - out = 0, - sign = 1; - - // handle negative numbers - if (string.charCodeAt(0) === 45) { - i = 1; - sign = -1; - } - - // handle digits before the decimal - for (i; i < whole.length; i++) { - num = charCodeToInt(whole.charCodeAt(i)); - out = 60 * out + num; - } - - // handle digits after the decimal - for (i = 0; i < fractional.length; i++) { - multiplier = multiplier / 60; - num = charCodeToInt(fractional.charCodeAt(i)); - out += num * multiplier; - } - - return out * sign; - } - - function arrayToInt (array) { - for (var i = 0; i < array.length; i++) { - array[i] = unpackBase60(array[i]); - } - } - - function intToUntil (array, length) { - for (var i = 0; i < length; i++) { - array[i] = Math.round((array[i - 1] || 0) + (array[i] * 60000)); // minutes to milliseconds - } - - array[length - 1] = Infinity; - } - - function mapIndices (source, indices) { - var out = [], i; - - for (i = 0; i < indices.length; i++) { - out[i] = source[indices[i]]; - } - - return out; - } - - function unpack (string) { - var data = string.split('|'), - offsets = data[2].split(' '), - indices = data[3].split(''), - untils = data[4].split(' '); - - arrayToInt(offsets); - arrayToInt(indices); - arrayToInt(untils); - - intToUntil(untils, indices.length); - - return { - name : data[0], - abbrs : mapIndices(data[1].split(' '), indices), - offsets : mapIndices(offsets, indices), - untils : untils, - population : data[5] | 0 - }; - } - - /************************************ - Zone object - ************************************/ - - function Zone (packedString) { - if (packedString) { - this._set(unpack(packedString)); - } - } - - Zone.prototype = { - _set : function (unpacked) { - this.name = unpacked.name; - this.abbrs = unpacked.abbrs; - this.untils = unpacked.untils; - this.offsets = unpacked.offsets; - this.population = unpacked.population; - }, - - _index : function (timestamp) { - var target = +timestamp, - untils = this.untils, - i; - - for (i = 0; i < untils.length; i++) { - if (target < untils[i]) { - return i; - } - } - }, - - countries : function () { - var zone_name = this.name; - return Object.keys(countries).filter(function (country_code) { - return countries[country_code].zones.indexOf(zone_name) !== -1; - }); - }, - - parse : function (timestamp) { - var target = +timestamp, - offsets = this.offsets, - untils = this.untils, - max = untils.length - 1, - offset, offsetNext, offsetPrev, i; - - for (i = 0; i < max; i++) { - offset = offsets[i]; - offsetNext = offsets[i + 1]; - offsetPrev = offsets[i ? i - 1 : i]; - - if (offset < offsetNext && tz.moveAmbiguousForward) { - offset = offsetNext; - } else if (offset > offsetPrev && tz.moveInvalidForward) { - offset = offsetPrev; - } - - if (target < untils[i] - (offset * 60000)) { - return offsets[i]; - } - } - - return offsets[max]; - }, - - abbr : function (mom) { - return this.abbrs[this._index(mom)]; - }, - - offset : function (mom) { - logError("zone.offset has been deprecated in favor of zone.utcOffset"); - return this.offsets[this._index(mom)]; - }, - - utcOffset : function (mom) { - return this.offsets[this._index(mom)]; - } - }; - - /************************************ - Country object - ************************************/ - - function Country (country_name, zone_names) { - this.name = country_name; - this.zones = zone_names; - } - - /************************************ - Current Timezone - ************************************/ - - function OffsetAt(at) { - var timeString = at.toTimeString(); - var abbr = timeString.match(/\([a-z ]+\)/i); - if (abbr && abbr[0]) { - // 17:56:31 GMT-0600 (CST) - // 17:56:31 GMT-0600 (Central Standard Time) - abbr = abbr[0].match(/[A-Z]/g); - abbr = abbr ? abbr.join('') : undefined; - } else { - // 17:56:31 CST - // 17:56:31 GMT+0800 (台北標準時間) - abbr = timeString.match(/[A-Z]{3,5}/g); - abbr = abbr ? abbr[0] : undefined; - } - - if (abbr === 'GMT') { - abbr = undefined; - } - - this.at = +at; - this.abbr = abbr; - this.offset = at.getTimezoneOffset(); - } - - function ZoneScore(zone) { - this.zone = zone; - this.offsetScore = 0; - this.abbrScore = 0; - } - - ZoneScore.prototype.scoreOffsetAt = function (offsetAt) { - this.offsetScore += Math.abs(this.zone.utcOffset(offsetAt.at) - offsetAt.offset); - if (this.zone.abbr(offsetAt.at).replace(/[^A-Z]/g, '') !== offsetAt.abbr) { - this.abbrScore++; - } - }; - - function findChange(low, high) { - var mid, diff; - - while ((diff = ((high.at - low.at) / 12e4 | 0) * 6e4)) { - mid = new OffsetAt(new Date(low.at + diff)); - if (mid.offset === low.offset) { - low = mid; - } else { - high = mid; - } - } - - return low; - } - - function userOffsets() { - var startYear = new Date().getFullYear() - 2, - last = new OffsetAt(new Date(startYear, 0, 1)), - offsets = [last], - change, next, i; - - for (i = 1; i < 48; i++) { - next = new OffsetAt(new Date(startYear, i, 1)); - if (next.offset !== last.offset) { - change = findChange(last, next); - offsets.push(change); - offsets.push(new OffsetAt(new Date(change.at + 6e4))); - } - last = next; - } - - for (i = 0; i < 4; i++) { - offsets.push(new OffsetAt(new Date(startYear + i, 0, 1))); - offsets.push(new OffsetAt(new Date(startYear + i, 6, 1))); - } - - return offsets; - } - - function sortZoneScores (a, b) { - if (a.offsetScore !== b.offsetScore) { - return a.offsetScore - b.offsetScore; - } - if (a.abbrScore !== b.abbrScore) { - return a.abbrScore - b.abbrScore; - } - if (a.zone.population !== b.zone.population) { - return b.zone.population - a.zone.population; - } - return b.zone.name.localeCompare(a.zone.name); - } - - function addToGuesses (name, offsets) { - var i, offset; - arrayToInt(offsets); - for (i = 0; i < offsets.length; i++) { - offset = offsets[i]; - guesses[offset] = guesses[offset] || {}; - guesses[offset][name] = true; - } - } - - function guessesForUserOffsets (offsets) { - var offsetsLength = offsets.length, - filteredGuesses = {}, - out = [], - i, j, guessesOffset; - - for (i = 0; i < offsetsLength; i++) { - guessesOffset = guesses[offsets[i].offset] || {}; - for (j in guessesOffset) { - if (guessesOffset.hasOwnProperty(j)) { - filteredGuesses[j] = true; - } - } - } - - for (i in filteredGuesses) { - if (filteredGuesses.hasOwnProperty(i)) { - out.push(names[i]); - } - } - - return out; - } - - function rebuildGuess () { - - // use Intl API when available and returning valid time zone - try { - var intlName = Intl.DateTimeFormat().resolvedOptions().timeZone; - if (intlName && intlName.length > 3) { - var name = names[normalizeName(intlName)]; - if (name) { - return name; - } - logError("Moment Timezone found " + intlName + " from the Intl api, but did not have that data loaded."); - } - } catch (e) { - // Intl unavailable, fall back to manual guessing. - } - - var offsets = userOffsets(), - offsetsLength = offsets.length, - guesses = guessesForUserOffsets(offsets), - zoneScores = [], - zoneScore, i, j; - - for (i = 0; i < guesses.length; i++) { - zoneScore = new ZoneScore(getZone(guesses[i]), offsetsLength); - for (j = 0; j < offsetsLength; j++) { - zoneScore.scoreOffsetAt(offsets[j]); - } - zoneScores.push(zoneScore); - } - - zoneScores.sort(sortZoneScores); - - return zoneScores.length > 0 ? zoneScores[0].zone.name : undefined; - } - - function guess (ignoreCache) { - if (!cachedGuess || ignoreCache) { - cachedGuess = rebuildGuess(); - } - return cachedGuess; - } - - /************************************ - Global Methods - ************************************/ - - function normalizeName (name) { - return (name || '').toLowerCase().replace(/\//g, '_'); - } - - function addZone (packed) { - var i, name, split, normalized; - - if (typeof packed === "string") { - packed = [packed]; - } - - for (i = 0; i < packed.length; i++) { - split = packed[i].split('|'); - name = split[0]; - normalized = normalizeName(name); - zones[normalized] = packed[i]; - names[normalized] = name; - addToGuesses(normalized, split[2].split(' ')); - } - } - - function getZone (name, caller) { - - name = normalizeName(name); - - var zone = zones[name]; - var link; - - if (zone instanceof Zone) { - return zone; - } - - if (typeof zone === 'string') { - zone = new Zone(zone); - zones[name] = zone; - return zone; - } - - // Pass getZone to prevent recursion more than 1 level deep - if (links[name] && caller !== getZone && (link = getZone(links[name], getZone))) { - zone = zones[name] = new Zone(); - zone._set(link); - zone.name = names[name]; - return zone; - } - - return null; - } - - function getNames () { - var i, out = []; - - for (i in names) { - if (names.hasOwnProperty(i) && (zones[i] || zones[links[i]]) && names[i]) { - out.push(names[i]); - } - } - - return out.sort(); - } - - function getCountryNames () { - return Object.keys(countries); - } - - function addLink (aliases) { - var i, alias, normal0, normal1; - - if (typeof aliases === "string") { - aliases = [aliases]; - } - - for (i = 0; i < aliases.length; i++) { - alias = aliases[i].split('|'); - - normal0 = normalizeName(alias[0]); - normal1 = normalizeName(alias[1]); - - links[normal0] = normal1; - names[normal0] = alias[0]; - - links[normal1] = normal0; - names[normal1] = alias[1]; - } - } - - function addCountries (data) { - var i, country_code, country_zones, split; - if (!data || !data.length) return; - for (i = 0; i < data.length; i++) { - split = data[i].split('|'); - country_code = split[0].toUpperCase(); - country_zones = split[1].split(' '); - countries[country_code] = new Country( - country_code, - country_zones - ); - } - } - - function getCountry (name) { - name = name.toUpperCase(); - return countries[name] || null; - } - - function zonesForCountry(country, with_offset) { - country = getCountry(country); - - if (!country) return null; - - var zones = country.zones.sort(); - - if (with_offset) { - return zones.map(function (zone_name) { - var zone = getZone(zone_name); - return { - name: zone_name, - offset: zone.utcOffset(new Date()) - }; - }); - } - - return zones; - } - - function loadData (data) { - addZone(data.zones); - addLink(data.links); - addCountries(data.countries); - tz.dataVersion = data.version; - } - - function zoneExists (name) { - if (!zoneExists.didShowError) { - zoneExists.didShowError = true; - logError("moment.tz.zoneExists('" + name + "') has been deprecated in favor of !moment.tz.zone('" + name + "')"); - } - return !!getZone(name); - } - - function needsOffset (m) { - var isUnixTimestamp = (m._f === 'X' || m._f === 'x'); - return !!(m._a && (m._tzm === undefined) && !isUnixTimestamp); - } - - function logError (message) { - if (typeof console !== 'undefined' && typeof console.error === 'function') { - console.error(message); - } - } - - /************************************ - moment.tz namespace - ************************************/ - - function tz (input) { - var args = Array.prototype.slice.call(arguments, 0, -1), - name = arguments[arguments.length - 1], - zone = getZone(name), - out = moment.utc.apply(null, args); - - if (zone && !moment.isMoment(input) && needsOffset(out)) { - out.add(zone.parse(out), 'minutes'); - } - - out.tz(name); - - return out; - } - - tz.version = VERSION; - tz.dataVersion = ''; - tz._zones = zones; - tz._links = links; - tz._names = names; - tz._countries = countries; - tz.add = addZone; - tz.link = addLink; - tz.load = loadData; - tz.zone = getZone; - tz.zoneExists = zoneExists; // deprecated in 0.1.0 - tz.guess = guess; - tz.names = getNames; - tz.Zone = Zone; - tz.unpack = unpack; - tz.unpackBase60 = unpackBase60; - tz.needsOffset = needsOffset; - tz.moveInvalidForward = true; - tz.moveAmbiguousForward = false; - tz.countries = getCountryNames; - tz.zonesForCountry = zonesForCountry; - - /************************************ - Interface with Moment.js - ************************************/ - - var fn = moment.fn; - - moment.tz = tz; - - moment.defaultZone = null; - - moment.updateOffset = function (mom, keepTime) { - var zone = moment.defaultZone, - offset; - - if (mom._z === undefined) { - if (zone && needsOffset(mom) && !mom._isUTC) { - mom._d = moment.utc(mom._a)._d; - mom.utc().add(zone.parse(mom), 'minutes'); - } - mom._z = zone; - } - if (mom._z) { - offset = mom._z.utcOffset(mom); - if (Math.abs(offset) < 16) { - offset = offset / 60; - } - if (mom.utcOffset !== undefined) { - var z = mom._z; - mom.utcOffset(-offset, keepTime); - mom._z = z; - } else { - mom.zone(offset, keepTime); - } - } - }; - - fn.tz = function (name, keepTime) { - if (name) { - if (typeof name !== 'string') { - throw new Error('Time zone name must be a string, got ' + name + ' [' + typeof name + ']'); - } - this._z = getZone(name); - if (this._z) { - moment.updateOffset(this, keepTime); - } else { - logError("Moment Timezone has no data for " + name + ". See http://momentjs.com/timezone/docs/#/data-loading/."); - } - return this; - } - if (this._z) { return this._z.name; } - }; - - function abbrWrap (old) { - return function () { - if (this._z) { return this._z.abbr(this); } - return old.call(this); - }; - } - - function resetZoneWrap (old) { - return function () { - this._z = null; - return old.apply(this, arguments); - }; - } - - function resetZoneWrap2 (old) { - return function () { - if (arguments.length > 0) this._z = null; - return old.apply(this, arguments); - }; - } - - fn.zoneName = abbrWrap(fn.zoneName); - fn.zoneAbbr = abbrWrap(fn.zoneAbbr); - fn.utc = resetZoneWrap(fn.utc); - fn.local = resetZoneWrap(fn.local); - fn.utcOffset = resetZoneWrap2(fn.utcOffset); - - moment.tz.setDefault = function(name) { - if (major < 2 || (major === 2 && minor < 9)) { - logError('Moment Timezone setDefault() requires Moment.js >= 2.9.0. You are using Moment.js ' + moment.version + '.'); - } - moment.defaultZone = name ? getZone(name) : null; - return moment; - }; - - // Cloning a moment should include the _z property. - var momentProperties = moment.momentProperties; - if (Object.prototype.toString.call(momentProperties) === '[object Array]') { - // moment 2.8.1+ - momentProperties.push('_z'); - momentProperties.push('_a'); - } else if (momentProperties) { - // moment 2.7.0 - momentProperties._z = null; - } - - loadData({ - "version": "2021a", - "zones": [ - "Africa/Abidjan|LMT GMT|g.8 0|01|-2ldXH.Q|48e5", - "Africa/Accra|LMT GMT +0020 +0030|.Q 0 -k -u|01212121212121212121212121212121212121212121212131313131313131|-2bRzX.8 9RbX.8 fdE 1BAk MLE 1Bck MLE 1Bck MLE 1Bck MLE 1BAk MLE 1Bck MLE 1Bck MLE 1Bck MLE 1BAk MLE 1Bck MLE 1Bck MLE 1Bck MLE 1BAk MLE 1Bck MLE 1Bck MLE 1Bck MLE 1BAk MLE 1Bck MLE 1Bck MLE 1Bck MLE Mok 1BXE M0k 1BXE fak 9vbu bjCu MLu 1Bcu MLu 1BAu MLu 1Bcu MLu 1Bcu MLu 1Bcu MLu|41e5", - "Africa/Nairobi|LMT +0230 EAT +0245|-2r.g -2u -30 -2J|012132|-2ua2r.g N6nV.g 3Fbu h1cu dzbJ|47e5", - "Africa/Algiers|PMT WET WEST CET CEST|-9.l 0 -10 -10 -20|0121212121212121343431312123431213|-2nco9.l cNb9.l HA0 19A0 1iM0 11c0 1oo0 Wo0 1rc0 QM0 1EM0 UM0 DA0 Imo0 rd0 De0 9Xz0 1fb0 1ap0 16K0 2yo0 mEp0 hwL0 jxA0 11A0 dDd0 17b0 11B0 1cN0 2Dy0 1cN0 1fB0 1cL0|26e5", - "Africa/Lagos|LMT GMT +0030 WAT|-d.z 0 -u -10|01023|-2B40d.z 7iod.z dnXK.p dLzH.z|17e6", - "Africa/Bissau|LMT -01 GMT|12.k 10 0|012|-2ldX0 2xoo0|39e4", - "Africa/Maputo|LMT CAT|-2a.k -20|01|-2GJea.k|26e5", - "Africa/Cairo|EET EEST|-20 -30|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-1bIO0 vb0 1ip0 11z0 1iN0 1nz0 12p0 1pz0 10N0 1pz0 16p0 1jz0 s3d0 Vz0 1oN0 11b0 1oO0 10N0 1pz0 10N0 1pb0 10N0 1pb0 10N0 1pb0 10N0 1pz0 10N0 1pb0 10N0 1pb0 11d0 1oL0 11d0 1pb0 11d0 1oL0 11d0 1oL0 11d0 1oL0 11d0 1pb0 11d0 1oL0 11d0 1oL0 11d0 1oL0 11d0 1pb0 11d0 1oL0 11d0 1oL0 11d0 1oL0 11d0 1pb0 11d0 1oL0 11d0 1WL0 rd0 1Rz0 wp0 1pb0 11d0 1oL0 11d0 1oL0 11d0 1oL0 11d0 1pb0 11d0 1qL0 Xd0 1oL0 11d0 1oL0 11d0 1pb0 11d0 1oL0 11d0 1oL0 11d0 1ny0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 WL0 1qN0 Rb0 1wp0 On0 1zd0 Lz0 1EN0 Fb0 c10 8n0 8Nd0 gL0 e10 mn0|15e6", - "Africa/Casablanca|LMT +00 +01|u.k 0 -10|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212|-2gMnt.E 130Lt.E rb0 Dd0 dVb0 b6p0 TX0 EoB0 LL0 gnd0 rz0 43d0 AL0 1Nd0 XX0 1Cp0 pz0 dEp0 4mn0 SyN0 AL0 1Nd0 wn0 1FB0 Db0 1zd0 Lz0 1Nf0 wM0 co0 go0 1o00 s00 dA0 vc0 11A0 A00 e00 y00 11A0 uM0 e00 Dc0 11A0 s00 e00 IM0 WM0 mo0 gM0 LA0 WM0 jA0 e00 28M0 e00 2600 gM0 2600 e00 2600 gM0 2600 gM0 2600 e00 2600 gM0 2600 e00 28M0 e00 2600 gM0 2600 e00 2600 gM0 2600 gM0 2600 e00 2600 gM0 2600 e00 2600 gM0 2600 gM0 2600 e00 2600 gM0|32e5", - "Africa/Ceuta|WET WEST CET CEST|0 -10 -10 -20|010101010101010101010232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-25KN0 11z0 drd0 18p0 3HX0 17d0 1fz0 1a10 1io0 1a00 1y7o0 LL0 gnd0 rz0 43d0 AL0 1Nd0 XX0 1Cp0 pz0 dEp0 4VB0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|85e3", - "Africa/El_Aaiun|LMT -01 +00 +01|Q.M 10 0 -10|012323232323232323232323232323232323232323232323232323232323232323232323232323232323|-1rDz7.c 1GVA7.c 6L0 AL0 1Nd0 XX0 1Cp0 pz0 1cBB0 AL0 1Nd0 wn0 1FB0 Db0 1zd0 Lz0 1Nf0 wM0 co0 go0 1o00 s00 dA0 vc0 11A0 A00 e00 y00 11A0 uM0 e00 Dc0 11A0 s00 e00 IM0 WM0 mo0 gM0 LA0 WM0 jA0 e00 28M0 e00 2600 gM0 2600 e00 2600 gM0 2600 gM0 2600 e00 2600 gM0 2600 e00 28M0 e00 2600 gM0 2600 e00 2600 gM0 2600 gM0 2600 e00 2600 gM0 2600 e00 2600 gM0 2600 gM0 2600 e00 2600 gM0|20e4", - "Africa/Johannesburg|SAST SAST SAST|-1u -20 -30|012121|-2GJdu 1Ajdu 1cL0 1cN0 1cL0|84e5", - "Africa/Juba|LMT CAT CAST EAT|-26.s -20 -30 -30|012121212121212121212121212121212131|-1yW26.s 1zK06.s 16L0 1iN0 17b0 1jd0 17b0 1ip0 17z0 1i10 17X0 1hB0 18n0 1hd0 19b0 1gp0 19z0 1iN0 17b0 1ip0 17z0 1i10 18n0 1hd0 18L0 1gN0 19b0 1gp0 19z0 1iN0 17z0 1i10 17X0 yGd0 PeX0|", - "Africa/Khartoum|LMT CAT CAST EAT|-2a.8 -20 -30 -30|012121212121212121212121212121212131|-1yW2a.8 1zK0a.8 16L0 1iN0 17b0 1jd0 17b0 1ip0 17z0 1i10 17X0 1hB0 18n0 1hd0 19b0 1gp0 19z0 1iN0 17b0 1ip0 17z0 1i10 18n0 1hd0 18L0 1gN0 19b0 1gp0 19z0 1iN0 17z0 1i10 17X0 yGd0 HjL0|51e5", - "Africa/Monrovia|MMT MMT GMT|H.8 I.u 0|012|-23Lzg.Q 28G01.m|11e5", - "Africa/Ndjamena|LMT WAT WAST|-10.c -10 -20|0121|-2le10.c 2J3c0.c Wn0|13e5", - "Africa/Sao_Tome|LMT GMT WAT|A.J 0 -10|0121|-2le00 4i6N0 2q00|", - "Africa/Tripoli|LMT CET CEST EET|-Q.I -10 -20 -20|012121213121212121212121213123123|-21JcQ.I 1hnBQ.I vx0 4iP0 xx0 4eN0 Bb0 7ip0 U0n0 A10 1db0 1cN0 1db0 1dd0 1db0 1eN0 1bb0 1e10 1cL0 1c10 1db0 1dd0 1db0 1cN0 1db0 1q10 fAn0 1ep0 1db0 AKq0 TA0 1o00|11e5", - "Africa/Tunis|PMT CET CEST|-9.l -10 -20|0121212121212121212121212121212121|-2nco9.l 18pa9.l 1qM0 DA0 3Tc0 11B0 1ze0 WM0 7z0 3d0 14L0 1cN0 1f90 1ar0 16J0 1gXB0 WM0 1rA0 11c0 nwo0 Ko0 1cM0 1cM0 1rA0 10M0 zuM0 10N0 1aN0 1qM0 WM0 1qM0 11A0 1o00|20e5", - "Africa/Windhoek|+0130 SAST SAST CAT WAT|-1u -20 -30 -20 -10|01213434343434343434343434343434343434343434343434343|-2GJdu 1Ajdu 1cL0 1SqL0 9Io0 16P0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0|32e4", - "America/Adak|NST NWT NPT BST BDT AHST HST HDT|b0 a0 a0 b0 a0 a0 a0 90|012034343434343434343434343434343456767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676|-17SX0 8wW0 iB0 Qlb0 52O0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 cm0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|326", - "America/Anchorage|AST AWT APT AHST AHDT YST AKST AKDT|a0 90 90 a0 90 90 90 80|012034343434343434343434343434343456767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676|-17T00 8wX0 iA0 Qlb0 52O0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 cm0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|30e4", - "America/Port_of_Spain|LMT AST|46.4 40|01|-2kNvR.U|43e3", - "America/Araguaina|LMT -03 -02|3c.M 30 20|0121212121212121212121212121212121212121212121212121|-2glwL.c HdKL.c 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 dMN0 Lz0 1zd0 Rb0 1wN0 Wn0 1tB0 Rb0 1tB0 WL0 1tB0 Rb0 1zd0 On0 1HB0 FX0 ny10 Lz0|14e4", - "America/Argentina/Buenos_Aires|CMT -04 -03 -02|4g.M 40 30 20|01212121212121212121212121212121212121212123232323232323232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wp0 Rb0 1wp0 TX0 A4p0 uL0 1qN0 WL0|", - "America/Argentina/Catamarca|CMT -04 -03 -02|4g.M 40 30 20|01212121212121212121212121212121212121212123232323132321232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wq0 Ra0 1wp0 TX0 rlB0 7B0 8zb0 uL0|", - "America/Argentina/Cordoba|CMT -04 -03 -02|4g.M 40 30 20|01212121212121212121212121212121212121212123232323132323232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wq0 Ra0 1wp0 TX0 A4p0 uL0 1qN0 WL0|", - "America/Argentina/Jujuy|CMT -04 -03 -02|4g.M 40 30 20|012121212121212121212121212121212121212121232323121323232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1ze0 TX0 1ld0 WK0 1wp0 TX0 A4p0 uL0|", - "America/Argentina/La_Rioja|CMT -04 -03 -02|4g.M 40 30 20|012121212121212121212121212121212121212121232323231232321232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Qn0 qO0 16n0 Rb0 1wp0 TX0 rlB0 7B0 8zb0 uL0|", - "America/Argentina/Mendoza|CMT -04 -03 -02|4g.M 40 30 20|01212121212121212121212121212121212121212123232312121321232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1u20 SL0 1vd0 Tb0 1wp0 TW0 ri10 Op0 7TX0 uL0|", - "America/Argentina/Rio_Gallegos|CMT -04 -03 -02|4g.M 40 30 20|01212121212121212121212121212121212121212123232323232321232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wp0 Rb0 1wp0 TX0 rlB0 7B0 8zb0 uL0|", - "America/Argentina/Salta|CMT -04 -03 -02|4g.M 40 30 20|012121212121212121212121212121212121212121232323231323232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wq0 Ra0 1wp0 TX0 A4p0 uL0|", - "America/Argentina/San_Juan|CMT -04 -03 -02|4g.M 40 30 20|012121212121212121212121212121212121212121232323231232321232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Qn0 qO0 16n0 Rb0 1wp0 TX0 rld0 m10 8lb0 uL0|", - "America/Argentina/San_Luis|CMT -04 -03 -02|4g.M 40 30 20|012121212121212121212121212121212121212121232323121212321212|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 XX0 1q20 SL0 AN0 vDb0 m10 8lb0 8L0 jd0 1qN0 WL0 1qN0|", - "America/Argentina/Tucuman|CMT -04 -03 -02|4g.M 40 30 20|0121212121212121212121212121212121212121212323232313232123232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wq0 Ra0 1wp0 TX0 rlB0 4N0 8BX0 uL0 1qN0 WL0|", - "America/Argentina/Ushuaia|CMT -04 -03 -02|4g.M 40 30 20|01212121212121212121212121212121212121212123232323232321232|-20UHH.c pKnH.c Mn0 1iN0 Tb0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 1C10 LX0 1C10 LX0 1C10 LX0 1C10 Mn0 MN0 2jz0 MN0 4lX0 u10 5Lb0 1pB0 Fnz0 u10 uL0 1vd0 SL0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 zvd0 Bz0 1tB0 TX0 1wp0 Rb0 1wp0 Rb0 1wp0 TX0 rkN0 8p0 8zb0 uL0|", - "America/Curacao|LMT -0430 AST|4z.L 4u 40|012|-2kV7o.d 28KLS.d|15e4", - "America/Asuncion|AMT -04 -03|3O.E 40 30|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212|-1x589.k 1DKM9.k 3CL0 3Dd0 10L0 1pB0 10n0 1pB0 10n0 1pB0 1cL0 1dd0 1db0 1dd0 1cL0 1dd0 1cL0 1dd0 1cL0 1dd0 1db0 1dd0 1cL0 1dd0 1cL0 1dd0 1cL0 1dd0 1db0 1dd0 1cL0 1lB0 14n0 1dd0 1cL0 1fd0 WL0 1rd0 1aL0 1dB0 Xz0 1qp0 Xb0 1qN0 10L0 1rB0 TX0 1tB0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 1cL0 WN0 1qL0 11B0 1nX0 1ip0 WL0 1qN0 WL0 1qN0 WL0 1tB0 TX0 1tB0 TX0 1tB0 19X0 1a10 1fz0 1a10 1fz0 1cN0 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1ip0 17b0 1ip0 17b0 1ip0|28e5", - "America/Atikokan|CST CDT CWT CPT EST|60 50 50 50 50|0101234|-25TQ0 1in0 Rnb0 3je0 8x30 iw0|28e2", - "America/Bahia_Banderas|LMT MST CST PST MDT CDT|71 70 60 80 60 50|0121212131414141414141414141414141414152525252525252525252525252525252525252525252525252525252|-1UQF0 deL0 8lc0 17c0 10M0 1dd0 otX0 gmN0 P2N0 13Vd0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nW0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0|84e3", - "America/Bahia|LMT -03 -02|2y.4 30 20|01212121212121212121212121212121212121212121212121212121212121|-2glxp.U HdLp.U 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 1EN0 Lz0 1C10 IL0 1HB0 Db0 1HB0 On0 1zd0 On0 1zd0 Lz0 1zd0 Rb0 1wN0 Wn0 1tB0 Rb0 1tB0 WL0 1tB0 Rb0 1zd0 On0 1HB0 FX0 l5B0 Rb0|27e5", - "America/Barbados|LMT BMT AST ADT|3W.t 3W.t 40 30|01232323232|-1Q0I1.v jsM0 1ODC1.v IL0 1ip0 17b0 1ip0 17b0 1ld0 13b0|28e4", - "America/Belem|LMT -03 -02|3d.U 30 20|012121212121212121212121212121|-2glwK.4 HdKK.4 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0|20e5", - "America/Belize|LMT CST -0530 CWT CPT CDT|5Q.M 60 5u 50 50 50|012121212121212121212121212121212121212121212121213412121212121212121212121212121212121212121215151|-2kBu7.c fPA7.c Onu 1zcu Rbu 1wou Rbu 1wou Rbu 1zcu Onu 1zcu Onu 1zcu Rbu 1wou Rbu 1wou Rbu 1wou Rbu 1zcu Onu 1zcu Onu 1zcu Rbu 1wou Rbu 1wou Rbu 1zcu Onu 1zcu Onu 1zcu Onu 1zcu Rbu 1wou Rbu 1wou Rbu 1zcu Onu 1zcu Onu 1zcu Rbu Rcu 7Bt0 Ni0 4nd0 Rbu 1wou Rbu 1wou Rbu 1zcu Onu 1zcu Onu 1zcu Rbu 1wou Rbu 1wou Rbu 1wou Rbu 1zcu Onu 1zcu Onu 1zcu Rbu 1wou Rbu 1wou Rbu 1zcu Onu 1zcu Onu 1zcu Onu 1zcu Rbu 1wou Rbu 1wou Rbu 1zcu Onu e9Au qn0 lxB0 mn0|57e3", - "America/Blanc-Sablon|AST ADT AWT APT|40 30 30 30|010230|-25TS0 1in0 UGp0 8x50 iu0|11e2", - "America/Boa_Vista|LMT -04 -03|42.E 40 30|0121212121212121212121212121212121|-2glvV.k HdKV.k 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 smp0 WL0 1tB0 2L0|62e2", - "America/Bogota|BMT -05 -04|4U.g 50 40|0121|-2eb73.I 38yo3.I 2en0|90e5", - "America/Boise|PST PDT MST MWT MPT MDT|80 70 70 60 60 60|0101023425252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252|-261q0 1nX0 11B0 1nX0 8C10 JCL0 8x20 ix0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 Dd0 1Kn0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|21e4", - "America/Cambridge_Bay|-00 MST MWT MPT MDDT MDT CST CDT EST|0 70 60 60 50 60 60 50 50|0123141515151515151515151515151515151515151515678651515151515151515151515151515151515151515151515151515151515151515151515151|-21Jc0 RO90 8x20 ix0 LCL0 1fA0 zgO0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11A0 1nX0 2K0 WQ0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|15e2", - "America/Campo_Grande|LMT -04 -03|3C.s 40 30|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2glwl.w HdLl.w 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 1EN0 Lz0 1C10 IL0 1HB0 Db0 1HB0 On0 1zd0 On0 1zd0 Lz0 1zd0 Rb0 1wN0 Wn0 1tB0 Rb0 1tB0 WL0 1tB0 Rb0 1zd0 On0 1HB0 FX0 1C10 Lz0 1Ip0 HX0 1zd0 On0 1HB0 IL0 1wp0 On0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 Rb0 1zd0 Lz0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 On0 1zd0 On0 1HB0 FX0|77e4", - "America/Cancun|LMT CST EST EDT CDT|5L.4 60 50 40 50|0123232341414141414141414141414141414141412|-1UQG0 2q2o0 yLB0 1lb0 14p0 1lb0 14p0 Lz0 xB0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 Dd0|63e4", - "America/Caracas|CMT -0430 -04|4r.E 4u 40|01212|-2kV7w.k 28KM2.k 1IwOu kqo0|29e5", - "America/Cayenne|LMT -04 -03|3t.k 40 30|012|-2mrwu.E 2gWou.E|58e3", - "America/Panama|CMT EST|5j.A 50|01|-2uduE.o|15e5", - "America/Chicago|CST CDT EST CWT CPT|60 50 50 50 50|01010101010101010101010101010101010102010101010103401010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261s0 1nX0 11B0 1nX0 1wp0 TX0 WN0 1qL0 1cN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 11B0 1Hz0 14p0 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 RB0 8x30 iw0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|92e5", - "America/Chihuahua|LMT MST CST CDT MDT|74.k 70 60 50 60|0121212323241414141414141414141414141414141414141414141414141414141414141414141414141414141|-1UQF0 deL0 8lc0 17c0 10M0 1dd0 2zQN0 1lb0 14p0 1lb0 14q0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0|81e4", - "America/Costa_Rica|SJMT CST CDT|5A.d 60 50|0121212121|-1Xd6n.L 2lu0n.L Db0 1Kp0 Db0 pRB0 15b0 1kp0 mL0|12e5", - "America/Creston|MST PST|70 80|010|-29DR0 43B0|53e2", - "America/Cuiaba|LMT -04 -03|3I.k 40 30|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2glwf.E HdLf.E 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 1EN0 Lz0 1C10 IL0 1HB0 Db0 1HB0 On0 1zd0 On0 1zd0 Lz0 1zd0 Rb0 1wN0 Wn0 1tB0 Rb0 1tB0 WL0 1tB0 Rb0 1zd0 On0 1HB0 FX0 4a10 HX0 1zd0 On0 1HB0 IL0 1wp0 On0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 Rb0 1zd0 Lz0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 On0 1zd0 On0 1HB0 FX0|54e4", - "America/Danmarkshavn|LMT -03 -02 GMT|1e.E 30 20 0|01212121212121212121212121212121213|-2a5WJ.k 2z5fJ.k 19U0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 DC0|8", - "America/Dawson_Creek|PST PDT PWT PPT MST|80 70 70 70 70|0102301010101010101010101010101010101010101010101010101014|-25TO0 1in0 UGp0 8x10 iy0 3NB0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 ML0|12e3", - "America/Dawson|YST YDT YWT YPT YDDT PST PDT MST|90 80 80 80 70 80 70 70|010102304056565656565656565656565656565656565656565656565656565656565656565656565656565656567|-25TN0 1in0 1o10 13V0 Ser0 8x00 iz0 LCL0 1fA0 jrA0 fNd0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1z90|13e2", - "America/Denver|MST MDT MWT MPT|70 60 60 60|01010101023010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261r0 1nX0 11B0 1nX0 11B0 1qL0 WN0 mn0 Ord0 8x20 ix0 LCN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|26e5", - "America/Detroit|LMT CST EST EWT EPT EDT|5w.b 60 50 40 40 40|0123425252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252|-2Cgir.N peqr.N 156L0 8x40 iv0 6fd0 11z0 JxX1 SMX 1cN0 1cL0 aW10 1cL0 s10 1Vz0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|37e5", - "America/Edmonton|LMT MST MDT MWT MPT|7x.Q 70 60 60 60|0121212121212134121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2yd4q.8 shdq.8 1in0 17d0 hz0 2dB0 1fz0 1a10 11z0 1qN0 WL0 1qN0 11z0 IGN0 8x20 ix0 3NB0 11z0 XQp0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|10e5", - "America/Eirunepe|LMT -05 -04|4D.s 50 40|0121212121212121212121212121212121|-2glvk.w HdLk.w 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 dPB0 On0 yTd0 d5X0|31e3", - "America/El_Salvador|LMT CST CDT|5U.M 60 50|012121|-1XiG3.c 2Fvc3.c WL0 1qN0 WL0|11e5", - "America/Tijuana|LMT MST PST PDT PWT PPT|7M.4 70 80 70 70 70|012123245232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-1UQE0 4PX0 8mM0 8lc0 SN0 1cL0 pHB0 83r0 zI0 5O10 1Rz0 cOO0 11A0 1o00 11A0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 BUp0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 U10 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|20e5", - "America/Fort_Nelson|PST PDT PWT PPT MST|80 70 70 70 70|01023010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010104|-25TO0 1in0 UGp0 8x10 iy0 3NB0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0|39e2", - "America/Fort_Wayne|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|010101023010101010101010101040454545454545454545454545454545454545454545454545454545454545454545454|-261s0 1nX0 11B0 1nX0 QI10 Db0 RB0 8x30 iw0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 5Tz0 1o10 qLb0 1cL0 1cN0 1cL0 1qhd0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|", - "America/Fortaleza|LMT -03 -02|2y 30 20|0121212121212121212121212121212121212121|-2glxq HdLq 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 nsp0 WL0 1tB0 5z0 2mN0 On0|34e5", - "America/Glace_Bay|LMT AST ADT AWT APT|3X.M 40 30 30 30|012134121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2IsI0.c CwO0.c 1in0 UGp0 8x50 iu0 iq10 11z0 Jg10 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|19e3", - "America/Godthab|LMT -03 -02|3q.U 30 20|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2a5Ux.4 2z5dx.4 19U0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|17e3", - "America/Goose_Bay|NST NDT NST NDT NWT NPT AST ADT ADDT|3u.Q 2u.Q 3u 2u 2u 2u 40 30 20|010232323232323245232323232323232323232323232323232323232326767676767676767676767676767676767676767676768676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676|-25TSt.8 1in0 DXb0 2HbX.8 WL0 1qN0 WL0 1qN0 WL0 1tB0 TX0 1tB0 WL0 1qN0 WL0 1qN0 7UHu itu 1tB0 WL0 1qN0 WL0 1qN0 WL0 1qN0 WL0 1tB0 WL0 1ld0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 S10 g0u 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14n1 1lb0 14p0 1nW0 11C0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zcX Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|76e2", - "America/Grand_Turk|KMT EST EDT AST|57.a 50 40 40|0121212121212121212121212121212121212121212121212121212121212121212121212132121212121212121212121212121212121212121|-2l1uQ.O 2HHBQ.O 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 7jA0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|37e2", - "America/Guatemala|LMT CST CDT|62.4 60 50|0121212121|-24KhV.U 2efXV.U An0 mtd0 Nz0 ifB0 17b0 zDB0 11z0|13e5", - "America/Guayaquil|QMT -05 -04|5e 50 40|0121|-1yVSK 2uILK rz0|27e5", - "America/Guyana|LMT -0345 -03 -04|3Q.E 3J 30 40|0123|-2dvU7.k 2r6LQ.k Bxbf|80e4", - "America/Halifax|LMT AST ADT AWT APT|4e.o 40 30 30 30|0121212121212121212121212121212121212121212121212134121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2IsHJ.A xzzJ.A 1db0 3I30 1in0 3HX0 IL0 1E10 ML0 1yN0 Pb0 1Bd0 Mn0 1Bd0 Rz0 1w10 Xb0 1w10 LX0 1w10 Xb0 1w10 Lz0 1C10 Jz0 1E10 OL0 1yN0 Un0 1qp0 Xb0 1qp0 11X0 1w10 Lz0 1HB0 LX0 1C10 FX0 1w10 Xb0 1qp0 Xb0 1BB0 LX0 1td0 Xb0 1qp0 Xb0 Rf0 8x50 iu0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 3Qp0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 3Qp0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 6i10 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|39e4", - "America/Havana|HMT CST CDT|5t.A 50 40|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1Meuu.o 72zu.o ML0 sld0 An0 1Nd0 Db0 1Nd0 An0 6Ep0 An0 1Nd0 An0 JDd0 Mn0 1Ap0 On0 1fd0 11X0 1qN0 WL0 1wp0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 14n0 1ld0 14L0 1kN0 15b0 1kp0 1cL0 1cN0 1fz0 1a10 1fz0 1fB0 11z0 14p0 1nX0 11B0 1nX0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 14n0 1ld0 14n0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 1a10 1in0 1a10 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 17c0 1o00 11A0 1qM0 11A0 1o00 11A0 1o00 14o0 1lc0 14o0 1lc0 11A0 6i00 Rc0 1wo0 U00 1tA0 Rc0 1wo0 U00 1wo0 U00 1zc0 U00 1qM0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0|21e5", - "America/Hermosillo|LMT MST CST PST MDT|7n.Q 70 60 80 60|0121212131414141|-1UQF0 deL0 8lc0 17c0 10M0 1dd0 otX0 gmN0 P2N0 13Vd0 1lb0 14p0 1lb0 14p0 1lb0|64e4", - "America/Indiana/Knox|CST CDT CWT CPT EST|60 50 50 50 50|0101023010101010101010101010101010101040101010101010101010101010101010101010101010101010141010101010101010101010101010101010101010101010101010101010101010|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 3NB0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 1cL0 1cN0 11z0 1o10 11z0 1o10 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 3Cn0 8wp0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 z8o0 1o00 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|", - "America/Indiana/Marengo|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|0101023010101010101010104545454545414545454545454545454545454545454545454545454545454545454545454545454|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 dyN0 11z0 6fd0 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 jrz0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1VA0 LA0 1BX0 1e6p0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|", - "America/Indiana/Petersburg|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|01010230101010101010101010104010101010101010101010141014545454545454545454545454545454545454545454545454545454545454|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 njX0 WN0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 3Fb0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 19co0 1o00 Rd0 1zb0 Oo0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|", - "America/Indiana/Tell_City|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|01010230101010101010101010401054541010101010101010101010101010101010101010101010101010101010101010|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 njX0 WN0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 8wn0 1cN0 1cL0 1cN0 1cK0 1cN0 1cL0 1qhd0 1o00 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|", - "America/Indiana/Vevay|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|010102304545454545454545454545454545454545454545454545454545454545454545454545454|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 kPB0 Awn0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1lnd0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|", - "America/Indiana/Vincennes|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|01010230101010101010101010101010454541014545454545454545454545454545454545454545454545454545454545454|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 1o10 11z0 g0p0 11z0 1o10 11z0 1qL0 WN0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 WL0 1qN0 1cL0 1cN0 1cL0 1cN0 caL0 1cL0 1cN0 1cL0 1qhd0 1o00 Rd0 1zb0 Oo0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|", - "America/Indiana/Winamac|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|01010230101010101010101010101010101010454541054545454545454545454545454545454545454545454545454545454545454|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 1cL0 1cN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 jrz0 1cL0 1cN0 1cL0 1qhd0 1o00 Rd0 1za0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|", - "America/Inuvik|-00 PST PDDT MST MDT|0 80 60 70 60|0121343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343|-FnA0 tWU0 1fA0 wPe0 2pz0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|35e2", - "America/Iqaluit|-00 EWT EPT EST EDDT EDT CST CDT|0 40 40 50 30 40 60 50|01234353535353535353535353535353535353535353567353535353535353535353535353535353535353535353535353535353535353535353535353|-16K00 7nX0 iv0 LCL0 1fA0 zgO0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11C0 1nX0 11A0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|67e2", - "America/Jamaica|KMT EST EDT|57.a 50 40|0121212121212121212121|-2l1uQ.O 2uM1Q.O 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0|94e4", - "America/Juneau|PST PWT PPT PDT YDT YST AKST AKDT|80 70 70 70 80 90 90 80|01203030303030303030303030403030356767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676|-17T20 8x10 iy0 Vo10 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cM0 1cM0 1cL0 1cN0 1fz0 1a10 1fz0 co0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|33e3", - "America/Kentucky/Louisville|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|0101010102301010101010101010101010101454545454545414545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454|-261s0 1nX0 11B0 1nX0 3Fd0 Nb0 LPd0 11z0 RB0 8x30 iw0 1nX1 e0X 9vd0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 xz0 gso0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1VA0 LA0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|", - "America/Kentucky/Monticello|CST CDT CWT CPT EST EDT|60 50 50 50 50 40|0101023010101010101010101010101010101010101010101010101010101010101010101454545454545454545454545454545454545454545454545454545454545454545454545454|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 SWp0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11A0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|", - "America/La_Paz|CMT BST -04|4w.A 3w.A 40|012|-1x37r.o 13b0|19e5", - "America/Lima|LMT -05 -04|58.A 50 40|0121212121212121|-2tyGP.o 1bDzP.o zX0 1aN0 1cL0 1cN0 1cL0 1PrB0 zX0 1O10 zX0 6Gp0 zX0 98p0 zX0|11e6", - "America/Los_Angeles|PST PDT PWT PPT|80 70 70 70|010102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261q0 1nX0 11B0 1nX0 SgN0 8x10 iy0 5Wp1 1VaX 3dA0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1a00 1fA0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|15e6", - "America/Maceio|LMT -03 -02|2m.Q 30 20|012121212121212121212121212121212121212121|-2glxB.8 HdLB.8 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 dMN0 Lz0 8Q10 WL0 1tB0 5z0 2mN0 On0|93e4", - "America/Managua|MMT CST EST CDT|5J.c 60 50 50|0121313121213131|-1quie.M 1yAMe.M 4mn0 9Up0 Dz0 1K10 Dz0 s3F0 1KH0 DB0 9In0 k8p0 19X0 1o30 11y0|22e5", - "America/Manaus|LMT -04 -03|40.4 40 30|01212121212121212121212121212121|-2glvX.U HdKX.U 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 dPB0 On0|19e5", - "America/Martinique|FFMT AST ADT|44.k 40 30|0121|-2mPTT.E 2LPbT.E 19X0|39e4", - "America/Matamoros|LMT CST CDT|6E 60 50|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1UQG0 2FjC0 1nX0 i6p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 U10 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|45e4", - "America/Mazatlan|LMT MST CST PST MDT|75.E 70 60 80 60|0121212131414141414141414141414141414141414141414141414141414141414141414141414141414141414141|-1UQF0 deL0 8lc0 17c0 10M0 1dd0 otX0 gmN0 P2N0 13Vd0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0|44e4", - "America/Menominee|CST CDT CWT CPT EST|60 50 50 50 50|01010230101041010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 1o10 11z0 LCN0 1fz0 6410 9Jb0 1cM0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|85e2", - "America/Merida|LMT CST EST CDT|5W.s 60 50 50|0121313131313131313131313131313131313131313131313131313131313131313131313131313131313131|-1UQG0 2q2o0 2hz0 wu30 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0|11e5", - "America/Metlakatla|PST PWT PPT PDT AKST AKDT|80 70 70 70 90 80|01203030303030303030303030303030304545450454545454545454545454545454545454545454|-17T20 8x10 iy0 Vo10 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1hU10 Rd0 1zb0 Op0 1zb0 Op0 1zb0 uM0 jB0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|14e2", - "America/Mexico_City|LMT MST CST CDT CWT|6A.A 70 60 50 50|012121232324232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-1UQF0 deL0 8lc0 17c0 10M0 1dd0 gEn0 TX0 3xd0 Jb0 6zB0 SL0 e5d0 17b0 1Pff0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0|20e6", - "America/Miquelon|LMT AST -03 -02|3I.E 40 30 20|012323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-2mKkf.k 2LTAf.k gQ10 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|61e2", - "America/Moncton|EST AST ADT AWT APT|50 40 30 30 30|012121212121212121212134121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2IsH0 CwN0 1in0 zAo0 An0 1Nd0 An0 1Nd0 An0 1Nd0 An0 1Nd0 An0 1Nd0 An0 1K10 Lz0 1zB0 NX0 1u10 Wn0 S20 8x50 iu0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 3Cp0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14n1 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 ReX 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|64e3", - "America/Monterrey|LMT CST CDT|6F.g 60 50|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1UQG0 2FjC0 1nX0 i6p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0|41e5", - "America/Montevideo|LMT MMT -04 -03 -0330 -0230 -02 -0130|3I.P 3I.P 40 30 3u 2u 20 1u|012343434343434343434343435353636353636375363636363636363636363636363636363636363636363|-2tRUf.9 sVc0 8jcf.9 1db0 1dcu 1cLu 1dcu 1cLu ircu 11zu 1o0u 11zu 1o0u 11zu 1o0u 11zu 1qMu WLu 1qMu WLu 1fAu 1cLu 1o0u 11zu NAu 3jXu zXu Dq0u 19Xu pcu jz0 cm10 19X0 6tB0 1fbu 3o0u jX0 4vB0 xz0 3Cp0 mmu 1a10 IMu Db0 4c10 uL0 1Nd0 An0 1SN0 uL0 mp0 28L0 iPB0 un0 1SN0 xz0 1zd0 Lz0 1zd0 Rb0 1zd0 On0 1wp0 Rb0 s8p0 1fB0 1ip0 11z0 1ld0 14n0 1o10 11z0 1o10 11z0 1o10 14n0 1ld0 14n0 1ld0 14n0 1o10 11z0 1o10 11z0 1o10 11z0|17e5", - "America/Toronto|EST EDT EWT EPT|50 40 40 40|01010101010101010101010101010101010101010101012301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-25TR0 1in0 11Wu 1nzu 1fD0 WJ0 1wr0 Nb0 1Ap0 On0 1zd0 On0 1wp0 TX0 1tB0 TX0 1tB0 TX0 1tB0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 4kM0 8x40 iv0 1o10 11z0 1nX0 11z0 1o10 11z0 1o10 1qL0 11D0 1nX0 11B0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|65e5", - "America/Nassau|LMT EST EWT EPT EDT|59.u 50 40 40 40|01212314141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141|-2kNuO.u 1drbO.u 6tX0 cp0 1hS0 pF0 J630 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|24e4", - "America/New_York|EST EDT EWT EPT|50 40 40 40|01010101010101010101010101010101010101010101010102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261t0 1nX0 11B0 1nX0 11B0 1qL0 1a10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 RB0 8x40 iv0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|21e6", - "America/Nipigon|EST EDT EWT EPT|50 40 40 40|010123010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-25TR0 1in0 Rnb0 3je0 8x40 iv0 19yN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|16e2", - "America/Nome|NST NWT NPT BST BDT YST AKST AKDT|b0 a0 a0 b0 a0 90 90 80|012034343434343434343434343434343456767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676767676|-17SX0 8wW0 iB0 Qlb0 52O0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 cl0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|38e2", - "America/Noronha|LMT -02 -01|29.E 20 10|0121212121212121212121212121212121212121|-2glxO.k HdKO.k 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 nsp0 WL0 1tB0 2L0 2pB0 On0|30e2", - "America/North_Dakota/Beulah|MST MDT MWT MPT CST CDT|70 60 60 60 60 50|010102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101014545454545454545454545454545454545454545454545454545454|-261r0 1nX0 11B0 1nX0 SgN0 8x20 ix0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Oo0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|", - "America/North_Dakota/Center|MST MDT MWT MPT CST CDT|70 60 60 60 60 50|010102301010101010101010101010101010101010101010101010101014545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454|-261r0 1nX0 11B0 1nX0 SgN0 8x20 ix0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14o0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|", - "America/North_Dakota/New_Salem|MST MDT MWT MPT CST CDT|70 60 60 60 60 50|010102301010101010101010101010101010101010101010101010101010101010101010101010101454545454545454545454545454545454545454545454545454545454545454545454|-261r0 1nX0 11B0 1nX0 SgN0 8x20 ix0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14o0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|", - "America/Ojinaga|LMT MST CST CDT MDT|6V.E 70 60 50 60|0121212323241414141414141414141414141414141414141414141414141414141414141414141414141414141|-1UQF0 deL0 8lc0 17c0 10M0 1dd0 2zQN0 1lb0 14p0 1lb0 14q0 1lb0 14p0 1nX0 11B0 1nX0 1fB0 WL0 1fB0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 U10 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|23e3", - "America/Pangnirtung|-00 AST AWT APT ADDT ADT EDT EST CST CDT|0 40 30 30 20 30 40 50 60 50|012314151515151515151515151515151515167676767689767676767676767676767676767676767676767676767676767676767676767676767676767|-1XiM0 PnG0 8x50 iu0 LCL0 1fA0 zgO0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1o00 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11C0 1nX0 11A0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|14e2", - "America/Paramaribo|LMT PMT PMT -0330 -03|3E.E 3E.Q 3E.A 3u 30|01234|-2nDUj.k Wqo0.c qanX.I 1yVXN.o|24e4", - "America/Phoenix|MST MDT MWT|70 60 60|01010202010|-261r0 1nX0 11B0 1nX0 SgN0 4Al1 Ap0 1db0 SWqX 1cL0|42e5", - "America/Port-au-Prince|PPMT EST EDT|4N 50 40|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-28RHb 2FnMb 19X0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14q0 1o00 11A0 1o00 11A0 1o00 14o0 1lc0 14o0 1lc0 14o0 1o00 11A0 1o00 11A0 1o00 14o0 1lc0 14o0 1lc0 i6n0 1nX0 11B0 1nX0 d430 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 3iN0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|23e5", - "America/Rio_Branco|LMT -05 -04|4v.c 50 40|01212121212121212121212121212121|-2glvs.M HdLs.M 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 NBd0 d5X0|31e4", - "America/Porto_Velho|LMT -04 -03|4f.A 40 30|012121212121212121212121212121|-2glvI.o HdKI.o 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0|37e4", - "America/Puerto_Rico|AST AWT APT|40 30 30|0120|-17lU0 7XT0 iu0|24e5", - "America/Punta_Arenas|SMT -05 -04 -03|4G.K 50 40 30|0102021212121212121232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323|-2q2jh.e fJAh.e 5knG.K 1Vzh.e jRAG.K 1pbh.e 11d0 1oL0 11d0 1oL0 11d0 1oL0 11d0 1pb0 11d0 nHX0 op0 blz0 ko0 Qeo0 WL0 1zd0 On0 1ip0 11z0 1o10 11z0 1qN0 WL0 1ld0 14n0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 1cL0 1cN0 11z0 1o10 11z0 1qN0 WL0 1fB0 19X0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1ip0 1fz0 1fB0 11z0 1qN0 WL0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1o10 19X0 1fB0 1nX0 G10 1EL0 Op0 1zb0 Rd0 1wn0 Rd0 46n0 Ap0|", - "America/Rainy_River|CST CDT CWT CPT|60 50 50 50|010123010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-25TQ0 1in0 Rnb0 3je0 8x30 iw0 19yN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|842", - "America/Rankin_Inlet|-00 CST CDDT CDT EST|0 60 40 50 50|012131313131313131313131313131313131313131313431313131313131313131313131313131313131313131313131313131313131313131313131|-vDc0 keu0 1fA0 zgO0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|26e2", - "America/Recife|LMT -03 -02|2j.A 30 20|0121212121212121212121212121212121212121|-2glxE.o HdLE.o 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 nsp0 WL0 1tB0 2L0 2pB0 On0|33e5", - "America/Regina|LMT MST MDT MWT MPT CST|6W.A 70 60 60 60 60|012121212121212121212121341212121212121212121212121215|-2AD51.o uHe1.o 1in0 s2L0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 66N0 1cL0 1cN0 19X0 1fB0 1cL0 1fB0 1cL0 1cN0 1cL0 M30 8x20 ix0 1ip0 1cL0 1ip0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 3NB0 1cL0 1cN0|19e4", - "America/Resolute|-00 CST CDDT CDT EST|0 60 40 50 50|012131313131313131313131313131313131313131313431313131313431313131313131313131313131313131313131313131313131313131313131|-SnA0 GWS0 1fA0 zgO0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|229", - "America/Santarem|LMT -04 -03|3C.M 40 30|0121212121212121212121212121212|-2glwl.c HdLl.c 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 qe10 xb0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 NBd0|21e4", - "America/Santiago|SMT -05 -04 -03|4G.K 50 40 30|010202121212121212321232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323|-2q2jh.e fJAh.e 5knG.K 1Vzh.e jRAG.K 1pbh.e 11d0 1oL0 11d0 1oL0 11d0 1oL0 11d0 1pb0 11d0 nHX0 op0 9Bz0 jb0 1oN0 ko0 Qeo0 WL0 1zd0 On0 1ip0 11z0 1o10 11z0 1qN0 WL0 1ld0 14n0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 1cL0 1cN0 11z0 1o10 11z0 1qN0 WL0 1fB0 19X0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1ip0 1fz0 1fB0 11z0 1qN0 WL0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1o10 19X0 1fB0 1nX0 G10 1EL0 Op0 1zb0 Rd0 1wn0 Rd0 46n0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1zb0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0|62e5", - "America/Santo_Domingo|SDMT EST EDT -0430 AST|4E 50 40 4u 40|01213131313131414|-1ttjk 1lJMk Mn0 6sp0 Lbu 1Cou yLu 1RAu wLu 1QMu xzu 1Q0u xXu 1PAu 13jB0 e00|29e5", - "America/Sao_Paulo|LMT -03 -02|36.s 30 20|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2glwR.w HdKR.w 1cc0 1e10 1bX0 Ezd0 So0 1vA0 Mn0 1BB0 ML0 1BB0 zX0 pTd0 PX0 2ep0 nz0 1C10 zX0 1C10 LX0 1C10 Mn0 H210 Rb0 1tB0 IL0 1Fd0 FX0 1EN0 FX0 1HB0 Lz0 1EN0 Lz0 1C10 IL0 1HB0 Db0 1HB0 On0 1zd0 On0 1zd0 Lz0 1zd0 Rb0 1wN0 Wn0 1tB0 Rb0 1tB0 WL0 1tB0 Rb0 1zd0 On0 1HB0 FX0 1C10 Lz0 1Ip0 HX0 1zd0 On0 1HB0 IL0 1wp0 On0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 Rb0 1zd0 Lz0 1C10 Lz0 1C10 On0 1zd0 On0 1zd0 On0 1zd0 On0 1HB0 FX0|20e6", - "America/Scoresbysund|LMT -02 -01 +00|1r.Q 20 10 0|0121323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-2a5Ww.8 2z5ew.8 1a00 1cK0 1cL0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|452", - "America/Sitka|PST PWT PPT PDT YST AKST AKDT|80 70 70 70 90 90 80|01203030303030303030303030303030345656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565656565|-17T20 8x10 iy0 Vo10 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 co0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|90e2", - "America/St_Johns|NST NDT NST NDT NWT NPT NDDT|3u.Q 2u.Q 3u 2u 2u 2u 1u|01010101010101010101010101010101010102323232323232324523232323232323232323232323232323232323232323232323232323232323232323232323232323232326232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-28oit.8 14L0 1nB0 1in0 1gm0 Dz0 1JB0 1cL0 1cN0 1cL0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1fB0 1cL0 1cN0 1cL0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1fB0 19X0 1fB0 1cL0 1fB0 19X0 1fB0 19X0 10O0 eKX.8 19X0 1iq0 WL0 1qN0 WL0 1qN0 WL0 1tB0 TX0 1tB0 WL0 1qN0 WL0 1qN0 7UHu itu 1tB0 WL0 1qN0 WL0 1qN0 WL0 1qN0 WL0 1tB0 WL0 1ld0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14n1 1lb0 14p0 1nW0 11C0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zcX Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|11e4", - "America/Swift_Current|LMT MST MDT MWT MPT CST|7b.k 70 60 60 60 60|012134121212121212121215|-2AD4M.E uHdM.E 1in0 UGp0 8x20 ix0 1o10 17b0 1ip0 11z0 1o10 11z0 1o10 11z0 isN0 1cL0 3Cp0 1cL0 1cN0 11z0 1qN0 WL0 pMp0|16e3", - "America/Tegucigalpa|LMT CST CDT|5M.Q 60 50|01212121|-1WGGb.8 2ETcb.8 WL0 1qN0 WL0 GRd0 AL0|11e5", - "America/Thule|LMT AST ADT|4z.8 40 30|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2a5To.Q 31NBo.Q 1cL0 1cN0 1cL0 1fB0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|656", - "America/Thunder_Bay|CST EST EWT EPT EDT|60 50 40 40 40|0123141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141|-2q5S0 1iaN0 8x40 iv0 XNB0 1cL0 1cN0 1fz0 1cN0 1cL0 3Cp0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|11e4", - "America/Vancouver|PST PDT PWT PPT|80 70 70 70|0102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-25TO0 1in0 UGp0 8x10 iy0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|23e5", - "America/Whitehorse|YST YDT YWT YPT YDDT PST PDT MST|90 80 80 80 70 80 70 70|010102304056565656565656565656565656565656565656565656565656565656565656565656565656565656567|-25TN0 1in0 1o10 13V0 Ser0 8x00 iz0 LCL0 1fA0 3NA0 vrd0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1z90|23e3", - "America/Winnipeg|CST CDT CWT CPT|60 50 50 50|010101023010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2aIi0 WL0 3ND0 1in0 Jap0 Rb0 aCN0 8x30 iw0 1tB0 11z0 1ip0 11z0 1o10 11z0 1o10 11z0 1rd0 10L0 1op0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 1cL0 1cN0 11z0 6i10 WL0 6i10 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1a00 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1a00 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 14o0 1lc0 14o0 1o00 11A0 1o00 11A0 1o00 14o0 1lc0 14o0 1lc0 14o0 1o00 11A0 1o00 11A0 1o00 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1o00 11A0 1o00 11A0 1o00 14o0 1lc0 14o0 1lc0 14o0 1o00 11A0 1o00 11A0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|66e4", - "America/Yakutat|YST YWT YPT YDT AKST AKDT|90 80 80 80 90 80|01203030303030303030303030303030304545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454|-17T10 8x00 iz0 Vo10 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 cn0 10q0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|642", - "America/Yellowknife|-00 MST MWT MPT MDDT MDT|0 70 60 60 50 60|012314151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151515151|-1pdA0 hix0 8x20 ix0 LCL0 1fA0 zgO0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|19e3", - "Antarctica/Casey|-00 +08 +11|0 -80 -b0|0121212121212|-2q00 1DjS0 T90 40P0 KL0 blz0 3m10 1o30 14k0 1kr0 12l0 1o01|10", - "Antarctica/Davis|-00 +07 +05|0 -70 -50|01012121|-vyo0 iXt0 alj0 1D7v0 VB0 3Wn0 KN0|70", - "Antarctica/DumontDUrville|-00 +10|0 -a0|0101|-U0o0 cfq0 bFm0|80", - "Antarctica/Macquarie|AEST AEDT -00|-a0 -b0 0|010201010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101|-29E80 1a00 4SK0 1ayy0 Lvs0 1cM0 1o00 Rc0 1wo0 Rc0 1wo0 U00 1wo0 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 11A0 1qM0 WM0 1qM0 Oo0 1zc0 Oo0 1zc0 Oo0 1wo0 WM0 1tA0 WM0 1tA0 U00 1tA0 U00 1tA0 11A0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 11A0 1o00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1cM0 1a00 1io0 1cM0 1cM0 1cM0 1cM0 3Co0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0|1", - "Antarctica/Mawson|-00 +06 +05|0 -60 -50|012|-CEo0 2fyk0|60", - "Pacific/Auckland|NZMT NZST NZST NZDT|-bu -cu -c0 -d0|01020202020202020202020202023232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323|-1GCVu Lz0 1tB0 11zu 1o0u 11zu 1o0u 11zu 1o0u 14nu 1lcu 14nu 1lcu 1lbu 11Au 1nXu 11Au 1nXu 11Au 1nXu 11Au 1nXu 11Au 1qLu WMu 1qLu 11Au 1n1bu IM0 1C00 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1qM0 14o0 1lc0 14o0 1lc0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1io0 17c0 1lc0 14o0 1lc0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1lc0 14o0 1lc0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1io0 17c0 1io0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00|14e5", - "Antarctica/Palmer|-00 -03 -04 -02|0 30 40 20|0121212121213121212121212121212121212121212121212121212121212121212121212121212121|-cao0 nD0 1vd0 SL0 1vd0 17z0 1cN0 1fz0 1cN0 1cL0 1cN0 asn0 Db0 jsN0 14N0 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 1cL0 1cN0 11z0 1o10 11z0 1qN0 WL0 1fB0 19X0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1ip0 1fz0 1fB0 11z0 1qN0 WL0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1o10 19X0 1fB0 1nX0 G10 1EL0 Op0 1zb0 Rd0 1wn0 Rd0 46n0 Ap0|40", - "Antarctica/Rothera|-00 -03|0 30|01|gOo0|130", - "Antarctica/Syowa|-00 +03|0 -30|01|-vs00|20", - "Antarctica/Troll|-00 +00 +02|0 0 -20|01212121212121212121212121212121212121212121212121212121212121212121|1puo0 hd0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|40", - "Antarctica/Vostok|-00 +06|0 -60|01|-tjA0|25", - "Europe/Oslo|CET CEST|-10 -20|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2awM0 Qm0 W6o0 5pf0 WM0 1fA0 1cM0 1cM0 1cM0 1cM0 wJc0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1qM0 WM0 zpc0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|62e4", - "Asia/Riyadh|LMT +03|-36.Q -30|01|-TvD6.Q|57e5", - "Asia/Almaty|LMT +05 +06 +07|-57.M -50 -60 -70|012323232323232323232321232323232323232323232323232|-1Pc57.M eUo7.M 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0|15e5", - "Asia/Amman|LMT EET EEST|-2n.I -20 -30|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1yW2n.I 1HiMn.I KL0 1oN0 11b0 1oN0 11b0 1pd0 1dz0 1cp0 11b0 1op0 11b0 fO10 1db0 1e10 1cL0 1cN0 1cL0 1cN0 1fz0 1pd0 10n0 1ld0 14n0 1hB0 15b0 1ip0 19X0 1cN0 1cL0 1cN0 17b0 1ld0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1So0 y00 1fc0 1dc0 1co0 1dc0 1cM0 1cM0 1cM0 1o00 11A0 1lc0 17c0 1cM0 1cM0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 4bX0 Dd0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|25e5", - "Asia/Anadyr|LMT +12 +13 +14 +11|-bN.U -c0 -d0 -e0 -b0|01232121212121212121214121212121212121212121212121212121212141|-1PcbN.U eUnN.U 23CL0 1db0 2q10 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 2sp0 WM0|13e3", - "Asia/Aqtau|LMT +04 +05 +06|-3l.4 -40 -50 -60|012323232323232323232123232312121212121212121212|-1Pc3l.4 eUnl.4 24PX0 2pX0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cN0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0|15e4", - "Asia/Aqtobe|LMT +04 +05 +06|-3M.E -40 -50 -60|0123232323232323232321232323232323232323232323232|-1Pc3M.E eUnM.E 23CL0 3Db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0|27e4", - "Asia/Ashgabat|LMT +04 +05 +06|-3R.w -40 -50 -60|0123232323232323232323212|-1Pc3R.w eUnR.w 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0|41e4", - "Asia/Atyrau|LMT +03 +05 +06 +04|-3r.I -30 -50 -60 -40|01232323232323232323242323232323232324242424242|-1Pc3r.I eUor.I 24PW0 2pX0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 2sp0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0|", - "Asia/Baghdad|BMT +03 +04|-2V.A -30 -40|012121212121212121212121212121212121212121212121212121|-26BeV.A 2ACnV.A 11b0 1cp0 1dz0 1dd0 1db0 1cN0 1cp0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1de0 1dc0 1dc0 1dc0 1cM0 1dc0 1cM0 1dc0 1cM0 1dc0 1dc0 1dc0 1cM0 1dc0 1cM0 1dc0 1cM0 1dc0 1dc0 1dc0 1cM0 1dc0 1cM0 1dc0 1cM0 1dc0 1dc0 1dc0 1cM0 1dc0 1cM0 1dc0 1cM0 1dc0|66e5", - "Asia/Qatar|LMT +04 +03|-3q.8 -40 -30|012|-21Jfq.8 27BXq.8|96e4", - "Asia/Baku|LMT +03 +04 +05|-3j.o -30 -40 -50|01232323232323232323232123232323232323232323232323232323232323232|-1Pc3j.o 1jUoj.o WCL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 1cM0 9Je0 1o00 11z0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00|27e5", - "Asia/Bangkok|BMT +07|-6G.4 -70|01|-218SG.4|15e6", - "Asia/Barnaul|LMT +06 +07 +08|-5z -60 -70 -80|0123232323232323232323212323232321212121212121212121212121212121212|-21S5z pCnz 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 p90 LE0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3rd0|", - "Asia/Beirut|EET EEST|-20 -30|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-21aq0 1on0 1410 1db0 19B0 1in0 1ip0 WL0 1lQp0 11b0 1oN0 11b0 1oN0 11b0 1pd0 11b0 1oN0 11b0 q6N0 En0 1oN0 11b0 1oN0 11b0 1oN0 11b0 1pd0 11b0 1oN0 11b0 1op0 11b0 dA10 17b0 1iN0 17b0 1iN0 17b0 1iN0 17b0 1vB0 SL0 1mp0 13z0 1iN0 17b0 1iN0 17b0 1jd0 12n0 1a10 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0|22e5", - "Asia/Bishkek|LMT +05 +06 +07|-4W.o -50 -60 -70|012323232323232323232321212121212121212121212121212|-1Pc4W.o eUnW.o 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2e00 1tX0 17b0 1ip0 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1cPu 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0|87e4", - "Asia/Brunei|LMT +0730 +08|-7D.E -7u -80|012|-1KITD.E gDc9.E|42e4", - "Asia/Kolkata|MMT IST +0630|-5l.a -5u -6u|012121|-2zOtl.a 1r2LP.a 1un0 HB0 7zX0|15e6", - "Asia/Chita|LMT +08 +09 +10|-7x.Q -80 -90 -a0|012323232323232323232321232323232323232323232323232323232323232312|-21Q7x.Q pAnx.Q 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3re0|33e4", - "Asia/Choibalsan|LMT +07 +08 +10 +09|-7C -70 -80 -a0 -90|0123434343434343434343434343434343434343434343424242|-2APHC 2UkoC cKn0 1da0 1dd0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 6hD0 11z0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 3Db0 h1f0 1cJ0 1cP0 1cJ0|38e3", - "Asia/Shanghai|CST CDT|-80 -90|01010101010101010101010101010|-23uw0 18n0 OjB0 Rz0 11d0 1wL0 A10 8HX0 1G10 Tz0 1ip0 1jX0 1cN0 11b0 1oN0 aL0 1tU30 Rb0 1o10 11z0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0|23e6", - "Asia/Colombo|MMT +0530 +06 +0630|-5j.w -5u -60 -6u|01231321|-2zOtj.w 1rFbN.w 1zzu 7Apu 23dz0 11zu n3cu|22e5", - "Asia/Dhaka|HMT +0630 +0530 +06 +07|-5R.k -6u -5u -60 -70|0121343|-18LFR.k 1unn.k HB0 m6n0 2kxbu 1i00|16e6", - "Asia/Damascus|LMT EET EEST|-2p.c -20 -30|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-21Jep.c Hep.c 17b0 1ip0 17b0 1ip0 17b0 1ip0 19X0 1xRB0 11X0 1oN0 10L0 1pB0 11b0 1oN0 10L0 1mp0 13X0 1oN0 11b0 1pd0 11b0 1oN0 11b0 1oN0 11b0 1oN0 11b0 1pd0 11b0 1oN0 11b0 1oN0 11b0 1oN0 11b0 1pd0 11b0 1oN0 Nb0 1AN0 Nb0 bcp0 19X0 1gp0 19X0 3ld0 1xX0 Vd0 1Bz0 Sp0 1vX0 10p0 1dz0 1cN0 1cL0 1db0 1db0 1g10 1an0 1ap0 1db0 1fd0 1db0 1cN0 1db0 1dd0 1db0 1cp0 1dz0 1c10 1dX0 1cN0 1db0 1dd0 1db0 1cN0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1db0 1cN0 1db0 1cN0 19z0 1fB0 1qL0 11B0 1on0 Wp0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0|26e5", - "Asia/Dili|LMT +08 +09|-8m.k -80 -90|01212|-2le8m.k 1dnXm.k 1nfA0 Xld0|19e4", - "Asia/Dubai|LMT +04|-3F.c -40|01|-21JfF.c|39e5", - "Asia/Dushanbe|LMT +05 +06 +07|-4z.c -50 -60 -70|012323232323232323232321|-1Pc4z.c eUnz.c 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2hB0|76e4", - "Asia/Famagusta|LMT EET EEST +03|-2f.M -20 -30 -30|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212312121212121212121212121212121212121212121|-1Vc2f.M 2a3cf.M 1cL0 1qp0 Xz0 19B0 19X0 1fB0 1db0 1cp0 1cL0 1fB0 19X0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1o30 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 15U0 2Ks0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|", - "Asia/Gaza|EET EEST IST IDT|-20 -30 -20 -30|010101010101010101010101010101010123232323232323232323232323232320101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-1c2o0 MM0 iM0 4JA0 10o0 1pA0 10M0 1pA0 16o0 1jA0 16o0 1jA0 pBa0 Vz0 1oN0 11b0 1oO0 10N0 1pz0 10N0 1pb0 10N0 1pb0 10N0 1pb0 10N0 1pz0 10N0 1pb0 10N0 1pb0 11d0 1oL0 dW0 hfB0 Db0 1fB0 Rb0 bXB0 gM0 8Q00 IM0 1wo0 TX0 1HB0 IL0 1s10 10n0 1o10 WL0 1zd0 On0 1ld0 11z0 1o10 14n0 1o10 14n0 1nd0 12n0 1nd0 Xz0 1q10 12n0 M10 C00 17c0 1io0 17c0 1io0 17c0 1o00 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 17c0 1io0 18N0 1bz0 19z0 1gp0 1610 1iL0 11z0 1o10 14o0 1lA1 SKX 1xd1 MKX 1AN0 1a00 1fA0 1cL0 1cN0 1nX0 1210 1nA0 1210 1qL0 WN0 1qL0 WN0 1qL0 11c0 1on0 11B0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|18e5", - "Asia/Hebron|EET EEST IST IDT|-20 -30 -20 -30|01010101010101010101010101010101012323232323232323232323232323232010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-1c2o0 MM0 iM0 4JA0 10o0 1pA0 10M0 1pA0 16o0 1jA0 16o0 1jA0 pBa0 Vz0 1oN0 11b0 1oO0 10N0 1pz0 10N0 1pb0 10N0 1pb0 10N0 1pb0 10N0 1pz0 10N0 1pb0 10N0 1pb0 11d0 1oL0 dW0 hfB0 Db0 1fB0 Rb0 bXB0 gM0 8Q00 IM0 1wo0 TX0 1HB0 IL0 1s10 10n0 1o10 WL0 1zd0 On0 1ld0 11z0 1o10 14n0 1o10 14n0 1nd0 12n0 1nd0 Xz0 1q10 12n0 M10 C00 17c0 1io0 17c0 1io0 17c0 1o00 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 17c0 1io0 18N0 1bz0 19z0 1gp0 1610 1iL0 12L0 1mN0 14o0 1lc0 Tb0 1xd1 MKX bB0 cn0 1cN0 1a00 1fA0 1cL0 1cN0 1nX0 1210 1nA0 1210 1qL0 WN0 1qL0 WN0 1qL0 11c0 1on0 11B0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|25e4", - "Asia/Ho_Chi_Minh|LMT PLMT +07 +08 +09|-76.E -76.u -70 -80 -90|0123423232|-2yC76.E bK00.a 1h7b6.u 5lz0 18o0 3Oq0 k5b0 aW00 BAM0|90e5", - "Asia/Hong_Kong|LMT HKT HKST HKWT JST|-7A.G -80 -90 -8u -90|0123412121212121212121212121212121212121212121212121212121212121212121|-2CFH0 1taO0 Hc0 xUu 9tBu 11z0 1tDu Rc0 1wo0 11A0 1cM0 11A0 1o00 11A0 1o00 11A0 1o00 14o0 1o00 11A0 1nX0 U10 1tz0 U10 1wn0 Rd0 1wn0 U10 1tz0 U10 1tz0 U10 1tz0 U10 1wn0 Rd0 1wn0 Rd0 1wn0 U10 1tz0 U10 1tz0 17d0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 s10 1Vz0 1cN0 1cL0 1cN0 1cL0 6fd0 14n0|73e5", - "Asia/Hovd|LMT +06 +07 +08|-66.A -60 -70 -80|012323232323232323232323232323232323232323232323232|-2APG6.A 2Uko6.A cKn0 1db0 1dd0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 6hD0 11z0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 kEp0 1cJ0 1cP0 1cJ0|81e3", - "Asia/Irkutsk|IMT +07 +08 +09|-6V.5 -70 -80 -90|01232323232323232323232123232323232323232323232323232323232323232|-21zGV.5 pjXV.5 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|60e4", - "Europe/Istanbul|IMT EET EEST +03 +04|-1U.U -20 -30 -30 -40|0121212121212121212121212121212121212121212121234312121212121212121212121212121212121212121212121212121212121212123|-2ogNU.U dzzU.U 11b0 8tB0 1on0 1410 1db0 19B0 1in0 3Rd0 Un0 1oN0 11b0 zSN0 CL0 mp0 1Vz0 1gN0 8yn0 1yp0 ML0 1kp0 17b0 1ip0 17b0 1fB0 19X0 1ip0 19X0 1ip0 17b0 qdB0 38L0 1jd0 Tz0 l6O0 11A0 WN0 1qL0 TB0 1tX0 U10 1tz0 11B0 1in0 17d0 z90 cne0 pb0 2Cp0 1800 14o0 1dc0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1a00 1fA0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WO0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 Xc0 1qo0 WM0 1qM0 11A0 1o00 1200 1nA0 11A0 1tA0 U00 15w0|13e6", - "Asia/Jakarta|BMT +0720 +0730 +09 +08 WIB|-77.c -7k -7u -90 -80 -70|01232425|-1Q0Tk luM0 mPzO 8vWu 6kpu 4PXu xhcu|31e6", - "Asia/Jayapura|LMT +09 +0930 WIT|-9m.M -90 -9u -90|0123|-1uu9m.M sMMm.M L4nu|26e4", - "Asia/Jerusalem|JMT IST IDT IDDT|-2k.E -20 -30 -40|01212121212121321212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-26Bek.E SyOk.E MM0 iM0 4JA0 10o0 1pA0 10M0 1pA0 16o0 1jA0 16o0 1jA0 3LA0 Eo0 oo0 1co0 1dA0 16o0 10M0 1jc0 1tA0 14o0 1cM0 1a00 11A0 1Nc0 Ao0 1Nc0 Ao0 1Ko0 LA0 1o00 WM0 EQK0 Db0 1fB0 Rb0 bXB0 gM0 8Q00 IM0 1wo0 TX0 1HB0 IL0 1s10 10n0 1o10 WL0 1zd0 On0 1ld0 11z0 1o10 14n0 1o10 14n0 1nd0 12n0 1nd0 Xz0 1q10 12n0 1hB0 1dX0 1ep0 1aL0 1eN0 17X0 1nf0 11z0 1tB0 19W0 1e10 17b0 1ep0 1gL0 18N0 1fz0 1eN0 17b0 1gq0 1gn0 19d0 1dz0 1c10 17X0 1hB0 1gn0 19d0 1dz0 1c10 17X0 1kp0 1dz0 1c10 1aL0 1eN0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0 10N0 1rz0 W10 1rz0 W10 1rz0 W10 1rz0 10N0 1oL0 10N0 1oL0|81e4", - "Asia/Kabul|+04 +0430|-40 -4u|01|-10Qs0|46e5", - "Asia/Kamchatka|LMT +11 +12 +13|-ay.A -b0 -c0 -d0|012323232323232323232321232323232323232323232323232323232323212|-1SLKy.A ivXy.A 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 2sp0 WM0|18e4", - "Asia/Karachi|LMT +0530 +0630 +05 PKT PKST|-4s.c -5u -6u -50 -50 -60|012134545454|-2xoss.c 1qOKW.c 7zX0 eup0 LqMu 1fy00 1cL0 dK10 11b0 1610 1jX0|24e6", - "Asia/Urumqi|LMT +06|-5O.k -60|01|-1GgtO.k|32e5", - "Asia/Kathmandu|LMT +0530 +0545|-5F.g -5u -5J|012|-21JhF.g 2EGMb.g|12e5", - "Asia/Khandyga|LMT +08 +09 +10 +11|-92.d -80 -90 -a0 -b0|0123232323232323232323212323232323232323232323232343434343434343432|-21Q92.d pAp2.d 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 qK0 yN0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 17V0 7zD0|66e2", - "Asia/Krasnoyarsk|LMT +06 +07 +08|-6b.q -60 -70 -80|01232323232323232323232123232323232323232323232323232323232323232|-21Hib.q prAb.q 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|10e5", - "Asia/Kuala_Lumpur|SMT +07 +0720 +0730 +09 +08|-6T.p -70 -7k -7u -90 -80|0123435|-2Bg6T.p 17anT.p l5XE 17bO 8Fyu 1so1u|71e5", - "Asia/Kuching|LMT +0730 +08 +0820 +09|-7l.k -7u -80 -8k -90|0123232323232323242|-1KITl.k gDbP.k 6ynu AnE 1O0k AnE 1NAk AnE 1NAk AnE 1NAk AnE 1O0k AnE 1NAk AnE pAk 8Fz0|13e4", - "Asia/Macau|LMT CST +09 +10 CDT|-7y.a -80 -90 -a0 -90|012323214141414141414141414141414141414141414141414141414141414141414141|-2CFHy.a 1uqKy.a PX0 1kn0 15B0 11b0 4Qq0 1oM0 11c0 1ko0 1u00 11A0 1cM0 11c0 1o00 11A0 1o00 11A0 1oo0 1400 1o00 11A0 1o00 U00 1tA0 U00 1wo0 Rc0 1wru U10 1tz0 U10 1tz0 U10 1tz0 U10 1wn0 Rd0 1wn0 Rd0 1wn0 U10 1tz0 U10 1tz0 17d0 1cK0 1cO0 1cK0 1cO0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 s10 1Vz0 1cN0 1cL0 1cN0 1cL0 6fd0 14n0|57e4", - "Asia/Magadan|LMT +10 +11 +12|-a3.c -a0 -b0 -c0|012323232323232323232321232323232323232323232323232323232323232312|-1Pca3.c eUo3.c 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3Cq0|95e3", - "Asia/Makassar|LMT MMT +08 +09 WITA|-7V.A -7V.A -80 -90 -80|01234|-21JjV.A vfc0 myLV.A 8ML0|15e5", - "Asia/Manila|PST PDT JST|-80 -90 -90|010201010|-1kJI0 AL0 cK10 65X0 mXB0 vX0 VK10 1db0|24e6", - "Asia/Nicosia|LMT EET EEST|-2d.s -20 -30|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1Vc2d.s 2a3cd.s 1cL0 1qp0 Xz0 19B0 19X0 1fB0 1db0 1cp0 1cL0 1fB0 19X0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1o30 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|32e4", - "Asia/Novokuznetsk|LMT +06 +07 +08|-5M.M -60 -70 -80|012323232323232323232321232323232323232323232323232323232323212|-1PctM.M eULM.M 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 2sp0 WM0|55e4", - "Asia/Novosibirsk|LMT +06 +07 +08|-5v.E -60 -70 -80|0123232323232323232323212323212121212121212121212121212121212121212|-21Qnv.E pAFv.E 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 ml0 Os0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 4eN0|15e5", - "Asia/Omsk|LMT +05 +06 +07|-4R.u -50 -60 -70|01232323232323232323232123232323232323232323232323232323232323232|-224sR.u pMLR.u 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|12e5", - "Asia/Oral|LMT +03 +05 +06 +04|-3p.o -30 -50 -60 -40|01232323232323232424242424242424242424242424242|-1Pc3p.o eUop.o 23CK0 3Db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1fA0 1cM0 1cM0 IM0 1EM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0|27e4", - "Asia/Pontianak|LMT PMT +0730 +09 +08 WITA WIB|-7h.k -7h.k -7u -90 -80 -80 -70|012324256|-2ua7h.k XE00 munL.k 8Rau 6kpu 4PXu xhcu Wqnu|23e4", - "Asia/Pyongyang|LMT KST JST KST|-8n -8u -90 -90|012313|-2um8n 97XR 1lTzu 2Onc0 6BA0|29e5", - "Asia/Qostanay|LMT +04 +05 +06|-4e.s -40 -50 -60|012323232323232323232123232323232323232323232323|-1Pc4e.s eUoe.s 23CL0 3Db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0|", - "Asia/Qyzylorda|LMT +04 +05 +06|-4l.Q -40 -50 -60|01232323232323232323232323232323232323232323232|-1Pc4l.Q eUol.Q 23CL0 3Db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 3ao0 1EM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 zQl0|73e4", - "Asia/Rangoon|RMT +0630 +09|-6o.L -6u -90|0121|-21Jio.L SmnS.L 7j9u|48e5", - "Asia/Sakhalin|LMT +09 +11 +12 +10|-9u.M -90 -b0 -c0 -a0|01232323232323232323232423232323232424242424242424242424242424242|-2AGVu.M 1BoMu.M 1qFa0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 2pB0 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3rd0|58e4", - "Asia/Samarkand|LMT +04 +05 +06|-4r.R -40 -50 -60|01232323232323232323232|-1Pc4r.R eUor.R 23CL0 3Db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0|36e4", - "Asia/Seoul|LMT KST JST KST KDT KDT|-8r.Q -8u -90 -90 -a0 -9u|012343434343151515151515134343|-2um8r.Q 97XV.Q 1m1zu 6CM0 Fz0 1kN0 14n0 1kN0 14L0 1zd0 On0 69B0 2I0u OL0 1FB0 Rb0 1qN0 TX0 1tB0 TX0 1tB0 TX0 1tB0 TX0 2ap0 12FBu 11A0 1o00 11A0|23e6", - "Asia/Srednekolymsk|LMT +10 +11 +12|-ae.Q -a0 -b0 -c0|01232323232323232323232123232323232323232323232323232323232323232|-1Pcae.Q eUoe.Q 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|35e2", - "Asia/Taipei|CST JST CDT|-80 -90 -90|01020202020202020202020202020202020202020|-1iw80 joM0 1yo0 Tz0 1ip0 1jX0 1cN0 11b0 1oN0 11b0 1oN0 11b0 1oN0 11b0 10N0 1BX0 10p0 1pz0 10p0 1pz0 10p0 1db0 1dd0 1db0 1cN0 1db0 1cN0 1db0 1cN0 1db0 1BB0 ML0 1Bd0 ML0 uq10 1db0 1cN0 1db0 97B0 AL0|74e5", - "Asia/Tashkent|LMT +05 +06 +07|-4B.b -50 -60 -70|012323232323232323232321|-1Pc4B.b eUnB.b 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0|23e5", - "Asia/Tbilisi|TBMT +03 +04 +05|-2X.b -30 -40 -50|0123232323232323232323212121232323232323232323212|-1Pc2X.b 1jUnX.b WCL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 1cK0 1cL0 1cN0 1cL0 1cN0 2pz0 1cL0 1fB0 3Nz0 11B0 1nX0 11B0 1qL0 WN0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 An0 Os0 WM0|11e5", - "Asia/Tehran|LMT TMT +0330 +04 +05 +0430|-3p.I -3p.I -3u -40 -50 -4u|01234325252525252525252525252525252525252525252525252525252525252525252525252525252525252525252525252|-2btDp.I 1d3c0 1huLT.I TXu 1pz0 sN0 vAu 1cL0 1dB0 1en0 pNB0 UL0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 64p0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0 1cN0 1dz0 1cp0 1dz0 1cp0 1dz0 1cp0 1dz0|14e6", - "Asia/Thimphu|LMT +0530 +06|-5W.A -5u -60|012|-Su5W.A 1BGMs.A|79e3", - "Asia/Tokyo|JST JDT|-90 -a0|010101010|-QJJ0 Rc0 1lc0 14o0 1zc0 Oo0 1zc0 Oo0|38e6", - "Asia/Tomsk|LMT +06 +07 +08|-5D.P -60 -70 -80|0123232323232323232323212323232323232323232323212121212121212121212|-21NhD.P pxzD.P 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 co0 1bB0 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3Qp0|10e5", - "Asia/Ulaanbaatar|LMT +07 +08 +09|-77.w -70 -80 -90|012323232323232323232323232323232323232323232323232|-2APH7.w 2Uko7.w cKn0 1db0 1dd0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 6hD0 11z0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 kEp0 1cJ0 1cP0 1cJ0|12e5", - "Asia/Ust-Nera|LMT +08 +09 +12 +11 +10|-9w.S -80 -90 -c0 -b0 -a0|012343434343434343434345434343434343434343434343434343434343434345|-21Q9w.S pApw.S 23CL0 1d90 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 17V0 7zD0|65e2", - "Asia/Vladivostok|LMT +09 +10 +11|-8L.v -90 -a0 -b0|01232323232323232323232123232323232323232323232323232323232323232|-1SJIL.v itXL.v 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|60e4", - "Asia/Yakutsk|LMT +08 +09 +10|-8C.W -80 -90 -a0|01232323232323232323232123232323232323232323232323232323232323232|-21Q8C.W pAoC.W 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|28e4", - "Asia/Yekaterinburg|LMT PMT +04 +05 +06|-42.x -3J.5 -40 -50 -60|012343434343434343434343234343434343434343434343434343434343434343|-2ag42.x 7mQh.s qBvJ.5 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|14e5", - "Asia/Yerevan|LMT +03 +04 +05|-2W -30 -40 -50|0123232323232323232323212121212323232323232323232323232323232|-1Pc2W 1jUnW WCL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 2pB0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 4RX0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0|13e5", - "Atlantic/Azores|HMT -02 -01 +00 WET|1S.w 20 10 0 0|01212121212121212121212121212121212121212121232123212321232121212121212121212121212121212121212121232323232323232323232323232323234323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-2ldW0 aPX0 Sp0 LX0 1vc0 Tc0 1uM0 SM0 1vc0 Tc0 1vc0 SM0 1vc0 6600 1co0 3E00 17c0 1fA0 1a00 1io0 1a00 1io0 17c0 3I00 17c0 1cM0 1cM0 3Fc0 1cM0 1a00 1fA0 1io0 17c0 1cM0 1cM0 1a00 1fA0 1io0 1qM0 Dc0 1tA0 1cM0 1dc0 1400 gL0 IM0 s10 U00 dX0 Rc0 pd0 Rc0 gL0 Oo0 pd0 Rc0 gL0 Oo0 pd0 14o0 1cM0 1cP0 1cM0 1cM0 1cM0 1cM0 1cM0 3Co0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 qIl0 1cM0 1fA0 1cM0 1cM0 1cN0 1cL0 1cN0 1cM0 1cM0 1cM0 1cM0 1cN0 1cL0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cL0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|25e4", - "Atlantic/Bermuda|BMT BST AST ADT|4j.i 3j.i 40 30|010102323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-28p7E.G 1bb0 1i10 11X0 ru30 thbE.G 1PX0 11B0 1tz0 Rd0 1zb0 Op0 1zb0 3I10 Lz0 1EN0 FX0 1HB0 FX0 1Kp0 Db0 1Kp0 Db0 1Kp0 FX0 93d0 11z0 GAp0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|65e3", - "Atlantic/Canary|LMT -01 WET WEST|11.A 10 0 -10|01232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-1UtaW.o XPAW.o 1lAK0 1a10 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|54e4", - "Atlantic/Cape_Verde|LMT -02 -01|1y.4 20 10|01212|-2ldW0 1eEo0 7zX0 1djf0|50e4", - "Atlantic/Faroe|LMT WET WEST|r.4 0 -10|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2uSnw.U 2Wgow.U 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|49e3", - "Atlantic/Madeira|FMT -01 +00 +01 WET WEST|17.A 10 0 -10 0 -10|01212121212121212121212121212121212121212121232123212321232121212121212121212121212121212121212121454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454|-2ldX0 aPX0 Sp0 LX0 1vc0 Tc0 1uM0 SM0 1vc0 Tc0 1vc0 SM0 1vc0 6600 1co0 3E00 17c0 1fA0 1a00 1io0 1a00 1io0 17c0 3I00 17c0 1cM0 1cM0 3Fc0 1cM0 1a00 1fA0 1io0 17c0 1cM0 1cM0 1a00 1fA0 1io0 1qM0 Dc0 1tA0 1cM0 1dc0 1400 gL0 IM0 s10 U00 dX0 Rc0 pd0 Rc0 gL0 Oo0 pd0 Rc0 gL0 Oo0 pd0 14o0 1cM0 1cP0 1cM0 1cM0 1cM0 1cM0 1cM0 3Co0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 qIl0 1cM0 1fA0 1cM0 1cM0 1cN0 1cL0 1cN0 1cM0 1cM0 1cM0 1cM0 1cN0 1cL0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|27e4", - "Atlantic/Reykjavik|LMT -01 +00 GMT|1s 10 0 0|012121212121212121212121212121212121212121212121212121212121212121213|-2uWmw mfaw 1Bd0 ML0 1LB0 Cn0 1LB0 3fX0 C10 HrX0 1cO0 LB0 1EL0 LA0 1C00 Oo0 1wo0 Rc0 1wo0 Rc0 1wo0 Rc0 1zc0 Oo0 1zc0 14o0 1lc0 14o0 1lc0 14o0 1o00 11A0 1lc0 14o0 1o00 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1o00 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1o00 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1lc0 14o0 1o00 14o0|12e4", - "Atlantic/South_Georgia|-02|20|0||30", - "Atlantic/Stanley|SMT -04 -03 -02|3P.o 40 30 20|012121212121212323212121212121212121212121212121212121212121212121212|-2kJw8.A 12bA8.A 19X0 1fB0 19X0 1ip0 19X0 1fB0 19X0 1fB0 19X0 1fB0 Cn0 1Cc10 WL0 1qL0 U10 1tz0 2mN0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1tz0 U10 1tz0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1tz0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qL0 WN0 1qN0 U10 1wn0 Rd0 1wn0 U10 1tz0 U10 1tz0 U10 1tz0 U10 1tz0 U10 1wn0 U10 1tz0 U10 1tz0 U10|21e2", - "Australia/Sydney|AEST AEDT|-a0 -b0|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101|-293k0 xc0 10jc0 yM0 1cM0 1cM0 1fA0 1a00 17c00 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 14o0 1o00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 U00 1qM0 WM0 1tA0 WM0 1tA0 U00 1tA0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 11A0 1o00 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 WM0 1qM0 14o0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0|40e5", - "Australia/Adelaide|ACST ACDT|-9u -au|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101|-293ju xc0 10jc0 yM0 1cM0 1cM0 1fA0 1a00 17c00 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 U00 1qM0 WM0 1tA0 WM0 1tA0 U00 1tA0 U00 1tA0 Oo0 1zc0 WM0 1qM0 Rc0 1zc0 U00 1tA0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 WM0 1qM0 14o0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0|11e5", - "Australia/Brisbane|AEST AEDT|-a0 -b0|01010101010101010|-293k0 xc0 10jc0 yM0 1cM0 1cM0 1fA0 1a00 17c00 LA0 H1A0 Oo0 1zc0 Oo0 1zc0 Oo0|20e5", - "Australia/Broken_Hill|ACST ACDT|-9u -au|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101|-293ju xc0 10jc0 yM0 1cM0 1cM0 1fA0 1a00 17c00 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 14o0 1o00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 U00 1qM0 WM0 1tA0 WM0 1tA0 U00 1tA0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 WM0 1qM0 14o0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0|18e3", - "Australia/Hobart|AEST AEDT|-a0 -b0|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101|-29E80 1a00 1qM0 Oo0 1zc0 Oo0 TAo0 yM0 1cM0 1cM0 1fA0 1a00 VfA0 1cM0 1o00 Rc0 1wo0 Rc0 1wo0 U00 1wo0 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 11A0 1qM0 WM0 1qM0 Oo0 1zc0 Oo0 1zc0 Oo0 1wo0 WM0 1tA0 WM0 1tA0 U00 1tA0 U00 1tA0 11A0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 11A0 1o00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1cM0 1a00 1io0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0|21e4", - "Australia/Darwin|ACST ACDT|-9u -au|010101010|-293ju xc0 10jc0 yM0 1cM0 1cM0 1fA0 1a00|12e4", - "Australia/Eucla|+0845 +0945|-8J -9J|0101010101010101010|-293iJ xc0 10jc0 yM0 1cM0 1cM0 1gSo0 Oo0 l5A0 Oo0 iJA0 G00 zU00 IM0 1qM0 11A0 1o00 11A0|368", - "Australia/Lord_Howe|AEST +1030 +1130 +11|-a0 -au -bu -b0|0121212121313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313131313|raC0 1zdu Rb0 1zd0 On0 1zd0 On0 1zd0 On0 1zd0 TXu 1qMu WLu 1tAu WLu 1tAu TXu 1tAu Onu 1zcu Onu 1zcu Onu 1zcu Rbu 1zcu Onu 1zcu Onu 1zcu 11zu 1o0u 11zu 1o0u 11zu 1o0u 11zu 1qMu WLu 11Au 1nXu 1qMu 11zu 1o0u 11zu 1o0u 11zu 1qMu WLu 1qMu 11zu 1o0u WLu 1qMu 14nu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1fzu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1cMu 1cLu 1fAu 1cLu 1cMu 1cLu 1cMu|347", - "Australia/Lindeman|AEST AEDT|-a0 -b0|010101010101010101010|-293k0 xc0 10jc0 yM0 1cM0 1cM0 1fA0 1a00 17c00 LA0 H1A0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0|10", - "Australia/Melbourne|AEST AEDT|-a0 -b0|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101|-293k0 xc0 10jc0 yM0 1cM0 1cM0 1fA0 1a00 17c00 LA0 1C00 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 U00 1qM0 WM0 1qM0 11A0 1tA0 U00 1tA0 U00 1tA0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 11A0 1o00 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 WM0 1qM0 14o0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0|39e5", - "Australia/Perth|AWST AWDT|-80 -90|0101010101010101010|-293i0 xc0 10jc0 yM0 1cM0 1cM0 1gSo0 Oo0 l5A0 Oo0 iJA0 G00 zU00 IM0 1qM0 11A0 1o00 11A0|18e5", - "CET|CET CEST|-10 -20|01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2aFe0 11d0 1iO0 11A0 1o00 11A0 Qrc0 6i00 WM0 1fA0 1cM0 1cM0 1cM0 16M0 1gMM0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|", - "Pacific/Easter|EMT -07 -06 -05|7h.s 70 60 50|012121212121212121212121212123232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323|-1uSgG.w 1s4IG.w WL0 1zd0 On0 1ip0 11z0 1o10 11z0 1qN0 WL0 1ld0 14n0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 2pA0 11z0 1o10 11z0 1qN0 WL0 1qN0 WL0 1qN0 1cL0 1cN0 11z0 1o10 11z0 1qN0 WL0 1fB0 19X0 1qN0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1ip0 1fz0 1fB0 11z0 1qN0 WL0 1qN0 WL0 1qN0 WL0 1qN0 11z0 1o10 11z0 1o10 11z0 1qN0 WL0 1qN0 17b0 1ip0 11z0 1o10 19X0 1fB0 1nX0 G10 1EL0 Op0 1zb0 Rd0 1wn0 Rd0 46n0 Ap0 1Nb0 Ap0 1Nb0 Ap0 1zb0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1nX0 11B0 1qL0 WN0 1qL0 11B0 1nX0 11B0|30e2", - "CST6CDT|CST CDT CWT CPT|60 50 50 50|010102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261s0 1nX0 11B0 1nX0 SgN0 8x30 iw0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|", - "EET|EET EEST|-20 -30|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|hDB0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|", - "Europe/Dublin|DMT IST GMT BST IST|p.l -y.D 0 -10 -10|01232323232324242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242424242|-2ax9y.D Rc0 1fzy.D 14M0 1fc0 1g00 1co0 1dc0 1co0 1oo0 1400 1dc0 19A0 1io0 1io0 WM0 1o00 14o0 1o00 17c0 1io0 17c0 1fA0 1a00 1lc0 17c0 1io0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1cM0 1io0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1a00 1io0 1qM0 Dc0 g600 14o0 1wo0 17c0 1io0 11A0 1o00 17c0 1fA0 1a00 1fA0 1cM0 1fA0 1a00 17c0 1fA0 1a00 1io0 17c0 1lc0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1a00 1a00 1qM0 WM0 1qM0 11A0 1o00 WM0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1tA0 IM0 90o0 U00 1tA0 U00 1tA0 U00 1tA0 U00 1tA0 WM0 1qM0 WM0 1qM0 WM0 1tA0 U00 1tA0 U00 1tA0 11z0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 14o0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|12e5", - "EST|EST|50|0||", - "EST5EDT|EST EDT EWT EPT|50 40 40 40|010102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261t0 1nX0 11B0 1nX0 SgN0 8x40 iv0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|", - "Etc/GMT-0|GMT|0|0||", - "Etc/GMT-1|+01|-10|0||", - "Pacific/Port_Moresby|+10|-a0|0||25e4", - "Etc/GMT-11|+11|-b0|0||", - "Pacific/Tarawa|+12|-c0|0||29e3", - "Etc/GMT-13|+13|-d0|0||", - "Etc/GMT-14|+14|-e0|0||", - "Etc/GMT-2|+02|-20|0||", - "Etc/GMT-3|+03|-30|0||", - "Etc/GMT-4|+04|-40|0||", - "Etc/GMT-5|+05|-50|0||", - "Etc/GMT-6|+06|-60|0||", - "Indian/Christmas|+07|-70|0||21e2", - "Etc/GMT-8|+08|-80|0||", - "Pacific/Palau|+09|-90|0||21e3", - "Etc/GMT+1|-01|10|0||", - "Etc/GMT+10|-10|a0|0||", - "Etc/GMT+11|-11|b0|0||", - "Etc/GMT+12|-12|c0|0||", - "Etc/GMT+3|-03|30|0||", - "Etc/GMT+4|-04|40|0||", - "Etc/GMT+5|-05|50|0||", - "Etc/GMT+6|-06|60|0||", - "Etc/GMT+7|-07|70|0||", - "Etc/GMT+8|-08|80|0||", - "Etc/GMT+9|-09|90|0||", - "Etc/UTC|UTC|0|0||", - "Europe/Amsterdam|AMT NST +0120 +0020 CEST CET|-j.w -1j.w -1k -k -20 -10|010101010101010101010101010101010101010101012323234545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545|-2aFcj.w 11b0 1iP0 11A0 1io0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1co0 1io0 1yo0 Pc0 1a00 1fA0 1Bc0 Mo0 1tc0 Uo0 1tA0 U00 1uo0 W00 1s00 VA0 1so0 Vc0 1sM0 UM0 1wo0 Rc0 1u00 Wo0 1rA0 W00 1s00 VA0 1sM0 UM0 1w00 fV0 BCX.w 1tA0 U00 1u00 Wo0 1sm0 601k WM0 1fA0 1cM0 1cM0 1cM0 16M0 1gMM0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|16e5", - "Europe/Andorra|WET CET CEST|0 -10 -20|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-UBA0 1xIN0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|79e3", - "Europe/Astrakhan|LMT +03 +04 +05|-3c.c -30 -40 -50|012323232323232323212121212121212121212121212121212121212121212|-1Pcrc.c eUMc.c 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1fA0 1cM0 3Co0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3rd0|10e5", - "Europe/Athens|AMT EET EEST CEST CET|-1y.Q -20 -30 -20 -10|012123434121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2a61x.Q CNbx.Q mn0 kU10 9b0 3Es0 Xa0 1fb0 1dd0 k3X0 Nz0 SCp0 1vc0 SO0 1cM0 1a00 1ao0 1fc0 1a10 1fG0 1cg0 1dX0 1bX0 1cQ0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|35e5", - "Europe/London|GMT BST BDST|0 -10 -20|0101010101010101010101010101010101010101010101010121212121210101210101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2axa0 Rc0 1fA0 14M0 1fc0 1g00 1co0 1dc0 1co0 1oo0 1400 1dc0 19A0 1io0 1io0 WM0 1o00 14o0 1o00 17c0 1io0 17c0 1fA0 1a00 1lc0 17c0 1io0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1cM0 1io0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1a00 1io0 1qM0 Dc0 2Rz0 Dc0 1zc0 Oo0 1zc0 Rc0 1wo0 17c0 1iM0 FA0 xB0 1fA0 1a00 14o0 bb0 LA0 xB0 Rc0 1wo0 11A0 1o00 17c0 1fA0 1a00 1fA0 1cM0 1fA0 1a00 17c0 1fA0 1a00 1io0 17c0 1lc0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1a00 1a00 1qM0 WM0 1qM0 11A0 1o00 WM0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1tA0 IM0 90o0 U00 1tA0 U00 1tA0 U00 1tA0 U00 1tA0 WM0 1qM0 WM0 1qM0 WM0 1tA0 U00 1tA0 U00 1tA0 11z0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1o00 14o0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|10e6", - "Europe/Belgrade|CET CEST|-10 -20|01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-19RC0 3IP0 WM0 1fA0 1cM0 1cM0 1rc0 Qo0 1vmo0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|12e5", - "Europe/Berlin|CET CEST CEMT|-10 -20 -30|01010101010101210101210101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2aFe0 11d0 1iO0 11A0 1o00 11A0 Qrc0 6i00 WM0 1fA0 1cM0 1cM0 1cM0 kL0 Nc0 m10 WM0 1ao0 1cp0 dX0 jz0 Dd0 1io0 17c0 1fA0 1a00 1ehA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|41e5", - "Europe/Prague|CET CEST GMT|-10 -20 0|01010101010101010201010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2aFe0 11d0 1iO0 11A0 1o00 11A0 Qrc0 6i00 WM0 1fA0 1cM0 1cM0 1cM0 1cM0 1qM0 11c0 mp0 xA0 mn0 17c0 1io0 17c0 1fc0 1ao0 1bNc0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|13e5", - "Europe/Brussels|WET CET CEST WEST|0 -10 -20 -10|0121212103030303030303030303030303030303030303030303212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2ehc0 3zX0 11c0 1iO0 11A0 1o00 11A0 my0 Ic0 1qM0 Rc0 1EM0 UM0 1u00 10o0 1io0 1io0 17c0 1a00 1fA0 1cM0 1cM0 1io0 17c0 1fA0 1a00 1io0 1a30 1io0 17c0 1fA0 1a00 1io0 17c0 1cM0 1cM0 1a00 1io0 1cM0 1cM0 1a00 1fA0 1io0 17c0 1cM0 1cM0 1a00 1fA0 1io0 1qM0 Dc0 y00 5Wn0 WM0 1fA0 1cM0 16M0 1iM0 16M0 1C00 Uo0 1eeo0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|21e5", - "Europe/Bucharest|BMT EET EEST|-1I.o -20 -30|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1xApI.o 20LI.o RA0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1Axc0 On0 1fA0 1a10 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cK0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cL0 1cN0 1cL0 1fB0 1nX0 11E0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|19e5", - "Europe/Budapest|CET CEST|-10 -20|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2aFe0 11d0 1iO0 11A0 1o00 11A0 1oo0 11c0 1lc0 17c0 O1V0 3Nf0 WM0 1fA0 1cM0 1cM0 1oJ0 1dd0 1020 1fX0 1cp0 1cM0 1cM0 1cM0 1fA0 1a00 bhy0 Rb0 1wr0 Rc0 1C00 LA0 1C00 LA0 SNW0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cO0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|17e5", - "Europe/Zurich|CET CEST|-10 -20|01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-19Lc0 11A0 1o00 11A0 1xG10 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|38e4", - "Europe/Chisinau|CMT BMT EET EEST CEST CET MSK MSD|-1T -1I.o -20 -30 -20 -10 -30 -40|012323232323232323234545467676767676767676767323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232323232|-26jdT wGMa.A 20LI.o RA0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 27A0 2en0 39g0 WM0 1fA0 1cM0 V90 1t7z0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 gL0 WO0 1cM0 1cM0 1cK0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1nX0 11D0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|67e4", - "Europe/Copenhagen|CET CEST|-10 -20|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2azC0 Tz0 VuO0 60q0 WM0 1fA0 1cM0 1cM0 1cM0 S00 1HA0 Nc0 1C00 Dc0 1Nc0 Ao0 1h5A0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|12e5", - "Europe/Gibraltar|GMT BST BDST CET CEST|0 -10 -20 -10 -20|010101010101010101010101010101010101010101010101012121212121010121010101010101010101034343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343|-2axa0 Rc0 1fA0 14M0 1fc0 1g00 1co0 1dc0 1co0 1oo0 1400 1dc0 19A0 1io0 1io0 WM0 1o00 14o0 1o00 17c0 1io0 17c0 1fA0 1a00 1lc0 17c0 1io0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1cM0 1io0 17c0 1fA0 1a00 1io0 17c0 1io0 17c0 1fA0 1a00 1io0 1qM0 Dc0 2Rz0 Dc0 1zc0 Oo0 1zc0 Rc0 1wo0 17c0 1iM0 FA0 xB0 1fA0 1a00 14o0 bb0 LA0 xB0 Rc0 1wo0 11A0 1o00 17c0 1fA0 1a00 1fA0 1cM0 1fA0 1a00 17c0 1fA0 1a00 1io0 17c0 1lc0 17c0 1fA0 10Jz0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|30e3", - "Europe/Helsinki|HMT EET EEST|-1D.N -20 -30|0121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-1WuND.N OULD.N 1dA0 1xGq0 1cM0 1cM0 1cM0 1cN0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|12e5", - "Europe/Kaliningrad|CET CEST EET EEST MSK MSD +03|-10 -20 -20 -30 -30 -40 -30|01010101010101232454545454545454543232323232323232323232323232323232323232323262|-2aFe0 11d0 1iO0 11A0 1o00 11A0 Qrc0 6i00 WM0 1fA0 1cM0 1cM0 1cM0 390 7A0 1en0 12N0 1pbb0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cN0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|44e4", - "Europe/Kiev|KMT EET MSK CEST CET MSD EEST|-22.4 -20 -30 -20 -10 -40 -30|0123434252525252525252525256161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161|-1Pc22.4 eUo2.4 rnz0 2Hg0 WM0 1fA0 da0 1v4m0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 Db0 3220 1cK0 1cL0 1cN0 1cL0 1cN0 1cL0 1cQ0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|34e5", - "Europe/Kirov|LMT +03 +04 +05|-3i.M -30 -40 -50|01232323232323232321212121212121212121212121212121212121212121|-22WM0 qH90 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1fA0 1cM0 3Co0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|48e4", - "Europe/Lisbon|LMT WET WEST WEMT CET CEST|A.J 0 -10 -20 -10 -20|012121212121212121212121212121212121212121212321232123212321212121212121212121212121212121212121214121212121212121212121212121212124545454212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2le00 aPX0 Sp0 LX0 1vc0 Tc0 1uM0 SM0 1vc0 Tc0 1vc0 SM0 1vc0 6600 1co0 3E00 17c0 1fA0 1a00 1io0 1a00 1io0 17c0 3I00 17c0 1cM0 1cM0 3Fc0 1cM0 1a00 1fA0 1io0 17c0 1cM0 1cM0 1a00 1fA0 1io0 1qM0 Dc0 1tA0 1cM0 1dc0 1400 gL0 IM0 s10 U00 dX0 Rc0 pd0 Rc0 gL0 Oo0 pd0 Rc0 gL0 Oo0 pd0 14o0 1cM0 1cP0 1cM0 1cM0 1cM0 1cM0 1cM0 3Co0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 pvy0 1cM0 1cM0 1fA0 1cM0 1cM0 1cN0 1cL0 1cN0 1cM0 1cM0 1cM0 1cM0 1cN0 1cL0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|27e5", - "Europe/Luxembourg|LMT CET CEST WET WEST WEST WET|-o.A -10 -20 0 -10 -20 -10|0121212134343434343434343434343434343434343434343434565651212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2DG0o.A t6mo.A TB0 1nX0 Up0 1o20 11A0 rW0 CM0 1qP0 R90 1EO0 UK0 1u20 10m0 1ip0 1in0 17e0 19W0 1fB0 1db0 1cp0 1in0 17d0 1fz0 1a10 1in0 1a10 1in0 17f0 1fA0 1a00 1io0 17c0 1cM0 1cM0 1a00 1io0 1cM0 1cM0 1a00 1fA0 1io0 17c0 1cM0 1cM0 1a00 1fA0 1io0 1qM0 Dc0 vA0 60L0 WM0 1fA0 1cM0 17c0 1io0 16M0 1C00 Uo0 1eeo0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|54e4", - "Europe/Madrid|WET WEST WEMT CET CEST|0 -10 -20 -10 -20|010101010101010101210343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343|-25Td0 19B0 1cL0 1dd0 b1z0 18p0 3HX0 17d0 1fz0 1a10 1io0 1a00 1in0 17d0 iIn0 Hd0 1cL0 bb0 1200 2s20 14n0 5aL0 Mp0 1vz0 17d0 1in0 17d0 1in0 17d0 1in0 17d0 6hX0 11B0 XHX0 1a10 1fz0 1a10 19X0 1cN0 1fz0 1a10 1fC0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|62e5", - "Europe/Malta|CET CEST|-10 -20|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2arB0 Lz0 1cN0 1db0 1410 1on0 Wp0 1qL0 17d0 1cL0 M3B0 5M20 WM0 1fA0 1co0 17c0 1iM0 16m0 1de0 1lc0 14m0 1lc0 WO0 1qM0 GTW0 On0 1C10 LA0 1C00 LA0 1EM0 LA0 1C00 LA0 1zc0 Oo0 1C00 Oo0 1co0 1cM0 1lA0 Xc0 1qq0 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1o10 11z0 1iN0 19z0 1fB0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|42e4", - "Europe/Minsk|MMT EET MSK CEST CET MSD EEST +03|-1O -20 -30 -20 -10 -40 -30 -30|01234343252525252525252525261616161616161616161616161616161616161617|-1Pc1O eUnO qNX0 3gQ0 WM0 1fA0 1cM0 Al0 1tsn0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 3Fc0 1cN0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0|19e5", - "Europe/Monaco|PMT WET WEST WEMT CET CEST|-9.l 0 -10 -20 -10 -20|01212121212121212121212121212121212121212121212121232323232345454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454|-2n5c9.l cFX9.l HA0 19A0 1iM0 11c0 1oo0 Wo0 1rc0 QM0 1EM0 UM0 1u00 10o0 1io0 1wo0 Rc0 1a00 1fA0 1cM0 1cM0 1io0 17c0 1fA0 1a00 1io0 1a00 1io0 17c0 1fA0 1a00 1io0 17c0 1cM0 1cM0 1a00 1io0 1cM0 1cM0 1a00 1fA0 1io0 17c0 1cM0 1cM0 1a00 1fA0 1io0 1qM0 Df0 2RV0 11z0 11B0 1ze0 WM0 1fA0 1cM0 1fa0 1aq0 16M0 1ekn0 1cL0 1fC0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|38e3", - "Europe/Moscow|MMT MMT MST MDST MSD MSK +05 EET EEST MSK|-2u.h -2v.j -3v.j -4v.j -40 -30 -50 -20 -30 -40|012132345464575454545454545454545458754545454545454545454545454545454545454595|-2ag2u.h 2pyW.W 1bA0 11X0 GN0 1Hb0 c4v.j ik0 3DA0 dz0 15A0 c10 2q10 iM10 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cN0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0|16e6", - "Europe/Paris|PMT WET WEST CEST CET WEMT|-9.l 0 -10 -20 -10 -20|0121212121212121212121212121212121212121212121212123434352543434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434343434|-2nco9.l cNb9.l HA0 19A0 1iM0 11c0 1oo0 Wo0 1rc0 QM0 1EM0 UM0 1u00 10o0 1io0 1wo0 Rc0 1a00 1fA0 1cM0 1cM0 1io0 17c0 1fA0 1a00 1io0 1a00 1io0 17c0 1fA0 1a00 1io0 17c0 1cM0 1cM0 1a00 1io0 1cM0 1cM0 1a00 1fA0 1io0 17c0 1cM0 1cM0 1a00 1fA0 1io0 1qM0 Df0 Ik0 5M30 WM0 1fA0 1cM0 Vx0 hB0 1aq0 16M0 1ekn0 1cL0 1fC0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|11e6", - "Europe/Riga|RMT LST EET MSK CEST CET MSD EEST|-1A.y -2A.y -20 -30 -20 -10 -40 -30|010102345454536363636363636363727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272727272|-25TzA.y 11A0 1iM0 ko0 gWm0 yDXA.y 2bX0 3fE0 WM0 1fA0 1cM0 1cM0 4m0 1sLy0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cN0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cN0 1o00 11A0 1o00 11A0 1qM0 3oo0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|64e4", - "Europe/Rome|CET CEST|-10 -20|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2arB0 Lz0 1cN0 1db0 1410 1on0 Wp0 1qL0 17d0 1cL0 M3B0 5M20 WM0 1fA0 1cM0 16M0 1iM0 16m0 1de0 1lc0 14m0 1lc0 WO0 1qM0 GTW0 On0 1C10 LA0 1C00 LA0 1EM0 LA0 1C00 LA0 1zc0 Oo0 1C00 Oo0 1C00 LA0 1zc0 Oo0 1C00 LA0 1C00 LA0 1zc0 Oo0 1C00 Oo0 1zc0 Oo0 1fC0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|39e5", - "Europe/Samara|LMT +03 +04 +05|-3k.k -30 -40 -50|0123232323232323232121232323232323232323232323232323232323212|-22WM0 qH90 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1fA0 2y10 14m0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 2sp0 WM0|12e5", - "Europe/Saratov|LMT +03 +04 +05|-34.i -30 -40 -50|012323232323232321212121212121212121212121212121212121212121212|-22WM0 qH90 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1cM0 1cM0 1fA0 1cM0 3Co0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 5810|", - "Europe/Simferopol|SMT EET MSK CEST CET MSD EEST MSK|-2g -20 -30 -20 -10 -40 -30 -40|012343432525252525252525252161616525252616161616161616161616161616161616172|-1Pc2g eUog rEn0 2qs0 WM0 1fA0 1cM0 3V0 1u0L0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1Q00 4eL0 1cL0 1cN0 1cL0 1cN0 dX0 WL0 1cN0 1cL0 1fB0 1o30 11B0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11z0 1nW0|33e4", - "Europe/Sofia|EET CET CEST EEST|-20 -10 -20 -30|01212103030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030|-168L0 WM0 1fA0 1cM0 1cM0 1cN0 1mKH0 1dd0 1fb0 1ap0 1fb0 1a20 1fy0 1a30 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cK0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 1nX0 11E0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|12e5", - "Europe/Stockholm|CET CEST|-10 -20|01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2azC0 TB0 2yDe0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|15e5", - "Europe/Tallinn|TMT CET CEST EET MSK MSD EEST|-1D -10 -20 -20 -30 -40 -30|012103421212454545454545454546363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363|-26oND teD 11A0 1Ta0 4rXl KSLD 2FX0 2Jg0 WM0 1fA0 1cM0 18J0 1sTX0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cN0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o10 11A0 1qM0 5QM0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|41e4", - "Europe/Tirane|LMT CET CEST|-1j.k -10 -20|01212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2glBj.k 14pcj.k 5LC0 WM0 4M0 1fCK0 10n0 1op0 11z0 1pd0 11z0 1qN0 WL0 1qp0 Xb0 1qp0 Xb0 1qp0 11z0 1lB0 11z0 1qN0 11z0 1iN0 16n0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|42e4", - "Europe/Ulyanovsk|LMT +03 +04 +05 +02|-3d.A -30 -40 -50 -20|01232323232323232321214121212121212121212121212121212121212121212|-22WM0 qH90 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1fA0 2pB0 IM0 rX0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 3rd0|13e5", - "Europe/Uzhgorod|CET CEST MSK MSD EET EEST|-10 -20 -30 -40 -20 -30|010101023232323232323232320454545454545454545454545454545454545454545454545454545454545454545454545454545454545454545454|-1cqL0 6i00 WM0 1fA0 1cM0 1ml0 1Cp0 1r3W0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1Q00 1Nf0 2pw0 1cL0 1cN0 1cL0 1cN0 1cL0 1cQ0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|11e4", - "Europe/Vienna|CET CEST|-10 -20|0101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2aFe0 11d0 1iO0 11A0 1o00 11A0 3KM0 14o0 LA00 6i00 WM0 1fA0 1cM0 1cM0 1cM0 400 2qM0 1ao0 1co0 1cM0 1io0 17c0 1gHa0 19X0 1cP0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|18e5", - "Europe/Vilnius|WMT KMT CET EET MSK CEST MSD EEST|-1o -1z.A -10 -20 -30 -20 -40 -30|012324525254646464646464646473737373737373737352537373737373737373737373737373737373737373737373737373737373737373737373|-293do 6ILM.o 1Ooz.A zz0 Mfd0 29W0 3is0 WM0 1fA0 1cM0 LV0 1tgL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cN0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11B0 1o00 11A0 1qM0 8io0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|54e4", - "Europe/Volgograd|LMT +03 +04 +05|-2V.E -30 -40 -50|0123232323232323212121212121212121212121212121212121212121212121|-21IqV.E psLV.E 23CL0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 2pB0 1cM0 1cM0 1cM0 1fA0 1cM0 3Co0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 8Hz0 9Jd0 5gn0|10e5", - "Europe/Warsaw|WMT CET CEST EET EEST|-1o -10 -20 -20 -30|012121234312121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121|-2ctdo 1LXo 11d0 1iO0 11A0 1o00 11A0 1on0 11A0 6zy0 HWP0 5IM0 WM0 1fA0 1cM0 1dz0 1mL0 1en0 15B0 1aq0 1nA0 11A0 1io0 17c0 1fA0 1a00 iDX0 LA0 1cM0 1cM0 1C00 Oo0 1cM0 1cM0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1C00 LA0 uso0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cN0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|17e5", - "Europe/Zaporozhye|+0220 EET MSK CEST CET MSD EEST|-2k -20 -30 -20 -10 -40 -30|01234342525252525252525252526161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161|-1Pc2k eUok rdb0 2RE0 WM0 1fA0 8m0 1v9a0 1db0 1cN0 1db0 1cN0 1db0 1dd0 1cO0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cK0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cQ0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|77e4", - "HST|HST|a0|0||", - "Indian/Chagos|LMT +05 +06|-4N.E -50 -60|012|-2xosN.E 3AGLN.E|30e2", - "Indian/Cocos|+0630|-6u|0||596", - "Indian/Kerguelen|-00 +05|0 -50|01|-MG00|130", - "Indian/Mahe|LMT +04|-3F.M -40|01|-2xorF.M|79e3", - "Indian/Maldives|MMT +05|-4S -50|01|-olgS|35e4", - "Indian/Mauritius|LMT +04 +05|-3O -40 -50|012121|-2xorO 34unO 14L0 12kr0 11z0|15e4", - "Indian/Reunion|LMT +04|-3F.Q -40|01|-2mDDF.Q|84e4", - "Pacific/Kwajalein|+11 +10 +09 -12 +12|-b0 -a0 -90 c0 -c0|012034|-1kln0 akp0 6Up0 12ry0 Wan0|14e3", - "MET|MET MEST|-10 -20|01010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-2aFe0 11d0 1iO0 11A0 1o00 11A0 Qrc0 6i00 WM0 1fA0 1cM0 1cM0 1cM0 16M0 1gMM0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|", - "MST|MST|70|0||", - "MST7MDT|MST MDT MWT MPT|70 60 60 60|010102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261r0 1nX0 11B0 1nX0 SgN0 8x20 ix0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|", - "Pacific/Chatham|+1215 +1245 +1345|-cf -cJ -dJ|012121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212121212|-WqAf 1adef IM0 1C00 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Oo0 1zc0 Rc0 1zc0 Oo0 1qM0 14o0 1lc0 14o0 1lc0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1io0 17c0 1lc0 14o0 1lc0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1lc0 14o0 1lc0 14o0 1lc0 17c0 1io0 17c0 1io0 17c0 1io0 17c0 1io0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00|600", - "Pacific/Apia|LMT -1130 -11 -10 +14 +13|bq.U bu b0 a0 -e0 -d0|01232345454545454545454545454545454545454545454545454545454|-2nDMx.4 1yW03.4 2rRbu 1ff0 1a00 CI0 AQ0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1io0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1a00 1fA0 1cM0 1fA0 1a00 1fA0 1a00|37e3", - "Pacific/Bougainville|+10 +09 +11|-a0 -90 -b0|0102|-16Wy0 7CN0 2MQp0|18e4", - "Pacific/Chuuk|+10 +09|-a0 -90|01010|-2ewy0 axB0 RVX0 axd0|49e3", - "Pacific/Efate|LMT +11 +12|-bd.g -b0 -c0|012121212121212121212121|-2l9nd.g 2uNXd.g Dc0 n610 1cL0 1cN0 1cL0 1fB0 19X0 1fB0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1fB0 Lz0 1Nd0 An0|66e3", - "Pacific/Enderbury|-12 -11 +13|c0 b0 -d0|012|nIc0 B7X0|1", - "Pacific/Fakaofo|-11 +13|b0 -d0|01|1Gfn0|483", - "Pacific/Fiji|LMT +12 +13|-bT.I -c0 -d0|0121212121212121212121212121212121212121212121212121212121212121|-2bUzT.I 3m8NT.I LA0 1EM0 IM0 nJc0 LA0 1o00 Rc0 1wo0 Ao0 1Nc0 Ao0 1Q00 xz0 1SN0 uM0 1SM0 uM0 1VA0 s00 1VA0 s00 1VA0 s00 20o0 pc0 2hc0 bc0 20o0 pc0 20o0 pc0 20o0 pc0 20o0 pc0 20o0 s00 1VA0 s00 20o0 pc0 20o0 pc0 20o0 pc0 20o0 pc0 20o0 s00 20o0 pc0 20o0 pc0 20o0 pc0 20o0 pc0 20o0 s00 1VA0 s00|88e4", - "Pacific/Galapagos|LMT -05 -06|5W.o 50 60|01212|-1yVS1.A 2dTz1.A gNd0 rz0|25e3", - "Pacific/Gambier|LMT -09|8X.M 90|01|-2jof0.c|125", - "Pacific/Guadalcanal|LMT +11|-aD.M -b0|01|-2joyD.M|11e4", - "Pacific/Guam|GST +09 GDT ChST|-a0 -90 -b0 -a0|01020202020202020203|-18jK0 6pB0 AhB0 3QL0 g2p0 3p91 WOX rX0 1zd0 Rb0 1wp0 Rb0 5xd0 rX0 5sN0 zb1 1C0X On0 ULb0|17e4", - "Pacific/Honolulu|HST HDT HWT HPT HST|au 9u 9u 9u a0|0102304|-1thLu 8x0 lef0 8wWu iAu 46p0|37e4", - "Pacific/Kiritimati|-1040 -10 +14|aE a0 -e0|012|nIaE B7Xk|51e2", - "Pacific/Kosrae|+11 +09 +10 +12|-b0 -90 -a0 -c0|01021030|-2ewz0 axC0 HBy0 akp0 axd0 WOK0 1bdz0|66e2", - "Pacific/Majuro|+11 +09 +10 +12|-b0 -90 -a0 -c0|0102103|-2ewz0 axC0 HBy0 akp0 6RB0 12um0|28e3", - "Pacific/Marquesas|LMT -0930|9i 9u|01|-2joeG|86e2", - "Pacific/Pago_Pago|LMT SST|bm.M b0|01|-2nDMB.c|37e2", - "Pacific/Nauru|LMT +1130 +09 +12|-b7.E -bu -90 -c0|01213|-1Xdn7.E QCnB.E 7mqu 1lnbu|10e3", - "Pacific/Niue|-1120 -1130 -11|bk bu b0|012|-KfME 17y0a|12e2", - "Pacific/Norfolk|+1112 +1130 +1230 +11 +12|-bc -bu -cu -b0 -c0|012134343434343434343434343434343434343434|-Kgbc W01G Oo0 1COo0 9Jcu 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0|25e4", - "Pacific/Noumea|LMT +11 +12|-b5.M -b0 -c0|01212121|-2l9n5.M 2EqM5.M xX0 1PB0 yn0 HeP0 Ao0|98e3", - "Pacific/Pitcairn|-0830 -08|8u 80|01|18Vku|56", - "Pacific/Pohnpei|+11 +09 +10|-b0 -90 -a0|010210|-2ewz0 axC0 HBy0 akp0 axd0|34e3", - "Pacific/Rarotonga|-1030 -0930 -10|au 9u a0|012121212121212121212121212|lyWu IL0 1zcu Onu 1zcu Onu 1zcu Rbu 1zcu Onu 1zcu Onu 1zcu Onu 1zcu Onu 1zcu Onu 1zcu Rbu 1zcu Onu 1zcu Onu 1zcu Onu|13e3", - "Pacific/Tahiti|LMT -10|9W.g a0|01|-2joe1.I|18e4", - "Pacific/Tongatapu|+1220 +13 +14|-ck -d0 -e0|0121212121|-1aB0k 2n5dk 15A0 1wo0 xz0 1Q10 xz0 zWN0 s00|75e3", - "PST8PDT|PST PDT PWT PPT|80 70 70 70|010102301010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|-261q0 1nX0 11B0 1nX0 SgN0 8x10 iy0 QwN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1cN0 1cL0 1cN0 1cL0 s10 1Vz0 LB0 1BX0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 1cN0 1fz0 1a10 1fz0 1cN0 1cL0 1cN0 1cL0 1cN0 1cL0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 14p0 1lb0 14p0 1lb0 14p0 1nX0 11B0 1nX0 11B0 1nX0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Rd0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0 Op0 1zb0|", - "WET|WET WEST|0 -10|010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010|hDB0 1a00 1fA0 1cM0 1cM0 1cM0 1fA0 1a00 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1cM0 1fA0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00 11A0 1qM0 WM0 1qM0 WM0 1qM0 WM0 1qM0 11A0 1o00 11A0 1o00|" - ], - "links": [ - "Africa/Abidjan|Africa/Bamako", - "Africa/Abidjan|Africa/Banjul", - "Africa/Abidjan|Africa/Conakry", - "Africa/Abidjan|Africa/Dakar", - "Africa/Abidjan|Africa/Freetown", - "Africa/Abidjan|Africa/Lome", - "Africa/Abidjan|Africa/Nouakchott", - "Africa/Abidjan|Africa/Ouagadougou", - "Africa/Abidjan|Africa/Timbuktu", - "Africa/Abidjan|Atlantic/St_Helena", - "Africa/Cairo|Egypt", - "Africa/Johannesburg|Africa/Maseru", - "Africa/Johannesburg|Africa/Mbabane", - "Africa/Lagos|Africa/Bangui", - "Africa/Lagos|Africa/Brazzaville", - "Africa/Lagos|Africa/Douala", - "Africa/Lagos|Africa/Kinshasa", - "Africa/Lagos|Africa/Libreville", - "Africa/Lagos|Africa/Luanda", - "Africa/Lagos|Africa/Malabo", - "Africa/Lagos|Africa/Niamey", - "Africa/Lagos|Africa/Porto-Novo", - "Africa/Maputo|Africa/Blantyre", - "Africa/Maputo|Africa/Bujumbura", - "Africa/Maputo|Africa/Gaborone", - "Africa/Maputo|Africa/Harare", - "Africa/Maputo|Africa/Kigali", - "Africa/Maputo|Africa/Lubumbashi", - "Africa/Maputo|Africa/Lusaka", - "Africa/Nairobi|Africa/Addis_Ababa", - "Africa/Nairobi|Africa/Asmara", - "Africa/Nairobi|Africa/Asmera", - "Africa/Nairobi|Africa/Dar_es_Salaam", - "Africa/Nairobi|Africa/Djibouti", - "Africa/Nairobi|Africa/Kampala", - "Africa/Nairobi|Africa/Mogadishu", - "Africa/Nairobi|Indian/Antananarivo", - "Africa/Nairobi|Indian/Comoro", - "Africa/Nairobi|Indian/Mayotte", - "Africa/Tripoli|Libya", - "America/Adak|America/Atka", - "America/Adak|US/Aleutian", - "America/Anchorage|US/Alaska", - "America/Argentina/Buenos_Aires|America/Buenos_Aires", - "America/Argentina/Catamarca|America/Argentina/ComodRivadavia", - "America/Argentina/Catamarca|America/Catamarca", - "America/Argentina/Cordoba|America/Cordoba", - "America/Argentina/Cordoba|America/Rosario", - "America/Argentina/Jujuy|America/Jujuy", - "America/Argentina/Mendoza|America/Mendoza", - "America/Atikokan|America/Coral_Harbour", - "America/Chicago|US/Central", - "America/Curacao|America/Aruba", - "America/Curacao|America/Kralendijk", - "America/Curacao|America/Lower_Princes", - "America/Denver|America/Shiprock", - "America/Denver|Navajo", - "America/Denver|US/Mountain", - "America/Detroit|US/Michigan", - "America/Edmonton|Canada/Mountain", - "America/Fort_Wayne|America/Indiana/Indianapolis", - "America/Fort_Wayne|America/Indianapolis", - "America/Fort_Wayne|US/East-Indiana", - "America/Godthab|America/Nuuk", - "America/Halifax|Canada/Atlantic", - "America/Havana|Cuba", - "America/Indiana/Knox|America/Knox_IN", - "America/Indiana/Knox|US/Indiana-Starke", - "America/Jamaica|Jamaica", - "America/Kentucky/Louisville|America/Louisville", - "America/Los_Angeles|US/Pacific", - "America/Manaus|Brazil/West", - "America/Mazatlan|Mexico/BajaSur", - "America/Mexico_City|Mexico/General", - "America/New_York|US/Eastern", - "America/Noronha|Brazil/DeNoronha", - "America/Panama|America/Cayman", - "America/Phoenix|US/Arizona", - "America/Port_of_Spain|America/Anguilla", - "America/Port_of_Spain|America/Antigua", - "America/Port_of_Spain|America/Dominica", - "America/Port_of_Spain|America/Grenada", - "America/Port_of_Spain|America/Guadeloupe", - "America/Port_of_Spain|America/Marigot", - "America/Port_of_Spain|America/Montserrat", - "America/Port_of_Spain|America/St_Barthelemy", - "America/Port_of_Spain|America/St_Kitts", - "America/Port_of_Spain|America/St_Lucia", - "America/Port_of_Spain|America/St_Thomas", - "America/Port_of_Spain|America/St_Vincent", - "America/Port_of_Spain|America/Tortola", - "America/Port_of_Spain|America/Virgin", - "America/Regina|Canada/Saskatchewan", - "America/Rio_Branco|America/Porto_Acre", - "America/Rio_Branco|Brazil/Acre", - "America/Santiago|Chile/Continental", - "America/Sao_Paulo|Brazil/East", - "America/St_Johns|Canada/Newfoundland", - "America/Tijuana|America/Ensenada", - "America/Tijuana|America/Santa_Isabel", - "America/Tijuana|Mexico/BajaNorte", - "America/Toronto|America/Montreal", - "America/Toronto|Canada/Eastern", - "America/Vancouver|Canada/Pacific", - "America/Whitehorse|Canada/Yukon", - "America/Winnipeg|Canada/Central", - "Asia/Ashgabat|Asia/Ashkhabad", - "Asia/Bangkok|Asia/Phnom_Penh", - "Asia/Bangkok|Asia/Vientiane", - "Asia/Dhaka|Asia/Dacca", - "Asia/Dubai|Asia/Muscat", - "Asia/Ho_Chi_Minh|Asia/Saigon", - "Asia/Hong_Kong|Hongkong", - "Asia/Jerusalem|Asia/Tel_Aviv", - "Asia/Jerusalem|Israel", - "Asia/Kathmandu|Asia/Katmandu", - "Asia/Kolkata|Asia/Calcutta", - "Asia/Kuala_Lumpur|Asia/Singapore", - "Asia/Kuala_Lumpur|Singapore", - "Asia/Macau|Asia/Macao", - "Asia/Makassar|Asia/Ujung_Pandang", - "Asia/Nicosia|Europe/Nicosia", - "Asia/Qatar|Asia/Bahrain", - "Asia/Rangoon|Asia/Yangon", - "Asia/Riyadh|Asia/Aden", - "Asia/Riyadh|Asia/Kuwait", - "Asia/Seoul|ROK", - "Asia/Shanghai|Asia/Chongqing", - "Asia/Shanghai|Asia/Chungking", - "Asia/Shanghai|Asia/Harbin", - "Asia/Shanghai|PRC", - "Asia/Taipei|ROC", - "Asia/Tehran|Iran", - "Asia/Thimphu|Asia/Thimbu", - "Asia/Tokyo|Japan", - "Asia/Ulaanbaatar|Asia/Ulan_Bator", - "Asia/Urumqi|Asia/Kashgar", - "Atlantic/Faroe|Atlantic/Faeroe", - "Atlantic/Reykjavik|Iceland", - "Atlantic/South_Georgia|Etc/GMT+2", - "Australia/Adelaide|Australia/South", - "Australia/Brisbane|Australia/Queensland", - "Australia/Broken_Hill|Australia/Yancowinna", - "Australia/Darwin|Australia/North", - "Australia/Hobart|Australia/Currie", - "Australia/Hobart|Australia/Tasmania", - "Australia/Lord_Howe|Australia/LHI", - "Australia/Melbourne|Australia/Victoria", - "Australia/Perth|Australia/West", - "Australia/Sydney|Australia/ACT", - "Australia/Sydney|Australia/Canberra", - "Australia/Sydney|Australia/NSW", - "Etc/GMT-0|Etc/GMT", - "Etc/GMT-0|Etc/GMT+0", - "Etc/GMT-0|Etc/GMT0", - "Etc/GMT-0|Etc/Greenwich", - "Etc/GMT-0|GMT", - "Etc/GMT-0|GMT+0", - "Etc/GMT-0|GMT-0", - "Etc/GMT-0|GMT0", - "Etc/GMT-0|Greenwich", - "Etc/UTC|Etc/UCT", - "Etc/UTC|Etc/Universal", - "Etc/UTC|Etc/Zulu", - "Etc/UTC|UCT", - "Etc/UTC|UTC", - "Etc/UTC|Universal", - "Etc/UTC|Zulu", - "Europe/Belgrade|Europe/Ljubljana", - "Europe/Belgrade|Europe/Podgorica", - "Europe/Belgrade|Europe/Sarajevo", - "Europe/Belgrade|Europe/Skopje", - "Europe/Belgrade|Europe/Zagreb", - "Europe/Chisinau|Europe/Tiraspol", - "Europe/Dublin|Eire", - "Europe/Helsinki|Europe/Mariehamn", - "Europe/Istanbul|Asia/Istanbul", - "Europe/Istanbul|Turkey", - "Europe/Lisbon|Portugal", - "Europe/London|Europe/Belfast", - "Europe/London|Europe/Guernsey", - "Europe/London|Europe/Isle_of_Man", - "Europe/London|Europe/Jersey", - "Europe/London|GB", - "Europe/London|GB-Eire", - "Europe/Moscow|W-SU", - "Europe/Oslo|Arctic/Longyearbyen", - "Europe/Oslo|Atlantic/Jan_Mayen", - "Europe/Prague|Europe/Bratislava", - "Europe/Rome|Europe/San_Marino", - "Europe/Rome|Europe/Vatican", - "Europe/Warsaw|Poland", - "Europe/Zurich|Europe/Busingen", - "Europe/Zurich|Europe/Vaduz", - "Indian/Christmas|Etc/GMT-7", - "Pacific/Auckland|Antarctica/McMurdo", - "Pacific/Auckland|Antarctica/South_Pole", - "Pacific/Auckland|NZ", - "Pacific/Chatham|NZ-CHAT", - "Pacific/Chuuk|Pacific/Truk", - "Pacific/Chuuk|Pacific/Yap", - "Pacific/Easter|Chile/EasterIsland", - "Pacific/Guam|Pacific/Saipan", - "Pacific/Honolulu|Pacific/Johnston", - "Pacific/Honolulu|US/Hawaii", - "Pacific/Kwajalein|Kwajalein", - "Pacific/Pago_Pago|Pacific/Midway", - "Pacific/Pago_Pago|Pacific/Samoa", - "Pacific/Pago_Pago|US/Samoa", - "Pacific/Palau|Etc/GMT-9", - "Pacific/Pohnpei|Pacific/Ponape", - "Pacific/Port_Moresby|Etc/GMT-10", - "Pacific/Tarawa|Etc/GMT-12", - "Pacific/Tarawa|Pacific/Funafuti", - "Pacific/Tarawa|Pacific/Wake", - "Pacific/Tarawa|Pacific/Wallis" - ], - "countries": [ - "AD|Europe/Andorra", - "AE|Asia/Dubai", - "AF|Asia/Kabul", - "AG|America/Port_of_Spain America/Antigua", - "AI|America/Port_of_Spain America/Anguilla", - "AL|Europe/Tirane", - "AM|Asia/Yerevan", - "AO|Africa/Lagos Africa/Luanda", - "AQ|Antarctica/Casey Antarctica/Davis Antarctica/DumontDUrville Antarctica/Mawson Antarctica/Palmer Antarctica/Rothera Antarctica/Syowa Antarctica/Troll Antarctica/Vostok Pacific/Auckland Antarctica/McMurdo", - "AR|America/Argentina/Buenos_Aires America/Argentina/Cordoba America/Argentina/Salta America/Argentina/Jujuy America/Argentina/Tucuman America/Argentina/Catamarca America/Argentina/La_Rioja America/Argentina/San_Juan America/Argentina/Mendoza America/Argentina/San_Luis America/Argentina/Rio_Gallegos America/Argentina/Ushuaia", - "AS|Pacific/Pago_Pago", - "AT|Europe/Vienna", - "AU|Australia/Lord_Howe Antarctica/Macquarie Australia/Hobart Australia/Currie Australia/Melbourne Australia/Sydney Australia/Broken_Hill Australia/Brisbane Australia/Lindeman Australia/Adelaide Australia/Darwin Australia/Perth Australia/Eucla", - "AW|America/Curacao America/Aruba", - "AX|Europe/Helsinki Europe/Mariehamn", - "AZ|Asia/Baku", - "BA|Europe/Belgrade Europe/Sarajevo", - "BB|America/Barbados", - "BD|Asia/Dhaka", - "BE|Europe/Brussels", - "BF|Africa/Abidjan Africa/Ouagadougou", - "BG|Europe/Sofia", - "BH|Asia/Qatar Asia/Bahrain", - "BI|Africa/Maputo Africa/Bujumbura", - "BJ|Africa/Lagos Africa/Porto-Novo", - "BL|America/Port_of_Spain America/St_Barthelemy", - "BM|Atlantic/Bermuda", - "BN|Asia/Brunei", - "BO|America/La_Paz", - "BQ|America/Curacao America/Kralendijk", - "BR|America/Noronha America/Belem America/Fortaleza America/Recife America/Araguaina America/Maceio America/Bahia America/Sao_Paulo America/Campo_Grande America/Cuiaba America/Santarem America/Porto_Velho America/Boa_Vista America/Manaus America/Eirunepe America/Rio_Branco", - "BS|America/Nassau", - "BT|Asia/Thimphu", - "BW|Africa/Maputo Africa/Gaborone", - "BY|Europe/Minsk", - "BZ|America/Belize", - "CA|America/St_Johns America/Halifax America/Glace_Bay America/Moncton America/Goose_Bay America/Blanc-Sablon America/Toronto America/Nipigon America/Thunder_Bay America/Iqaluit America/Pangnirtung America/Atikokan America/Winnipeg America/Rainy_River America/Resolute America/Rankin_Inlet America/Regina America/Swift_Current America/Edmonton America/Cambridge_Bay America/Yellowknife America/Inuvik America/Creston America/Dawson_Creek America/Fort_Nelson America/Vancouver America/Whitehorse America/Dawson", - "CC|Indian/Cocos", - "CD|Africa/Maputo Africa/Lagos Africa/Kinshasa Africa/Lubumbashi", - "CF|Africa/Lagos Africa/Bangui", - "CG|Africa/Lagos Africa/Brazzaville", - "CH|Europe/Zurich", - "CI|Africa/Abidjan", - "CK|Pacific/Rarotonga", - "CL|America/Santiago America/Punta_Arenas Pacific/Easter", - "CM|Africa/Lagos Africa/Douala", - "CN|Asia/Shanghai Asia/Urumqi", - "CO|America/Bogota", - "CR|America/Costa_Rica", - "CU|America/Havana", - "CV|Atlantic/Cape_Verde", - "CW|America/Curacao", - "CX|Indian/Christmas", - "CY|Asia/Nicosia Asia/Famagusta", - "CZ|Europe/Prague", - "DE|Europe/Zurich Europe/Berlin Europe/Busingen", - "DJ|Africa/Nairobi Africa/Djibouti", - "DK|Europe/Copenhagen", - "DM|America/Port_of_Spain America/Dominica", - "DO|America/Santo_Domingo", - "DZ|Africa/Algiers", - "EC|America/Guayaquil Pacific/Galapagos", - "EE|Europe/Tallinn", - "EG|Africa/Cairo", - "EH|Africa/El_Aaiun", - "ER|Africa/Nairobi Africa/Asmara", - "ES|Europe/Madrid Africa/Ceuta Atlantic/Canary", - "ET|Africa/Nairobi Africa/Addis_Ababa", - "FI|Europe/Helsinki", - "FJ|Pacific/Fiji", - "FK|Atlantic/Stanley", - "FM|Pacific/Chuuk Pacific/Pohnpei Pacific/Kosrae", - "FO|Atlantic/Faroe", - "FR|Europe/Paris", - "GA|Africa/Lagos Africa/Libreville", - "GB|Europe/London", - "GD|America/Port_of_Spain America/Grenada", - "GE|Asia/Tbilisi", - "GF|America/Cayenne", - "GG|Europe/London Europe/Guernsey", - "GH|Africa/Accra", - "GI|Europe/Gibraltar", - "GL|America/Nuuk America/Danmarkshavn America/Scoresbysund America/Thule", - "GM|Africa/Abidjan Africa/Banjul", - "GN|Africa/Abidjan Africa/Conakry", - "GP|America/Port_of_Spain America/Guadeloupe", - "GQ|Africa/Lagos Africa/Malabo", - "GR|Europe/Athens", - "GS|Atlantic/South_Georgia", - "GT|America/Guatemala", - "GU|Pacific/Guam", - "GW|Africa/Bissau", - "GY|America/Guyana", - "HK|Asia/Hong_Kong", - "HN|America/Tegucigalpa", - "HR|Europe/Belgrade Europe/Zagreb", - "HT|America/Port-au-Prince", - "HU|Europe/Budapest", - "ID|Asia/Jakarta Asia/Pontianak Asia/Makassar Asia/Jayapura", - "IE|Europe/Dublin", - "IL|Asia/Jerusalem", - "IM|Europe/London Europe/Isle_of_Man", - "IN|Asia/Kolkata", - "IO|Indian/Chagos", - "IQ|Asia/Baghdad", - "IR|Asia/Tehran", - "IS|Atlantic/Reykjavik", - "IT|Europe/Rome", - "JE|Europe/London Europe/Jersey", - "JM|America/Jamaica", - "JO|Asia/Amman", - "JP|Asia/Tokyo", - "KE|Africa/Nairobi", - "KG|Asia/Bishkek", - "KH|Asia/Bangkok Asia/Phnom_Penh", - "KI|Pacific/Tarawa Pacific/Enderbury Pacific/Kiritimati", - "KM|Africa/Nairobi Indian/Comoro", - "KN|America/Port_of_Spain America/St_Kitts", - "KP|Asia/Pyongyang", - "KR|Asia/Seoul", - "KW|Asia/Riyadh Asia/Kuwait", - "KY|America/Panama America/Cayman", - "KZ|Asia/Almaty Asia/Qyzylorda Asia/Qostanay Asia/Aqtobe Asia/Aqtau Asia/Atyrau Asia/Oral", - "LA|Asia/Bangkok Asia/Vientiane", - "LB|Asia/Beirut", - "LC|America/Port_of_Spain America/St_Lucia", - "LI|Europe/Zurich Europe/Vaduz", - "LK|Asia/Colombo", - "LR|Africa/Monrovia", - "LS|Africa/Johannesburg Africa/Maseru", - "LT|Europe/Vilnius", - "LU|Europe/Luxembourg", - "LV|Europe/Riga", - "LY|Africa/Tripoli", - "MA|Africa/Casablanca", - "MC|Europe/Monaco", - "MD|Europe/Chisinau", - "ME|Europe/Belgrade Europe/Podgorica", - "MF|America/Port_of_Spain America/Marigot", - "MG|Africa/Nairobi Indian/Antananarivo", - "MH|Pacific/Majuro Pacific/Kwajalein", - "MK|Europe/Belgrade Europe/Skopje", - "ML|Africa/Abidjan Africa/Bamako", - "MM|Asia/Yangon", - "MN|Asia/Ulaanbaatar Asia/Hovd Asia/Choibalsan", - "MO|Asia/Macau", - "MP|Pacific/Guam Pacific/Saipan", - "MQ|America/Martinique", - "MR|Africa/Abidjan Africa/Nouakchott", - "MS|America/Port_of_Spain America/Montserrat", - "MT|Europe/Malta", - "MU|Indian/Mauritius", - "MV|Indian/Maldives", - "MW|Africa/Maputo Africa/Blantyre", - "MX|America/Mexico_City America/Cancun America/Merida America/Monterrey America/Matamoros America/Mazatlan America/Chihuahua America/Ojinaga America/Hermosillo America/Tijuana America/Bahia_Banderas", - "MY|Asia/Kuala_Lumpur Asia/Kuching", - "MZ|Africa/Maputo", - "NA|Africa/Windhoek", - "NC|Pacific/Noumea", - "NE|Africa/Lagos Africa/Niamey", - "NF|Pacific/Norfolk", - "NG|Africa/Lagos", - "NI|America/Managua", - "NL|Europe/Amsterdam", - "NO|Europe/Oslo", - "NP|Asia/Kathmandu", - "NR|Pacific/Nauru", - "NU|Pacific/Niue", - "NZ|Pacific/Auckland Pacific/Chatham", - "OM|Asia/Dubai Asia/Muscat", - "PA|America/Panama", - "PE|America/Lima", - "PF|Pacific/Tahiti Pacific/Marquesas Pacific/Gambier", - "PG|Pacific/Port_Moresby Pacific/Bougainville", - "PH|Asia/Manila", - "PK|Asia/Karachi", - "PL|Europe/Warsaw", - "PM|America/Miquelon", - "PN|Pacific/Pitcairn", - "PR|America/Puerto_Rico", - "PS|Asia/Gaza Asia/Hebron", - "PT|Europe/Lisbon Atlantic/Madeira Atlantic/Azores", - "PW|Pacific/Palau", - "PY|America/Asuncion", - "QA|Asia/Qatar", - "RE|Indian/Reunion", - "RO|Europe/Bucharest", - "RS|Europe/Belgrade", - "RU|Europe/Kaliningrad Europe/Moscow Europe/Simferopol Europe/Kirov Europe/Astrakhan Europe/Volgograd Europe/Saratov Europe/Ulyanovsk Europe/Samara Asia/Yekaterinburg Asia/Omsk Asia/Novosibirsk Asia/Barnaul Asia/Tomsk Asia/Novokuznetsk Asia/Krasnoyarsk Asia/Irkutsk Asia/Chita Asia/Yakutsk Asia/Khandyga Asia/Vladivostok Asia/Ust-Nera Asia/Magadan Asia/Sakhalin Asia/Srednekolymsk Asia/Kamchatka Asia/Anadyr", - "RW|Africa/Maputo Africa/Kigali", - "SA|Asia/Riyadh", - "SB|Pacific/Guadalcanal", - "SC|Indian/Mahe", - "SD|Africa/Khartoum", - "SE|Europe/Stockholm", - "SG|Asia/Singapore", - "SH|Africa/Abidjan Atlantic/St_Helena", - "SI|Europe/Belgrade Europe/Ljubljana", - "SJ|Europe/Oslo Arctic/Longyearbyen", - "SK|Europe/Prague Europe/Bratislava", - "SL|Africa/Abidjan Africa/Freetown", - "SM|Europe/Rome Europe/San_Marino", - "SN|Africa/Abidjan Africa/Dakar", - "SO|Africa/Nairobi Africa/Mogadishu", - "SR|America/Paramaribo", - "SS|Africa/Juba", - "ST|Africa/Sao_Tome", - "SV|America/El_Salvador", - "SX|America/Curacao America/Lower_Princes", - "SY|Asia/Damascus", - "SZ|Africa/Johannesburg Africa/Mbabane", - "TC|America/Grand_Turk", - "TD|Africa/Ndjamena", - "TF|Indian/Reunion Indian/Kerguelen", - "TG|Africa/Abidjan Africa/Lome", - "TH|Asia/Bangkok", - "TJ|Asia/Dushanbe", - "TK|Pacific/Fakaofo", - "TL|Asia/Dili", - "TM|Asia/Ashgabat", - "TN|Africa/Tunis", - "TO|Pacific/Tongatapu", - "TR|Europe/Istanbul", - "TT|America/Port_of_Spain", - "TV|Pacific/Funafuti", - "TW|Asia/Taipei", - "TZ|Africa/Nairobi Africa/Dar_es_Salaam", - "UA|Europe/Simferopol Europe/Kiev Europe/Uzhgorod Europe/Zaporozhye", - "UG|Africa/Nairobi Africa/Kampala", - "UM|Pacific/Pago_Pago Pacific/Wake Pacific/Honolulu Pacific/Midway", - "US|America/New_York America/Detroit America/Kentucky/Louisville America/Kentucky/Monticello America/Indiana/Indianapolis America/Indiana/Vincennes America/Indiana/Winamac America/Indiana/Marengo America/Indiana/Petersburg America/Indiana/Vevay America/Chicago America/Indiana/Tell_City America/Indiana/Knox America/Menominee America/North_Dakota/Center America/North_Dakota/New_Salem America/North_Dakota/Beulah America/Denver America/Boise America/Phoenix America/Los_Angeles America/Anchorage America/Juneau America/Sitka America/Metlakatla America/Yakutat America/Nome America/Adak Pacific/Honolulu", - "UY|America/Montevideo", - "UZ|Asia/Samarkand Asia/Tashkent", - "VA|Europe/Rome Europe/Vatican", - "VC|America/Port_of_Spain America/St_Vincent", - "VE|America/Caracas", - "VG|America/Port_of_Spain America/Tortola", - "VI|America/Port_of_Spain America/St_Thomas", - "VN|Asia/Bangkok Asia/Ho_Chi_Minh", - "VU|Pacific/Efate", - "WF|Pacific/Wallis", - "WS|Pacific/Apia", - "YE|Asia/Riyadh Asia/Aden", - "YT|Africa/Nairobi Indian/Mayotte", - "ZA|Africa/Johannesburg", - "ZM|Africa/Maputo Africa/Lusaka", - "ZW|Africa/Maputo Africa/Harare" - ] - }); - - - return moment; -})); diff --git a/lib/moment.min.js b/lib/moment.min.js deleted file mode 100644 index 57cd2d4..0000000 --- a/lib/moment.min.js +++ /dev/null @@ -1,2 +0,0 @@ -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.moment=t()}(this,function(){"use strict";var e,i;function f(){return e.apply(null,arguments)}function o(e){return e instanceof Array||"[object Array]"===Object.prototype.toString.call(e)}function u(e){return null!=e&&"[object Object]"===Object.prototype.toString.call(e)}function m(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function l(e){if(Object.getOwnPropertyNames)return 0===Object.getOwnPropertyNames(e).length;for(var t in e)if(m(e,t))return;return 1}function r(e){return void 0===e}function h(e){return"number"==typeof e||"[object Number]"===Object.prototype.toString.call(e)}function a(e){return e instanceof Date||"[object Date]"===Object.prototype.toString.call(e)}function d(e,t){for(var n=[],s=0;s>>0,s=0;sFe(e)?(r=e+1,a-Fe(e)):(r=e,a);return{year:r,dayOfYear:o}}function Ae(e,t,n){var s,i,r=Ge(e.year(),t,n),a=Math.floor((e.dayOfYear()-r-1)/7)+1;return a<1?s=a+je(i=e.year()-1,t,n):a>je(e.year(),t,n)?(s=a-je(e.year(),t,n),i=e.year()+1):(i=e.year(),s=a),{week:s,year:i}}function je(e,t,n){var s=Ge(e,t,n),i=Ge(e+1,t,n);return(Fe(e)-s+i)/7}C("w",["ww",2],"wo","week"),C("W",["WW",2],"Wo","isoWeek"),L("week","w"),L("isoWeek","W"),A("week",5),A("isoWeek",5),ce("w",te),ce("ww",te,Q),ce("W",te),ce("WW",te,Q),ge(["w","ww","W","WW"],function(e,t,n,s){t[s.substr(0,1)]=Z(e)});function Ie(e,t){return e.slice(t,7).concat(e.slice(0,t))}C("d",0,"do","day"),C("dd",0,0,function(e){return this.localeData().weekdaysMin(this,e)}),C("ddd",0,0,function(e){return this.localeData().weekdaysShort(this,e)}),C("dddd",0,0,function(e){return this.localeData().weekdays(this,e)}),C("e",0,0,"weekday"),C("E",0,0,"isoWeekday"),L("day","d"),L("weekday","e"),L("isoWeekday","E"),A("day",11),A("weekday",11),A("isoWeekday",11),ce("d",te),ce("e",te),ce("E",te),ce("dd",function(e,t){return t.weekdaysMinRegex(e)}),ce("ddd",function(e,t){return t.weekdaysShortRegex(e)}),ce("dddd",function(e,t){return t.weekdaysRegex(e)}),ge(["dd","ddd","dddd"],function(e,t,n,s){var i=n._locale.weekdaysParse(e,s,n._strict);null!=i?t.d=i:y(n).invalidWeekday=e}),ge(["d","e","E"],function(e,t,n,s){t[s]=Z(e)});var Ze="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),ze="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),$e="Su_Mo_Tu_We_Th_Fr_Sa".split("_"),qe=de,Be=de,Je=de;function Qe(){function e(e,t){return t.length-e.length}for(var t,n,s,i,r=[],a=[],o=[],u=[],l=0;l<7;l++)t=_([2e3,1]).day(l),n=me(this.weekdaysMin(t,"")),s=me(this.weekdaysShort(t,"")),i=me(this.weekdays(t,"")),r.push(n),a.push(s),o.push(i),u.push(n),u.push(s),u.push(i);r.sort(e),a.sort(e),o.sort(e),u.sort(e),this._weekdaysRegex=new RegExp("^("+u.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+o.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+a.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+r.join("|")+")","i")}function Xe(){return this.hours()%12||12}function Ke(e,t){C(e,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),t)})}function et(e,t){return t._meridiemParse}C("H",["HH",2],0,"hour"),C("h",["hh",2],0,Xe),C("k",["kk",2],0,function(){return this.hours()||24}),C("hmm",0,0,function(){return""+Xe.apply(this)+T(this.minutes(),2)}),C("hmmss",0,0,function(){return""+Xe.apply(this)+T(this.minutes(),2)+T(this.seconds(),2)}),C("Hmm",0,0,function(){return""+this.hours()+T(this.minutes(),2)}),C("Hmmss",0,0,function(){return""+this.hours()+T(this.minutes(),2)+T(this.seconds(),2)}),Ke("a",!0),Ke("A",!1),L("hour","h"),A("hour",13),ce("a",et),ce("A",et),ce("H",te),ce("h",te),ce("k",te),ce("HH",te,Q),ce("hh",te,Q),ce("kk",te,Q),ce("hmm",ne),ce("hmmss",se),ce("Hmm",ne),ce("Hmmss",se),ye(["H","HH"],Me),ye(["k","kk"],function(e,t,n){var s=Z(e);t[Me]=24===s?0:s}),ye(["a","A"],function(e,t,n){n._isPm=n._locale.isPM(e),n._meridiem=e}),ye(["h","hh"],function(e,t,n){t[Me]=Z(e),y(n).bigHour=!0}),ye("hmm",function(e,t,n){var s=e.length-2;t[Me]=Z(e.substr(0,s)),t[De]=Z(e.substr(s)),y(n).bigHour=!0}),ye("hmmss",function(e,t,n){var s=e.length-4,i=e.length-2;t[Me]=Z(e.substr(0,s)),t[De]=Z(e.substr(s,2)),t[Se]=Z(e.substr(i)),y(n).bigHour=!0}),ye("Hmm",function(e,t,n){var s=e.length-2;t[Me]=Z(e.substr(0,s)),t[De]=Z(e.substr(s))}),ye("Hmmss",function(e,t,n){var s=e.length-4,i=e.length-2;t[Me]=Z(e.substr(0,s)),t[De]=Z(e.substr(s,2)),t[Se]=Z(e.substr(i))});var tt=z("Hours",!0);var nt,st={calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},longDateFormat:{LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},invalidDate:"Invalid date",ordinal:"%d",dayOfMonthOrdinalParse:/\d{1,2}/,relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",w:"a week",ww:"%d weeks",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},months:Te,monthsShort:Ne,week:{dow:0,doy:6},weekdays:Ze,weekdaysMin:$e,weekdaysShort:ze,meridiemParse:/[ap]\.?m?\.?/i},it={},rt={};function at(e){return e?e.toLowerCase().replace("_","-"):e}function ot(e){for(var t,n,s,i,r=0;r=t&&function(e,t){for(var n=Math.min(e.length,t.length),s=0;s=t-1)break;t--}r++}return nt}function ut(t){var e;if(void 0===it[t]&&"undefined"!=typeof module&&module&&module.exports)try{e=nt._abbr,require("./locale/"+t),lt(e)}catch(e){it[t]=null}return it[t]}function lt(e,t){var n;return e&&((n=r(t)?dt(e):ht(e,t))?nt=n:"undefined"!=typeof console&&console.warn&&console.warn("Locale "+e+" not found. Did you forget to load it?")),nt._abbr}function ht(e,t){if(null===t)return delete it[e],null;var n,s=st;if(t.abbr=e,null!=it[e])Y("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),s=it[e]._config;else if(null!=t.parentLocale)if(null!=it[t.parentLocale])s=it[t.parentLocale]._config;else{if(null==(n=ut(t.parentLocale)))return rt[t.parentLocale]||(rt[t.parentLocale]=[]),rt[t.parentLocale].push({name:e,config:t}),null;s=n._config}return it[e]=new x(b(s,t)),rt[e]&&rt[e].forEach(function(e){ht(e.name,e.config)}),lt(e),it[e]}function dt(e){var t;if(e&&e._locale&&e._locale._abbr&&(e=e._locale._abbr),!e)return nt;if(!o(e)){if(t=ut(e))return t;e=[e]}return ot(e)}function ct(e){var t,n=e._a;return n&&-2===y(e).overflow&&(t=n[ve]<0||11xe(n[pe],n[ve])?ke:n[Me]<0||24je(n,r,a)?y(e)._overflowWeeks=!0:null!=u?y(e)._overflowWeekday=!0:(o=Ee(n,s,i,r,a),e._a[pe]=o.year,e._dayOfYear=o.dayOfYear)}(e),null!=e._dayOfYear&&(r=St(e._a[pe],s[pe]),(e._dayOfYear>Fe(r)||0===e._dayOfYear)&&(y(e)._overflowDayOfYear=!0),n=Ve(r,0,e._dayOfYear),e._a[ve]=n.getUTCMonth(),e._a[ke]=n.getUTCDate()),t=0;t<3&&null==e._a[t];++t)e._a[t]=u[t]=s[t];for(;t<7;t++)e._a[t]=u[t]=null==e._a[t]?2===t?1:0:e._a[t];24===e._a[Me]&&0===e._a[De]&&0===e._a[Se]&&0===e._a[Ye]&&(e._nextDay=!0,e._a[Me]=0),e._d=(e._useUTC?Ve:function(e,t,n,s,i,r,a){var o;return e<100&&0<=e?(o=new Date(e+400,t,n,s,i,r,a),isFinite(o.getFullYear())&&o.setFullYear(e)):o=new Date(e,t,n,s,i,r,a),o}).apply(null,u),i=e._useUTC?e._d.getUTCDay():e._d.getDay(),null!=e._tzm&&e._d.setUTCMinutes(e._d.getUTCMinutes()-e._tzm),e._nextDay&&(e._a[Me]=24),e._w&&void 0!==e._w.d&&e._w.d!==i&&(y(e).weekdayMismatch=!0)}}function Ot(e){if(e._f!==f.ISO_8601)if(e._f!==f.RFC_2822){e._a=[],y(e).empty=!0;for(var t,n,s,i,r,a,o,u=""+e._i,l=u.length,h=0,d=H(e._f,e._locale).match(N)||[],c=0;cn.valueOf():n.valueOf()"}),pn.toJSON=function(){return this.isValid()?this.toISOString():null},pn.toString=function(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")},pn.unix=function(){return Math.floor(this.valueOf()/1e3)},pn.valueOf=function(){return this._d.valueOf()-6e4*(this._offset||0)},pn.creationData=function(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}},pn.eraName=function(){for(var e,t=this.localeData().eras(),n=0,s=t.length;nthis.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()},pn.isLocal=function(){return!!this.isValid()&&!this._isUTC},pn.isUtcOffset=function(){return!!this.isValid()&&this._isUTC},pn.isUtc=At,pn.isUTC=At,pn.zoneAbbr=function(){return this._isUTC?"UTC":""},pn.zoneName=function(){return this._isUTC?"Coordinated Universal Time":""},pn.dates=n("dates accessor is deprecated. Use date instead.",fn),pn.months=n("months accessor is deprecated. Use month instead",Ue),pn.years=n("years accessor is deprecated. Use year instead",Le),pn.zone=n("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",function(e,t){return null!=e?("string"!=typeof e&&(e=-e),this.utcOffset(e,t),this):-this.utcOffset()}),pn.isDSTShifted=n("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",function(){if(!r(this._isDSTShifted))return this._isDSTShifted;var e,t={};return v(t,this),(t=bt(t))._a?(e=(t._isUTC?_:Tt)(t._a),this._isDSTShifted=this.isValid()&&0 { - try { - const data = await http.json({ - uri: 'https://www.nordpoolgroup.com/api/marketdata/page/10?' + - 'currency=,' + opts.currency + ',' + opts.currency + ',' + opts.currency + - '&endDate=' + aDate.format('DD-MM-YYYY'), - timeout: 30000 - } - ); - return parseResult(data, opts); - } catch (err) { - throw err; - } -}; - -const parseResult = (data, opts) => { - const timeZone = moment().tz(); - const result = []; - if (data.data && data.data.Rows && data.data.Rows.length) { - for (var i = 0; i < data.data.Rows.length; i++) { - const row = data.data.Rows[i]; - if (row.IsExtraRow) { - continue; - } - - const startsAt = moment.tz(row.StartTime, "YYYY-MM-DD\Thh:mm:ss", 'Europe/Oslo').tz(timeZone); - const time = startsAt.unix(); - - for (let j = 0; j < row.Columns.length; j++) { - const column = row.Columns[j]; - const price = Math.round(100000 * (parseFloat(column.Value.replace(/,/, '.').replace(' ', '')) / 1000.0)) / 100000; - - if (isNaN(price)) { - continue; - } - if (column.Name === opts.priceArea) { - result.push({ startsAt, time, price }); - } - } - } - } - return result; -}; - -const fetchPrices = async (aDate, opts) => { - try { - const oslo = moment().tz('Europe/Oslo'); - const ops = [ - aDate.utcOffset() > oslo.utcOffset() ? getHourlyPrices(moment(aDate).add(-1, 'day'), opts) : undefined, - getHourlyPrices(moment(aDate), opts), - getHourlyPrices(moment(aDate).add(1, 'day'), opts) - ]; - - const result = await Promise.all(ops.filter(o => !!o)); - - return result - .filter(r => r && typeof r === 'object' && r.length > 0) - .flatMap(r => r) - .sort((a,b) => a.time - b.time); - } catch (err) { - this.error(err); - } -}; - -module.exports = { - fetchPrices -}; diff --git a/lib/prices.js b/lib/prices.js deleted file mode 100644 index 5d1e2d8..0000000 --- a/lib/prices.js +++ /dev/null @@ -1,374 +0,0 @@ -'use strict'; - -const moment = require('./moment-timezone-with-data'); -const heating = require('./heating'); - -const toHour = (aDate) => { - return moment(aDate).startOf('hour').toISOString(); -} - -const currentPrice = (prices, aDate) => { - const currentHour = toHour(aDate); - return prices.find(p => toHour(p.startsAt) === currentHour); -}; - -const priceRatio = (prices, aDate) => { - const currentHour = toHour(aDate); - const withIndex = pricesStarting(prices, aDate, 0, 24) - .concat() - .sort((a, b) => a.price - b.price) - .findIndex(p => toHour(p.startsAt) === currentHour); - return Math.round((1 - withIndex / 23) * 1000000) / 1000000 -}; - -const pricesSorted = (prices, aDate) => { - return pricesStarting(prices, aDate, 0, 24) - .concat() - .sort((a, b) => a.price - b.price); -}; - -const priceLevels = [ - { - code: 'VERY_CHEAP', - eval: 'X <= 0.60', - description: 'The price is smaller or equal to 60 % compared to average price.' - }, - { - code: 'CHEAP', - eval: 'X > 0.60 && X <= 0.90', - description: 'The price is greater than 60 % and smaller or equal to 90 % compared to average price.' - }, - { - code: 'NORMAL', - eval: 'X > 0.90 && X < 1.15', - description: 'The price is greater than 90 % and smaller than 115 % compared to average price.' - }, - { - code: 'EXPENSIVE', - eval: 'X >= 1.15 && X < 1.40', - description: 'The price is greater or equal to 115 % and smaller than 140 % compared to average price.' - }, - { - code: 'VERY_EXPENSIVE', - eval: 'X >= 1.40', - description: 'The price is greater or equal to 140 % compared to average price.' - }, -]; - -const priceLevel = (prices, aDate) => { - const price = currentPrice(prices, aDate); - const averagePrice = averagePricesStarting(prices, aDate, 0, 24); - if (price && averagePrice !== 0) { - try { - const share = price.price / averagePrice; - for (const pl of priceLevels) { - if (eval(pl.eval.split("X").join(String(share)))) { - return pl; - } - } - } catch (err) { - } - } -}; - -const priceHighLow = (prices, aDate) => { - const sorted = pricesSorted(prices, aDate); - const high = sorted.length > 0 ? sorted[sorted.length - 1] : undefined; - const low = sorted.length > 0 ? sorted[0] : undefined; - const diffPercentage = high && low && low.price !== 0 ? (high.price - low.price) / low.price * 100 : 0; - const diffAmount = high && low ? high.price - low.price : 0; - return { - high, low, diffPercentage, diffAmount - }; -}; - -const pricesStarting = function (prices, aDate, startHour, num_hours) { - const startingAt = moment(aDate).hour(startHour).startOf('hour'); - return prices - .filter(p => p.startsAt.isSameOrAfter(startingAt)) - .slice(0, num_hours); -}; - -const priceNextHours = function (prices, aDate, num_hours) { - const startingAt = moment(aDate).startOf('hour').add(1, 'hour'); - return prices - .concat() - .filter(p => p.startsAt.isSameOrAfter(startingAt)) - .slice(0, num_hours); -}; - -const averagePricesStarting = function (prices, aDate, startHour, num_hours) { - const startingAt = moment(aDate).hour(startHour).startOf('hour'); - const arr = prices - .filter(p => p.startsAt.isSameOrAfter(startingAt)) - .map(p => p.price) - .slice(0, num_hours); - if (arr.length === 0) { - return 0; - } - return Math.round(arr.reduce((a, b) => a + b, 0) / arr.length * 10000000) / 10000000; -}; - -const checkAveragePrice = function (price, averagePrice, below, percentage) { - return (price - averagePrice) / averagePrice * 100 * (below ? -1 : 1) > percentage; -}; - -const checkLowPrice = function (prices, low_hours, aDate) { - return prices - .concat() - .sort((a, b) => a.price - b.price) - .slice(0, low_hours) - .filter(p => p.startsAt.isSameOrBefore(aDate) && moment(p.startsAt).add(1, 'hour').startOf('hour').isAfter(aDate)); -}; - -const checkHighPrice = function (prices, high_hours, aDate) { - return prices - .concat() - .sort((a, b) => b.price - a.price) - .slice(0, high_hours) - .filter(p => p.startsAt.isSameOrBefore(aDate) && moment(p.startsAt).add(1, 'hour').startOf('hour').isAfter(aDate)); -}; - -const checkHighPrice2 = function (prices, high_hours, aDate, state, filter = true) { - return prices - .map(p => { - p.heating = heating.calcHeating(p.startsAt, state.atHome, state.homeOverride, state.heatingOptions); - return p; - }) - .filter(p => p.heating.heating === false) - .filter((p, idx) => idx % 2 === 0) - .sort((a, b) => b.price - a.price) - .slice(0, high_hours) - .filter(p => !filter || filter && p.startsAt.isSameOrBefore(aDate) && moment(p.startsAt).add(1, 'hour').startOf('hour').isAfter(aDate)); -}; - -const minOfHighestPrices = function (prices, num_hours) { - const arr = prices - .concat() - .sort((a, b) => b.price - a.price) - .slice(0, num_hours); - if (arr.length > 0) { - return arr[arr.length - 1]; - } -}; - -const maxOfLowestPrices = function (prices, num_hours) { - const arr = prices - .concat() - .sort((a, b) => a.price - b.price) - .slice(0, num_hours); - if (arr.length > 0) { - return arr[arr.length - 1]; - } -}; - -const pricesAmongLowest = (prices, aDate, startHour, numHours, numLowestHours) => { - // Finds prices starting at 00:00 today - const pricesToday = pricesStarting(prices, aDate, 0, 24); - if (pricesToday.length === 0) { - return false; - } - - // Maximum price of lowest hours today - const maxOfPeriodToday = maxOfLowestPrices(pricesToday, numLowestHours); - - // X following prices - const pricesFollowing = pricesStarting(prices, aDate, startHour, numHours); - if (pricesFollowing.length === 0) { - return false; - } - - // Maximum price of X following prices - const maxOfFollowing = maxOfLowestPrices(pricesFollowing, numHours); - - return maxOfFollowing.price <= maxOfPeriodToday.price; -} - -const pricesAmongHighest = (prices, aDate, startHour, numHours, numHighestHours) => { - // Finds prices starting at 00:00 today - const pricesToday = pricesStarting(prices, aDate, 0, 24); - if (pricesToday.length === 0) { - return false; - } - - // Minimum price of highest hours today - const minOfPeriodToday = minOfHighestPrices(pricesToday, numHighestHours); - - // X following prices - const pricesFollowing = pricesStarting(prices, aDate, startHour, numHours); - if (pricesFollowing.length === 0) { - return false; - } - - // Minimum price of X following prices - const minOfFollowing = minOfHighestPrices(pricesFollowing, numHours); - - return minOfFollowing.price >= minOfPeriodToday.price; -} - -const daysPeriod = (aDate, start, end) => { - const starts = start.split(':'); - const startHour = parseInt(starts[0]) + parseInt(starts[1]) / 60; - const ends = end.split(':'); - let endHour = parseInt(ends[0]) + parseInt(ends[1]) / 60; - if (startHour === endHour) { - endHour += 24; - } - - let startTs = moment(aDate).startOf('day').add(startHour, 'hour'); - let endTs = moment(aDate).startOf('day').add(endHour, 'hour'); - - if (startHour >= endHour) { - if (aDate.isSameOrBefore(endTs)) { - startTs.add(-1, 'day'); - } else { - endTs.add(1, 'day'); - } - } - - return { startTs, endTs }; -} - -const pricesLowestInPeriod = (prices, aDate, startingAt, endingAt, numLowestHours) => { - if (aDate.isBefore(startingAt) - || aDate.isAfter(endingAt)) { - // Not in period - return false; - } - - // Finds prices in period - const pricesInPeriod = prices - .concat() - .filter(p => p.startsAt.isSameOrAfter(startingAt) - && p.startsAt.isBefore(endingAt)); - if (pricesInPeriod.length === 0) { - // No prices - return false; - } - - // Maximum price of the lowest - const maxOfPeriod = maxOfLowestPrices(pricesInPeriod, numLowestHours); - - const current = currentPrice(prices, aDate); - - return !!maxOfPeriod && current.price <= maxOfPeriod.price; -} - -const pricesHighestInPeriod = (prices, aDate, startingAt, endingAt, numHighestHours) => { - if (aDate.isBefore(startingAt) - || aDate.isAfter(endingAt)) { - // Not in period - return false; - } - - // Finds prices in period - const pricesInPeriod = prices - .concat() - .filter(p => p.startsAt.isSameOrAfter(startingAt) - && p.startsAt.isBefore(endingAt)); - if (pricesInPeriod.length === 0) { - // No prices - return false; - } - - // Minimum price of the highest - const minOfPeriod = minOfHighestPrices(pricesInPeriod, numHighestHours); - - const current = currentPrice(prices, aDate); - - return !!minOfPeriod && current.price >= minOfPeriod.price; -} - -const checkSumPrices = (prices, aDate, startingAt, endingAt, hours, low = true) => { - if (aDate.isBefore(startingAt) - || aDate.isAfter(endingAt)) { - // Not in period - return false; - } - - const pricesInPeriod = prices - .filter(p => p.startsAt.isSameOrAfter(startingAt) - && p.startsAt.isBefore(endingAt)); - if (pricesInPeriod.length === 0) { - // No prices - return false; - } - - const sumPrices = []; - for (let a = 0; a < pricesInPeriod.length - hours + 1; a++) { - const val = { - startsAt: moment(pricesInPeriod[a].startsAt), - endsAt: moment(pricesInPeriod[a].startsAt).add(hours, 'hour'), - price: 0 - } - for (let b = 0; b < hours; b++) { - val.price += pricesInPeriod[a + b].price; - } - sumPrices.push(val); - } - - const arr = low ? - sumPrices - .sort((a, b) => a.price - b.price) : - sumPrices - .sort((a, b) => b.price - a.price); - - if (arr.length > 0 - && aDate.isSameOrAfter(arr[0].startsAt) - && aDate.isBefore(arr[0].endsAt) - ) { - return arr[0]; - } -} - -const currentPriceLowerThanNext = (prices, aDate, numHours) => { - const pricesFollowing = priceNextHours(prices, aDate, numHours); - if (pricesFollowing.length === 0) { - return false; - } - - const minOfPeriod = minOfHighestPrices(pricesFollowing, numHours); - - const current = currentPrice(prices, aDate); - - return !!minOfPeriod && current.price <= minOfPeriod.price; -} - -const currentPriceHigherThanNext = (prices, aDate, numHours) => { - const pricesFollowing = priceNextHours(prices, aDate, numHours); - if (pricesFollowing.length === 0) { - return false; - } - - const maxOfPeriod = maxOfLowestPrices(pricesFollowing, numHours); - - const current = currentPrice(prices, aDate); - - return !!maxOfPeriod && current.price >= maxOfPeriod.price; -} - -module.exports = { - toHour, - currentPrice, - priceRatio, - pricesSorted, - priceLevel, - priceHighLow, - pricesStarting, - averagePricesStarting, - checkAveragePrice, - checkLowPrice, - checkHighPrice, - checkHighPrice2, - minOfHighestPrices, - maxOfLowestPrices, - pricesAmongLowest, - pricesAmongHighest, - daysPeriod, - pricesLowestInPeriod, - pricesHighestInPeriod, - checkSumPrices, - currentPriceLowerThanNext, - currentPriceHigherThanNext, -}; - diff --git a/package-lock.json b/package-lock.json index bf5a507..0fba701 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,27 +5,174 @@ "requires": true, "packages": { "": { + "name": "no.almli.heatingcontroller", "version": "1.0.0", "license": "ISC", "dependencies": { - "http.min": "2.1.0" + "@balmli/homey-utility-prices": "^1.0.0" }, "devDependencies": { - "chai": "^4.3.4", + "@tsconfig/node12": "^1.0.9", + "@types/chai": "^4.3.0", + "@types/homey": "npm:homey-apps-sdk-v3-types@^0.2.2", + "@types/mocha": "^9.1.0", + "@types/node": "^16.11.12", + "chai": "^4.3.6", "chai-datetime": "^1.8.0", - "eslint": "^8.0.1", - "mocha": "^9.1.2" + "eslint": "^7.32.0", + "eslint-config-athom": "^3.0.1", + "mocha": "^9.2.0", + "ts-node": "^10.4.0", + "typescript": "^4.5.4" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.10.4" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/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==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/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==", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@balmli/homey-public-holidays": { + "version": "1.0.1", + "resolved": "https://npm.pkg.github.com/download/@balmli/homey-public-holidays/1.0.1/4fb7527c359f9a5c8b3f07e74ed7e6730e10feb5", + "integrity": "sha512-7qALNa5Z3b/vmo1LcdieH5hQi83cHum4QGCvFnDaytoNHAJjmAjvHL3rrslcQkFnLuiQJToYrkBAK4H7JW5rLA==", + "license": "ISC", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@balmli/homey-utility-prices": { + "version": "1.0.0", + "resolved": "https://npm.pkg.github.com/download/@balmli/homey-utility-prices/1.0.0/9a2423189c2097681657d7a8b428e204fd2e7a60", + "integrity": "sha512-wIODkr64VHv3gl9trBMJeNY9UWV8JXTP8slL1f7rl11jt88svsFZ/9pNkx/0nF11mWOIWk5UiWASruSoeLMSRw==", + "license": "ISC", + "dependencies": { + "@balmli/homey-public-holidays": "^1.0.1", + "http.min": "2.1.0", + "moment-timezone": "0.5.40" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" } }, "node_modules/@eslint/eslintrc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.3.tgz", - "integrity": "sha512-DHI1wDPoKCBPoLZA3qDR91+3te/wDSc1YhKg3jR8NxKKRJq2hwHwcWv31cSwSYvIBrmbENoYMWcenW8uproQqg==", + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", + "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", "dev": true, "dependencies": { "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.0.0", + "debug": "^4.1.1", + "espree": "^7.3.0", "globals": "^13.9.0", "ignore": "^4.0.6", "import-fresh": "^3.2.1", @@ -34,7 +181,7 @@ "strip-json-comments": "^3.1.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^10.12.0 || >=12.0.0" } }, "node_modules/@eslint/eslintrc/node_modules/argparse": { @@ -60,9 +207,9 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.6.0.tgz", - "integrity": "sha512-JQlEKbcgEUjBFhLIF4iqM7u/9lwgHRBcpHrmUNCALK0Q3amXN6lxdoXLnF0sm11E9VqTmBALR87IlUg1bZ8A9A==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", "dev": true, "dependencies": { "@humanwhocodes/object-schema": "^1.2.0", @@ -74,11 +221,483 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz", - "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", + "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", + "dev": true + }, + "node_modules/@types/chai": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.4.tgz", + "integrity": "sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==", + "dev": true + }, + "node_modules/@types/homey": { + "name": "homey-apps-sdk-v3-types", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/homey-apps-sdk-v3-types/-/homey-apps-sdk-v3-types-0.2.2.tgz", + "integrity": "sha512-FS0ahnOTs3e5BBlL/q8dD/mFcoCZeqH+BIrjZ4krQjybpAvyDA0cqQm9ROUxNbcUoVVNStCEBJEooSvJR1HSmg==", + "dev": true, + "dependencies": { + "@types/node": "^14.14.20" + } + }, + "node_modules/@types/homey/node_modules/@types/node": { + "version": "14.18.35", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.35.tgz", + "integrity": "sha512-2ATO8pfhG1kDvw4Lc4C0GXIMSQFFJBCo/R1fSgTwmUlq5oy95LXyjDQinsRVgQY6gp6ghh3H91wk9ES5/5C+Tw==", + "dev": true + }, + "node_modules/@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true + }, + "node_modules/@types/mocha": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz", + "integrity": "sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==", + "dev": true + }, + "node_modules/@types/node": { + "version": "16.18.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.10.tgz", + "integrity": "sha512-XU1+v7h81p7145ddPfjv7jtWvkSilpcnON3mQ+bDi9Yuf7OI56efOglXRyXWgQ57xH3fEQgh7WOJMncRHVew5w==", + "dev": true + }, + "node_modules/@types/semver": { + "version": "7.3.13", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", + "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", "dev": true }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.46.1.tgz", + "integrity": "sha512-YpzNv3aayRBwjs4J3oz65eVLXc9xx0PDbIRisHj+dYhvBn02MjYOD96P8YGiWEIFBrojaUjxvkaUpakD82phsA==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.46.1", + "@typescript-eslint/type-utils": "5.46.1", + "@typescript-eslint/utils": "5.46.1", + "debug": "^4.3.4", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "regexpp": "^3.2.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.1.tgz", + "integrity": "sha512-d2qQLzTJ9WxQftPAuEQpSPmKqzxePjzVbpAVv62AQ64NTL+wR4JkrVqR/LqFsFEUsHDAiId52mJteHDFuDkElA==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "5.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.46.1.tgz", + "integrity": "sha512-RelQ5cGypPh4ySAtfIMBzBGyrNerQcmfA1oJvPj5f+H4jI59rl9xxpn4bonC0tQvUKOEN7eGBFWxFLK3Xepneg==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.46.1", + "@typescript-eslint/types": "5.46.1", + "@typescript-eslint/typescript-estree": "5.46.1", + "debug": "^4.3.4" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.46.1.tgz", + "integrity": "sha512-iOChVivo4jpwUdrJZyXSMrEIM/PvsbbDOX1y3UCKjSgWn+W89skxWaYXACQfxmIGhPVpRWK/VWPYc+bad6smIA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.46.1", + "@typescript-eslint/visitor-keys": "5.46.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "5.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.46.1.tgz", + "integrity": "sha512-V/zMyfI+jDmL1ADxfDxjZ0EMbtiVqj8LUGPAGyBkXXStWmCUErMpW873zEHsyguWCuq2iN4BrlWUkmuVj84yng==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "5.46.1", + "@typescript-eslint/utils": "5.46.1", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "5.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.46.1.tgz", + "integrity": "sha512-Z5pvlCaZgU+93ryiYUwGwLl9AQVB/PQ1TsJ9NZ/gHzZjN7g9IAn6RSDkpCV8hqTwAiaj6fmCcKSQeBPlIpW28w==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.46.1.tgz", + "integrity": "sha512-j9W4t67QiNp90kh5Nbr1w92wzt+toiIsaVPnEblB2Ih2U9fqBTyqV9T3pYWZBRt6QoMh/zVWP59EpuCjc4VRBg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.46.1", + "@typescript-eslint/visitor-keys": "5.46.1", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "5.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.46.1.tgz", + "integrity": "sha512-RBdBAGv3oEpFojaCYT4Ghn4775pdjvwfDOfQ2P6qzNVgQOVrnSPe5/Pb88kv7xzYQjoio0eKHKB9GJ16ieSxvA==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.46.1", + "@typescript-eslint/types": "5.46.1", + "@typescript-eslint/typescript-estree": "5.46.1", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.46.1.tgz", + "integrity": "sha512-jczZ9noovXwy59KjRTk1OftT78pwygdcmCuBf8yMoWt/8O8l+6x2LSEze0E4TeepXK4MezW3zGSyoDRZK7Y9cg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.46.1", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, "node_modules/@ungap/promise-all-settled": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", @@ -106,6 +725,15 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -155,25 +783,77 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/array-includes": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", + "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", "dev": true, "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" }, "engines": { - "node": ">= 8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, "node_modules/assertion-error": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", @@ -183,6 +863,15 @@ "node": "*" } }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", @@ -226,6 +915,19 @@ "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", "dev": true }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -248,15 +950,16 @@ } }, "node_modules/chai": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.4.tgz", - "integrity": "sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", + "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", "dev": true, "dependencies": { "assertion-error": "^1.1.0", "check-error": "^1.0.2", - "deep-eql": "^3.0.1", + "deep-eql": "^4.1.2", "get-func-name": "^2.0.0", + "loupe": "^2.3.1", "pathval": "^1.1.1", "type-detect": "^4.0.5" }, @@ -299,10 +1002,16 @@ } }, "node_modules/chokidar": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", - "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -319,18 +1028,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/cliui": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", @@ -366,6 +1063,18 @@ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, + "node_modules/confusing-browser-globals": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", + "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", + "dev": true + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -381,9 +1090,9 @@ } }, "node_modules/debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "dev": true, "dependencies": { "ms": "2.1.2" @@ -410,15 +1119,15 @@ } }, "node_modules/deep-eql": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", "dev": true, "dependencies": { "type-detect": "^4.0.0" }, "engines": { - "node": ">=0.12" + "node": ">=6" } }, "node_modules/deep-is": { @@ -427,6 +1136,22 @@ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, + "node_modules/define-properties": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "dev": true, + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/diff": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", @@ -436,6 +1161,18 @@ "node": ">=0.3.1" } }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -466,6 +1203,71 @@ "node": ">=8.6" } }, + "node_modules/es-abstract": { + "version": "1.20.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.5.tgz", + "integrity": "sha512-7h8MM2EQhsCA7pU/Nv78qOXFpD8Rhqd12gYiSJVkrH9+e8VuA8JlPJK/hQjjlLv6pJvx/z1iRFKzYb0XT/RuAQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.1.3", + "get-symbol-description": "^1.0.0", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.2", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "safe-regex-test": "^1.0.0", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "unbox-primitive": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -488,36 +1290,37 @@ } }, "node_modules/eslint": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.0.1.tgz", - "integrity": "sha512-LsgcwZgQ72vZ+SMp4K6pAnk2yFDWL7Ti4pJaRvsZ0Hsw2h8ZjUIW38a9AFn2cZXdBMlScMFYYgsSp4ttFI/0bA==", + "version": "7.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", + "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", "dev": true, "dependencies": { - "@eslint/eslintrc": "^1.0.3", - "@humanwhocodes/config-array": "^0.6.0", + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.3", + "@humanwhocodes/config-array": "^0.5.0", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", - "debug": "^4.3.2", + "debug": "^4.0.1", "doctrine": "^3.0.0", "enquirer": "^2.3.5", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^6.0.0", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.0.0", - "espree": "^9.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", "esquery": "^1.4.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "functional-red-black-tree": "^1.0.1", - "glob-parent": "^6.0.1", + "glob-parent": "^5.1.2", "globals": "^13.6.0", "ignore": "^4.0.6", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", - "js-yaml": "^4.1.0", + "js-yaml": "^3.13.1", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", @@ -525,10 +1328,11 @@ "natural-compare": "^1.4.0", "optionator": "^0.9.1", "progress": "^2.0.0", - "regexpp": "^3.2.0", + "regexpp": "^3.1.0", "semver": "^7.2.1", "strip-ansi": "^6.0.0", "strip-json-comments": "^3.1.0", + "table": "^6.0.9", "text-table": "^0.2.0", "v8-compile-cache": "^2.0.3" }, @@ -536,73 +1340,346 @@ "eslint": "bin/eslint.js" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^10.12.0 || >=12.0.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint-config-airbnb-base": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.1.tgz", + "integrity": "sha512-GOrQyDtVEc1Xy20U7vsB2yAoB4nBlfH5HZJeatRXHleO+OS5Ot+MWij4Dpltw4/DyIkqUfqz1epfhVR5XWWQPA==", + "dev": true, + "dependencies": { + "confusing-browser-globals": "^1.0.10", + "object.assign": "^4.1.2", + "object.entries": "^1.1.2" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "eslint": "^5.16.0 || ^6.8.0 || ^7.2.0", + "eslint-plugin-import": "^2.22.1" + } + }, + "node_modules/eslint-config-athom": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/eslint-config-athom/-/eslint-config-athom-3.1.1.tgz", + "integrity": "sha512-GtnARfOvuW/vJIvtfmZHwXXQimkuzR3+dNeGD95ASEr7DjjbF+26pWz6EBeFFSL3FnzF9oJr+jsxqTxlaK21nQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/eslint-plugin": "^5.30.7", + "@typescript-eslint/parser": "^5.30.7", + "eslint-config-airbnb-base": "^14.2.1", + "eslint-plugin-homey-app": "^1.0.2", + "eslint-plugin-import": "^2.24.2", + "eslint-plugin-mocha": "^6.3.0", + "eslint-plugin-node": "^11.1.0", + "typescript": "^4.4.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "eslint": ">=7.5.0" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", + "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "resolve": "^1.20.0" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", + "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", + "dev": true, + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-es": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz", + "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==", + "dev": true, + "dependencies": { + "eslint-utils": "^2.0.0", + "regexpp": "^3.0.0" + }, + "engines": { + "node": ">=8.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=4.19.1" + } + }, + "node_modules/eslint-plugin-homey-app": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-homey-app/-/eslint-plugin-homey-app-1.0.2.tgz", + "integrity": "sha512-uO09MpI0GaRfxWd8jKf6ei71zCCx3C4/8m1vm/GqYv1y/TEi8i2GdIlBCqyN67IXd4fwT+BNd+BoGxKh+8WC8A==", + "dev": true, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "eslint": "^7.32.0" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.26.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz", + "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.4", + "array.prototype.flat": "^1.2.5", + "debug": "^2.6.9", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-module-utils": "^2.7.3", + "has": "^1.0.3", + "is-core-module": "^2.8.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.values": "^1.1.5", + "resolve": "^1.22.0", + "tsconfig-paths": "^3.14.1" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/eslint-plugin-mocha": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-6.3.0.tgz", + "integrity": "sha512-Cd2roo8caAyG21oKaaNTj7cqeYRWW1I2B5SfpKRp0Ip1gkfwoR1Ow0IGlPWnNjzywdF4n+kHL8/9vM6zCJUxdg==", + "dev": true, + "dependencies": { + "eslint-utils": "^2.0.0", + "ramda": "^0.27.0" + }, + "engines": { + "node": ">=8.0.0" + }, + "peerDependencies": { + "eslint": ">= 4.0.0" + } + }, + "node_modules/eslint-plugin-node": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", + "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==", + "dev": true, + "dependencies": { + "eslint-plugin-es": "^3.0.0", + "eslint-utils": "^2.0.0", + "ignore": "^5.1.1", + "minimatch": "^3.0.4", + "resolve": "^1.10.1", + "semver": "^6.1.0" + }, + "engines": { + "node": ">=8.10.0" + }, + "peerDependencies": { + "eslint": ">=5.16.0" + } + }, + "node_modules/eslint-plugin-node/node_modules/ignore": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.1.tgz", + "integrity": "sha512-d2qQLzTJ9WxQftPAuEQpSPmKqzxePjzVbpAVv62AQ64NTL+wR4JkrVqR/LqFsFEUsHDAiId52mJteHDFuDkElA==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/eslint-plugin-node/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/eslint-scope": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-6.0.0.tgz", - "integrity": "sha512-uRDL9MWmQCkaFus8RF5K9/L/2fn+80yoW3jkD53l4shjCh26fCtvJGasxjUqP5OT87SYTxCVA3BwTUzuELx9kA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, "dependencies": { "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" + "estraverse": "^4.1.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=8.0.0" + } + }, + "node_modules/eslint-scope/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" } }, "node_modules/eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", "dev": true, "dependencies": { - "eslint-visitor-keys": "^2.0.0" + "eslint-visitor-keys": "^1.1.0" }, "engines": { - "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=5" } }, "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-visitor-keys": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", "dev": true, "engines": { - "node": ">=10" + "node": ">=10" + } + }, + "node_modules/eslint/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/eslint/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/espree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", + "dev": true, + "dependencies": { + "acorn": "^7.4.0", + "acorn-jsx": "^5.3.1", + "eslint-visitor-keys": "^1.3.0" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/eslint-visitor-keys": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.0.0.tgz", - "integrity": "sha512-mJOZa35trBTb3IyRmo8xmKBZlxf+N7OnUl4+ZhJHs/r+0770Wh/LEACE2pqMGMe27G/4y8P2bYGk4J70IC5k1Q==", + "node_modules/espree/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", "dev": true, + "bin": { + "acorn": "bin/acorn" + }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=0.4.0" } }, - "node_modules/espree": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.0.0.tgz", - "integrity": "sha512-r5EQJcYZ2oaGbeR0jR0fFVijGOcwai07/690YRXLINuhmVeRY4UKSAsQPe/0BNuDgwP7Ophoc1PRsr2E3tkbdQ==", + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "dev": true, - "dependencies": { - "acorn": "^8.5.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^3.0.0" - }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=4" } }, "node_modules/esprima": { @@ -666,6 +1743,22 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, + "node_modules/fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -678,6 +1771,15 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, + "node_modules/fastq": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.14.0.tgz", + "integrity": "sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -766,12 +1868,45 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/functional-red-black-tree": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", "dev": true }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -790,10 +1925,40 @@ "node": "*" } }, + "node_modules/get-intrinsic": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", "dev": true, "dependencies": { "fs.realpath": "^1.0.0", @@ -811,21 +1976,21 @@ } }, "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "dependencies": { - "is-glob": "^4.0.3" + "is-glob": "^4.0.1" }, "engines": { - "node": ">=10.13.0" + "node": ">= 6" } }, "node_modules/globals": { - "version": "13.11.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.11.0.tgz", - "integrity": "sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==", + "version": "13.19.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz", + "integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -837,6 +2002,47 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby/node_modules/ignore": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.1.tgz", + "integrity": "sha512-d2qQLzTJ9WxQftPAuEQpSPmKqzxePjzVbpAVv62AQ64NTL+wR4JkrVqR/LqFsFEUsHDAiId52mJteHDFuDkElA==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/growl": { "version": "1.10.5", "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", @@ -846,6 +2052,27 @@ "node": ">=4.x" } }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -855,6 +2082,45 @@ "node": ">=8" } }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -882,9 +2148,9 @@ } }, "node_modules/import-fresh": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", - "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, "dependencies": { "parent-module": "^1.0.0", @@ -892,6 +2158,9 @@ }, "engines": { "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/imurmurhash": { @@ -919,6 +2188,32 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, + "node_modules/internal-slot": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.4.tgz", + "integrity": "sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -931,6 +2226,61 @@ "node": ">=8" } }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -961,6 +2311,18 @@ "node": ">=0.10.0" } }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -970,6 +2332,21 @@ "node": ">=0.12.0" } }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-plain-obj": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", @@ -979,6 +2356,64 @@ "node": ">=8" } }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-unicode-supported": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", @@ -991,12 +2426,30 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -1021,6 +2474,18 @@ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", "dev": true }, + "node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -1055,6 +2520,12 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", + "dev": true + }, "node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -1071,6 +2542,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/loupe": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", + "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", + "dev": true, + "dependencies": { + "get-func-name": "^2.0.0" + } + }, "node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -1083,10 +2563,38 @@ "node": ">=10" } }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, "node_modules/minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "dependencies": { "brace-expansion": "^1.1.7" @@ -1095,33 +2603,42 @@ "node": "*" } }, + "node_modules/minimist": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/mocha": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.1.2.tgz", - "integrity": "sha512-ta3LtJ+63RIBP03VBjMGtSqbe6cWXRejF9SyM9Zyli1CKZJZ+vfCTj3oW24V7wAphMJdpOFLoMI3hjJ1LWbs0w==", + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.2.tgz", + "integrity": "sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==", "dev": true, "dependencies": { "@ungap/promise-all-settled": "1.1.2", "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", - "chokidar": "3.5.2", - "debug": "4.3.2", + "chokidar": "3.5.3", + "debug": "4.3.3", "diff": "5.0.0", "escape-string-regexp": "4.0.0", "find-up": "5.0.0", - "glob": "7.1.7", + "glob": "7.2.0", "growl": "1.10.5", "he": "1.2.0", "js-yaml": "4.1.0", "log-symbols": "4.1.0", - "minimatch": "3.0.4", + "minimatch": "4.2.1", "ms": "2.1.3", - "nanoid": "3.1.25", + "nanoid": "3.3.1", "serialize-javascript": "6.0.0", "strip-json-comments": "3.1.1", "supports-color": "8.1.1", "which": "2.0.2", - "workerpool": "6.1.5", + "workerpool": "6.2.0", "yargs": "16.2.0", "yargs-parser": "20.2.4", "yargs-unparser": "2.0.0" @@ -1138,6 +2655,18 @@ "url": "https://opencollective.com/mochajs" } }, + "node_modules/mocha/node_modules/minimatch": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-4.2.1.tgz", + "integrity": "sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/mocha/node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -1159,6 +2688,25 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/moment": { + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", + "engines": { + "node": "*" + } + }, + "node_modules/moment-timezone": { + "version": "0.5.40", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.40.tgz", + "integrity": "sha512-tWfmNkRYmBkPJz5mr9GVDn9vRlVZOTe6yqY92rFxiOdWXbjaR0+9LwQnZGGuNR63X456NqmEkbskte8tWL5ePg==", + "dependencies": { + "moment": ">= 2.9.0" + }, + "engines": { + "node": "*" + } + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -1166,9 +2714,9 @@ "dev": true }, "node_modules/nanoid": { - "version": "3.1.25", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.25.tgz", - "integrity": "sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", + "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", "dev": true, "bin": { "nanoid": "bin/nanoid.cjs" @@ -1183,6 +2731,12 @@ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, + "node_modules/natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true + }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -1192,6 +2746,73 @@ "node": ">=0.10.0" } }, + "node_modules/object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", + "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -1287,6 +2908,21 @@ "node": ">=8" } }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/pathval": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", @@ -1297,9 +2933,9 @@ } }, "node_modules/picomatch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, "engines": { "node": ">=8.6" @@ -1335,6 +2971,32 @@ "node": ">=6" } }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ramda": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.2.tgz", + "integrity": "sha512-SbiLPU40JuJniHexQSAgad32hfwd+DRUdwF2PlVuI5RZD0/vahUco7R8vD86J/tcEKKF9vZrUVwgtmGCqlCKyA==", + "dev": true + }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -1356,6 +3018,23 @@ "node": ">=8.10.0" } }, + "node_modules/regexp.prototype.flags": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", + "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/regexpp": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", @@ -1377,6 +3056,32 @@ "node": ">=0.10.0" } }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -1386,6 +3091,16 @@ "node": ">=4" } }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -1401,6 +3116,29 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -1421,6 +3159,20 @@ } ] }, + "node_modules/safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/semver": { "version": "7.3.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", @@ -1466,10 +3218,50 @@ "node": ">=8" } }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true }, "node_modules/string-width": { @@ -1486,6 +3278,34 @@ "node": ">=8" } }, + "node_modules/string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -1498,6 +3318,15 @@ "node": ">=8" } }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -1510,34 +3339,169 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/table": { + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", + "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", + "dev": true, + "dependencies": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/table/node_modules/ajv": { + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.2.tgz", + "integrity": "sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/table/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/ts-node/node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/tsconfig-paths": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", + "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", "dev": true, "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" } }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", "dev": true, "dependencies": { - "is-number": "^7.0.0" + "tslib": "^1.8.1" }, "engines": { - "node": ">=8.0" + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" } }, "node_modules/type-check": { @@ -1573,6 +3537,34 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/typescript": { + "version": "4.9.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", + "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -1588,6 +3580,12 @@ "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", "dev": true }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -1603,6 +3601,22 @@ "node": ">= 8" } }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", @@ -1613,9 +3627,9 @@ } }, "node_modules/workerpool": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.5.tgz", - "integrity": "sha512-XdKkCK0Zqc6w3iTxLckiuJ81tiD/o5rBE/m+nXpRCB+/Sq4DqkfXZ/x0jW02DG1tGsfUGXbTJyZDP+eu67haSw==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.0.tgz", + "integrity": "sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==", "dev": true }, "node_modules/wrap-ansi": { @@ -1698,6 +3712,15 @@ "node": ">=10" } }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", @@ -1709,64 +3732,491 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } - } - }, - "dependencies": { - "@eslint/eslintrc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.3.tgz", - "integrity": "sha512-DHI1wDPoKCBPoLZA3qDR91+3te/wDSc1YhKg3jR8NxKKRJq2hwHwcWv31cSwSYvIBrmbENoYMWcenW8uproQqg==", + } + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true + }, + "@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "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==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@balmli/homey-public-holidays": { + "version": "1.0.1", + "resolved": "https://npm.pkg.github.com/download/@balmli/homey-public-holidays/1.0.1/4fb7527c359f9a5c8b3f07e74ed7e6730e10feb5", + "integrity": "sha512-7qALNa5Z3b/vmo1LcdieH5hQi83cHum4QGCvFnDaytoNHAJjmAjvHL3rrslcQkFnLuiQJToYrkBAK4H7JW5rLA==" + }, + "@balmli/homey-utility-prices": { + "version": "1.0.0", + "resolved": "https://npm.pkg.github.com/download/@balmli/homey-utility-prices/1.0.0/9a2423189c2097681657d7a8b428e204fd2e7a60", + "integrity": "sha512-wIODkr64VHv3gl9trBMJeNY9UWV8JXTP8slL1f7rl11jt88svsFZ/9pNkx/0nF11mWOIWk5UiWASruSoeLMSRw==", + "requires": { + "@balmli/homey-public-holidays": "^1.0.1", + "http.min": "2.1.0", + "moment-timezone": "0.5.40" + } + }, + "@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "0.3.9" + } + }, + "@eslint/eslintrc": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", + "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.1.1", + "espree": "^7.3.0", + "globals": "^13.9.0", + "ignore": "^4.0.6", + "import-fresh": "^3.2.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "strip-json-comments": "^3.1.1" + }, + "dependencies": { + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + } + } + }, + "@humanwhocodes/config-array": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", + "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.0", + "debug": "^4.1.1", + "minimatch": "^3.0.4" + } + }, + "@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "@tsconfig/node16": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", + "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", + "dev": true + }, + "@types/chai": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.4.tgz", + "integrity": "sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==", + "dev": true + }, + "@types/homey": { + "version": "npm:homey-apps-sdk-v3-types@0.2.2", + "resolved": "https://registry.npmjs.org/homey-apps-sdk-v3-types/-/homey-apps-sdk-v3-types-0.2.2.tgz", + "integrity": "sha512-FS0ahnOTs3e5BBlL/q8dD/mFcoCZeqH+BIrjZ4krQjybpAvyDA0cqQm9ROUxNbcUoVVNStCEBJEooSvJR1HSmg==", + "dev": true, + "requires": { + "@types/node": "^14.14.20" + }, + "dependencies": { + "@types/node": { + "version": "14.18.35", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.35.tgz", + "integrity": "sha512-2ATO8pfhG1kDvw4Lc4C0GXIMSQFFJBCo/R1fSgTwmUlq5oy95LXyjDQinsRVgQY6gp6ghh3H91wk9ES5/5C+Tw==", + "dev": true + } + } + }, + "@types/json-schema": { + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "dev": true + }, + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true + }, + "@types/mocha": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz", + "integrity": "sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==", + "dev": true + }, + "@types/node": { + "version": "16.18.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.10.tgz", + "integrity": "sha512-XU1+v7h81p7145ddPfjv7jtWvkSilpcnON3mQ+bDi9Yuf7OI56efOglXRyXWgQ57xH3fEQgh7WOJMncRHVew5w==", + "dev": true + }, + "@types/semver": { + "version": "7.3.13", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", + "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", + "dev": true + }, + "@typescript-eslint/eslint-plugin": { + "version": "5.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.46.1.tgz", + "integrity": "sha512-YpzNv3aayRBwjs4J3oz65eVLXc9xx0PDbIRisHj+dYhvBn02MjYOD96P8YGiWEIFBrojaUjxvkaUpakD82phsA==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "5.46.1", + "@typescript-eslint/type-utils": "5.46.1", + "@typescript-eslint/utils": "5.46.1", + "debug": "^4.3.4", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "regexpp": "^3.2.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ignore": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.1.tgz", + "integrity": "sha512-d2qQLzTJ9WxQftPAuEQpSPmKqzxePjzVbpAVv62AQ64NTL+wR4JkrVqR/LqFsFEUsHDAiId52mJteHDFuDkElA==", + "dev": true + }, + "semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@typescript-eslint/parser": { + "version": "5.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.46.1.tgz", + "integrity": "sha512-RelQ5cGypPh4ySAtfIMBzBGyrNerQcmfA1oJvPj5f+H4jI59rl9xxpn4bonC0tQvUKOEN7eGBFWxFLK3Xepneg==", + "dev": true, + "requires": { + "@typescript-eslint/scope-manager": "5.46.1", + "@typescript-eslint/types": "5.46.1", + "@typescript-eslint/typescript-estree": "5.46.1", + "debug": "^4.3.4" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + } + } + }, + "@typescript-eslint/scope-manager": { + "version": "5.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.46.1.tgz", + "integrity": "sha512-iOChVivo4jpwUdrJZyXSMrEIM/PvsbbDOX1y3UCKjSgWn+W89skxWaYXACQfxmIGhPVpRWK/VWPYc+bad6smIA==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.46.1", + "@typescript-eslint/visitor-keys": "5.46.1" + } + }, + "@typescript-eslint/type-utils": { + "version": "5.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.46.1.tgz", + "integrity": "sha512-V/zMyfI+jDmL1ADxfDxjZ0EMbtiVqj8LUGPAGyBkXXStWmCUErMpW873zEHsyguWCuq2iN4BrlWUkmuVj84yng==", + "dev": true, + "requires": { + "@typescript-eslint/typescript-estree": "5.46.1", + "@typescript-eslint/utils": "5.46.1", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + } + } + }, + "@typescript-eslint/types": { + "version": "5.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.46.1.tgz", + "integrity": "sha512-Z5pvlCaZgU+93ryiYUwGwLl9AQVB/PQ1TsJ9NZ/gHzZjN7g9IAn6RSDkpCV8hqTwAiaj6fmCcKSQeBPlIpW28w==", + "dev": true + }, + "@typescript-eslint/typescript-estree": { + "version": "5.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.46.1.tgz", + "integrity": "sha512-j9W4t67QiNp90kh5Nbr1w92wzt+toiIsaVPnEblB2Ih2U9fqBTyqV9T3pYWZBRt6QoMh/zVWP59EpuCjc4VRBg==", + "dev": true, + "requires": { + "@typescript-eslint/types": "5.46.1", + "@typescript-eslint/visitor-keys": "5.46.1", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@typescript-eslint/utils": { + "version": "5.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.46.1.tgz", + "integrity": "sha512-RBdBAGv3oEpFojaCYT4Ghn4775pdjvwfDOfQ2P6qzNVgQOVrnSPe5/Pb88kv7xzYQjoio0eKHKB9GJ16ieSxvA==", "dev": true, "requires": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.0.0", - "globals": "^13.9.0", - "ignore": "^4.0.6", - "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.46.1", + "@typescript-eslint/types": "5.46.1", + "@typescript-eslint/typescript-estree": "5.46.1", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0", + "semver": "^7.3.7" }, "dependencies": { - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", "dev": true, "requires": { - "sprintf-js": "~1.0.2" + "eslint-visitor-keys": "^2.0.0" } }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "dev": true, "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "lru-cache": "^6.0.0" } } } }, - "@humanwhocodes/config-array": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.6.0.tgz", - "integrity": "sha512-JQlEKbcgEUjBFhLIF4iqM7u/9lwgHRBcpHrmUNCALK0Q3amXN6lxdoXLnF0sm11E9VqTmBALR87IlUg1bZ8A9A==", + "@typescript-eslint/visitor-keys": { + "version": "5.46.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.46.1.tgz", + "integrity": "sha512-jczZ9noovXwy59KjRTk1OftT78pwygdcmCuBf8yMoWt/8O8l+6x2LSEze0E4TeepXK4MezW3zGSyoDRZK7Y9cg==", "dev": true, "requires": { - "@humanwhocodes/object-schema": "^1.2.0", - "debug": "^4.1.1", - "minimatch": "^3.0.4" + "@typescript-eslint/types": "5.46.1", + "eslint-visitor-keys": "^3.3.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true + } } }, - "@humanwhocodes/object-schema": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz", - "integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==", - "dev": true - }, "@ungap/promise-all-settled": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", @@ -1786,6 +4236,12 @@ "dev": true, "requires": {} }, + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true + }, "ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -1820,27 +4276,70 @@ } }, "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, "requires": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, "argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, + "array-includes": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "is-string": "^1.0.7" + } + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "array.prototype.flat": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", + "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + } + }, "assertion-error": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", "dev": true }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true + }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", @@ -1878,6 +4377,16 @@ "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", "dev": true }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -1891,15 +4400,16 @@ "dev": true }, "chai": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.4.tgz", - "integrity": "sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", + "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", "dev": true, "requires": { "assertion-error": "^1.1.0", "check-error": "^1.0.2", - "deep-eql": "^3.0.1", + "deep-eql": "^4.1.2", "get-func-name": "^2.0.0", + "loupe": "^2.3.1", "pathval": "^1.1.1", "type-detect": "^4.0.5" } @@ -1930,9 +4440,9 @@ "dev": true }, "chokidar": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", - "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "dev": true, "requires": { "anymatch": "~3.1.2", @@ -1943,17 +4453,6 @@ "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" - }, - "dependencies": { - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - } } }, "cliui": { @@ -1988,6 +4487,18 @@ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, + "confusing-browser-globals": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", + "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", + "dev": true + }, + "create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, "cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -2000,9 +4511,9 @@ } }, "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "dev": true, "requires": { "ms": "2.1.2" @@ -2015,9 +4526,9 @@ "dev": true }, "deep-eql": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", "dev": true, "requires": { "type-detect": "^4.0.0" @@ -2029,12 +4540,31 @@ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, + "define-properties": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "dev": true, + "requires": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, "diff": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", "dev": true }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, "doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -2059,6 +4589,59 @@ "ansi-colors": "^4.1.1" } }, + "es-abstract": { + "version": "1.20.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.5.tgz", + "integrity": "sha512-7h8MM2EQhsCA7pU/Nv78qOXFpD8Rhqd12gYiSJVkrH9+e8VuA8JlPJK/hQjjlLv6pJvx/z1iRFKzYb0XT/RuAQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.1.3", + "get-symbol-description": "^1.0.0", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.2", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "safe-regex-test": "^1.0.0", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "unbox-primitive": "^1.0.2" + } + }, + "es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -2072,36 +4655,37 @@ "dev": true }, "eslint": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.0.1.tgz", - "integrity": "sha512-LsgcwZgQ72vZ+SMp4K6pAnk2yFDWL7Ti4pJaRvsZ0Hsw2h8ZjUIW38a9AFn2cZXdBMlScMFYYgsSp4ttFI/0bA==", + "version": "7.32.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", + "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", "dev": true, "requires": { - "@eslint/eslintrc": "^1.0.3", - "@humanwhocodes/config-array": "^0.6.0", + "@babel/code-frame": "7.12.11", + "@eslint/eslintrc": "^0.4.3", + "@humanwhocodes/config-array": "^0.5.0", "ajv": "^6.10.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", - "debug": "^4.3.2", + "debug": "^4.0.1", "doctrine": "^3.0.0", "enquirer": "^2.3.5", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^6.0.0", - "eslint-utils": "^3.0.0", - "eslint-visitor-keys": "^3.0.0", - "espree": "^9.0.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^2.1.0", + "eslint-visitor-keys": "^2.0.0", + "espree": "^7.3.1", "esquery": "^1.4.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^6.0.1", "functional-red-black-tree": "^1.0.1", - "glob-parent": "^6.0.1", + "glob-parent": "^5.1.2", "globals": "^13.6.0", "ignore": "^4.0.6", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", - "js-yaml": "^4.1.0", + "js-yaml": "^3.13.1", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", @@ -2109,56 +4693,270 @@ "natural-compare": "^1.4.0", "optionator": "^0.9.1", "progress": "^2.0.0", - "regexpp": "^3.2.0", + "regexpp": "^3.1.0", "semver": "^7.2.1", "strip-ansi": "^6.0.0", "strip-json-comments": "^3.1.0", + "table": "^6.0.9", "text-table": "^0.2.0", "v8-compile-cache": "^2.0.3" + }, + "dependencies": { + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + } + } + }, + "eslint-config-airbnb-base": { + "version": "14.2.1", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.1.tgz", + "integrity": "sha512-GOrQyDtVEc1Xy20U7vsB2yAoB4nBlfH5HZJeatRXHleO+OS5Ot+MWij4Dpltw4/DyIkqUfqz1epfhVR5XWWQPA==", + "dev": true, + "requires": { + "confusing-browser-globals": "^1.0.10", + "object.assign": "^4.1.2", + "object.entries": "^1.1.2" + } + }, + "eslint-config-athom": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/eslint-config-athom/-/eslint-config-athom-3.1.1.tgz", + "integrity": "sha512-GtnARfOvuW/vJIvtfmZHwXXQimkuzR3+dNeGD95ASEr7DjjbF+26pWz6EBeFFSL3FnzF9oJr+jsxqTxlaK21nQ==", + "dev": true, + "requires": { + "@typescript-eslint/eslint-plugin": "^5.30.7", + "@typescript-eslint/parser": "^5.30.7", + "eslint-config-airbnb-base": "^14.2.1", + "eslint-plugin-homey-app": "^1.0.2", + "eslint-plugin-import": "^2.24.2", + "eslint-plugin-mocha": "^6.3.0", + "eslint-plugin-node": "^11.1.0", + "typescript": "^4.4.3" + } + }, + "eslint-import-resolver-node": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz", + "integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==", + "dev": true, + "requires": { + "debug": "^3.2.7", + "resolve": "^1.20.0" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "eslint-module-utils": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", + "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", + "dev": true, + "requires": { + "debug": "^3.2.7" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "eslint-plugin-es": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz", + "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==", + "dev": true, + "requires": { + "eslint-utils": "^2.0.0", + "regexpp": "^3.0.0" + } + }, + "eslint-plugin-homey-app": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-homey-app/-/eslint-plugin-homey-app-1.0.2.tgz", + "integrity": "sha512-uO09MpI0GaRfxWd8jKf6ei71zCCx3C4/8m1vm/GqYv1y/TEi8i2GdIlBCqyN67IXd4fwT+BNd+BoGxKh+8WC8A==", + "dev": true, + "requires": {} + }, + "eslint-plugin-import": { + "version": "2.26.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz", + "integrity": "sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==", + "dev": true, + "requires": { + "array-includes": "^3.1.4", + "array.prototype.flat": "^1.2.5", + "debug": "^2.6.9", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-module-utils": "^2.7.3", + "has": "^1.0.3", + "is-core-module": "^2.8.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.values": "^1.1.5", + "resolve": "^1.22.0", + "tsconfig-paths": "^3.14.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + } + } + }, + "eslint-plugin-mocha": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-6.3.0.tgz", + "integrity": "sha512-Cd2roo8caAyG21oKaaNTj7cqeYRWW1I2B5SfpKRp0Ip1gkfwoR1Ow0IGlPWnNjzywdF4n+kHL8/9vM6zCJUxdg==", + "dev": true, + "requires": { + "eslint-utils": "^2.0.0", + "ramda": "^0.27.0" + } + }, + "eslint-plugin-node": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", + "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==", + "dev": true, + "requires": { + "eslint-plugin-es": "^3.0.0", + "eslint-utils": "^2.0.0", + "ignore": "^5.1.1", + "minimatch": "^3.0.4", + "resolve": "^1.10.1", + "semver": "^6.1.0" + }, + "dependencies": { + "ignore": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.1.tgz", + "integrity": "sha512-d2qQLzTJ9WxQftPAuEQpSPmKqzxePjzVbpAVv62AQ64NTL+wR4JkrVqR/LqFsFEUsHDAiId52mJteHDFuDkElA==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } } }, "eslint-scope": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-6.0.0.tgz", - "integrity": "sha512-uRDL9MWmQCkaFus8RF5K9/L/2fn+80yoW3jkD53l4shjCh26fCtvJGasxjUqP5OT87SYTxCVA3BwTUzuELx9kA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dev": true, "requires": { "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" + "estraverse": "^4.1.1" + }, + "dependencies": { + "estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true + } } }, "eslint-utils": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", - "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", "dev": true, "requires": { - "eslint-visitor-keys": "^2.0.0" + "eslint-visitor-keys": "^1.1.0" }, "dependencies": { "eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", "dev": true } } }, "eslint-visitor-keys": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.0.0.tgz", - "integrity": "sha512-mJOZa35trBTb3IyRmo8xmKBZlxf+N7OnUl4+ZhJHs/r+0770Wh/LEACE2pqMGMe27G/4y8P2bYGk4J70IC5k1Q==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", "dev": true }, "espree": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.0.0.tgz", - "integrity": "sha512-r5EQJcYZ2oaGbeR0jR0fFVijGOcwai07/690YRXLINuhmVeRY4UKSAsQPe/0BNuDgwP7Ophoc1PRsr2E3tkbdQ==", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", + "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", "dev": true, "requires": { - "acorn": "^8.5.0", + "acorn": "^7.4.0", "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^3.0.0" + "eslint-visitor-keys": "^1.3.0" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + }, + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } } }, "esprima": { @@ -2203,6 +5001,19 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, + "fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, "fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -2215,6 +5026,15 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, + "fastq": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.14.0.tgz", + "integrity": "sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, "file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -2278,12 +5098,36 @@ "dev": true, "optional": true }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + } + }, "functional-red-black-tree": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", "dev": true }, + "functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true + }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -2296,10 +5140,31 @@ "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", "dev": true }, + "get-intrinsic": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", + "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, + "get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, "glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -2310,22 +5175,53 @@ "path-is-absolute": "^1.0.0" } }, - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globals": { + "version": "13.19.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz", + "integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, "requires": { - "is-glob": "^4.0.3" + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "dependencies": { + "ignore": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.1.tgz", + "integrity": "sha512-d2qQLzTJ9WxQftPAuEQpSPmKqzxePjzVbpAVv62AQ64NTL+wR4JkrVqR/LqFsFEUsHDAiId52mJteHDFuDkElA==", + "dev": true + } } }, - "globals": { - "version": "13.11.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.11.0.tgz", - "integrity": "sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==", + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", "dev": true, "requires": { - "type-fest": "^0.20.2" + "get-intrinsic": "^1.1.3" } }, "growl": { @@ -2334,12 +5230,51 @@ "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", "dev": true }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, + "has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.1" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true + }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, "he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -2358,9 +5293,9 @@ "dev": true }, "import-fresh": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz", - "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, "requires": { "parent-module": "^1.0.0", @@ -2389,6 +5324,26 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, + "internal-slot": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.4.tgz", + "integrity": "sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, + "is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "requires": { + "has-bigints": "^1.0.1" + } + }, "is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -2398,6 +5353,40 @@ "binary-extensions": "^2.0.0" } }, + "is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true + }, + "is-core-module": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -2419,30 +5408,97 @@ "is-extglob": "^2.1.1" } }, + "is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true + }, "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, + "is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, "is-plain-obj": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", "dev": true }, + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, "is-unicode-supported": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "dev": true }, + "is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, "js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -2464,6 +5520,15 @@ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", "dev": true }, + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, "levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -2489,6 +5554,12 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, + "lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", + "dev": true + }, "log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -2499,6 +5570,15 @@ "is-unicode-supported": "^0.1.0" } }, + "loupe": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", + "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", + "dev": true, + "requires": { + "get-func-name": "^2.0.0" + } + }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -2508,47 +5588,84 @@ "yallist": "^4.0.0" } }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, "requires": { "brace-expansion": "^1.1.7" } }, + "minimist": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", + "dev": true + }, "mocha": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.1.2.tgz", - "integrity": "sha512-ta3LtJ+63RIBP03VBjMGtSqbe6cWXRejF9SyM9Zyli1CKZJZ+vfCTj3oW24V7wAphMJdpOFLoMI3hjJ1LWbs0w==", + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.2.tgz", + "integrity": "sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==", "dev": true, "requires": { "@ungap/promise-all-settled": "1.1.2", "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", - "chokidar": "3.5.2", - "debug": "4.3.2", + "chokidar": "3.5.3", + "debug": "4.3.3", "diff": "5.0.0", "escape-string-regexp": "4.0.0", "find-up": "5.0.0", - "glob": "7.1.7", + "glob": "7.2.0", "growl": "1.10.5", "he": "1.2.0", "js-yaml": "4.1.0", "log-symbols": "4.1.0", - "minimatch": "3.0.4", + "minimatch": "4.2.1", "ms": "2.1.3", - "nanoid": "3.1.25", + "nanoid": "3.3.1", "serialize-javascript": "6.0.0", "strip-json-comments": "3.1.1", "supports-color": "8.1.1", "which": "2.0.2", - "workerpool": "6.1.5", + "workerpool": "6.2.0", "yargs": "16.2.0", "yargs-parser": "20.2.4", "yargs-unparser": "2.0.0" }, "dependencies": { + "minimatch": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-4.2.1.tgz", + "integrity": "sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, "ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -2566,6 +5683,19 @@ } } }, + "moment": { + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==" + }, + "moment-timezone": { + "version": "0.5.40", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.40.tgz", + "integrity": "sha512-tWfmNkRYmBkPJz5mr9GVDn9vRlVZOTe6yqY92rFxiOdWXbjaR0+9LwQnZGGuNR63X456NqmEkbskte8tWL5ePg==", + "requires": { + "moment": ">= 2.9.0" + } + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -2573,9 +5703,9 @@ "dev": true }, "nanoid": { - "version": "3.1.25", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.25.tgz", - "integrity": "sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", + "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", "dev": true }, "natural-compare": { @@ -2584,12 +5714,64 @@ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, + "natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true + }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, + "object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + } + }, + "object.entries": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", + "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "object.values": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -2658,6 +5840,18 @@ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, "pathval": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", @@ -2665,9 +5859,9 @@ "dev": true }, "picomatch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true }, "prelude-ls": { @@ -2688,6 +5882,18 @@ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "ramda": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.2.tgz", + "integrity": "sha512-SbiLPU40JuJniHexQSAgad32hfwd+DRUdwF2PlVuI5RZD0/vahUco7R8vD86J/tcEKKF9vZrUVwgtmGCqlCKyA==", + "dev": true + }, "randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -2706,6 +5912,17 @@ "picomatch": "^2.2.1" } }, + "regexp.prototype.flags": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", + "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" + } + }, "regexpp": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", @@ -2718,12 +5935,35 @@ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", "dev": true }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true + }, + "resolve": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", + "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "dev": true, + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, "resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, "rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -2733,12 +5973,32 @@ "glob": "^7.1.3" } }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true }, + "safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + } + }, "semver": { "version": "7.3.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", @@ -2772,10 +6032,38 @@ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true }, "string-width": { @@ -2789,6 +6077,28 @@ "strip-ansi": "^6.0.1" } }, + "string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, "strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -2798,6 +6108,12 @@ "ansi-regex": "^5.0.1" } }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true + }, "strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -2813,6 +6129,45 @@ "has-flag": "^4.0.0" } }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, + "table": { + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", + "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", + "dev": true, + "requires": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "dependencies": { + "ajv": { + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.2.tgz", + "integrity": "sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + } + } + }, "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -2828,6 +6183,62 @@ "is-number": "^7.0.0" } }, + "ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "requires": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "dependencies": { + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + } + } + }, + "tsconfig-paths": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", + "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", + "dev": true, + "requires": { + "@types/json5": "^0.0.29", + "json5": "^1.0.1", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + }, "type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -2849,6 +6260,24 @@ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true }, + "typescript": { + "version": "4.9.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.4.tgz", + "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==", + "dev": true + }, + "unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + } + }, "uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -2864,6 +6293,12 @@ "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", "dev": true }, + "v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -2873,6 +6308,19 @@ "isexe": "^2.0.0" } }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", @@ -2880,9 +6328,9 @@ "dev": true }, "workerpool": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.5.tgz", - "integrity": "sha512-XdKkCK0Zqc6w3iTxLckiuJ81tiD/o5rBE/m+nXpRCB+/Sq4DqkfXZ/x0jW02DG1tGsfUGXbTJyZDP+eu67haSw==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.0.tgz", + "integrity": "sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==", "dev": true }, "wrap-ansi": { @@ -2947,6 +6395,12 @@ "is-plain-obj": "^2.1.0" } }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true + }, "yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/package.json b/package.json index 2d200b3..6be6264 100644 --- a/package.json +++ b/package.json @@ -2,21 +2,30 @@ "name": "no.almli.heatingcontroller", "version": "1.0.0", "description": "Heating Controller with utility prices from Nordpoolspot", - "main": "app.js", + "main": "app.ts", "scripts": { - "pretest": "eslint --ignore-path .gitignore app.js lib drivers test", - "test": "./node_modules/.bin/mocha --reporter spec", + "build": "tsc", + "xx_pretest": "eslint --ignore-path .gitignore app.js lib drivers test", + "test": "env TS_NODE_COMPILER_OPTIONS='{\"module\": \"commonjs\" }' mocha -r ts-node/register 'test/**/*.js'", "posttest": "homey app validate" }, "author": "Bjørnar Almli", "license": "ISC", "dependencies": { - "http.min": "2.1.0" + "@balmli/homey-utility-prices": "^1.0.0" }, "devDependencies": { - "chai": "^4.3.4", + "@tsconfig/node12": "^1.0.9", + "@types/chai": "^4.3.0", + "@types/homey": "npm:homey-apps-sdk-v3-types@^0.2.2", + "@types/mocha": "^9.1.0", + "@types/node": "^16.11.12", + "chai": "^4.3.6", "chai-datetime": "^1.8.0", - "eslint": "^8.0.1", - "mocha": "^9.1.2" + "eslint": "^7.32.0", + "eslint-config-athom": "^3.0.1", + "mocha": "^9.2.0", + "ts-node": "^10.4.0", + "typescript": "^4.5.4" } } diff --git a/scripts/.gitignore b/scripts/.gitignore deleted file mode 100644 index 8d87b1d..0000000 --- a/scripts/.gitignore +++ /dev/null @@ -1 +0,0 @@ -node_modules/* diff --git a/scripts/create.js b/scripts/create.js deleted file mode 100644 index 06b8376..0000000 --- a/scripts/create.js +++ /dev/null @@ -1,40 +0,0 @@ -'use strict'; - -const Holidays = require('date-holidays'); -const countries = require('../lib/countries'); - -console.log(`'use strict';`); -console.log('const holidays_list = {'); -countries.map(c => { - let hd = new Holidays(c.id); - const startYear = new Date().getFullYear(); - for (let year = startYear; year < startYear + 3; year++) { - let dates = hd.getHolidays(year); - if (dates) { - const result = dates - .filter(date => date.type !== 'public') - .reduce( - (accumulator, target) => ({...accumulator, [target.date.substr(0, 10)]: target}), - {}); - - const publicHolidays = dates - .filter(date => date.type === 'public') - .reduce( - (accumulator, target) => ({...accumulator, [target.date.substr(0, 10)]: target}), - {}); - - Object.keys(publicHolidays).forEach(function (key) { - result[key] = publicHolidays[key]; - }); - - Object.keys(result) - .sort() - .forEach(function (key) { - let ho = result[key]; - console.log(`"${c.id}-${ho.date.substr(0, 10)}":{"type":"${ho.type}","name":"${ho.name}"},`); - }); - } - } -}); -console.log('};'); -console.log(`module.exports = holidays_list;`); diff --git a/scripts/package-lock.json b/scripts/package-lock.json deleted file mode 100644 index 70b1315..0000000 --- a/scripts/package-lock.json +++ /dev/null @@ -1,263 +0,0 @@ -{ - "name": "no.almli.heatingcontroller", - "version": "1.0.0", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "no.almli.heatingcontroller", - "version": "1.0.0", - "license": "ISC", - "dependencies": { - "date-holidays": "^3.10.0" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "node_modules/astronomia": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/astronomia/-/astronomia-4.0.1.tgz", - "integrity": "sha512-NT0M9uIII3sOZnZgtqVad5crKFdzLXQTcT+qK80zBkhFOlObhs/OEAnK0WzZuNAraWLDw62RrLhapTHBs6bcsA==", - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/caldate": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/caldate/-/caldate-2.0.1.tgz", - "integrity": "sha512-edJtriYPt9mYarpEHOZ7QUZWXuY55S8ZdwUVBiLOqeAUYnCI7aTM3Cw+YX60MuJWhDmSRcpfJkiRpz3quMKoGQ==", - "dependencies": { - "moment-timezone": "^0.5.33" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/date-bengali-revised": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/date-bengali-revised/-/date-bengali-revised-2.0.1.tgz", - "integrity": "sha512-7D9FceOSpRy1MpLzxs0rMlTaUju9LNnIz6A2Hag3/+nB7RKdVKzuQrO7mchbCqFErLoTM+L5Ja/M03psWqGqGA==", - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/date-chinese": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/date-chinese/-/date-chinese-2.1.3.tgz", - "integrity": "sha512-g1YSDAY01sBLu5NfjpnhXGZu9xoC1xtEKHlCHQNYUIivz85Iea7WBzGPKUIBPfyejZ6x2YA64HSbTYjmzq2Yew==", - "dependencies": { - "astronomia": "^4.0.1" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/date-easter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/date-easter/-/date-easter-1.0.1.tgz", - "integrity": "sha512-5uAPmiO5tlztgaJrAy8eQCbsVrvYap12JGQEULi7HtLFRML65Jrop74ylHsA6OrqzcEyd6b9WQRIG/kvNzqC8g==", - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/date-holidays": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/date-holidays/-/date-holidays-3.10.0.tgz", - "integrity": "sha512-e08RjHzrBMNnZ2ClGUsa03RW1QcqWhaZUZQXL82czfwy/6HgKbrZe+UnwxCJVSk48CxQ0oALkReY3YL738C2Kw==", - "dependencies": { - "date-holidays-parser": "^3.2.2", - "js-yaml": "^4.1.0", - "lodash.omit": "^4.5.0", - "lodash.pick": "^4.4.0", - "prepin": "^1.0.3" - }, - "bin": { - "holidays2json": "scripts/holidays2json.cjs" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/date-holidays-parser": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/date-holidays-parser/-/date-holidays-parser-3.2.2.tgz", - "integrity": "sha512-b2wG9vGvNK16WXm7LNbD2UnPS1BGYqDJQVIfgClpMcG31qXtjAibc2zSR1ceiuHDx9XY9jBZO4pKogWUw7MZYg==", - "dependencies": { - "astronomia": "^4.0.1", - "caldate": "^2.0.1", - "date-bengali-revised": "^2.0.1", - "date-chinese": "^2.1.3", - "date-easter": "^1.0.1", - "deepmerge": "^4.2.2", - "moment-timezone": "^0.5.33" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/lodash.omit": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.omit/-/lodash.omit-4.5.0.tgz", - "integrity": "sha1-brGa5aHuHdnfC5aeZs4Lf6MLXmA=" - }, - "node_modules/lodash.pick": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", - "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=" - }, - "node_modules/moment": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", - "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==", - "engines": { - "node": "*" - } - }, - "node_modules/moment-timezone": { - "version": "0.5.33", - "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.33.tgz", - "integrity": "sha512-PTc2vcT8K9J5/9rDEPe5czSIKgLoGsH8UNpA4qZTVw0Vd/Uz19geE9abbIOQKaAQFcnQ3v5YEXrbSc5BpshH+w==", - "dependencies": { - "moment": ">= 2.9.0" - }, - "engines": { - "node": "*" - } - }, - "node_modules/prepin": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/prepin/-/prepin-1.0.3.tgz", - "integrity": "sha512-0XL2hreherEEvUy0fiaGEfN/ioXFV+JpImqIzQjxk6iBg4jQ2ARKqvC4+BmRD8w/pnpD+lbxvh0Ub+z7yBEjvA==", - "bin": { - "prepin": "bin/prepin.js" - } - } - }, - "dependencies": { - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" - }, - "astronomia": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/astronomia/-/astronomia-4.0.1.tgz", - "integrity": "sha512-NT0M9uIII3sOZnZgtqVad5crKFdzLXQTcT+qK80zBkhFOlObhs/OEAnK0WzZuNAraWLDw62RrLhapTHBs6bcsA==" - }, - "caldate": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/caldate/-/caldate-2.0.1.tgz", - "integrity": "sha512-edJtriYPt9mYarpEHOZ7QUZWXuY55S8ZdwUVBiLOqeAUYnCI7aTM3Cw+YX60MuJWhDmSRcpfJkiRpz3quMKoGQ==", - "requires": { - "moment-timezone": "^0.5.33" - } - }, - "date-bengali-revised": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/date-bengali-revised/-/date-bengali-revised-2.0.1.tgz", - "integrity": "sha512-7D9FceOSpRy1MpLzxs0rMlTaUju9LNnIz6A2Hag3/+nB7RKdVKzuQrO7mchbCqFErLoTM+L5Ja/M03psWqGqGA==" - }, - "date-chinese": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/date-chinese/-/date-chinese-2.1.3.tgz", - "integrity": "sha512-g1YSDAY01sBLu5NfjpnhXGZu9xoC1xtEKHlCHQNYUIivz85Iea7WBzGPKUIBPfyejZ6x2YA64HSbTYjmzq2Yew==", - "requires": { - "astronomia": "^4.0.1" - } - }, - "date-easter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/date-easter/-/date-easter-1.0.1.tgz", - "integrity": "sha512-5uAPmiO5tlztgaJrAy8eQCbsVrvYap12JGQEULi7HtLFRML65Jrop74ylHsA6OrqzcEyd6b9WQRIG/kvNzqC8g==" - }, - "date-holidays": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/date-holidays/-/date-holidays-3.10.0.tgz", - "integrity": "sha512-e08RjHzrBMNnZ2ClGUsa03RW1QcqWhaZUZQXL82czfwy/6HgKbrZe+UnwxCJVSk48CxQ0oALkReY3YL738C2Kw==", - "requires": { - "date-holidays-parser": "^3.2.2", - "js-yaml": "^4.1.0", - "lodash.omit": "^4.5.0", - "lodash.pick": "^4.4.0", - "prepin": "^1.0.3" - } - }, - "date-holidays-parser": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/date-holidays-parser/-/date-holidays-parser-3.2.2.tgz", - "integrity": "sha512-b2wG9vGvNK16WXm7LNbD2UnPS1BGYqDJQVIfgClpMcG31qXtjAibc2zSR1ceiuHDx9XY9jBZO4pKogWUw7MZYg==", - "requires": { - "astronomia": "^4.0.1", - "caldate": "^2.0.1", - "date-bengali-revised": "^2.0.1", - "date-chinese": "^2.1.3", - "date-easter": "^1.0.1", - "deepmerge": "^4.2.2", - "moment-timezone": "^0.5.33" - } - }, - "deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==" - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "requires": { - "argparse": "^2.0.1" - } - }, - "lodash.omit": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.omit/-/lodash.omit-4.5.0.tgz", - "integrity": "sha1-brGa5aHuHdnfC5aeZs4Lf6MLXmA=" - }, - "lodash.pick": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", - "integrity": "sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=" - }, - "moment": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", - "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==" - }, - "moment-timezone": { - "version": "0.5.33", - "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.33.tgz", - "integrity": "sha512-PTc2vcT8K9J5/9rDEPe5czSIKgLoGsH8UNpA4qZTVw0Vd/Uz19geE9abbIOQKaAQFcnQ3v5YEXrbSc5BpshH+w==", - "requires": { - "moment": ">= 2.9.0" - } - }, - "prepin": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/prepin/-/prepin-1.0.3.tgz", - "integrity": "sha512-0XL2hreherEEvUy0fiaGEfN/ioXFV+JpImqIzQjxk6iBg4jQ2ARKqvC4+BmRD8w/pnpD+lbxvh0Ub+z7yBEjvA==" - } - } -} diff --git a/scripts/package.json b/scripts/package.json deleted file mode 100644 index 5ce4db6..0000000 --- a/scripts/package.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "name": "no.almli.heatingcontroller", - "version": "1.0.0", - "description": "HeatingController", - "main": "app.js", - "scripts": {}, - "author": "Bjørnar Almli", - "license": "ISC", - "dependencies": { - "date-holidays": "^3.10.0" - } -} diff --git a/test/calc_date.js b/test/calc_date.js deleted file mode 100644 index ec79415..0000000 --- a/test/calc_date.js +++ /dev/null @@ -1,26 +0,0 @@ -const moment = require('../lib/moment-timezone-with-data'); -const chai = require("chai"); -const expect = chai.expect; -const holidays = require('../lib/holidays'); - -const getDay = (y, m, d) => { - return moment({ year: y, month: m, day: d }); -}; - -const toStr = (aDate) => { - return aDate.format('YYYY-MM-DD'); -} - -describe("Calc date", function () { - describe("Check", function () { - it("Check 01.01.2019", function () { - expect(toStr(holidays.calcDate(getDay(2019, 0, 1)))).to.eq(toStr(getDay(2019, 0, 1))); - }); - it("Check 02.01.2019 yesterday", function () { - expect(toStr(holidays.calcDate(getDay(2019, 0, 2), 'yesterday'))).to.eq(toStr(getDay(2019, 0, 1))); - }); - it("Check 02.01.2019 tomorrow", function () { - expect(toStr(holidays.calcDate(getDay(2019, 0, 2), 'tomorrow'))).to.eq(toStr(getDay(2019, 0, 3))); - }); - }); -}); diff --git a/test/dates_1.js b/test/dates_1.js deleted file mode 100644 index e182558..0000000 --- a/test/dates_1.js +++ /dev/null @@ -1,17 +0,0 @@ -const moment = require('../lib/moment-timezone-with-data'); -const expect = require("chai").expect; -const days = require('../lib/days'); - -describe("Prices", function () { - - before(function() { - days.setTimeZone('Europe/Oslo'); - }); - - describe("Timestamp for Oslo 2019-01-21", function () { - it("2019-01-21", function () { - expect(moment('2019-01-21').utc().toISOString()).to.equal('2019-01-20T23:00:00.000Z'); - }); - }); - -}); \ No newline at end of file diff --git a/test/dates_2.js b/test/dates_2.js deleted file mode 100644 index ae898b3..0000000 --- a/test/dates_2.js +++ /dev/null @@ -1,17 +0,0 @@ -const moment = require('../lib/moment-timezone-with-data'); -const expect = require("chai").expect; -const days = require('../lib/days'); - -describe("Prices", function () { - - before(function() { - days.setTimeZone('Europe/Helsinki'); - }); - - describe("Timestamp for Helsinki 2019-01-21", function () { - it("2019-01-21", function () { - expect(moment('2019-01-21').utc().toISOString()).to.equal('2019-01-20T22:00:00.000Z'); - }); - }); - -}); \ No newline at end of file diff --git a/test/heating_1.js b/test/heating_1.js deleted file mode 100644 index 58ff563..0000000 --- a/test/heating_1.js +++ /dev/null @@ -1,1567 +0,0 @@ -const moment = require('../lib/moment-timezone-with-data'); -const expect = require("chai").expect; -const heating = require('../lib/heating'); -const days = require("../lib/days"); - -const getDay = (y, M, d, h, m, s, ms) => { - return moment({ y, M, d, h, m, s, ms}); -}; - -const getHeatingOptions = function () { - return { - workday: { - startHour: 5, - endHour: 22.5, - }, - notWorkday: { - startHour: 7, - endHour: 23, - }, - workHours: { - startHour: 7, - endHour: 14 - }, - country: 'NO' - }; -}; - -const getHeatingOptionsHoliday = function () { - let opts = getHeatingOptions(); - opts.holiday_today = 'holiday'; - return opts; -}; - -const getHeatingOptionsNewDay = function () { - return { - workday: { - startHour: 5, - endHour: 22.5, - }, - notWorkday: { - startHour: 7, - endHour: 1, - }, - workHours: { - startHour: 7, - endHour: 14 - }, - country: 'NO' - }; -}; - -const getHeatingOptionsNewDay2 = function () { - return { - workday: { - startHour: 5, - endHour: 22.5, - }, - notWorkday: { - startHour: 8, - endHour: 0.3, - }, - workHours: { - startHour: 7.5, - endHour: 14.5 - }, - country: 'NO' - }; -}; - -const getHeatingOptionsNewDay3 = function () { - return { - workday: { - startHour: 5, - endHour: 0.2, - }, - notWorkday: { - startHour: 8, - endHour: 0.3, - }, - workHours: { - startHour: 7.5, - endHour: 14.5 - }, - country: 'NO' - }; -}; - -describe("Heating", function () { - - before(function() { - days.setTimeZone('Europe/Oslo'); - }); - - describe("Check getDay", function () { - it("Friday 21.12.2018", function () { - const aDate = getDay(2018, 11, 21, 7, 0, 0, 0); - expect(aDate.format()).to.equal('2018-12-21T07:00:00+01:00'); - }); - }); - - describe("Heating on a Monday, at home, no home override", function () { - it("Monday 04:00", function () { - const aDate = getDay(2018, 11, 17, 4, 0, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptions()); - expect(heat.day).to.equal(false); - expect(heat.night).to.equal(true); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(false); - }); - - it("Monday 05:00", function () { - const aDate = getDay(2018, 11, 17, 5, 0, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptions()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(true); - }); - - it("Monday 07:00", function () { - const aDate = getDay(2018, 11, 17, 7, 0, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptions()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(true); - expect(heat.heating).to.equal(false); - }); - - it("Monday 10:00", function () { - const aDate = getDay(2018, 11, 17, 10, 0, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptions()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(true); - expect(heat.heating).to.equal(false); - }); - - it("Monday 22:30", function () { - const aDate = getDay(2018, 11, 17, 22, 30, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptions()); - expect(heat.day).to.equal(false); - expect(heat.night).to.equal(true); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(false); - }); - - it("Monday 23:00", function () { - const aDate = getDay(2018, 11, 17, 23, 0, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptions()); - expect(heat.day).to.equal(false); - expect(heat.night).to.equal(true); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(false); - }); - }); - - describe("Heating on a Monday, at home, home override", function () { - it("Monday 04:00", function () { - const aDate = getDay(2018, 11, 17, 4, 0, 0, 0); - let heat = heating.calcHeating(aDate, true, true, getHeatingOptions()); - expect(heat.day).to.equal(false); - expect(heat.night).to.equal(true); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(false); - }); - - it("Monday 05:00", function () { - const aDate = getDay(2018, 11, 17, 5, 0, 0, 0); - let heat = heating.calcHeating(aDate, true, true, getHeatingOptions()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(true); - }); - - it("Monday 07:00", function () { - const aDate = getDay(2018, 11, 17, 7, 0, 0, 0); - let heat = heating.calcHeating(aDate, true, true, getHeatingOptions()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(true); - expect(heat.heating).to.equal(true); - }); - - it("Monday 10:00", function () { - const aDate = getDay(2018, 11, 17, 10, 0, 0, 0); - let heat = heating.calcHeating(aDate, true, true, getHeatingOptions()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(true); - expect(heat.heating).to.equal(true); - }); - - it("Monday 22:30", function () { - const aDate = getDay(2018, 11, 17, 22, 30, 0, 0); - let heat = heating.calcHeating(aDate, true, true, getHeatingOptions()); - expect(heat.day).to.equal(false); - expect(heat.night).to.equal(true); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(false); - }); - - it("Monday 23:00", function () { - const aDate = getDay(2018, 11, 17, 23, 0, 0, 0); - let heat = heating.calcHeating(aDate, true, true, getHeatingOptions()); - expect(heat.day).to.equal(false); - expect(heat.night).to.equal(true); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(false); - }); - }); - - describe("Heating on a Monday, at home, no home override, holiday", function () { - it("Monday 04:00", function () { - const aDate = getDay(2018, 11, 17, 4, 0, 0, 0); - let heat = heating.calcHeating(aDate, true, true, getHeatingOptionsHoliday()); - expect(heat.day).to.equal(false); - expect(heat.night).to.equal(true); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(false); - }); - - it("Monday 05:00", function () { - const aDate = getDay(2018, 11, 17, 5, 0, 0, 0); - let heat = heating.calcHeating(aDate, true, true, getHeatingOptionsHoliday()); - expect(heat.day).to.equal(false); - expect(heat.night).to.equal(true); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(false); - }); - - it("Monday 07:00", function () { - const aDate = getDay(2018, 11, 17, 7, 0, 0, 0); - let heat = heating.calcHeating(aDate, true, true, getHeatingOptionsHoliday()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(true); - }); - - it("Monday 10:00", function () { - const aDate = getDay(2018, 11, 17, 10, 0, 0, 0); - let heat = heating.calcHeating(aDate, true, true, getHeatingOptionsHoliday()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(true); - }); - - it("Monday 22:30", function () { - const aDate = getDay(2018, 11, 17, 22, 30, 0, 0); - let heat = heating.calcHeating(aDate, true, true, getHeatingOptionsHoliday()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(true); - }); - - it("Monday 23:00", function () { - const aDate = getDay(2018, 11, 17, 23, 0, 0, 0); - let heat = heating.calcHeating(aDate, true, true, getHeatingOptions()); - expect(heat.day).to.equal(false); - expect(heat.night).to.equal(true); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(false); - }); - }); - - describe("Heating on a Friday, at home, no home override", function () { - it("Friday 04:00", function () { - const aDate = getDay(2018, 11, 21, 4, 0, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptions()); - expect(heat.day).to.equal(false); - expect(heat.night).to.equal(true); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(false); - }); - - it("Friday 05:00", function () { - const aDate = getDay(2018, 11, 21, 5, 0, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptions()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(true); - }); - - it("Friday 07:00", function () { - const aDate = getDay(2018, 11, 21, 7, 0, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptions()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(true); - expect(heat.heating).to.equal(false); - }); - - it("Friday 10:00", function () { - const aDate = getDay(2018, 11, 21, 10, 0, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptions()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(true); - expect(heat.heating).to.equal(false); - }); - - it("Friday 22:30", function () { - const aDate = getDay(2018, 11, 21, 22, 30, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptions()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(true); - }); - - it("Friday 22:59", function () { - const aDate = getDay(2018, 11, 21, 22, 59, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptions()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(true); - }); - - it("Friday 23:00", function () { - const aDate = getDay(2018, 11, 21, 23, 0, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptions()); - expect(heat.day).to.equal(false); - expect(heat.night).to.equal(true); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(false); - }); - }); - - describe("Heating on a Saturday, at home, no home override", function () { - it("Saturday 04:00", function () { - const aDate = getDay(2018, 11, 22, 4, 0, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptions()); - expect(heat.day).to.equal(false); - expect(heat.night).to.equal(true); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(false); - }); - - it("Saturday 05:00", function () { - const aDate = getDay(2018, 11, 22, 5, 0, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptions()); - expect(heat.day).to.equal(false); - expect(heat.night).to.equal(true); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(false); - }); - - it("Saturday 07:00", function () { - const aDate = getDay(2018, 11, 22, 7, 0, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptions()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(true); - }); - - it("Saturday 10:00", function () { - const aDate = getDay(2018, 11, 22, 10, 0, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptions()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(true); - }); - - it("Saturday 22:30", function () { - const aDate = getDay(2018, 11, 22, 22, 30, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptions()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(true); - }); - - it("Saturday 22:59", function () { - const aDate = getDay(2018, 11, 22, 22, 59, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptions()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(true); - }); - - it("Saturday 23:00", function () { - const aDate = getDay(2018, 11, 22, 23, 0, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptions()); - expect(heat.day).to.equal(false); - expect(heat.night).to.equal(true); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(false); - }); - }); - - describe("Heating on a Sunday, at home, no home override", function () { - it("Sunday 04:00", function () { - const aDate = getDay(2018, 11, 16, 4, 0, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptions()); - expect(heat.day).to.equal(false); - expect(heat.night).to.equal(true); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(false); - }); - - it("Sunday 05:00", function () { - const aDate = getDay(2018, 11, 16, 5, 0, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptions()); - expect(heat.day).to.equal(false); - expect(heat.night).to.equal(true); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(false); - }); - - it("Sunday 07:00", function () { - const aDate = getDay(2018, 11, 16, 7, 0, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptions()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(true); - }); - - it("Sunday 10:00", function () { - const aDate = getDay(2018, 11, 16, 10, 0, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptions()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(true); - }); - - it("Sunday 22:30", function () { - const aDate = getDay(2018, 11, 16, 22, 30, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptions()); - expect(heat.day).to.equal(false); - expect(heat.night).to.equal(true); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(false); - }); - - it("Sunday 22:59", function () { - const aDate = getDay(2018, 11, 16, 22, 59, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptions()); - expect(heat.day).to.equal(false); - expect(heat.night).to.equal(true); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(false); - }); - - it("Sunday 23:00", function () { - const aDate = getDay(2018, 11, 16, 23, 0, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptions()); - expect(heat.day).to.equal(false); - expect(heat.night).to.equal(true); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(false); - }); - }); - - describe("Heating on a Saturday, not at home, no home override", function () { - it("Saturday 04:00", function () { - const aDate = getDay(2018, 11, 22, 4, 0, 0, 0); - let heat = heating.calcHeating(aDate, false, false, getHeatingOptions()); - expect(heat.day).to.equal(false); - expect(heat.night).to.equal(true); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(false); - }); - - it("Saturday 10:00", function () { - const aDate = getDay(2018, 11, 22, 10, 0, 0, 0); - let heat = heating.calcHeating(aDate, false, false, getHeatingOptions()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(false); - }); - - it("Saturday 23:00", function () { - const aDate = getDay(2018, 11, 22, 23, 0, 0, 0); - let heat = heating.calcHeating(aDate, false, false, getHeatingOptions()); - expect(heat.day).to.equal(false); - expect(heat.night).to.equal(true); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(false); - }); - }); - - describe("Heating on a holiday", function () { - it("Holiday 04:00", function () { - const aDate = getDay(2022, 11, 25, 4, 0, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptions()); - expect(heat.day).to.equal(false); - expect(heat.night).to.equal(true); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(false); - }); - - it("Holiday 10:00", function () { - const aDate = getDay(2022, 11, 25, 10, 0, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptions()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(true); - }); - - it("Holiday 22:59", function () { - const aDate = getDay(2022, 11, 25, 22, 59, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptions()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(true); - }); - - it("Holiday 23:00", function () { - const aDate = getDay(2022, 11, 25, 23, 0, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptions()); - expect(heat.day).to.equal(false); - expect(heat.night).to.equal(true); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(false); - }); - }); - - describe("Heating on Maundy Thursday 2022", function () { - it("Holiday 04:00", function () { - const aDate = getDay(2022, 3, 14, 4, 0, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptions()); - expect(heat.day).to.equal(false); - expect(heat.night).to.equal(true); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(false); - }); - - it("Holiday 10:00", function () { - const aDate = getDay(2022, 3, 14, 10, 0, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptions()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(true); - }); - - it("Holiday 22:59", function () { - const aDate = getDay(2022, 3, 14, 22, 59, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptions()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(true); - }); - - it("Holiday 23:00", function () { - const aDate = getDay(2022, 3, 14, 23, 0, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptions()); - expect(heat.day).to.equal(false); - expect(heat.night).to.equal(true); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(false); - }); - }); - - describe("Heating on Easter Monday 2022", function () { - it("Holiday 04:00", function () { - const aDate = getDay(2022, 3, 18, 4, 0, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptions()); - expect(heat.day).to.equal(false); - expect(heat.night).to.equal(true); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(false); - }); - - it("Holiday 10:00", function () { - const aDate = getDay(2022, 3, 18, 10, 0, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptions()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(true); - }); - - it("Holiday 22:29", function () { - const aDate = getDay(2022, 3, 18, 22, 29, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptions()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(true); - }); - - it("Holiday 22:30", function () { - const aDate = getDay(2022, 3, 18, 22, 30, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptions()); - expect(heat.day).to.equal(false); - expect(heat.night).to.equal(true); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(false); - }); - - it("Holiday 22:59", function () { - const aDate = getDay(2022, 3, 18, 22, 59, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptions()); - expect(heat.day).to.equal(false); - expect(heat.night).to.equal(true); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(false); - }); - - it("Holiday 23:00", function () { - const aDate = getDay(2019, 3, 18, 23, 0, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptions()); - expect(heat.day).to.equal(false); - expect(heat.night).to.equal(true); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(false); - }); - }); - - describe("Heating on Christmas Eve 2019", function () { - it("Holiday 04:00", function () { - const aDate = getDay(2022, 11, 24, 4, 0, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptions()); - expect(heat.day).to.equal(false); - expect(heat.night).to.equal(true); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(false); - }); - - it("Holiday 10:00", function () { - const aDate = getDay(2022, 11, 24, 10, 0, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptions()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(true); - }); - - it("Holiday 22:29", function () { - const aDate = getDay(2022, 11, 24, 22, 29, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptions()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(true); - }); - - it("Holiday 22:30", function () { - const aDate = getDay(2022, 11, 24, 22, 30, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptions()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(true); - }); - - it("Holiday 22:59", function () { - const aDate = getDay(2022, 11, 24, 22, 59, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptions()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(true); - }); - - it("Holiday 23:00", function () { - const aDate = getDay(2022, 11, 24, 23, 0, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptions()); - expect(heat.day).to.equal(false); - expect(heat.night).to.equal(true); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(false); - }); - }); - - describe("Heating on a saturday - options ", function () { - it("Saturday 00:00", function () { - const aDate = getDay(2018, 11, 22, 0, 0, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(true); - }); - - it("Saturday 00:30", function () { - const aDate = getDay(2018, 11, 22, 0, 30, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(true); - }); - - it("Saturday 00:59", function () { - const aDate = getDay(2018, 11, 22, 0, 59, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(true); - }); - - it("Saturday 01:00", function () { - const aDate = getDay(2018, 11, 22, 1, 0, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay()); - expect(heat.day).to.equal(false); - expect(heat.night).to.equal(true); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(false); - }); - - it("Saturday 01:01", function () { - const aDate = getDay(2018, 11, 22, 1, 1, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay()); - expect(heat.day).to.equal(false); - expect(heat.night).to.equal(true); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(false); - }); - - it("Saturday 06:55", function () { - const aDate = getDay(2018, 11, 22, 6, 55, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay()); - expect(heat.day).to.equal(false); - expect(heat.night).to.equal(true); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(false); - }); - - it("Saturday 07:00", function () { - const aDate = getDay(2018, 11, 22, 7, 0, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(true); - }); - - it("Saturday 10:00", function () { - const aDate = getDay(2018, 11, 22, 10, 0, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(true); - }); - - it("Saturday 23:30", function () { - const aDate = getDay(2018, 11, 22, 23, 30, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(true); - }); - }); - - describe("Heating on a Thursday - options 2", function () { - it("Thursday 00:00", function () { - const aDate = getDay(2019, 0, 31, 0, 0, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay2()); - expect(heat.day).to.equal(false); - expect(heat.night).to.equal(true); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(false); - }); - - it("Thursday 00:17", function () { - const aDate = getDay(2019, 0, 31, 0, 17, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay2()); - expect(heat.day).to.equal(false); - expect(heat.night).to.equal(true); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(false); - }); - - it("Thursday 00:18", function () { - const aDate = getDay(2019, 0, 31, 0, 18, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay2()); - expect(heat.day).to.equal(false); - expect(heat.night).to.equal(true); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(false); - }); - - it("Thursday 07:00", function () { - const aDate = getDay(2019, 0, 31, 7, 0, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay2()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(true); - }); - - it("Thursday 07:25", function () { - const aDate = getDay(2019, 0, 31, 7, 25, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay2()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(true); - }); - - it("Thursday 08:00", function () { - const aDate = getDay(2019, 0, 31, 8, 0, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay2()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(true); - expect(heat.heating).to.equal(false); - }); - - it("Thursday 22:29", function () { - const aDate = getDay(2019, 0, 31, 22, 29, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay2()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(true); - }); - - it("Thursday 22:30", function () { - const aDate = getDay(2019, 0, 31, 22, 30, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay2()); - expect(heat.day).to.equal(false); - expect(heat.night).to.equal(true); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(false); - }); - }); - - describe("Heating on a Friday - options 2", function () { - it("Friday 00:00", function () { - const aDate = getDay(2019, 1, 1, 0, 0, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay2()); - expect(heat.day).to.equal(false); - expect(heat.night).to.equal(true); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(false); - }); - - it("Friday 00:17", function () { - const aDate = getDay(2019, 1, 1, 0, 17, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay2()); - expect(heat.day).to.equal(false); - expect(heat.night).to.equal(true); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(false); - }); - - it("Friday 00:18", function () { - const aDate = getDay(2019, 1, 1, 0, 18, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay2()); - expect(heat.day).to.equal(false); - expect(heat.night).to.equal(true); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(false); - }); - - it("Friday 07:00", function () { - const aDate = getDay(2019, 1, 1, 7, 0, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay2()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(true); - }); - - it("Friday 07:25", function () { - const aDate = getDay(2019, 1, 1, 7, 25, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay2()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(true); - }); - - it("Friday 08:00", function () { - const aDate = getDay(2019, 1, 1, 8, 0, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay2()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(true); - expect(heat.heating).to.equal(false); - }); - - it("Friday 22:29", function () { - const aDate = getDay(2019, 1, 1, 22, 29, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay2()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(true); - }); - - it("Friday 22:30", function () { - const aDate = getDay(2019, 1, 1, 22, 30, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay2()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(true); - }); - - it("Friday 23:30", function () { - const aDate = getDay(2019, 1, 1, 23, 30, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay2()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(true); - }); - }); - - describe("Heating on a Saturday - options 2", function () { - it("Saturday 00:00", function () { - const aDate = getDay(2019, 1, 2, 0, 0, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay2()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(true); - }); - - it("Saturday 00:17", function () { - const aDate = getDay(2019, 1, 2, 0, 17, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay2()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(true); - }); - - it("Saturday 00:18", function () { - const aDate = getDay(2019, 1, 2, 0, 18, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay2()); - expect(heat.day).to.equal(false); - expect(heat.night).to.equal(true); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(false); - }); - - it("Saturday 07:00", function () { - const aDate = getDay(2019, 1, 2, 7, 0, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay2()); - expect(heat.day).to.equal(false); - expect(heat.night).to.equal(true); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(false); - }); - - it("Saturday 07:25", function () { - const aDate = getDay(2019, 1, 2, 7, 25, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay2()); - expect(heat.day).to.equal(false); - expect(heat.night).to.equal(true); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(false); - }); - - it("Saturday 08:00", function () { - const aDate = getDay(2019, 1, 2, 8, 0, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay2()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(true); - }); - - it("Saturday 22:29", function () { - const aDate = getDay(2019, 1, 2, 22, 29, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay2()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(true); - }); - - it("Saturday 22:30", function () { - const aDate = getDay(2019, 1, 2, 22, 30, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay2()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(true); - }); - - it("Saturday 23:30", function () { - const aDate = getDay(2019, 1, 2, 23, 30, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay2()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(true); - }); - }); - - describe("Heating on a Sunday - options 2", function () { - it("Sunday 00:00", function () { - const aDate = getDay(2019, 1, 3, 0, 0, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay2()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(true); - }); - - it("Sunday 00:17", function () { - const aDate = getDay(2019, 1, 3, 0, 17, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay2()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(true); - }); - - it("Sunday 00:18", function () { - const aDate = getDay(2019, 1, 3, 0, 18, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay2()); - expect(heat.day).to.equal(false); - expect(heat.night).to.equal(true); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(false); - }); - - it("Sunday 07:00", function () { - const aDate = getDay(2019, 1, 3, 7, 0, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay2()); - expect(heat.day).to.equal(false); - expect(heat.night).to.equal(true); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(false); - }); - - it("Sunday 07:25", function () { - const aDate = getDay(2019, 1, 3, 7, 25, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay2()); - expect(heat.day).to.equal(false); - expect(heat.night).to.equal(true); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(false); - }); - - it("Sunday 08:00", function () { - const aDate = getDay(2019, 1, 3, 8, 0, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay2()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(true); - }); - - it("Sunday 22:29", function () { - const aDate = getDay(2019, 1, 3, 22, 29, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay2()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(true); - }); - - it("Sunday 22:30", function () { - const aDate = getDay(2019, 1, 3, 22, 30, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay2()); - expect(heat.day).to.equal(false); - expect(heat.night).to.equal(true); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(false); - }); - - it("Sunday 23:30", function () { - const aDate = getDay(2019, 1, 3, 23, 30, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay2()); - expect(heat.day).to.equal(false); - expect(heat.night).to.equal(true); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(false); - }); - }); - - describe("Heating on a Monday - options 2", function () { - it("Monday 00:00", function () { - const aDate = getDay(2019, 1, 4, 0, 0, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay2()); - expect(heat.day).to.equal(false); - expect(heat.night).to.equal(true); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(false); - }); - - it("Monday 00:11", function () { - const aDate = getDay(2019, 1, 4, 0, 11, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay2()); - expect(heat.day).to.equal(false); - expect(heat.night).to.equal(true); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(false); - }); - - it("Monday 00:12", function () { - const aDate = getDay(2019, 1, 4, 0, 12, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay2()); - expect(heat.day).to.equal(false); - expect(heat.night).to.equal(true); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(false); - }); - - it("Monday 07:00", function () { - const aDate = getDay(2019, 1, 4, 7, 0, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay2()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(true); - }); - - it("Monday 07:25", function () { - const aDate = getDay(2019, 1, 4, 7, 25, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay2()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(true); - }); - - it("Monday 08:00", function () { - const aDate = getDay(2019, 1, 4, 8, 0, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay2()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(true); - expect(heat.heating).to.equal(false); - }); - - it("Monday 22:29", function () { - const aDate = getDay(2019, 1, 4, 22, 29, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay2()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(true); - }); - - it("Monday 22:30", function () { - const aDate = getDay(2019, 1, 4, 22, 30, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay2()); - expect(heat.day).to.equal(false); - expect(heat.night).to.equal(true); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(false); - }); - }); - - describe("Heating on a Thursday - options 3", function () { - it("Thursday 00:00", function () { - const aDate = getDay(2019, 0, 31, 0, 0, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay3()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(true); - }); - - it("Thursday 00:11", function () { - const aDate = getDay(2019, 0, 31, 0, 11, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay3()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(true); - }); - - it("Thursday 00:12", function () { - const aDate = getDay(2019, 0, 31, 0, 12, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay3()); - expect(heat.day).to.equal(false); - expect(heat.night).to.equal(true); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(false); - }); - - it("Thursday 07:00", function () { - const aDate = getDay(2019, 0, 31, 7, 0, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay3()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(true); - }); - - it("Thursday 07:25", function () { - const aDate = getDay(2019, 0, 31, 7, 25, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay3()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(true); - }); - - it("Thursday 08:00", function () { - const aDate = getDay(2019, 0, 31, 8, 0, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay3()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(true); - expect(heat.heating).to.equal(false); - }); - - it("Thursday 22:29", function () { - const aDate = getDay(2019, 0, 31, 22, 29, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay3()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(true); - }); - - it("Thursday 22:30", function () { - const aDate = getDay(2019, 0, 31, 22, 30, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay3()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(true); - }); - - it("Thursday 23:30", function () { - const aDate = getDay(2019, 0, 31, 23, 30, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay3()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(true); - }); - }); - - describe("Heating on a Friday - options 3", function () { - it("Friday 00:00", function () { - const aDate = getDay(2019, 1, 1, 0, 0, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay3()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(true); - }); - - it("Friday 00:11", function () { - const aDate = getDay(2019, 1, 1, 0, 11, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay3()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(true); - }); - - it("Friday 00:12", function () { - const aDate = getDay(2019, 1, 1, 0, 12, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay3()); - expect(heat.day).to.equal(false); - expect(heat.night).to.equal(true); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(false); - }); - - it("Friday 00:18", function () { - const aDate = getDay(2019, 1, 1, 0, 18, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay3()); - expect(heat.day).to.equal(false); - expect(heat.night).to.equal(true); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(false); - }); - - it("Friday 07:00", function () { - const aDate = getDay(2019, 1, 1, 7, 0, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay3()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(true); - }); - - it("Friday 07:25", function () { - const aDate = getDay(2019, 1, 1, 7, 25, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay3()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(true); - }); - - it("Friday 08:00", function () { - const aDate = getDay(2019, 1, 1, 8, 0, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay3()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(true); - expect(heat.heating).to.equal(false); - }); - - it("Friday 22:29", function () { - const aDate = getDay(2019, 1, 1, 22, 29, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay3()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(true); - }); - - it("Friday 22:30", function () { - const aDate = getDay(2019, 1, 1, 22, 30, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay3()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(true); - }); - - it("Friday 23:30", function () { - const aDate = getDay(2019, 1, 1, 23, 30, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay3()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(true); - }); - }); - - describe("Heating on a Saturday - options 3", function () { - it("Saturday 00:00", function () { - const aDate = getDay(2019, 1, 2, 0, 0, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay3()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(true); - }); - - it("Saturday 00:17", function () { - const aDate = getDay(2019, 1, 2, 0, 17, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay3()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(true); - }); - - it("Saturday 00:18", function () { - const aDate = getDay(2019, 1, 2, 0, 18, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay3()); - expect(heat.day).to.equal(false); - expect(heat.night).to.equal(true); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(false); - }); - - it("Saturday 07:00", function () { - const aDate = getDay(2019, 1, 2, 7, 0, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay3()); - expect(heat.day).to.equal(false); - expect(heat.night).to.equal(true); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(false); - }); - - it("Saturday 07:25", function () { - const aDate = getDay(2019, 1, 2, 7, 25, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay3()); - expect(heat.day).to.equal(false); - expect(heat.night).to.equal(true); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(false); - }); - - it("Saturday 08:00", function () { - const aDate = getDay(2019, 1, 2, 8, 0, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay3()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(true); - }); - - it("Saturday 22:29", function () { - const aDate = getDay(2019, 1, 2, 22, 29, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay3()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(true); - }); - - it("Saturday 22:30", function () { - const aDate = getDay(2019, 1, 2, 22, 30, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay3()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(true); - }); - - it("Saturday 23:30", function () { - const aDate = getDay(2019, 1, 2, 23, 30, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay3()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(true); - }); - }); - - describe("Heating on a Sunday - options 3", function () { - it("Sunday 00:00", function () { - const aDate = getDay(2019, 1, 3, 0, 0, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay3()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(true); - }); - - it("Sunday 00:17", function () { - const aDate = getDay(2019, 1, 3, 0, 17, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay3()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(true); - }); - - it("Sunday 00:18", function () { - const aDate = getDay(2019, 1, 3, 0, 18, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay3()); - expect(heat.day).to.equal(false); - expect(heat.night).to.equal(true); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(false); - }); - - it("Sunday 07:00", function () { - const aDate = getDay(2019, 1, 3, 7, 0, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay3()); - expect(heat.day).to.equal(false); - expect(heat.night).to.equal(true); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(false); - }); - - it("Sunday 07:25", function () { - const aDate = getDay(2019, 1, 3, 7, 25, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay3()); - expect(heat.day).to.equal(false); - expect(heat.night).to.equal(true); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(false); - }); - - it("Sunday 08:00", function () { - const aDate = getDay(2019, 1, 3, 8, 0, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay3()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(true); - }); - - it("Sunday 22:29", function () { - const aDate = getDay(2019, 1, 3, 22, 29, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay3()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(true); - }); - - it("Sunday 22:30", function () { - const aDate = getDay(2019, 1, 3, 22, 30, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay3()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(true); - }); - }); - - describe("Heating on a Monday - options 3", function () { - it("Monday 00:00", function () { - const aDate = getDay(2019, 1, 4, 0, 0, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay3()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(true); - }); - - it("Monday 00:11", function () { - const aDate = getDay(2019, 1, 4, 0, 11, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay3()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(true); - }); - - it("Monday 00:12", function () { - const aDate = getDay(2019, 1, 4, 0, 12, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay3()); - expect(heat.day).to.equal(false); - expect(heat.night).to.equal(true); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(false); - }); - - it("Monday 07:00", function () { - const aDate = getDay(2019, 1, 4, 7, 0, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay3()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(true); - }); - - it("Monday 07:25", function () { - const aDate = getDay(2019, 1, 4, 7, 25, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay3()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(true); - }); - - it("Monday 08:00", function () { - const aDate = getDay(2019, 1, 4, 8, 0, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay3()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(true); - expect(heat.heating).to.equal(false); - }); - - it("Monday 22:29", function () { - const aDate = getDay(2019, 1, 4, 22, 29, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay3()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(true); - }); - - it("Monday 22:30", function () { - const aDate = getDay(2019, 1, 4, 22, 30, 0, 0); - let heat = heating.calcHeating(aDate, true, false, getHeatingOptionsNewDay3()); - expect(heat.day).to.equal(true); - expect(heat.night).to.equal(false); - expect(heat.atWork).to.equal(false); - expect(heat.heating).to.equal(true); - }); - }); - -}); \ No newline at end of file diff --git a/test/holiday_no_2022.js b/test/holiday_no_2022.js deleted file mode 100644 index dabd229..0000000 --- a/test/holiday_no_2022.js +++ /dev/null @@ -1,84 +0,0 @@ -const moment = require('../lib/moment-timezone-with-data'); -const expect = require("chai").expect; -const holidays = require('../lib/holidays'); -const days = require("../lib/days"); - -const getDay = (y, m, d) => { - return moment({ year: y, month: m, day: d }); -}; - -describe("Norwegian holidays", function () { - - before(function() { - days.setTimeZone('Europe/Oslo'); - }); - - describe("2022", function () { - it("Check 01.01.2022", function () { - expect(holidays.isHoliday('NO', getDay(2022, 0, 1)).type).to.equal('public'); - }); - it("Check 02.01.2022", function () { - expect(holidays.isHoliday('NO', getDay(2022, 0, 2))).to.equal(false); - }); - it("Check 01.01.2022", function () { - expect(holidays.isHoliday('NO', getDay(2022, 0, 2), 'yesterday').type).to.equal('public'); - }); - it("Check 13.02.2022", function () { - expect(holidays.isHoliday('NO', getDay(2022, 1, 13)).type).to.equal('observance'); - }); - it("Check 15.04.2022", function () { - expect(holidays.isHoliday('NO', getDay(2022, 3, 15)).type).to.equal('public'); - }); - it("Check 16.04.2022", function () { - expect(holidays.isHoliday('NO', getDay(2022, 3, 16)).type).to.equal('public'); - }); - it("Check 18.04.2022", function () { - expect(holidays.isHoliday('NO', getDay(2022, 3, 18)).type).to.equal('public'); - }); - it("Check 01.05.2022", function () { - expect(holidays.isHoliday('NO', getDay(2022, 4, 1)).type).to.equal('public'); - }); - it("Check 02.05.2022", function () { - expect(holidays.isHoliday('NO', getDay(2022, 4, 2))).to.equal(false); - }); - it("Check 08.05.2022", function () { - expect(holidays.isHoliday('NO', getDay(2022, 4, 8)).type).to.equal('observance'); - }); - it("Check 17.05.2022", function () { - expect(holidays.isHoliday('NO', getDay(2022, 4, 17)).type).to.equal('public'); - }); - it("Check 29.05.2022", function () { - expect(holidays.isHoliday('NO', getDay(2022, 4, 29))).to.equal(false); - }); - it("Check 26.05.2022", function () { - expect(holidays.isHoliday('NO', getDay(2022, 4, 26)).type).to.equal('public'); - }); - it("Check 04.06.2022", function () { - expect(holidays.isHoliday('NO', getDay(2022, 5, 4))).to.equal(false); - }); - it("Check 05.06.2022", function () { - expect(holidays.isHoliday('NO', getDay(2022, 5, 5)).type).to.equal('public'); - }); - it("Check 06.06.2022", function () { - expect(holidays.isHoliday('NO', getDay(2022, 5, 6)).type).to.equal('public'); - }); - it("Check 04.07.2022", function () { - expect(holidays.isHoliday('NO', getDay(2022, 6, 4))).to.equal(false); - }); - it("Check 27.11.2022", function () { - expect(holidays.isHoliday('NO', getDay(2022, 10, 27)).type).to.equal('observance'); - }); - it("Check 24.12.2022", function () { - expect(holidays.isHoliday('NO', getDay(2022, 11, 24)).type).to.equal('bank'); - }); - it("Check 25.12.2022", function () { - expect(holidays.isHoliday('NO', getDay(2022, 11, 25)).type).to.equal('public'); - }); - it("Check 26.12.2022", function () { - expect(holidays.isHoliday('NO', getDay(2022, 11, 26)).type).to.equal('public'); - }); - it("Check 31.12.2022", function () { - expect(holidays.isHoliday('NO', getDay(2022, 11, 31)).type).to.equal('bank'); - }); - }); -}); diff --git a/test/prices_1.js b/test/prices_1.js deleted file mode 100644 index 643dec9..0000000 --- a/test/prices_1.js +++ /dev/null @@ -1,581 +0,0 @@ -const moment = require('../lib/moment-timezone-with-data'); -const expect = require("chai").expect; -const pricesLib = require('../lib/prices'); -const days = require("../lib/days"); - -let _prices = undefined; - -days.setTimeZone('Europe/Oslo'); - -const getPrices = function () { - if (_prices) { - const aDate = moment('2019-01-20T23:00:00.000Z'); - for (let p of _prices) { - expect(p.startsAt.toISOString()).to.equal( aDate.toISOString()); - aDate.add(1, 'hour'); - } - expect(_prices.length).to.equal(48); - return _prices; - } - const prices = [ - { - startsAt: '2019-01-20T23:00:00.000Z', - priceArea: 'Bergen', - currency: 'NOK', - price: 0.49599 - }, - { - startsAt: '2019-01-21T00:00:00.000Z', - priceArea: 'Bergen', - currency: 'NOK', - price: 0.49103 - }, - { - startsAt: '2019-01-21T01:00:00.000Z', - priceArea: 'Bergen', - currency: 'NOK', - price: 0.48919 - }, - { - startsAt: '2019-01-21T02:00:00.000Z', - priceArea: 'Bergen', - currency: 'NOK', - price: 0.48987 - }, - { - startsAt: '2019-01-21T03:00:00.000Z', - priceArea: 'Bergen', - currency: 'NOK', - price: 0.4955 - }, - { - startsAt: '2019-01-21T04:00:00.000Z', - priceArea: 'Bergen', - currency: 'NOK', - price: 0.52078 - }, - { - startsAt: '2019-01-21T05:00:00.000Z', - priceArea: 'Bergen', - currency: 'NOK', - price: 0.53604 - }, - { - startsAt: '2019-01-21T06:00:00.000Z', - priceArea: 'Bergen', - currency: 'NOK', - price: 0.60264 - }, - { - startsAt: '2019-01-21T07:00:00.000Z', - priceArea: 'Bergen', - currency: 'NOK', - price: 0.63073 - }, - { - startsAt: '2019-01-21T08:00:00.000Z', - priceArea: 'Bergen', - currency: 'NOK', - price: 0.60176 - }, - { - startsAt: '2019-01-21T09:00:00.000Z', - priceArea: 'Bergen', - currency: 'NOK', - price: 0.56754 - }, - { - startsAt: '2019-01-21T10:00:00.000Z', - priceArea: 'Bergen', - currency: 'NOK', - price: 0.55704 - }, - { - startsAt: '2019-01-21T11:00:00.000Z', - priceArea: 'Bergen', - currency: 'NOK', - price: 0.55344 - }, - { - startsAt: '2019-01-21T12:00:00.000Z', - priceArea: 'Bergen', - currency: 'NOK', - price: 0.55315 - }, - { - startsAt: '2019-01-21T13:00:00.000Z', - priceArea: 'Bergen', - currency: 'NOK', - price: 0.55772 - }, - { - startsAt: '2019-01-21T14:00:00.000Z', - priceArea: 'Bergen', - currency: 'NOK', - price: 0.56385 - }, - { - startsAt: '2019-01-21T15:00:00.000Z', - priceArea: 'Bergen', - currency: 'NOK', - price: 0.58008 - }, - { - startsAt: '2019-01-21T16:00:00.000Z', - priceArea: 'Bergen', - currency: 'NOK', - price: 0.59671 - }, - { - startsAt: '2019-01-21T17:00:00.000Z', - priceArea: 'Bergen', - currency: 'NOK', - price: 0.57979 - }, - { - startsAt: '2019-01-21T18:00:00.000Z', - priceArea: 'Bergen', - currency: 'NOK', - price: 0.54868 - }, - { - startsAt: '2019-01-21T19:00:00.000Z', - priceArea: 'Bergen', - currency: 'NOK', - price: 0.53634 - }, - { - startsAt: '2019-01-21T20:00:00.000Z', - priceArea: 'Bergen', - currency: 'NOK', - price: 0.53264 - }, - { - startsAt: '2019-01-21T21:00:00.000Z', - priceArea: 'Bergen', - currency: 'NOK', - price: 0.52185 - }, - { - startsAt: '2019-01-21T22:00:00.000Z', - priceArea: 'Bergen', - currency: 'NOK', - price: 0.50902 - }, - { - startsAt: '2019-01-21T23:00:00.000Z', - priceArea: 'Bergen', - currency: 'NOK', - price: 0.49599 - }, - { - startsAt: '2019-01-22T00:00:00.000Z', - priceArea: 'Bergen', - currency: 'NOK', - price: 0.49103 - }, - { - startsAt: '2019-01-22T01:00:00.000Z', - priceArea: 'Bergen', - currency: 'NOK', - price: 0.48919 - }, - { - startsAt: '2019-01-22T02:00:00.000Z', - priceArea: 'Bergen', - currency: 'NOK', - price: 0.48987 - }, - { - startsAt: '2019-01-22T03:00:00.000Z', - priceArea: 'Bergen', - currency: 'NOK', - price: 0.4955 - }, - { - startsAt: '2019-01-22T04:00:00.000Z', - priceArea: 'Bergen', - currency: 'NOK', - price: 0.52078 - }, - { - startsAt: '2019-01-22T05:00:00.000Z', - priceArea: 'Bergen', - currency: 'NOK', - price: 0.53604 - }, - { - startsAt: '2019-01-22T06:00:00.000Z', - priceArea: 'Bergen', - currency: 'NOK', - price: 0.60264 - }, - { - startsAt: '2019-01-22T07:00:00.000Z', - priceArea: 'Bergen', - currency: 'NOK', - price: 0.63073 - }, - { - startsAt: '2019-01-22T08:00:00.000Z', - priceArea: 'Bergen', - currency: 'NOK', - price: 0.60176 - }, - { - startsAt: '2019-01-22T09:00:00.000Z', - priceArea: 'Bergen', - currency: 'NOK', - price: 0.56754 - }, - { - startsAt: '2019-01-22T10:00:00.000Z', - priceArea: 'Bergen', - currency: 'NOK', - price: 0.55704 - }, - { - startsAt: '2019-01-22T11:00:00.000Z', - priceArea: 'Bergen', - currency: 'NOK', - price: 0.55344 - }, - { - startsAt: '2019-01-22T12:00:00.000Z', - priceArea: 'Bergen', - currency: 'NOK', - price: 0.55315 - }, - { - startsAt: '2019-01-22T13:00:00.000Z', - priceArea: 'Bergen', - currency: 'NOK', - price: 0.55772 - }, - { - startsAt: '2019-01-22T14:00:00.000Z', - priceArea: 'Bergen', - currency: 'NOK', - price: 0.56385 - }, - { - startsAt: '2019-01-22T15:00:00.000Z', - priceArea: 'Bergen', - currency: 'NOK', - price: 0.58008 - }, - { - startsAt: '2019-01-22T16:00:00.000Z', - priceArea: 'Bergen', - currency: 'NOK', - price: 0.59671 - }, - { - startsAt: '2019-01-22T17:00:00.000Z', - priceArea: 'Bergen', - currency: 'NOK', - price: 0.57979 - }, - { - startsAt: '2019-01-22T18:00:00.000Z', - priceArea: 'Bergen', - currency: 'NOK', - price: 0.54868 - }, - { - startsAt: '2019-01-22T19:00:00.000Z', - priceArea: 'Bergen', - currency: 'NOK', - price: 0.53634 - }, - { - startsAt: '2019-01-22T20:00:00.000Z', - priceArea: 'Bergen', - currency: 'NOK', - price: 0.53264 - }, - { - startsAt: '2019-01-22T21:00:00.000Z', - priceArea: 'Bergen', - currency: 'NOK', - price: 0.52185 - }, - { - startsAt: '2019-01-22T22:00:00.000Z', - priceArea: 'Bergen', - currency: 'NOK', - price: 0.50902 - } - ]; - const timeZone = moment().tz(); - _prices = prices - .map(p => { - const startsAt = moment.tz(p.startsAt, 'UTC').tz(timeZone); - const time = startsAt.unix(); - const price = p.price; - return { startsAt, time, price }; - }); - return _prices; -}; - -const getState = function (atHome) { - return { - atHome: atHome, - homeOverride: false, - heatingOptions: { - workday: { - startHour: 5, - endHour: 22.5, - }, - notWorkday: { - startHour: 7, - endHour: 23, - }, - workHours: { - startHour: 7, - endHour: 14 - }, - country: 'NO' - } - }; -}; - -const checkLowPrice = function (aDate, aTime, numRows) { - it("Low price at " + aTime, function () { - let x = pricesLib.pricesStarting(getPrices(), moment(aDate), 0, 24); - expect(pricesLib.checkLowPrice(x, 18, moment(aDate + 'T' + aTime)).length).to.equal(numRows); - }); -}; - -const checkHighPrice = function (aDate, aTime, state, numRows) { - it("High price at " + aTime, function () { - let x = pricesLib.pricesStarting(getPrices(), moment(aDate), 0, 24); - expect(pricesLib.checkHighPrice2(x, 6, moment(aDate + 'T' + aTime), state).length).to.equal(numRows); - }); -}; - -describe("Prices", function () { - - before(function() { - days.setTimeZone('Europe/Oslo'); - }); - - describe("Check testdata", function () { - it("48 hours", function () { - const prcs = getPrices(); - //console.log(prcs); - expect(prcs.length).to.equal(48); - }); - }); - - describe("Check no date change", function () { - it("No date change: toHour", function () { - const aDate = moment('2019-01-21T03:12:45.678Z'); - pricesLib.toHour(aDate); - expect(aDate.toISOString()).to.equal('2019-01-21T03:12:45.678Z'); - }); - it("No date change: currentPrice", function () { - const aDate = moment('2019-01-21T03:12:45.678Z'); - pricesLib.currentPrice(getPrices(), aDate); - expect(aDate.toISOString()).to.equal('2019-01-21T03:12:45.678Z'); - }); - it("No date change: priceRatio", function () { - const aDate = moment('2019-01-21T03:12:45.678Z'); - pricesLib.priceRatio(getPrices(), aDate); - expect(aDate.toISOString()).to.equal('2019-01-21T03:12:45.678Z'); - }); - it("No date change: pricesStarting", function () { - const aDate = moment('2019-01-21T03:12:45.678Z'); - pricesLib.pricesStarting(getPrices(), aDate, 0, 24); - expect(aDate.toISOString()).to.equal('2019-01-21T03:12:45.678Z'); - }); - it("No date change: averagePricesStarting", function () { - const aDate = moment('2019-01-21T03:12:45.678Z'); - pricesLib.averagePricesStarting(getPrices(), aDate, 0, 24); - expect(aDate.toISOString()).to.equal('2019-01-21T03:12:45.678Z'); - }); - it("No date change: checkLowPrice", function () { - const aDate = moment('2019-01-21T03:12:45.678Z'); - const prcs = getPrices(); - pricesLib.checkLowPrice(prcs, 4, aDate); - expect(aDate.toISOString()).to.equal('2019-01-21T03:12:45.678Z'); - }); - it("No date change: checkHighPrice", function () { - const aDate = moment('2019-01-21T03:12:45.678Z'); - pricesLib.checkHighPrice(getPrices(), 6, aDate); - expect(aDate.toISOString()).to.equal('2019-01-21T03:12:45.678Z'); - }); - it("No date change: checkHighPrice2", function () { - const aDate = moment('2019-01-21T03:12:45.678Z'); - const state = getState(true); - pricesLib.checkHighPrice2(getPrices(), 6, aDate, state); - expect(aDate.toISOString()).to.equal('2019-01-21T03:12:45.678Z'); - }); - it("No date change: pricesAmongLowest", function () { - const aDate = moment('2019-01-21T03:12:45.678Z'); - pricesLib.pricesAmongLowest(getPrices(), aDate, 0, 4, 2); - expect(aDate.toISOString()).to.equal('2019-01-21T03:12:45.678Z'); - }); - it("No date change: pricesAmongHighest", function () { - const aDate = moment('2019-01-21T03:12:45.678Z'); - pricesLib.pricesAmongHighest(getPrices(), aDate, 0, 4, 2); - expect(aDate.toISOString()).to.equal('2019-01-21T03:12:45.678Z'); - }); - }); - - describe("Check no prices", function () { - it("No prices: pricesStarting", function () { - expect(pricesLib.pricesStarting([], moment('2019-01-21'), 0, 24).length).to.equal(0); - }); - it("No prices: checkLowPrice", function () { - expect(pricesLib.checkLowPrice([], 18, moment('2019-01-21')).length).to.equal(0); - }); - it("No prices: checkHighPrice", function () { - expect(pricesLib.checkHighPrice2([], 6, moment('2019-01-21'), {}).length).to.equal(0); - }); - }); - - describe("Price level", function () { - it("Price level 2019-01-21: 24 hours", function () { - const priceLevel = pricesLib.priceLevel(getPrices(), moment('2019-01-21')); - expect(priceLevel.code).eq('NORMAL'); - expect(priceLevel.description).eq('The price is greater than 90 % and smaller than 115 % compared to average price.'); - }); - it("Price level 2019-01-21T07:00:00.000Z: 24 hours", function () { - const priceLevel = pricesLib.priceLevel(getPrices(), moment('2019-01-21T07:00:00.000Z')); - expect(priceLevel.code).eq('EXPENSIVE'); - }); - it("Price level 2019-01-22T10:00:00.000Z: 24 hours", function () { - const priceLevel = pricesLib.priceLevel(getPrices(), moment('2019-01-22T10:00:00.000Z')); - expect(priceLevel.code).eq('NORMAL'); - }); - it("Price level 2019-01-22T15:00:00.000Z: 24 hours", function () { - const priceLevel = pricesLib.priceLevel(getPrices(), moment('2019-01-22T15:00:00.000Z')); - expect(priceLevel.code).eq('NORMAL'); - }); - }); - - describe("Price ratio", function () { - it("Price ratio 2019-01-21: 24 hours", function () { - expect(pricesLib.priceRatio(getPrices(), moment('2019-01-21'))).to.equal(0.826087); - }); - it("Price ratio 2019-01-21T01:00:00.000Z: 24 hours", function () { - expect(pricesLib.priceRatio(getPrices(), moment('2019-01-21T01:00:00.000Z'))).to.equal(1.0); - }); - it("Price ratio 2019-01-21T07:00:00.000Z: 24 hours", function () { - expect(pricesLib.priceRatio(getPrices(), moment('2019-01-21T07:00:00.000Z'))).to.equal(0.0); - }); - it("Price ratio 2019-01-21T10:00:00.000Z: 24 hours", function () { - expect(pricesLib.priceRatio(getPrices(), moment('2019-01-21T10:00:00.000Z'))).to.equal(0.391304); - }); - it("Price ratio 2019-01-22: 24 hours", function () { - expect(pricesLib.priceRatio(getPrices(), moment('2019-01-22'))).to.equal(0.826087); - }); - }); - - describe("Prices next hours", function () { - it("2019-01-21: 24 hours", function () { - const forDay = moment('2019-01-21').startOf('day'); - const prcs = pricesLib.pricesStarting(getPrices(), forDay, 0, 24) - expect(prcs.length).to.equal(24); - //expect(pricesLib.pricesStarting(getPrices(), moment('2019-01-21'), 0, 24).length).to.equal(24); - }); - it("2019-01-22: 24 hours", function () { - expect(pricesLib.pricesStarting(getPrices(), moment('2019-01-22'), 0, 24).length).to.equal(24); - }); - it("2019-01-21T10:00:00: 20 hours", function () { - let prices = pricesLib.pricesStarting(getPrices(), moment('2019-01-21'), 10, 20); - expect(prices.length).to.equal(20); - expect(prices[0].startsAt.format()).to.equal('2019-01-21T10:00:00+01:00'); - expect(prices[prices.length - 1].startsAt.format()).to.equal('2019-01-22T05:00:00+01:00'); - }); - it("2019-01-23: 0 hours", function () { - expect(pricesLib.pricesStarting(getPrices(), moment('2019-01-23'), 0, 24).length).to.equal(0); - }); - }); - - describe("Check low price", function () { - checkLowPrice('2019-01-21', '00:00:00', 1); - checkLowPrice('2019-01-21', '01:00:00', 1); - checkLowPrice('2019-01-21', '02:00:00', 1); - checkLowPrice('2019-01-21', '03:00:00', 1); - checkLowPrice('2019-01-21', '04:00:00', 1); - checkLowPrice('2019-01-21', '05:00:00', 1); - checkLowPrice('2019-01-21', '06:00:00', 1); - checkLowPrice('2019-01-21', '06:59:59', 1); - checkLowPrice('2019-01-21', '07:00:00', 0); - checkLowPrice('2019-01-21', '08:00:00', 0); - checkLowPrice('2019-01-21', '09:00:00', 0); - checkLowPrice('2019-01-21', '10:00:00', 1); - checkLowPrice('2019-01-21', '11:00:00', 1); - checkLowPrice('2019-01-21', '12:00:00', 1); - checkLowPrice('2019-01-21', '13:00:00', 1); - checkLowPrice('2019-01-21', '14:00:00', 1); - checkLowPrice('2019-01-21', '15:00:00', 1); - checkLowPrice('2019-01-21', '16:00:00', 0); - checkLowPrice('2019-01-21', '17:00:00', 0); - checkLowPrice('2019-01-21', '18:00:00', 0); - checkLowPrice('2019-01-21', '19:00:00', 1); - checkLowPrice('2019-01-21', '20:00:00', 1); - checkLowPrice('2019-01-21', '21:00:00', 1); - checkLowPrice('2019-01-21', '22:00:00', 1); - checkLowPrice('2019-01-21', '23:00:00', 1); - }); - - describe("Check high price - working day - home", function () { - let state = getState(true); - checkHighPrice('2019-01-21', '00:00:00', state, 1); - checkHighPrice('2019-01-21', '01:00:00', state, 0); - checkHighPrice('2019-01-21', '02:00:00', state, 0); - checkHighPrice('2019-01-21', '03:00:00', state, 0); - checkHighPrice('2019-01-21', '04:00:00', state, 1); - checkHighPrice('2019-01-21', '05:00:00', state, 0); - checkHighPrice('2019-01-21', '06:00:00', state, 0); - checkHighPrice('2019-01-21', '07:00:00', state, 0); - checkHighPrice('2019-01-21', '08:00:00', state, 1); - checkHighPrice('2019-01-21', '09:00:00', state, 0); - checkHighPrice('2019-01-21', '10:00:00', state, 1); - checkHighPrice('2019-01-21', '11:00:00', state, 0); - checkHighPrice('2019-01-21', '12:00:00', state, 1); - checkHighPrice('2019-01-21', '13:00:00', state, 0); - checkHighPrice('2019-01-21', '14:00:00', state, 0); - checkHighPrice('2019-01-21', '15:00:00', state, 0); - checkHighPrice('2019-01-21', '16:00:00', state, 0); - checkHighPrice('2019-01-21', '17:00:00', state, 0); - checkHighPrice('2019-01-21', '18:00:00', state, 0); - checkHighPrice('2019-01-21', '19:00:00', state, 0); - checkHighPrice('2019-01-21', '20:00:00', state, 0); - checkHighPrice('2019-01-21', '21:00:00', state, 0); - checkHighPrice('2019-01-21', '22:00:00', state, 0); - checkHighPrice('2019-01-21', '23:00:00', state, 1); - }); - - describe("Check high price - working day - away", function () { - let state = getState(false); - checkHighPrice('2019-01-21', '00:00:00', state, 0); - checkHighPrice('2019-01-21', '01:00:00', state, 0); - checkHighPrice('2019-01-21', '02:00:00', state, 0); - checkHighPrice('2019-01-21', '03:00:00', state, 0); - checkHighPrice('2019-01-21', '04:00:00', state, 0); - checkHighPrice('2019-01-21', '05:00:00', state, 0); - checkHighPrice('2019-01-21', '06:00:00', state, 0); - checkHighPrice('2019-01-21', '07:00:00', state, 0); - checkHighPrice('2019-01-21', '08:00:00', state, 1); - checkHighPrice('2019-01-21', '09:00:00', state, 0); - checkHighPrice('2019-01-21', '10:00:00', state, 1); - checkHighPrice('2019-01-21', '11:00:00', state, 0); - checkHighPrice('2019-01-21', '12:00:00', state, 1); - checkHighPrice('2019-01-21', '13:00:00', state, 0); - checkHighPrice('2019-01-21', '14:00:00', state, 1); - checkHighPrice('2019-01-21', '15:00:00', state, 0); - checkHighPrice('2019-01-21', '16:00:00', state, 1); - checkHighPrice('2019-01-21', '17:00:00', state, 0); - checkHighPrice('2019-01-21', '18:00:00', state, 1); - checkHighPrice('2019-01-21', '19:00:00', state, 0); - checkHighPrice('2019-01-21', '20:00:00', state, 0); - checkHighPrice('2019-01-21', '21:00:00', state, 0); - checkHighPrice('2019-01-21', '22:00:00', state, 0); - checkHighPrice('2019-01-21', '23:00:00', state, 0); - }); - -}); \ No newline at end of file diff --git a/test/prices_2.js b/test/prices_2.js deleted file mode 100644 index eb7c642..0000000 --- a/test/prices_2.js +++ /dev/null @@ -1,410 +0,0 @@ -const moment = require('../lib/moment-timezone-with-data'); -const expect = require("chai").expect; -const pricesLib = require('../lib/prices'); -const days = require("../lib/days"); - -let _prices = undefined; - -const getPrices = function () { - if (_prices) { - const aDate = moment('2019-01-30T23:00:00.000Z'); - for (let p of _prices) { - expect(p.startsAt.toISOString()).to.equal( aDate.toISOString()); - aDate.add(1, 'hour'); - } - expect(_prices.length).to.equal(48); - return _prices; - } - const prices = [ - { - startsAt: '2019-01-30T23:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.49495 - }, - { - startsAt: '2019-01-31T00:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.49058 - }, - { - startsAt: '2019-01-31T01:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.48981 - }, - { - startsAt: '2019-01-31T02:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.49029 - }, - { - startsAt: '2019-01-31T03:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.49417 - }, - { - startsAt: '2019-01-31T04:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.52164 - }, - { - startsAt: '2019-01-31T05:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.53076 - }, - { - startsAt: '2019-01-31T06:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.54493 - }, - { - startsAt: '2019-01-31T07:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.54726 - }, - { - startsAt: '2019-01-31T08:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.54658 - }, - { - startsAt: '2019-01-31T09:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.54619 - }, - { - startsAt: '2019-01-31T10:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.54435 - }, - { - startsAt: '2019-01-31T11:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.54425 - }, - { - startsAt: '2019-01-31T12:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.54571 - }, - { - startsAt: '2019-01-31T13:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.54435 - }, - { - startsAt: '2019-01-31T14:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.5427 - }, - { - startsAt: '2019-01-31T15:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.54794 - }, - { - startsAt: '2019-01-31T16:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.55619 - }, - { - startsAt: '2019-01-31T17:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.5526 - }, - { - startsAt: '2019-01-31T18:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.54716 - }, - { - startsAt: '2019-01-31T19:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.53775 - }, - { - startsAt: '2019-01-31T20:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.52678 - }, - { - startsAt: '2019-01-31T21:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.51067 - }, - { - startsAt: '2019-01-31T22:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.49941 - }, - { - startsAt: '2019-01-31T23:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.49563 - }, - { - startsAt: '2019-02-01T00:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.48751 - }, - { - startsAt: '2019-02-01T01:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.48326 - }, - { - startsAt: '2019-02-01T02:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.48394 - }, - { - startsAt: '2019-02-01T03:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.48993 - }, - { - startsAt: '2019-02-01T04:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.5077 - }, - { - startsAt: '2019-02-01T05:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.52142 - }, - { - startsAt: '2019-02-01T06:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.53407 - }, - { - startsAt: '2019-02-01T07:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.54731 - }, - { - startsAt: '2019-02-01T08:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.54026 - }, - { - startsAt: '2019-02-01T09:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.5362 - }, - { - startsAt: '2019-02-01T10:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.54605 - }, - { - startsAt: '2019-02-01T11:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.54141 - }, - { - startsAt: '2019-02-01T12:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.53745 - }, - { - startsAt: '2019-02-01T13:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.53765 - }, - { - startsAt: '2019-02-01T14:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.53697 - }, - { - startsAt: '2019-02-01T15:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.54113 - }, - { - startsAt: '2019-02-01T16:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.54953 - }, - { - startsAt: '2019-02-01T17:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.54364 - }, - { - startsAt: '2019-02-01T18:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.53205 - }, - { - startsAt: '2019-02-01T19:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.52335 - }, - { - startsAt: '2019-02-01T20:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.52152 - }, - { - startsAt: '2019-02-01T21:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.50915 - }, - { - startsAt: '2019-02-01T22:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.49186 - } - ]; - const timeZone = moment().tz(); - _prices = prices - .map(p => { - const startsAt = moment.tz(p.startsAt, 'UTC').tz(timeZone); - const time = startsAt.unix(); - const price = p.price; - return { startsAt, time, price }; - }); - return _prices; -}; - -const getState = function (atHome) { - return { - atHome: atHome, - homeOverride: false, - heatingOptions: { - workday: { - startHour: 5, - endHour: 23, - }, - notWorkday: { - startHour: 7, - endHour: 23, - }, - workHours: { - startHour: 7, - endHour: 14 - }, - country: 'NO' - } - }; -}; - -const checkHighPrice = function (aDate, aTime, state, numRows) { - it("High price at " + aTime, function () { - let x = pricesLib.pricesStarting(getPrices(), moment(aDate), 0, 24); - expect(pricesLib.checkHighPrice2(x, 4, moment(aDate + 'T' + aTime), state).length).to.equal(numRows); - }); -}; - -describe("Prices Kr.sand 31.01.2019", function () { - - before(function() { - days.setTimeZone('Europe/Oslo'); - }); - - describe("Check testdata", function () { - it("48 hours", function () { - expect(getPrices().length).to.equal(48); - }); - }); - - describe("Price ratio", function () { - it("Price ratio 2019-01-31: 24 hours", function () { - expect(pricesLib.priceRatio(getPrices(), moment('2019-01-31'))).to.equal(0.826087); - }); - it("Price ratio 2019-01-31T01:00:00.000Z: 24 hours", function () { - expect(pricesLib.priceRatio(getPrices(), moment('2019-01-31T01:00:00.000Z'))).to.equal(1.0); - }); - it("Price ratio 2019-01-31T07:00:00.000Z: 24 hours", function () { - expect(pricesLib.priceRatio(getPrices(), moment('2019-01-31T07:00:00.000Z'))).to.equal(0.130435); - }); - it("Price ratio 2019-01-31T10:00:00.000Z: 24 hours", function () { - expect(pricesLib.priceRatio(getPrices(), moment('2019-01-31T10:00:00.000Z'))).to.equal(0.434783); - }); - it("Price ratio 2019-01-31T16:00:00.000Z: 24 hours", function () { - expect(pricesLib.priceRatio(getPrices(), moment('2019-01-31T16:00:00.000Z'))).to.equal(0.0); - }); - it("Price ratio 2019-02-01: 24 hours", function () { - expect(pricesLib.priceRatio(getPrices(), moment('2019-02-01'))).to.equal(0.782609); - }); - }); - - describe("Check high price - working day - home", function () { - let state = getState(true); - checkHighPrice('2019-01-31', '00:00:00', state, 0); - checkHighPrice('2019-01-31', '01:00:00', state, 0); - checkHighPrice('2019-01-31', '02:00:00', state, 0); - checkHighPrice('2019-01-31', '03:00:00', state, 0); - checkHighPrice('2019-01-31', '04:00:00', state, 0); - checkHighPrice('2019-01-31', '05:00:00', state, 0); - checkHighPrice('2019-01-31', '06:00:00', state, 0); - checkHighPrice('2019-01-31', '07:00:00', state, 0); - checkHighPrice('2019-01-31', '08:00:00', state, 1); - checkHighPrice('2019-01-31', '09:00:00', state, 0); - checkHighPrice('2019-01-31', '10:00:00', state, 1); - checkHighPrice('2019-01-31', '11:00:00', state, 0); - checkHighPrice('2019-01-31', '12:00:00', state, 1); - checkHighPrice('2019-01-31', '13:00:00', state, 0); - checkHighPrice('2019-01-31', '14:00:00', state, 0); - checkHighPrice('2019-01-31', '15:00:00', state, 0); - checkHighPrice('2019-01-31', '16:00:00', state, 0); - checkHighPrice('2019-01-31', '17:00:00', state, 0); - checkHighPrice('2019-01-31', '18:00:00', state, 0); - checkHighPrice('2019-01-31', '19:00:00', state, 0); - checkHighPrice('2019-01-31', '20:00:00', state, 0); - checkHighPrice('2019-01-31', '21:00:00', state, 0); - checkHighPrice('2019-01-31', '22:00:00', state, 0); - checkHighPrice('2019-01-31', '23:00:00', state, 1); - }); - - -}); \ No newline at end of file diff --git a/test/prices_3.js b/test/prices_3.js deleted file mode 100644 index 5b77d61..0000000 --- a/test/prices_3.js +++ /dev/null @@ -1,607 +0,0 @@ -const moment = require('../lib/moment-timezone-with-data'); -const expect = require("chai").expect; -const pricesLib = require('../lib/prices'); -const days = require("../lib/days"); - -let _prices = undefined; - -days.setTimeZone('Europe/Oslo'); - -const getPrices = function () { - if (_prices) { - const aDate = moment('2019-01-30T23:00:00.000Z'); - for (let p of _prices) { - expect(p.startsAt.toISOString()).to.equal( aDate.toISOString()); - aDate.add(1, 'hour'); - } - expect(_prices.length).to.equal(48); - return _prices; - } - const prices = [ - { - startsAt: '2019-01-30T23:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.49495 - }, - { - startsAt: '2019-01-31T00:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.49058 - }, - { - startsAt: '2019-01-31T01:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.48981 - }, - { - startsAt: '2019-01-31T02:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.49029 - }, - { - startsAt: '2019-01-31T03:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.49417 - }, - { - startsAt: '2019-01-31T04:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.52164 - }, - { - startsAt: '2019-01-31T05:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.53076 - }, - { - startsAt: '2019-01-31T06:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.54493 - }, - { - startsAt: '2019-01-31T07:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.54726 - }, - { - startsAt: '2019-01-31T08:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.54658 - }, - { - startsAt: '2019-01-31T09:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.54619 - }, - { - startsAt: '2019-01-31T10:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.54435 - }, - { - startsAt: '2019-01-31T11:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.54425 - }, - { - startsAt: '2019-01-31T12:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.54571 - }, - { - startsAt: '2019-01-31T13:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.54435 - }, - { - startsAt: '2019-01-31T14:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.5427 - }, - { - startsAt: '2019-01-31T15:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.54794 - }, - { - startsAt: '2019-01-31T16:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.55619 - }, - { - startsAt: '2019-01-31T17:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.5526 - }, - { - startsAt: '2019-01-31T18:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.54716 - }, - { - startsAt: '2019-01-31T19:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.53775 - }, - { - startsAt: '2019-01-31T20:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.52678 - }, - { - startsAt: '2019-01-31T21:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.51067 - }, - { - startsAt: '2019-01-31T22:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.49941 - }, - { - startsAt: '2019-01-31T23:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.49563 - }, - { - startsAt: '2019-02-01T00:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.48751 - }, - { - startsAt: '2019-02-01T01:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.48326 - }, - { - startsAt: '2019-02-01T02:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.48394 - }, - { - startsAt: '2019-02-01T03:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.48993 - }, - { - startsAt: '2019-02-01T04:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.5077 - }, - { - startsAt: '2019-02-01T05:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.52142 - }, - { - startsAt: '2019-02-01T06:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.53407 - }, - { - startsAt: '2019-02-01T07:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.54731 - }, - { - startsAt: '2019-02-01T08:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.54026 - }, - { - startsAt: '2019-02-01T09:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.5362 - }, - { - startsAt: '2019-02-01T10:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.54605 - }, - { - startsAt: '2019-02-01T11:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.54141 - }, - { - startsAt: '2019-02-01T12:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.53745 - }, - { - startsAt: '2019-02-01T13:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.53765 - }, - { - startsAt: '2019-02-01T14:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.53697 - }, - { - startsAt: '2019-02-01T15:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.54113 - }, - { - startsAt: '2019-02-01T16:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.54953 - }, - { - startsAt: '2019-02-01T17:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.54364 - }, - { - startsAt: '2019-02-01T18:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.53205 - }, - { - startsAt: '2019-02-01T19:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.52335 - }, - { - startsAt: '2019-02-01T20:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.52152 - }, - { - startsAt: '2019-02-01T21:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.50915 - }, - { - startsAt: '2019-02-01T22:00:00.000Z', - priceArea: 'Kr.sand', - currency: 'NOK', - price: 0.49186 - } - ]; - const timeZone = moment().tz(); - _prices = prices - .map(p => { - const startsAt = moment.tz(p.startsAt, 'UTC').tz(timeZone); - const time = startsAt.unix(); - const price = p.price; - return { startsAt, time, price }; - }); - return _prices; -}; - -const checkAvgPrice = function (aDate, startHour, below, percentage, state) { - const aDays = moment(aDate); - const startingAt = aDays.hour(startHour).startOf('hour'); - const prices = getPrices(); - it("Average price check at " + aDate + ' - ' + startHour, function () { - const price = pricesLib.pricesStarting(prices, aDays, startHour, 1); - expect(price.length).to.equal(1); - let avg = pricesLib.averagePricesStarting(prices, aDays, 0, 24); - let chk = pricesLib.checkAveragePrice(price[0].price, avg, below, percentage); - expect(chk).to.equal(state); - }); -}; - -describe("Average price change", function () { - - before(function() { - days.setTimeZone('Europe/Oslo'); - }); - - describe("Check testdata", function () { - it("48 hours", function () { - const prcs = getPrices(); - //console.log(prcs); - expect(prcs.length).to.equal(48); - }); - }); - - describe("1 percent", function () { - it("0.53775 >= 1% higher than 0.5290425", function () { - expect(pricesLib.checkAveragePrice(0.53775, 0.5290425, false, 1)).to.equal(true); - }); - it("0.52678 NOT >= 1% higher than 0.5290425", function () { - expect(pricesLib.checkAveragePrice(0.52678, 0.5290425, false, 1)).to.equal(false); - }); - }); - - describe("2 percent", function () { - it("0.54716 >= 2% higher than 0.5290425", function () { - expect(pricesLib.checkAveragePrice(0.54716, 0.5290425, false, 2)).to.equal(true); - }); - it("0.53775 NOT >= 2% higher than 0.5290425", function () { - expect(pricesLib.checkAveragePrice(0.53775, 0.5290425, false, 2)).to.equal(false); - }); - }); - - describe("5 percent", function () { - it("0.55619 >= 5% higher than 0.5290425", function () { - expect(pricesLib.checkAveragePrice(0.55619, 0.5290425, false, 5)).to.equal(true); - }); - it("0.5526 NOT >= 5% higher than 0.5290425", function () { - expect(pricesLib.checkAveragePrice(0.5526, 0.5290425, false, 5)).to.equal(false); - }); - }); - - describe("-1 percent", function () { - it("0.49941 <= 1% lower than 0.5290425", function () { - expect(pricesLib.checkAveragePrice(0.49441, 0.5290425, true, 1)).to.equal(true); - }); - it("0.52678 NOT <= 1% lower than 0.5290425", function () { - expect(pricesLib.checkAveragePrice(0.52678, 0.5290425, true, 1)).to.equal(false); - }); - }); - - describe("-3 percent", function () { - it("0.51067 <= 3% lower than 0.5290425", function () { - expect(pricesLib.checkAveragePrice(0.51067, 0.5290425, true, 3)).to.equal(true); - }); - it("0.52164 NOT <= 3% lower than 0.5290425", function () { - expect(pricesLib.checkAveragePrice(0.52164, 0.5290425, true, 3)).to.equal(false); - }); - }); - - describe("-5 percent", function () { - it("0.49417 <= 5% lower than 0.5290425", function () { - expect(pricesLib.checkAveragePrice(0.49417, 0.5290425, true, 5)).to.equal(true); - }); - it("0.52164 NOT <= 5% lower than 0.5290425", function () { - expect(pricesLib.checkAveragePrice(0.52164, 0.5290425, true, 5)).to.equal(false); - }); - }); -}); - -describe("Average prices Kr.sand 31.01.2019", function () { - - before(function() { - days.setTimeZone('Europe/Oslo'); - }); - - describe("Check testdata", function () { - it("48 hours", function () { - expect(getPrices().length).to.equal(48); - }); - }); - - describe("Check average below 1 % of average", function () { - checkAvgPrice('2019-01-31', 0, true, 1, true); - checkAvgPrice('2019-01-31', 1, true, 1, true); - checkAvgPrice('2019-01-31', 2, true, 1, true); - checkAvgPrice('2019-01-31', 3, true, 1, true); - checkAvgPrice('2019-01-31', 4, true, 1, true); - checkAvgPrice('2019-01-31', 5, true, 1, true); - checkAvgPrice('2019-01-31', 6, true, 1, false); - checkAvgPrice('2019-01-31', 7, true, 1, false); - checkAvgPrice('2019-01-31', 8, true, 1, false); - checkAvgPrice('2019-01-31', 9, true, 1, false); - checkAvgPrice('2019-01-31', 10, true, 1, false); - checkAvgPrice('2019-01-31', 11, true, 1, false); - checkAvgPrice('2019-01-31', 12, true, 1, false); - checkAvgPrice('2019-01-31', 13, true, 1, false); - checkAvgPrice('2019-01-31', 14, true, 1, false); - checkAvgPrice('2019-01-31', 15, true, 1, false); - checkAvgPrice('2019-01-31', 16, true, 1, false); - checkAvgPrice('2019-01-31', 17, true, 1, false); - checkAvgPrice('2019-01-31', 18, true, 1, false); - checkAvgPrice('2019-01-31', 19, true, 1, false); - checkAvgPrice('2019-01-31', 20, true, 1, false); - checkAvgPrice('2019-01-31', 21, true, 1, false); - checkAvgPrice('2019-01-31', 22, true, 1, true); - checkAvgPrice('2019-01-31', 23, true, 1, true); - }); - - describe("Check average above 1 % of average", function () { - checkAvgPrice('2019-01-31', 0, false, 1, false); - checkAvgPrice('2019-01-31', 1, false, 1, false); - checkAvgPrice('2019-01-31', 2, false, 1, false); - checkAvgPrice('2019-01-31', 3, false, 1, false); - checkAvgPrice('2019-01-31', 4, false, 1, false); - checkAvgPrice('2019-01-31', 5, false, 1, false); - checkAvgPrice('2019-01-31', 6, false, 1, false); - checkAvgPrice('2019-01-31', 7, false, 1, true); - checkAvgPrice('2019-01-31', 8, false, 1, true); - checkAvgPrice('2019-01-31', 9, false, 1, true); - checkAvgPrice('2019-01-31', 10, false, 1, true); - checkAvgPrice('2019-01-31', 11, false, 1, true); - checkAvgPrice('2019-01-31', 12, false, 1, true); - checkAvgPrice('2019-01-31', 13, false, 1, true); - checkAvgPrice('2019-01-31', 14, false, 1, true); - checkAvgPrice('2019-01-31', 15, false, 1, true); - checkAvgPrice('2019-01-31', 16, false, 1, true); - checkAvgPrice('2019-01-31', 17, false, 1, true); - checkAvgPrice('2019-01-31', 18, false, 1, true); - checkAvgPrice('2019-01-31', 19, false, 1, true); - checkAvgPrice('2019-01-31', 20, false, 1, true); - checkAvgPrice('2019-01-31', 21, false, 1, false); - checkAvgPrice('2019-01-31', 22, false, 1, false); - checkAvgPrice('2019-01-31', 23, false, 1, false); - }); - - describe("Check average below 3 % of average", function () { - checkAvgPrice('2019-01-31', 0, true, 3, true); - checkAvgPrice('2019-01-31', 1, true, 3, true); - checkAvgPrice('2019-01-31', 2, true, 3, true); - checkAvgPrice('2019-01-31', 3, true, 3, true); - checkAvgPrice('2019-01-31', 4, true, 3, true); - checkAvgPrice('2019-01-31', 5, true, 3, false); - checkAvgPrice('2019-01-31', 6, true, 3, false); - checkAvgPrice('2019-01-31', 7, true, 3, false); - checkAvgPrice('2019-01-31', 8, true, 3, false); - checkAvgPrice('2019-01-31', 9, true, 3, false); - checkAvgPrice('2019-01-31', 10, true, 3, false); - checkAvgPrice('2019-01-31', 11, true, 3, false); - checkAvgPrice('2019-01-31', 12, true, 3, false); - checkAvgPrice('2019-01-31', 13, true, 3, false); - checkAvgPrice('2019-01-31', 14, true, 3, false); - checkAvgPrice('2019-01-31', 15, true, 3, false); - checkAvgPrice('2019-01-31', 16, true, 3, false); - checkAvgPrice('2019-01-31', 17, true, 3, false); - checkAvgPrice('2019-01-31', 18, true, 3, false); - checkAvgPrice('2019-01-31', 19, true, 3, false); - checkAvgPrice('2019-01-31', 20, true, 3, false); - checkAvgPrice('2019-01-31', 21, true, 3, false); - checkAvgPrice('2019-01-31', 22, true, 3, true); - checkAvgPrice('2019-01-31', 23, true, 3, true); - }); - - describe("Check average above 3 % of average", function () { - checkAvgPrice('2019-01-31', 0, false, 3, false); - checkAvgPrice('2019-01-31', 1, false, 3, false); - checkAvgPrice('2019-01-31', 2, false, 3, false); - checkAvgPrice('2019-01-31', 3, false, 3, false); - checkAvgPrice('2019-01-31', 4, false, 3, false); - checkAvgPrice('2019-01-31', 5, false, 3, false); - checkAvgPrice('2019-01-31', 6, false, 3, false); - checkAvgPrice('2019-01-31', 7, false, 3, true); - checkAvgPrice('2019-01-31', 8, false, 3, true); - checkAvgPrice('2019-01-31', 9, false, 3, true); - checkAvgPrice('2019-01-31', 10, false, 3, true); - checkAvgPrice('2019-01-31', 11, false, 3, false); - checkAvgPrice('2019-01-31', 12, false, 3, false); - checkAvgPrice('2019-01-31', 13, false, 3, true); - checkAvgPrice('2019-01-31', 14, false, 3, false); - checkAvgPrice('2019-01-31', 15, false, 3, false); - checkAvgPrice('2019-01-31', 16, false, 3, true); - checkAvgPrice('2019-01-31', 17, false, 3, true); - checkAvgPrice('2019-01-31', 18, false, 3, true); - checkAvgPrice('2019-01-31', 19, false, 3, true); - checkAvgPrice('2019-01-31', 20, false, 3, false); - checkAvgPrice('2019-01-31', 21, false, 3, false); - checkAvgPrice('2019-01-31', 22, false, 3, false); - checkAvgPrice('2019-01-31', 23, false, 3, false); - }); -}); - -const checkFollowingHoursLowestPrice = function (aDate, startHour, following_hours, num_lowest_hours, state) { - const aDays = moment(aDate); - const prices = getPrices(); - it("Lowest price check at " + aDate + ' - ' + startHour, function () { - const chk = pricesLib.pricesAmongLowest(prices, aDays, startHour, following_hours, num_lowest_hours); - expect(chk).to.equal(state); - }); -}; - -const checkFollowingHoursHighestPrice = function (aDate, startHour, following_hours, num_highest_hours, state) { - const aDays = moment(aDate); - const prices = getPrices(); - it("Highest price check at " + aDate + ' - ' + startHour, function () { - const chk = pricesLib.pricesAmongHighest(prices, aDays, startHour, following_hours, num_highest_hours); - expect(chk).to.equal(state); - }); -}; - -describe("The following X hours are among Y hours of the days lowest prices Kr.sand 31.01.2019", function () { - - before(function () { - days.setTimeZone('Europe/Oslo'); - }); - - describe("The following 3 hours are among 3 hours of the days lowest prices", function () { - checkFollowingHoursLowestPrice('2019-01-31', 1, 3, 3, true); - checkFollowingHoursLowestPrice('2019-01-31', 2, 3, 3, false); - checkFollowingHoursLowestPrice('2019-01-31', 3, 3, 3, false); - checkFollowingHoursLowestPrice('2019-01-31', 4, 3, 3, false); - checkFollowingHoursLowestPrice('2019-01-31', 5, 3, 3, false); - checkFollowingHoursLowestPrice('2019-01-31', 6, 3, 3, false); - checkFollowingHoursLowestPrice('2019-01-31', 7, 3, 3, false); - checkFollowingHoursLowestPrice('2019-01-31', 8, 3, 3, false); - checkFollowingHoursLowestPrice('2019-01-31', 9, 3, 3, false); - checkFollowingHoursLowestPrice('2019-01-31', 10, 3, 3, false); - checkFollowingHoursLowestPrice('2019-01-31', 11, 3, 3, false); - checkFollowingHoursLowestPrice('2019-01-31', 12, 3, 3, false); - checkFollowingHoursLowestPrice('2019-01-31', 13, 3, 3, false); - checkFollowingHoursLowestPrice('2019-01-31', 14, 3, 3, false); - checkFollowingHoursLowestPrice('2019-01-31', 15, 3, 3, false); - checkFollowingHoursLowestPrice('2019-01-31', 16, 3, 3, false); - checkFollowingHoursLowestPrice('2019-01-31', 17, 3, 3, false); - checkFollowingHoursLowestPrice('2019-01-31', 18, 3, 3, false); - }); - -}); - -describe("The following X hours are among Y hours of the days highest prices Kr.sand 31.01.2019", function () { - - before(function () { - days.setTimeZone('Europe/Oslo'); - }); - - describe("The following X hours are among the 6 hours of the days highest prices", function () { - checkFollowingHoursHighestPrice('2019-01-31', 1, 3, 6, false); - checkFollowingHoursHighestPrice('2019-01-31', 2, 3, 6, false); - checkFollowingHoursHighestPrice('2019-01-31', 3, 3, 6, false); - checkFollowingHoursHighestPrice('2019-01-31', 4, 3, 6, false); - checkFollowingHoursHighestPrice('2019-01-31', 5, 3, 6, false); - checkFollowingHoursHighestPrice('2019-01-31', 6, 3, 6, false); - checkFollowingHoursHighestPrice('2019-01-31', 7, 3, 6, false); - checkFollowingHoursHighestPrice('2019-01-31', 8, 1, 6, true); - checkFollowingHoursHighestPrice('2019-01-31', 8, 2, 6, true); - checkFollowingHoursHighestPrice('2019-01-31', 8, 3, 6, false); - checkFollowingHoursHighestPrice('2019-01-31', 9, 1, 6, true); - checkFollowingHoursHighestPrice('2019-01-31', 9, 2, 6, false); - checkFollowingHoursHighestPrice('2019-01-31', 9, 3, 6, false); - checkFollowingHoursHighestPrice('2019-01-31', 10, 3, 6, false); - checkFollowingHoursHighestPrice('2019-01-31', 11, 3, 6, false); - checkFollowingHoursHighestPrice('2019-01-31', 12, 3, 6, false); - checkFollowingHoursHighestPrice('2019-01-31', 13, 3, 6, false); - checkFollowingHoursHighestPrice('2019-01-31', 14, 3, 6, false); - checkFollowingHoursHighestPrice('2019-01-31', 15, 3, 6, false); - checkFollowingHoursHighestPrice('2019-01-31', 16, 3, 6, true); - checkFollowingHoursHighestPrice('2019-01-31', 17, 3, 6, true); - checkFollowingHoursHighestPrice('2019-01-31', 18, 3, 6, false); - checkFollowingHoursHighestPrice('2019-01-31', 19, 3, 6, false); - checkFollowingHoursHighestPrice('2019-01-31', 20, 3, 6, false); - checkFollowingHoursHighestPrice('2019-01-31', 21, 3, 6, false); - - - }); - -}); \ No newline at end of file diff --git a/test/prices_4.js b/test/prices_4.js deleted file mode 100644 index 83c7fed..0000000 --- a/test/prices_4.js +++ /dev/null @@ -1,487 +0,0 @@ -const moment = require('../lib/moment-timezone-with-data'); -const expect = require("chai").expect; -const pricesLib = require('../lib/prices'); -const days = require("../lib/days"); - -let _prices = undefined; - -days.setTimeZone('Europe/Helsinki'); - -const getPrices = function () { - if (_prices) { - const aDate = moment('2019-01-20T22:00:00.000Z'); - for (let p of _prices) { - expect(p.startsAt.toISOString()).to.equal( aDate.toISOString()); - aDate.add(1, 'hour'); - } - expect(_prices.length).to.equal(48); - return _prices; - } - const prices = [ - { - startsAt: '2019-01-20T22:00:00.000Z', - priceArea: 'FI', - currency: 'EUR', - price: 0.49599 - }, - { - startsAt: '2019-01-20T23:00:00.000Z', - priceArea: 'FI', - currency: 'EUR', - price: 0.49599 - }, - { - startsAt: '2019-01-21T00:00:00.000Z', - priceArea: 'FI', - currency: 'EUR', - price: 0.49103 - }, - { - startsAt: '2019-01-21T01:00:00.000Z', - priceArea: 'FI', - currency: 'EUR', - price: 0.48919 - }, - { - startsAt: '2019-01-21T02:00:00.000Z', - priceArea: 'FI', - currency: 'EUR', - price: 0.48987 - }, - { - startsAt: '2019-01-21T03:00:00.000Z', - priceArea: 'FI', - currency: 'EUR', - price: 0.4955 - }, - { - startsAt: '2019-01-21T04:00:00.000Z', - priceArea: 'FI', - currency: 'EUR', - price: 0.52078 - }, - { - startsAt: '2019-01-21T05:00:00.000Z', - priceArea: 'FI', - currency: 'EUR', - price: 0.53604 - }, - { - startsAt: '2019-01-21T06:00:00.000Z', - priceArea: 'FI', - currency: 'EUR', - price: 0.60264 - }, - { - startsAt: '2019-01-21T07:00:00.000Z', - priceArea: 'FI', - currency: 'EUR', - price: 0.63073 - }, - { - startsAt: '2019-01-21T08:00:00.000Z', - priceArea: 'FI', - currency: 'EUR', - price: 0.60176 - }, - { - startsAt: '2019-01-21T09:00:00.000Z', - priceArea: 'FI', - currency: 'EUR', - price: 0.56754 - }, - { - startsAt: '2019-01-21T10:00:00.000Z', - priceArea: 'FI', - currency: 'EUR', - price: 0.55704 - }, - { - startsAt: '2019-01-21T11:00:00.000Z', - priceArea: 'FI', - currency: 'EUR', - price: 0.55344 - }, - { - startsAt: '2019-01-21T12:00:00.000Z', - priceArea: 'FI', - currency: 'EUR', - price: 0.55315 - }, - { - startsAt: '2019-01-21T13:00:00.000Z', - priceArea: 'FI', - currency: 'EUR', - price: 0.55772 - }, - { - startsAt: '2019-01-21T14:00:00.000Z', - priceArea: 'FI', - currency: 'EUR', - price: 0.56385 - }, - { - startsAt: '2019-01-21T15:00:00.000Z', - priceArea: 'FI', - currency: 'EUR', - price: 0.58008 - }, - { - startsAt: '2019-01-21T16:00:00.000Z', - priceArea: 'FI', - currency: 'EUR', - price: 0.59671 - }, - { - startsAt: '2019-01-21T17:00:00.000Z', - priceArea: 'FI', - currency: 'EUR', - price: 0.57979 - }, - { - startsAt: '2019-01-21T18:00:00.000Z', - priceArea: 'FI', - currency: 'EUR', - price: 0.54868 - }, - { - startsAt: '2019-01-21T19:00:00.000Z', - priceArea: 'FI', - currency: 'EUR', - price: 0.53634 - }, - { - startsAt: '2019-01-21T20:00:00.000Z', - priceArea: 'FI', - currency: 'EUR', - price: 0.53264 - }, - { - startsAt: '2019-01-21T21:00:00.000Z', - priceArea: 'FI', - currency: 'EUR', - price: 0.52185 - }, - { - startsAt: '2019-01-21T22:00:00.000Z', - priceArea: 'FI', - currency: 'EUR', - price: 0.50902 - }, - { - startsAt: '2019-01-21T23:00:00.000Z', - priceArea: 'FI', - currency: 'EUR', - price: 0.49599 - }, - { - startsAt: '2019-01-22T00:00:00.000Z', - priceArea: 'FI', - currency: 'EUR', - price: 0.49103 - }, - { - startsAt: '2019-01-22T01:00:00.000Z', - priceArea: 'FI', - currency: 'EUR', - price: 0.48919 - }, - { - startsAt: '2019-01-22T02:00:00.000Z', - priceArea: 'FI', - currency: 'EUR', - price: 0.48987 - }, - { - startsAt: '2019-01-22T03:00:00.000Z', - priceArea: 'FI', - currency: 'EUR', - price: 0.4955 - }, - { - startsAt: '2019-01-22T04:00:00.000Z', - priceArea: 'FI', - currency: 'EUR', - price: 0.52078 - }, - { - startsAt: '2019-01-22T05:00:00.000Z', - priceArea: 'FI', - currency: 'EUR', - price: 0.53604 - }, - { - startsAt: '2019-01-22T06:00:00.000Z', - priceArea: 'FI', - currency: 'EUR', - price: 0.60264 - }, - { - startsAt: '2019-01-22T07:00:00.000Z', - priceArea: 'FI', - currency: 'EUR', - price: 0.63073 - }, - { - startsAt: '2019-01-22T08:00:00.000Z', - priceArea: 'FI', - currency: 'EUR', - price: 0.60176 - }, - { - startsAt: '2019-01-22T09:00:00.000Z', - priceArea: 'FI', - currency: 'EUR', - price: 0.56754 - }, - { - startsAt: '2019-01-22T10:00:00.000Z', - priceArea: 'FI', - currency: 'EUR', - price: 0.55704 - }, - { - startsAt: '2019-01-22T11:00:00.000Z', - priceArea: 'FI', - currency: 'EUR', - price: 0.55344 - }, - { - startsAt: '2019-01-22T12:00:00.000Z', - priceArea: 'FI', - currency: 'EUR', - price: 0.55315 - }, - { - startsAt: '2019-01-22T13:00:00.000Z', - priceArea: 'FI', - currency: 'EUR', - price: 0.55772 - }, - { - startsAt: '2019-01-22T14:00:00.000Z', - priceArea: 'FI', - currency: 'EUR', - price: 0.56385 - }, - { - startsAt: '2019-01-22T15:00:00.000Z', - priceArea: 'FI', - currency: 'EUR', - price: 0.58008 - }, - { - startsAt: '2019-01-22T16:00:00.000Z', - priceArea: 'FI', - currency: 'EUR', - price: 0.59671 - }, - { - startsAt: '2019-01-22T17:00:00.000Z', - priceArea: 'FI', - currency: 'EUR', - price: 0.57979 - }, - { - startsAt: '2019-01-22T18:00:00.000Z', - priceArea: 'FI', - currency: 'EUR', - price: 0.54868 - }, - { - startsAt: '2019-01-22T19:00:00.000Z', - priceArea: 'FI', - currency: 'EUR', - price: 0.53634 - }, - { - startsAt: '2019-01-22T20:00:00.000Z', - priceArea: 'FI', - currency: 'EUR', - price: 0.53264 - }, - { - startsAt: '2019-01-22T21:00:00.000Z', - priceArea: 'FI', - currency: 'EUR', - price: 0.52185 - } - ]; - const timeZone = moment().tz(); - _prices = prices - .map(p => { - const startsAt = moment.tz(p.startsAt, 'UTC').tz(timeZone); - const time = startsAt.unix(); - const price = p.price; - return { startsAt, time, price }; - }); - return _prices; -}; - -const getState = function (atHome) { - return { - atHome: atHome, - homeOverride: false, - heatingOptions: { - workday: { - startHour: 5, - endHour: 22.5, - }, - notWorkday: { - startHour: 7, - endHour: 23, - }, - workHours: { - startHour: 7, - endHour: 14 - }, - country: 'FI' - } - }; -}; - -const checkLowPrice = function (aDate, aTime, numRows) { - it("Low price at " + aTime, function () { - let x = pricesLib.pricesStarting(getPrices(), moment(aDate), 0, 24); - expect(pricesLib.checkLowPrice(x, 18, moment(aDate + 'T' + aTime)).length).to.equal(numRows); - }); -}; - -const checkHighPrice = function (aDate, aTime, state, numRows) { - it("High price at " + aTime, function () { - let x = pricesLib.pricesStarting(getPrices(), moment(aDate), 0, 24); - expect(pricesLib.checkHighPrice2(x, 6, moment(aDate + 'T' + aTime), state).length).to.equal(numRows); - }); -}; - -describe("Prices", function () { - - before(function() { - days.setTimeZone('Europe/Helsinki'); - }); - - describe("Check testdata", function () { - it("48 hours", function () { - const prcs = getPrices(); - //console.log(prcs); - expect(prcs.length).to.equal(48); - }); - }); - - describe("Check no prices", function () { - it("No prices: pricesStarting", function () { - expect(pricesLib.pricesStarting([], moment('2019-01-21'), 0, 24).length).to.equal(0); - }); - it("No prices: checkLowPrice", function () { - expect(pricesLib.checkLowPrice([], 18, moment('2019-01-21')).length).to.equal(0); - }); - it("No prices: checkHighPrice", function () { - expect(pricesLib.checkHighPrice2([], 6, moment('2019-01-21'), {}).length).to.equal(0); - }); - }); - - describe("Prices next hours", function () { - it("2019-01-21: 24 hours", function () { - const forDay = moment('2019-01-21').startOf('day'); - const prcs = pricesLib.pricesStarting(getPrices(), forDay, 0, 24) - expect(prcs.length).to.equal(24); - }); - it("2019-01-22: 24 hours", function () { - expect(pricesLib.pricesStarting(getPrices(), moment('2019-01-22'), 0, 24).length).to.equal(24); - }); - it("2019-01-21T10:00:00: 20 hours", function () { - let prices = pricesLib.pricesStarting(getPrices(), moment('2019-01-21'), 10, 20); - expect(prices.length).to.equal(20); - expect(prices[0].startsAt.format()).to.equal('2019-01-21T10:00:00+02:00'); - expect(prices[prices.length - 1].startsAt.format()).to.equal('2019-01-22T05:00:00+02:00'); - }); - it("2019-01-23: 0 hours", function () { - expect(pricesLib.pricesStarting(getPrices(), moment('2019-01-23'), 0, 24).length).to.equal(0); - }); - }); - - describe("Check low price", function () { - checkLowPrice('2019-01-21', '00:00:00', 1); - checkLowPrice('2019-01-21', '01:00:00', 1); - checkLowPrice('2019-01-21', '02:00:00', 1); - checkLowPrice('2019-01-21', '03:00:00', 1); - checkLowPrice('2019-01-21', '04:00:00', 1); - checkLowPrice('2019-01-21', '05:00:00', 1); - checkLowPrice('2019-01-21', '06:00:00', 1); - checkLowPrice('2019-01-21', '06:59:59', 1); - checkLowPrice('2019-01-21', '07:00:00', 1); - checkLowPrice('2019-01-21', '08:00:00', 0); - checkLowPrice('2019-01-21', '09:00:00', 0); - checkLowPrice('2019-01-21', '10:00:00', 0); - checkLowPrice('2019-01-21', '11:00:00', 1); - checkLowPrice('2019-01-21', '12:00:00', 1); - checkLowPrice('2019-01-21', '13:00:00', 1); - checkLowPrice('2019-01-21', '14:00:00', 1); - checkLowPrice('2019-01-21', '15:00:00', 1); - checkLowPrice('2019-01-21', '16:00:00', 1); - checkLowPrice('2019-01-21', '17:00:00', 0); - checkLowPrice('2019-01-21', '18:00:00', 0); - checkLowPrice('2019-01-21', '19:00:00', 0); - checkLowPrice('2019-01-21', '20:00:00', 1); - checkLowPrice('2019-01-21', '21:00:00', 1); - checkLowPrice('2019-01-21', '22:00:00', 1); - checkLowPrice('2019-01-21', '23:00:00', 1); - }); - - describe("Check high price - working day - home", function () { - let state = getState(true); - checkHighPrice('2019-01-21', '00:00:00', state, 1); - checkHighPrice('2019-01-21', '01:00:00', state, 0); - checkHighPrice('2019-01-21', '02:00:00', state, 1); - checkHighPrice('2019-01-21', '03:00:00', state, 0); - checkHighPrice('2019-01-21', '04:00:00', state, 0); - checkHighPrice('2019-01-21', '05:00:00', state, 0); - checkHighPrice('2019-01-21', '06:00:00', state, 0); - checkHighPrice('2019-01-21', '07:00:00', state, 0); - checkHighPrice('2019-01-21', '08:00:00', state, 1); - checkHighPrice('2019-01-21', '09:00:00', state, 0); - checkHighPrice('2019-01-21', '10:00:00', state, 1); - checkHighPrice('2019-01-21', '11:00:00', state, 0); - checkHighPrice('2019-01-21', '12:00:00', state, 1); - checkHighPrice('2019-01-21', '13:00:00', state, 0); - checkHighPrice('2019-01-21', '14:00:00', state, 0); - checkHighPrice('2019-01-21', '15:00:00', state, 0); - checkHighPrice('2019-01-21', '16:00:00', state, 0); - checkHighPrice('2019-01-21', '17:00:00', state, 0); - checkHighPrice('2019-01-21', '18:00:00', state, 0); - checkHighPrice('2019-01-21', '19:00:00', state, 0); - checkHighPrice('2019-01-21', '20:00:00', state, 0); - checkHighPrice('2019-01-21', '21:00:00', state, 0); - checkHighPrice('2019-01-21', '22:00:00', state, 0); - checkHighPrice('2019-01-21', '23:00:00', state, 1); - }); - - describe("Check high price - working day - away", function () { - let state = getState(false); - checkHighPrice('2019-01-21', '00:00:00', state, 0); - checkHighPrice('2019-01-21', '01:00:00', state, 0); - checkHighPrice('2019-01-21', '02:00:00', state, 0); - checkHighPrice('2019-01-21', '03:00:00', state, 0); - checkHighPrice('2019-01-21', '04:00:00', state, 0); - checkHighPrice('2019-01-21', '05:00:00', state, 0); - checkHighPrice('2019-01-21', '06:00:00', state, 0); - checkHighPrice('2019-01-21', '07:00:00', state, 0); - checkHighPrice('2019-01-21', '08:00:00', state, 1); - checkHighPrice('2019-01-21', '09:00:00', state, 0); - checkHighPrice('2019-01-21', '10:00:00', state, 1); - checkHighPrice('2019-01-21', '11:00:00', state, 0); - checkHighPrice('2019-01-21', '12:00:00', state, 1); - checkHighPrice('2019-01-21', '13:00:00', state, 0); - checkHighPrice('2019-01-21', '14:00:00', state, 1); - checkHighPrice('2019-01-21', '15:00:00', state, 0); - checkHighPrice('2019-01-21', '16:00:00', state, 1); - checkHighPrice('2019-01-21', '17:00:00', state, 0); - checkHighPrice('2019-01-21', '18:00:00', state, 1); - checkHighPrice('2019-01-21', '19:00:00', state, 0); - checkHighPrice('2019-01-21', '20:00:00', state, 0); - checkHighPrice('2019-01-21', '21:00:00', state, 0); - checkHighPrice('2019-01-21', '22:00:00', state, 0); - checkHighPrice('2019-01-21', '23:00:00', state, 0); - }); - -}); \ No newline at end of file diff --git a/test/prices_5.js b/test/prices_5.js deleted file mode 100644 index b1fc9b1..0000000 --- a/test/prices_5.js +++ /dev/null @@ -1,256 +0,0 @@ -const moment = require('../lib/moment-timezone-with-data'); -const expect = require("chai").expect; -const pricesLib = require('../lib/prices'); -const days = require("../lib/days"); - -let _prices = undefined; - -days.setTimeZone('Europe/Oslo'); - -const getPrices = function () { - if (_prices) { - const aDate = moment('2021-10-19T22:00:00.000Z'); - for (let p of _prices) { - expect(p.startsAt.toISOString()).to.equal( aDate.toISOString()); - aDate.add(1, 'hour'); - } - expect(_prices.length).to.equal(24); - return _prices; - } - const prices = [ - { - startsAt: '2021-10-19T22:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.85835 - }, - { - startsAt: '2021-10-19T23:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.64062 - }, - { - startsAt: '2021-10-20T00:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.38904 - }, - { - startsAt: '2021-10-20T01:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.10088 - }, - { - startsAt: '2021-10-20T02:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.1005 - }, - { - startsAt: '2021-10-20T03:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.61679 - }, - { - startsAt: '2021-10-20T04:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.88948 - }, - { - startsAt: '2021-10-20T05:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.9961 - }, - { - startsAt: '2021-10-20T06:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 1.03745 - }, - { - startsAt: '2021-10-20T07:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.98618 - }, - { - startsAt: '2021-10-20T08:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.90777 - }, - { - startsAt: '2021-10-20T09:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.88918 - }, - { - startsAt: '2021-10-20T10:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.88568 - }, - { - startsAt: '2021-10-20T11:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.89152 - }, - { - startsAt: '2021-10-20T12:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.89026 - }, - { - startsAt: '2021-10-20T13:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.88364 - }, - { - startsAt: '2021-10-20T14:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.88666 - }, - { - startsAt: '2021-10-20T15:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.91302 - }, - { - startsAt: '2021-10-20T16:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.9745 - }, - { - startsAt: '2021-10-20T17:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 1.01176 - }, - { - startsAt: '2021-10-20T18:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.91098 - }, - { - startsAt: '2021-10-20T19:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.88568 - }, - { - startsAt: '2021-10-20T20:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.87255 - }, - { - startsAt: '2021-10-20T21:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.78723 - } - ]; - const timeZone = moment().tz(); - _prices = prices - .map(p => { - const startsAt = moment.tz(p.startsAt, 'UTC').tz(timeZone); - const time = startsAt.unix(); - const price = p.price; - return { startsAt, time, price }; - }); - return _prices; -}; - -const checkFollowingHoursLowestPrice = function (aDate, startHour, following_hours, num_lowest_hours, state) { - const aDays = moment(aDate); - const prices = getPrices(); - it("Lowest price check at " + aDate + ' - ' + startHour, function () { - const chk = pricesLib.pricesAmongLowest(prices, aDays, startHour, following_hours, num_lowest_hours); - expect(chk).to.equal(state); - }); -}; - -const checkFollowingHoursHighestPrice = function (aDate, startHour, following_hours, num_highest_hours, state) { - const aDays = moment(aDate); - const prices = getPrices(); - it("Highest price check at " + aDate + ' - ' + startHour, function () { - const chk = pricesLib.pricesAmongHighest(prices, aDays, startHour, following_hours, num_highest_hours); - expect(chk).to.equal(state); - }); -}; - -describe("The following X hours are among Y hours of the days lowest prices Bergen 20.10.2021", function () { - - before(function () { - days.setTimeZone('Europe/Oslo'); - }); - - describe("The following 3 hours are among 8 hours of the days lowest prices", function () { - checkFollowingHoursLowestPrice('2021-10-20', 0, 3, 8, true); - checkFollowingHoursLowestPrice('2021-10-20', 1, 3, 8, true); - checkFollowingHoursLowestPrice('2021-10-20', 2, 3, 8, true); - checkFollowingHoursLowestPrice('2021-10-20', 3, 3, 8, true); - checkFollowingHoursLowestPrice('2021-10-20', 4, 3, 8, false); - checkFollowingHoursLowestPrice('2021-10-20', 5, 3, 8, false); - checkFollowingHoursLowestPrice('2021-10-20', 6, 3, 8, false); - checkFollowingHoursLowestPrice('2021-10-20', 7, 3, 8, false); - checkFollowingHoursLowestPrice('2021-10-20', 8, 3, 8, false); - checkFollowingHoursLowestPrice('2021-10-20', 9, 3, 8, false); - checkFollowingHoursLowestPrice('2021-10-20', 10, 3, 8, false); - checkFollowingHoursLowestPrice('2021-10-20', 11, 3, 8, false); - checkFollowingHoursLowestPrice('2021-10-20', 12, 3, 8, false); - checkFollowingHoursLowestPrice('2021-10-20', 13, 3, 8, false); - checkFollowingHoursLowestPrice('2021-10-20', 14, 3, 8, false); - checkFollowingHoursLowestPrice('2021-10-20', 15, 3, 8, false); - checkFollowingHoursLowestPrice('2021-10-20', 16, 3, 8, false); - checkFollowingHoursLowestPrice('2021-10-20', 17, 3, 8, false); - checkFollowingHoursLowestPrice('2021-10-20', 18, 3, 8, false); - }); - -}); - -describe("The following X hours are among Y hours of the days highest prices Bergen 20.10.2021", function () { - - before(function () { - days.setTimeZone('Europe/Oslo'); - }); - - describe("The following 2 hours are among the 6 hours of the days highest prices", function () { - checkFollowingHoursHighestPrice('2021-10-20', 0, 2, 6,false); - checkFollowingHoursHighestPrice('2021-10-20', 1, 2, 6,false); - checkFollowingHoursHighestPrice('2021-10-20', 2, 2, 6,false); - checkFollowingHoursHighestPrice('2021-10-20', 3, 2, 6,false); - checkFollowingHoursHighestPrice('2021-10-20', 4, 2, 6,false); - checkFollowingHoursHighestPrice('2021-10-20', 5, 2, 6,false); - checkFollowingHoursHighestPrice('2021-10-20', 6, 2, 6,false); - checkFollowingHoursHighestPrice('2021-10-20', 7, 2, 6,true); - checkFollowingHoursHighestPrice('2021-10-20', 8, 2, 6, true); - checkFollowingHoursHighestPrice('2021-10-20', 9, 2, 6, false); - checkFollowingHoursHighestPrice('2021-10-20', 10, 2, 6,false); - checkFollowingHoursHighestPrice('2021-10-20', 11, 2, 6,false); - checkFollowingHoursHighestPrice('2021-10-20', 12, 2, 6,false); - checkFollowingHoursHighestPrice('2021-10-20', 13, 2, 6,false); - checkFollowingHoursHighestPrice('2021-10-20', 14, 2, 6,false); - checkFollowingHoursHighestPrice('2021-10-20', 15, 2, 6,false); - checkFollowingHoursHighestPrice('2021-10-20', 16, 2, 6,false); - checkFollowingHoursHighestPrice('2021-10-20', 17, 2, 6,true); - checkFollowingHoursHighestPrice('2021-10-20', 18, 2, 6,true); - checkFollowingHoursHighestPrice('2021-10-20', 19, 2, 6,false); - checkFollowingHoursHighestPrice('2021-10-20', 20, 2, 6,false); - checkFollowingHoursHighestPrice('2021-10-20', 21, 2, 6,false); - }); - -}); diff --git a/test/prices_6.js b/test/prices_6.js deleted file mode 100644 index 8ef9693..0000000 --- a/test/prices_6.js +++ /dev/null @@ -1,705 +0,0 @@ -const moment = require('../lib/moment-timezone-with-data'); -const expect = require("chai").expect; -const pricesLib = require('../lib/prices'); -const days = require("../lib/days"); - -let _prices = undefined; - -days.setTimeZone('Europe/Oslo'); - -const getPrices = function () { - if (_prices) { - const aDate = moment('2021-10-19T22:00:00.000Z'); - for (let p of _prices) { - expect(p.startsAt.toISOString()).to.equal(aDate.toISOString()); - aDate.add(1, 'hour'); - } - expect(_prices.length).to.equal(50); - return _prices; - } - const prices = [ - { - startsAt: '2021-10-19T22:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.85835 - }, - { - startsAt: '2021-10-19T23:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.64062 - }, - { - startsAt: '2021-10-20T00:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.38904 - }, - { - startsAt: '2021-10-20T01:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.10088 - }, - { - startsAt: '2021-10-20T02:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.1005 - }, - { - startsAt: '2021-10-20T03:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.61679 - }, - { - startsAt: '2021-10-20T04:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.88948 - }, - { - startsAt: '2021-10-20T05:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.9961 - }, - { - startsAt: '2021-10-20T06:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 1.03745 - }, - { - startsAt: '2021-10-20T07:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.98618 - }, - { - startsAt: '2021-10-20T08:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.90777 - }, - { - startsAt: '2021-10-20T09:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.88918 - }, - { - startsAt: '2021-10-20T10:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.88568 - }, - { - startsAt: '2021-10-20T11:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.89152 - }, - { - startsAt: '2021-10-20T12:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.89026 - }, - { - startsAt: '2021-10-20T13:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.88364 - }, - { - startsAt: '2021-10-20T14:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.88666 - }, - { - startsAt: '2021-10-20T15:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.91302 - }, - { - startsAt: '2021-10-20T16:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.9745 - }, - { - startsAt: '2021-10-20T17:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 1.01176 - }, - { - startsAt: '2021-10-20T18:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.91098 - }, - { - startsAt: '2021-10-20T19:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.88568 - }, - { - startsAt: '2021-10-20T20:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.87255 - }, - { - startsAt: '2021-10-20T21:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.78723 - }, - { - startsAt: '2021-10-20T22:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.85835 - }, - { - startsAt: '2021-10-20T23:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.64062 - }, - { - startsAt: '2021-10-21T00:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.38904 - }, - { - startsAt: '2021-10-21T01:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.10088 - }, - { - startsAt: '2021-10-21T02:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.1005 - }, - { - startsAt: '2021-10-21T03:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.61679 - }, - { - startsAt: '2021-10-21T04:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.88948 - }, - { - startsAt: '2021-10-21T05:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.9961 - }, - { - startsAt: '2021-10-21T06:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 1.03745 - }, - { - startsAt: '2021-10-21T07:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.98618 - }, - { - startsAt: '2021-10-21T08:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.90777 - }, - { - startsAt: '2021-10-21T09:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.88918 - }, - { - startsAt: '2021-10-21T10:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.88568 - }, - { - startsAt: '2021-10-21T11:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.89152 - }, - { - startsAt: '2021-10-21T12:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.89026 - }, - { - startsAt: '2021-10-21T13:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.88364 - }, - { - startsAt: '2021-10-21T14:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.88666 - }, - { - startsAt: '2021-10-21T15:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.91302 - }, - { - startsAt: '2021-10-21T16:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.9745 - }, - { - startsAt: '2021-10-21T17:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 1.01176 - }, - { - startsAt: '2021-10-21T18:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.91098 - }, - { - startsAt: '2021-10-21T19:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.88568 - }, - { - startsAt: '2021-10-21T20:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.87255 - }, - { - startsAt: '2021-10-21T21:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.78723 - }, - { - startsAt: '2021-10-21T22:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.85835 - }, - { - startsAt: '2021-10-21T23:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.64062 - } - ]; - const timeZone = moment().tz(); - _prices = prices - .map(p => { - const startsAt = moment.tz(p.startsAt, 'UTC').tz(timeZone); - const time = startsAt.unix(); - const price = p.price; - return { startsAt, time, price }; - }); - return _prices; -}; - -describe("Check days period", function () { - - before(function () { - days.setTimeZone('Europe/Oslo'); - }); - - describe("Check days period", function () { - it("Check 00:00 to 23:59 - '2021-10-20", function () { - const { startTs, endTs } = pricesLib.daysPeriod(moment('2021-10-20T07:00:00.000Z'), '00:00', '23:59'); - expect(startTs.format()).to.equal('2021-10-20T00:00:00+02:00'); - expect(endTs.format()).to.equal('2021-10-20T23:59:00+02:00'); - }); - it("Check 00:00 to 00:00 next day - '2021-10-20 a", function () { - const { startTs, endTs } = pricesLib.daysPeriod(moment('2021-10-20T00:00:00+02:00'), '00:00', '00:00'); - expect(startTs.format()).to.equal('2021-10-20T00:00:00+02:00'); - expect(endTs.format()).to.equal('2021-10-21T00:00:00+02:00'); - }); - it("Check 00:00 to 00:00 next day - '2021-10-20 b", function () { - const { startTs, endTs } = pricesLib.daysPeriod(moment('2021-10-20T07:00:00.000Z'), '00:00', '00:00'); - expect(startTs.format()).to.equal('2021-10-20T00:00:00+02:00'); - expect(endTs.format()).to.equal('2021-10-21T00:00:00+02:00'); - }); - it("Check 01:00 to 00:00 - '2021-10-20", function () { - const { startTs, endTs } = pricesLib.daysPeriod(moment('2021-10-20T07:00:00.000Z'), '01:00', '00:00'); - expect(startTs.format()).to.equal('2021-10-20T01:00:00+02:00'); - expect(endTs.format()).to.equal('2021-10-21T00:00:00+02:00'); - }); - it("Check 20:00 to 23:00 - '2021-10-20 a", function () { - const { startTs, endTs } = pricesLib.daysPeriod(moment('2021-10-20T07:00:00.000Z'), '20:00', '23:00'); - expect(startTs.format()).to.equal('2021-10-20T20:00:00+02:00'); - expect(endTs.format()).to.equal('2021-10-20T23:00:00+02:00'); - }); - it("Check 20:00 to 23:00 - '2021-10-20 b", function () { - const { startTs, endTs } = pricesLib.daysPeriod(moment('2021-10-20T20:00:00.000Z'), '20:00', '23:00'); - expect(startTs.format()).to.equal('2021-10-20T20:00:00+02:00'); - expect(endTs.format()).to.equal('2021-10-20T23:00:00+02:00'); - }); - it("Check 20:00 to 23:00 - 2021-10-21", function () { - const { startTs, endTs } = pricesLib.daysPeriod(moment('2021-10-21T05:00:00.000Z'), '20:00', '23:00'); - expect(startTs.format()).to.equal('2021-10-21T20:00:00+02:00'); - expect(endTs.format()).to.equal('2021-10-21T23:00:00+02:00'); - }); - it("Check 22:00 to 05:00 same day", function () { - const { startTs, endTs } = pricesLib.daysPeriod(moment('2021-10-20T07:00:00.000Z'), '22:00', '05:00'); - expect(startTs.format()).to.equal('2021-10-20T22:00:00+02:00'); - expect(endTs.format()).to.equal('2021-10-21T05:00:00+02:00'); - }); - it("Check 22:00 to 05:00 same day", function () { - const { startTs, endTs } = pricesLib.daysPeriod(moment('2021-10-20T23:01:00.000Z'), '22:00', '05:00'); - expect(startTs.format()).to.equal('2021-10-20T22:00:00+02:00'); - expect(endTs.format()).to.equal('2021-10-21T05:00:00+02:00'); - }); - it("Check 22:00 to 05:00 next day - a", function () { - const { startTs, endTs } = pricesLib.daysPeriod(moment('2021-10-21T01:00:00.000Z'), '22:00', '05:00'); - expect(startTs.format()).to.equal('2021-10-20T22:00:00+02:00'); - expect(endTs.format()).to.equal('2021-10-21T05:00:00+02:00'); - }); - it("Check 22:00 to 05:00 next day - b", function () { - const { startTs, endTs } = pricesLib.daysPeriod(moment('2021-10-20T21:30:00+02:00'), '22:00', '05:00'); - expect(startTs.format()).to.equal('2021-10-20T22:00:00+02:00'); - expect(endTs.format()).to.equal('2021-10-21T05:00:00+02:00'); - }); - it("Check 22:00 to 05:00 next day - c", function () { - const { startTs, endTs } = pricesLib.daysPeriod(moment('2021-10-20T22:00:00+02:00'), '22:00', '05:00'); - expect(startTs.format()).to.equal('2021-10-20T22:00:00+02:00'); - expect(endTs.format()).to.equal('2021-10-21T05:00:00+02:00'); - }); - it("Check 22:00 to 05:00 next day - c", function () { - const { startTs, endTs } = pricesLib.daysPeriod(moment('2021-10-21T00:00:00+02:00'), '22:00', '05:00'); - expect(startTs.format()).to.equal('2021-10-20T22:00:00+02:00'); - expect(endTs.format()).to.equal('2021-10-21T05:00:00+02:00'); - }); - it("Check 22:00 to 05:00 next day - c", function () { - const { startTs, endTs } = pricesLib.daysPeriod(moment('2021-10-21T04:30:00+02:00'), '22:00', '05:00'); - expect(startTs.format()).to.equal('2021-10-20T22:00:00+02:00'); - expect(endTs.format()).to.equal('2021-10-21T05:00:00+02:00'); - }); - it("Check 22:00 to 05:00 next day - c", function () { - const { startTs, endTs } = pricesLib.daysPeriod(moment('2021-10-21T05:00:00+02:00'), '22:00', '05:00'); - expect(startTs.format()).to.equal('2021-10-20T22:00:00+02:00'); - expect(endTs.format()).to.equal('2021-10-21T05:00:00+02:00'); - }); - it("Check 22:00 to 05:00 next day - c", function () { - const { startTs, endTs } = pricesLib.daysPeriod(moment('2021-10-21T05:30:00+02:00'), '22:00', '05:00'); - expect(startTs.format()).to.equal('2021-10-21T22:00:00+02:00'); - expect(endTs.format()).to.equal('2021-10-22T05:00:00+02:00'); - }); - }); -}); - -const checkLowestInPeriod = function (aDate, start, end, num_lowest_hours, state) { - it("Lowest price check at " + aDate + ':' + start + '-' + end + ' with ' + num_lowest_hours + ' hours', function () { - const prices = getPrices(); - const localTime = moment(aDate); - const { startTs, endTs } = pricesLib.daysPeriod(localTime, start, end); - const chk = pricesLib.pricesLowestInPeriod(prices, localTime, startTs, endTs, num_lowest_hours); - //console.log('test:', localTime, startTs.format(), endTs.format(), num_lowest_hours, ' -> ', chk); - expect(chk).to.equal(state); - }); -}; - -const checkHighestInPeriod = function (aDate, start, end, num_highest_hours, state) { - it("Highest price check at " + aDate + ':' + start + '-' + end + ' with ' + num_highest_hours + ' hours', function () { - const prices = getPrices(); - const localTime = moment(aDate); - const { startTs, endTs } = pricesLib.daysPeriod(localTime, start, end); - const chk = pricesLib.pricesHighestInPeriod(prices, localTime, startTs, endTs, num_highest_hours); - //console.log('test:', localTime, startTs.format(), endTs.format(), num_highest_hours, ' -> ', chk); - expect(chk).to.equal(state); - }); -}; - -describe("Current price is among the 'low hours' hours of lowest between 'start' and 'end' Bergen 20.10.2021", function () { - - before(function () { - days.setTimeZone('Europe/Oslo'); - }); - - describe("Current price is among the X hours of lowest between 01:00 and 04:00", function () { - checkLowestInPeriod('2021-10-20T00:03:00', '01:00', '04:00', 1, false); - checkLowestInPeriod('2021-10-20T00:03:00', '01:00', '04:00', 2, false); - checkLowestInPeriod('2021-10-20T00:03:00', '01:00', '04:00', 3, false); - checkLowestInPeriod('2021-10-20T00:03:00', '01:00', '04:00', 4, false); - checkLowestInPeriod('2021-10-20T00:03:00', '01:00', '04:00', 5, false); - - checkLowestInPeriod('2021-10-20T01:03:00', '01:00', '04:00', 1, false); - checkLowestInPeriod('2021-10-20T01:03:00', '01:00', '04:00', 2, false); - checkLowestInPeriod('2021-10-20T01:03:00', '01:00', '04:00', 3, true); - checkLowestInPeriod('2021-10-20T01:03:00', '01:00', '04:00', 4, true); - checkLowestInPeriod('2021-10-20T01:03:00', '01:00', '04:00', 5, true); - - checkLowestInPeriod('2021-10-20T02:03:00', '01:00', '04:00', 1, false); - checkLowestInPeriod('2021-10-20T02:03:00', '01:00', '04:00', 2, true); - checkLowestInPeriod('2021-10-20T02:03:00', '01:00', '04:00', 3, true); - checkLowestInPeriod('2021-10-20T02:03:00', '01:00', '04:00', 4, true); - checkLowestInPeriod('2021-10-20T02:03:00', '01:00', '04:00', 5, true); - - checkLowestInPeriod('2021-10-20T03:03:00', '01:00', '04:00', 1, true); - checkLowestInPeriod('2021-10-20T03:03:00', '01:00', '04:00', 2, true); - checkLowestInPeriod('2021-10-20T03:03:00', '01:00', '04:00', 3, true); - checkLowestInPeriod('2021-10-20T03:03:00', '01:00', '04:00', 4, true); - checkLowestInPeriod('2021-10-20T03:03:00', '01:00', '04:00', 5, true); - - checkLowestInPeriod('2021-10-20T04:03:00', '01:00', '04:00', 1, false); - checkLowestInPeriod('2021-10-20T04:03:00', '01:00', '04:00', 2, false); - checkLowestInPeriod('2021-10-20T04:03:00', '01:00', '04:00', 3, false); - checkLowestInPeriod('2021-10-20T04:03:00', '01:00', '04:00', 4, false); - checkLowestInPeriod('2021-10-20T04:03:00', '01:00', '04:00', 5, false); - }); - - describe("Current price is among the X hours of lowest between 22:00 and 05:00", function () { - checkLowestInPeriod('2021-10-20T20:03:00', '22:00', '05:00', 1, false); - checkLowestInPeriod('2021-10-20T20:03:00', '22:00', '05:00', 2, false); - checkLowestInPeriod('2021-10-20T20:03:00', '22:00', '05:00', 3, false); - checkLowestInPeriod('2021-10-20T20:03:00', '22:00', '05:00', 4, false); - checkLowestInPeriod('2021-10-20T20:03:00', '22:00', '05:00', 5, false); - - checkLowestInPeriod('2021-10-20T22:00:00', '22:00', '05:00', 1, false); - checkLowestInPeriod('2021-10-20T22:00:00', '22:00', '05:00', 2, false); - checkLowestInPeriod('2021-10-20T22:00:00', '22:00', '05:00', 3, false); - checkLowestInPeriod('2021-10-20T22:00:00', '22:00', '05:00', 4, false); - checkLowestInPeriod('2021-10-20T22:00:00', '22:00', '05:00', 5, false); - - checkLowestInPeriod('2021-10-21T00:00:00', '22:00', '05:00', 1, false); - checkLowestInPeriod('2021-10-21T00:00:00', '22:00', '05:00', 2, false); - checkLowestInPeriod('2021-10-21T00:00:00', '22:00', '05:00', 3, false); - checkLowestInPeriod('2021-10-21T00:00:00', '22:00', '05:00', 4, false); - checkLowestInPeriod('2021-10-21T00:00:00', '22:00', '05:00', 5, false); - - checkLowestInPeriod('2021-10-21T01:01:00', '22:00', '05:00', 1, false); - checkLowestInPeriod('2021-10-21T01:01:00', '22:00', '05:00', 2, false); - checkLowestInPeriod('2021-10-21T01:01:00', '22:00', '05:00', 3, false); - checkLowestInPeriod('2021-10-21T01:01:00', '22:00', '05:00', 4, true); - checkLowestInPeriod('2021-10-21T01:01:00', '22:00', '05:00', 5, true); - - checkLowestInPeriod('2021-10-21T03:00:10', '22:00', '05:00', 1, false); - checkLowestInPeriod('2021-10-21T03:00:10', '22:00', '05:00', 2, true); - checkLowestInPeriod('2021-10-21T03:00:10', '22:00', '05:00', 3, true); - checkLowestInPeriod('2021-10-21T03:00:10', '22:00', '05:00', 4, true); - checkLowestInPeriod('2021-10-21T03:00:10', '22:00', '05:00', 5, true); - - checkLowestInPeriod('2021-10-21T05:00:00', '22:00', '05:00', 1, false); - checkLowestInPeriod('2021-10-21T05:00:00', '22:00', '05:00', 2, false); - checkLowestInPeriod('2021-10-21T05:00:00', '22:00', '05:00', 3, false); - checkLowestInPeriod('2021-10-21T05:00:00', '22:00', '05:00', 4, true); - checkLowestInPeriod('2021-10-21T05:00:00', '22:00', '05:00', 5, true); - - checkLowestInPeriod('2021-10-21T05:01:00', '22:00', '05:00', 1, false); - checkLowestInPeriod('2021-10-21T05:01:00', '22:00', '05:00', 2, false); - checkLowestInPeriod('2021-10-21T05:01:00', '22:00', '05:00', 3, false); - checkLowestInPeriod('2021-10-21T05:01:00', '22:00', '05:00', 4, false); - checkLowestInPeriod('2021-10-21T05:01:00', '22:00', '05:00', 5, false); - }); - -}); - -describe("Current price is among the 'high hours' hours of higherst between 'start' and 'end' Bergen 20.10.2021", function () { - - before(function () { - days.setTimeZone('Europe/Oslo'); - }); - - describe("Current price is among the X hours of highest between 01:00 and 04:00", function () { - checkHighestInPeriod('2021-10-20T00:03:00', '01:00', '04:00', 1, false); - checkHighestInPeriod('2021-10-20T00:03:00', '01:00', '04:00', 2, false); - checkHighestInPeriod('2021-10-20T00:03:00', '01:00', '04:00', 3, false); - checkHighestInPeriod('2021-10-20T00:03:00', '01:00', '04:00', 4, false); - checkHighestInPeriod('2021-10-20T00:03:00', '01:00', '04:00', 5, false); - - checkHighestInPeriod('2021-10-20T01:03:00', '01:00', '04:00', 1, true); - checkHighestInPeriod('2021-10-20T01:03:00', '01:00', '04:00', 2, true); - checkHighestInPeriod('2021-10-20T01:03:00', '01:00', '04:00', 3, true); - checkHighestInPeriod('2021-10-20T01:03:00', '01:00', '04:00', 4, true); - checkHighestInPeriod('2021-10-20T01:03:00', '01:00', '04:00', 5, true); - - checkHighestInPeriod('2021-10-20T02:03:00', '01:00', '04:00', 1, false); - checkHighestInPeriod('2021-10-20T02:03:00', '01:00', '04:00', 2, true); - checkHighestInPeriod('2021-10-20T02:03:00', '01:00', '04:00', 3, true); - checkHighestInPeriod('2021-10-20T02:03:00', '01:00', '04:00', 4, true); - checkHighestInPeriod('2021-10-20T02:03:00', '01:00', '04:00', 5, true); - - checkHighestInPeriod('2021-10-20T03:03:00', '01:00', '04:00', 1, false); - checkHighestInPeriod('2021-10-20T03:03:00', '01:00', '04:00', 2, false); - checkHighestInPeriod('2021-10-20T03:03:00', '01:00', '04:00', 3, true); - checkHighestInPeriod('2021-10-20T03:03:00', '01:00', '04:00', 4, true); - checkHighestInPeriod('2021-10-20T03:03:00', '01:00', '04:00', 5, true); - - checkHighestInPeriod('2021-10-20T04:03:00', '01:00', '04:00', 1, false); - checkHighestInPeriod('2021-10-20T04:03:00', '01:00', '04:00', 2, false); - checkHighestInPeriod('2021-10-20T04:03:00', '01:00', '04:00', 3, false); - checkHighestInPeriod('2021-10-20T04:03:00', '01:00', '04:00', 4, false); - checkHighestInPeriod('2021-10-20T04:03:00', '01:00', '04:00', 5, false); - }); - - describe("Current price is among the X hours of highest between 08:00 and 16:00", function () { - checkHighestInPeriod('2021-10-20T00:03:00', '08:00', '16:00', 1, false); - checkHighestInPeriod('2021-10-20T00:03:00', '08:00', '16:00', 2, false); - checkHighestInPeriod('2021-10-20T00:03:00', '08:00', '16:00', 3, false); - checkHighestInPeriod('2021-10-20T00:03:00', '08:00', '16:00', 4, false); - checkHighestInPeriod('2021-10-20T00:03:00', '08:00', '16:00', 5, false); - - checkHighestInPeriod('2021-10-20T08:03:00', '08:00', '16:00', 1, true); - checkHighestInPeriod('2021-10-20T08:03:00', '08:00', '16:00', 2, true); - checkHighestInPeriod('2021-10-20T08:03:00', '08:00', '16:00', 3, true); - checkHighestInPeriod('2021-10-20T08:03:00', '08:00', '16:00', 4, true); - checkHighestInPeriod('2021-10-20T08:03:00', '08:00', '16:00', 5, true); - - checkHighestInPeriod('2021-10-20T10:00:00', '08:00', '16:00', 1, false); - checkHighestInPeriod('2021-10-20T10:00:00', '08:00', '16:00', 2, false); - checkHighestInPeriod('2021-10-20T10:00:00', '08:00', '16:00', 3, true); - checkHighestInPeriod('2021-10-20T10:00:00', '08:00', '16:00', 4, true); - checkHighestInPeriod('2021-10-20T10:00:00', '08:00', '16:00', 5, true); - - checkHighestInPeriod('2021-10-20T12:03:00', '08:00', '16:00', 1, false); - checkHighestInPeriod('2021-10-20T12:03:00', '08:00', '16:00', 2, false); - checkHighestInPeriod('2021-10-20T12:03:00', '08:00', '16:00', 3, false); - checkHighestInPeriod('2021-10-20T12:03:00', '08:00', '16:00', 4, false); - checkHighestInPeriod('2021-10-20T12:03:00', '08:00', '16:00', 5, false); - - checkHighestInPeriod('2021-10-20T15:03:00', '08:00', '16:00', 1, false); - checkHighestInPeriod('2021-10-20T15:03:00', '08:00', '16:00', 2, false); - checkHighestInPeriod('2021-10-20T15:03:00', '08:00', '16:00', 3, false); - checkHighestInPeriod('2021-10-20T15:03:00', '08:00', '16:00', 4, false); - checkHighestInPeriod('2021-10-20T15:03:00', '08:00', '16:00', 5, false); - - checkHighestInPeriod('2021-10-20T16:00:00', '08:00', '16:00', 1, false); - checkHighestInPeriod('2021-10-20T16:00:00', '08:00', '16:00', 2, false); - checkHighestInPeriod('2021-10-20T16:00:00', '08:00', '16:00', 3, false); - checkHighestInPeriod('2021-10-20T16:00:00', '08:00', '16:00', 4, false); - checkHighestInPeriod('2021-10-20T16:00:00', '08:00', '16:00', 5, false); - - checkHighestInPeriod('2021-10-20T16:00:10', '08:00', '16:00', 1, false); - checkHighestInPeriod('2021-10-20T16:00:10', '08:00', '16:00', 2, false); - checkHighestInPeriod('2021-10-20T16:00:10', '08:00', '16:00', 3, false); - checkHighestInPeriod('2021-10-20T16:00:10', '08:00', '16:00', 4, false); - checkHighestInPeriod('2021-10-20T16:00:10', '08:00', '16:00', 5, false); - }); - - describe("Current price is among the X hours of highest between 13:00 and 16:01", function () { - checkHighestInPeriod('2021-10-20T00:03:00', '13:00', '16:01', 1, false); - checkHighestInPeriod('2021-10-20T00:03:00', '13:00', '16:01', 2, false); - checkHighestInPeriod('2021-10-20T00:03:00', '13:00', '16:01', 3, false); - checkHighestInPeriod('2021-10-20T00:03:00', '13:00', '16:01', 4, false); - checkHighestInPeriod('2021-10-20T00:03:00', '13:00', '16:01', 5, false); - - checkHighestInPeriod('2021-10-20T08:03:00', '13:00', '16:01', 1, false); - checkHighestInPeriod('2021-10-20T08:03:00', '13:00', '16:01', 2, false); - checkHighestInPeriod('2021-10-20T08:03:00', '13:00', '16:01', 3, false); - checkHighestInPeriod('2021-10-20T08:03:00', '13:00', '16:01', 4, false); - checkHighestInPeriod('2021-10-20T08:03:00', '13:00', '16:01', 5, false); - - checkHighestInPeriod('2021-10-20T10:00:00', '13:00', '16:01', 1, false); - checkHighestInPeriod('2021-10-20T10:00:00', '13:00', '16:01', 2, false); - checkHighestInPeriod('2021-10-20T10:00:00', '13:00', '16:01', 3, false); - checkHighestInPeriod('2021-10-20T10:00:00', '13:00', '16:01', 4, false); - checkHighestInPeriod('2021-10-20T10:00:00', '13:00', '16:01', 5, false); - - checkHighestInPeriod('2021-10-20T12:03:00', '13:00', '16:01', 1, false); - checkHighestInPeriod('2021-10-20T12:03:00', '13:00', '16:01', 2, false); - checkHighestInPeriod('2021-10-20T12:03:00', '13:00', '16:01', 3, false); - checkHighestInPeriod('2021-10-20T12:03:00', '13:00', '16:01', 4, false); - checkHighestInPeriod('2021-10-20T12:03:00', '13:00', '16:01', 5, false); - - checkHighestInPeriod('2021-10-20T15:03:00', '13:00', '16:01', 1, false); - checkHighestInPeriod('2021-10-20T15:03:00', '13:00', '16:01', 2, false); - checkHighestInPeriod('2021-10-20T15:03:00', '13:00', '16:01', 3, false); - checkHighestInPeriod('2021-10-20T15:03:00', '13:00', '16:01', 4, true); - checkHighestInPeriod('2021-10-20T15:03:00', '13:00', '16:01', 5, true); - - checkHighestInPeriod('2021-10-20T16:00:00', '13:00', '16:01', 1, false); - checkHighestInPeriod('2021-10-20T16:00:00', '13:00', '16:01', 2, false); - checkHighestInPeriod('2021-10-20T16:00:00', '13:00', '16:01', 3, true); - checkHighestInPeriod('2021-10-20T16:00:00', '13:00', '16:01', 4, true); - checkHighestInPeriod('2021-10-20T16:00:00', '13:00', '16:01', 5, true); - - checkHighestInPeriod('2021-10-20T16:00:10', '13:00', '16:01', 1, false); - checkHighestInPeriod('2021-10-20T16:00:10', '13:00', '16:01', 2, false); - checkHighestInPeriod('2021-10-20T16:00:10', '13:00', '16:01', 3, true); - checkHighestInPeriod('2021-10-20T16:00:10', '13:00', '16:01', 4, true); - checkHighestInPeriod('2021-10-20T16:00:10', '13:00', '16:01', 5, true); - - checkHighestInPeriod('2021-10-20T16:01:10', '13:00', '16:01', 1, false); - checkHighestInPeriod('2021-10-20T16:01:10', '13:00', '16:01', 2, false); - checkHighestInPeriod('2021-10-20T16:01:10', '13:00', '16:01', 3, false); - checkHighestInPeriod('2021-10-20T16:01:10', '13:00', '16:01', 4, false); - checkHighestInPeriod('2021-10-20T16:01:10', '13:00', '16:01', 5, false); - }); - - describe("Current price is among the X hours of highest between 22:00 and 05:00", function () { - checkHighestInPeriod('2021-10-20T20:03:00', '22:00', '05:00', 1, false); - checkHighestInPeriod('2021-10-20T20:03:00', '22:00', '05:00', 2, false); - checkHighestInPeriod('2021-10-20T20:03:00', '22:00', '05:00', 3, false); - checkHighestInPeriod('2021-10-20T20:03:00', '22:00', '05:00', 4, false); - checkHighestInPeriod('2021-10-20T20:03:00', '22:00', '05:00', 5, false); - - checkHighestInPeriod('2021-10-20T22:00:00', '22:00', '05:00', 1, true); - checkHighestInPeriod('2021-10-20T22:00:00', '22:00', '05:00', 2, true); - checkHighestInPeriod('2021-10-20T22:00:00', '22:00', '05:00', 3, true); - checkHighestInPeriod('2021-10-20T22:00:00', '22:00', '05:00', 4, true); - checkHighestInPeriod('2021-10-20T22:00:00', '22:00', '05:00', 5, true); - - checkHighestInPeriod('2021-10-21T00:00:00', '22:00', '05:00', 1, false); - checkHighestInPeriod('2021-10-21T00:00:00', '22:00', '05:00', 2, true); - checkHighestInPeriod('2021-10-21T00:00:00', '22:00', '05:00', 3, true); - checkHighestInPeriod('2021-10-21T00:00:00', '22:00', '05:00', 4, true); - checkHighestInPeriod('2021-10-21T00:00:00', '22:00', '05:00', 5, true); - - checkHighestInPeriod('2021-10-21T01:01:00', '22:00', '05:00', 1, false); - checkHighestInPeriod('2021-10-21T01:01:00', '22:00', '05:00', 2, false); - checkHighestInPeriod('2021-10-21T01:01:00', '22:00', '05:00', 3, false); - checkHighestInPeriod('2021-10-21T01:01:00', '22:00', '05:00', 4, true); - checkHighestInPeriod('2021-10-21T01:01:00', '22:00', '05:00', 5, true); - - checkHighestInPeriod('2021-10-21T03:00:10', '22:00', '05:00', 1, false); - checkHighestInPeriod('2021-10-21T03:00:10', '22:00', '05:00', 2, false); - checkHighestInPeriod('2021-10-21T03:00:10', '22:00', '05:00', 3, false); - checkHighestInPeriod('2021-10-21T03:00:10', '22:00', '05:00', 4, false); - checkHighestInPeriod('2021-10-21T03:00:10', '22:00', '05:00', 5, false); - - checkHighestInPeriod('2021-10-21T05:00:00', '22:00', '05:00', 1, false); - checkHighestInPeriod('2021-10-21T05:00:00', '22:00', '05:00', 2, false); - checkHighestInPeriod('2021-10-21T05:00:00', '22:00', '05:00', 3, false); - checkHighestInPeriod('2021-10-21T05:00:00', '22:00', '05:00', 4, false); - checkHighestInPeriod('2021-10-21T05:00:00', '22:00', '05:00', 5, true); - - checkHighestInPeriod('2021-10-21T05:01:00', '22:00', '05:00', 1, false); - checkHighestInPeriod('2021-10-21T05:01:00', '22:00', '05:00', 2, false); - checkHighestInPeriod('2021-10-21T05:01:00', '22:00', '05:00', 3, false); - checkHighestInPeriod('2021-10-21T05:01:00', '22:00', '05:00', 4, false); - checkHighestInPeriod('2021-10-21T05:01:00', '22:00', '05:00', 5, false); - }); - -}); diff --git a/test/prices_7.js b/test/prices_7.js deleted file mode 100644 index 9748afe..0000000 --- a/test/prices_7.js +++ /dev/null @@ -1,618 +0,0 @@ -const moment = require('../lib/moment-timezone-with-data'); -const expect = require("chai").expect; -const pricesLib = require('../lib/prices'); -const days = require("../lib/days"); - -let _prices = undefined; - -days.setTimeZone('Europe/Oslo'); - -const getPrices = function () { - if (_prices) { - const aDate = moment('2021-10-19T22:00:00.000Z'); - for (let p of _prices) { - expect(p.startsAt.toISOString()).to.equal(aDate.toISOString()); - aDate.add(1, 'hour'); - } - expect(_prices.length).to.equal(50); - return _prices; - } - const prices = [ - { - startsAt: '2021-10-19T22:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.85835 - }, - { - startsAt: '2021-10-19T23:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.64062 - }, - { - startsAt: '2021-10-20T00:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.38904 - }, - { - startsAt: '2021-10-20T01:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.10088 - }, - { - startsAt: '2021-10-20T02:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.1005 - }, - { - startsAt: '2021-10-20T03:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.61679 - }, - { - startsAt: '2021-10-20T04:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.88948 - }, - { - startsAt: '2021-10-20T05:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.9961 - }, - { - startsAt: '2021-10-20T06:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 1.03745 - }, - { - startsAt: '2021-10-20T07:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.98618 - }, - { - startsAt: '2021-10-20T08:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.90777 - }, - { - startsAt: '2021-10-20T09:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.88918 - }, - { - startsAt: '2021-10-20T10:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.88568 - }, - { - startsAt: '2021-10-20T11:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.89152 - }, - { - startsAt: '2021-10-20T12:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.89026 - }, - { - startsAt: '2021-10-20T13:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.88364 - }, - { - startsAt: '2021-10-20T14:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.88666 - }, - { - startsAt: '2021-10-20T15:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.91302 - }, - { - startsAt: '2021-10-20T16:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.9745 - }, - { - startsAt: '2021-10-20T17:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 1.01176 - }, - { - startsAt: '2021-10-20T18:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.91098 - }, - { - startsAt: '2021-10-20T19:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.88568 - }, - { - startsAt: '2021-10-20T20:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.87255 - }, - { - startsAt: '2021-10-20T21:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.78723 - }, - { - startsAt: '2021-10-20T22:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.85835 - }, - { - startsAt: '2021-10-20T23:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.64062 - }, - { - startsAt: '2021-10-21T00:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.38904 - }, - { - startsAt: '2021-10-21T01:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.10088 - }, - { - startsAt: '2021-10-21T02:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.1005 - }, - { - startsAt: '2021-10-21T03:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.61679 - }, - { - startsAt: '2021-10-21T04:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.88948 - }, - { - startsAt: '2021-10-21T05:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.9961 - }, - { - startsAt: '2021-10-21T06:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 1.03745 - }, - { - startsAt: '2021-10-21T07:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.98618 - }, - { - startsAt: '2021-10-21T08:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.90777 - }, - { - startsAt: '2021-10-21T09:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.88918 - }, - { - startsAt: '2021-10-21T10:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.88568 - }, - { - startsAt: '2021-10-21T11:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.89152 - }, - { - startsAt: '2021-10-21T12:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.89026 - }, - { - startsAt: '2021-10-21T13:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.88364 - }, - { - startsAt: '2021-10-21T14:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.88666 - }, - { - startsAt: '2021-10-21T15:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.91302 - }, - { - startsAt: '2021-10-21T16:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.9745 - }, - { - startsAt: '2021-10-21T17:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 1.01176 - }, - { - startsAt: '2021-10-21T18:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.91098 - }, - { - startsAt: '2021-10-21T19:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.88568 - }, - { - startsAt: '2021-10-21T20:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.87255 - }, - { - startsAt: '2021-10-21T21:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.78723 - }, - { - startsAt: '2021-10-21T22:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.85835 - }, - { - startsAt: '2021-10-21T23:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.64062 - } - ]; - const timeZone = moment().tz(); - _prices = prices - .map(p => { - const startsAt = moment.tz(p.startsAt, 'UTC').tz(timeZone); - const time = startsAt.unix(); - const price = p.price; - return { startsAt, time, price }; - }); - return _prices; -}; - -const findSumLowest = function (aDate, start, end, hours, expectedSum) { - it("Lowest sum of " + hours + ' prices starting at ' + aDate, function () { - const prices = getPrices(); - const localTime = moment(aDate); - const { startTs, endTs } = pricesLib.daysPeriod(localTime, start, end); - const sumPrice = pricesLib.checkSumPrices(prices, localTime, startTs, endTs, hours, true); - if (sumPrice) { - expect(sumPrice.price).to.equal(expectedSum); - } else { - expect(expectedSum).eq(undefined); - } - }); -}; - -const findSumHighest = function (aDate, start, end, hours, expectedSum) { - it("Highest sum of " + hours + ' prices starting at ' + aDate, function () { - const prices = getPrices(); - const localTime = moment(aDate); - const { startTs, endTs } = pricesLib.daysPeriod(localTime, start, end); - const sumPrice = pricesLib.checkSumPrices(prices, localTime, startTs, endTs, hours, false); - if (sumPrice) { - expect(sumPrice.price).to.equal(expectedSum); - } else { - expect(expectedSum).eq(undefined); - } - }); -}; - -describe("The following X hours are the cheapest of the day Bergen 20.10.2021", function () { - - before(function () { - days.setTimeZone('Europe/Oslo'); - }); - - describe("The following 2 hours are the cheapest between 00:00 - 00:00 next day", function () { - findSumLowest('2021-10-19T23:59:59', '00:00', '00:00', 2, undefined); - findSumLowest('2021-10-20T00:00:00', '00:00', '00:00', 2, undefined); - findSumLowest('2021-10-20T01:03:00', '00:00', '00:00', 2, undefined); - findSumLowest('2021-10-20T02:10:00', '00:00', '00:00', 2, undefined); - findSumLowest('2021-10-20T02:59:59', '00:00', '00:00', 2, undefined); - findSumLowest('2021-10-20T03:00:00', '00:00', '00:00', 2, 0.20138); - findSumLowest('2021-10-20T03:03:00', '00:00', '00:00', 2, 0.20138); - findSumLowest('2021-10-20T04:03:00', '00:00', '00:00', 2, 0.20138); - findSumLowest('2021-10-20T04:59:59', '00:00', '00:00', 2, 0.20138); - findSumLowest('2021-10-20T05:00:00', '00:00', '00:00', 2, undefined); - findSumLowest('2021-10-20T05:03:00', '00:00', '00:00', 2, undefined); - findSumLowest('2021-10-20T06:03:00', '00:00', '00:00', 2, undefined); - findSumLowest('2021-10-20T07:03:00', '00:00', '00:00', 2, undefined); - findSumLowest('2021-10-20T08:03:00', '00:00', '00:00', 2, undefined); - findSumLowest('2021-10-20T09:03:00', '00:00', '00:00', 2, undefined); - findSumLowest('2021-10-20T10:03:00', '00:00', '00:00', 2, undefined); - findSumLowest('2021-10-20T11:03:00', '00:00', '00:00', 2, undefined); - findSumLowest('2021-10-20T12:03:00', '00:00', '00:00', 2, undefined); - findSumLowest('2021-10-20T13:03:00', '00:00', '00:00', 2, undefined); - findSumLowest('2021-10-20T14:03:00', '00:00', '00:00', 2, undefined); - findSumLowest('2021-10-20T15:03:00', '00:00', '00:00', 2, undefined); - findSumLowest('2021-10-20T16:03:00', '00:00', '00:00', 2, undefined); - findSumLowest('2021-10-20T17:03:00', '00:00', '00:00', 2, undefined); - findSumLowest('2021-10-20T18:03:00', '00:00', '00:00', 2, undefined); - findSumLowest('2021-10-20T19:03:00', '00:00', '00:00', 2, undefined); - findSumLowest('2021-10-20T20:03:00', '00:00', '00:00', 2, undefined); - findSumLowest('2021-10-20T21:03:00', '00:00', '00:00', 2, undefined); - findSumLowest('2021-10-20T22:03:00', '00:00', '00:00', 2, undefined); - findSumLowest('2021-10-20T23:03:00', '00:00', '00:00', 2, undefined); - }); - - describe("The following 4 hours are the cheapest between 00:00 - 00:00 next day", function () { - findSumLowest('2021-10-20T00:00:00', '00:00', '00:00', 4, undefined); - findSumLowest('2021-10-20T01:03:00', '00:00', '00:00', 4, undefined); - findSumLowest('2021-10-20T01:59:59', '00:00', '00:00', 4, undefined); - findSumLowest('2021-10-20T02:00:00', '00:00', '00:00', 4, 1.20721); - findSumLowest('2021-10-20T02:10:00', '00:00', '00:00', 4, 1.20721); - findSumLowest('2021-10-20T03:03:00', '00:00', '00:00', 4, 1.20721); - findSumLowest('2021-10-20T04:03:00', '00:00', '00:00', 4, 1.20721); - findSumLowest('2021-10-20T05:03:00', '00:00', '00:00', 4, 1.20721); - findSumLowest('2021-10-20T05:59:59', '00:00', '00:00', 4, 1.20721); - findSumLowest('2021-10-20T06:00:00', '00:00', '00:00', 4, undefined); - findSumLowest('2021-10-20T06:03:00', '00:00', '00:00', 4, undefined); - findSumLowest('2021-10-20T07:03:00', '00:00', '00:00', 4, undefined); - findSumLowest('2021-10-20T08:03:00', '00:00', '00:00', 4, undefined); - findSumLowest('2021-10-20T09:03:00', '00:00', '00:00', 4, undefined); - findSumLowest('2021-10-20T10:03:00', '00:00', '00:00', 4, undefined); - findSumLowest('2021-10-20T11:03:00', '00:00', '00:00', 4, undefined); - findSumLowest('2021-10-20T12:03:00', '00:00', '00:00', 4, undefined); - findSumLowest('2021-10-20T13:03:00', '00:00', '00:00', 4, undefined); - findSumLowest('2021-10-20T14:03:00', '00:00', '00:00', 4, undefined); - findSumLowest('2021-10-20T15:03:00', '00:00', '00:00', 4, undefined); - findSumLowest('2021-10-20T16:03:00', '00:00', '00:00', 4, undefined); - findSumLowest('2021-10-20T17:03:00', '00:00', '00:00', 4, undefined); - findSumLowest('2021-10-20T18:03:00', '00:00', '00:00', 4, undefined); - findSumLowest('2021-10-20T19:03:00', '00:00', '00:00', 4, undefined); - findSumLowest('2021-10-20T20:03:00', '00:00', '00:00', 4, undefined); - findSumLowest('2021-10-20T21:03:00', '00:00', '00:00', 4, undefined); - findSumLowest('2021-10-20T22:03:00', '00:00', '00:00', 4, undefined); - findSumLowest('2021-10-20T23:03:00', '00:00', '00:00', 4, undefined); - }); - - describe("The following 6 hours are the cheapest between 00:00 - 00:00 next day", function () { - findSumLowest('2021-10-19T23:59:59', '00:00', '00:00', 6, undefined); - findSumLowest('2021-10-20T00:00:00', '00:00', '00:00', 6, 2.70618); - findSumLowest('2021-10-20T01:03:00', '00:00', '00:00', 6, 2.70618); - findSumLowest('2021-10-20T02:10:00', '00:00', '00:00', 6, 2.70618); - findSumLowest('2021-10-20T03:03:00', '00:00', '00:00', 6, 2.70618); - findSumLowest('2021-10-20T04:03:00', '00:00', '00:00', 6, 2.70618); - findSumLowest('2021-10-20T05:03:00', '00:00', '00:00', 6, 2.70618); - findSumLowest('2021-10-20T05:59:59', '00:00', '00:00', 6, 2.70618); - findSumLowest('2021-10-20T06:00:00', '00:00', '00:00', 6, undefined); - findSumLowest('2021-10-20T06:03:00', '00:00', '00:00', 6, undefined); - findSumLowest('2021-10-20T07:03:00', '00:00', '00:00', 6, undefined); - findSumLowest('2021-10-20T08:03:00', '00:00', '00:00', 6, undefined); - findSumLowest('2021-10-20T09:03:00', '00:00', '00:00', 6, undefined); - findSumLowest('2021-10-20T10:03:00', '00:00', '00:00', 6, undefined); - findSumLowest('2021-10-20T11:03:00', '00:00', '00:00', 6, undefined); - findSumLowest('2021-10-20T12:03:00', '00:00', '00:00', 6, undefined); - findSumLowest('2021-10-20T13:03:00', '00:00', '00:00', 6, undefined); - findSumLowest('2021-10-20T14:03:00', '00:00', '00:00', 6, undefined); - findSumLowest('2021-10-20T15:03:00', '00:00', '00:00', 6, undefined); - findSumLowest('2021-10-20T16:03:00', '00:00', '00:00', 6, undefined); - findSumLowest('2021-10-20T17:03:00', '00:00', '00:00', 6, undefined); - findSumLowest('2021-10-20T18:03:00', '00:00', '00:00', 6, undefined); - findSumLowest('2021-10-20T19:03:00', '00:00', '00:00', 6, undefined); - findSumLowest('2021-10-20T20:03:00', '00:00', '00:00', 6, undefined); - findSumLowest('2021-10-20T21:03:00', '00:00', '00:00', 6, undefined); - findSumLowest('2021-10-20T22:03:00', '00:00', '00:00', 6, undefined); - findSumLowest('2021-10-20T23:03:00', '00:00', '00:00', 6, undefined); - }); - - describe("The following 6 hours are the cheapest between 01:00 - 20:00", function () { - findSumLowest('2021-10-19T23:59:59', '01:00', '20:00', 6, undefined); - findSumLowest('2021-10-20T00:00:00', '01:00', '20:00', 6, undefined); - findSumLowest('2021-10-20T01:00:00', '01:00', '20:00', 6, 2.73731); - findSumLowest('2021-10-20T01:03:00', '01:00', '20:00', 6, 2.73731); - findSumLowest('2021-10-20T02:10:00', '01:00', '20:00', 6, 2.73731); - findSumLowest('2021-10-20T03:03:00', '01:00', '20:00', 6, 2.73731); - findSumLowest('2021-10-20T04:03:00', '01:00', '20:00', 6, 2.73731); - findSumLowest('2021-10-20T05:03:00', '01:00', '20:00', 6, 2.73731); - findSumLowest('2021-10-20T05:59:59', '01:00', '20:00', 6, 2.73731); - findSumLowest('2021-10-20T06:00:00', '01:00', '20:00', 6, 2.73731); - findSumLowest('2021-10-20T06:03:00', '01:00', '20:00', 6, 2.73731); - findSumLowest('2021-10-20T06:59:59', '01:00', '20:00', 6, 2.73731); - findSumLowest('2021-10-20T07:03:00', '01:00', '20:00', 6, undefined); - findSumLowest('2021-10-20T08:03:00', '01:00', '20:00', 6, undefined); - findSumLowest('2021-10-20T09:03:00', '01:00', '20:00', 6, undefined); - findSumLowest('2021-10-20T10:03:00', '01:00', '20:00', 6, undefined); - findSumLowest('2021-10-20T11:03:00', '01:00', '20:00', 6, undefined); - findSumLowest('2021-10-20T12:03:00', '01:00', '20:00', 6, undefined); - findSumLowest('2021-10-20T13:03:00', '01:00', '20:00', 6, undefined); - findSumLowest('2021-10-20T14:03:00', '01:00', '20:00', 6, undefined); - findSumLowest('2021-10-20T15:03:00', '01:00', '20:00', 6, undefined); - findSumLowest('2021-10-20T16:03:00', '01:00', '20:00', 6, undefined); - findSumLowest('2021-10-20T17:03:00', '01:00', '20:00', 6, undefined); - findSumLowest('2021-10-20T18:03:00', '01:00', '20:00', 6, undefined); - findSumLowest('2021-10-20T19:03:00', '01:00', '20:00', 6, undefined); - findSumLowest('2021-10-20T20:03:00', '01:00', '20:00', 6, undefined); - findSumLowest('2021-10-20T21:03:00', '01:00', '20:00', 6, undefined); - findSumLowest('2021-10-20T22:03:00', '01:00', '20:00', 6, undefined); - findSumLowest('2021-10-20T23:03:00', '01:00', '20:00', 6, undefined); - }); - - describe("The following 2 hours are the most expensive between 00:00 - 00:00 next day", function () { - findSumHighest('2021-10-20T00:00:00', '00:00', '00:00', 2, undefined); - findSumHighest('2021-10-20T01:03:00', '00:00', '00:00', 2, undefined); - findSumHighest('2021-10-20T02:10:00', '00:00', '00:00', 2, undefined); - findSumHighest('2021-10-20T03:03:00', '00:00', '00:00', 2, undefined); - findSumHighest('2021-10-20T04:03:00', '00:00', '00:00', 2, undefined); - findSumHighest('2021-10-20T05:03:00', '00:00', '00:00', 2, undefined); - findSumHighest('2021-10-20T06:03:00', '00:00', '00:00', 2, undefined); - findSumHighest('2021-10-20T06:59:59', '00:00', '00:00', 2, undefined); - findSumHighest('2021-10-20T07:00:00', '00:00', '00:00', 2, 2.03355); - findSumHighest('2021-10-20T07:03:00', '00:00', '00:00', 2, 2.03355); - findSumHighest('2021-10-20T08:03:00', '00:00', '00:00', 2, 2.03355); - findSumHighest('2021-10-20T08:59:59', '00:00', '00:00', 2, 2.03355); - findSumHighest('2021-10-20T09:00:00', '00:00', '00:00', 2, undefined); - findSumHighest('2021-10-20T09:03:00', '00:00', '00:00', 2, undefined); - findSumHighest('2021-10-20T10:03:00', '00:00', '00:00', 2, undefined); - findSumHighest('2021-10-20T11:03:00', '00:00', '00:00', 2, undefined); - findSumHighest('2021-10-20T12:03:00', '00:00', '00:00', 2, undefined); - findSumHighest('2021-10-20T13:03:00', '00:00', '00:00', 2, undefined); - findSumHighest('2021-10-20T14:03:00', '00:00', '00:00', 2, undefined); - findSumHighest('2021-10-20T15:03:00', '00:00', '00:00', 2, undefined); - findSumHighest('2021-10-20T16:03:00', '00:00', '00:00', 2, undefined); - findSumHighest('2021-10-20T17:03:00', '00:00', '00:00', 2, undefined); - findSumHighest('2021-10-20T18:03:00', '00:00', '00:00', 2, undefined); - findSumHighest('2021-10-20T19:03:00', '00:00', '00:00', 2, undefined); - findSumHighest('2021-10-20T20:03:00', '00:00', '00:00', 2, undefined); - findSumHighest('2021-10-20T21:03:00', '00:00', '00:00', 2, undefined); - findSumHighest('2021-10-20T22:03:00', '00:00', '00:00', 2, undefined); - findSumHighest('2021-10-20T23:03:00', '00:00', '00:00', 2, undefined); - }); - - describe("The following 4 hours are the most expensive between 00:00 - 00:00 next day", function () { - findSumHighest('2021-10-20T00:00:00', '00:00', '00:00', 4, undefined); - findSumHighest('2021-10-20T01:03:00', '00:00', '00:00', 4, undefined); - findSumHighest('2021-10-20T02:10:00', '00:00', '00:00', 4, undefined); - findSumHighest('2021-10-20T03:03:00', '00:00', '00:00', 4, undefined); - findSumHighest('2021-10-20T04:03:00', '00:00', '00:00', 4, undefined); - findSumHighest('2021-10-20T05:03:00', '00:00', '00:00', 4, undefined); - findSumHighest('2021-10-20T06:03:00', '00:00', '00:00', 4, undefined); - findSumHighest('2021-10-20T06:59:59', '00:00', '00:00', 4, undefined); - findSumHighest('2021-10-20T07:00:00', '00:00', '00:00', 4, 3.9275); - findSumHighest('2021-10-20T07:03:00', '00:00', '00:00', 4, 3.9275); - findSumHighest('2021-10-20T08:03:00', '00:00', '00:00', 4, 3.9275); - findSumHighest('2021-10-20T09:03:00', '00:00', '00:00', 4, 3.9275); - findSumHighest('2021-10-20T10:03:00', '00:00', '00:00', 4, 3.9275); - findSumHighest('2021-10-20T10:59:58', '00:00', '00:00', 4, 3.9275); - findSumHighest('2021-10-20T11:03:00', '00:00', '00:00', 4, undefined); - findSumHighest('2021-10-20T12:03:00', '00:00', '00:00', 4, undefined); - findSumHighest('2021-10-20T13:03:00', '00:00', '00:00', 4, undefined); - findSumHighest('2021-10-20T14:03:00', '00:00', '00:00', 4, undefined); - findSumHighest('2021-10-20T15:03:00', '00:00', '00:00', 4, undefined); - findSumHighest('2021-10-20T16:03:00', '00:00', '00:00', 4, undefined); - findSumHighest('2021-10-20T17:03:00', '00:00', '00:00', 4, undefined); - findSumHighest('2021-10-20T18:03:00', '00:00', '00:00', 4, undefined); - findSumHighest('2021-10-20T19:03:00', '00:00', '00:00', 4, undefined); - findSumHighest('2021-10-20T20:03:00', '00:00', '00:00', 4, undefined); - findSumHighest('2021-10-20T21:03:00', '00:00', '00:00', 4, undefined); - findSumHighest('2021-10-20T22:03:00', '00:00', '00:00', 4, undefined); - findSumHighest('2021-10-20T23:03:00', '00:00', '00:00', 4, undefined); - }); - - describe("The following 6 hours are the most expensive between 00:00 - 00:00 next day", function () { - findSumHighest('2021-10-20T00:00:00', '00:00', '00:00', 6, undefined); - findSumHighest('2021-10-20T01:03:00', '00:00', '00:00', 6, undefined); - findSumHighest('2021-10-20T02:10:00', '00:00', '00:00', 6, undefined); - findSumHighest('2021-10-20T03:03:00', '00:00', '00:00', 6, undefined); - findSumHighest('2021-10-20T04:03:00', '00:00', '00:00', 6, undefined); - findSumHighest('2021-10-20T05:03:00', '00:00', '00:00', 6, undefined); - findSumHighest('2021-10-20T05:59:59', '00:00', '00:00', 6, undefined); - findSumHighest('2021-10-20T06:00:00', '00:00', '00:00', 6, 5.70616); - findSumHighest('2021-10-20T06:03:00', '00:00', '00:00', 6, 5.70616); - findSumHighest('2021-10-20T07:03:00', '00:00', '00:00', 6, 5.70616); - findSumHighest('2021-10-20T08:03:00', '00:00', '00:00', 6, 5.70616); - findSumHighest('2021-10-20T09:03:00', '00:00', '00:00', 6, 5.70616); - findSumHighest('2021-10-20T10:03:00', '00:00', '00:00', 6, 5.70616); - findSumHighest('2021-10-20T11:03:00', '00:00', '00:00', 6, 5.70616); - findSumHighest('2021-10-20T11:59:59', '00:00', '00:00', 6, 5.70616); - findSumHighest('2021-10-20T12:03:00', '00:00', '00:00', 6, undefined); - findSumHighest('2021-10-20T13:03:00', '00:00', '00:00', 6, undefined); - findSumHighest('2021-10-20T14:03:00', '00:00', '00:00', 6, undefined); - findSumHighest('2021-10-20T15:03:00', '00:00', '00:00', 6, undefined); - findSumHighest('2021-10-20T16:03:00', '00:00', '00:00', 6, undefined); - findSumHighest('2021-10-20T17:03:00', '00:00', '00:00', 6, undefined); - findSumHighest('2021-10-20T18:03:00', '00:00', '00:00', 6, undefined); - findSumHighest('2021-10-20T19:03:00', '00:00', '00:00', 6, undefined); - findSumHighest('2021-10-20T20:03:00', '00:00', '00:00', 6, undefined); - findSumHighest('2021-10-20T21:03:00', '00:00', '00:00', 6, undefined); - findSumHighest('2021-10-20T22:03:00', '00:00', '00:00', 6, undefined); - findSumHighest('2021-10-20T23:03:00', '00:00', '00:00', 6, undefined); - }); - - describe("The following 6 hours are the most expensive between 08:00 - 16:00", function () { - findSumHighest('2021-10-20T00:00:00', '08:00', '16:00', 6, undefined); - findSumHighest('2021-10-20T01:03:00', '08:00', '16:00', 6, undefined); - findSumHighest('2021-10-20T02:10:00', '08:00', '16:00', 6, undefined); - findSumHighest('2021-10-20T03:03:00', '08:00', '16:00', 6, undefined); - findSumHighest('2021-10-20T04:03:00', '08:00', '16:00', 6, undefined); - findSumHighest('2021-10-20T05:03:00', '08:00', '16:00', 6, undefined); - findSumHighest('2021-10-20T05:59:59', '08:00', '16:00', 6, undefined); - findSumHighest('2021-10-20T06:00:00', '08:00', '16:00', 6, undefined); - findSumHighest('2021-10-20T06:03:00', '08:00', '16:00', 6, undefined); - findSumHighest('2021-10-20T07:03:00', '08:00', '16:00', 6, undefined); - findSumHighest('2021-10-20T07:59:59', '08:00', '16:00', 6, undefined); - findSumHighest('2021-10-20T08:00:00', '08:00', '16:00', 6, 5.59778); - findSumHighest('2021-10-20T08:03:00', '08:00', '16:00', 6, 5.59778); - findSumHighest('2021-10-20T09:03:00', '08:00', '16:00', 6, 5.59778); - findSumHighest('2021-10-20T10:03:00', '08:00', '16:00', 6, 5.59778); - findSumHighest('2021-10-20T11:03:00', '08:00', '16:00', 6, 5.59778); - findSumHighest('2021-10-20T11:59:59', '08:00', '16:00', 6, 5.59778); - findSumHighest('2021-10-20T12:03:00', '08:00', '16:00', 6, 5.59778); - findSumHighest('2021-10-20T13:03:00', '08:00', '16:00', 6, 5.59778); - findSumHighest('2021-10-20T13:59:59', '08:00', '16:00', 6, 5.59778); - findSumHighest('2021-10-20T14:00:00', '08:00', '16:00', 6, undefined); - findSumHighest('2021-10-20T14:03:00', '08:00', '16:00', 6, undefined); - findSumHighest('2021-10-20T15:03:00', '08:00', '16:00', 6, undefined); - findSumHighest('2021-10-20T16:03:00', '08:00', '16:00', 6, undefined); - findSumHighest('2021-10-20T17:03:00', '08:00', '16:00', 6, undefined); - findSumHighest('2021-10-20T18:03:00', '08:00', '16:00', 6, undefined); - findSumHighest('2021-10-20T19:03:00', '08:00', '16:00', 6, undefined); - findSumHighest('2021-10-20T20:03:00', '08:00', '16:00', 6, undefined); - findSumHighest('2021-10-20T21:03:00', '08:00', '16:00', 6, undefined); - findSumHighest('2021-10-20T22:03:00', '08:00', '16:00', 6, undefined); - findSumHighest('2021-10-20T23:03:00', '08:00', '16:00', 6, undefined); - }); - -}); - diff --git a/test/prices_8.js b/test/prices_8.js deleted file mode 100644 index c264305..0000000 --- a/test/prices_8.js +++ /dev/null @@ -1,384 +0,0 @@ -const moment = require('../lib/moment-timezone-with-data'); -const expect = require("chai").expect; -const pricesLib = require('../lib/prices'); -const days = require("../lib/days"); - -let _prices = undefined; - -days.setTimeZone('Europe/Oslo'); - -const getPrices = function () { - if (_prices) { - const aDate = moment('2021-10-19T22:00:00.000Z'); - for (let p of _prices) { - expect(p.startsAt.toISOString()).to.equal(aDate.toISOString()); - aDate.add(1, 'hour'); - } - expect(_prices.length).to.equal(50); - return _prices; - } - const prices = [ - { - startsAt: '2021-10-19T22:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.85835 - }, - { - startsAt: '2021-10-19T23:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.64062 - }, - { - startsAt: '2021-10-20T00:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.38904 - }, - { - startsAt: '2021-10-20T01:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.10088 - }, - { - startsAt: '2021-10-20T02:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.1005 - }, - { - startsAt: '2021-10-20T03:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.61679 - }, - { - startsAt: '2021-10-20T04:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.88948 - }, - { - startsAt: '2021-10-20T05:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.9961 - }, - { - startsAt: '2021-10-20T06:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 1.03745 - }, - { - startsAt: '2021-10-20T07:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.98618 - }, - { - startsAt: '2021-10-20T08:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.90777 - }, - { - startsAt: '2021-10-20T09:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.88918 - }, - { - startsAt: '2021-10-20T10:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.88568 - }, - { - startsAt: '2021-10-20T11:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.89152 - }, - { - startsAt: '2021-10-20T12:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.89026 - }, - { - startsAt: '2021-10-20T13:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.88364 - }, - { - startsAt: '2021-10-20T14:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.88666 - }, - { - startsAt: '2021-10-20T15:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.91302 - }, - { - startsAt: '2021-10-20T16:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.9745 - }, - { - startsAt: '2021-10-20T17:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 1.01176 - }, - { - startsAt: '2021-10-20T18:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.91098 - }, - { - startsAt: '2021-10-20T19:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.88568 - }, - { - startsAt: '2021-10-20T20:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.87255 - }, - { - startsAt: '2021-10-20T21:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.78723 - }, - { - startsAt: '2021-10-20T22:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.85835 - }, - { - startsAt: '2021-10-20T23:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.64062 - }, - { - startsAt: '2021-10-21T00:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.38904 - }, - { - startsAt: '2021-10-21T01:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.10088 - }, - { - startsAt: '2021-10-21T02:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.1005 - }, - { - startsAt: '2021-10-21T03:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.61679 - }, - { - startsAt: '2021-10-21T04:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.88948 - }, - { - startsAt: '2021-10-21T05:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.9961 - }, - { - startsAt: '2021-10-21T06:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 1.03745 - }, - { - startsAt: '2021-10-21T07:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.98618 - }, - { - startsAt: '2021-10-21T08:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.90777 - }, - { - startsAt: '2021-10-21T09:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.88918 - }, - { - startsAt: '2021-10-21T10:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.88568 - }, - { - startsAt: '2021-10-21T11:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.89152 - }, - { - startsAt: '2021-10-21T12:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.89026 - }, - { - startsAt: '2021-10-21T13:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.88364 - }, - { - startsAt: '2021-10-21T14:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.88666 - }, - { - startsAt: '2021-10-21T15:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.91302 - }, - { - startsAt: '2021-10-21T16:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.9745 - }, - { - startsAt: '2021-10-21T17:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 1.01176 - }, - { - startsAt: '2021-10-21T18:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.91098 - }, - { - startsAt: '2021-10-21T19:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.88568 - }, - { - startsAt: '2021-10-21T20:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.87255 - }, - { - startsAt: '2021-10-21T21:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.78723 - }, - { - startsAt: '2021-10-21T22:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.85835 - }, - { - startsAt: '2021-10-21T23:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.64062 - } - ]; - const timeZone = moment().tz(); - _prices = prices - .map(p => { - const startsAt = moment.tz(p.startsAt, 'UTC').tz(timeZone); - const time = startsAt.unix(); - const price = p.price; - return { startsAt, time, price }; - }); - return _prices; -}; - -const checkDiffPercentage = function (aDate, expectedPct) { - it(`"Price difference at ${aDate} expected to be ${expectedPct}`, function () { - const prices = getPrices(); - const diffCheck = pricesLib.priceHighLow(prices, aDate); - //console.log(aDate, ', expected: ', expectedPct, ', was: ', diffCheck); - if (diffCheck) { - expect(diffCheck.diffPercentage).to.be.closeTo(expectedPct, 0.000001); - } else { - expect(expectedPct).eq(undefined); - } - }); -}; - -describe("Price difference between high and low is less than X percent on 20.10.2021", function () { - - before(function () { - days.setTimeZone('Europe/Oslo'); - }); - - describe("Price difference between high and low is less than X percent on 20.10.2021", function () { - checkDiffPercentage('2021-10-20T01:00:00+02:00', 100 * (1.03745 - 0.1005) / 0.1005); - checkDiffPercentage('2021-10-21T01:00:00+02:00', 100 * (1.03745 - 0.1005) / 0.1005); - }); - -}); - -const checkDiffAmount = function (aDate, expectedAmount) { - it(`"Price difference at ${aDate} expected to be ${expectedAmount}`, function () { - const prices = getPrices(); - const diffCheck = pricesLib.priceHighLow(prices, aDate); - //console.log(aDate, ', expected: ', expectedAmount, ', was: ', diffCheck); - if (diffCheck) { - expect(diffCheck.diffAmount).to.be.closeTo(expectedAmount, 0.000001); - } else { - expect(expectedAmount).eq(undefined); - } - }); -}; - -describe("Price difference between high and low is less than X on 20.10.2021", function () { - - before(function () { - days.setTimeZone('Europe/Oslo'); - }); - - describe("Price difference between high and low is less than X on 20.10.2021", function () { - checkDiffAmount('2021-10-20T01:00:00+02:00', 1.03745 - 0.1005); - checkDiffAmount('2021-10-21T01:00:00+02:00', 1.03745 - 0.1005); - }); - -}); - diff --git a/test/prices_9.js b/test/prices_9.js deleted file mode 100644 index 7bca619..0000000 --- a/test/prices_9.js +++ /dev/null @@ -1,373 +0,0 @@ -const moment = require('../lib/moment-timezone-with-data'); -const expect = require("chai").expect; -const pricesLib = require('../lib/prices'); -const days = require("../lib/days"); - -let _prices = undefined; - -days.setTimeZone('Europe/Oslo'); - -const getPrices = function () { - if (_prices) { - const aDate = moment('2021-10-19T22:00:00.000Z'); - for (let p of _prices) { - expect(p.startsAt.toISOString()).to.equal(aDate.toISOString()); - aDate.add(1, 'hour'); - } - expect(_prices.length).to.equal(50); - return _prices; - } - const prices = [ - { - startsAt: '2021-10-19T22:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.85835 - }, - { - startsAt: '2021-10-19T23:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.64062 - }, - { - startsAt: '2021-10-20T00:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.38904 - }, - { - startsAt: '2021-10-20T01:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.10088 - }, - { - startsAt: '2021-10-20T02:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.1005 - }, - { - startsAt: '2021-10-20T03:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.61679 - }, - { - startsAt: '2021-10-20T04:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.88948 - }, - { - startsAt: '2021-10-20T05:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.9961 - }, - { - startsAt: '2021-10-20T06:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 1.03745 - }, - { - startsAt: '2021-10-20T07:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.98618 - }, - { - startsAt: '2021-10-20T08:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.90777 - }, - { - startsAt: '2021-10-20T09:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.88918 - }, - { - startsAt: '2021-10-20T10:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.88568 - }, - { - startsAt: '2021-10-20T11:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.89152 - }, - { - startsAt: '2021-10-20T12:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.89026 - }, - { - startsAt: '2021-10-20T13:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.88364 - }, - { - startsAt: '2021-10-20T14:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.88666 - }, - { - startsAt: '2021-10-20T15:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.91302 - }, - { - startsAt: '2021-10-20T16:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.9745 - }, - { - startsAt: '2021-10-20T17:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 1.01176 - }, - { - startsAt: '2021-10-20T18:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.91098 - }, - { - startsAt: '2021-10-20T19:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.88568 - }, - { - startsAt: '2021-10-20T20:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.87255 - }, - { - startsAt: '2021-10-20T21:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.78723 - }, - { - startsAt: '2021-10-20T22:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.85835 - }, - { - startsAt: '2021-10-20T23:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.64062 - }, - { - startsAt: '2021-10-21T00:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.38904 - }, - { - startsAt: '2021-10-21T01:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.10088 - }, - { - startsAt: '2021-10-21T02:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.1005 - }, - { - startsAt: '2021-10-21T03:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.61679 - }, - { - startsAt: '2021-10-21T04:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.88948 - }, - { - startsAt: '2021-10-21T05:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.9961 - }, - { - startsAt: '2021-10-21T06:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 1.03745 - }, - { - startsAt: '2021-10-21T07:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.98618 - }, - { - startsAt: '2021-10-21T08:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.90777 - }, - { - startsAt: '2021-10-21T09:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.88918 - }, - { - startsAt: '2021-10-21T10:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.88568 - }, - { - startsAt: '2021-10-21T11:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.89152 - }, - { - startsAt: '2021-10-21T12:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.89026 - }, - { - startsAt: '2021-10-21T13:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.88364 - }, - { - startsAt: '2021-10-21T14:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.88666 - }, - { - startsAt: '2021-10-21T15:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.91302 - }, - { - startsAt: '2021-10-21T16:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.9745 - }, - { - startsAt: '2021-10-21T17:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 1.01176 - }, - { - startsAt: '2021-10-21T18:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.91098 - }, - { - startsAt: '2021-10-21T19:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.88568 - }, - { - startsAt: '2021-10-21T20:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.87255 - }, - { - startsAt: '2021-10-21T21:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.78723 - }, - { - startsAt: '2021-10-21T22:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.85835 - }, - { - startsAt: '2021-10-21T23:00:00.000Z', - priceArea: 'Bergen', - currency: 'Bergen', - price: 0.64062 - } - ]; - const timeZone = moment().tz(); - _prices = prices - .map(p => { - const startsAt = moment.tz(p.startsAt, 'UTC').tz(timeZone); - const time = startsAt.unix(); - const price = p.price; - return { startsAt, time, price }; - }); - return _prices; -}; - -const checkCurrentPriceLowerThanNext = function (aDate, numHours, expectedLower) { - it(`Current price at ${aDate} ${expectedLower ? 'is' : 'is not'} expected to be lower than next ${numHours} hours`, function () { - const prices = getPrices(); - const isLower = pricesLib.currentPriceLowerThanNext(prices, aDate, numHours); - expect(isLower).eq(expectedLower); - }); -}; - -const checkCurrentPriceHigherThanNext = function (aDate, numHours, expectedHigher) { - it(`Current price at ${aDate} ${expectedHigher ? 'is' : 'is not'} expected to be higher than next ${numHours} hours`, function () { - const prices = getPrices(); - const isLower = pricesLib.currentPriceHigherThanNext(prices, aDate, numHours); - expect(isLower).eq(expectedHigher); - }); -}; - -describe("Current price at 20.10.2021", function () { - - before(function () { - days.setTimeZone('Europe/Oslo'); - }); - - describe("Current price lower at 20.10.2021T12", function () { - checkCurrentPriceLowerThanNext('2021-10-20T12:00:00+02:00', 1, true); - checkCurrentPriceLowerThanNext('2021-10-20T12:00:00+02:00', 2, true); - checkCurrentPriceLowerThanNext('2021-10-20T12:00:00+02:00', 3, false); - checkCurrentPriceLowerThanNext('2021-10-20T12:00:00+02:00', 4, false); - checkCurrentPriceLowerThanNext('2021-10-20T12:00:00+02:00', 5, false); - checkCurrentPriceLowerThanNext('2021-10-20T12:00:00+02:00', 6, false); - }); - - describe("Current price higher at 20.10.2021T14", function () { - checkCurrentPriceHigherThanNext('2021-10-20T14:00:00+02:00', 1, true); - checkCurrentPriceHigherThanNext('2021-10-20T14:00:00+02:00', 2, true); - checkCurrentPriceHigherThanNext('2021-10-20T14:00:00+02:00', 3, false); - checkCurrentPriceHigherThanNext('2021-10-20T14:00:00+02:00', 4, false); - checkCurrentPriceHigherThanNext('2021-10-20T14:00:00+02:00', 5, false); - checkCurrentPriceHigherThanNext('2021-10-20T14:00:00+02:00', 6, false); - }); - -}); diff --git a/test2/nordpool_test.js b/test2/nordpool_test.js index bb46408..8c7cf83 100644 --- a/test2/nordpool_test.js +++ b/test2/nordpool_test.js @@ -1,14 +1,15 @@ 'use strict'; -const moment = require('../lib/moment-timezone-with-data'); -const days = require('../lib/days'); +import moment from 'moment-timezone'; + const nordpool = require('../lib/nordpool'); const heating = require('../lib/heating'); -const pricesLib = require('../lib/prices'); +import { PriceApi } from '@balmli/homey-utility-prices'; +const pricesLib = new PriceApi(); const testNordpool = async function ({ priceArea, currency, country, timeZone, date }) { try { - days.setTimeZone(timeZone); + moment.tz.setDefault(timeZone); const localTime = (date ? moment(date) : moment()).startOf('day'); const atHome = true; @@ -41,12 +42,12 @@ const testNordpool = async function ({ priceArea, currency, country, timeZone, d .map(p => { p.heating = heating.calcHeating(p.startsAt, atHome, homeOverride, heatingOptions); p.lowPrice22Hours = pricesLib.checkLowPrice(pricesNextHours, 22, p.startsAt).length === 1; - p.highPrice6Hours = pricesLib.checkHighPrice2(pricesNextHours, 6, p.startsAt, state).length === 1; + p.highPrice6Hours = heating.checkHighPrice2(pricesNextHours, 6, p.startsAt, state).length === 1; return p; }); console.log('pricesNextHours:', pricesNextHours.length, pricesNextHours); - const heatingOffWithHighPrices = pricesLib.checkHighPrice2(pricesNextHours, 6, localTime, state, false); + const heatingOffWithHighPrices = heating.checkHighPrice2(pricesNextHours, 6, localTime, state, false); console.log('heatingOffWithHighPrices:', heatingOffWithHighPrices.length, heatingOffWithHighPrices); } catch (err) { diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..33801f7 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,12 @@ +{ + "extends": "@tsconfig/node12/tsconfig.json", + "compilerOptions": { + "allowJs": true, + "outDir": "build/", + "paths": { + "@balmli/homey-utility-prices": [ + "../node-homey-utility-prices" + ] + } + } +} \ No newline at end of file