about summary refs log tree commit diff
path: root/third_party/abseil_cpp/absl/time/internal/cctz/include
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/abseil_cpp/absl/time/internal/cctz/include')
-rw-r--r--third_party/abseil_cpp/absl/time/internal/cctz/include/cctz/civil_time.h332
-rw-r--r--third_party/abseil_cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h632
-rw-r--r--third_party/abseil_cpp/absl/time/internal/cctz/include/cctz/time_zone.h386
-rw-r--r--third_party/abseil_cpp/absl/time/internal/cctz/include/cctz/zone_info_source.h102
4 files changed, 0 insertions, 1452 deletions
diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/include/cctz/civil_time.h b/third_party/abseil_cpp/absl/time/internal/cctz/include/cctz/civil_time.h
deleted file mode 100644
index d47ff86fe4..0000000000
--- a/third_party/abseil_cpp/absl/time/internal/cctz/include/cctz/civil_time.h
+++ /dev/null
@@ -1,332 +0,0 @@
-// Copyright 2016 Google Inc. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//   https://www.apache.org/licenses/LICENSE-2.0
-//
-//   Unless required by applicable law or agreed to in writing, software
-//   distributed under the License is distributed on an "AS IS" BASIS,
-//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//   See the License for the specific language governing permissions and
-//   limitations under the License.
-
-#ifndef ABSL_TIME_INTERNAL_CCTZ_CIVIL_TIME_H_
-#define ABSL_TIME_INTERNAL_CCTZ_CIVIL_TIME_H_
-
-#include "absl/base/config.h"
-#include "absl/time/internal/cctz/include/cctz/civil_time_detail.h"
-
-namespace absl {
-ABSL_NAMESPACE_BEGIN
-namespace time_internal {
-namespace cctz {
-
-// The term "civil time" refers to the legally recognized human-scale time
-// that is represented by the six fields YYYY-MM-DD hh:mm:ss. Modern-day civil
-// time follows the Gregorian Calendar and is a time-zone-independent concept.
-// A "date" is perhaps the most common example of a civil time (represented in
-// this library as cctz::civil_day). This library provides six classes and a
-// handful of functions that help with rounding, iterating, and arithmetic on
-// civil times while avoiding complications like daylight-saving time (DST).
-//
-// The following six classes form the core of this civil-time library:
-//
-//   * civil_second
-//   * civil_minute
-//   * civil_hour
-//   * civil_day
-//   * civil_month
-//   * civil_year
-//
-// Each class is a simple value type with the same interface for construction
-// and the same six accessors for each of the civil fields (year, month, day,
-// hour, minute, and second, aka YMDHMS). These classes differ only in their
-// alignment, which is indicated by the type name and specifies the field on
-// which arithmetic operates.
-//
-// Each class can be constructed by passing up to six optional integer
-// arguments representing the YMDHMS fields (in that order) to the
-// constructor. Omitted fields are assigned their minimum valid value. Hours,
-// minutes, and seconds will be set to 0, month and day will be set to 1, and
-// since there is no minimum valid year, it will be set to 1970. So, a
-// default-constructed civil-time object will have YMDHMS fields representing
-// "1970-01-01 00:00:00". Fields that are out-of-range are normalized (e.g.,
-// October 32 -> November 1) so that all civil-time objects represent valid
-// values.
-//
-// Each civil-time class is aligned to the civil-time field indicated in the
-// class's name after normalization. Alignment is performed by setting all the
-// inferior fields to their minimum valid value (as described above). The
-// following are examples of how each of the six types would align the fields
-// representing November 22, 2015 at 12:34:56 in the afternoon. (Note: the
-// string format used here is not important; it's just a shorthand way of
-// showing the six YMDHMS fields.)
-//
-//   civil_second  2015-11-22 12:34:56
-//   civil_minute  2015-11-22 12:34:00
-//   civil_hour    2015-11-22 12:00:00
-//   civil_day     2015-11-22 00:00:00
-//   civil_month   2015-11-01 00:00:00
-//   civil_year    2015-01-01 00:00:00
-//
-// Each civil-time type performs arithmetic on the field to which it is
-// aligned. This means that adding 1 to a civil_day increments the day field
-// (normalizing as necessary), and subtracting 7 from a civil_month operates
-// on the month field (normalizing as necessary). All arithmetic produces a
-// valid civil time. Difference requires two similarly aligned civil-time
-// objects and returns the scalar answer in units of the objects' alignment.
-// For example, the difference between two civil_hour objects will give an
-// answer in units of civil hours.
-//
-// In addition to the six civil-time types just described, there are
-// a handful of helper functions and algorithms for performing common
-// calculations. These are described below.
-//
-// Note: In C++14 and later, this library is usable in a constexpr context.
-//
-// CONSTRUCTION:
-//
-// Each of the civil-time types can be constructed in two ways: by directly
-// passing to the constructor up to six (optional) integers representing the
-// YMDHMS fields, or by copying the YMDHMS fields from a differently aligned
-// civil-time type.
-//
-//   civil_day default_value;  // 1970-01-01 00:00:00
-//
-//   civil_day a(2015, 2, 3);           // 2015-02-03 00:00:00
-//   civil_day b(2015, 2, 3, 4, 5, 6);  // 2015-02-03 00:00:00
-//   civil_day c(2015);                 // 2015-01-01 00:00:00
-//
-//   civil_second ss(2015, 2, 3, 4, 5, 6);  // 2015-02-03 04:05:06
-//   civil_minute mm(ss);                   // 2015-02-03 04:05:00
-//   civil_hour hh(mm);                     // 2015-02-03 04:00:00
-//   civil_day d(hh);                       // 2015-02-03 00:00:00
-//   civil_month m(d);                      // 2015-02-01 00:00:00
-//   civil_year y(m);                       // 2015-01-01 00:00:00
-//
-//   m = civil_month(y);     // 2015-01-01 00:00:00
-//   d = civil_day(m);       // 2015-01-01 00:00:00
-//   hh = civil_hour(d);     // 2015-01-01 00:00:00
-//   mm = civil_minute(hh);  // 2015-01-01 00:00:00
-//   ss = civil_second(mm);  // 2015-01-01 00:00:00
-//
-// ALIGNMENT CONVERSION:
-//
-// The alignment of a civil-time object cannot change, but the object may be
-// used to construct a new object with a different alignment. This is referred
-// to as "realigning". When realigning to a type with the same or more
-// precision (e.g., civil_day -> civil_second), the conversion may be
-// performed implicitly since no information is lost. However, if information
-// could be discarded (e.g., civil_second -> civil_day), the conversion must
-// be explicit at the call site.
-//
-//   void fun(const civil_day& day);
-//
-//   civil_second cs;
-//   fun(cs);  // Won't compile because data may be discarded
-//   fun(civil_day(cs));  // OK: explicit conversion
-//
-//   civil_day cd;
-//   fun(cd);  // OK: no conversion needed
-//
-//   civil_month cm;
-//   fun(cm);  // OK: implicit conversion to civil_day
-//
-// NORMALIZATION:
-//
-// Integer arguments passed to the constructor may be out-of-range, in which
-// case they are normalized to produce a valid civil-time object. This enables
-// natural arithmetic on constructor arguments without worrying about the
-// field's range. Normalization guarantees that there are no invalid
-// civil-time objects.
-//
-//   civil_day d(2016, 10, 32);  // Out-of-range day; normalized to 2016-11-01
-//
-// Note: If normalization is undesired, you can signal an error by comparing
-// the constructor arguments to the normalized values returned by the YMDHMS
-// properties.
-//
-// PROPERTIES:
-//
-// All civil-time types have accessors for all six of the civil-time fields:
-// year, month, day, hour, minute, and second. Recall that fields inferior to
-// the type's alignment will be set to their minimum valid value.
-//
-//   civil_day d(2015, 6, 28);
-//   // d.year() == 2015
-//   // d.month() == 6
-//   // d.day() == 28
-//   // d.hour() == 0
-//   // d.minute() == 0
-//   // d.second() == 0
-//
-// COMPARISON:
-//
-// Comparison always considers all six YMDHMS fields, regardless of the type's
-// alignment. Comparison between differently aligned civil-time types is
-// allowed.
-//
-//   civil_day feb_3(2015, 2, 3);  // 2015-02-03 00:00:00
-//   civil_day mar_4(2015, 3, 4);  // 2015-03-04 00:00:00
-//   // feb_3 < mar_4
-//   // civil_year(feb_3) == civil_year(mar_4)
-//
-//   civil_second feb_3_noon(2015, 2, 3, 12, 0, 0);  // 2015-02-03 12:00:00
-//   // feb_3 < feb_3_noon
-//   // feb_3 == civil_day(feb_3_noon)
-//
-//   // Iterates all the days of February 2015.
-//   for (civil_day d(2015, 2, 1); d < civil_month(2015, 3); ++d) {
-//     // ...
-//   }
-//
-// STREAMING:
-//
-// Each civil-time type may be sent to an output stream using operator<<().
-// The output format follows the pattern "YYYY-MM-DDThh:mm:ss" where fields
-// inferior to the type's alignment are omitted.
-//
-//   civil_second cs(2015, 2, 3, 4, 5, 6);
-//   std::cout << cs << "\n";  // Outputs: 2015-02-03T04:05:06
-//
-//   civil_day cd(cs);
-//   std::cout << cd << "\n";  // Outputs: 2015-02-03
-//
-//   civil_year cy(cs);
-//   std::cout << cy << "\n";  // Outputs: 2015
-//
-// ARITHMETIC:
-//
-// Civil-time types support natural arithmetic operators such as addition,
-// subtraction, and difference. Arithmetic operates on the civil-time field
-// indicated in the type's name. Difference requires arguments with the same
-// alignment and returns the answer in units of the alignment.
-//
-//   civil_day a(2015, 2, 3);
-//   ++a;                         // 2015-02-04 00:00:00
-//   --a;                         // 2015-02-03 00:00:00
-//   civil_day b = a + 1;         // 2015-02-04 00:00:00
-//   civil_day c = 1 + b;         // 2015-02-05 00:00:00
-//   int n = c - a;               // n = 2 (civil days)
-//   int m = c - civil_month(c);  // Won't compile: different types.
-//
-// EXAMPLE: Adding a month to January 31.
-//
-// One of the classic questions that arises when considering a civil-time
-// library (or a date library or a date/time library) is this: "What happens
-// when you add a month to January 31?" This is an interesting question
-// because there could be a number of possible answers:
-//
-//   1. March 3 (or 2 if a leap year). This may make sense if the operation
-//      wants the equivalent of February 31.
-//   2. February 28 (or 29 if a leap year). This may make sense if the operation
-//      wants the last day of January to go to the last day of February.
-//   3. Error. The caller may get some error, an exception, an invalid date
-//      object, or maybe false is returned. This may make sense because there is
-//      no single unambiguously correct answer to the question.
-//
-// Practically speaking, any answer that is not what the programmer intended
-// is the wrong answer.
-//
-// This civil-time library avoids the problem by making it impossible to ask
-// ambiguous questions. All civil-time objects are aligned to a particular
-// civil-field boundary (such as aligned to a year, month, day, hour, minute,
-// or second), and arithmetic operates on the field to which the object is
-// aligned. This means that in order to "add a month" the object must first be
-// aligned to a month boundary, which is equivalent to the first day of that
-// month.
-//
-// Of course, there are ways to compute an answer the question at hand using
-// this civil-time library, but they require the programmer to be explicit
-// about the answer they expect. To illustrate, let's see how to compute all
-// three of the above possible answers to the question of "Jan 31 plus 1
-// month":
-//
-//   const civil_day d(2015, 1, 31);
-//
-//   // Answer 1:
-//   // Add 1 to the month field in the constructor, and rely on normalization.
-//   const auto ans_normalized = civil_day(d.year(), d.month() + 1, d.day());
-//   // ans_normalized == 2015-03-03 (aka Feb 31)
-//
-//   // Answer 2:
-//   // Add 1 to month field, capping to the end of next month.
-//   const auto next_month = civil_month(d) + 1;
-//   const auto last_day_of_next_month = civil_day(next_month + 1) - 1;
-//   const auto ans_capped = std::min(ans_normalized, last_day_of_next_month);
-//   // ans_capped == 2015-02-28
-//
-//   // Answer 3:
-//   // Signal an error if the normalized answer is not in next month.
-//   if (civil_month(ans_normalized) != next_month) {
-//     // error, month overflow
-//   }
-//
-using civil_year = detail::civil_year;
-using civil_month = detail::civil_month;
-using civil_day = detail::civil_day;
-using civil_hour = detail::civil_hour;
-using civil_minute = detail::civil_minute;
-using civil_second = detail::civil_second;
-
-// An enum class with members monday, tuesday, wednesday, thursday, friday,
-// saturday, and sunday. These enum values may be sent to an output stream
-// using operator<<(). The result is the full weekday name in English with a
-// leading capital letter.
-//
-//   weekday wd = weekday::thursday;
-//   std::cout << wd << "\n";  // Outputs: Thursday
-//
-using detail::weekday;
-
-// Returns the weekday for the given civil-time value.
-//
-//   civil_day a(2015, 8, 13);
-//   weekday wd = get_weekday(a);  // wd == weekday::thursday
-//
-using detail::get_weekday;
-
-// Returns the civil_day that strictly follows or precedes the given
-// civil_day, and that falls on the given weekday.
-//
-// For example, given:
-//
-//     August 2015
-// Su Mo Tu We Th Fr Sa
-//                    1
-//  2  3  4  5  6  7  8
-//  9 10 11 12 13 14 15
-// 16 17 18 19 20 21 22
-// 23 24 25 26 27 28 29
-// 30 31
-//
-//   civil_day a(2015, 8, 13);  // get_weekday(a) == weekday::thursday
-//   civil_day b = next_weekday(a, weekday::thursday);  // b = 2015-08-20
-//   civil_day c = prev_weekday(a, weekday::thursday);  // c = 2015-08-06
-//
-//   civil_day d = ...
-//   // Gets the following Thursday if d is not already Thursday
-//   civil_day thurs1 = next_weekday(d - 1, weekday::thursday);
-//   // Gets the previous Thursday if d is not already Thursday
-//   civil_day thurs2 = prev_weekday(d + 1, weekday::thursday);
-//
-using detail::next_weekday;
-using detail::prev_weekday;
-
-// Returns the day-of-year for the given civil-time value.
-//
-//   civil_day a(2015, 1, 1);
-//   int yd_jan_1 = get_yearday(a);   // yd_jan_1 = 1
-//   civil_day b(2015, 12, 31);
-//   int yd_dec_31 = get_yearday(b);  // yd_dec_31 = 365
-//
-using detail::get_yearday;
-
-}  // namespace cctz
-}  // namespace time_internal
-ABSL_NAMESPACE_END
-}  // namespace absl
-
-#endif  // ABSL_TIME_INTERNAL_CCTZ_CIVIL_TIME_H_
diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h b/third_party/abseil_cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h
deleted file mode 100644
index d1b4222b1f..0000000000
--- a/third_party/abseil_cpp/absl/time/internal/cctz/include/cctz/civil_time_detail.h
+++ /dev/null
@@ -1,632 +0,0 @@
-// Copyright 2016 Google Inc. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//   https://www.apache.org/licenses/LICENSE-2.0
-//
-//   Unless required by applicable law or agreed to in writing, software
-//   distributed under the License is distributed on an "AS IS" BASIS,
-//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//   See the License for the specific language governing permissions and
-//   limitations under the License.
-
-#ifndef ABSL_TIME_INTERNAL_CCTZ_CIVIL_TIME_DETAIL_H_
-#define ABSL_TIME_INTERNAL_CCTZ_CIVIL_TIME_DETAIL_H_
-
-#include <cstdint>
-#include <limits>
-#include <ostream>
-#include <type_traits>
-
-#include "absl/base/config.h"
-
-// Disable constexpr support unless we are in C++14 mode.
-#if __cpp_constexpr >= 201304 || (defined(_MSC_VER) && _MSC_VER >= 1910)
-#define CONSTEXPR_D constexpr  // data
-#define CONSTEXPR_F constexpr  // function
-#define CONSTEXPR_M constexpr  // member
-#else
-#define CONSTEXPR_D const
-#define CONSTEXPR_F inline
-#define CONSTEXPR_M
-#endif
-
-namespace absl {
-ABSL_NAMESPACE_BEGIN
-namespace time_internal {
-namespace cctz {
-
-// Support years that at least span the range of 64-bit time_t values.
-using year_t = std::int_fast64_t;
-
-// Type alias that indicates an argument is not normalized (e.g., the
-// constructor parameters and operands/results of addition/subtraction).
-using diff_t = std::int_fast64_t;
-
-namespace detail {
-
-// Type aliases that indicate normalized argument values.
-using month_t = std::int_fast8_t;   // [1:12]
-using day_t = std::int_fast8_t;     // [1:31]
-using hour_t = std::int_fast8_t;    // [0:23]
-using minute_t = std::int_fast8_t;  // [0:59]
-using second_t = std::int_fast8_t;  // [0:59]
-
-// Normalized civil-time fields: Y-M-D HH:MM:SS.
-struct fields {
-  CONSTEXPR_M fields(year_t year, month_t month, day_t day, hour_t hour,
-                     minute_t minute, second_t second)
-      : y(year), m(month), d(day), hh(hour), mm(minute), ss(second) {}
-  std::int_least64_t y;
-  std::int_least8_t m;
-  std::int_least8_t d;
-  std::int_least8_t hh;
-  std::int_least8_t mm;
-  std::int_least8_t ss;
-};
-
-struct second_tag {};
-struct minute_tag : second_tag {};
-struct hour_tag : minute_tag {};
-struct day_tag : hour_tag {};
-struct month_tag : day_tag {};
-struct year_tag : month_tag {};
-
-////////////////////////////////////////////////////////////////////////
-
-// Field normalization (without avoidable overflow).
-
-namespace impl {
-
-CONSTEXPR_F bool is_leap_year(year_t y) noexcept {
-  return y % 4 == 0 && (y % 100 != 0 || y % 400 == 0);
-}
-CONSTEXPR_F int year_index(year_t y, month_t m) noexcept {
-  return (static_cast<int>((y + (m > 2)) % 400) + 400) % 400;
-}
-CONSTEXPR_F int days_per_century(year_t y, month_t m) noexcept {
-  const int yi = year_index(y, m);
-  return 36524 + (yi == 0 || yi > 300);
-}
-CONSTEXPR_F int days_per_4years(year_t y, month_t m) noexcept {
-  const int yi = year_index(y, m);
-  return 1460 + (yi == 0 || yi > 300 || (yi - 1) % 100 < 96);
-}
-CONSTEXPR_F int days_per_year(year_t y, month_t m) noexcept {
-  return is_leap_year(y + (m > 2)) ? 366 : 365;
-}
-CONSTEXPR_F int days_per_month(year_t y, month_t m) noexcept {
-  CONSTEXPR_D int k_days_per_month[1 + 12] = {
-      -1, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31  // non leap year
-  };
-  return k_days_per_month[m] + (m == 2 && is_leap_year(y));
-}
-
-CONSTEXPR_F fields n_day(year_t y, month_t m, diff_t d, diff_t cd, hour_t hh,
-                         minute_t mm, second_t ss) noexcept {
-  year_t ey = y % 400;
-  const year_t oey = ey;
-  ey += (cd / 146097) * 400;
-  cd %= 146097;
-  if (cd < 0) {
-    ey -= 400;
-    cd += 146097;
-  }
-  ey += (d / 146097) * 400;
-  d = d % 146097 + cd;
-  if (d > 0) {
-    if (d > 146097) {
-      ey += 400;
-      d -= 146097;
-    }
-  } else {
-    if (d > -365) {
-      // We often hit the previous year when stepping a civil time backwards,
-      // so special case it to avoid counting up by 100/4/1-year chunks.
-      ey -= 1;
-      d += days_per_year(ey, m);
-    } else {
-      ey -= 400;
-      d += 146097;
-    }
-  }
-  if (d > 365) {
-    for (;;) {
-      int n = days_per_century(ey, m);
-      if (d <= n) break;
-      d -= n;
-      ey += 100;
-    }
-    for (;;) {
-      int n = days_per_4years(ey, m);
-      if (d <= n) break;
-      d -= n;
-      ey += 4;
-    }
-    for (;;) {
-      int n = days_per_year(ey, m);
-      if (d <= n) break;
-      d -= n;
-      ++ey;
-    }
-  }
-  if (d > 28) {
-    for (;;) {
-      int n = days_per_month(ey, m);
-      if (d <= n) break;
-      d -= n;
-      if (++m > 12) {
-        ++ey;
-        m = 1;
-      }
-    }
-  }
-  return fields(y + (ey - oey), m, static_cast<day_t>(d), hh, mm, ss);
-}
-CONSTEXPR_F fields n_mon(year_t y, diff_t m, diff_t d, diff_t cd, hour_t hh,
-                         minute_t mm, second_t ss) noexcept {
-  if (m != 12) {
-    y += m / 12;
-    m %= 12;
-    if (m <= 0) {
-      y -= 1;
-      m += 12;
-    }
-  }
-  return n_day(y, static_cast<month_t>(m), d, cd, hh, mm, ss);
-}
-CONSTEXPR_F fields n_hour(year_t y, diff_t m, diff_t d, diff_t cd, diff_t hh,
-                          minute_t mm, second_t ss) noexcept {
-  cd += hh / 24;
-  hh %= 24;
-  if (hh < 0) {
-    cd -= 1;
-    hh += 24;
-  }
-  return n_mon(y, m, d, cd, static_cast<hour_t>(hh), mm, ss);
-}
-CONSTEXPR_F fields n_min(year_t y, diff_t m, diff_t d, diff_t hh, diff_t ch,
-                         diff_t mm, second_t ss) noexcept {
-  ch += mm / 60;
-  mm %= 60;
-  if (mm < 0) {
-    ch -= 1;
-    mm += 60;
-  }
-  return n_hour(y, m, d, hh / 24 + ch / 24, hh % 24 + ch % 24,
-                static_cast<minute_t>(mm), ss);
-}
-CONSTEXPR_F fields n_sec(year_t y, diff_t m, diff_t d, diff_t hh, diff_t mm,
-                         diff_t ss) noexcept {
-  // Optimization for when (non-constexpr) fields are already normalized.
-  if (0 <= ss && ss < 60) {
-    const second_t nss = static_cast<second_t>(ss);
-    if (0 <= mm && mm < 60) {
-      const minute_t nmm = static_cast<minute_t>(mm);
-      if (0 <= hh && hh < 24) {
-        const hour_t nhh = static_cast<hour_t>(hh);
-        if (1 <= d && d <= 28 && 1 <= m && m <= 12) {
-          const day_t nd = static_cast<day_t>(d);
-          const month_t nm = static_cast<month_t>(m);
-          return fields(y, nm, nd, nhh, nmm, nss);
-        }
-        return n_mon(y, m, d, 0, nhh, nmm, nss);
-      }
-      return n_hour(y, m, d, hh / 24, hh % 24, nmm, nss);
-    }
-    return n_min(y, m, d, hh, mm / 60, mm % 60, nss);
-  }
-  diff_t cm = ss / 60;
-  ss %= 60;
-  if (ss < 0) {
-    cm -= 1;
-    ss += 60;
-  }
-  return n_min(y, m, d, hh, mm / 60 + cm / 60, mm % 60 + cm % 60,
-               static_cast<second_t>(ss));
-}
-
-}  // namespace impl
-
-////////////////////////////////////////////////////////////////////////
-
-// Increments the indicated (normalized) field by "n".
-CONSTEXPR_F fields step(second_tag, fields f, diff_t n) noexcept {
-  return impl::n_sec(f.y, f.m, f.d, f.hh, f.mm + n / 60, f.ss + n % 60);
-}
-CONSTEXPR_F fields step(minute_tag, fields f, diff_t n) noexcept {
-  return impl::n_min(f.y, f.m, f.d, f.hh + n / 60, 0, f.mm + n % 60, f.ss);
-}
-CONSTEXPR_F fields step(hour_tag, fields f, diff_t n) noexcept {
-  return impl::n_hour(f.y, f.m, f.d + n / 24, 0, f.hh + n % 24, f.mm, f.ss);
-}
-CONSTEXPR_F fields step(day_tag, fields f, diff_t n) noexcept {
-  return impl::n_day(f.y, f.m, f.d, n, f.hh, f.mm, f.ss);
-}
-CONSTEXPR_F fields step(month_tag, fields f, diff_t n) noexcept {
-  return impl::n_mon(f.y + n / 12, f.m + n % 12, f.d, 0, f.hh, f.mm, f.ss);
-}
-CONSTEXPR_F fields step(year_tag, fields f, diff_t n) noexcept {
-  return fields(f.y + n, f.m, f.d, f.hh, f.mm, f.ss);
-}
-
-////////////////////////////////////////////////////////////////////////
-
-namespace impl {
-
-// Returns (v * f + a) but avoiding intermediate overflow when possible.
-CONSTEXPR_F diff_t scale_add(diff_t v, diff_t f, diff_t a) noexcept {
-  return (v < 0) ? ((v + 1) * f + a) - f : ((v - 1) * f + a) + f;
-}
-
-// Map a (normalized) Y/M/D to the number of days before/after 1970-01-01.
-// Probably overflows for years outside [-292277022656:292277026595].
-CONSTEXPR_F diff_t ymd_ord(year_t y, month_t m, day_t d) noexcept {
-  const diff_t eyear = (m <= 2) ? y - 1 : y;
-  const diff_t era = (eyear >= 0 ? eyear : eyear - 399) / 400;
-  const diff_t yoe = eyear - era * 400;
-  const diff_t doy = (153 * (m + (m > 2 ? -3 : 9)) + 2) / 5 + d - 1;
-  const diff_t doe = yoe * 365 + yoe / 4 - yoe / 100 + doy;
-  return era * 146097 + doe - 719468;
-}
-
-// Returns the difference in days between two normalized Y-M-D tuples.
-// ymd_ord() will encounter integer overflow given extreme year values,
-// yet the difference between two such extreme values may actually be
-// small, so we take a little care to avoid overflow when possible by
-// exploiting the 146097-day cycle.
-CONSTEXPR_F diff_t day_difference(year_t y1, month_t m1, day_t d1, year_t y2,
-                                  month_t m2, day_t d2) noexcept {
-  const diff_t a_c4_off = y1 % 400;
-  const diff_t b_c4_off = y2 % 400;
-  diff_t c4_diff = (y1 - a_c4_off) - (y2 - b_c4_off);
-  diff_t delta = ymd_ord(a_c4_off, m1, d1) - ymd_ord(b_c4_off, m2, d2);
-  if (c4_diff > 0 && delta < 0) {
-    delta += 2 * 146097;
-    c4_diff -= 2 * 400;
-  } else if (c4_diff < 0 && delta > 0) {
-    delta -= 2 * 146097;
-    c4_diff += 2 * 400;
-  }
-  return (c4_diff / 400 * 146097) + delta;
-}
-
-}  // namespace impl
-
-// Returns the difference between fields structs using the indicated unit.
-CONSTEXPR_F diff_t difference(year_tag, fields f1, fields f2) noexcept {
-  return f1.y - f2.y;
-}
-CONSTEXPR_F diff_t difference(month_tag, fields f1, fields f2) noexcept {
-  return impl::scale_add(difference(year_tag{}, f1, f2), 12, (f1.m - f2.m));
-}
-CONSTEXPR_F diff_t difference(day_tag, fields f1, fields f2) noexcept {
-  return impl::day_difference(f1.y, f1.m, f1.d, f2.y, f2.m, f2.d);
-}
-CONSTEXPR_F diff_t difference(hour_tag, fields f1, fields f2) noexcept {
-  return impl::scale_add(difference(day_tag{}, f1, f2), 24, (f1.hh - f2.hh));
-}
-CONSTEXPR_F diff_t difference(minute_tag, fields f1, fields f2) noexcept {
-  return impl::scale_add(difference(hour_tag{}, f1, f2), 60, (f1.mm - f2.mm));
-}
-CONSTEXPR_F diff_t difference(second_tag, fields f1, fields f2) noexcept {
-  return impl::scale_add(difference(minute_tag{}, f1, f2), 60, f1.ss - f2.ss);
-}
-
-////////////////////////////////////////////////////////////////////////
-
-// Aligns the (normalized) fields struct to the indicated field.
-CONSTEXPR_F fields align(second_tag, fields f) noexcept { return f; }
-CONSTEXPR_F fields align(minute_tag, fields f) noexcept {
-  return fields{f.y, f.m, f.d, f.hh, f.mm, 0};
-}
-CONSTEXPR_F fields align(hour_tag, fields f) noexcept {
-  return fields{f.y, f.m, f.d, f.hh, 0, 0};
-}
-CONSTEXPR_F fields align(day_tag, fields f) noexcept {
-  return fields{f.y, f.m, f.d, 0, 0, 0};
-}
-CONSTEXPR_F fields align(month_tag, fields f) noexcept {
-  return fields{f.y, f.m, 1, 0, 0, 0};
-}
-CONSTEXPR_F fields align(year_tag, fields f) noexcept {
-  return fields{f.y, 1, 1, 0, 0, 0};
-}
-
-////////////////////////////////////////////////////////////////////////
-
-namespace impl {
-
-template <typename H>
-H AbslHashValueImpl(second_tag, H h, fields f) {
-  return H::combine(std::move(h), f.y, f.m, f.d, f.hh, f.mm, f.ss);
-}
-template <typename H>
-H AbslHashValueImpl(minute_tag, H h, fields f) {
-  return H::combine(std::move(h), f.y, f.m, f.d, f.hh, f.mm);
-}
-template <typename H>
-H AbslHashValueImpl(hour_tag, H h, fields f) {
-  return H::combine(std::move(h), f.y, f.m, f.d, f.hh);
-}
-template <typename H>
-H AbslHashValueImpl(day_tag, H h, fields f) {
-  return H::combine(std::move(h), f.y, f.m, f.d);
-}
-template <typename H>
-H AbslHashValueImpl(month_tag, H h, fields f) {
-  return H::combine(std::move(h), f.y, f.m);
-}
-template <typename H>
-H AbslHashValueImpl(year_tag, H h, fields f) {
-  return H::combine(std::move(h), f.y);
-}
-
-}  // namespace impl
-
-////////////////////////////////////////////////////////////////////////
-
-template <typename T>
-class civil_time {
- public:
-  explicit CONSTEXPR_M civil_time(year_t y, diff_t m = 1, diff_t d = 1,
-                                  diff_t hh = 0, diff_t mm = 0,
-                                  diff_t ss = 0) noexcept
-      : civil_time(impl::n_sec(y, m, d, hh, mm, ss)) {}
-
-  CONSTEXPR_M civil_time() noexcept : f_{1970, 1, 1, 0, 0, 0} {}
-  civil_time(const civil_time&) = default;
-  civil_time& operator=(const civil_time&) = default;
-
-  // Conversion between civil times of different alignment. Conversion to
-  // a more precise alignment is allowed implicitly (e.g., day -> hour),
-  // but conversion where information is discarded must be explicit
-  // (e.g., second -> minute).
-  template <typename U, typename S>
-  using preserves_data =
-      typename std::enable_if<std::is_base_of<U, S>::value>::type;
-  template <typename U>
-  CONSTEXPR_M civil_time(const civil_time<U>& ct,
-                         preserves_data<T, U>* = nullptr) noexcept
-      : civil_time(ct.f_) {}
-  template <typename U>
-  explicit CONSTEXPR_M civil_time(const civil_time<U>& ct,
-                                  preserves_data<U, T>* = nullptr) noexcept
-      : civil_time(ct.f_) {}
-
-  // Factories for the maximum/minimum representable civil_time.
-  static CONSTEXPR_F civil_time(max)() {
-    const auto max_year = (std::numeric_limits<std::int_least64_t>::max)();
-    return civil_time(max_year, 12, 31, 23, 59, 59);
-  }
-  static CONSTEXPR_F civil_time(min)() {
-    const auto min_year = (std::numeric_limits<std::int_least64_t>::min)();
-    return civil_time(min_year, 1, 1, 0, 0, 0);
-  }
-
-  // Field accessors.  Note: All but year() return an int.
-  CONSTEXPR_M year_t year() const noexcept { return f_.y; }
-  CONSTEXPR_M int month() const noexcept { return f_.m; }
-  CONSTEXPR_M int day() const noexcept { return f_.d; }
-  CONSTEXPR_M int hour() const noexcept { return f_.hh; }
-  CONSTEXPR_M int minute() const noexcept { return f_.mm; }
-  CONSTEXPR_M int second() const noexcept { return f_.ss; }
-
-  // Assigning arithmetic.
-  CONSTEXPR_M civil_time& operator+=(diff_t n) noexcept {
-    f_ = step(T{}, f_, n);
-    return *this;
-  }
-  CONSTEXPR_M civil_time& operator-=(diff_t n) noexcept {
-    if (n != (std::numeric_limits<diff_t>::min)()) {
-      f_ = step(T{}, f_, -n);
-    } else {
-      f_ = step(T{}, step(T{}, f_, -(n + 1)), 1);
-    }
-    return *this;
-  }
-  CONSTEXPR_M civil_time& operator++() noexcept { return *this += 1; }
-  CONSTEXPR_M civil_time operator++(int) noexcept {
-    const civil_time a = *this;
-    ++*this;
-    return a;
-  }
-  CONSTEXPR_M civil_time& operator--() noexcept { return *this -= 1; }
-  CONSTEXPR_M civil_time operator--(int) noexcept {
-    const civil_time a = *this;
-    --*this;
-    return a;
-  }
-
-  // Binary arithmetic operators.
-  friend CONSTEXPR_F civil_time operator+(civil_time a, diff_t n) noexcept {
-    return a += n;
-  }
-  friend CONSTEXPR_F civil_time operator+(diff_t n, civil_time a) noexcept {
-    return a += n;
-  }
-  friend CONSTEXPR_F civil_time operator-(civil_time a, diff_t n) noexcept {
-    return a -= n;
-  }
-  friend CONSTEXPR_F diff_t operator-(civil_time lhs, civil_time rhs) noexcept {
-    return difference(T{}, lhs.f_, rhs.f_);
-  }
-
-  template <typename H>
-  friend H AbslHashValue(H h, civil_time a) {
-    return impl::AbslHashValueImpl(T{}, std::move(h), a.f_);
-  }
-
- private:
-  // All instantiations of this template are allowed to call the following
-  // private constructor and access the private fields member.
-  template <typename U>
-  friend class civil_time;
-
-  // The designated constructor that all others eventually call.
-  explicit CONSTEXPR_M civil_time(fields f) noexcept : f_(align(T{}, f)) {}
-
-  fields f_;
-};
-
-// Disallows difference between differently aligned types.
-// auto n = civil_day(...) - civil_hour(...);  // would be confusing.
-template <typename T, typename U>
-CONSTEXPR_F diff_t operator-(civil_time<T>, civil_time<U>) = delete;
-
-using civil_year = civil_time<year_tag>;
-using civil_month = civil_time<month_tag>;
-using civil_day = civil_time<day_tag>;
-using civil_hour = civil_time<hour_tag>;
-using civil_minute = civil_time<minute_tag>;
-using civil_second = civil_time<second_tag>;
-
-////////////////////////////////////////////////////////////////////////
-
-// Relational operators that work with differently aligned objects.
-// Always compares all six fields.
-template <typename T1, typename T2>
-CONSTEXPR_F bool operator<(const civil_time<T1>& lhs,
-                           const civil_time<T2>& rhs) noexcept {
-  return (
-      lhs.year() < rhs.year() ||
-      (lhs.year() == rhs.year() &&
-       (lhs.month() < rhs.month() ||
-        (lhs.month() == rhs.month() &&
-         (lhs.day() < rhs.day() || (lhs.day() == rhs.day() &&
-                                    (lhs.hour() < rhs.hour() ||
-                                     (lhs.hour() == rhs.hour() &&
-                                      (lhs.minute() < rhs.minute() ||
-                                       (lhs.minute() == rhs.minute() &&
-                                        (lhs.second() < rhs.second())))))))))));
-}
-template <typename T1, typename T2>
-CONSTEXPR_F bool operator<=(const civil_time<T1>& lhs,
-                            const civil_time<T2>& rhs) noexcept {
-  return !(rhs < lhs);
-}
-template <typename T1, typename T2>
-CONSTEXPR_F bool operator>=(const civil_time<T1>& lhs,
-                            const civil_time<T2>& rhs) noexcept {
-  return !(lhs < rhs);
-}
-template <typename T1, typename T2>
-CONSTEXPR_F bool operator>(const civil_time<T1>& lhs,
-                           const civil_time<T2>& rhs) noexcept {
-  return rhs < lhs;
-}
-template <typename T1, typename T2>
-CONSTEXPR_F bool operator==(const civil_time<T1>& lhs,
-                            const civil_time<T2>& rhs) noexcept {
-  return lhs.year() == rhs.year() && lhs.month() == rhs.month() &&
-         lhs.day() == rhs.day() && lhs.hour() == rhs.hour() &&
-         lhs.minute() == rhs.minute() && lhs.second() == rhs.second();
-}
-template <typename T1, typename T2>
-CONSTEXPR_F bool operator!=(const civil_time<T1>& lhs,
-                            const civil_time<T2>& rhs) noexcept {
-  return !(lhs == rhs);
-}
-
-////////////////////////////////////////////////////////////////////////
-
-enum class weekday {
-  monday,
-  tuesday,
-  wednesday,
-  thursday,
-  friday,
-  saturday,
-  sunday,
-};
-
-CONSTEXPR_F weekday get_weekday(const civil_second& cs) noexcept {
-  CONSTEXPR_D weekday k_weekday_by_mon_off[13] = {
-      weekday::monday,    weekday::tuesday,  weekday::wednesday,
-      weekday::thursday,  weekday::friday,   weekday::saturday,
-      weekday::sunday,    weekday::monday,   weekday::tuesday,
-      weekday::wednesday, weekday::thursday, weekday::friday,
-      weekday::saturday,
-  };
-  CONSTEXPR_D int k_weekday_offsets[1 + 12] = {
-      -1, 0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4,
-  };
-  year_t wd = 2400 + (cs.year() % 400) - (cs.month() < 3);
-  wd += wd / 4 - wd / 100 + wd / 400;
-  wd += k_weekday_offsets[cs.month()] + cs.day();
-  return k_weekday_by_mon_off[wd % 7 + 6];
-}
-
-////////////////////////////////////////////////////////////////////////
-
-CONSTEXPR_F civil_day next_weekday(civil_day cd, weekday wd) noexcept {
-  CONSTEXPR_D weekday k_weekdays_forw[14] = {
-      weekday::monday,    weekday::tuesday,  weekday::wednesday,
-      weekday::thursday,  weekday::friday,   weekday::saturday,
-      weekday::sunday,    weekday::monday,   weekday::tuesday,
-      weekday::wednesday, weekday::thursday, weekday::friday,
-      weekday::saturday,  weekday::sunday,
-  };
-  weekday base = get_weekday(cd);
-  for (int i = 0;; ++i) {
-    if (base == k_weekdays_forw[i]) {
-      for (int j = i + 1;; ++j) {
-        if (wd == k_weekdays_forw[j]) {
-          return cd + (j - i);
-        }
-      }
-    }
-  }
-}
-
-CONSTEXPR_F civil_day prev_weekday(civil_day cd, weekday wd) noexcept {
-  CONSTEXPR_D weekday k_weekdays_back[14] = {
-      weekday::sunday,   weekday::saturday,  weekday::friday,
-      weekday::thursday, weekday::wednesday, weekday::tuesday,
-      weekday::monday,   weekday::sunday,    weekday::saturday,
-      weekday::friday,   weekday::thursday,  weekday::wednesday,
-      weekday::tuesday,  weekday::monday,
-  };
-  weekday base = get_weekday(cd);
-  for (int i = 0;; ++i) {
-    if (base == k_weekdays_back[i]) {
-      for (int j = i + 1;; ++j) {
-        if (wd == k_weekdays_back[j]) {
-          return cd - (j - i);
-        }
-      }
-    }
-  }
-}
-
-CONSTEXPR_F int get_yearday(const civil_second& cs) noexcept {
-  CONSTEXPR_D int k_month_offsets[1 + 12] = {
-      -1, 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334,
-  };
-  const int feb29 = (cs.month() > 2 && impl::is_leap_year(cs.year()));
-  return k_month_offsets[cs.month()] + feb29 + cs.day();
-}
-
-////////////////////////////////////////////////////////////////////////
-
-std::ostream& operator<<(std::ostream& os, const civil_year& y);
-std::ostream& operator<<(std::ostream& os, const civil_month& m);
-std::ostream& operator<<(std::ostream& os, const civil_day& d);
-std::ostream& operator<<(std::ostream& os, const civil_hour& h);
-std::ostream& operator<<(std::ostream& os, const civil_minute& m);
-std::ostream& operator<<(std::ostream& os, const civil_second& s);
-std::ostream& operator<<(std::ostream& os, weekday wd);
-
-}  // namespace detail
-}  // namespace cctz
-}  // namespace time_internal
-ABSL_NAMESPACE_END
-}  // namespace absl
-
-#undef CONSTEXPR_M
-#undef CONSTEXPR_F
-#undef CONSTEXPR_D
-
-#endif  // ABSL_TIME_INTERNAL_CCTZ_CIVIL_TIME_DETAIL_H_
diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/include/cctz/time_zone.h b/third_party/abseil_cpp/absl/time/internal/cctz/include/cctz/time_zone.h
deleted file mode 100644
index 5562a37bc8..0000000000
--- a/third_party/abseil_cpp/absl/time/internal/cctz/include/cctz/time_zone.h
+++ /dev/null
@@ -1,386 +0,0 @@
-// Copyright 2016 Google Inc. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//   https://www.apache.org/licenses/LICENSE-2.0
-//
-//   Unless required by applicable law or agreed to in writing, software
-//   distributed under the License is distributed on an "AS IS" BASIS,
-//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//   See the License for the specific language governing permissions and
-//   limitations under the License.
-
-// A library for translating between absolute times (represented by
-// std::chrono::time_points of the std::chrono::system_clock) and civil
-// times (represented by cctz::civil_second) using the rules defined by
-// a time zone (cctz::time_zone).
-
-#ifndef ABSL_TIME_INTERNAL_CCTZ_TIME_ZONE_H_
-#define ABSL_TIME_INTERNAL_CCTZ_TIME_ZONE_H_
-
-#include <chrono>
-#include <cstdint>
-#include <string>
-#include <utility>
-
-#include "absl/base/config.h"
-#include "absl/time/internal/cctz/include/cctz/civil_time.h"
-
-namespace absl {
-ABSL_NAMESPACE_BEGIN
-namespace time_internal {
-namespace cctz {
-
-// Convenience aliases. Not intended as public API points.
-template <typename D>
-using time_point = std::chrono::time_point<std::chrono::system_clock, D>;
-using seconds = std::chrono::duration<std::int_fast64_t>;
-using sys_seconds = seconds;  // Deprecated.  Use cctz::seconds instead.
-
-namespace detail {
-template <typename D>
-inline std::pair<time_point<seconds>, D> split_seconds(
-    const time_point<D>& tp) {
-  auto sec = std::chrono::time_point_cast<seconds>(tp);
-  auto sub = tp - sec;
-  if (sub.count() < 0) {
-    sec -= seconds(1);
-    sub += seconds(1);
-  }
-  return {sec, std::chrono::duration_cast<D>(sub)};
-}
-inline std::pair<time_point<seconds>, seconds> split_seconds(
-    const time_point<seconds>& tp) {
-  return {tp, seconds::zero()};
-}
-}  // namespace detail
-
-// cctz::time_zone is an opaque, small, value-type class representing a
-// geo-political region within which particular rules are used for mapping
-// between absolute and civil times. Time zones are named using the TZ
-// identifiers from the IANA Time Zone Database, such as "America/Los_Angeles"
-// or "Australia/Sydney". Time zones are created from factory functions such
-// as load_time_zone(). Note: strings like "PST" and "EDT" are not valid TZ
-// identifiers.
-//
-// Example:
-//   cctz::time_zone utc = cctz::utc_time_zone();
-//   cctz::time_zone pst = cctz::fixed_time_zone(std::chrono::hours(-8));
-//   cctz::time_zone loc = cctz::local_time_zone();
-//   cctz::time_zone lax;
-//   if (!cctz::load_time_zone("America/Los_Angeles", &lax)) { ... }
-//
-// See also:
-// - http://www.iana.org/time-zones
-// - https://en.wikipedia.org/wiki/Zoneinfo
-class time_zone {
- public:
-  time_zone() : time_zone(nullptr) {}  // Equivalent to UTC
-  time_zone(const time_zone&) = default;
-  time_zone& operator=(const time_zone&) = default;
-
-  std::string name() const;
-
-  // An absolute_lookup represents the civil time (cctz::civil_second) within
-  // this time_zone at the given absolute time (time_point). There are
-  // additionally a few other fields that may be useful when working with
-  // older APIs, such as std::tm.
-  //
-  // Example:
-  //   const cctz::time_zone tz = ...
-  //   const auto tp = std::chrono::system_clock::now();
-  //   const cctz::time_zone::absolute_lookup al = tz.lookup(tp);
-  struct absolute_lookup {
-    civil_second cs;
-    // Note: The following fields exist for backward compatibility with older
-    // APIs. Accessing these fields directly is a sign of imprudent logic in
-    // the calling code. Modern time-related code should only access this data
-    // indirectly by way of cctz::format().
-    int offset;        // civil seconds east of UTC
-    bool is_dst;       // is offset non-standard?
-    const char* abbr;  // time-zone abbreviation (e.g., "PST")
-  };
-  absolute_lookup lookup(const time_point<seconds>& tp) const;
-  template <typename D>
-  absolute_lookup lookup(const time_point<D>& tp) const {
-    return lookup(detail::split_seconds(tp).first);
-  }
-
-  // A civil_lookup represents the absolute time(s) (time_point) that
-  // correspond to the given civil time (cctz::civil_second) within this
-  // time_zone. Usually the given civil time represents a unique instant
-  // in time, in which case the conversion is unambiguous. However,
-  // within this time zone, the given civil time may be skipped (e.g.,
-  // during a positive UTC offset shift), or repeated (e.g., during a
-  // negative UTC offset shift). To account for these possibilities,
-  // civil_lookup is richer than just a single time_point.
-  //
-  // In all cases the civil_lookup::kind enum will indicate the nature
-  // of the given civil-time argument, and the pre, trans, and post
-  // members will give the absolute time answers using the pre-transition
-  // offset, the transition point itself, and the post-transition offset,
-  // respectively (all three times are equal if kind == UNIQUE). If any
-  // of these three absolute times is outside the representable range of a
-  // time_point<seconds> the field is set to its maximum/minimum value.
-  //
-  // Example:
-  //   cctz::time_zone lax;
-  //   if (!cctz::load_time_zone("America/Los_Angeles", &lax)) { ... }
-  //
-  //   // A unique civil time.
-  //   auto jan01 = lax.lookup(cctz::civil_second(2011, 1, 1, 0, 0, 0));
-  //   // jan01.kind == cctz::time_zone::civil_lookup::UNIQUE
-  //   // jan01.pre    is 2011/01/01 00:00:00 -0800
-  //   // jan01.trans  is 2011/01/01 00:00:00 -0800
-  //   // jan01.post   is 2011/01/01 00:00:00 -0800
-  //
-  //   // A Spring DST transition, when there is a gap in civil time.
-  //   auto mar13 = lax.lookup(cctz::civil_second(2011, 3, 13, 2, 15, 0));
-  //   // mar13.kind == cctz::time_zone::civil_lookup::SKIPPED
-  //   // mar13.pre   is 2011/03/13 03:15:00 -0700
-  //   // mar13.trans is 2011/03/13 03:00:00 -0700
-  //   // mar13.post  is 2011/03/13 01:15:00 -0800
-  //
-  //   // A Fall DST transition, when civil times are repeated.
-  //   auto nov06 = lax.lookup(cctz::civil_second(2011, 11, 6, 1, 15, 0));
-  //   // nov06.kind == cctz::time_zone::civil_lookup::REPEATED
-  //   // nov06.pre   is 2011/11/06 01:15:00 -0700
-  //   // nov06.trans is 2011/11/06 01:00:00 -0800
-  //   // nov06.post  is 2011/11/06 01:15:00 -0800
-  struct civil_lookup {
-    enum civil_kind {
-      UNIQUE,    // the civil time was singular (pre == trans == post)
-      SKIPPED,   // the civil time did not exist (pre >= trans > post)
-      REPEATED,  // the civil time was ambiguous (pre < trans <= post)
-    } kind;
-    time_point<seconds> pre;    // uses the pre-transition offset
-    time_point<seconds> trans;  // instant of civil-offset change
-    time_point<seconds> post;   // uses the post-transition offset
-  };
-  civil_lookup lookup(const civil_second& cs) const;
-
-  // Finds the time of the next/previous offset change in this time zone.
-  //
-  // By definition, next_transition(tp, &trans) returns false when tp has
-  // its maximum value, and prev_transition(tp, &trans) returns false
-  // when tp has its minimum value. If the zone has no transitions, the
-  // result will also be false no matter what the argument.
-  //
-  // Otherwise, when tp has its minimum value, next_transition(tp, &trans)
-  // returns true and sets trans to the first recorded transition. Chains
-  // of calls to next_transition()/prev_transition() will eventually return
-  // false, but it is unspecified exactly when next_transition(tp, &trans)
-  // jumps to false, or what time is set by prev_transition(tp, &trans) for
-  // a very distant tp.
-  //
-  // Note: Enumeration of time-zone transitions is for informational purposes
-  // only. Modern time-related code should not care about when offset changes
-  // occur.
-  //
-  // Example:
-  //   cctz::time_zone nyc;
-  //   if (!cctz::load_time_zone("America/New_York", &nyc)) { ... }
-  //   const auto now = std::chrono::system_clock::now();
-  //   auto tp = cctz::time_point<cctz::seconds>::min();
-  //   cctz::time_zone::civil_transition trans;
-  //   while (tp <= now && nyc.next_transition(tp, &trans)) {
-  //     // transition: trans.from -> trans.to
-  //     tp = nyc.lookup(trans.to).trans;
-  //   }
-  struct civil_transition {
-    civil_second from;  // the civil time we jump from
-    civil_second to;    // the civil time we jump to
-  };
-  bool next_transition(const time_point<seconds>& tp,
-                       civil_transition* trans) const;
-  template <typename D>
-  bool next_transition(const time_point<D>& tp, civil_transition* trans) const {
-    return next_transition(detail::split_seconds(tp).first, trans);
-  }
-  bool prev_transition(const time_point<seconds>& tp,
-                       civil_transition* trans) const;
-  template <typename D>
-  bool prev_transition(const time_point<D>& tp, civil_transition* trans) const {
-    return prev_transition(detail::split_seconds(tp).first, trans);
-  }
-
-  // version() and description() provide additional information about the
-  // time zone. The content of each of the returned strings is unspecified,
-  // however, when the IANA Time Zone Database is the underlying data source
-  // the version() string will be in the familar form (e.g, "2018e") or
-  // empty when unavailable.
-  //
-  // Note: These functions are for informational or testing purposes only.
-  std::string version() const;  // empty when unknown
-  std::string description() const;
-
-  // Relational operators.
-  friend bool operator==(time_zone lhs, time_zone rhs) {
-    return &lhs.effective_impl() == &rhs.effective_impl();
-  }
-  friend bool operator!=(time_zone lhs, time_zone rhs) { return !(lhs == rhs); }
-
-  template <typename H>
-  friend H AbslHashValue(H h, time_zone tz) {
-    return H::combine(std::move(h), &tz.effective_impl());
-  }
-
-  class Impl;
-
- private:
-  explicit time_zone(const Impl* impl) : impl_(impl) {}
-  const Impl& effective_impl() const;  // handles implicit UTC
-  const Impl* impl_;
-};
-
-// Loads the named time zone. May perform I/O on the initial load.
-// If the name is invalid, or some other kind of error occurs, returns
-// false and "*tz" is set to the UTC time zone.
-bool load_time_zone(const std::string& name, time_zone* tz);
-
-// Returns a time_zone representing UTC. Cannot fail.
-time_zone utc_time_zone();
-
-// Returns a time zone that is a fixed offset (seconds east) from UTC.
-// Note: If the absolute value of the offset is greater than 24 hours
-// you'll get UTC (i.e., zero offset) instead.
-time_zone fixed_time_zone(const seconds& offset);
-
-// Returns a time zone representing the local time zone. Falls back to UTC.
-// Note: local_time_zone.name() may only be something like "localtime".
-time_zone local_time_zone();
-
-// Returns the civil time (cctz::civil_second) within the given time zone at
-// the given absolute time (time_point). Since the additional fields provided
-// by the time_zone::absolute_lookup struct should rarely be needed in modern
-// code, this convert() function is simpler and should be preferred.
-template <typename D>
-inline civil_second convert(const time_point<D>& tp, const time_zone& tz) {
-  return tz.lookup(tp).cs;
-}
-
-// Returns the absolute time (time_point) that corresponds to the given civil
-// time within the given time zone. If the civil time is not unique (i.e., if
-// it was either repeated or non-existent), then the returned time_point is
-// the best estimate that preserves relative order. That is, this function
-// guarantees that if cs1 < cs2, then convert(cs1, tz) <= convert(cs2, tz).
-inline time_point<seconds> convert(const civil_second& cs,
-                                   const time_zone& tz) {
-  const time_zone::civil_lookup cl = tz.lookup(cs);
-  if (cl.kind == time_zone::civil_lookup::SKIPPED) return cl.trans;
-  return cl.pre;
-}
-
-namespace detail {
-using femtoseconds = std::chrono::duration<std::int_fast64_t, std::femto>;
-std::string format(const std::string&, const time_point<seconds>&,
-                   const femtoseconds&, const time_zone&);
-bool parse(const std::string&, const std::string&, const time_zone&,
-           time_point<seconds>*, femtoseconds*, std::string* err = nullptr);
-}  // namespace detail
-
-// Formats the given time_point in the given cctz::time_zone according to
-// the provided format string. Uses strftime()-like formatting options,
-// with the following extensions:
-//
-//   - %Ez  - RFC3339-compatible numeric UTC offset (+hh:mm or -hh:mm)
-//   - %E*z - Full-resolution numeric UTC offset (+hh:mm:ss or -hh:mm:ss)
-//   - %E#S - Seconds with # digits of fractional precision
-//   - %E*S - Seconds with full fractional precision (a literal '*')
-//   - %E#f - Fractional seconds with # digits of precision
-//   - %E*f - Fractional seconds with full precision (a literal '*')
-//   - %E4Y - Four-character years (-999 ... -001, 0000, 0001 ... 9999)
-//   - %ET  - The RFC3339 "date-time" separator "T"
-//
-// Note that %E0S behaves like %S, and %E0f produces no characters. In
-// contrast %E*f always produces at least one digit, which may be '0'.
-//
-// Note that %Y produces as many characters as it takes to fully render the
-// year. A year outside of [-999:9999] when formatted with %E4Y will produce
-// more than four characters, just like %Y.
-//
-// Tip: Format strings should include the UTC offset (e.g., %z, %Ez, or %E*z)
-// so that the resulting string uniquely identifies an absolute time.
-//
-// Example:
-//   cctz::time_zone lax;
-//   if (!cctz::load_time_zone("America/Los_Angeles", &lax)) { ... }
-//   auto tp = cctz::convert(cctz::civil_second(2013, 1, 2, 3, 4, 5), lax);
-//   std::string f = cctz::format("%H:%M:%S", tp, lax);  // "03:04:05"
-//   f = cctz::format("%H:%M:%E3S", tp, lax);            // "03:04:05.000"
-template <typename D>
-inline std::string format(const std::string& fmt, const time_point<D>& tp,
-                          const time_zone& tz) {
-  const auto p = detail::split_seconds(tp);
-  const auto n = std::chrono::duration_cast<detail::femtoseconds>(p.second);
-  return detail::format(fmt, p.first, n, tz);
-}
-
-// Parses an input string according to the provided format string and
-// returns the corresponding time_point. Uses strftime()-like formatting
-// options, with the same extensions as cctz::format(), but with the
-// exceptions that %E#S is interpreted as %E*S, and %E#f as %E*f. %Ez
-// and %E*z also accept the same inputs, which (along with %z) includes
-// 'z' and 'Z' as synonyms for +00:00.  %ET accepts either 'T' or 't'.
-//
-// %Y consumes as many numeric characters as it can, so the matching data
-// should always be terminated with a non-numeric. %E4Y always consumes
-// exactly four characters, including any sign.
-//
-// Unspecified fields are taken from the default date and time of ...
-//
-//   "1970-01-01 00:00:00.0 +0000"
-//
-// For example, parsing a string of "15:45" (%H:%M) will return a time_point
-// that represents "1970-01-01 15:45:00.0 +0000".
-//
-// Note that parse() returns time instants, so it makes most sense to parse
-// fully-specified date/time strings that include a UTC offset (%z, %Ez, or
-// %E*z).
-//
-// Note also that parse() only heeds the fields year, month, day, hour,
-// minute, (fractional) second, and UTC offset. Other fields, like weekday (%a
-// or %A), while parsed for syntactic validity, are ignored in the conversion.
-//
-// Date and time fields that are out-of-range will be treated as errors rather
-// than normalizing them like cctz::civil_second() would do. For example, it
-// is an error to parse the date "Oct 32, 2013" because 32 is out of range.
-//
-// A second of ":60" is normalized to ":00" of the following minute with
-// fractional seconds discarded. The following table shows how the given
-// seconds and subseconds will be parsed:
-//
-//   "59.x" -> 59.x  // exact
-//   "60.x" -> 00.0  // normalized
-//   "00.x" -> 00.x  // exact
-//
-// Errors are indicated by returning false.
-//
-// Example:
-//   const cctz::time_zone tz = ...
-//   std::chrono::system_clock::time_point tp;
-//   if (cctz::parse("%Y-%m-%d", "2015-10-09", tz, &tp)) {
-//     ...
-//   }
-template <typename D>
-inline bool parse(const std::string& fmt, const std::string& input,
-                  const time_zone& tz, time_point<D>* tpp) {
-  time_point<seconds> sec;
-  detail::femtoseconds fs;
-  const bool b = detail::parse(fmt, input, tz, &sec, &fs);
-  if (b) {
-    // TODO: Return false if unrepresentable as a time_point<D>.
-    *tpp = std::chrono::time_point_cast<D>(sec);
-    *tpp += std::chrono::duration_cast<D>(fs);
-  }
-  return b;
-}
-
-}  // namespace cctz
-}  // namespace time_internal
-ABSL_NAMESPACE_END
-}  // namespace absl
-
-#endif  // ABSL_TIME_INTERNAL_CCTZ_TIME_ZONE_H_
diff --git a/third_party/abseil_cpp/absl/time/internal/cctz/include/cctz/zone_info_source.h b/third_party/abseil_cpp/absl/time/internal/cctz/include/cctz/zone_info_source.h
deleted file mode 100644
index 012eb4ec30..0000000000
--- a/third_party/abseil_cpp/absl/time/internal/cctz/include/cctz/zone_info_source.h
+++ /dev/null
@@ -1,102 +0,0 @@
-// Copyright 2016 Google Inc. All Rights Reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//   https://www.apache.org/licenses/LICENSE-2.0
-//
-//   Unless required by applicable law or agreed to in writing, software
-//   distributed under the License is distributed on an "AS IS" BASIS,
-//   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//   See the License for the specific language governing permissions and
-//   limitations under the License.
-
-#ifndef ABSL_TIME_INTERNAL_CCTZ_ZONE_INFO_SOURCE_H_
-#define ABSL_TIME_INTERNAL_CCTZ_ZONE_INFO_SOURCE_H_
-
-#include <cstddef>
-#include <functional>
-#include <memory>
-#include <string>
-
-#include "absl/base/config.h"
-
-namespace absl {
-ABSL_NAMESPACE_BEGIN
-namespace time_internal {
-namespace cctz {
-
-// A stdio-like interface for providing zoneinfo data for a particular zone.
-class ZoneInfoSource {
- public:
-  virtual ~ZoneInfoSource();
-
-  virtual std::size_t Read(void* ptr, std::size_t size) = 0;  // like fread()
-  virtual int Skip(std::size_t offset) = 0;                   // like fseek()
-
-  // Until the zoneinfo data supports versioning information, we provide
-  // a way for a ZoneInfoSource to indicate it out-of-band.  The default
-  // implementation returns an empty string.
-  virtual std::string Version() const;
-};
-
-}  // namespace cctz
-}  // namespace time_internal
-ABSL_NAMESPACE_END
-}  // namespace absl
-
-namespace absl {
-ABSL_NAMESPACE_BEGIN
-namespace time_internal {
-namespace cctz_extension {
-
-// A function-pointer type for a factory that returns a ZoneInfoSource
-// given the name of a time zone and a fallback factory.  Returns null
-// when the data for the named zone cannot be found.
-using ZoneInfoSourceFactory =
-    std::unique_ptr<absl::time_internal::cctz::ZoneInfoSource> (*)(
-        const std::string&,
-        const std::function<std::unique_ptr<
-            absl::time_internal::cctz::ZoneInfoSource>(const std::string&)>&);
-
-// The user can control the mapping of zone names to zoneinfo data by
-// providing a definition for cctz_extension::zone_info_source_factory.
-// For example, given functions my_factory() and my_other_factory() that
-// can return a ZoneInfoSource for a named zone, we could inject them into
-// cctz::load_time_zone() with:
-//
-//   namespace cctz_extension {
-//   namespace {
-//   std::unique_ptr<cctz::ZoneInfoSource> CustomFactory(
-//       const std::string& name,
-//       const std::function<std::unique_ptr<cctz::ZoneInfoSource>(
-//           const std::string& name)>& fallback_factory) {
-//     if (auto zip = my_factory(name)) return zip;
-//     if (auto zip = fallback_factory(name)) return zip;
-//     if (auto zip = my_other_factory(name)) return zip;
-//     return nullptr;
-//   }
-//   }  // namespace
-//   ZoneInfoSourceFactory zone_info_source_factory = CustomFactory;
-//   }  // namespace cctz_extension
-//
-// This might be used, say, to use zoneinfo data embedded in the program,
-// or read from a (possibly compressed) file archive, or both.
-//
-// cctz_extension::zone_info_source_factory() will be called:
-//   (1) from the same thread as the cctz::load_time_zone() call,
-//   (2) only once for any zone name, and
-//   (3) serially (i.e., no concurrent execution).
-//
-// The fallback factory obtains zoneinfo data by reading files in ${TZDIR},
-// and it is used automatically when no zone_info_source_factory definition
-// is linked into the program.
-extern ZoneInfoSourceFactory zone_info_source_factory;
-
-}  // namespace cctz_extension
-}  // namespace time_internal
-ABSL_NAMESPACE_END
-}  // namespace absl
-
-#endif  // ABSL_TIME_INTERNAL_CCTZ_ZONE_INFO_SOURCE_H_