time_crisis 0.1.8 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION.yml +2 -2
- data/lib/time_crisis.rb +5 -12
- data/lib/time_crisis/ext.rb +60 -0
- data/lib/time_crisis/support/conversions.rb +4 -0
- data/lib/time_crisis/tzinfo.rb +3 -0
- data/lib/time_crisis/tzinfo/LICENSE +21 -0
- data/lib/time_crisis/tzinfo/data_timezone.rb +27 -0
- data/lib/time_crisis/tzinfo/data_timezone_info.rb +208 -0
- data/lib/time_crisis/tzinfo/definitions/Africa/Algiers.rb +55 -0
- data/lib/time_crisis/tzinfo/definitions/Africa/Cairo.rb +219 -0
- data/lib/time_crisis/tzinfo/definitions/Africa/Casablanca.rb +42 -0
- data/lib/time_crisis/tzinfo/definitions/Africa/Harare.rb +18 -0
- data/lib/time_crisis/tzinfo/definitions/Africa/Johannesburg.rb +25 -0
- data/lib/time_crisis/tzinfo/definitions/Africa/Monrovia.rb +22 -0
- data/lib/time_crisis/tzinfo/definitions/Africa/Nairobi.rb +23 -0
- data/lib/time_crisis/tzinfo/definitions/America/Argentina/Buenos_Aires.rb +84 -0
- data/lib/time_crisis/tzinfo/definitions/America/Argentina/San_Juan.rb +86 -0
- data/lib/time_crisis/tzinfo/definitions/America/Bogota.rb +23 -0
- data/lib/time_crisis/tzinfo/definitions/America/Caracas.rb +23 -0
- data/lib/time_crisis/tzinfo/definitions/America/Chicago.rb +283 -0
- data/lib/time_crisis/tzinfo/definitions/America/Chihuahua.rb +136 -0
- data/lib/time_crisis/tzinfo/definitions/America/Denver.rb +204 -0
- data/lib/time_crisis/tzinfo/definitions/America/Godthab.rb +161 -0
- data/lib/time_crisis/tzinfo/definitions/America/Guatemala.rb +27 -0
- data/lib/time_crisis/tzinfo/definitions/America/Halifax.rb +274 -0
- data/lib/time_crisis/tzinfo/definitions/America/Indiana/Indianapolis.rb +149 -0
- data/lib/time_crisis/tzinfo/definitions/America/Juneau.rb +194 -0
- data/lib/time_crisis/tzinfo/definitions/America/La_Paz.rb +22 -0
- data/lib/time_crisis/tzinfo/definitions/America/Lima.rb +35 -0
- data/lib/time_crisis/tzinfo/definitions/America/Los_Angeles.rb +232 -0
- data/lib/time_crisis/tzinfo/definitions/America/Mazatlan.rb +139 -0
- data/lib/time_crisis/tzinfo/definitions/America/Mexico_City.rb +144 -0
- data/lib/time_crisis/tzinfo/definitions/America/Monterrey.rb +131 -0
- data/lib/time_crisis/tzinfo/definitions/America/New_York.rb +282 -0
- data/lib/time_crisis/tzinfo/definitions/America/Phoenix.rb +30 -0
- data/lib/time_crisis/tzinfo/definitions/America/Regina.rb +74 -0
- data/lib/time_crisis/tzinfo/definitions/America/Santiago.rb +205 -0
- data/lib/time_crisis/tzinfo/definitions/America/Sao_Paulo.rb +171 -0
- data/lib/time_crisis/tzinfo/definitions/America/St_Johns.rb +288 -0
- data/lib/time_crisis/tzinfo/definitions/America/Tijuana.rb +196 -0
- data/lib/time_crisis/tzinfo/definitions/Asia/Almaty.rb +67 -0
- data/lib/time_crisis/tzinfo/definitions/Asia/Baghdad.rb +73 -0
- data/lib/time_crisis/tzinfo/definitions/Asia/Baku.rb +161 -0
- data/lib/time_crisis/tzinfo/definitions/Asia/Bangkok.rb +20 -0
- data/lib/time_crisis/tzinfo/definitions/Asia/Chongqing.rb +33 -0
- data/lib/time_crisis/tzinfo/definitions/Asia/Colombo.rb +30 -0
- data/lib/time_crisis/tzinfo/definitions/Asia/Dhaka.rb +29 -0
- data/lib/time_crisis/tzinfo/definitions/Asia/Hong_Kong.rb +87 -0
- data/lib/time_crisis/tzinfo/definitions/Asia/Irkutsk.rb +165 -0
- data/lib/time_crisis/tzinfo/definitions/Asia/Jakarta.rb +30 -0
- data/lib/time_crisis/tzinfo/definitions/Asia/Jerusalem.rb +163 -0
- data/lib/time_crisis/tzinfo/definitions/Asia/Kabul.rb +20 -0
- data/lib/time_crisis/tzinfo/definitions/Asia/Kamchatka.rb +163 -0
- data/lib/time_crisis/tzinfo/definitions/Asia/Karachi.rb +114 -0
- data/lib/time_crisis/tzinfo/definitions/Asia/Kathmandu.rb +20 -0
- data/lib/time_crisis/tzinfo/definitions/Asia/Kolkata.rb +25 -0
- data/lib/time_crisis/tzinfo/definitions/Asia/Krasnoyarsk.rb +163 -0
- data/lib/time_crisis/tzinfo/definitions/Asia/Kuala_Lumpur.rb +31 -0
- data/lib/time_crisis/tzinfo/definitions/Asia/Kuwait.rb +18 -0
- data/lib/time_crisis/tzinfo/definitions/Asia/Magadan.rb +163 -0
- data/lib/time_crisis/tzinfo/definitions/Asia/Muscat.rb +18 -0
- data/lib/time_crisis/tzinfo/definitions/Asia/Novosibirsk.rb +164 -0
- data/lib/time_crisis/tzinfo/definitions/Asia/Rangoon.rb +24 -0
- data/lib/time_crisis/tzinfo/definitions/Asia/Riyadh.rb +18 -0
- data/lib/time_crisis/tzinfo/definitions/Asia/Seoul.rb +34 -0
- data/lib/time_crisis/tzinfo/definitions/Asia/Shanghai.rb +35 -0
- data/lib/time_crisis/tzinfo/definitions/Asia/Singapore.rb +33 -0
- data/lib/time_crisis/tzinfo/definitions/Asia/Taipei.rb +59 -0
- data/lib/time_crisis/tzinfo/definitions/Asia/Tashkent.rb +47 -0
- data/lib/time_crisis/tzinfo/definitions/Asia/Tbilisi.rb +78 -0
- data/lib/time_crisis/tzinfo/definitions/Asia/Tehran.rb +121 -0
- data/lib/time_crisis/tzinfo/definitions/Asia/Tokyo.rb +30 -0
- data/lib/time_crisis/tzinfo/definitions/Asia/Ulaanbaatar.rb +65 -0
- data/lib/time_crisis/tzinfo/definitions/Asia/Urumqi.rb +33 -0
- data/lib/time_crisis/tzinfo/definitions/Asia/Vladivostok.rb +164 -0
- data/lib/time_crisis/tzinfo/definitions/Asia/Yakutsk.rb +163 -0
- data/lib/time_crisis/tzinfo/definitions/Asia/Yekaterinburg.rb +165 -0
- data/lib/time_crisis/tzinfo/definitions/Asia/Yerevan.rb +165 -0
- data/lib/time_crisis/tzinfo/definitions/Atlantic/Azores.rb +270 -0
- data/lib/time_crisis/tzinfo/definitions/Atlantic/Cape_Verde.rb +23 -0
- data/lib/time_crisis/tzinfo/definitions/Atlantic/South_Georgia.rb +18 -0
- data/lib/time_crisis/tzinfo/definitions/Australia/Adelaide.rb +187 -0
- data/lib/time_crisis/tzinfo/definitions/Australia/Brisbane.rb +35 -0
- data/lib/time_crisis/tzinfo/definitions/Australia/Darwin.rb +29 -0
- data/lib/time_crisis/tzinfo/definitions/Australia/Hobart.rb +193 -0
- data/lib/time_crisis/tzinfo/definitions/Australia/Melbourne.rb +185 -0
- data/lib/time_crisis/tzinfo/definitions/Australia/Perth.rb +37 -0
- data/lib/time_crisis/tzinfo/definitions/Australia/Sydney.rb +185 -0
- data/lib/time_crisis/tzinfo/definitions/Etc/UTC.rb +16 -0
- data/lib/time_crisis/tzinfo/definitions/Europe/Amsterdam.rb +228 -0
- data/lib/time_crisis/tzinfo/definitions/Europe/Athens.rb +185 -0
- data/lib/time_crisis/tzinfo/definitions/Europe/Belgrade.rb +163 -0
- data/lib/time_crisis/tzinfo/definitions/Europe/Berlin.rb +188 -0
- data/lib/time_crisis/tzinfo/definitions/Europe/Bratislava.rb +13 -0
- data/lib/time_crisis/tzinfo/definitions/Europe/Brussels.rb +232 -0
- data/lib/time_crisis/tzinfo/definitions/Europe/Bucharest.rb +181 -0
- data/lib/time_crisis/tzinfo/definitions/Europe/Budapest.rb +197 -0
- data/lib/time_crisis/tzinfo/definitions/Europe/Copenhagen.rb +179 -0
- data/lib/time_crisis/tzinfo/definitions/Europe/Dublin.rb +276 -0
- data/lib/time_crisis/tzinfo/definitions/Europe/Helsinki.rb +163 -0
- data/lib/time_crisis/tzinfo/definitions/Europe/Istanbul.rb +218 -0
- data/lib/time_crisis/tzinfo/definitions/Europe/Kiev.rb +168 -0
- data/lib/time_crisis/tzinfo/definitions/Europe/Lisbon.rb +268 -0
- data/lib/time_crisis/tzinfo/definitions/Europe/Ljubljana.rb +13 -0
- data/lib/time_crisis/tzinfo/definitions/Europe/London.rb +288 -0
- data/lib/time_crisis/tzinfo/definitions/Europe/Madrid.rb +211 -0
- data/lib/time_crisis/tzinfo/definitions/Europe/Minsk.rb +170 -0
- data/lib/time_crisis/tzinfo/definitions/Europe/Moscow.rb +181 -0
- data/lib/time_crisis/tzinfo/definitions/Europe/Paris.rb +232 -0
- data/lib/time_crisis/tzinfo/definitions/Europe/Prague.rb +187 -0
- data/lib/time_crisis/tzinfo/definitions/Europe/Riga.rb +176 -0
- data/lib/time_crisis/tzinfo/definitions/Europe/Rome.rb +215 -0
- data/lib/time_crisis/tzinfo/definitions/Europe/Sarajevo.rb +13 -0
- data/lib/time_crisis/tzinfo/definitions/Europe/Skopje.rb +13 -0
- data/lib/time_crisis/tzinfo/definitions/Europe/Sofia.rb +173 -0
- data/lib/time_crisis/tzinfo/definitions/Europe/Stockholm.rb +165 -0
- data/lib/time_crisis/tzinfo/definitions/Europe/Tallinn.rb +172 -0
- data/lib/time_crisis/tzinfo/definitions/Europe/Vienna.rb +183 -0
- data/lib/time_crisis/tzinfo/definitions/Europe/Vilnius.rb +170 -0
- data/lib/time_crisis/tzinfo/definitions/Europe/Warsaw.rb +212 -0
- data/lib/time_crisis/tzinfo/definitions/Europe/Zagreb.rb +13 -0
- data/lib/time_crisis/tzinfo/definitions/Pacific/Auckland.rb +202 -0
- data/lib/time_crisis/tzinfo/definitions/Pacific/Fiji.rb +23 -0
- data/lib/time_crisis/tzinfo/definitions/Pacific/Guam.rb +22 -0
- data/lib/time_crisis/tzinfo/definitions/Pacific/Honolulu.rb +28 -0
- data/lib/time_crisis/tzinfo/definitions/Pacific/Majuro.rb +20 -0
- data/lib/time_crisis/tzinfo/definitions/Pacific/Midway.rb +25 -0
- data/lib/time_crisis/tzinfo/definitions/Pacific/Noumea.rb +25 -0
- data/lib/time_crisis/tzinfo/definitions/Pacific/Pago_Pago.rb +26 -0
- data/lib/time_crisis/tzinfo/definitions/Pacific/Port_Moresby.rb +20 -0
- data/lib/time_crisis/tzinfo/definitions/Pacific/Tongatapu.rb +27 -0
- data/lib/time_crisis/tzinfo/info_timezone.rb +32 -0
- data/lib/time_crisis/tzinfo/linked_timezone.rb +32 -0
- data/lib/time_crisis/tzinfo/linked_timezone_info.rb +24 -0
- data/lib/time_crisis/tzinfo/offset_rationals.rb +79 -0
- data/lib/time_crisis/tzinfo/ruby_core_support.rb +33 -0
- data/lib/time_crisis/tzinfo/time_or_datetime.rb +309 -0
- data/lib/time_crisis/tzinfo/timezone.rb +486 -0
- data/lib/time_crisis/tzinfo/timezone_definition.rb +36 -0
- data/lib/time_crisis/tzinfo/timezone_info.rb +20 -0
- data/lib/time_crisis/tzinfo/timezone_offset_info.rb +75 -0
- data/lib/time_crisis/tzinfo/timezone_period.rb +179 -0
- data/lib/time_crisis/tzinfo/timezone_transition_info.rb +109 -0
- data/time_crisis.gemspec +142 -2
- metadata +142 -2
data/VERSION.yml
CHANGED
data/lib/time_crisis.rb
CHANGED
@@ -1,18 +1,12 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
require 'date'
|
4
|
-
rescue LoadError
|
5
|
-
end
|
6
|
-
end
|
1
|
+
require 'date'
|
2
|
+
require 'time'
|
7
3
|
|
8
4
|
require 'third_base'
|
5
|
+
TimeCrisis = ThirdBase
|
6
|
+
require 'time_crisis/ext'
|
9
7
|
|
10
|
-
|
11
|
-
|
12
|
-
# add needed bits of active support to time crisis
|
13
|
-
# necessary now that it uses ThirdBase
|
8
|
+
require 'time_crisis/tzinfo'
|
14
9
|
require 'time_crisis/support'
|
15
|
-
|
16
10
|
require 'time_crisis/meteorological_seasons'
|
17
11
|
require 'time_crisis/date_range'
|
18
12
|
require 'time_crisis/named_months'
|
@@ -20,7 +14,6 @@ require 'time_crisis/weekend'
|
|
20
14
|
require 'time_crisis/nth_weekday'
|
21
15
|
require 'time_crisis/holiday'
|
22
16
|
|
23
|
-
# TODO: make this less of an ugly hack
|
24
17
|
module TimeCrisis
|
25
18
|
class DateTime
|
26
19
|
ENVMUTEX = Mutex.new
|
@@ -0,0 +1,60 @@
|
|
1
|
+
module TimeCrisis
|
2
|
+
class DateTime
|
3
|
+
attr_accessor :offset
|
4
|
+
|
5
|
+
def new_offset(n)
|
6
|
+
self.offset = n
|
7
|
+
end
|
8
|
+
|
9
|
+
def +(d)
|
10
|
+
case
|
11
|
+
when d.is_a?(Integer)
|
12
|
+
new_jd(jd+d)
|
13
|
+
when d.respond_to?(:to_f)
|
14
|
+
d, f = d.to_f.divmod(1)
|
15
|
+
f = fract + f
|
16
|
+
m, f = f.divmod(1)
|
17
|
+
self.class.jd_fract(jd+d+m, f, @offset)
|
18
|
+
else
|
19
|
+
raise TypeError, "d must be an Integer or respond to :to_f"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def -(d)
|
24
|
+
case
|
25
|
+
when d.is_a?(::TimeCrisis::DateTime)
|
26
|
+
(jd - d.jd) + (fract - d.fract) + (@offset - d.offset)/86400.0
|
27
|
+
when d.is_a?(Integer)
|
28
|
+
self + -d
|
29
|
+
when d.respond_to?(:to_f)
|
30
|
+
self + -(d.to_f)
|
31
|
+
else
|
32
|
+
raise TypeError, "d should be a TimeCrisis::DateTime, Integer, or respond to :to_f"
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def <=>(datetime)
|
37
|
+
case
|
38
|
+
when datetime.is_a?(::TimeCrisis::DateTime)
|
39
|
+
((d = super) == 0) && ((d = (hour <=> datetime.hour)) == 0) && ((d = (min <=> datetime.min)) == 0) && ((d = (sec <=> datetime.sec)) == 0) && ((d = (usec <=> datetime.usec)) == 0)
|
40
|
+
d
|
41
|
+
when datetime.is_a?(Integer)
|
42
|
+
if ((d = (jd <=> datetime)) == 0)
|
43
|
+
(hour == 0 and min == 0 and sec == 0 and usec == 0) ? 0 : 1
|
44
|
+
else
|
45
|
+
d
|
46
|
+
end
|
47
|
+
when datetime.respond_to?(:to_f)
|
48
|
+
diff = jd+fract - datetime.to_f
|
49
|
+
if diff.abs <= 1.15740740740741e-011
|
50
|
+
0
|
51
|
+
else
|
52
|
+
diff > 0.0 ? 1 : -1
|
53
|
+
end
|
54
|
+
else
|
55
|
+
raise TypeError, "d should be a TimeCrisis::DateTime, Integer, or respond to :to_f"
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (c) 2008 Philip Ross
|
3
|
+
#
|
4
|
+
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
5
|
+
# of this software and associated documentation files (the "Software"), to deal
|
6
|
+
# in the Software without restriction, including without limitation the rights
|
7
|
+
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
8
|
+
# copies of the Software, and to permit persons to whom the Software is
|
9
|
+
# furnished to do so, subject to the following conditions:
|
10
|
+
#
|
11
|
+
# The above copyright notice and this permission notice shall be included in all
|
12
|
+
# copies or substantial portions of the Software.
|
13
|
+
#
|
14
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
15
|
+
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
16
|
+
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
17
|
+
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
18
|
+
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
19
|
+
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
20
|
+
# THE SOFTWARE.
|
21
|
+
#++
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'time_crisis/tzinfo/info_timezone'
|
2
|
+
|
3
|
+
module TimeCrisis
|
4
|
+
module TZInfo
|
5
|
+
|
6
|
+
# A Timezone based on a DataTimezoneInfo.
|
7
|
+
class DataTimezone < InfoTimezone #:nodoc:
|
8
|
+
|
9
|
+
# Returns the TimezonePeriod for the given UTC time. utc can either be
|
10
|
+
# a DateTime, Time or integer timestamp (Time.to_i). Any timezone
|
11
|
+
# information in utc is ignored (it is treated as a UTC time).
|
12
|
+
#
|
13
|
+
# If no TimezonePeriod could be found, PeriodNotFound is raised.
|
14
|
+
def period_for_utc(utc)
|
15
|
+
info.period_for_utc(utc)
|
16
|
+
end
|
17
|
+
|
18
|
+
# Returns the set of TimezonePeriod instances that are valid for the given
|
19
|
+
# local time as an array. If you just want a single period, use
|
20
|
+
# period_for_local instead and specify how abiguities should be resolved.
|
21
|
+
# Raises PeriodNotFound if no periods are found for the given time.
|
22
|
+
def periods_for_local(local)
|
23
|
+
info.periods_for_local(local)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,208 @@
|
|
1
|
+
require 'time_crisis/tzinfo/time_or_datetime'
|
2
|
+
require 'time_crisis/tzinfo/timezone_info'
|
3
|
+
require 'time_crisis/tzinfo/timezone_offset_info'
|
4
|
+
require 'time_crisis/tzinfo/timezone_period'
|
5
|
+
require 'time_crisis/tzinfo/timezone_transition_info'
|
6
|
+
|
7
|
+
module TimeCrisis
|
8
|
+
module TZInfo
|
9
|
+
# Thrown if no offsets have been defined when calling period_for_utc or
|
10
|
+
# periods_for_local. Indicates an error in the timezone data.
|
11
|
+
class NoOffsetsDefined < StandardError
|
12
|
+
end
|
13
|
+
|
14
|
+
# Represents a (non-linked) timezone defined in a data module.
|
15
|
+
class DataTimezoneInfo < TimezoneInfo #:nodoc:
|
16
|
+
|
17
|
+
# Constructs a new TimezoneInfo with its identifier.
|
18
|
+
def initialize(identifier)
|
19
|
+
super(identifier)
|
20
|
+
@offsets = {}
|
21
|
+
@transitions = []
|
22
|
+
@previous_offset = nil
|
23
|
+
@transitions_index = nil
|
24
|
+
end
|
25
|
+
|
26
|
+
# Defines a offset. The id uniquely identifies this offset within the
|
27
|
+
# timezone. utc_offset and std_offset define the offset in seconds of
|
28
|
+
# standard time from UTC and daylight savings from standard time
|
29
|
+
# respectively. abbreviation describes the timezone offset (e.g. GMT, BST,
|
30
|
+
# EST or EDT).
|
31
|
+
#
|
32
|
+
# The first offset to be defined is treated as the offset that applies
|
33
|
+
# until the first transition. This will usually be in Local Mean Time (LMT).
|
34
|
+
#
|
35
|
+
# ArgumentError will be raised if the id is already defined.
|
36
|
+
def offset(id, utc_offset, std_offset, abbreviation)
|
37
|
+
raise ArgumentError, 'Offset already defined' if @offsets.has_key?(id)
|
38
|
+
|
39
|
+
offset = TimezoneOffsetInfo.new(utc_offset, std_offset, abbreviation)
|
40
|
+
@offsets[id] = offset
|
41
|
+
@previous_offset = offset unless @previous_offset
|
42
|
+
end
|
43
|
+
|
44
|
+
# Defines a transition. Transitions must be defined in chronological order.
|
45
|
+
# ArgumentError will be raised if a transition is added out of order.
|
46
|
+
# offset_id refers to an id defined with offset. ArgumentError will be
|
47
|
+
# raised if the offset_id cannot be found. numerator_or_time and
|
48
|
+
# denomiator specify the time the transition occurs as. See
|
49
|
+
# TimezoneTransitionInfo for more detail about specifying times.
|
50
|
+
def transition(year, month, offset_id, numerator_or_time, denominator = nil)
|
51
|
+
offset = @offsets[offset_id]
|
52
|
+
raise ArgumentError, 'Offset not found' unless offset
|
53
|
+
|
54
|
+
if @transitions_index
|
55
|
+
if year < @last_year || (year == @last_year && month < @last_month)
|
56
|
+
raise ArgumentError, 'Transitions must be increasing date order'
|
57
|
+
end
|
58
|
+
|
59
|
+
# Record the position of the first transition with this index.
|
60
|
+
index = transition_index(year, month)
|
61
|
+
@transitions_index[index] ||= @transitions.length
|
62
|
+
|
63
|
+
# Fill in any gaps
|
64
|
+
(index - 1).downto(0) do |i|
|
65
|
+
break if @transitions_index[i]
|
66
|
+
@transitions_index[i] = @transitions.length
|
67
|
+
end
|
68
|
+
else
|
69
|
+
@transitions_index = [@transitions.length]
|
70
|
+
@start_year = year
|
71
|
+
@start_month = month
|
72
|
+
end
|
73
|
+
|
74
|
+
@transitions << TimezoneTransitionInfo.new(offset, @previous_offset,
|
75
|
+
numerator_or_time, denominator)
|
76
|
+
@last_year = year
|
77
|
+
@last_month = month
|
78
|
+
@previous_offset = offset
|
79
|
+
end
|
80
|
+
|
81
|
+
# Returns the TimezonePeriod for the given UTC time.
|
82
|
+
# Raises NoOffsetsDefined if no offsets have been defined.
|
83
|
+
def period_for_utc(utc)
|
84
|
+
unless @transitions.empty?
|
85
|
+
utc = TimeOrDateTime.wrap(utc)
|
86
|
+
index = transition_index(utc.year, utc.mon)
|
87
|
+
|
88
|
+
start_transition = nil
|
89
|
+
start = transition_before_end(index)
|
90
|
+
if start
|
91
|
+
start.downto(0) do |i|
|
92
|
+
if @transitions[i].at <= utc
|
93
|
+
start_transition = @transitions[i]
|
94
|
+
break
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
end_transition = nil
|
100
|
+
start = transition_after_start(index)
|
101
|
+
if start
|
102
|
+
start.upto(@transitions.length - 1) do |i|
|
103
|
+
if @transitions[i].at > utc
|
104
|
+
end_transition = @transitions[i]
|
105
|
+
break
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
if start_transition || end_transition
|
111
|
+
TimezonePeriod.new(start_transition, end_transition)
|
112
|
+
else
|
113
|
+
# Won't happen since there are transitions. Must always find one
|
114
|
+
# transition that is either >= or < the specified time.
|
115
|
+
raise 'No transitions found in search'
|
116
|
+
end
|
117
|
+
else
|
118
|
+
raise NoOffsetsDefined, 'No offsets have been defined' unless @previous_offset
|
119
|
+
TimezonePeriod.new(nil, nil, @previous_offset)
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
# Returns the set of TimezonePeriods for the given local time as an array.
|
124
|
+
# Results returned are ordered by increasing UTC start date.
|
125
|
+
# Returns an empty array if no periods are found for the given time.
|
126
|
+
# Raises NoOffsetsDefined if no offsets have been defined.
|
127
|
+
def periods_for_local(local)
|
128
|
+
unless @transitions.empty?
|
129
|
+
local = TimeOrDateTime.wrap(local)
|
130
|
+
index = transition_index(local.year, local.mon)
|
131
|
+
|
132
|
+
result = []
|
133
|
+
|
134
|
+
start_index = transition_after_start(index - 1)
|
135
|
+
if start_index && @transitions[start_index].local_end > local
|
136
|
+
if start_index > 0
|
137
|
+
if @transitions[start_index - 1].local_start <= local
|
138
|
+
result << TimezonePeriod.new(@transitions[start_index - 1], @transitions[start_index])
|
139
|
+
end
|
140
|
+
else
|
141
|
+
result << TimezonePeriod.new(nil, @transitions[start_index])
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
end_index = transition_before_end(index + 1)
|
146
|
+
|
147
|
+
if end_index
|
148
|
+
start_index = end_index unless start_index
|
149
|
+
|
150
|
+
start_index.upto(transition_before_end(index + 1)) do |i|
|
151
|
+
if @transitions[i].local_start <= local
|
152
|
+
if i + 1 < @transitions.length
|
153
|
+
if @transitions[i + 1].local_end > local
|
154
|
+
result << TimezonePeriod.new(@transitions[i], @transitions[i + 1])
|
155
|
+
end
|
156
|
+
else
|
157
|
+
result << TimezonePeriod.new(@transitions[i], nil)
|
158
|
+
end
|
159
|
+
end
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
result
|
164
|
+
else
|
165
|
+
raise NoOffsetsDefined, 'No offsets have been defined' unless @previous_offset
|
166
|
+
[TimezonePeriod.new(nil, nil, @previous_offset)]
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
private
|
171
|
+
# Returns the index into the @transitions_index array for a given year
|
172
|
+
# and month.
|
173
|
+
def transition_index(year, month)
|
174
|
+
index = (year - @start_year) * 2
|
175
|
+
index += 1 if month > 6
|
176
|
+
index -= 1 if @start_month > 6
|
177
|
+
index
|
178
|
+
end
|
179
|
+
|
180
|
+
# Returns the index into @transitions of the first transition that occurs
|
181
|
+
# on or after the start of the given index into @transitions_index.
|
182
|
+
# Returns nil if there are no such transitions.
|
183
|
+
def transition_after_start(index)
|
184
|
+
if index >= @transitions_index.length
|
185
|
+
nil
|
186
|
+
else
|
187
|
+
index = 0 if index < 0
|
188
|
+
@transitions_index[index]
|
189
|
+
end
|
190
|
+
end
|
191
|
+
|
192
|
+
# Returns the index into @transitions of the first transition that occurs
|
193
|
+
# before the end of the given index into @transitions_index.
|
194
|
+
# Returns nil if there are no such transitions.
|
195
|
+
def transition_before_end(index)
|
196
|
+
index = index + 1
|
197
|
+
|
198
|
+
if index <= 0
|
199
|
+
nil
|
200
|
+
elsif index >= @transitions_index.length
|
201
|
+
@transitions.length - 1
|
202
|
+
else
|
203
|
+
@transitions_index[index] - 1
|
204
|
+
end
|
205
|
+
end
|
206
|
+
end
|
207
|
+
end
|
208
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require 'time_crisis/tzinfo/timezone_definition'
|
2
|
+
|
3
|
+
module TimeCrisis::TZInfo
|
4
|
+
module Definitions
|
5
|
+
module Africa
|
6
|
+
module Algiers
|
7
|
+
include TimezoneDefinition
|
8
|
+
|
9
|
+
timezone 'Africa/Algiers' do |tz|
|
10
|
+
tz.offset :o0, 732, 0, :LMT
|
11
|
+
tz.offset :o1, 561, 0, :PMT
|
12
|
+
tz.offset :o2, 0, 0, :WET
|
13
|
+
tz.offset :o3, 0, 3600, :WEST
|
14
|
+
tz.offset :o4, 3600, 0, :CET
|
15
|
+
tz.offset :o5, 3600, 3600, :CEST
|
16
|
+
|
17
|
+
tz.transition 1891, 3, :o1, 2170625843, 900
|
18
|
+
tz.transition 1911, 3, :o2, 69670267013, 28800
|
19
|
+
tz.transition 1916, 6, :o3, 58104707, 24
|
20
|
+
tz.transition 1916, 10, :o2, 58107323, 24
|
21
|
+
tz.transition 1917, 3, :o3, 58111499, 24
|
22
|
+
tz.transition 1917, 10, :o2, 58116227, 24
|
23
|
+
tz.transition 1918, 3, :o3, 58119899, 24
|
24
|
+
tz.transition 1918, 10, :o2, 58124963, 24
|
25
|
+
tz.transition 1919, 3, :o3, 58128467, 24
|
26
|
+
tz.transition 1919, 10, :o2, 58133699, 24
|
27
|
+
tz.transition 1920, 2, :o3, 58136867, 24
|
28
|
+
tz.transition 1920, 10, :o2, 58142915, 24
|
29
|
+
tz.transition 1921, 3, :o3, 58146323, 24
|
30
|
+
tz.transition 1921, 6, :o2, 58148699, 24
|
31
|
+
tz.transition 1939, 9, :o3, 58308443, 24
|
32
|
+
tz.transition 1939, 11, :o2, 4859173, 2
|
33
|
+
tz.transition 1940, 2, :o4, 29156215, 12
|
34
|
+
tz.transition 1944, 4, :o5, 58348405, 24
|
35
|
+
tz.transition 1944, 10, :o4, 4862743, 2
|
36
|
+
tz.transition 1945, 4, :o5, 58357141, 24
|
37
|
+
tz.transition 1945, 9, :o4, 58361147, 24
|
38
|
+
tz.transition 1946, 10, :o2, 58370411, 24
|
39
|
+
tz.transition 1956, 1, :o4, 4871003, 2
|
40
|
+
tz.transition 1963, 4, :o2, 58515203, 24
|
41
|
+
tz.transition 1971, 4, :o3, 41468400
|
42
|
+
tz.transition 1971, 9, :o2, 54774000
|
43
|
+
tz.transition 1977, 5, :o3, 231724800
|
44
|
+
tz.transition 1977, 10, :o4, 246236400
|
45
|
+
tz.transition 1978, 3, :o5, 259545600
|
46
|
+
tz.transition 1978, 9, :o4, 275274000
|
47
|
+
tz.transition 1979, 10, :o2, 309740400
|
48
|
+
tz.transition 1980, 4, :o3, 325468800
|
49
|
+
tz.transition 1980, 10, :o2, 341802000
|
50
|
+
tz.transition 1981, 5, :o4, 357523200
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,219 @@
|
|
1
|
+
require 'time_crisis/tzinfo/timezone_definition'
|
2
|
+
|
3
|
+
module TimeCrisis::TZInfo
|
4
|
+
module Definitions
|
5
|
+
module Africa
|
6
|
+
module Cairo
|
7
|
+
include TimezoneDefinition
|
8
|
+
|
9
|
+
timezone 'Africa/Cairo' do |tz|
|
10
|
+
tz.offset :o0, 7500, 0, :LMT
|
11
|
+
tz.offset :o1, 7200, 0, :EET
|
12
|
+
tz.offset :o2, 7200, 3600, :EEST
|
13
|
+
|
14
|
+
tz.transition 1900, 9, :o1, 695604503, 288
|
15
|
+
tz.transition 1940, 7, :o2, 29157905, 12
|
16
|
+
tz.transition 1940, 9, :o1, 19439227, 8
|
17
|
+
tz.transition 1941, 4, :o2, 29161193, 12
|
18
|
+
tz.transition 1941, 9, :o1, 19442027, 8
|
19
|
+
tz.transition 1942, 3, :o2, 29165405, 12
|
20
|
+
tz.transition 1942, 10, :o1, 19445275, 8
|
21
|
+
tz.transition 1943, 3, :o2, 29169785, 12
|
22
|
+
tz.transition 1943, 10, :o1, 19448235, 8
|
23
|
+
tz.transition 1944, 3, :o2, 29174177, 12
|
24
|
+
tz.transition 1944, 10, :o1, 19451163, 8
|
25
|
+
tz.transition 1945, 4, :o2, 29178737, 12
|
26
|
+
tz.transition 1945, 10, :o1, 19454083, 8
|
27
|
+
tz.transition 1957, 5, :o2, 29231621, 12
|
28
|
+
tz.transition 1957, 9, :o1, 19488899, 8
|
29
|
+
tz.transition 1958, 4, :o2, 29235893, 12
|
30
|
+
tz.transition 1958, 9, :o1, 19491819, 8
|
31
|
+
tz.transition 1959, 4, :o2, 58480547, 24
|
32
|
+
tz.transition 1959, 9, :o1, 4873683, 2
|
33
|
+
tz.transition 1960, 4, :o2, 58489331, 24
|
34
|
+
tz.transition 1960, 9, :o1, 4874415, 2
|
35
|
+
tz.transition 1961, 4, :o2, 58498091, 24
|
36
|
+
tz.transition 1961, 9, :o1, 4875145, 2
|
37
|
+
tz.transition 1962, 4, :o2, 58506851, 24
|
38
|
+
tz.transition 1962, 9, :o1, 4875875, 2
|
39
|
+
tz.transition 1963, 4, :o2, 58515611, 24
|
40
|
+
tz.transition 1963, 9, :o1, 4876605, 2
|
41
|
+
tz.transition 1964, 4, :o2, 58524395, 24
|
42
|
+
tz.transition 1964, 9, :o1, 4877337, 2
|
43
|
+
tz.transition 1965, 4, :o2, 58533155, 24
|
44
|
+
tz.transition 1965, 9, :o1, 4878067, 2
|
45
|
+
tz.transition 1966, 4, :o2, 58541915, 24
|
46
|
+
tz.transition 1966, 10, :o1, 4878799, 2
|
47
|
+
tz.transition 1967, 4, :o2, 58550675, 24
|
48
|
+
tz.transition 1967, 10, :o1, 4879529, 2
|
49
|
+
tz.transition 1968, 4, :o2, 58559459, 24
|
50
|
+
tz.transition 1968, 10, :o1, 4880261, 2
|
51
|
+
tz.transition 1969, 4, :o2, 58568219, 24
|
52
|
+
tz.transition 1969, 10, :o1, 4880991, 2
|
53
|
+
tz.transition 1970, 4, :o2, 10364400
|
54
|
+
tz.transition 1970, 10, :o1, 23587200
|
55
|
+
tz.transition 1971, 4, :o2, 41900400
|
56
|
+
tz.transition 1971, 10, :o1, 55123200
|
57
|
+
tz.transition 1972, 4, :o2, 73522800
|
58
|
+
tz.transition 1972, 10, :o1, 86745600
|
59
|
+
tz.transition 1973, 4, :o2, 105058800
|
60
|
+
tz.transition 1973, 10, :o1, 118281600
|
61
|
+
tz.transition 1974, 4, :o2, 136594800
|
62
|
+
tz.transition 1974, 10, :o1, 149817600
|
63
|
+
tz.transition 1975, 4, :o2, 168130800
|
64
|
+
tz.transition 1975, 10, :o1, 181353600
|
65
|
+
tz.transition 1976, 4, :o2, 199753200
|
66
|
+
tz.transition 1976, 10, :o1, 212976000
|
67
|
+
tz.transition 1977, 4, :o2, 231289200
|
68
|
+
tz.transition 1977, 10, :o1, 244512000
|
69
|
+
tz.transition 1978, 4, :o2, 262825200
|
70
|
+
tz.transition 1978, 10, :o1, 276048000
|
71
|
+
tz.transition 1979, 4, :o2, 294361200
|
72
|
+
tz.transition 1979, 10, :o1, 307584000
|
73
|
+
tz.transition 1980, 4, :o2, 325983600
|
74
|
+
tz.transition 1980, 10, :o1, 339206400
|
75
|
+
tz.transition 1981, 4, :o2, 357519600
|
76
|
+
tz.transition 1981, 10, :o1, 370742400
|
77
|
+
tz.transition 1982, 7, :o2, 396399600
|
78
|
+
tz.transition 1982, 10, :o1, 402278400
|
79
|
+
tz.transition 1983, 7, :o2, 426812400
|
80
|
+
tz.transition 1983, 10, :o1, 433814400
|
81
|
+
tz.transition 1984, 4, :o2, 452214000
|
82
|
+
tz.transition 1984, 10, :o1, 465436800
|
83
|
+
tz.transition 1985, 4, :o2, 483750000
|
84
|
+
tz.transition 1985, 10, :o1, 496972800
|
85
|
+
tz.transition 1986, 4, :o2, 515286000
|
86
|
+
tz.transition 1986, 10, :o1, 528508800
|
87
|
+
tz.transition 1987, 4, :o2, 546822000
|
88
|
+
tz.transition 1987, 10, :o1, 560044800
|
89
|
+
tz.transition 1988, 4, :o2, 578444400
|
90
|
+
tz.transition 1988, 10, :o1, 591667200
|
91
|
+
tz.transition 1989, 5, :o2, 610412400
|
92
|
+
tz.transition 1989, 10, :o1, 623203200
|
93
|
+
tz.transition 1990, 4, :o2, 641516400
|
94
|
+
tz.transition 1990, 10, :o1, 654739200
|
95
|
+
tz.transition 1991, 4, :o2, 673052400
|
96
|
+
tz.transition 1991, 10, :o1, 686275200
|
97
|
+
tz.transition 1992, 4, :o2, 704674800
|
98
|
+
tz.transition 1992, 10, :o1, 717897600
|
99
|
+
tz.transition 1993, 4, :o2, 736210800
|
100
|
+
tz.transition 1993, 10, :o1, 749433600
|
101
|
+
tz.transition 1994, 4, :o2, 767746800
|
102
|
+
tz.transition 1994, 10, :o1, 780969600
|
103
|
+
tz.transition 1995, 4, :o2, 799020000
|
104
|
+
tz.transition 1995, 9, :o1, 812322000
|
105
|
+
tz.transition 1996, 4, :o2, 830469600
|
106
|
+
tz.transition 1996, 9, :o1, 843771600
|
107
|
+
tz.transition 1997, 4, :o2, 861919200
|
108
|
+
tz.transition 1997, 9, :o1, 875221200
|
109
|
+
tz.transition 1998, 4, :o2, 893368800
|
110
|
+
tz.transition 1998, 9, :o1, 906670800
|
111
|
+
tz.transition 1999, 4, :o2, 925423200
|
112
|
+
tz.transition 1999, 9, :o1, 938725200
|
113
|
+
tz.transition 2000, 4, :o2, 956872800
|
114
|
+
tz.transition 2000, 9, :o1, 970174800
|
115
|
+
tz.transition 2001, 4, :o2, 988322400
|
116
|
+
tz.transition 2001, 9, :o1, 1001624400
|
117
|
+
tz.transition 2002, 4, :o2, 1019772000
|
118
|
+
tz.transition 2002, 9, :o1, 1033074000
|
119
|
+
tz.transition 2003, 4, :o2, 1051221600
|
120
|
+
tz.transition 2003, 9, :o1, 1064523600
|
121
|
+
tz.transition 2004, 4, :o2, 1083276000
|
122
|
+
tz.transition 2004, 9, :o1, 1096578000
|
123
|
+
tz.transition 2005, 4, :o2, 1114725600
|
124
|
+
tz.transition 2005, 9, :o1, 1128027600
|
125
|
+
tz.transition 2006, 4, :o2, 1146175200
|
126
|
+
tz.transition 2006, 9, :o1, 1158872400
|
127
|
+
tz.transition 2007, 4, :o2, 1177624800
|
128
|
+
tz.transition 2007, 9, :o1, 1189112400
|
129
|
+
tz.transition 2008, 4, :o2, 1209074400
|
130
|
+
tz.transition 2008, 8, :o1, 1219957200
|
131
|
+
tz.transition 2009, 4, :o2, 1240524000
|
132
|
+
tz.transition 2009, 8, :o1, 1250802000
|
133
|
+
tz.transition 2010, 4, :o2, 1272578400
|
134
|
+
tz.transition 2010, 9, :o1, 1285880400
|
135
|
+
tz.transition 2011, 4, :o2, 1304028000
|
136
|
+
tz.transition 2011, 9, :o1, 1317330000
|
137
|
+
tz.transition 2012, 4, :o2, 1335477600
|
138
|
+
tz.transition 2012, 9, :o1, 1348779600
|
139
|
+
tz.transition 2013, 4, :o2, 1366927200
|
140
|
+
tz.transition 2013, 9, :o1, 1380229200
|
141
|
+
tz.transition 2014, 4, :o2, 1398376800
|
142
|
+
tz.transition 2014, 9, :o1, 1411678800
|
143
|
+
tz.transition 2015, 4, :o2, 1429826400
|
144
|
+
tz.transition 2015, 9, :o1, 1443128400
|
145
|
+
tz.transition 2016, 4, :o2, 1461880800
|
146
|
+
tz.transition 2016, 9, :o1, 1475182800
|
147
|
+
tz.transition 2017, 4, :o2, 1493330400
|
148
|
+
tz.transition 2017, 9, :o1, 1506632400
|
149
|
+
tz.transition 2018, 4, :o2, 1524780000
|
150
|
+
tz.transition 2018, 9, :o1, 1538082000
|
151
|
+
tz.transition 2019, 4, :o2, 1556229600
|
152
|
+
tz.transition 2019, 9, :o1, 1569531600
|
153
|
+
tz.transition 2020, 4, :o2, 1587679200
|
154
|
+
tz.transition 2020, 9, :o1, 1600981200
|
155
|
+
tz.transition 2021, 4, :o2, 1619733600
|
156
|
+
tz.transition 2021, 9, :o1, 1633035600
|
157
|
+
tz.transition 2022, 4, :o2, 1651183200
|
158
|
+
tz.transition 2022, 9, :o1, 1664485200
|
159
|
+
tz.transition 2023, 4, :o2, 1682632800
|
160
|
+
tz.transition 2023, 9, :o1, 1695934800
|
161
|
+
tz.transition 2024, 4, :o2, 1714082400
|
162
|
+
tz.transition 2024, 9, :o1, 1727384400
|
163
|
+
tz.transition 2025, 4, :o2, 1745532000
|
164
|
+
tz.transition 2025, 9, :o1, 1758834000
|
165
|
+
tz.transition 2026, 4, :o2, 1776981600
|
166
|
+
tz.transition 2026, 9, :o1, 1790283600
|
167
|
+
tz.transition 2027, 4, :o2, 1809036000
|
168
|
+
tz.transition 2027, 9, :o1, 1822338000
|
169
|
+
tz.transition 2028, 4, :o2, 1840485600
|
170
|
+
tz.transition 2028, 9, :o1, 1853787600
|
171
|
+
tz.transition 2029, 4, :o2, 1871935200
|
172
|
+
tz.transition 2029, 9, :o1, 1885237200
|
173
|
+
tz.transition 2030, 4, :o2, 1903384800
|
174
|
+
tz.transition 2030, 9, :o1, 1916686800
|
175
|
+
tz.transition 2031, 4, :o2, 1934834400
|
176
|
+
tz.transition 2031, 9, :o1, 1948136400
|
177
|
+
tz.transition 2032, 4, :o2, 1966888800
|
178
|
+
tz.transition 2032, 9, :o1, 1980190800
|
179
|
+
tz.transition 2033, 4, :o2, 1998338400
|
180
|
+
tz.transition 2033, 9, :o1, 2011640400
|
181
|
+
tz.transition 2034, 4, :o2, 2029788000
|
182
|
+
tz.transition 2034, 9, :o1, 2043090000
|
183
|
+
tz.transition 2035, 4, :o2, 2061237600
|
184
|
+
tz.transition 2035, 9, :o1, 2074539600
|
185
|
+
tz.transition 2036, 4, :o2, 2092687200
|
186
|
+
tz.transition 2036, 9, :o1, 2105989200
|
187
|
+
tz.transition 2037, 4, :o2, 2124136800
|
188
|
+
tz.transition 2037, 9, :o1, 2137438800
|
189
|
+
tz.transition 2038, 4, :o2, 29586521, 12
|
190
|
+
tz.transition 2038, 9, :o1, 19725579, 8
|
191
|
+
tz.transition 2039, 4, :o2, 29590889, 12
|
192
|
+
tz.transition 2039, 9, :o1, 19728491, 8
|
193
|
+
tz.transition 2040, 4, :o2, 29595257, 12
|
194
|
+
tz.transition 2040, 9, :o1, 19731403, 8
|
195
|
+
tz.transition 2041, 4, :o2, 29599625, 12
|
196
|
+
tz.transition 2041, 9, :o1, 19734315, 8
|
197
|
+
tz.transition 2042, 4, :o2, 29603993, 12
|
198
|
+
tz.transition 2042, 9, :o1, 19737227, 8
|
199
|
+
tz.transition 2043, 4, :o2, 29608361, 12
|
200
|
+
tz.transition 2043, 9, :o1, 19740139, 8
|
201
|
+
tz.transition 2044, 4, :o2, 29612813, 12
|
202
|
+
tz.transition 2044, 9, :o1, 19743107, 8
|
203
|
+
tz.transition 2045, 4, :o2, 29617181, 12
|
204
|
+
tz.transition 2045, 9, :o1, 19746019, 8
|
205
|
+
tz.transition 2046, 4, :o2, 29621549, 12
|
206
|
+
tz.transition 2046, 9, :o1, 19748931, 8
|
207
|
+
tz.transition 2047, 4, :o2, 29625917, 12
|
208
|
+
tz.transition 2047, 9, :o1, 19751843, 8
|
209
|
+
tz.transition 2048, 4, :o2, 29630285, 12
|
210
|
+
tz.transition 2048, 9, :o1, 19754755, 8
|
211
|
+
tz.transition 2049, 4, :o2, 29634737, 12
|
212
|
+
tz.transition 2049, 9, :o1, 19757723, 8
|
213
|
+
tz.transition 2050, 4, :o2, 29639105, 12
|
214
|
+
tz.transition 2050, 9, :o1, 19760635, 8
|
215
|
+
end
|
216
|
+
end
|
217
|
+
end
|
218
|
+
end
|
219
|
+
end
|