chrono-node 1.4.7 → 1.4.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/dist/chrono.js +711 -809
  2. package/dist/chrono.js.map +1 -1
  3. package/dist/chrono.min.js +1 -1
  4. package/dist/chrono.min.js.map +1 -1
  5. package/package.json +1 -1
  6. package/src/chrono.js +57 -59
  7. package/src/options.js +30 -29
  8. package/src/parsers/en/ENDeadlineFormatParser.js +9 -9
  9. package/src/result.js +119 -119
  10. package/test/de/de.test.js +36 -51
  11. package/test/de/de_casual.test.js +242 -141
  12. package/test/de/de_dash.test.js +5 -8
  13. package/test/de/de_deadline.test.js +151 -47
  14. package/test/de/de_little_endian.test.js +207 -58
  15. package/test/de/de_time_ago.test.js +167 -52
  16. package/test/de/de_time_exp.test.js +135 -121
  17. package/test/de/de_weekday.test.js +94 -31
  18. package/test/en/en.test.js +118 -89
  19. package/test/en/en_casual.test.js +149 -134
  20. package/test/en/en_dash.test.js +17 -11
  21. package/test/en/en_deadline.test.js +93 -69
  22. package/test/en/en_inter_std.test.js +28 -7
  23. package/test/en/en_little_endian.test.js +76 -26
  24. package/test/en/en_middle_endian.test.js +63 -21
  25. package/test/en/en_month.test.js +6 -2
  26. package/test/en/en_option_forward.test.js +120 -112
  27. package/test/en/en_relative.test.js +155 -172
  28. package/test/en/en_slash.test.js +156 -115
  29. package/test/en/en_time_ago.test.js +61 -21
  30. package/test/en/en_time_exp.test.js +228 -209
  31. package/test/en/en_time_from_now.test.js +70 -24
  32. package/test/en/en_time_later.test.js +16 -6
  33. package/test/en/en_weekday.test.js +39 -13
  34. package/test/es/es_casual.test.js +143 -120
  35. package/test/es/es_dash.test.js +7 -8
  36. package/test/es/es_deadline.test.js +69 -35
  37. package/test/es/es_little_endian.test.js +250 -145
  38. package/test/es/es_slash.test.js +17 -12
  39. package/test/es/es_time_ago.test.js +21 -7
  40. package/test/es/es_time_exp.test.js +154 -160
  41. package/test/fr/fr_casual.test.js +153 -124
  42. package/test/fr/fr_dash.test.js +13 -6
  43. package/test/fr/fr_deadline.test.js +163 -44
  44. package/test/fr/fr_little_endian.test.js +262 -81
  45. package/test/fr/fr_relative.test.js +188 -196
  46. package/test/fr/fr_slash.test.js +41 -14
  47. package/test/fr/fr_time_ago.test.js +30 -10
  48. package/test/fr/fr_time_exp.test.js +619 -567
  49. package/test/fr/fr_weekday.test.js +24 -8
  50. package/test/ja/ja_casual.test.js +41 -26
  51. package/test/ja/ja_standard.test.js +322 -207
  52. package/test/nl/nl.test.js +18 -20
  53. package/test/nl/nl_dash.test.js +26 -26
  54. package/test/nl/nl_little_endian.test.js +100 -51
  55. package/test/nl/nl_time_exp.test.js +37 -13
  56. package/test/nl/nl_weekday.test.js +39 -13
  57. package/test/pt/pt_casual.test.js +222 -156
  58. package/test/pt/pt_dash.test.js +7 -6
  59. package/test/pt/pt_deadline.test.js +51 -17
  60. package/test/pt/pt_little_endian.test.js +251 -144
  61. package/test/pt/pt_slash.test.js +38 -25
  62. package/test/pt/pt_time_ago.test.js +128 -80
  63. package/test/pt/pt_time_exp.test.js +191 -173
  64. package/test/test_util.js +1 -5
  65. package/test/zh/zh_hant_casual.test.js +184 -87
  66. package/test/zh/zh_hant_date.test.js +109 -75
  67. package/test/zh/zh_hant_deadline.test.js +131 -41
  68. package/test/zh/zh_hant_time_exp.test.js +184 -141
  69. package/test/zh/zh_hant_weekday.test.js +64 -22
@@ -13,7 +13,9 @@ test("Test - Single expression", function() {
13
13
  expect(result.index).toBe(0);
14
14
  expect(result.text).toBe('10. August 2012');
15
15
 
16
- expect(result.start).toBeDate(new Date(2012, 8-1, 10, 12));
16
+ var resultDate = result.start.date();
17
+ var expectDate = new Date(2012, 8-1, 10, 12);
18
+ expect(expectDate.getTime()).toBeCloseTo(resultDate.getTime())
17
19
  });
18
20
 
19
21
 
@@ -26,10 +28,17 @@ test("Test - Single expression", function() {
26
28
  expect(result.start.get('month')).toBe(8);
27
29
  expect(result.start.get('day')).toBe(10);
28
30
 
29
- expect(result.start).toBeDate(new Date(-113, 8-1, 10, 12));
31
+ var resultDate = result.start.date();
32
+ var expectDate = new Date(-113, 8-1, 10, 12);
33
+ expect(expectDate.getTime()).toBeCloseTo(resultDate.getTime())
30
34
  });
31
35
 
32
- testSingleCase(chrono, '10. August 85 n. Chr.', new Date(2012,7,10), (result) => {
36
+ var text = "10. August 85 n. Chr.";
37
+ var results = chrono.parse(text, new Date(2012,7,10));
38
+ expect(results.length).toBe(1);
39
+
40
+ var result = results[0];
41
+ if (result) {
33
42
  expect(result.index).toBe(0);
34
43
  expect(result.text).toBe('10. August 85 n. Chr.');
35
44
 
@@ -42,10 +51,15 @@ test("Test - Single expression", function() {
42
51
  var expectDate = new Date(85, 8-1, 10, 12);
43
52
  expectDate.setFullYear(85);
44
53
  expect(expectDate.getTime()).toBeCloseTo(resultDate.getTime())
45
- });
54
+ }
55
+
46
56
 
57
+ var text = 'So 15.Sep';
58
+ var results = chrono.parse(text, new Date(2013,7,10));
59
+ expect(results.length).toBe(1);
47
60
 
48
- testSingleCase(chrono, 'So 15.Sep', new Date(2013,7,10), (result) => {
61
+ var result = results[0];
62
+ if(result){
49
63
  expect(result.index).toBe(0);
50
64
  expect(result.text).toBe('So 15.Sep');
51
65
 
@@ -54,22 +68,36 @@ test("Test - Single expression", function() {
54
68
  expect(result.start.get('month')).toBe(9);
55
69
  expect(result.start.get('day')).toBe(15);
56
70
 
57
- expect(result.start).toBeDate(new Date(2013, 9-1, 15, 12));
58
- });
71
+ var resultDate = result.start.date();
72
+ var expectDate = new Date(2013, 9-1, 15, 12);
73
+ expect(expectDate.getTime()).toBeCloseTo(resultDate.getTime())
74
+ }
59
75
 
60
- testSingleCase(chrono, 'SO 15.SEPT', new Date(2013,7,10), (result) => {
76
+ var text = 'SO 15.SEPT';
77
+ var results = chrono.parse(text, new Date(2013,7,10));
78
+ expect(results.length).toBe(1);
79
+
80
+ var result = results[0];
81
+ if(result){
61
82
  expect(result.index).toBe(0);
62
83
  expect(result.text).toBe('SO 15.SEPT');
63
-
84
+
64
85
  expect(result.start).not.toBeNull();
65
86
  expect(result.start.get('year')).toBe(2013);
66
87
  expect(result.start.get('month')).toBe(9);
67
88
  expect(result.start.get('day')).toBe(15);
68
89
 
69
- expect(result.start).toBeDate(new Date(2013, 9-1, 15, 12));
70
- });
90
+ var resultDate = result.start.date();
91
+ var expectDate = new Date(2013, 9-1, 15, 12);
92
+ expect(expectDate.getTime()).toBeCloseTo(resultDate.getTime())
93
+ }
71
94
 
72
- testSingleCase(chrono, 'Die Deadline ist am 10. August', new Date(2012,7,10), (result) => {
95
+ var text = "Die Deadline ist am 10. August";
96
+ var results = chrono.parse(text, new Date(2012,7,10));
97
+ expect(results.length).toBe(1);
98
+
99
+ var result = results[0];
100
+ if (result) {
73
101
 
74
102
  expect(result.index).toBe(17);
75
103
  expect(result.text).toBe('am 10. August');
@@ -79,11 +107,18 @@ test("Test - Single expression", function() {
79
107
  expect(result.start.get('month')).toBe(8);
80
108
  expect(result.start.get('day')).toBe(10);
81
109
 
82
- expect(result.start).toBeDate(new Date(2012, 8-1, 10, 12));
83
- });
110
+ var resultDate = result.start.date();
111
+ var expectDate = new Date(2012, 8-1, 10, 12);
112
+ expect(expectDate.getTime()).toBeCloseTo(resultDate.getTime())
113
+ }
84
114
 
85
115
 
86
- testSingleCase(chrono, 'Die Deadline ist am Dienstag, den 10. Januar', new Date(2012,7,10), (result) => {
116
+ var text = "Die Deadline ist am Dienstag, den 10. Januar";
117
+ var results = chrono.parse(text, new Date(2012,7,10));
118
+ expect(results.length).toBe(1);
119
+
120
+ var result = results[0];
121
+ if (result) {
87
122
 
88
123
  expect(result.index).toBe(17);
89
124
  expect(result.text).toBe('am Dienstag, den 10. Januar');
@@ -94,11 +129,18 @@ test("Test - Single expression", function() {
94
129
  expect(result.start.get('day')).toBe(10);
95
130
  expect(result.start.get('weekday')).toBe(2);
96
131
 
97
- expect(result.start).toBeDate(new Date(2013, 1-1, 10, 12));
98
- });
132
+ var resultDate = result.start.date();
133
+ var expectDate = new Date(2013, 1-1, 10, 12);
134
+ expect(expectDate.getTime()).toBeCloseTo(resultDate.getTime())
135
+ }
136
+
99
137
 
138
+ var text = "Die Deadline ist Di, 10. Januar";
139
+ var results = chrono.parse(text, new Date(2012,7,10));
140
+ expect(results.length).toBe(1);
100
141
 
101
- testSingleCase(chrono, 'Die Deadline ist Di, 10. Januar', new Date(2012,7,10), (result) => {
142
+ var result = results[0];
143
+ if (result) {
102
144
 
103
145
  expect(result.index).toBe(17);
104
146
  expect(result.text).toBe('Di, 10. Januar');
@@ -109,11 +151,18 @@ test("Test - Single expression", function() {
109
151
  expect(result.start.get('day')).toBe(10);
110
152
  expect(result.start.get('weekday')).toBe(2);
111
153
 
112
- expect(result.start).toBeDate(new Date(2013, 1-1, 10, 12));
113
- });
154
+ var resultDate = result.start.date();
155
+ var expectDate = new Date(2013, 1-1, 10, 12);
156
+ expect(expectDate.getTime()).toBeCloseTo(resultDate.getTime())
157
+ }
114
158
 
115
159
 
116
- testSingleCase(chrono, '31. März 2016', new Date(2012,7,10), (result) => {
160
+ var text = "31. März 2016";
161
+ var results = chrono.parse(text, new Date(2012,7,10));
162
+ expect(results.length).toBe(1);
163
+
164
+ var result = results[0];
165
+ if (result) {
117
166
 
118
167
  expect(result.index).toBe(0);
119
168
  expect(result.text).toBe('31. März 2016');
@@ -123,11 +172,18 @@ test("Test - Single expression", function() {
123
172
  expect(result.start.get('month')).toBe(3);
124
173
  expect(result.start.get('day')).toBe(31);
125
174
 
126
- expect(result.start).toBeDate(new Date(2016, 3-1, 31, 12));
127
- });
175
+ var resultDate = result.start.date();
176
+ var expectDate = new Date(2016, 3-1, 31, 12);
177
+ expect(expectDate.getTime()).toBeCloseTo(resultDate.getTime())
178
+ }
179
+
128
180
 
181
+ var text = "31.Maerz 2016";
182
+ var results = chrono.parse(text, new Date(2012,7,10));
183
+ expect(results.length).toBe(1);
129
184
 
130
- testSingleCase(chrono, '31.Maerz 2016', new Date(2012,7,10), (result) => {
185
+ var result = results[0];
186
+ if (result) {
131
187
 
132
188
  expect(result.index).toBe(0);
133
189
  expect(result.text).toBe('31.Maerz 2016');
@@ -137,15 +193,22 @@ test("Test - Single expression", function() {
137
193
  expect(result.start.get('month')).toBe(3);
138
194
  expect(result.start.get('day')).toBe(31);
139
195
 
140
- expect(result.start).toBeDate(new Date(2016, 3-1, 31, 12));
141
- });
196
+ var resultDate = result.start.date();
197
+ var expectDate = new Date(2016, 3-1, 31, 12);
198
+ expect(expectDate.getTime()).toBeCloseTo(resultDate.getTime())
199
+ }
142
200
  });
143
201
 
144
202
 
145
203
  test("Test - Range expression", function() {
146
204
 
147
205
 
148
- testSingleCase(chrono, '10. - 22. August 2012', new Date(2012,7,10), (result) => {
206
+ var text = "10. - 22. August 2012";
207
+ var results = chrono.parse(text, new Date(2012,7,10));
208
+ expect(results.length).toBe(1);
209
+
210
+ var result = results[0];
211
+ if(result){
149
212
 
150
213
  expect(result.index).toBe(0);
151
214
  expect(result.text).toBe('10. - 22. August 2012');
@@ -155,19 +218,28 @@ test("Test - Range expression", function() {
155
218
  expect(result.start.get('month')).toBe(8);
156
219
  expect(result.start.get('day')).toBe(10);
157
220
 
158
- expect(result.start).toBeDate(new Date(2012, 8-1, 10, 12));
159
-
221
+ var resultDate = result.start.date();
222
+ var expectDate = new Date(2012, 8-1, 10, 12);
223
+ expect(expectDate.getTime()).toBeCloseTo(resultDate.getTime());
224
+
160
225
 
161
226
  expect(result.end).not.toBeNull();
162
227
  expect(result.end.get('year')).toBe(2012);
163
228
  expect(result.end.get('month')).toBe(8);
164
229
  expect(result.end.get('day')).toBe(22);
165
230
 
166
- expect(result.end).toBeDate(new Date(2012, 8-1, 22, 12));
167
- });
231
+ var resultDate = result.end.date();
232
+ var expectDate = new Date(2012, 8-1, 22, 12);
233
+ expect(expectDate.getTime()).toBeCloseTo(resultDate.getTime())
234
+ }
235
+
168
236
 
237
+ var text = "10. bis 22. Oktober 2012";
238
+ var results = chrono.parse(text, new Date(2012,7,10));
239
+ expect(results.length).toBe(1);
169
240
 
170
- testSingleCase(chrono, '10. bis 22. Oktober 2012', new Date(2012,7,10), (result) => {
241
+ var result = results[0];
242
+ if(result){
171
243
 
172
244
  expect(result.index).toBe(0);
173
245
  expect(result.text).toBe('10. bis 22. Oktober 2012');
@@ -177,18 +249,27 @@ test("Test - Range expression", function() {
177
249
  expect(result.start.get('month')).toBe(10);
178
250
  expect(result.start.get('day')).toBe(10);
179
251
 
180
- expect(result.start).toBeDate(new Date(2012, 10-1, 10, 12));
181
-
252
+ var resultDate = result.start.date();
253
+ var expectDate = new Date(2012, 10-1, 10, 12);
254
+ expect(expectDate.getTime()).toBeCloseTo(resultDate.getTime());
255
+
182
256
 
183
257
  expect(result.end).not.toBeNull();
184
258
  expect(result.end.get('year')).toBe(2012);
185
259
  expect(result.end.get('month')).toBe(10);
186
260
  expect(result.end.get('day')).toBe(22);
187
261
 
188
- expect(result.end).toBeDate(new Date(2012, 10-1, 22, 12));
189
- });
262
+ var resultDate = result.end.date();
263
+ var expectDate = new Date(2012, 10-1, 22, 12);
264
+ expect(expectDate.getTime()).toBeCloseTo(resultDate.getTime())
265
+ }
266
+
267
+ var text = "10. Oktober - 12. Dezember";
268
+ var results = chrono.parse(text, new Date(2012,7,10));
269
+ expect(results.length).toBe(1);
190
270
 
191
- testSingleCase(chrono, '10. Oktober - 12. Dezember', new Date(2012,7,10), (result) => {
271
+ var result = results[0];
272
+ if(result){
192
273
 
193
274
  expect(result.index).toBe(0);
194
275
  expect(result.text).toBe('10. Oktober - 12. Dezember');
@@ -198,18 +279,27 @@ test("Test - Range expression", function() {
198
279
  expect(result.start.get('month')).toBe(10);
199
280
  expect(result.start.get('day')).toBe(10);
200
281
 
201
- expect(result.start).toBeDate(new Date(2012, 10-1, 10, 12));
202
-
282
+ var resultDate = result.start.date();
283
+ var expectDate = new Date(2012, 10-1, 10, 12);
284
+ expect(expectDate.getTime()).toBeCloseTo(resultDate.getTime());
285
+
203
286
 
204
287
  expect(result.end).not.toBeNull();
205
288
  expect(result.end.get('year')).toBe(2012);
206
289
  expect(result.end.get('month')).toBe(12);
207
290
  expect(result.end.get('day')).toBe(12);
208
291
 
209
- expect(result.end).toBeDate(new Date(2012, 12-1, 12, 12));
210
- });
292
+ var resultDate = result.end.date();
293
+ var expectDate = new Date(2012, 12-1, 12, 12);
294
+ expect(expectDate.getTime()).toBeCloseTo(resultDate.getTime())
295
+ }
296
+
297
+ var text = "10. August - 12. Oktober 2013";
298
+ var results = chrono.parse(text, new Date(2012,7,10));
299
+ expect(results.length).toBe(1);
211
300
 
212
- testSingleCase(chrono, '10. August - 12. Oktober 2013', new Date(2012,7,10), (result) => {
301
+ var result = results[0];
302
+ if(result){
213
303
 
214
304
  expect(result.index).toBe(0);
215
305
  expect(result.text).toBe('10. August - 12. Oktober 2013');
@@ -219,22 +309,31 @@ test("Test - Range expression", function() {
219
309
  expect(result.start.get('month')).toBe(8);
220
310
  expect(result.start.get('day')).toBe(10);
221
311
 
222
- expect(result.start).toBeDate(new Date(2013, 8-1, 10, 12));
223
-
312
+ var resultDate = result.start.date();
313
+ var expectDate = new Date(2013, 8-1, 10, 12);
314
+ expect(expectDate.getTime()).toBeCloseTo(resultDate.getTime());
315
+
224
316
 
225
317
  expect(result.end).not.toBeNull();
226
318
  expect(result.end.get('year')).toBe(2013);
227
319
  expect(result.end.get('month')).toBe(10);
228
320
  expect(result.end.get('day')).toBe(12);
229
321
 
230
- expect(result.end).toBeDate(new Date(2013, 10-1, 12, 12));
231
- });
322
+ var resultDate = result.end.date();
323
+ var expectDate = new Date(2013, 10-1, 12, 12);
324
+ expect(expectDate.getTime()).toBeCloseTo(resultDate.getTime())
325
+ }
232
326
  });
233
327
 
234
328
 
235
329
  test("Test - Combined expression", function() {
236
330
 
237
- testSingleCase(chrono, '12. Juli um 19:00', new Date(2012,7,10), (result) => {
331
+ var text = "12. Juli um 19:00";
332
+ var results = chrono.parse(text, new Date(2012,7,10));
333
+ expect(results.length).toBe(1);
334
+
335
+ var result = results[0];
336
+ if(result){
238
337
  expect(result.index).toBe(0);
239
338
  expect(result.text).toBe('12. Juli um 19:00');
240
339
 
@@ -244,11 +343,18 @@ test("Test - Combined expression", function() {
244
343
  expect(result.start.get('day')).toBe(12);
245
344
 
246
345
 
247
- expect(result.start).toBeDate(new Date(2012, 7-1, 12, 19, 0));
248
- });
346
+ var resultDate = result.start.date();
347
+ var expectDate = new Date(2012, 7-1, 12, 19, 0);
348
+ expect(expectDate.getTime()).toBeCloseTo(resultDate.getTime())
349
+ }
350
+
249
351
 
352
+ var text = "12. Juli um 19 Uhr";
353
+ var results = chrono.parse(text, new Date(2012,7,10));
354
+ expect(results.length).toBe(1);
250
355
 
251
- testSingleCase(chrono, '12. Juli um 19 Uhr', new Date(2012,7,10), (result) => {
356
+ var result = results[0];
357
+ if(result){
252
358
  expect(result.index).toBe(0);
253
359
  expect(result.text).toBe('12. Juli um 19 Uhr');
254
360
 
@@ -258,11 +364,18 @@ test("Test - Combined expression", function() {
258
364
  expect(result.start.get('day')).toBe(12);
259
365
 
260
366
 
261
- expect(result.start).toBeDate(new Date(2012, 7-1, 12, 19, 0));
262
- });
367
+ var resultDate = result.start.date();
368
+ var expectDate = new Date(2012, 7-1, 12, 19, 0);
369
+ expect(expectDate.getTime()).toBeCloseTo(resultDate.getTime())
370
+ }
263
371
 
264
372
 
265
- testSingleCase(chrono, '12. Juli um 19:53 Uhr', new Date(2012,7,10), (result) => {
373
+ var text = "12. Juli um 19:53 Uhr";
374
+ var results = chrono.parse(text, new Date(2012,7,10));
375
+ expect(results.length).toBe(1);
376
+
377
+ var result = results[0];
378
+ if(result){
266
379
  expect(result.index).toBe(0);
267
380
  expect(result.text).toBe('12. Juli um 19:53 Uhr');
268
381
 
@@ -272,11 +385,18 @@ test("Test - Combined expression", function() {
272
385
  expect(result.start.get('day')).toBe(12);
273
386
 
274
387
 
275
- expect(result.start).toBeDate(new Date(2012, 7-1, 12, 19, 53));
276
- });
388
+ var resultDate = result.start.date();
389
+ var expectDate = new Date(2012, 7-1, 12, 19, 53);
390
+ expect(expectDate.getTime()).toBeCloseTo(resultDate.getTime())
391
+ }
277
392
 
278
393
 
279
- testSingleCase(chrono, '5. Juni 12:00', new Date(2012,7,10), (result) => {
394
+ var text = "5. Juni 12:00";
395
+ var results = chrono.parse(text, new Date(2012,7,10));
396
+ expect(results.length).toBe(1);
397
+
398
+ var result = results[0];
399
+ if(result){
280
400
  expect(result.index).toBe(0);
281
401
  expect(result.text).toBe('5. Juni 12:00');
282
402
 
@@ -286,10 +406,39 @@ test("Test - Combined expression", function() {
286
406
  expect(result.start.get('day')).toBe(5);
287
407
 
288
408
 
289
- expect(result.start).toBeDate(new Date(2012, 6-1, 5, 12, 0));
290
- });
409
+ var resultDate = result.start.date();
410
+ var expectDate = new Date(2012, 6-1, 5, 12, 0);
411
+ expect(expectDate.getTime()).toBeCloseTo(resultDate.getTime())
412
+ }
291
413
  });
292
414
 
415
+ /*
416
+ // TODO: in these cases, the DEMonthNameParser is used (the incorrect date is ignored)
417
+ // TODO: interpret as full date
418
+ test("Test - Impossible Dates (Strict Mode)", function() {
419
+
420
+ var text = "32. Dezember 2014";
421
+ var results = chrono.strict.parse(text, new Date(2012,7,10));
422
+ expect(results.length).toBe(0);
423
+
424
+ var text = "29. Februar 2014";
425
+ var results = chrono.strict.parse(text, new Date(2012,7,10));
426
+ expect(results.length).toBe(0);
427
+
428
+ var text = "32. August";
429
+ var results = chrono.strict.parse(text, new Date(2012,7,10));
430
+ expect(results.length).toBe(0);
431
+
432
+ var text = "32. Oktober";
433
+ var results = chrono.strict.parse(text, new Date(2012,7,10));
434
+ expect(results.length).toBe(0);
435
+
436
+ var text = "29. Februar";
437
+ var results = chrono.strict.parse(text, new Date(2013,7,10));
438
+ expect(results.length).toBe(0)
439
+
440
+ });*/
441
+
293
442
  test("Test - Impossible Dates (Casual Mode)", function() {
294
443
 
295
444
  var text = "32. Oktober 2015";