#!/user/bin/env python
# -*- coding: utf-8 -*-
"""
Copyright (C) 2024 Galaxy Technologies
Licensed under the Apache License, Version 2.0
"""

import datetime
from enum import Enum
from .timeutils import Calendar


class Holiday(Enum):
    """中国内地法定节假日枚举类"""

    def __new__(cls, english, chinese, days):
        """重写__new__方法，使枚举类的实例可以存储中文名和假期天数
        Args:
            english: 节假日英文名
            chinese: 节假日中文名
            days: 节假日天数
        """
        obj = object.__new__(cls)
        obj._value_ = english

        obj.chinese = chinese
        obj.days = days
        return obj

    new_years_day = "New Year's Day", "元旦", 1
    spring_festival = "Spring Festival", "春节", 3
    tomb_sweeping_day = "Tomb-sweeping Day", "清明", 1
    labour_day = "Labour Day", "劳动节", 1
    dragon_boat_festival = "Dragon Boat Festival", "端午", 1
    national_day = "National Day", "国庆节", 3
    mid_autumn_festival = "Mid-autumn Festival", "中秋", 1

    # special holidays
    anti_fascist_70th_day = "Anti-Fascist 70th Day", "中国人民抗日战争暨世界反法西斯战争胜利70周年纪念日", 1


class ChineseCalendar(Calendar):
    """中国内地交易日历类"""
    holidays_dict = {
        datetime.date(year=2004, month=1, day=1): Holiday.new_years_day.value,
        datetime.date(year=2004, month=1, day=22): Holiday.spring_festival.value,
        datetime.date(year=2004, month=1, day=23): Holiday.spring_festival.value,
        datetime.date(year=2004, month=1, day=24): Holiday.spring_festival.value,
        datetime.date(year=2004, month=1, day=25): Holiday.spring_festival.value,
        datetime.date(year=2004, month=1, day=26): Holiday.spring_festival.value,
        datetime.date(year=2004, month=1, day=27): Holiday.spring_festival.value,
        datetime.date(year=2004, month=1, day=28): Holiday.spring_festival.value,
        datetime.date(year=2004, month=5, day=1): Holiday.labour_day.value,
        datetime.date(year=2004, month=5, day=2): Holiday.labour_day.value,
        datetime.date(year=2004, month=5, day=3): Holiday.labour_day.value,
        datetime.date(year=2004, month=5, day=4): Holiday.labour_day.value,
        datetime.date(year=2004, month=5, day=5): Holiday.labour_day.value,
        datetime.date(year=2004, month=5, day=6): Holiday.labour_day.value,
        datetime.date(year=2004, month=5, day=7): Holiday.labour_day.value,
        datetime.date(year=2004, month=10, day=1): Holiday.national_day.value,
        datetime.date(year=2004, month=10, day=2): Holiday.national_day.value,
        datetime.date(year=2004, month=10, day=3): Holiday.national_day.value,
        datetime.date(year=2004, month=10, day=4): Holiday.national_day.value,
        datetime.date(year=2004, month=10, day=5): Holiday.national_day.value,
        datetime.date(year=2004, month=10, day=6): Holiday.national_day.value,
        datetime.date(year=2004, month=10, day=7): Holiday.national_day.value,
        datetime.date(year=2005, month=1, day=1): Holiday.new_years_day.value,
        datetime.date(year=2005, month=1, day=2): Holiday.new_years_day.value,
        datetime.date(year=2005, month=1, day=3): Holiday.new_years_day.value,
        datetime.date(year=2005, month=2, day=9): Holiday.spring_festival.value,
        datetime.date(year=2005, month=2, day=10): Holiday.spring_festival.value,
        datetime.date(year=2005, month=2, day=11): Holiday.spring_festival.value,
        datetime.date(year=2005, month=2, day=12): Holiday.spring_festival.value,
        datetime.date(year=2005, month=2, day=13): Holiday.spring_festival.value,
        datetime.date(year=2005, month=2, day=14): Holiday.spring_festival.value,
        datetime.date(year=2005, month=2, day=15): Holiday.spring_festival.value,
        datetime.date(year=2005, month=5, day=1): Holiday.labour_day.value,
        datetime.date(year=2005, month=5, day=2): Holiday.labour_day.value,
        datetime.date(year=2005, month=5, day=3): Holiday.labour_day.value,
        datetime.date(year=2005, month=5, day=4): Holiday.labour_day.value,
        datetime.date(year=2005, month=5, day=5): Holiday.labour_day.value,
        datetime.date(year=2005, month=5, day=6): Holiday.labour_day.value,
        datetime.date(year=2005, month=5, day=7): Holiday.labour_day.value,
        datetime.date(year=2005, month=10, day=1): Holiday.national_day.value,
        datetime.date(year=2005, month=10, day=2): Holiday.national_day.value,
        datetime.date(year=2005, month=10, day=3): Holiday.national_day.value,
        datetime.date(year=2005, month=10, day=4): Holiday.national_day.value,
        datetime.date(year=2005, month=10, day=5): Holiday.national_day.value,
        datetime.date(year=2005, month=10, day=6): Holiday.national_day.value,
        datetime.date(year=2005, month=10, day=7): Holiday.national_day.value,
        datetime.date(year=2006, month=1, day=1): Holiday.new_years_day.value,
        datetime.date(year=2006, month=1, day=2): Holiday.new_years_day.value,
        datetime.date(year=2006, month=1, day=3): Holiday.new_years_day.value,
        datetime.date(year=2006, month=1, day=29): Holiday.spring_festival.value,
        datetime.date(year=2006, month=1, day=30): Holiday.spring_festival.value,
        datetime.date(year=2006, month=1, day=31): Holiday.spring_festival.value,
        datetime.date(year=2006, month=2, day=1): Holiday.spring_festival.value,
        datetime.date(year=2006, month=2, day=2): Holiday.spring_festival.value,
        datetime.date(year=2006, month=2, day=3): Holiday.spring_festival.value,
        datetime.date(year=2006, month=2, day=4): Holiday.spring_festival.value,
        datetime.date(year=2006, month=5, day=1): Holiday.labour_day.value,
        datetime.date(year=2006, month=5, day=2): Holiday.labour_day.value,
        datetime.date(year=2006, month=5, day=3): Holiday.labour_day.value,
        datetime.date(year=2006, month=5, day=4): Holiday.labour_day.value,
        datetime.date(year=2006, month=5, day=5): Holiday.labour_day.value,
        datetime.date(year=2006, month=5, day=6): Holiday.labour_day.value,
        datetime.date(year=2006, month=5, day=7): Holiday.labour_day.value,
        datetime.date(year=2006, month=10, day=1): Holiday.national_day.value,
        datetime.date(year=2006, month=10, day=2): Holiday.national_day.value,
        datetime.date(year=2006, month=10, day=3): Holiday.national_day.value,
        datetime.date(year=2006, month=10, day=4): Holiday.national_day.value,
        datetime.date(year=2006, month=10, day=5): Holiday.national_day.value,
        datetime.date(year=2006, month=10, day=6): Holiday.national_day.value,
        datetime.date(year=2006, month=10, day=7): Holiday.national_day.value,
        datetime.date(year=2007, month=1, day=1): Holiday.new_years_day.value,
        datetime.date(year=2007, month=1, day=2): Holiday.new_years_day.value,
        datetime.date(year=2007, month=1, day=3): Holiday.new_years_day.value,
        datetime.date(year=2007, month=2, day=18): Holiday.spring_festival.value,
        datetime.date(year=2007, month=2, day=19): Holiday.spring_festival.value,
        datetime.date(year=2007, month=2, day=20): Holiday.spring_festival.value,
        datetime.date(year=2007, month=2, day=21): Holiday.spring_festival.value,
        datetime.date(year=2007, month=2, day=22): Holiday.spring_festival.value,
        datetime.date(year=2007, month=2, day=23): Holiday.spring_festival.value,
        datetime.date(year=2007, month=2, day=24): Holiday.spring_festival.value,
        datetime.date(year=2007, month=5, day=1): Holiday.labour_day.value,
        datetime.date(year=2007, month=5, day=2): Holiday.labour_day.value,
        datetime.date(year=2007, month=5, day=3): Holiday.labour_day.value,
        datetime.date(year=2007, month=5, day=4): Holiday.labour_day.value,
        datetime.date(year=2007, month=5, day=5): Holiday.labour_day.value,
        datetime.date(year=2007, month=5, day=6): Holiday.labour_day.value,
        datetime.date(year=2007, month=5, day=7): Holiday.labour_day.value,
        datetime.date(year=2007, month=10, day=1): Holiday.national_day.value,
        datetime.date(year=2007, month=10, day=2): Holiday.national_day.value,
        datetime.date(year=2007, month=10, day=3): Holiday.national_day.value,
        datetime.date(year=2007, month=10, day=4): Holiday.national_day.value,
        datetime.date(year=2007, month=10, day=5): Holiday.national_day.value,
        datetime.date(year=2007, month=10, day=6): Holiday.national_day.value,
        datetime.date(year=2007, month=10, day=7): Holiday.national_day.value,
        datetime.date(year=2007, month=12, day=30): Holiday.new_years_day.value,
        datetime.date(year=2007, month=12, day=31): Holiday.new_years_day.value,
        datetime.date(year=2008, month=1, day=1): Holiday.new_years_day.value,
        datetime.date(year=2008, month=2, day=6): Holiday.spring_festival.value,
        datetime.date(year=2008, month=2, day=7): Holiday.spring_festival.value,
        datetime.date(year=2008, month=2, day=8): Holiday.spring_festival.value,
        datetime.date(year=2008, month=2, day=9): Holiday.spring_festival.value,
        datetime.date(year=2008, month=2, day=10): Holiday.spring_festival.value,
        datetime.date(year=2008, month=2, day=11): Holiday.spring_festival.value,
        datetime.date(year=2008, month=2, day=12): Holiday.spring_festival.value,
        datetime.date(year=2008, month=4, day=4): Holiday.tomb_sweeping_day.value,
        datetime.date(year=2008, month=4, day=5): Holiday.tomb_sweeping_day.value,
        datetime.date(year=2008, month=4, day=6): Holiday.tomb_sweeping_day.value,
        datetime.date(year=2008, month=5, day=1): Holiday.labour_day.value,
        datetime.date(year=2008, month=5, day=2): Holiday.labour_day.value,
        datetime.date(year=2008, month=5, day=3): Holiday.labour_day.value,
        datetime.date(year=2008, month=6, day=7): Holiday.dragon_boat_festival.value,
        datetime.date(year=2008, month=6, day=8): Holiday.dragon_boat_festival.value,
        datetime.date(year=2008, month=6, day=9): Holiday.dragon_boat_festival.value,
        datetime.date(year=2008, month=9, day=13): Holiday.mid_autumn_festival.value,
        datetime.date(year=2008, month=9, day=14): Holiday.mid_autumn_festival.value,
        datetime.date(year=2008, month=9, day=15): Holiday.mid_autumn_festival.value,
        datetime.date(year=2008, month=9, day=29): Holiday.national_day.value,
        datetime.date(year=2008, month=9, day=30): Holiday.national_day.value,
        datetime.date(year=2008, month=10, day=1): Holiday.national_day.value,
        datetime.date(year=2008, month=10, day=2): Holiday.national_day.value,
        datetime.date(year=2008, month=10, day=3): Holiday.national_day.value,
        datetime.date(year=2008, month=10, day=4): Holiday.national_day.value,
        datetime.date(year=2008, month=10, day=5): Holiday.national_day.value,
        datetime.date(year=2009, month=1, day=1): Holiday.new_years_day.value,
        datetime.date(year=2009, month=1, day=2): Holiday.new_years_day.value,
        datetime.date(year=2009, month=1, day=3): Holiday.new_years_day.value,
        datetime.date(year=2009, month=1, day=25): Holiday.spring_festival.value,
        datetime.date(year=2009, month=1, day=26): Holiday.spring_festival.value,
        datetime.date(year=2009, month=1, day=27): Holiday.spring_festival.value,
        datetime.date(year=2009, month=1, day=28): Holiday.spring_festival.value,
        datetime.date(year=2009, month=1, day=29): Holiday.spring_festival.value,
        datetime.date(year=2009, month=1, day=30): Holiday.spring_festival.value,
        datetime.date(year=2009, month=1, day=31): Holiday.spring_festival.value,
        datetime.date(year=2009, month=4, day=4): Holiday.tomb_sweeping_day.value,
        datetime.date(year=2009, month=4, day=5): Holiday.tomb_sweeping_day.value,
        datetime.date(year=2009, month=4, day=6): Holiday.tomb_sweeping_day.value,
        datetime.date(year=2009, month=5, day=1): Holiday.labour_day.value,
        datetime.date(year=2009, month=5, day=2): Holiday.labour_day.value,
        datetime.date(year=2009, month=5, day=3): Holiday.labour_day.value,
        datetime.date(year=2009, month=5, day=28): Holiday.dragon_boat_festival.value,
        datetime.date(year=2009, month=5, day=29): Holiday.dragon_boat_festival.value,
        datetime.date(year=2009, month=5, day=30): Holiday.dragon_boat_festival.value,
        datetime.date(year=2009, month=10, day=1): Holiday.national_day.value,
        datetime.date(year=2009, month=10, day=2): Holiday.national_day.value,
        datetime.date(year=2009, month=10, day=3): Holiday.mid_autumn_festival.value,
        datetime.date(year=2009, month=10, day=4): Holiday.national_day.value,
        datetime.date(year=2009, month=10, day=5): Holiday.national_day.value,
        datetime.date(year=2009, month=10, day=6): Holiday.national_day.value,
        datetime.date(year=2009, month=10, day=7): Holiday.national_day.value,
        datetime.date(year=2009, month=10, day=8): Holiday.national_day.value,
        datetime.date(year=2010, month=1, day=1): Holiday.new_years_day.value,
        datetime.date(year=2010, month=1, day=2): Holiday.new_years_day.value,
        datetime.date(year=2010, month=1, day=3): Holiday.new_years_day.value,
        datetime.date(year=2010, month=2, day=13): Holiday.spring_festival.value,
        datetime.date(year=2010, month=2, day=14): Holiday.spring_festival.value,
        datetime.date(year=2010, month=2, day=15): Holiday.spring_festival.value,
        datetime.date(year=2010, month=2, day=16): Holiday.spring_festival.value,
        datetime.date(year=2010, month=2, day=17): Holiday.spring_festival.value,
        datetime.date(year=2010, month=2, day=18): Holiday.spring_festival.value,
        datetime.date(year=2010, month=2, day=19): Holiday.spring_festival.value,
        datetime.date(year=2010, month=4, day=3): Holiday.tomb_sweeping_day.value,
        datetime.date(year=2010, month=4, day=4): Holiday.tomb_sweeping_day.value,
        datetime.date(year=2010, month=4, day=5): Holiday.tomb_sweeping_day.value,
        datetime.date(year=2010, month=5, day=1): Holiday.labour_day.value,
        datetime.date(year=2010, month=5, day=2): Holiday.labour_day.value,
        datetime.date(year=2010, month=5, day=3): Holiday.labour_day.value,
        datetime.date(year=2010, month=6, day=14): Holiday.dragon_boat_festival.value,
        datetime.date(year=2010, month=6, day=15): Holiday.dragon_boat_festival.value,
        datetime.date(year=2010, month=6, day=16): Holiday.dragon_boat_festival.value,
        datetime.date(year=2010, month=9, day=22): Holiday.mid_autumn_festival.value,
        datetime.date(year=2010, month=9, day=23): Holiday.mid_autumn_festival.value,
        datetime.date(year=2010, month=9, day=24): Holiday.mid_autumn_festival.value,
        datetime.date(year=2010, month=10, day=1): Holiday.national_day.value,
        datetime.date(year=2010, month=10, day=2): Holiday.national_day.value,
        datetime.date(year=2010, month=10, day=3): Holiday.national_day.value,
        datetime.date(year=2010, month=10, day=4): Holiday.national_day.value,
        datetime.date(year=2010, month=10, day=5): Holiday.national_day.value,
        datetime.date(year=2010, month=10, day=6): Holiday.national_day.value,
        datetime.date(year=2010, month=10, day=7): Holiday.national_day.value,
        datetime.date(year=2011, month=1, day=1): Holiday.new_years_day.value,
        datetime.date(year=2011, month=1, day=2): Holiday.new_years_day.value,
        datetime.date(year=2011, month=1, day=3): Holiday.new_years_day.value,
        datetime.date(year=2011, month=2, day=2): Holiday.spring_festival.value,
        datetime.date(year=2011, month=2, day=3): Holiday.spring_festival.value,
        datetime.date(year=2011, month=2, day=4): Holiday.spring_festival.value,
        datetime.date(year=2011, month=2, day=5): Holiday.spring_festival.value,
        datetime.date(year=2011, month=2, day=6): Holiday.spring_festival.value,
        datetime.date(year=2011, month=2, day=7): Holiday.spring_festival.value,
        datetime.date(year=2011, month=2, day=8): Holiday.spring_festival.value,
        datetime.date(year=2011, month=4, day=3): Holiday.tomb_sweeping_day.value,
        datetime.date(year=2011, month=4, day=4): Holiday.tomb_sweeping_day.value,
        datetime.date(year=2011, month=4, day=5): Holiday.tomb_sweeping_day.value,
        datetime.date(year=2011, month=4, day=30): Holiday.labour_day.value,
        datetime.date(year=2011, month=5, day=1): Holiday.labour_day.value,
        datetime.date(year=2011, month=5, day=2): Holiday.labour_day.value,
        datetime.date(year=2011, month=6, day=4): Holiday.dragon_boat_festival.value,
        datetime.date(year=2011, month=6, day=6): Holiday.dragon_boat_festival.value,
        datetime.date(year=2011, month=9, day=10): Holiday.mid_autumn_festival.value,
        datetime.date(year=2011, month=9, day=11): Holiday.mid_autumn_festival.value,
        datetime.date(year=2011, month=9, day=12): Holiday.mid_autumn_festival.value,
        datetime.date(year=2011, month=10, day=1): Holiday.national_day.value,
        datetime.date(year=2011, month=10, day=2): Holiday.national_day.value,
        datetime.date(year=2011, month=10, day=3): Holiday.national_day.value,
        datetime.date(year=2011, month=10, day=4): Holiday.national_day.value,
        datetime.date(year=2011, month=10, day=5): Holiday.national_day.value,
        datetime.date(year=2011, month=10, day=6): Holiday.national_day.value,
        datetime.date(year=2011, month=10, day=7): Holiday.national_day.value,
        datetime.date(year=2012, month=1, day=1): Holiday.new_years_day.value,
        datetime.date(year=2012, month=1, day=2): Holiday.new_years_day.value,
        datetime.date(year=2012, month=1, day=3): Holiday.new_years_day.value,
        datetime.date(year=2012, month=1, day=22): Holiday.spring_festival.value,
        datetime.date(year=2012, month=1, day=23): Holiday.spring_festival.value,
        datetime.date(year=2012, month=1, day=24): Holiday.spring_festival.value,
        datetime.date(year=2012, month=1, day=25): Holiday.spring_festival.value,
        datetime.date(year=2012, month=1, day=26): Holiday.spring_festival.value,
        datetime.date(year=2012, month=1, day=27): Holiday.spring_festival.value,
        datetime.date(year=2012, month=1, day=28): Holiday.spring_festival.value,
        datetime.date(year=2012, month=4, day=2): Holiday.tomb_sweeping_day.value,
        datetime.date(year=2012, month=4, day=3): Holiday.tomb_sweeping_day.value,
        datetime.date(year=2012, month=4, day=4): Holiday.tomb_sweeping_day.value,
        datetime.date(year=2012, month=4, day=29): Holiday.labour_day.value,
        datetime.date(year=2012, month=4, day=30): Holiday.labour_day.value,
        datetime.date(year=2012, month=5, day=1): Holiday.labour_day.value,
        datetime.date(year=2012, month=6, day=22): Holiday.dragon_boat_festival.value,
        datetime.date(year=2012, month=6, day=24): Holiday.dragon_boat_festival.value,
        datetime.date(year=2012, month=9, day=30): Holiday.mid_autumn_festival.value,
        datetime.date(year=2012, month=10, day=1): Holiday.national_day.value,
        datetime.date(year=2012, month=10, day=2): Holiday.national_day.value,
        datetime.date(year=2012, month=10, day=3): Holiday.national_day.value,
        datetime.date(year=2012, month=10, day=4): Holiday.national_day.value,
        datetime.date(year=2012, month=10, day=5): Holiday.national_day.value,
        datetime.date(year=2012, month=10, day=6): Holiday.national_day.value,
        datetime.date(year=2012, month=10, day=7): Holiday.national_day.value,
        datetime.date(year=2013, month=1, day=1): Holiday.new_years_day.value,
        datetime.date(year=2013, month=1, day=2): Holiday.new_years_day.value,
        datetime.date(year=2013, month=1, day=3): Holiday.new_years_day.value,
        datetime.date(year=2013, month=2, day=9): Holiday.spring_festival.value,
        datetime.date(year=2013, month=2, day=10): Holiday.spring_festival.value,
        datetime.date(year=2013, month=2, day=11): Holiday.spring_festival.value,
        datetime.date(year=2013, month=2, day=12): Holiday.spring_festival.value,
        datetime.date(year=2013, month=2, day=13): Holiday.spring_festival.value,
        datetime.date(year=2013, month=2, day=14): Holiday.spring_festival.value,
        datetime.date(year=2013, month=2, day=15): Holiday.spring_festival.value,
        datetime.date(year=2013, month=4, day=4): Holiday.tomb_sweeping_day.value,
        datetime.date(year=2013, month=4, day=5): Holiday.tomb_sweeping_day.value,
        datetime.date(year=2013, month=4, day=6): Holiday.tomb_sweeping_day.value,
        datetime.date(year=2013, month=4, day=29): Holiday.labour_day.value,
        datetime.date(year=2013, month=4, day=30): Holiday.labour_day.value,
        datetime.date(year=2013, month=5, day=1): Holiday.labour_day.value,
        datetime.date(year=2013, month=6, day=10): Holiday.dragon_boat_festival.value,
        datetime.date(year=2013, month=6, day=11): Holiday.dragon_boat_festival.value,
        datetime.date(year=2013, month=6, day=12): Holiday.dragon_boat_festival.value,
        datetime.date(year=2013, month=9, day=19): Holiday.mid_autumn_festival.value,
        datetime.date(year=2013, month=9, day=20): Holiday.mid_autumn_festival.value,
        datetime.date(year=2013, month=9, day=21): Holiday.mid_autumn_festival.value,
        datetime.date(year=2013, month=10, day=1): Holiday.national_day.value,
        datetime.date(year=2013, month=10, day=2): Holiday.national_day.value,
        datetime.date(year=2013, month=10, day=3): Holiday.national_day.value,
        datetime.date(year=2013, month=10, day=4): Holiday.national_day.value,
        datetime.date(year=2013, month=10, day=5): Holiday.national_day.value,
        datetime.date(year=2013, month=10, day=6): Holiday.national_day.value,
        datetime.date(year=2013, month=10, day=7): Holiday.national_day.value,
        datetime.date(year=2014, month=1, day=1): Holiday.new_years_day.value,
        datetime.date(year=2014, month=1, day=31): Holiday.spring_festival.value,
        datetime.date(year=2014, month=2, day=1): Holiday.spring_festival.value,
        datetime.date(year=2014, month=2, day=2): Holiday.spring_festival.value,
        datetime.date(year=2014, month=2, day=3): Holiday.spring_festival.value,
        datetime.date(year=2014, month=2, day=4): Holiday.spring_festival.value,
        datetime.date(year=2014, month=2, day=5): Holiday.spring_festival.value,
        datetime.date(year=2014, month=2, day=6): Holiday.spring_festival.value,
        datetime.date(year=2014, month=4, day=5): Holiday.tomb_sweeping_day.value,
        datetime.date(year=2014, month=4, day=6): Holiday.tomb_sweeping_day.value,
        datetime.date(year=2014, month=4, day=7): Holiday.tomb_sweeping_day.value,
        datetime.date(year=2014, month=5, day=1): Holiday.labour_day.value,
        datetime.date(year=2014, month=5, day=2): Holiday.labour_day.value,
        datetime.date(year=2014, month=5, day=3): Holiday.labour_day.value,
        datetime.date(year=2014, month=6, day=2): Holiday.dragon_boat_festival.value,
        datetime.date(year=2014, month=9, day=8): Holiday.mid_autumn_festival.value,
        datetime.date(year=2014, month=10, day=1): Holiday.national_day.value,
        datetime.date(year=2014, month=10, day=2): Holiday.national_day.value,
        datetime.date(year=2014, month=10, day=3): Holiday.national_day.value,
        datetime.date(year=2014, month=10, day=4): Holiday.national_day.value,
        datetime.date(year=2014, month=10, day=5): Holiday.national_day.value,
        datetime.date(year=2014, month=10, day=6): Holiday.national_day.value,
        datetime.date(year=2014, month=10, day=7): Holiday.national_day.value,
        datetime.date(year=2015, month=1, day=1): Holiday.new_years_day.value,
        datetime.date(year=2015, month=1, day=2): Holiday.new_years_day.value,
        datetime.date(year=2015, month=1, day=3): Holiday.new_years_day.value,
        datetime.date(year=2015, month=2, day=18): Holiday.spring_festival.value,
        datetime.date(year=2015, month=2, day=19): Holiday.spring_festival.value,
        datetime.date(year=2015, month=2, day=20): Holiday.spring_festival.value,
        datetime.date(year=2015, month=2, day=21): Holiday.spring_festival.value,
        datetime.date(year=2015, month=2, day=22): Holiday.spring_festival.value,
        datetime.date(year=2015, month=2, day=23): Holiday.spring_festival.value,
        datetime.date(year=2015, month=2, day=24): Holiday.spring_festival.value,
        datetime.date(year=2015, month=4, day=5): Holiday.tomb_sweeping_day.value,
        datetime.date(year=2015, month=4, day=6): Holiday.tomb_sweeping_day.value,
        datetime.date(year=2015, month=5, day=1): Holiday.labour_day.value,
        datetime.date(year=2015, month=6, day=20): Holiday.dragon_boat_festival.value,
        datetime.date(year=2015, month=6, day=22): Holiday.dragon_boat_festival.value,
        datetime.date(year=2015, month=9, day=3): Holiday.anti_fascist_70th_day.value,
        datetime.date(year=2015, month=9, day=4): Holiday.anti_fascist_70th_day.value,
        datetime.date(year=2015, month=9, day=27): Holiday.mid_autumn_festival.value,
        datetime.date(year=2015, month=10, day=1): Holiday.national_day.value,
        datetime.date(year=2015, month=10, day=2): Holiday.national_day.value,
        datetime.date(year=2015, month=10, day=3): Holiday.national_day.value,
        datetime.date(year=2015, month=10, day=4): Holiday.national_day.value,
        datetime.date(year=2015, month=10, day=5): Holiday.national_day.value,
        datetime.date(year=2015, month=10, day=6): Holiday.national_day.value,
        datetime.date(year=2015, month=10, day=7): Holiday.national_day.value,
        datetime.date(year=2016, month=1, day=1): Holiday.new_years_day.value,
        datetime.date(year=2016, month=2, day=7): Holiday.spring_festival.value,
        datetime.date(year=2016, month=2, day=8): Holiday.spring_festival.value,
        datetime.date(year=2016, month=2, day=9): Holiday.spring_festival.value,
        datetime.date(year=2016, month=2, day=10): Holiday.spring_festival.value,
        datetime.date(year=2016, month=2, day=11): Holiday.spring_festival.value,
        datetime.date(year=2016, month=2, day=12): Holiday.spring_festival.value,
        datetime.date(year=2016, month=2, day=13): Holiday.spring_festival.value,
        datetime.date(year=2016, month=4, day=4): Holiday.tomb_sweeping_day.value,
        datetime.date(year=2016, month=5, day=1): Holiday.labour_day.value,
        datetime.date(year=2016, month=5, day=2): Holiday.labour_day.value,
        datetime.date(year=2016, month=6, day=9): Holiday.dragon_boat_festival.value,
        datetime.date(year=2016, month=6, day=10): Holiday.dragon_boat_festival.value,
        datetime.date(year=2016, month=6, day=11): Holiday.dragon_boat_festival.value,
        datetime.date(year=2016, month=9, day=15): Holiday.mid_autumn_festival.value,
        datetime.date(year=2016, month=9, day=16): Holiday.mid_autumn_festival.value,
        datetime.date(year=2016, month=9, day=17): Holiday.mid_autumn_festival.value,
        datetime.date(year=2016, month=10, day=1): Holiday.national_day.value,
        datetime.date(year=2016, month=10, day=2): Holiday.national_day.value,
        datetime.date(year=2016, month=10, day=3): Holiday.national_day.value,
        datetime.date(year=2016, month=10, day=4): Holiday.national_day.value,
        datetime.date(year=2016, month=10, day=5): Holiday.national_day.value,
        datetime.date(year=2016, month=10, day=6): Holiday.national_day.value,
        datetime.date(year=2016, month=10, day=7): Holiday.national_day.value,
        datetime.date(year=2017, month=1, day=1): Holiday.new_years_day.value,
        datetime.date(year=2017, month=1, day=2): Holiday.new_years_day.value,
        datetime.date(year=2017, month=1, day=27): Holiday.spring_festival.value,
        datetime.date(year=2017, month=1, day=28): Holiday.spring_festival.value,
        datetime.date(year=2017, month=1, day=29): Holiday.spring_festival.value,
        datetime.date(year=2017, month=1, day=30): Holiday.spring_festival.value,
        datetime.date(year=2017, month=1, day=31): Holiday.spring_festival.value,
        datetime.date(year=2017, month=2, day=1): Holiday.spring_festival.value,
        datetime.date(year=2017, month=2, day=2): Holiday.spring_festival.value,
        datetime.date(year=2017, month=4, day=2): Holiday.tomb_sweeping_day.value,
        datetime.date(year=2017, month=4, day=3): Holiday.tomb_sweeping_day.value,
        datetime.date(year=2017, month=4, day=4): Holiday.tomb_sweeping_day.value,
        datetime.date(year=2017, month=5, day=1): Holiday.labour_day.value,
        datetime.date(year=2017, month=5, day=28): Holiday.dragon_boat_festival.value,
        datetime.date(year=2017, month=5, day=29): Holiday.dragon_boat_festival.value,
        datetime.date(year=2017, month=5, day=30): Holiday.dragon_boat_festival.value,
        datetime.date(year=2017, month=10, day=1): Holiday.national_day.value,
        datetime.date(year=2017, month=10, day=2): Holiday.national_day.value,
        datetime.date(year=2017, month=10, day=3): Holiday.national_day.value,
        datetime.date(year=2017, month=10, day=4): Holiday.mid_autumn_festival.value,
        datetime.date(year=2017, month=10, day=5): Holiday.national_day.value,
        datetime.date(year=2017, month=10, day=6): Holiday.national_day.value,
        datetime.date(year=2017, month=10, day=7): Holiday.national_day.value,
        datetime.date(year=2017, month=10, day=8): Holiday.national_day.value,
        datetime.date(year=2018, month=1, day=1): Holiday.new_years_day.value,
        datetime.date(year=2018, month=2, day=15): Holiday.spring_festival.value,
        datetime.date(year=2018, month=2, day=16): Holiday.spring_festival.value,
        datetime.date(year=2018, month=2, day=17): Holiday.spring_festival.value,
        datetime.date(year=2018, month=2, day=18): Holiday.spring_festival.value,
        datetime.date(year=2018, month=2, day=19): Holiday.spring_festival.value,
        datetime.date(year=2018, month=2, day=20): Holiday.spring_festival.value,
        datetime.date(year=2018, month=2, day=21): Holiday.spring_festival.value,
        datetime.date(year=2018, month=4, day=5): Holiday.tomb_sweeping_day.value,
        datetime.date(year=2018, month=4, day=6): Holiday.tomb_sweeping_day.value,
        datetime.date(year=2018, month=4, day=7): Holiday.tomb_sweeping_day.value,
        datetime.date(year=2018, month=4, day=29): Holiday.labour_day.value,
        datetime.date(year=2018, month=4, day=30): Holiday.labour_day.value,
        datetime.date(year=2018, month=5, day=1): Holiday.labour_day.value,
        datetime.date(year=2018, month=6, day=18): Holiday.dragon_boat_festival.value,
        datetime.date(year=2018, month=9, day=24): Holiday.mid_autumn_festival.value,
        datetime.date(year=2018, month=10, day=1): Holiday.national_day.value,
        datetime.date(year=2018, month=10, day=2): Holiday.national_day.value,
        datetime.date(year=2018, month=10, day=3): Holiday.national_day.value,
        datetime.date(year=2018, month=10, day=4): Holiday.national_day.value,
        datetime.date(year=2018, month=10, day=5): Holiday.national_day.value,
        datetime.date(year=2018, month=10, day=6): Holiday.national_day.value,
        datetime.date(year=2018, month=10, day=7): Holiday.national_day.value,
        datetime.date(year=2018, month=12, day=30): Holiday.new_years_day.value,
        datetime.date(year=2018, month=12, day=31): Holiday.new_years_day.value,
        datetime.date(year=2019, month=1, day=1): Holiday.new_years_day.value,
        datetime.date(year=2019, month=2, day=4): Holiday.spring_festival.value,
        datetime.date(year=2019, month=2, day=5): Holiday.spring_festival.value,
        datetime.date(year=2019, month=2, day=6): Holiday.spring_festival.value,
        datetime.date(year=2019, month=2, day=7): Holiday.spring_festival.value,
        datetime.date(year=2019, month=2, day=8): Holiday.spring_festival.value,
        datetime.date(year=2019, month=2, day=9): Holiday.spring_festival.value,
        datetime.date(year=2019, month=2, day=10): Holiday.spring_festival.value,
        datetime.date(year=2019, month=4, day=5): Holiday.tomb_sweeping_day.value,
        datetime.date(year=2019, month=4, day=6): Holiday.tomb_sweeping_day.value,
        datetime.date(year=2019, month=4, day=7): Holiday.tomb_sweeping_day.value,
        datetime.date(year=2019, month=5, day=1): Holiday.labour_day.value,
        datetime.date(year=2019, month=5, day=2): Holiday.labour_day.value,
        datetime.date(year=2019, month=5, day=3): Holiday.labour_day.value,
        datetime.date(year=2019, month=5, day=4): Holiday.labour_day.value,
        datetime.date(year=2019, month=6, day=7): Holiday.dragon_boat_festival.value,
        datetime.date(year=2019, month=6, day=8): Holiday.dragon_boat_festival.value,
        datetime.date(year=2019, month=6, day=9): Holiday.dragon_boat_festival.value,
        datetime.date(year=2019, month=9, day=13): Holiday.mid_autumn_festival.value,
        datetime.date(year=2019, month=9, day=14): Holiday.mid_autumn_festival.value,
        datetime.date(year=2019, month=9, day=15): Holiday.mid_autumn_festival.value,
        datetime.date(year=2019, month=10, day=1): Holiday.national_day.value,
        datetime.date(year=2019, month=10, day=2): Holiday.national_day.value,
        datetime.date(year=2019, month=10, day=3): Holiday.national_day.value,
        datetime.date(year=2019, month=10, day=4): Holiday.national_day.value,
        datetime.date(year=2019, month=10, day=5): Holiday.national_day.value,
        datetime.date(year=2019, month=10, day=6): Holiday.national_day.value,
        datetime.date(year=2019, month=10, day=7): Holiday.national_day.value,
        datetime.date(year=2020, month=1, day=1): Holiday.new_years_day.value,
        datetime.date(year=2020, month=1, day=24): Holiday.spring_festival.value,
        datetime.date(year=2020, month=1, day=25): Holiday.spring_festival.value,
        datetime.date(year=2020, month=1, day=26): Holiday.spring_festival.value,
        datetime.date(year=2020, month=1, day=27): Holiday.spring_festival.value,
        datetime.date(year=2020, month=1, day=28): Holiday.spring_festival.value,
        datetime.date(year=2020, month=1, day=29): Holiday.spring_festival.value,
        datetime.date(year=2020, month=1, day=30): Holiday.spring_festival.value,
        datetime.date(year=2020, month=1, day=31): Holiday.spring_festival.value,
        datetime.date(year=2020, month=2, day=1): Holiday.spring_festival.value,
        datetime.date(year=2020, month=2, day=2): Holiday.spring_festival.value,
        datetime.date(year=2020, month=4, day=4): Holiday.tomb_sweeping_day.value,
        datetime.date(year=2020, month=4, day=5): Holiday.tomb_sweeping_day.value,
        datetime.date(year=2020, month=4, day=6): Holiday.tomb_sweeping_day.value,
        datetime.date(year=2020, month=5, day=1): Holiday.labour_day.value,
        datetime.date(year=2020, month=5, day=2): Holiday.labour_day.value,
        datetime.date(year=2020, month=5, day=3): Holiday.labour_day.value,
        datetime.date(year=2020, month=5, day=4): Holiday.labour_day.value,
        datetime.date(year=2020, month=5, day=5): Holiday.labour_day.value,
        datetime.date(year=2020, month=6, day=25): Holiday.dragon_boat_festival.value,
        datetime.date(year=2020, month=6, day=26): Holiday.dragon_boat_festival.value,
        datetime.date(year=2020, month=6, day=27): Holiday.dragon_boat_festival.value,
        datetime.date(year=2020, month=10, day=1): Holiday.national_day.value,
        datetime.date(year=2020, month=10, day=2): Holiday.national_day.value,
        datetime.date(year=2020, month=10, day=3): Holiday.national_day.value,
        datetime.date(year=2020, month=10, day=4): Holiday.national_day.value,
        datetime.date(year=2020, month=10, day=5): Holiday.national_day.value,
        datetime.date(year=2020, month=10, day=6): Holiday.national_day.value,
        datetime.date(year=2020, month=10, day=7): Holiday.national_day.value,
        datetime.date(year=2020, month=10, day=8): Holiday.national_day.value,
        datetime.date(year=2021, month=1, day=1): Holiday.new_years_day.value,
        datetime.date(year=2021, month=1, day=2): Holiday.new_years_day.value,
        datetime.date(year=2021, month=1, day=3): Holiday.new_years_day.value,
        datetime.date(year=2021, month=2, day=11): Holiday.spring_festival.value,
        datetime.date(year=2021, month=2, day=12): Holiday.spring_festival.value,
        datetime.date(year=2021, month=2, day=13): Holiday.spring_festival.value,
        datetime.date(year=2021, month=2, day=14): Holiday.spring_festival.value,
        datetime.date(year=2021, month=2, day=15): Holiday.spring_festival.value,
        datetime.date(year=2021, month=2, day=16): Holiday.spring_festival.value,
        datetime.date(year=2021, month=2, day=17): Holiday.spring_festival.value,
        datetime.date(year=2021, month=4, day=3): Holiday.tomb_sweeping_day.value,
        datetime.date(year=2021, month=4, day=4): Holiday.tomb_sweeping_day.value,
        datetime.date(year=2021, month=4, day=5): Holiday.tomb_sweeping_day.value,
        datetime.date(year=2021, month=5, day=1): Holiday.labour_day.value,
        datetime.date(year=2021, month=5, day=2): Holiday.labour_day.value,
        datetime.date(year=2021, month=5, day=3): Holiday.labour_day.value,
        datetime.date(year=2021, month=5, day=4): Holiday.labour_day.value,
        datetime.date(year=2021, month=5, day=5): Holiday.labour_day.value,
        datetime.date(year=2021, month=6, day=12): Holiday.dragon_boat_festival.value,
        datetime.date(year=2021, month=6, day=13): Holiday.dragon_boat_festival.value,
        datetime.date(year=2021, month=6, day=14): Holiday.dragon_boat_festival.value,
        datetime.date(year=2021, month=9, day=19): Holiday.mid_autumn_festival.value,
        datetime.date(year=2021, month=9, day=20): Holiday.mid_autumn_festival.value,
        datetime.date(year=2021, month=9, day=21): Holiday.mid_autumn_festival.value,
        datetime.date(year=2021, month=10, day=1): Holiday.national_day.value,
        datetime.date(year=2021, month=10, day=2): Holiday.national_day.value,
        datetime.date(year=2021, month=10, day=3): Holiday.national_day.value,
        datetime.date(year=2021, month=10, day=4): Holiday.national_day.value,
        datetime.date(year=2021, month=10, day=5): Holiday.national_day.value,
        datetime.date(year=2021, month=10, day=6): Holiday.national_day.value,
        datetime.date(year=2021, month=10, day=7): Holiday.national_day.value,
        datetime.date(year=2022, month=1, day=1): Holiday.new_years_day.value,
        datetime.date(year=2022, month=1, day=2): Holiday.new_years_day.value,
        datetime.date(year=2022, month=1, day=3): Holiday.new_years_day.value,
        datetime.date(year=2022, month=1, day=31): Holiday.spring_festival.value,
        datetime.date(year=2022, month=2, day=1): Holiday.spring_festival.value,
        datetime.date(year=2022, month=2, day=2): Holiday.spring_festival.value,
        datetime.date(year=2022, month=2, day=3): Holiday.spring_festival.value,
        datetime.date(year=2022, month=2, day=4): Holiday.spring_festival.value,
        datetime.date(year=2022, month=2, day=5): Holiday.spring_festival.value,
        datetime.date(year=2022, month=2, day=6): Holiday.spring_festival.value,
        datetime.date(year=2022, month=4, day=3): Holiday.tomb_sweeping_day.value,
        datetime.date(year=2022, month=4, day=4): Holiday.tomb_sweeping_day.value,
        datetime.date(year=2022, month=4, day=5): Holiday.tomb_sweeping_day.value,
        datetime.date(year=2022, month=4, day=30): Holiday.labour_day.value,
        datetime.date(year=2022, month=5, day=1): Holiday.labour_day.value,
        datetime.date(year=2022, month=5, day=2): Holiday.labour_day.value,
        datetime.date(year=2022, month=5, day=3): Holiday.labour_day.value,
        datetime.date(year=2022, month=5, day=4): Holiday.labour_day.value,
        datetime.date(year=2022, month=6, day=3): Holiday.dragon_boat_festival.value,
        datetime.date(year=2022, month=6, day=4): Holiday.dragon_boat_festival.value,
        datetime.date(year=2022, month=6, day=5): Holiday.dragon_boat_festival.value,
        datetime.date(year=2022, month=9, day=10): Holiday.mid_autumn_festival.value,
        datetime.date(year=2022, month=9, day=11): Holiday.mid_autumn_festival.value,
        datetime.date(year=2022, month=9, day=12): Holiday.mid_autumn_festival.value,
        datetime.date(year=2022, month=10, day=1): Holiday.national_day.value,
        datetime.date(year=2022, month=10, day=2): Holiday.national_day.value,
        datetime.date(year=2022, month=10, day=3): Holiday.national_day.value,
        datetime.date(year=2022, month=10, day=4): Holiday.national_day.value,
        datetime.date(year=2022, month=10, day=5): Holiday.national_day.value,
        datetime.date(year=2022, month=10, day=6): Holiday.national_day.value,
        datetime.date(year=2022, month=10, day=7): Holiday.national_day.value,
        datetime.date(year=2022, month=12, day=31): Holiday.new_years_day.value,
        datetime.date(year=2023, month=1, day=1): Holiday.new_years_day.value,
        datetime.date(year=2023, month=1, day=2): Holiday.new_years_day.value,
        datetime.date(year=2023, month=1, day=21): Holiday.spring_festival.value,
        datetime.date(year=2023, month=1, day=22): Holiday.spring_festival.value,
        datetime.date(year=2023, month=1, day=23): Holiday.spring_festival.value,
        datetime.date(year=2023, month=1, day=24): Holiday.spring_festival.value,
        datetime.date(year=2023, month=1, day=25): Holiday.spring_festival.value,
        datetime.date(year=2023, month=1, day=26): Holiday.spring_festival.value,
        datetime.date(year=2023, month=1, day=27): Holiday.spring_festival.value,
        datetime.date(year=2023, month=4, day=5): Holiday.tomb_sweeping_day.value,
        datetime.date(year=2023, month=4, day=29): Holiday.labour_day.value,
        datetime.date(year=2023, month=4, day=30): Holiday.labour_day.value,
        datetime.date(year=2023, month=5, day=1): Holiday.labour_day.value,
        datetime.date(year=2023, month=5, day=2): Holiday.labour_day.value,
        datetime.date(year=2023, month=5, day=3): Holiday.labour_day.value,
        datetime.date(year=2023, month=6, day=22): Holiday.dragon_boat_festival.value,
        datetime.date(year=2023, month=6, day=23): Holiday.dragon_boat_festival.value,
        datetime.date(year=2023, month=6, day=24): Holiday.dragon_boat_festival.value,
        datetime.date(year=2023, month=9, day=29): Holiday.mid_autumn_festival.value,
        datetime.date(year=2023, month=9, day=30): Holiday.national_day.value,
        datetime.date(year=2023, month=10, day=1): Holiday.national_day.value,
        datetime.date(year=2023, month=10, day=2): Holiday.national_day.value,
        datetime.date(year=2023, month=10, day=3): Holiday.national_day.value,
        datetime.date(year=2023, month=10, day=4): Holiday.national_day.value,
        datetime.date(year=2023, month=10, day=5): Holiday.national_day.value,
        datetime.date(year=2023, month=10, day=6): Holiday.national_day.value,
        datetime.date(year=2024, month=1, day=1): Holiday.new_years_day.value,
        datetime.date(year=2024, month=2, day=9): Holiday.spring_festival.value,  # 除夕上班但是不开盘
        datetime.date(year=2024, month=2, day=10): Holiday.spring_festival.value,
        datetime.date(year=2024, month=2, day=11): Holiday.spring_festival.value,
        datetime.date(year=2024, month=2, day=12): Holiday.spring_festival.value,
        datetime.date(year=2024, month=2, day=13): Holiday.spring_festival.value,
        datetime.date(year=2024, month=2, day=14): Holiday.spring_festival.value,
        datetime.date(year=2024, month=2, day=15): Holiday.spring_festival.value,
        datetime.date(year=2024, month=2, day=16): Holiday.spring_festival.value,
        datetime.date(year=2024, month=2, day=17): Holiday.spring_festival.value,
        datetime.date(year=2024, month=4, day=4): Holiday.tomb_sweeping_day.value,
        datetime.date(year=2024, month=4, day=5): Holiday.tomb_sweeping_day.value,
        datetime.date(year=2024, month=4, day=6): Holiday.tomb_sweeping_day.value,
        datetime.date(year=2024, month=5, day=1): Holiday.labour_day.value,
        datetime.date(year=2024, month=5, day=2): Holiday.labour_day.value,
        datetime.date(year=2024, month=5, day=3): Holiday.labour_day.value,
        datetime.date(year=2024, month=5, day=4): Holiday.labour_day.value,
        datetime.date(year=2024, month=5, day=5): Holiday.labour_day.value,
        datetime.date(year=2024, month=6, day=10): Holiday.dragon_boat_festival.value,
        datetime.date(year=2024, month=9, day=15): Holiday.mid_autumn_festival.value,
        datetime.date(year=2024, month=9, day=16): Holiday.mid_autumn_festival.value,
        datetime.date(year=2024, month=9, day=17): Holiday.mid_autumn_festival.value,
        datetime.date(year=2024, month=10, day=1): Holiday.national_day.value,
        datetime.date(year=2024, month=10, day=2): Holiday.national_day.value,
        datetime.date(year=2024, month=10, day=3): Holiday.national_day.value,
        datetime.date(year=2024, month=10, day=4): Holiday.national_day.value,
        datetime.date(year=2024, month=10, day=5): Holiday.national_day.value,
        datetime.date(year=2024, month=10, day=6): Holiday.national_day.value,
        datetime.date(year=2024, month=10, day=7): Holiday.national_day.value,
        datetime.date(year=2025, month=1, day=1): Holiday.new_years_day.value,
        datetime.date(year=2025, month=1, day=28): Holiday.spring_festival.value,
        datetime.date(year=2025, month=1, day=29): Holiday.spring_festival.value,
        datetime.date(year=2025, month=1, day=30): Holiday.spring_festival.value,
        datetime.date(year=2025, month=1, day=31): Holiday.spring_festival.value,
        datetime.date(year=2025, month=2, day=1): Holiday.spring_festival.value,
        datetime.date(year=2025, month=2, day=2): Holiday.spring_festival.value,
        datetime.date(year=2025, month=2, day=3): Holiday.spring_festival.value,
        datetime.date(year=2025, month=2, day=4): Holiday.spring_festival.value,
        datetime.date(year=2025, month=4, day=4): Holiday.tomb_sweeping_day.value,
        datetime.date(year=2025, month=4, day=5): Holiday.tomb_sweeping_day.value,
        datetime.date(year=2025, month=4, day=6): Holiday.tomb_sweeping_day.value,
        datetime.date(year=2025, month=5, day=1): Holiday.labour_day.value,
        datetime.date(year=2025, month=5, day=2): Holiday.labour_day.value,
        datetime.date(year=2025, month=5, day=3): Holiday.labour_day.value,
        datetime.date(year=2025, month=5, day=4): Holiday.labour_day.value,
        datetime.date(year=2025, month=5, day=5): Holiday.labour_day.value,
        datetime.date(year=2025, month=5, day=31): Holiday.dragon_boat_festival.value,
        datetime.date(year=2025, month=6, day=1): Holiday.dragon_boat_festival.value,
        datetime.date(year=2025, month=6, day=2): Holiday.dragon_boat_festival.value,
        datetime.date(year=2025, month=10, day=1): Holiday.national_day.value,
        datetime.date(year=2025, month=10, day=2): Holiday.national_day.value,
        datetime.date(year=2025, month=10, day=3): Holiday.national_day.value,
        datetime.date(year=2025, month=10, day=4): Holiday.national_day.value,
        datetime.date(year=2025, month=10, day=5): Holiday.national_day.value,
        datetime.date(year=2025, month=10, day=6): Holiday.mid_autumn_festival.value,
        datetime.date(year=2025, month=10, day=7): Holiday.national_day.value,
        datetime.date(year=2025, month=10, day=8): Holiday.national_day.value,
        # 上海票据交易所关于中国票据业务系统2025年节假日调整和2026年节假日预设的通知：
        # https://mp.weixin.qq.com/s/9eHii0bu6NRKtekeRwCl2Q
        # todo: 2026年节假日已经根据国务院正式通知更新, 与中国票据业务系统预设一致
        datetime.date(year=2026, month=1, day=1): Holiday.new_years_day.value,
        datetime.date(year=2026, month=1, day=2): Holiday.new_years_day.value,
        datetime.date(year=2026, month=1, day=3): Holiday.new_years_day.value,
        datetime.date(year=2026, month=2, day=15): Holiday.spring_festival.value,
        datetime.date(year=2026, month=2, day=16): Holiday.spring_festival.value,
        datetime.date(year=2026, month=2, day=17): Holiday.spring_festival.value,
        datetime.date(year=2026, month=2, day=18): Holiday.spring_festival.value,
        datetime.date(year=2026, month=2, day=19): Holiday.spring_festival.value,
        datetime.date(year=2026, month=2, day=20): Holiday.spring_festival.value,
        datetime.date(year=2026, month=2, day=21): Holiday.spring_festival.value,
        datetime.date(year=2026, month=2, day=22): Holiday.spring_festival.value,
        datetime.date(year=2026, month=2, day=23): Holiday.spring_festival.value,
        datetime.date(year=2026, month=4, day=4): Holiday.tomb_sweeping_day.value,
        datetime.date(year=2026, month=4, day=5): Holiday.tomb_sweeping_day.value,
        datetime.date(year=2026, month=4, day=6): Holiday.tomb_sweeping_day.value,
        datetime.date(year=2026, month=5, day=1): Holiday.labour_day.value,
        datetime.date(year=2026, month=5, day=2): Holiday.labour_day.value,
        datetime.date(year=2026, month=5, day=3): Holiday.labour_day.value,
        datetime.date(year=2026, month=5, day=4): Holiday.labour_day.value,
        datetime.date(year=2026, month=5, day=5): Holiday.labour_day.value,
        datetime.date(year=2026, month=6, day=19): Holiday.dragon_boat_festival.value,
        datetime.date(year=2026, month=6, day=20): Holiday.dragon_boat_festival.value,
        datetime.date(year=2026, month=6, day=21): Holiday.dragon_boat_festival.value,
        datetime.date(year=2026, month=9, day=25): Holiday.mid_autumn_festival.value,
        datetime.date(year=2026, month=9, day=26): Holiday.mid_autumn_festival.value,
        datetime.date(year=2026, month=9, day=27): Holiday.mid_autumn_festival.value,
        datetime.date(year=2026, month=10, day=1): Holiday.national_day.value,
        datetime.date(year=2026, month=10, day=2): Holiday.national_day.value,
        datetime.date(year=2026, month=10, day=3): Holiday.national_day.value,
        datetime.date(year=2026, month=10, day=4): Holiday.national_day.value,
        datetime.date(year=2026, month=10, day=5): Holiday.national_day.value,
        datetime.date(year=2026, month=10, day=6): Holiday.national_day.value,
        datetime.date(year=2026, month=10, day=7): Holiday.national_day.value,
        # todo: 2027年节假日根据农历预测，具体以国务院通知为准
        datetime.date(year=2027, month=1, day=1): Holiday.new_years_day.value,
        datetime.date(year=2027, month=2, day=5): Holiday.spring_festival.value,
        datetime.date(year=2027, month=2, day=6): Holiday.spring_festival.value,
        datetime.date(year=2027, month=2, day=7): Holiday.spring_festival.value,
        datetime.date(year=2027, month=2, day=8): Holiday.spring_festival.value,
        datetime.date(year=2027, month=2, day=9): Holiday.spring_festival.value,
        datetime.date(year=2027, month=2, day=10): Holiday.spring_festival.value,
        datetime.date(year=2027, month=2, day=11): Holiday.spring_festival.value,
        datetime.date(year=2027, month=2, day=12): Holiday.spring_festival.value,
        datetime.date(year=2027, month=4, day=3): Holiday.tomb_sweeping_day.value,
        datetime.date(year=2027, month=4, day=4): Holiday.tomb_sweeping_day.value,
        datetime.date(year=2027, month=4, day=5): Holiday.tomb_sweeping_day.value,
        datetime.date(year=2027, month=5, day=1): Holiday.labour_day.value,
        datetime.date(year=2027, month=5, day=2): Holiday.labour_day.value,
        datetime.date(year=2027, month=5, day=3): Holiday.labour_day.value,
        datetime.date(year=2027, month=5, day=4): Holiday.labour_day.value,
        datetime.date(year=2027, month=5, day=5): Holiday.labour_day.value,
        datetime.date(year=2027, month=6, day=9): Holiday.dragon_boat_festival.value,
        datetime.date(year=2027, month=6, day=10): Holiday.dragon_boat_festival.value,
        datetime.date(year=2027, month=6, day=11): Holiday.dragon_boat_festival.value,
        datetime.date(year=2027, month=9, day=15): Holiday.mid_autumn_festival.value,
        datetime.date(year=2027, month=10, day=1): Holiday.national_day.value,
        datetime.date(year=2027, month=10, day=2): Holiday.national_day.value,
        datetime.date(year=2027, month=10, day=3): Holiday.national_day.value,
        datetime.date(year=2027, month=10, day=4): Holiday.national_day.value,
        datetime.date(year=2027, month=10, day=5): Holiday.national_day.value,
        datetime.date(year=2027, month=10, day=6): Holiday.national_day.value,
        datetime.date(year=2027, month=10, day=7): Holiday.national_day.value,
        # todo: 2028年节假日根据农历预测，具体以国务院通知为准
        datetime.date(year=2028, month=1, day=1): Holiday.new_years_day.value,
        datetime.date(year=2028, month=1, day=2): Holiday.new_years_day.value,
        datetime.date(year=2028, month=1, day=3): Holiday.new_years_day.value,
        datetime.date(year=2028, month=1, day=25): Holiday.spring_festival.value,
        datetime.date(year=2028, month=1, day=26): Holiday.spring_festival.value,
        datetime.date(year=2028, month=1, day=27): Holiday.spring_festival.value,
        datetime.date(year=2028, month=1, day=28): Holiday.spring_festival.value,
        datetime.date(year=2028, month=1, day=29): Holiday.spring_festival.value,
        datetime.date(year=2028, month=1, day=30): Holiday.spring_festival.value,
        datetime.date(year=2028, month=1, day=31): Holiday.spring_festival.value,
        datetime.date(year=2028, month=2, day=1): Holiday.spring_festival.value,
        datetime.date(year=2028, month=4, day=2): Holiday.tomb_sweeping_day.value,
        datetime.date(year=2028, month=4, day=3): Holiday.tomb_sweeping_day.value,
        datetime.date(year=2028, month=4, day=4): Holiday.tomb_sweeping_day.value,
        datetime.date(year=2028, month=4, day=29): Holiday.labour_day.value,
        datetime.date(year=2028, month=4, day=30): Holiday.labour_day.value,
        datetime.date(year=2028, month=5, day=1): Holiday.labour_day.value,
        datetime.date(year=2028, month=5, day=2): Holiday.labour_day.value,
        datetime.date(year=2028, month=5, day=3): Holiday.labour_day.value,
        datetime.date(year=2028, month=6, day=25): Holiday.dragon_boat_festival.value,
        datetime.date(year=2028, month=6, day=26): Holiday.dragon_boat_festival.value,
        datetime.date(year=2028, month=6, day=27): Holiday.dragon_boat_festival.value,
        datetime.date(year=2028, month=10, day=1): Holiday.national_day.value,
        datetime.date(year=2028, month=10, day=2): Holiday.national_day.value,
        datetime.date(year=2028, month=10, day=3): Holiday.mid_autumn_festival.value,
        datetime.date(year=2028, month=10, day=4): Holiday.national_day.value,
        datetime.date(year=2028, month=10, day=5): Holiday.national_day.value,
        datetime.date(year=2028, month=10, day=6): Holiday.national_day.value,
        datetime.date(year=2028, month=10, day=7): Holiday.national_day.value,
        datetime.date(year=2028, month=10, day=8): Holiday.national_day.value,
        # todo: 2029年节假日根据农历预测，具体以国务院通知为准
        datetime.date(year=2028, month=12, day=31): Holiday.new_years_day.value,
        datetime.date(year=2029, month=1, day=1): Holiday.new_years_day.value,
        datetime.date(year=2029, month=1, day=2): Holiday.new_years_day.value,
        datetime.date(year=2029, month=2, day=12): Holiday.spring_festival.value,
        datetime.date(year=2029, month=2, day=13): Holiday.spring_festival.value,
        datetime.date(year=2029, month=2, day=14): Holiday.spring_festival.value,
        datetime.date(year=2029, month=2, day=15): Holiday.spring_festival.value,
        datetime.date(year=2029, month=2, day=16): Holiday.spring_festival.value,
        datetime.date(year=2029, month=2, day=17): Holiday.spring_festival.value,
        datetime.date(year=2029, month=2, day=18): Holiday.spring_festival.value,
        datetime.date(year=2029, month=2, day=19): Holiday.spring_festival.value,
        datetime.date(year=2029, month=4, day=4): Holiday.tomb_sweeping_day.value,
        datetime.date(year=2029, month=4, day=28): Holiday.labour_day.value,
        datetime.date(year=2029, month=4, day=29): Holiday.labour_day.value,
        datetime.date(year=2029, month=4, day=30): Holiday.labour_day.value,
        datetime.date(year=2029, month=5, day=1): Holiday.labour_day.value,
        datetime.date(year=2029, month=5, day=2): Holiday.labour_day.value,
        datetime.date(year=2029, month=6, day=16): Holiday.dragon_boat_festival.value,
        datetime.date(year=2029, month=6, day=17): Holiday.dragon_boat_festival.value,
        datetime.date(year=2029, month=6, day=18): Holiday.dragon_boat_festival.value,
        datetime.date(year=2029, month=9, day=21): Holiday.mid_autumn_festival.value,
        datetime.date(year=2029, month=9, day=22): Holiday.mid_autumn_festival.value,
        datetime.date(year=2029, month=9, day=23): Holiday.mid_autumn_festival.value,
        datetime.date(year=2029, month=10, day=1): Holiday.national_day.value,
        datetime.date(year=2029, month=10, day=2): Holiday.national_day.value,
        datetime.date(year=2029, month=10, day=3): Holiday.mid_autumn_festival.value,
        datetime.date(year=2029, month=10, day=4): Holiday.national_day.value,
        datetime.date(year=2029, month=10, day=5): Holiday.national_day.value,
        datetime.date(year=2029, month=10, day=6): Holiday.national_day.value,
        datetime.date(year=2029, month=10, day=7): Holiday.national_day.value,
        # todo: 2030年节假日根据农历预测，具体以国务院通知为准
        datetime.date(year=2029, month=12, day=30): Holiday.new_years_day.value,
        datetime.date(year=2029, month=12, day=31): Holiday.new_years_day.value,
        datetime.date(year=2030, month=1, day=1): Holiday.new_years_day.value,
        datetime.date(year=2030, month=2, day=2): Holiday.spring_festival.value,
        datetime.date(year=2030, month=2, day=3): Holiday.spring_festival.value,
        datetime.date(year=2030, month=2, day=4): Holiday.spring_festival.value,
        datetime.date(year=2030, month=2, day=5): Holiday.spring_festival.value,
        datetime.date(year=2030, month=2, day=6): Holiday.spring_festival.value,
        datetime.date(year=2030, month=2, day=7): Holiday.spring_festival.value,
        datetime.date(year=2030, month=2, day=8): Holiday.spring_festival.value,
        datetime.date(year=2030, month=2, day=9): Holiday.spring_festival.value,
        datetime.date(year=2030, month=4, day=5): Holiday.tomb_sweeping_day.value,
        datetime.date(year=2030, month=4, day=6): Holiday.tomb_sweeping_day.value,
        datetime.date(year=2030, month=4, day=7): Holiday.tomb_sweeping_day.value,
        datetime.date(year=2030, month=5, day=1): Holiday.labour_day.value,
        datetime.date(year=2030, month=5, day=2): Holiday.labour_day.value,
        datetime.date(year=2030, month=5, day=3): Holiday.labour_day.value,
        datetime.date(year=2030, month=5, day=4): Holiday.labour_day.value,
        datetime.date(year=2030, month=5, day=5): Holiday.labour_day.value,
        datetime.date(year=2030, month=6, day=5): Holiday.dragon_boat_festival.value,
        datetime.date(year=2030, month=9, day=12): Holiday.mid_autumn_festival.value,
        datetime.date(year=2030, month=9, day=13): Holiday.mid_autumn_festival.value,
        datetime.date(year=2030, month=9, day=14): Holiday.mid_autumn_festival.value,
        datetime.date(year=2030, month=10, day=1): Holiday.national_day.value,
        datetime.date(year=2030, month=10, day=2): Holiday.national_day.value,
        datetime.date(year=2030, month=10, day=3): Holiday.national_day.value,
        datetime.date(year=2030, month=10, day=4): Holiday.national_day.value,
        datetime.date(year=2030, month=10, day=5): Holiday.national_day.value,
        datetime.date(year=2030, month=10, day=6): Holiday.national_day.value,
        datetime.date(year=2030, month=10, day=7): Holiday.national_day.value,
    }

    def __init__(self):
        super().__init__()
        self.holidays = set(self.holidays_dict.keys())


# 单例
CN_CALENDAR = ChineseCalendar()
