dialable 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2008 Chris Horn http://chorn.com/
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README ADDED
@@ -0,0 +1,33 @@
1
+
2
+ Phone numbers are not a big deal if you can validate the input at the
3
+ time you've got a human right there. My enterprise tends not to have
4
+ that ability, as we receive large files from clients with little or no
5
+ validation done. Rather than abandon #s which don't validate, I wrote
6
+ this to parse and normalize a string into a standard NANP phone
7
+ number, possibly including an extension.
8
+
9
+ References: NANPA: North American Numbering Plan Administration http://nanpa.com/
10
+
11
+ The YAML file with the valid area codes and easily recognizable codes
12
+ (like 911) can get out of date. To update your own copy, run:
13
+
14
+ support/make_yaml_nanpa.rb > support/nanpa.yaml
15
+
16
+
17
+ require "dialable"
18
+ pn = Dialable::NANP.parse("+1(800)555-1212 ext 1234")
19
+
20
+ >> puts pn.to_s // Pretty output
21
+ 800-555-1212 x1234
22
+
23
+ >> puts pn.to_digits // Address book friendly
24
+ 8005551212 x1234
25
+
26
+ >> puts pn.to_dialable // PBX friendly
27
+ 8005551212
28
+
29
+ >> puts pn.extension
30
+ 1234
31
+
32
+
33
+ -chorn
@@ -0,0 +1,3 @@
1
+ == dialable
2
+
3
+ A gem that provides parsing and output of phone numbers according to NANPA standards.
@@ -0,0 +1,57 @@
1
+ require 'rubygems'
2
+ require 'rake/gempackagetask'
3
+ require 'rubygems/specification'
4
+ require 'date'
5
+ require 'spec/rake/spectask'
6
+
7
+ GEM = "dialable"
8
+ GEM_VERSION = "0.0.1"
9
+ AUTHOR = "Chris Horn"
10
+ EMAIL = "chorn@chorn.com"
11
+ HOMEPAGE = "http://github.com/chorn/dialable"
12
+ SUMMARY = "A gem that provides parsing and output of phone numbers according to NANPA standards."
13
+
14
+ spec = Gem::Specification.new do |s|
15
+ s.name = GEM
16
+ s.version = GEM_VERSION
17
+ s.platform = Gem::Platform::RUBY
18
+ s.has_rdoc = true
19
+ s.extra_rdoc_files = ["README", "LICENSE", 'TODO']
20
+ s.summary = SUMMARY
21
+ s.description = s.summary
22
+ s.author = AUTHOR
23
+ s.email = EMAIL
24
+ s.homepage = HOMEPAGE
25
+
26
+ # Uncomment this to add a dependency
27
+ # s.add_dependency "foo"
28
+
29
+ s.require_path = 'lib'
30
+ s.autorequire = GEM
31
+ s.files = %w(LICENSE README Rakefile TODO) + Dir.glob("{lib,spec}/**/*")
32
+ end
33
+
34
+ task :default => :spec
35
+
36
+ desc "Run specs"
37
+ Spec::Rake::SpecTask.new do |t|
38
+ t.spec_files = FileList['spec/**/*_spec.rb']
39
+ t.spec_opts = %w(-fs --color)
40
+ end
41
+
42
+
43
+ Rake::GemPackageTask.new(spec) do |pkg|
44
+ pkg.gem_spec = spec
45
+ end
46
+
47
+ desc "install the gem locally"
48
+ task :install => [:package] do
49
+ sh %{sudo gem install pkg/#{GEM}-#{GEM_VERSION}}
50
+ end
51
+
52
+ desc "create a gemspec file"
53
+ task :make_spec do
54
+ File.open("#{GEM}.gemspec", "w") do |file|
55
+ file.puts spec.to_ruby
56
+ end
57
+ end
data/TODO ADDED
@@ -0,0 +1,2 @@
1
+ TODO:
2
+ Make rspec actually test some stuff. To be fair I've already tested this against 3.5m numbers from my own system, but I can't post those. :)
@@ -0,0 +1,27 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = "dialable"
3
+ s.version = "0.1.0"
4
+ s.date = "2010-06-21"
5
+ s.summary = "Provides parsing and output of phone numbers according to NANPA standards."
6
+ s.email = "chorn@chorn.com"
7
+ s.homepage = "http://github.com/chorn/dialable"
8
+ s.description = "A gem that provides parsing and output of phone numbers according to NANPA (North American Numbering Plan Administration) standards. If possible, time zones are populated by abbreviation as well as offset relative to the local timezone."
9
+ s.has_rdoc = true
10
+ s.authors = ["Chris Horn"]
11
+ s.files = [ "LICENSE",
12
+ "README",
13
+ "README.rdoc",
14
+ "Rakefile",
15
+ "TODO",
16
+ "dialable.gemspec",
17
+ "lib/dialable.rb",
18
+ "script/destroy",
19
+ "script/generate",
20
+ "spec/dialable_spec.rb",
21
+ "spec/spec_helper.rb",
22
+ "support/make_yaml_nanpa.rb",
23
+ "support/nanpa.yaml",
24
+ ]
25
+ s.test_files = []
26
+ s.rdoc_options = []
27
+ end
@@ -0,0 +1,167 @@
1
+ # Copyright (c) 2008-2010 Chris Horn http://chorn.com/
2
+ # See MIT-LICENSE.txt
3
+
4
+ # TODO: Make this less sucky.
5
+
6
+ require "yaml"
7
+
8
+ module Dialable
9
+ class NANP
10
+
11
+ ##
12
+ # Raised if something other than a valid NANP is supplied
13
+ class InvalidNANPError < StandardError
14
+ end
15
+
16
+ ##
17
+ # ERC, Easily Recognizable Codes
18
+ module ServiceCodes
19
+ ERC = {
20
+ 211 => "Community Information and Referral Services",
21
+ 311 => "Non-Emergency Police and Other Governmental Services",
22
+ 411 => "Local Directory Assistance",
23
+ 511 => "Traffic and Transportation Information (US); Provision of Weather and Traveller Information Services (Canada)",
24
+ 611 => "Repair Service",
25
+ 711 => "Telecommunications Relay Service (TRS)",
26
+ 811 => "Access to One Call Services to Protect Pipeline and Utilities from Excavation Damage (US); Non-Urgent Health Teletriage Services (Canada)",
27
+ 911 => "Emergency"
28
+ }
29
+ end
30
+
31
+ ##
32
+ # Regex's to match valid phone numbers
33
+ module Patterns
34
+ VALID = [
35
+ /^\D*1?\D*([2-9]\d\d)\D*(\d{3})\D*(\d{4})\D*[ex]+\D*(\d{1,5})\D*$/i,
36
+ /^\D*1?\D*([2-9]\d\d)[ $\\\.-]*(\d{3})[ $\\\.-]*(\d{4})[ $\\\.\*-]*(\d{1,5})\D*$/i,
37
+ /^\D*1?\D*([2-9]\d\d)\D*(\d{3})\D*(\d{4})\D*$/,
38
+ /^(\D*)(\d{3})\D*(\d{4})\D*$/,
39
+ /^\D*([2-9]11)\D*$/,
40
+ /^\D*1?\D*([2-9]\d\d)\D*(\d{3})\D*(\d{4})\D.*/ # Last ditch, just find a number
41
+ ]
42
+ end
43
+
44
+ ##
45
+ # Valid area codes per nanpa.com
46
+ module AreaCodes
47
+ NANP = YAML.load_file(File.dirname(__FILE__) + "/../support/nanpa.yaml")
48
+ end
49
+
50
+ attr_accessor :areacode, :prefix, :line, :extension, :location, :country, :timezones, :relative_timezones
51
+
52
+ def initialize(parts={})
53
+ self.areacode = parts[:areacode] ? parts[:areacode] : nil
54
+ self.prefix = parts[:prefix] ? parts[:prefix] : nil
55
+ self.line = parts[:line] ? parts[:line] : nil
56
+ self.extension = parts[:extension] ? parts[:extension] : nil
57
+ end
58
+
59
+ def areacode=(raw_code)
60
+ code = raw_code.to_i
61
+ if AreaCodes::NANP[code]
62
+ @areacode = raw_code
63
+ self.location = AreaCodes::NANP[code][:location] if AreaCodes::NANP[code][:location]
64
+ self.country = AreaCodes::NANP[code][:country] if AreaCodes::NANP[code][:country]
65
+
66
+ if AreaCodes::NANP[code][:timezone]
67
+ self.timezones = []
68
+ self.relative_timezones = []
69
+ tz = AreaCodes::NANP[code][:timezone]
70
+ t = Time.now
71
+ local_utc_offset = t.utc_offset/3600
72
+
73
+ if tz =~ /UTC(-\d+)/
74
+ self.timezones << tz
75
+ utc_offset = $1.to_i
76
+ self.relative_timezones << (utc_offset) - local_utc_offset
77
+ else
78
+ tz.split(//).each do |zone| # http://www.timeanddate.com/library/abbreviations/timezones/na/
79
+ zone = "HA" if zone == "H"
80
+ zone = "AK" if zone == "K"
81
+ tz = zone + (t.dst? ? "D" : "S") + "T" # This is cludgey
82
+ self.timezones << tz
83
+ delta = nil
84
+ if Time.zone_offset(tz)
85
+ delta = Time.zone_offset(tz)/3600 - local_utc_offset
86
+ else
87
+ case zone
88
+ when /N[SD]T/
89
+ delta = -3.5 - local_utc_offset
90
+ when /A[SD]T/
91
+ delta = -4 - local_utc_offset
92
+ when /A?K[SD]T/
93
+ delta = -9 - local_utc_offset
94
+ when /HA?[SD]T/
95
+ delta = -10 - local_utc_offset
96
+ end
97
+ delta = delta - 1 if t.dst?
98
+ end
99
+ # puts "#{delta} // #{Time.zone_offset(tz)} // #{tz} // #{local_utc_offset}"
100
+ self.relative_timezones << delta if delta
101
+ end
102
+ end
103
+ end
104
+ else
105
+ raise InvalidNANPError, "#{code} is not a valid NANP Area Code."
106
+ end
107
+ end
108
+
109
+ def timezone
110
+ @timezones.first if @timezones
111
+ end
112
+
113
+ def timezone=(tz)
114
+ @timezones = [tz] if tz
115
+ end
116
+
117
+ # def relative_timezones
118
+ # rt = []
119
+ # @timezones.each do |tz|
120
+ # rt <<
121
+ # end
122
+ # rt
123
+ # end
124
+
125
+
126
+ def self.parse(number)
127
+ Patterns::VALID.each do |pattern|
128
+ return Dialable::NANP.new(:areacode => $1, :prefix => $2, :line => $3, :extension => $4) if number =~ pattern
129
+ end
130
+
131
+ raise InvalidNANPError, "Not a valid NANP Phone Number."
132
+ end
133
+
134
+ def erc?
135
+ return ServiceCodes::ERC[@areacode].nil?
136
+ end
137
+
138
+ def to_s
139
+ rtn = "#{@prefix}-#{@line}"
140
+ rtn = "#{@areacode}-#{rtn}" if @areacode
141
+ rtn = "#{rtn} x#{@extension}" if @extension
142
+ rtn
143
+ end
144
+
145
+ def to_digits
146
+ rtn = "#{@prefix}#{@line}"
147
+ rtn = "#{@areacode}#{rtn}" if @areacode
148
+ rtn = "#{rtn} x#{@extension}" if @extension
149
+ rtn
150
+ end
151
+
152
+ def to_dialable
153
+ rtn = "#{@prefix}#{@line}"
154
+ rtn = "#{@areacode}#{rtn}" if @areacode
155
+ rtn
156
+ end
157
+
158
+ def to_hash
159
+ return {
160
+ :areacode => @areacode,
161
+ :prefix => @prefix,
162
+ :line => @line,
163
+ :extension => @extension
164
+ }
165
+ end
166
+ end
167
+ end
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+ APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))
3
+
4
+ begin
5
+ require 'rubigen'
6
+ rescue LoadError
7
+ require 'rubygems'
8
+ require 'rubigen'
9
+ end
10
+ require 'rubigen/scripts/destroy'
11
+
12
+ ARGV.shift if ['--help', '-h'].include?(ARGV[0])
13
+ RubiGen::Base.use_component_sources! [:newgem_simple, :test_unit]
14
+ RubiGen::Scripts::Destroy.new.run(ARGV)
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+ APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))
3
+
4
+ begin
5
+ require 'rubigen'
6
+ rescue LoadError
7
+ require 'rubygems'
8
+ require 'rubigen'
9
+ end
10
+ require 'rubigen/scripts/generate'
11
+
12
+ ARGV.shift if ['--help', '-h'].include?(ARGV[0])
13
+ RubiGen::Base.use_component_sources! [:newgem_simple, :test_unit]
14
+ RubiGen::Scripts::Generate.new.run(ARGV)
@@ -0,0 +1,7 @@
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
+
3
+ describe "dialable" do
4
+ it "should do nothing" do
5
+ true.should == true
6
+ end
7
+ end
@@ -0,0 +1,2 @@
1
+ $TESTING=true
2
+ $:.push File.join(File.dirname(__FILE__), '..', 'lib')
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "csv"
4
+ require "fileutils"
5
+ require "yaml"
6
+
7
+ system('wget --quiet "http://nanpa.com/npa/AllNPAs.zip"')
8
+ system('unzip -qj AllNPAs.zip AllNPAs.mdb')
9
+ system('mdb-export AllNPAs.mdb "`mdb-tables -1 AllNPAs.mdb`" > AllNPAs.csv')
10
+
11
+ all = CSV.read("AllNPAs.csv")
12
+ h = all[0]
13
+
14
+ nanpa = { :created => Time.now }
15
+
16
+ all.each do |row|
17
+ next unless row[h.index("In Service?")] == "Yes"
18
+ areacode = row.values_at(h.index("NPA")).to_s.to_i
19
+ nanpa[areacode] = {}
20
+ nanpa[areacode][:location] = row.values_at(h.index("Location")).to_s if row.values_at(h.index("Location")).to_s.size > 0 and row.values_at(h.index("Location")).to_s.size =~ /NANP area/
21
+ nanpa[areacode][:country] = row.values_at(h.index("Country")).to_s if row.values_at(h.index("Country")).to_s.size > 0
22
+ nanpa[areacode][:timezone] = row.values_at(h.index("Time Zone")).to_s if row.values_at(h.index("Time Zone")).to_s.size > 0
23
+ end
24
+
25
+ puts nanpa.to_yaml
26
+
27
+ FileUtils.rm ["AllNPAs.zip", "AllNPAs.mdb", "AllNPAs.csv"]
28
+
29
+
@@ -0,0 +1,1033 @@
1
+ ---
2
+ 971:
3
+ :country: US
4
+ :timezone: P
5
+ 904:
6
+ :country: US
7
+ :timezone: E
8
+ 770:
9
+ :country: US
10
+ :timezone: E
11
+ 234:
12
+ :country: US
13
+ :timezone: E
14
+ 435:
15
+ :country: US
16
+ :timezone: M
17
+ 636:
18
+ :country: US
19
+ :timezone: C
20
+ 301:
21
+ :country: US
22
+ :timezone: E
23
+ 502:
24
+ :country: US
25
+ :timezone: E
26
+ 703:
27
+ :country: US
28
+ :timezone: E
29
+ 804:
30
+ :country: US
31
+ :timezone: E
32
+ 201:
33
+ :country: US
34
+ :timezone: E
35
+ 402:
36
+ :country: US
37
+ :timezone: C
38
+ 603:
39
+ :country: US
40
+ :timezone: E
41
+ 268:
42
+ :country: ANTIGUA/BARBUDA
43
+ :timezone: A
44
+ 469:
45
+ :country: US
46
+ :timezone: C
47
+ 670:
48
+ :country: US
49
+ :timezone: (UTC+10)
50
+ 972:
51
+ :country: US
52
+ :timezone: C
53
+ 905:
54
+ :country: CANADA
55
+ :timezone: E
56
+ 570:
57
+ :country: US
58
+ :timezone: E
59
+ 302:
60
+ :country: US
61
+ :timezone: E
62
+ 503:
63
+ :country: US
64
+ :timezone: P
65
+ 704:
66
+ :country: US
67
+ :timezone: E
68
+ 939:
69
+ :country: US
70
+ :timezone: A
71
+ 872:
72
+ :country: US
73
+ :timezone: C
74
+ 805:
75
+ :country: US
76
+ :timezone: P
77
+ 202:
78
+ :country: US
79
+ :timezone: E
80
+ 403:
81
+ :country: CANADA
82
+ :timezone: M
83
+ 604:
84
+ :country: CANADA
85
+ :timezone: P
86
+ 269:
87
+ :country: US
88
+ :timezone: E
89
+ 470:
90
+ :country: US
91
+ :timezone: E
92
+ 671:
93
+ :country: US
94
+ :timezone: (UTC+10)
95
+ 336:
96
+ :country: US
97
+ :timezone: E
98
+ 973:
99
+ :country: US
100
+ :timezone: E
101
+ 906:
102
+ :country: US
103
+ :timezone: EC
104
+ 772:
105
+ :country: US
106
+ :timezone: E
107
+ 571:
108
+ :country: US
109
+ :timezone: E
110
+ 303:
111
+ :country: US
112
+ :timezone: M
113
+ 504:
114
+ :country: US
115
+ :timezone: C
116
+ 705:
117
+ :country: CANADA
118
+ :timezone: E
119
+ 940:
120
+ :country: US
121
+ :timezone: C
122
+ 806:
123
+ :country: US
124
+ :timezone: C
125
+ 404:
126
+ :country: US
127
+ :timezone: E
128
+ 605:
129
+ :country: US
130
+ :timezone: CM
131
+ 270:
132
+ :country: US
133
+ :timezone: EC
134
+ 337:
135
+ :country: US
136
+ :timezone: C
137
+ 203:
138
+ :country: US
139
+ :timezone: E
140
+ 907:
141
+ :country: US
142
+ :timezone: (UTC-9)
143
+ 773:
144
+ :country: US
145
+ :timezone: C
146
+ 438:
147
+ :country: CANADA
148
+ :timezone: E
149
+ 304:
150
+ :country: US
151
+ :timezone: E
152
+ 505:
153
+ :country: US
154
+ :timezone: M
155
+ 706:
156
+ :country: US
157
+ :timezone: E
158
+ 941:
159
+ :country: US
160
+ :timezone: E
161
+ 807:
162
+ :country: CANADA
163
+ :timezone: EC
164
+ 740:
165
+ :country: US
166
+ :timezone: E
167
+ 405:
168
+ :country: US
169
+ :timezone: C
170
+ 606:
171
+ :country: US
172
+ :timezone: EC
173
+ 204:
174
+ :country: CANADA
175
+ :timezone: C
176
+ 908:
177
+ :country: US
178
+ :timezone: E
179
+ 774:
180
+ :country: US
181
+ :timezone: E
182
+ 305:
183
+ :country: US
184
+ :timezone: E
185
+ 506:
186
+ :country: CANADA
187
+ :timezone: A
188
+ 707:
189
+ :country: US
190
+ :timezone: P
191
+ 573:
192
+ :country: US
193
+ :timezone: C
194
+ 808:
195
+ :country: US
196
+ :timezone: (UTC-10)
197
+ 406:
198
+ :country: US
199
+ :timezone: M
200
+ 607:
201
+ :country: US
202
+ :timezone: E
203
+ 473:
204
+ :country: GRENADA
205
+ :timezone: A
206
+ 339:
207
+ :country: US
208
+ :timezone: E
209
+ 540:
210
+ :country: US
211
+ :timezone: E
212
+ 205:
213
+ :country: US
214
+ :timezone: C
215
+ 909:
216
+ :country: US
217
+ :timezone: P
218
+ 775:
219
+ :country: US
220
+ :timezone: P
221
+ 239:
222
+ :country: US
223
+ :timezone: E
224
+ 440:
225
+ :country: US
226
+ :timezone: E
227
+ 641:
228
+ :country: US
229
+ :timezone: C
230
+ 306:
231
+ :country: CANADA
232
+ :timezone: C
233
+ 507:
234
+ :country: US
235
+ :timezone: C
236
+ 708:
237
+ :country: US
238
+ :timezone: C
239
+ 574:
240
+ :country: US
241
+ :timezone: EC
242
+ 876:
243
+ :country: JAMAICA
244
+ :timezone: E
245
+ 809:
246
+ :country: Dominican Republic
247
+ :timezone: E
248
+ 608:
249
+ :country: US
250
+ :timezone: C
251
+ 340:
252
+ :country: US
253
+ :timezone: A
254
+ 541:
255
+ :country: US
256
+ :timezone: MP
257
+ 206:
258
+ :country: US
259
+ :timezone: P
260
+ 407:
261
+ :country: US
262
+ :timezone: E
263
+ 910:
264
+ :country: US
265
+ :timezone: E
266
+ 843:
267
+ :country: US
268
+ :timezone: E
269
+ 441:
270
+ :country: BERMUDA
271
+ :timezone: A
272
+ 307:
273
+ :country: US
274
+ :timezone: M
275
+ 508:
276
+ :country: US
277
+ :timezone: E
278
+ 709:
279
+ :country: CANADA
280
+ :timezone: NA
281
+ 575:
282
+ :country: US
283
+ :timezone: M
284
+ 240:
285
+ :country: US
286
+ :timezone: E
287
+ 877: {}
288
+
289
+ 810:
290
+ :country: US
291
+ :timezone: E
292
+ 609:
293
+ :country: US
294
+ :timezone: E
295
+ 475:
296
+ :country: US
297
+ :timezone: E
298
+ 207:
299
+ :country: US
300
+ :timezone: E
301
+ 408:
302
+ :country: US
303
+ :timezone: P
304
+ 978:
305
+ :country: US
306
+ :timezone: E
307
+ 442:
308
+ :country: US
309
+ :timezone: P
310
+ 308:
311
+ :country: US
312
+ :timezone: CM
313
+ 509:
314
+ :country: US
315
+ :timezone: P
316
+ 710:
317
+ :country: US
318
+ 878:
319
+ :country: US
320
+ :timezone: E
321
+ 208:
322
+ :country: US
323
+ :timezone: MP
324
+ 409:
325
+ :country: US
326
+ :timezone: C
327
+ 610:
328
+ :country: US
329
+ :timezone: E
330
+ 979:
331
+ :country: US
332
+ :timezone: C
333
+ 912:
334
+ :country: US
335
+ :timezone: E
336
+ 845:
337
+ :country: US
338
+ :timezone: E
339
+ 778:
340
+ :country: CANADA
341
+ :timezone: P
342
+ 443:
343
+ :country: US
344
+ :timezone: E
345
+ 309:
346
+ :country: US
347
+ :timezone: C
348
+ 510:
349
+ :country: US
350
+ :timezone: P
351
+ 242:
352
+ :country: BAHAMAS
353
+ :timezone: E
354
+ 812:
355
+ :country: US
356
+ :timezone: EC
357
+ 276:
358
+ :country: US
359
+ :timezone: E
360
+ 678:
361
+ :country: US
362
+ :timezone: E
363
+ 209:
364
+ :country: US
365
+ :timezone: P
366
+ 410:
367
+ :country: US
368
+ :timezone: E
369
+ 980:
370
+ :country: US
371
+ :timezone: E
372
+ 913:
373
+ :country: US
374
+ :timezone: C
375
+ 779:
376
+ :country: US
377
+ :timezone: C
378
+ 310:
379
+ :country: US
380
+ :timezone: P
381
+ 712:
382
+ :country: US
383
+ :timezone: C
384
+ 947:
385
+ :country: US
386
+ :timezone: E
387
+ 813:
388
+ :country: US
389
+ :timezone: E
390
+ 478:
391
+ :country: US
392
+ :timezone: E
393
+ 210:
394
+ :country: US
395
+ :timezone: C
396
+ 612:
397
+ :country: US
398
+ :timezone: C
399
+ 914:
400
+ :country: US
401
+ :timezone: E
402
+ 847:
403
+ :country: US
404
+ :timezone: C
405
+ 780:
406
+ :country: CANADA
407
+ :timezone: M
408
+ 646:
409
+ :country: US
410
+ :timezone: E
411
+ 512:
412
+ :country: US
413
+ :timezone: C
414
+ 713:
415
+ :country: US
416
+ :timezone: C
417
+ 814:
418
+ :country: US
419
+ :timezone: E
420
+ 747:
421
+ :country: US
422
+ :timezone: P
423
+ 479:
424
+ :country: US
425
+ :timezone: C
426
+ 345:
427
+ :country: CAYMAN ISLANDS
428
+ :timezone: E
429
+ 412:
430
+ :country: US
431
+ :timezone: E
432
+ 613:
433
+ :country: CANADA
434
+ :timezone: E
435
+ 915:
436
+ :country: US
437
+ :timezone: CM
438
+ 848:
439
+ :country: US
440
+ :timezone: E
441
+ 781:
442
+ :country: US
443
+ :timezone: E
444
+ 312:
445
+ :country: US
446
+ :timezone: C
447
+ 513:
448
+ :country: US
449
+ :timezone: E
450
+ 714:
451
+ :country: US
452
+ :timezone: P
453
+ 580:
454
+ :country: US
455
+ :timezone: C
456
+ 647:
457
+ :country: CANADA
458
+ :timezone: E
459
+ 949:
460
+ :country: US
461
+ :timezone: P
462
+ 815:
463
+ :country: US
464
+ :timezone: C
465
+ 480:
466
+ :country: US
467
+ :timezone: M
468
+ 681:
469
+ :country: US
470
+ :timezone: E
471
+ 212:
472
+ :country: US
473
+ :timezone: E
474
+ 413:
475
+ :country: US
476
+ :timezone: E
477
+ 614:
478
+ :country: US
479
+ :timezone: E
480
+ 916:
481
+ :country: US
482
+ :timezone: P
483
+ 849:
484
+ :country: Dominican Republic
485
+ :timezone: E
486
+ 715:
487
+ :country: US
488
+ :timezone: C
489
+ 313:
490
+ :country: US
491
+ :timezone: E
492
+ 514:
493
+ :country: CANADA
494
+ :timezone: E
495
+ 581:
496
+ :country: CANADA
497
+ 246:
498
+ :country: BARBADOS
499
+ :timezone: A
500
+ 816:
501
+ :country: US
502
+ :timezone: C
503
+ 682:
504
+ :country: US
505
+ :timezone: C
506
+ 347:
507
+ :country: US
508
+ :timezone: E
509
+ 213:
510
+ :country: US
511
+ :timezone: P
512
+ 414:
513
+ :country: US
514
+ :timezone: C
515
+ 615:
516
+ :country: US
517
+ :timezone: C
518
+ 917:
519
+ :country: US
520
+ :timezone: E
521
+ 850:
522
+ :country: US
523
+ :timezone: EC
524
+ 716:
525
+ :country: US
526
+ :timezone: E
527
+ 515:
528
+ :country: US
529
+ :timezone: C
530
+ 649:
531
+ :country: TURKS & CAICOS ISLANDS
532
+ :timezone: E
533
+ 314:
534
+ :country: US
535
+ :timezone: C
536
+ 951:
537
+ :country: US
538
+ :timezone: P
539
+ 817:
540
+ :country: US
541
+ :timezone: C
542
+ :created: 2010-06-21 13:20:00.751884 -04:00
543
+ 214:
544
+ :country: US
545
+ :timezone: C
546
+ 415:
547
+ :country: US
548
+ :timezone: P
549
+ 616:
550
+ :country: US
551
+ :timezone: E
552
+ 281:
553
+ :country: US
554
+ :timezone: C
555
+ 985:
556
+ :country: US
557
+ :timezone: C
558
+ 918:
559
+ :country: US
560
+ :timezone: C
561
+ 784:
562
+ :country: ST. VINCENT & GRENADINES
563
+ :timezone: A
564
+ 717:
565
+ :country: US
566
+ :timezone: E
567
+ 516:
568
+ :country: US
569
+ :timezone: E
570
+ 248:
571
+ :country: US
572
+ :timezone: E
573
+ 650:
574
+ :country: US
575
+ :timezone: P
576
+ 315:
577
+ :country: US
578
+ :timezone: E
579
+ 952:
580
+ :country: US
581
+ :timezone: C
582
+ 818:
583
+ :country: US
584
+ :timezone: P
585
+ 215:
586
+ :country: US
587
+ :timezone: E
588
+ 416:
589
+ :country: CANADA
590
+ :timezone: E
591
+ 617:
592
+ :country: US
593
+ :timezone: E
594
+ 684:
595
+ :country: US
596
+ 919:
597
+ :country: US
598
+ :timezone: E
599
+ 785:
600
+ :country: US
601
+ :timezone: CM
602
+ 718:
603
+ :country: US
604
+ :timezone: E
605
+ 517:
606
+ :country: US
607
+ :timezone: E
608
+ 450:
609
+ :country: CANADA
610
+ :timezone: E
611
+ 651:
612
+ :country: US
613
+ :timezone: C
614
+ 316:
615
+ :country: US
616
+ :timezone: C
617
+ 819:
618
+ :country: CANADA
619
+ :timezone: E
620
+ 551:
621
+ :country: US
622
+ :timezone: E
623
+ 216:
624
+ :country: US
625
+ :timezone: E
626
+ 417:
627
+ :country: US
628
+ :timezone: C
629
+ 618:
630
+ :country: US
631
+ :timezone: C
632
+ 484:
633
+ :country: US
634
+ :timezone: E
635
+ 920:
636
+ :country: US
637
+ :timezone: C
638
+ 786:
639
+ :country: US
640
+ :timezone: E
641
+ 719:
642
+ :country: US
643
+ :timezone: M
644
+ 585:
645
+ :country: US
646
+ :timezone: E
647
+ 250:
648
+ :country: CANADA
649
+ :timezone: P
650
+ 317:
651
+ :country: US
652
+ :timezone: E
653
+ 518:
654
+ :country: US
655
+ :timezone: E
656
+ 954:
657
+ :country: US
658
+ :timezone: E
659
+ 217:
660
+ :country: US
661
+ :timezone: C
662
+ 418:
663
+ :country: CANADA
664
+ :timezone: E
665
+ 619:
666
+ :country: US
667
+ :timezone: P
668
+ 284:
669
+ :country: BRITISH VIRGIN ISLANDS
670
+ :timezone: A
671
+ 351:
672
+ :country: US
673
+ :timezone: E
674
+ 787:
675
+ :country: US
676
+ :timezone: A
677
+ 720:
678
+ :country: US
679
+ :timezone: M
680
+ 385:
681
+ :country: US
682
+ :timezone: M
683
+ 586:
684
+ :country: US
685
+ :timezone: E
686
+ 251:
687
+ :country: US
688
+ :timezone: C
689
+ 318:
690
+ :country: US
691
+ :timezone: C
692
+ 519:
693
+ :country: CANADA
694
+ :timezone: E
695
+ 888: {}
696
+
697
+ 754:
698
+ :country: US
699
+ :timezone: E
700
+ 218:
701
+ :country: US
702
+ :timezone: C
703
+ 419:
704
+ :country: US
705
+ :timezone: E
706
+ 620:
707
+ :country: US
708
+ :timezone: CM
709
+ 352:
710
+ :country: US
711
+ :timezone: E
712
+ 989:
713
+ :country: US
714
+ :timezone: E
715
+ 386:
716
+ :country: US
717
+ :timezone: E
718
+ 587:
719
+ :country: CANADA
720
+ :timezone: M
721
+ 252:
722
+ :country: US
723
+ :timezone: E
724
+ 319:
725
+ :country: US
726
+ :timezone: C
727
+ 520:
728
+ :country: US
729
+ :timezone: M
730
+ 956:
731
+ :country: US
732
+ :timezone: C
733
+ 219:
734
+ :country: US
735
+ :timezone: EC
736
+ 856:
737
+ :country: US
738
+ :timezone: E
739
+ 253:
740
+ :country: US
741
+ :timezone: P
742
+ 320:
743
+ :country: US
744
+ :timezone: C
745
+ 857:
746
+ :country: US
747
+ :timezone: E
748
+ 254:
749
+ :country: US
750
+ :timezone: C
751
+ 321:
752
+ :country: US
753
+ :timezone: E
754
+ 757:
755
+ :country: US
756
+ :timezone: E
757
+ 623:
758
+ :country: US
759
+ :timezone: M
760
+ 925:
761
+ :country: US
762
+ :timezone: P
763
+ 858:
764
+ :country: US
765
+ :timezone: P
766
+ 724:
767
+ :country: US
768
+ :timezone: E
769
+ 456: {}
770
+
771
+ 657:
772
+ :country: US
773
+ :timezone: P
774
+ 758:
775
+ :country: ST. LUCIA
776
+ :timezone: A
777
+ 423:
778
+ :country: US
779
+ :timezone: EC
780
+ 289:
781
+ :country: CANADA
782
+ :timezone: E
783
+ 859:
784
+ :country: US
785
+ :timezone: E
786
+ 256:
787
+ :country: US
788
+ :timezone: C
789
+ 323:
790
+ :country: US
791
+ :timezone: P
792
+ 424:
793
+ :country: US
794
+ :timezone: P
795
+ 860:
796
+ :country: US
797
+ :timezone: E
798
+ 458:
799
+ :country: US
800
+ :timezone: MP
801
+ 760:
802
+ :country: US
803
+ :timezone: P
804
+ 626:
805
+ :country: US
806
+ :timezone: P
807
+ 559:
808
+ :country: US
809
+ :timezone: P
810
+ 224:
811
+ :country: US
812
+ :timezone: C
813
+ 425:
814
+ :country: US
815
+ :timezone: P
816
+ 928:
817
+ :country: US
818
+ :timezone: M
819
+ 727:
820
+ :country: US
821
+ :timezone: E
822
+ 660:
823
+ :country: US
824
+ :timezone: C
825
+ 325:
826
+ :country: US
827
+ :timezone: C
828
+ 828:
829
+ :country: US
830
+ :timezone: E
831
+ 225:
832
+ :country: US
833
+ :timezone: C
834
+ 862:
835
+ :country: US
836
+ :timezone: E
837
+ 661:
838
+ :country: US
839
+ :timezone: P
840
+ 829:
841
+ :country: Dominican Republic
842
+ :timezone: E
843
+ 762:
844
+ :country: US
845
+ :timezone: E
846
+ 360:
847
+ :country: US
848
+ :timezone: P
849
+ 561:
850
+ :country: US
851
+ :timezone: E
852
+ 226:
853
+ :country: CANADA
854
+ :timezone: E
855
+ 863:
856
+ :country: US
857
+ :timezone: E
858
+ 662:
859
+ :country: US
860
+ :timezone: C
861
+ 260:
862
+ :country: US
863
+ :timezone: E
864
+ 830:
865
+ :country: US
866
+ :timezone: C
867
+ 763:
868
+ :country: US
869
+ :timezone: C
870
+ 361:
871
+ :country: US
872
+ :timezone: C
873
+ 562:
874
+ :country: US
875
+ :timezone: P
876
+ 931:
877
+ :country: US
878
+ :timezone: EC
879
+ 864:
880
+ :country: US
881
+ :timezone: E
882
+ 831:
883
+ :country: US
884
+ :timezone: P
885
+ 563:
886
+ :country: US
887
+ :timezone: C
888
+ 228:
889
+ :country: US
890
+ :timezone: C
891
+ 630:
892
+ :country: US
893
+ :timezone: C
894
+ 865:
895
+ :country: US
896
+ :timezone: E
897
+ 731:
898
+ :country: US
899
+ :timezone: C
900
+ 664:
901
+ :country: MONTSERRAT
902
+ :timezone: A
903
+ 530:
904
+ :country: US
905
+ :timezone: P
906
+ 262:
907
+ :country: US
908
+ :timezone: C
909
+ 832:
910
+ :country: US
911
+ :timezone: C
912
+ 765:
913
+ :country: US
914
+ :timezone: E
915
+ 229:
916
+ :country: US
917
+ :timezone: E
918
+ 430:
919
+ :country: US
920
+ :timezone: C
921
+ 631:
922
+ :country: US
923
+ :timezone: E
924
+ 866: {}
925
+
926
+ 732:
927
+ :country: US
928
+ :timezone: E
929
+ 330:
930
+ :country: US
931
+ :timezone: E
932
+ 900: {}
933
+
934
+ 867:
935
+ :country: CANADA
936
+ :timezone: CMP
937
+ 800: {}
938
+
939
+ 331:
940
+ :country: US
941
+ :timezone: C
942
+ 264:
943
+ :country: ANGUILLA
944
+ :timezone: A
945
+ 901:
946
+ :country: US
947
+ :timezone: C
948
+ 767:
949
+ :country: DOMINICA
950
+ :timezone: A
951
+ 700: {}
952
+
953
+ 231:
954
+ :country: US
955
+ :timezone: E
956
+ 432:
957
+ :country: US
958
+ :timezone: C
959
+ 868:
960
+ :country: TRINIDAD AND TOBAGO
961
+ :timezone: A
962
+ 801:
963
+ :country: US
964
+ :timezone: M
965
+ 734:
966
+ :country: US
967
+ :timezone: E
968
+ 533: {}
969
+
970
+ 600:
971
+ :country: CANADA
972
+ 902:
973
+ :country: CANADA
974
+ :timezone: A
975
+ 701:
976
+ :country: US
977
+ :timezone: CM
978
+ 567:
979
+ :country: US
980
+ :timezone: E
981
+ 500: {}
982
+
983
+ 936:
984
+ :country: US
985
+ :timezone: C
986
+ 869:
987
+ :country: ST. KITTS AND NEVIS
988
+ :timezone: A
989
+ 802:
990
+ :country: US
991
+ :timezone: E
992
+ 601:
993
+ :country: US
994
+ :timezone: C
995
+ 970:
996
+ :country: US
997
+ :timezone: M
998
+ 903:
999
+ :country: US
1000
+ :timezone: C
1001
+ 769:
1002
+ :country: US
1003
+ :timezone: C
1004
+ 702:
1005
+ :country: US
1006
+ :timezone: P
1007
+ 434:
1008
+ :country: US
1009
+ :timezone: E
1010
+ 501:
1011
+ :country: US
1012
+ :timezone: C
1013
+ 937:
1014
+ :country: US
1015
+ :timezone: E
1016
+ 870:
1017
+ :country: US
1018
+ :timezone: C
1019
+ 803:
1020
+ :country: US
1021
+ :timezone: E
1022
+ 401:
1023
+ :country: US
1024
+ :timezone: E
1025
+ 602:
1026
+ :country: US
1027
+ :timezone: M
1028
+ 267:
1029
+ :country: US
1030
+ :timezone: E
1031
+ 334:
1032
+ :country: US
1033
+ :timezone: C