Elementor Essential Addons - Version 3.6.2

Version Description

  • 09/12/2019 =
  • Bugfix: Product grid responsive issue
  • Bugfix: 404 page assets loading
  • Bugfix: Data Table | Content Alignment (left/right)
  • Bugfix: Fancy text > not showing animation on edit mode
  • Bugfix: Tooltip 'Text'- Content Type
  • Bugfix: Feature List Content text resizes when URL is added
  • Bugfix: Creative Button >> Winona >> Secondary text's typography fix
  • Few minor bugfix and improvements
Download this release

Release Info

Developer re_enter_rupok
Plugin Icon 128x128 Elementor Essential Addons
Version 3.6.2
Comparing to
See all releases

Code changes from version 3.6.1 to 3.6.2

assets/front-end/css/data-table/index.css CHANGED
@@ -1,11 +1,16 @@
1
- table.eael-data-table thead .sorting, table.eael-data-table thead .sorting_desc, table.eael-data-table thead .sorting_asc {
 
 
 
2
  position: relative;
3
  z-index: 0;
4
  outline: 0;
5
  cursor: pointer;
6
  }
7
 
8
- table.eael-data-table thead .sorting:after, table.eael-data-table thead .sorting_desc:after, table.eael-data-table thead .sorting_asc:after {
 
 
9
  position: absolute;
10
  top: 50%;
11
  right: 10px;
@@ -21,25 +26,30 @@ table.eael-data-table thead .sorting:after, table.eael-data-table thead .sorting
21
  justify-content: flex-start;
22
  width: 100%;
23
  }
 
24
  .eael-data-table-wrap .eael-data-tables_filter {
25
  flex-grow: 1;
26
  flex-basis: 50%;
27
  text-align: right;
28
  }
 
29
  .eael-data-table-wrap .eael-data-tables_filter label {
30
  font-weight: 700;
31
  }
32
- .eael-data-table-wrap .eael-data-tables_filter label input[type="search"] {
 
33
  height: 40px;
34
  border: 1px solid rgba(0, 0, 0, 0.09);
35
  outline: 0;
36
  padding: 10px;
37
  margin-left: 10px;
38
  }
 
39
  .eael-data-table-wrap .eael-data-tables_length {
40
  flex-grow: 1;
41
  flex-basis: 50%;
42
  }
 
43
  .eael-data-table-wrap .eael-data-tables_length select {
44
  width: auto;
45
  max-width: 120px;
@@ -49,38 +59,45 @@ table.eael-data-table thead .sorting:after, table.eael-data-table thead .sorting
49
  margin-left: 10px;
50
  margin-right: 10px;
51
  }
 
52
  .eael-data-table-wrap .eael-data-tables_length label {
53
  font-weight: 700;
54
  }
 
55
  .eael-data-table-wrap .eael-data-tables_info {
56
  flex-grow: 1;
57
  flex-basis: 50%;
58
  font-weight: 700;
59
  }
 
60
  .eael-data-table-wrap .eael-data-tables_paginate {
61
  flex-grow: 1;
62
  flex-basis: 50%;
63
  text-align: right;
64
  }
 
65
  .eael-data-table-wrap .eael-data-tables_paginate .paginate_button {
66
  padding: 10px 15px;
67
  background: #f2f2f2;
68
  margin-right: 2px;
69
  cursor: pointer;
70
- transition: all .3s;
71
  }
 
72
  .eael-data-table-wrap .eael-data-tables_paginate .paginate_button:hover {
73
  color: #fff;
74
  background: #4a4893;
75
  }
 
76
  .eael-data-table-wrap .eael-data-tables_paginate .paginate_button.current {
77
  color: #fff;
78
  background: #4a4893;
79
  }
 
80
  .eael-data-table-wrap .eael-data-tables_paginate .paginate_button.disabled {
81
  cursor: no-drop;
82
  background: #f2f2f2;
83
- opacity: .5;
84
  color: #888;
85
  }
86
 
@@ -97,12 +114,15 @@ table.eael-data-table thead .sorting:after, table.eael-data-table thead .sorting
97
  border-collapse: collapse;
98
  border: none;
99
  }
 
100
  .eael-data-table tr {
101
  border-style: none;
102
  }
 
103
  .eael-data-table thead tr {
104
  text-align: left;
105
  }
 
106
  .eael-data-table thead tr th {
107
  padding: 20px 15px;
108
  background: #4a4893;
@@ -116,28 +136,36 @@ table.eael-data-table thead .sorting:after, table.eael-data-table thead .sorting
116
  border-style: none;
117
  background-clip: padding-box;
118
  }
 
119
  .eael-data-table thead tr th:hover {
120
  border-color: #000;
121
  }
 
122
  .eael-data-table tbody tr.even {
123
  transition: background 0.4s ease-in-out;
124
  }
 
125
  .eael-data-table tbody tr.even:hover {
126
  background: rgba(242, 242, 242, 0.7);
127
  }
 
128
  .eael-data-table tbody tr.even:last-child {
129
  border-bottom: 1px solid rgba(0, 0, 0, 0.09);
130
  }
 
131
  .eael-data-table tbody tr.odd {
132
  background: rgba(242, 242, 242, 0.5);
133
  transition: background 0.2s ease-in-out;
134
  }
 
135
  .eael-data-table tbody tr.odd:hover {
136
  background: rgba(242, 242, 242, 0.7);
137
  }
 
138
  .eael-data-table tbody tr.odd:last-child {
139
  border-bottom: 1px solid rgba(0, 0, 0, 0.09);
140
  }
 
141
  .eael-data-table tbody tr td {
142
  padding: 20px 15px;
143
  font-size: 14px;
@@ -166,17 +194,19 @@ table.eael-data-table thead .sorting:after, table.eael-data-table thead .sorting
166
 
167
  .th-mobile-screen {
168
  display: inline-block;
169
- padding: 0 .6em;
170
  margin-right: 10px;
171
  text-align: center;
172
  flex-grow: 0;
173
  flex-shrink: 0;
174
  flex-basis: 100px;
175
  }
 
176
  .th-mobile-screen .eael-data-table-th-img {
177
  margin: 0 auto 15px auto;
178
  display: block;
179
  }
 
180
  .th-mobile-screen .data-header-icon {
181
  margin: 0 auto 15px auto;
182
  display: block;
@@ -191,6 +221,7 @@ table.eael-data-table thead .sorting:after, table.eael-data-table thead .sorting
191
  width: 100%;
192
  justify-content: center;
193
  }
 
194
  .td-content > p {
195
  width: 100%;
196
  justify-content: center;
@@ -199,6 +230,7 @@ table.eael-data-table thead .sorting:after, table.eael-data-table thead .sorting
199
  .custom-responsive-option-enable .eael-data-table thead {
200
  display: none;
201
  }
 
202
  .custom-responsive-option-enable .eael-data-table tbody tr td {
203
  float: none;
204
  clear: left;
@@ -214,23 +246,29 @@ table.eael-data-table thead .sorting:after, table.eael-data-table thead .sorting
214
  }
215
  }
216
  table.eael-data-table thead .sorting:after {
217
- content: "\f0dc";
218
  }
 
219
  table.eael-data-table thead .headerSortDown:after {
220
- content: "\f0dd";
221
  }
 
222
  table.eael-data-table thead .headerSortUp:after {
223
- content: "\f0de";
224
  }
 
225
  table.eael-data-table thead .sorting_disabled.sorting:after {
226
  display: none;
227
  }
 
228
  table.eael-data-table .sorting.sorting-none:after {
229
  display: none;
230
  }
 
231
  table.eael-data-table .sorting_desc.sorting-none:after {
232
  display: none;
233
  }
 
234
  table.eael-data-table .sorting_asc.sorting-none:after {
235
  display: none;
236
  }
@@ -255,13 +293,21 @@ table.eael-data-table .sorting_asc.sorting-none:after {
255
  text-align: left;
256
  }
257
 
 
 
 
 
 
 
 
 
 
258
  .eael-dt-td-align-left .eael-data-table tbody tr td {
259
  text-align: left;
260
  }
261
 
262
- .eael-dt-th-align-right .eael-data-table thead tr th {
263
- text-align: right;
264
- padding-right: 30px;
265
  }
266
 
267
  .eael-dt-td-align-right .eael-data-table tbody tr td {
@@ -269,10 +315,29 @@ table.eael-data-table .sorting_asc.sorting-none:after {
269
  padding-right: 30px;
270
  }
271
 
272
- .eael-dt-th-align-center .eael-data-table thead tr th {
273
- text-align: center;
 
 
 
 
 
 
 
 
 
 
274
  }
 
 
 
 
275
 
276
- .eael-dt-td-align-center .eael-data-table tbody tr td {
277
- text-align: center;
 
 
 
 
 
278
  }
1
+ @charset "UTF-8";
2
+ table.eael-data-table thead .sorting_asc,
3
+ table.eael-data-table thead .sorting_desc,
4
+ table.eael-data-table thead .sorting {
5
  position: relative;
6
  z-index: 0;
7
  outline: 0;
8
  cursor: pointer;
9
  }
10
 
11
+ table.eael-data-table thead .sorting_asc:after,
12
+ table.eael-data-table thead .sorting_desc:after,
13
+ table.eael-data-table thead .sorting:after {
14
  position: absolute;
15
  top: 50%;
16
  right: 10px;
26
  justify-content: flex-start;
27
  width: 100%;
28
  }
29
+
30
  .eael-data-table-wrap .eael-data-tables_filter {
31
  flex-grow: 1;
32
  flex-basis: 50%;
33
  text-align: right;
34
  }
35
+
36
  .eael-data-table-wrap .eael-data-tables_filter label {
37
  font-weight: 700;
38
  }
39
+
40
+ .eael-data-table-wrap .eael-data-tables_filter label input[type=search] {
41
  height: 40px;
42
  border: 1px solid rgba(0, 0, 0, 0.09);
43
  outline: 0;
44
  padding: 10px;
45
  margin-left: 10px;
46
  }
47
+
48
  .eael-data-table-wrap .eael-data-tables_length {
49
  flex-grow: 1;
50
  flex-basis: 50%;
51
  }
52
+
53
  .eael-data-table-wrap .eael-data-tables_length select {
54
  width: auto;
55
  max-width: 120px;
59
  margin-left: 10px;
60
  margin-right: 10px;
61
  }
62
+
63
  .eael-data-table-wrap .eael-data-tables_length label {
64
  font-weight: 700;
65
  }
66
+
67
  .eael-data-table-wrap .eael-data-tables_info {
68
  flex-grow: 1;
69
  flex-basis: 50%;
70
  font-weight: 700;
71
  }
72
+
73
  .eael-data-table-wrap .eael-data-tables_paginate {
74
  flex-grow: 1;
75
  flex-basis: 50%;
76
  text-align: right;
77
  }
78
+
79
  .eael-data-table-wrap .eael-data-tables_paginate .paginate_button {
80
  padding: 10px 15px;
81
  background: #f2f2f2;
82
  margin-right: 2px;
83
  cursor: pointer;
84
+ transition: all 0.3s;
85
  }
86
+
87
  .eael-data-table-wrap .eael-data-tables_paginate .paginate_button:hover {
88
  color: #fff;
89
  background: #4a4893;
90
  }
91
+
92
  .eael-data-table-wrap .eael-data-tables_paginate .paginate_button.current {
93
  color: #fff;
94
  background: #4a4893;
95
  }
96
+
97
  .eael-data-table-wrap .eael-data-tables_paginate .paginate_button.disabled {
98
  cursor: no-drop;
99
  background: #f2f2f2;
100
+ opacity: 0.5;
101
  color: #888;
102
  }
103
 
114
  border-collapse: collapse;
115
  border: none;
116
  }
117
+
118
  .eael-data-table tr {
119
  border-style: none;
120
  }
121
+
122
  .eael-data-table thead tr {
123
  text-align: left;
124
  }
125
+
126
  .eael-data-table thead tr th {
127
  padding: 20px 15px;
128
  background: #4a4893;
136
  border-style: none;
137
  background-clip: padding-box;
138
  }
139
+
140
  .eael-data-table thead tr th:hover {
141
  border-color: #000;
142
  }
143
+
144
  .eael-data-table tbody tr.even {
145
  transition: background 0.4s ease-in-out;
146
  }
147
+
148
  .eael-data-table tbody tr.even:hover {
149
  background: rgba(242, 242, 242, 0.7);
150
  }
151
+
152
  .eael-data-table tbody tr.even:last-child {
153
  border-bottom: 1px solid rgba(0, 0, 0, 0.09);
154
  }
155
+
156
  .eael-data-table tbody tr.odd {
157
  background: rgba(242, 242, 242, 0.5);
158
  transition: background 0.2s ease-in-out;
159
  }
160
+
161
  .eael-data-table tbody tr.odd:hover {
162
  background: rgba(242, 242, 242, 0.7);
163
  }
164
+
165
  .eael-data-table tbody tr.odd:last-child {
166
  border-bottom: 1px solid rgba(0, 0, 0, 0.09);
167
  }
168
+
169
  .eael-data-table tbody tr td {
170
  padding: 20px 15px;
171
  font-size: 14px;
194
 
195
  .th-mobile-screen {
196
  display: inline-block;
197
+ padding: 0 0.6em;
198
  margin-right: 10px;
199
  text-align: center;
200
  flex-grow: 0;
201
  flex-shrink: 0;
202
  flex-basis: 100px;
203
  }
204
+
205
  .th-mobile-screen .eael-data-table-th-img {
206
  margin: 0 auto 15px auto;
207
  display: block;
208
  }
209
+
210
  .th-mobile-screen .data-header-icon {
211
  margin: 0 auto 15px auto;
212
  display: block;
221
  width: 100%;
222
  justify-content: center;
223
  }
224
+
225
  .td-content > p {
226
  width: 100%;
227
  justify-content: center;
230
  .custom-responsive-option-enable .eael-data-table thead {
231
  display: none;
232
  }
233
+
234
  .custom-responsive-option-enable .eael-data-table tbody tr td {
235
  float: none;
236
  clear: left;
246
  }
247
  }
248
  table.eael-data-table thead .sorting:after {
249
+ content: "";
250
  }
251
+
252
  table.eael-data-table thead .headerSortDown:after {
253
+ content: "";
254
  }
255
+
256
  table.eael-data-table thead .headerSortUp:after {
257
+ content: "";
258
  }
259
+
260
  table.eael-data-table thead .sorting_disabled.sorting:after {
261
  display: none;
262
  }
263
+
264
  table.eael-data-table .sorting.sorting-none:after {
265
  display: none;
266
  }
267
+
268
  table.eael-data-table .sorting_desc.sorting-none:after {
269
  display: none;
270
  }
271
+
272
  table.eael-data-table .sorting_asc.sorting-none:after {
273
  display: none;
274
  }
293
  text-align: left;
294
  }
295
 
296
+ .eael-dt-th-align-right .eael-data-table thead tr th {
297
+ text-align: right;
298
+ padding-right: 30px;
299
+ }
300
+
301
+ .eael-dt-th-align-center .eael-data-table thead tr th {
302
+ text-align: center;
303
+ }
304
+
305
  .eael-dt-td-align-left .eael-data-table tbody tr td {
306
  text-align: left;
307
  }
308
 
309
+ .eael-dt-td-align-center .eael-data-table tbody tr td {
310
+ text-align: center;
 
311
  }
312
 
313
  .eael-dt-td-align-right .eael-data-table tbody tr td {
315
  padding-right: 30px;
316
  }
317
 
318
+ @media (max-width: 1024px) {
319
+ .eael-dt-td-align-tablet-left .eael-data-table tbody tr td {
320
+ text-align: left;
321
+ }
322
+
323
+ .eael-dt-td-align-tablet-center .eael-data-table tbody tr td {
324
+ text-align: center;
325
+ }
326
+
327
+ .eael-dt-td-align-tablet-right .eael-data-table tbody tr td {
328
+ text-align: right;
329
+ }
330
  }
331
+ @media (max-width: 767px) {
332
+ .eael-dt-td-align-mobile-left .eael-data-table tbody tr td {
333
+ text-align: left;
334
+ }
335
 
336
+ .eael-dt-td-align-mobile-center .eael-data-table tbody tr td {
337
+ text-align: center;
338
+ }
339
+
340
+ .eael-dt-td-align-mobile-right .eael-data-table tbody tr td {
341
+ text-align: right;
342
+ }
343
  }
assets/front-end/css/data-table/index.min.css CHANGED
@@ -1 +1 @@
1
- table.eael-data-table thead .sorting,table.eael-data-table thead .sorting_asc,table.eael-data-table thead .sorting_desc{position:relative;z-index:0;outline:0;cursor:pointer}table.eael-data-table thead .sorting:after,table.eael-data-table thead .sorting_asc:after,table.eael-data-table thead .sorting_desc:after{position:absolute;top:50%;right:10px;font-family:FontAwesome;color:#fff;z-index:1;transform:translateY(-50%)}.eael-data-table-wrap .eael-data-tables_wrapper{display:flex;flex-flow:row wrap;justify-content:flex-start;width:100%}.eael-data-table-wrap .eael-data-tables_filter{flex-grow:1;flex-basis:50%;text-align:right}.eael-data-table-wrap .eael-data-tables_filter label{font-weight:700}.eael-data-table-wrap .eael-data-tables_filter label input[type=search]{height:40px;border:1px solid rgba(0,0,0,.09);outline:0;padding:10px;margin-left:10px}.eael-data-table-wrap .eael-data-tables_length{flex-grow:1;flex-basis:50%}.eael-data-table-wrap .eael-data-tables_length select{width:auto;max-width:120px;height:40px;border:1px solid rgba(0,0,0,.09);outline:0;margin-left:10px;margin-right:10px}.eael-data-table-wrap .eael-data-tables_length label{font-weight:700}.eael-data-table-wrap .eael-data-tables_info{flex-grow:1;flex-basis:50%;font-weight:700}.eael-data-table-wrap .eael-data-tables_paginate{flex-grow:1;flex-basis:50%;text-align:right}.eael-data-table-wrap .eael-data-tables_paginate .paginate_button{padding:10px 15px;background:#f2f2f2;margin-right:2px;cursor:pointer;transition:all .3s}.eael-data-table-wrap .eael-data-tables_paginate .paginate_button:hover{color:#fff;background:#4a4893}.eael-data-table-wrap .eael-data-tables_paginate .paginate_button.current{color:#fff;background:#4a4893}.eael-data-table-wrap .eael-data-tables_paginate .paginate_button.disabled{cursor:no-drop;background:#f2f2f2;opacity:.5;color:#888}.data-header-icon{margin-right:10px;position:relative;top:2px}.eael-data-table{width:100%;height:auto;margin:0;border-collapse:collapse;border:none}.eael-data-table tr{border-style:none}.eael-data-table thead tr{text-align:left}.eael-data-table thead tr th{padding:20px 15px;background:#4a4893;font-size:16px;font-weight:600;font-family:Montserrat,sans-serif;line-height:1;color:#fff;border-color:#000;border-width:2px;border-style:none;background-clip:padding-box}.eael-data-table thead tr th:hover{border-color:#000}.eael-data-table tbody tr.even{transition:background .4s ease-in-out}.eael-data-table tbody tr.even:hover{background:rgba(242,242,242,.7)}.eael-data-table tbody tr.even:last-child{border-bottom:1px solid rgba(0,0,0,.09)}.eael-data-table tbody tr.odd{background:rgba(242,242,242,.5);transition:background .2s ease-in-out}.eael-data-table tbody tr.odd:hover{background:rgba(242,242,242,.7)}.eael-data-table tbody tr.odd:last-child{border-bottom:1px solid rgba(0,0,0,.09)}.eael-data-table tbody tr td{padding:20px 15px;font-size:14px;font-family:Montserrat,sans-serif;line-height:1;border-width:2px;border-style:none;background-clip:padding-box}.eael-data-table-th-img{display:inline-block;margin:0 15px 0 0;line-height:1}.th-mobile-screen{display:none}@media (max-width:767px){.eael-data-table-wrap{overflow-x:scroll!important;padding-bottom:5px}.th-mobile-screen{display:inline-block;padding:0 .6em;margin-right:10px;text-align:center;flex-grow:0;flex-shrink:0;flex-basis:100px}.th-mobile-screen .eael-data-table-th-img{margin:0 auto 15px auto;display:block}.th-mobile-screen .data-header-icon{margin:0 auto 15px auto;display:block}.td-content-wrapper{display:flex;width:100%}.td-content{width:100%;justify-content:center}.td-content>p{width:100%;justify-content:center}.custom-responsive-option-enable .eael-data-table thead{display:none}.custom-responsive-option-enable .eael-data-table tbody tr td{float:none;clear:left;width:100%;text-align:left;display:flex;align-items:center}.eael-data-table .td-content{align-items:center;display:flex}}table.eael-data-table thead .sorting:after{content:"\f0dc"}table.eael-data-table thead .headerSortDown:after{content:"\f0dd"}table.eael-data-table thead .headerSortUp:after{content:"\f0de"}table.eael-data-table thead .sorting_disabled.sorting:after{display:none}table.eael-data-table .sorting.sorting-none:after{display:none}table.eael-data-table .sorting_desc.sorting-none:after{display:none}table.eael-data-table .sorting_asc.sorting-none:after{display:none}.eael-table-align-left table.eael-data-table{float:left}.eael-table-align-center table.eael-data-table{margin:0 auto}.eael-table-align-right table.eael-data-table{float:right}.eael-hide-elements .eael-data-tables_info{display:none}.eael-dt-th-align-left .eael-data-table thead tr th{text-align:left}.eael-dt-td-align-left .eael-data-table tbody tr td{text-align:left}.eael-dt-th-align-right .eael-data-table thead tr th{text-align:right;padding-right:30px}.eael-dt-td-align-right .eael-data-table tbody tr td{text-align:right;padding-right:30px}.eael-dt-th-align-center .eael-data-table thead tr th{text-align:center}.eael-dt-td-align-center .eael-data-table tbody tr td{text-align:center}
1
+ @charset "UTF-8";table.eael-data-table thead .sorting,table.eael-data-table thead .sorting_asc,table.eael-data-table thead .sorting_desc{position:relative;z-index:0;outline:0;cursor:pointer}table.eael-data-table thead .sorting:after,table.eael-data-table thead .sorting_asc:after,table.eael-data-table thead .sorting_desc:after{position:absolute;top:50%;right:10px;font-family:FontAwesome;color:#fff;z-index:1;transform:translateY(-50%)}.eael-data-table-wrap .eael-data-tables_wrapper{display:flex;flex-flow:row wrap;justify-content:flex-start;width:100%}.eael-data-table-wrap .eael-data-tables_filter{flex-grow:1;flex-basis:50%;text-align:right}.eael-data-table-wrap .eael-data-tables_filter label{font-weight:700}.eael-data-table-wrap .eael-data-tables_filter label input[type=search]{height:40px;border:1px solid rgba(0,0,0,.09);outline:0;padding:10px;margin-left:10px}.eael-data-table-wrap .eael-data-tables_length{flex-grow:1;flex-basis:50%}.eael-data-table-wrap .eael-data-tables_length select{width:auto;max-width:120px;height:40px;border:1px solid rgba(0,0,0,.09);outline:0;margin-left:10px;margin-right:10px}.eael-data-table-wrap .eael-data-tables_length label{font-weight:700}.eael-data-table-wrap .eael-data-tables_info{flex-grow:1;flex-basis:50%;font-weight:700}.eael-data-table-wrap .eael-data-tables_paginate{flex-grow:1;flex-basis:50%;text-align:right}.eael-data-table-wrap .eael-data-tables_paginate .paginate_button{padding:10px 15px;background:#f2f2f2;margin-right:2px;cursor:pointer;transition:all .3s}.eael-data-table-wrap .eael-data-tables_paginate .paginate_button:hover{color:#fff;background:#4a4893}.eael-data-table-wrap .eael-data-tables_paginate .paginate_button.current{color:#fff;background:#4a4893}.eael-data-table-wrap .eael-data-tables_paginate .paginate_button.disabled{cursor:no-drop;background:#f2f2f2;opacity:.5;color:#888}.data-header-icon{margin-right:10px;position:relative;top:2px}.eael-data-table{width:100%;height:auto;margin:0;border-collapse:collapse;border:none}.eael-data-table tr{border-style:none}.eael-data-table thead tr{text-align:left}.eael-data-table thead tr th{padding:20px 15px;background:#4a4893;font-size:16px;font-weight:600;font-family:Montserrat,sans-serif;line-height:1;color:#fff;border-color:#000;border-width:2px;border-style:none;background-clip:padding-box}.eael-data-table thead tr th:hover{border-color:#000}.eael-data-table tbody tr.even{transition:background .4s ease-in-out}.eael-data-table tbody tr.even:hover{background:rgba(242,242,242,.7)}.eael-data-table tbody tr.even:last-child{border-bottom:1px solid rgba(0,0,0,.09)}.eael-data-table tbody tr.odd{background:rgba(242,242,242,.5);transition:background .2s ease-in-out}.eael-data-table tbody tr.odd:hover{background:rgba(242,242,242,.7)}.eael-data-table tbody tr.odd:last-child{border-bottom:1px solid rgba(0,0,0,.09)}.eael-data-table tbody tr td{padding:20px 15px;font-size:14px;font-family:Montserrat,sans-serif;line-height:1;border-width:2px;border-style:none;background-clip:padding-box}.eael-data-table-th-img{display:inline-block;margin:0 15px 0 0;line-height:1}.th-mobile-screen{display:none}@media (max-width:767px){.eael-data-table-wrap{overflow-x:scroll!important;padding-bottom:5px}.th-mobile-screen{display:inline-block;padding:0 .6em;margin-right:10px;text-align:center;flex-grow:0;flex-shrink:0;flex-basis:100px}.th-mobile-screen .eael-data-table-th-img{margin:0 auto 15px auto;display:block}.th-mobile-screen .data-header-icon{margin:0 auto 15px auto;display:block}.td-content-wrapper{display:flex;width:100%}.td-content{width:100%;justify-content:center}.td-content>p{width:100%;justify-content:center}.custom-responsive-option-enable .eael-data-table thead{display:none}.custom-responsive-option-enable .eael-data-table tbody tr td{float:none;clear:left;width:100%;text-align:left;display:flex;align-items:center}.eael-data-table .td-content{align-items:center;display:flex}}table.eael-data-table thead .sorting:after{content:""}table.eael-data-table thead .headerSortDown:after{content:""}table.eael-data-table thead .headerSortUp:after{content:""}table.eael-data-table thead .sorting_disabled.sorting:after{display:none}table.eael-data-table .sorting.sorting-none:after{display:none}table.eael-data-table .sorting_desc.sorting-none:after{display:none}table.eael-data-table .sorting_asc.sorting-none:after{display:none}.eael-table-align-left table.eael-data-table{float:left}.eael-table-align-center table.eael-data-table{margin:0 auto}.eael-table-align-right table.eael-data-table{float:right}.eael-hide-elements .eael-data-tables_info{display:none}.eael-dt-th-align-left .eael-data-table thead tr th{text-align:left}.eael-dt-th-align-right .eael-data-table thead tr th{text-align:right;padding-right:30px}.eael-dt-th-align-center .eael-data-table thead tr th{text-align:center}.eael-dt-td-align-left .eael-data-table tbody tr td{text-align:left}.eael-dt-td-align-center .eael-data-table tbody tr td{text-align:center}.eael-dt-td-align-right .eael-data-table tbody tr td{text-align:right;padding-right:30px}@media (max-width:1024px){.eael-dt-td-align-tablet-left .eael-data-table tbody tr td{text-align:left}.eael-dt-td-align-tablet-center .eael-data-table tbody tr td{text-align:center}.eael-dt-td-align-tablet-right .eael-data-table tbody tr td{text-align:right}}@media (max-width:767px){.eael-dt-td-align-mobile-left .eael-data-table tbody tr td{text-align:left}.eael-dt-td-align-mobile-center .eael-data-table tbody tr td{text-align:center}.eael-dt-td-align-mobile-right .eael-data-table tbody tr td{text-align:right}}
assets/front-end/css/eael.css CHANGED
@@ -1095,14 +1095,19 @@
1095
  margin-left: 5px;
1096
  }
1097
 
1098
- table.eael-data-table thead .sorting, table.eael-data-table thead .sorting_desc, table.eael-data-table thead .sorting_asc {
 
 
 
1099
  position: relative;
1100
  z-index: 0;
1101
  outline: 0;
1102
  cursor: pointer;
1103
  }
1104
 
1105
- table.eael-data-table thead .sorting:after, table.eael-data-table thead .sorting_desc:after, table.eael-data-table thead .sorting_asc:after {
 
 
1106
  position: absolute;
1107
  top: 50%;
1108
  right: 10px;
@@ -1118,25 +1123,30 @@ table.eael-data-table thead .sorting:after, table.eael-data-table thead .sorting
1118
  justify-content: flex-start;
1119
  width: 100%;
1120
  }
 
1121
  .eael-data-table-wrap .eael-data-tables_filter {
1122
  flex-grow: 1;
1123
  flex-basis: 50%;
1124
  text-align: right;
1125
  }
 
1126
  .eael-data-table-wrap .eael-data-tables_filter label {
1127
  font-weight: 700;
1128
  }
1129
- .eael-data-table-wrap .eael-data-tables_filter label input[type="search"] {
 
1130
  height: 40px;
1131
  border: 1px solid rgba(0, 0, 0, 0.09);
1132
  outline: 0;
1133
  padding: 10px;
1134
  margin-left: 10px;
1135
  }
 
1136
  .eael-data-table-wrap .eael-data-tables_length {
1137
  flex-grow: 1;
1138
  flex-basis: 50%;
1139
  }
 
1140
  .eael-data-table-wrap .eael-data-tables_length select {
1141
  width: auto;
1142
  max-width: 120px;
@@ -1146,38 +1156,45 @@ table.eael-data-table thead .sorting:after, table.eael-data-table thead .sorting
1146
  margin-left: 10px;
1147
  margin-right: 10px;
1148
  }
 
1149
  .eael-data-table-wrap .eael-data-tables_length label {
1150
  font-weight: 700;
1151
  }
 
1152
  .eael-data-table-wrap .eael-data-tables_info {
1153
  flex-grow: 1;
1154
  flex-basis: 50%;
1155
  font-weight: 700;
1156
  }
 
1157
  .eael-data-table-wrap .eael-data-tables_paginate {
1158
  flex-grow: 1;
1159
  flex-basis: 50%;
1160
  text-align: right;
1161
  }
 
1162
  .eael-data-table-wrap .eael-data-tables_paginate .paginate_button {
1163
  padding: 10px 15px;
1164
  background: #f2f2f2;
1165
  margin-right: 2px;
1166
  cursor: pointer;
1167
- transition: all .3s;
1168
  }
 
1169
  .eael-data-table-wrap .eael-data-tables_paginate .paginate_button:hover {
1170
  color: #fff;
1171
  background: #4a4893;
1172
  }
 
1173
  .eael-data-table-wrap .eael-data-tables_paginate .paginate_button.current {
1174
  color: #fff;
1175
  background: #4a4893;
1176
  }
 
1177
  .eael-data-table-wrap .eael-data-tables_paginate .paginate_button.disabled {
1178
  cursor: no-drop;
1179
  background: #f2f2f2;
1180
- opacity: .5;
1181
  color: #888;
1182
  }
1183
 
@@ -1194,12 +1211,15 @@ table.eael-data-table thead .sorting:after, table.eael-data-table thead .sorting
1194
  border-collapse: collapse;
1195
  border: none;
1196
  }
 
1197
  .eael-data-table tr {
1198
  border-style: none;
1199
  }
 
1200
  .eael-data-table thead tr {
1201
  text-align: left;
1202
  }
 
1203
  .eael-data-table thead tr th {
1204
  padding: 20px 15px;
1205
  background: #4a4893;
@@ -1213,28 +1233,36 @@ table.eael-data-table thead .sorting:after, table.eael-data-table thead .sorting
1213
  border-style: none;
1214
  background-clip: padding-box;
1215
  }
 
1216
  .eael-data-table thead tr th:hover {
1217
  border-color: #000;
1218
  }
 
1219
  .eael-data-table tbody tr.even {
1220
  transition: background 0.4s ease-in-out;
1221
  }
 
1222
  .eael-data-table tbody tr.even:hover {
1223
  background: rgba(242, 242, 242, 0.7);
1224
  }
 
1225
  .eael-data-table tbody tr.even:last-child {
1226
  border-bottom: 1px solid rgba(0, 0, 0, 0.09);
1227
  }
 
1228
  .eael-data-table tbody tr.odd {
1229
  background: rgba(242, 242, 242, 0.5);
1230
  transition: background 0.2s ease-in-out;
1231
  }
 
1232
  .eael-data-table tbody tr.odd:hover {
1233
  background: rgba(242, 242, 242, 0.7);
1234
  }
 
1235
  .eael-data-table tbody tr.odd:last-child {
1236
  border-bottom: 1px solid rgba(0, 0, 0, 0.09);
1237
  }
 
1238
  .eael-data-table tbody tr td {
1239
  padding: 20px 15px;
1240
  font-size: 14px;
@@ -1263,17 +1291,19 @@ table.eael-data-table thead .sorting:after, table.eael-data-table thead .sorting
1263
 
1264
  .th-mobile-screen {
1265
  display: inline-block;
1266
- padding: 0 .6em;
1267
  margin-right: 10px;
1268
  text-align: center;
1269
  flex-grow: 0;
1270
  flex-shrink: 0;
1271
  flex-basis: 100px;
1272
  }
 
1273
  .th-mobile-screen .eael-data-table-th-img {
1274
  margin: 0 auto 15px auto;
1275
  display: block;
1276
  }
 
1277
  .th-mobile-screen .data-header-icon {
1278
  margin: 0 auto 15px auto;
1279
  display: block;
@@ -1288,6 +1318,7 @@ table.eael-data-table thead .sorting:after, table.eael-data-table thead .sorting
1288
  width: 100%;
1289
  justify-content: center;
1290
  }
 
1291
  .td-content > p {
1292
  width: 100%;
1293
  justify-content: center;
@@ -1296,6 +1327,7 @@ table.eael-data-table thead .sorting:after, table.eael-data-table thead .sorting
1296
  .custom-responsive-option-enable .eael-data-table thead {
1297
  display: none;
1298
  }
 
1299
  .custom-responsive-option-enable .eael-data-table tbody tr td {
1300
  float: none;
1301
  clear: left;
@@ -1311,23 +1343,29 @@ table.eael-data-table thead .sorting:after, table.eael-data-table thead .sorting
1311
  }
1312
  }
1313
  table.eael-data-table thead .sorting:after {
1314
- content: "\f0dc";
1315
  }
 
1316
  table.eael-data-table thead .headerSortDown:after {
1317
- content: "\f0dd";
1318
  }
 
1319
  table.eael-data-table thead .headerSortUp:after {
1320
- content: "\f0de";
1321
  }
 
1322
  table.eael-data-table thead .sorting_disabled.sorting:after {
1323
  display: none;
1324
  }
 
1325
  table.eael-data-table .sorting.sorting-none:after {
1326
  display: none;
1327
  }
 
1328
  table.eael-data-table .sorting_desc.sorting-none:after {
1329
  display: none;
1330
  }
 
1331
  table.eael-data-table .sorting_asc.sorting-none:after {
1332
  display: none;
1333
  }
@@ -1352,13 +1390,21 @@ table.eael-data-table .sorting_asc.sorting-none:after {
1352
  text-align: left;
1353
  }
1354
 
 
 
 
 
 
 
 
 
 
1355
  .eael-dt-td-align-left .eael-data-table tbody tr td {
1356
  text-align: left;
1357
  }
1358
 
1359
- .eael-dt-th-align-right .eael-data-table thead tr th {
1360
- text-align: right;
1361
- padding-right: 30px;
1362
  }
1363
 
1364
  .eael-dt-td-align-right .eael-data-table tbody tr td {
@@ -1366,12 +1412,31 @@ table.eael-data-table .sorting_asc.sorting-none:after {
1366
  padding-right: 30px;
1367
  }
1368
 
1369
- .eael-dt-th-align-center .eael-data-table thead tr th {
1370
- text-align: center;
 
 
 
 
 
 
 
 
 
 
1371
  }
 
 
 
 
1372
 
1373
- .eael-dt-td-align-center .eael-data-table tbody tr td {
1374
- text-align: center;
 
 
 
 
 
1375
  }
1376
 
1377
  /* -------------------------------- */
@@ -1457,61 +1522,6 @@ table.eael-data-table .sorting_asc.sorting-none:after {
1457
  color: #f54;
1458
  }
1459
 
1460
- .eael-fancy-text-container p {
1461
- margin: 0;
1462
- }
1463
-
1464
- .eael-fancy-text-strings {
1465
- display: none;
1466
- }
1467
-
1468
- .eael-fancy-text-prefix,
1469
- .eael-fancy-text-suffix {
1470
- display: inline-block;
1471
- }
1472
-
1473
- .morphext > .animated {
1474
- display: inline-block;
1475
- }
1476
-
1477
- .typed-cursor {
1478
- opacity: 1;
1479
- -webkit-animation: blink_cursor 0.7s infinite;
1480
- animation: blink_cursor 0.7s infinite;
1481
- }
1482
-
1483
- @keyframes blink_cursor {
1484
- 0% {
1485
- opacity: 1;
1486
- }
1487
- 50% {
1488
- opacity: 0;
1489
- }
1490
- 100% {
1491
- opacity: 1;
1492
- }
1493
- }
1494
- @-webkit-keyframes blink_cursor {
1495
- 0% {
1496
- opacity: 1;
1497
- }
1498
- 50% {
1499
- opacity: 0;
1500
- }
1501
- 100% {
1502
- opacity: 1;
1503
- }
1504
- }
1505
- .eael-fancy-text-container.style-2 {
1506
- font-size: 24px;
1507
- }
1508
-
1509
- .eael-fancy-text-container.style-2 .eael-fancy-text-strings {
1510
- background: #ff5544;
1511
- color: #fff;
1512
- padding: 10px 25px;
1513
- }
1514
-
1515
  .eael-facebook-feed {
1516
  width: 100%;
1517
  margin: auto;
@@ -2286,6 +2296,61 @@ table.eael-data-table .sorting_asc.sorting-none:after {
2286
  }
2287
  }
2288
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2289
  /*------------------------------*/
2290
  /* 27. Filterable Gallery
2291
  /*------------------------------*/
@@ -3988,1051 +4053,1051 @@ a.eael-gallery-load-more, a.eael-gallery-load-more:hover {
3988
  }
3989
 
3990
  /* ------------------------ */
3991
- /* 26. Magnific Popup
3992
  /* ------------------------ */
3993
- /*--- Magnific Popup CSS ---*/
3994
- body div.mfp-bg {
3995
- top: 0;
3996
- left: 0;
3997
- width: 100%;
3998
- height: 100%;
3999
- z-index: 1042;
4000
- overflow: hidden;
4001
- position: fixed;
4002
- background: #0b0b0b;
4003
- opacity: 0.8;
4004
- }
4005
-
4006
- .mfp-wrap {
4007
- top: 0;
4008
- left: 0;
4009
- width: 100%;
4010
- height: 100%;
4011
- z-index: 1043;
4012
- position: fixed;
4013
- outline: none !important;
4014
- -webkit-backface-visibility: hidden;
4015
- backface-visibility: hidden;
4016
  }
4017
 
4018
- .mfp-container {
4019
- text-align: center;
4020
- position: absolute;
4021
  width: 100%;
4022
- height: 100%;
4023
- left: 0;
4024
- top: 0;
4025
- padding: 0 8px;
4026
- box-sizing: border-box;
4027
  }
4028
 
4029
- .mfp-container:before {
4030
- content: '';
4031
- display: inline-block;
4032
- height: 100%;
4033
- vertical-align: middle;
4034
  }
4035
 
4036
- .mfp-align-top .mfp-container:before {
4037
- display: none;
 
 
 
4038
  }
4039
 
4040
- .mfp-content {
4041
- position: relative;
4042
- display: inline-block;
4043
- vertical-align: middle;
4044
- margin: 0 auto;
4045
- text-align: left;
4046
- z-index: 1045;
4047
  }
4048
 
4049
- .mfp-inline-holder .mfp-content,
4050
- .mfp-ajax-holder .mfp-content {
4051
- width: 100%;
4052
- cursor: auto;
4053
  }
4054
 
4055
- .mfp-ajax-cur {
4056
- cursor: progress;
 
 
 
 
 
4057
  }
4058
 
4059
- .mfp-zoom-out-cur,
4060
- .mfp-zoom-out-cur .mfp-image-holder .mfp-close {
4061
- cursor: zoom-out;
4062
  }
4063
 
4064
- .mfp-zoom {
4065
- cursor: pointer;
4066
- cursor: zoom-in;
4067
  }
4068
 
4069
- .mfp-auto-cursor .mfp-content {
4070
- cursor: auto;
 
 
4071
  }
4072
 
4073
- .mfp-close,
4074
- .mfp-arrow,
4075
- .mfp-preloader,
4076
- .mfp-counter {
4077
- -webkit-user-select: none;
4078
- -moz-user-select: none;
4079
- -ms-user-select: none;
4080
- user-select: none;
4081
  }
4082
 
4083
- .mfp-loading.mfp-figure {
4084
- display: none;
 
 
4085
  }
4086
 
4087
- .mfp-hide {
4088
- display: none !important;
 
 
 
4089
  }
4090
 
4091
- .mfp-preloader {
4092
- color: #CCC;
4093
- position: absolute;
4094
- top: 50%;
4095
- width: auto;
4096
- text-align: center;
4097
- margin-top: -0.8em;
4098
- left: 8px;
4099
- right: 8px;
4100
- z-index: 1044;
4101
  }
4102
 
4103
- .mfp-preloader a {
4104
- color: #CCC;
 
 
 
4105
  }
4106
 
4107
- .mfp-preloader a:hover {
4108
- color: #FFF;
 
 
 
4109
  }
4110
 
4111
- .mfp-s-ready .mfp-preloader {
4112
- display: none;
 
 
 
4113
  }
4114
 
4115
- .mfp-s-error .mfp-content {
4116
- display: none;
 
 
 
4117
  }
4118
 
4119
- button.mfp-close,
4120
- button.mfp-arrow {
4121
- overflow: visible;
4122
- cursor: pointer;
4123
- background: transparent;
4124
- border: 0;
4125
- -webkit-appearance: none;
4126
  display: block;
4127
- outline: none;
4128
- padding: 0;
4129
- z-index: 1046;
4130
- box-shadow: none;
4131
- touch-action: manipulation;
4132
  }
4133
 
4134
- button::-moz-focus-inner {
4135
- padding: 0;
4136
- border: 0;
4137
  }
4138
 
4139
- .mfp-close {
4140
- width: 44px;
4141
- height: 44px;
4142
- line-height: 44px;
4143
- position: absolute;
4144
- right: 0;
4145
- top: 0;
4146
- text-decoration: none;
4147
- text-align: center;
4148
- opacity: 0.65;
4149
- padding: 0 0 18px 10px;
4150
- color: #FFF;
4151
- font-style: normal;
4152
- font-size: 28px;
4153
- font-family: Arial, Baskerville, monospace;
4154
  }
4155
 
4156
- .mfp-close:hover,
4157
- .mfp-close:focus {
4158
- opacity: 1;
4159
  }
4160
 
4161
- .mfp-close:active {
4162
- top: 1px;
 
4163
  }
4164
 
4165
- .mfp-close-btn-in .mfp-close {
4166
- color: #333;
 
 
 
 
4167
  }
4168
 
4169
- .mfp-image-holder .mfp-close,
4170
- .mfp-iframe-holder .mfp-close {
4171
- color: #FFF;
4172
- right: -6px;
4173
  text-align: right;
4174
- padding-right: 6px;
4175
- width: 100%;
 
4176
  }
4177
 
4178
- .mfp-counter {
4179
- position: absolute;
4180
- top: 0;
4181
- right: 0;
4182
- color: #CCC;
4183
- font-size: 12px;
4184
- line-height: 18px;
4185
- white-space: nowrap;
4186
  }
4187
 
4188
- .mfp-arrow {
4189
- position: absolute;
4190
- opacity: 0.65;
4191
- margin: 0;
4192
- top: 50%;
4193
- margin-top: -55px;
4194
- padding: 0;
4195
- width: 90px;
4196
- height: 110px;
4197
- -webkit-tap-highlight-color: transparent;
4198
  }
4199
 
4200
- .mfp-arrow:active {
4201
- margin-top: -54px;
 
4202
  }
4203
 
4204
- .mfp-arrow:hover,
4205
- .mfp-arrow:focus {
4206
- opacity: 1;
4207
  }
4208
 
4209
- .mfp-arrow:before,
4210
- .mfp-arrow:after {
4211
- content: '';
4212
- display: block;
4213
- width: 0;
4214
- height: 0;
4215
- position: absolute;
4216
- left: 0;
4217
- top: 0;
4218
- margin-top: 35px;
4219
- margin-left: 35px;
4220
- border: medium inset transparent;
4221
  }
4222
 
4223
- .mfp-arrow:after {
4224
- border-top-width: 13px;
4225
- border-bottom-width: 13px;
4226
- top: 8px;
4227
  }
4228
 
4229
- .mfp-arrow:before {
4230
- border-top-width: 21px;
4231
- border-bottom-width: 21px;
4232
- opacity: 0.7;
4233
  }
4234
 
4235
- .mfp-arrow-left {
4236
- left: 0;
 
 
 
4237
  }
4238
 
4239
- .mfp-arrow-left:after {
4240
- border-right: 17px solid #FFF;
4241
- margin-left: 31px;
4242
  }
4243
 
4244
- .mfp-arrow-left:before {
4245
- margin-left: 25px;
4246
- border-right: 27px solid #3F3F3F;
4247
  }
4248
 
4249
- .mfp-arrow-right {
4250
- right: 0;
4251
  }
4252
 
4253
- .mfp-arrow-right:after {
4254
- border-left: 17px solid #FFF;
4255
- margin-left: 39px;
4256
  }
4257
 
4258
- .mfp-arrow-right:before {
4259
- border-left: 27px solid #3F3F3F;
4260
  }
4261
 
4262
- .mfp-iframe-holder {
4263
- padding-top: 40px;
4264
- padding-bottom: 40px;
 
 
 
 
 
4265
  }
4266
 
4267
- .mfp-iframe-holder .mfp-content {
4268
- line-height: 0;
 
 
4269
  width: 100%;
4270
- max-width: 900px;
 
4271
  }
4272
 
4273
- .mfp-iframe-holder .mfp-close {
4274
- top: -40px;
 
4275
  }
4276
 
4277
- .mfp-iframe-scaler {
4278
  width: 100%;
4279
- height: 0;
4280
- overflow: hidden;
4281
- padding-top: 56.25%;
4282
  }
4283
 
4284
- .mfp-iframe-scaler iframe {
4285
- position: absolute;
4286
- display: block;
4287
- top: 0;
4288
- left: 0;
4289
- width: 100%;
4290
  height: 100%;
4291
- box-shadow: 0 0 8px rgba(0, 0, 0, 0.6);
4292
- background: #000;
4293
  }
4294
 
4295
- /*--- Main image in popup ---*/
4296
- img.mfp-img {
4297
- width: auto;
4298
- max-width: 100%;
4299
- height: auto;
4300
- display: block;
4301
- line-height: 0;
4302
- box-sizing: border-box;
4303
- padding: 40px 0 40px;
4304
- margin: 0 auto;
4305
  }
4306
 
4307
- /*--- The shadow behind the image ---*/
4308
- .mfp-figure {
4309
- line-height: 0;
4310
  }
4311
 
4312
- .mfp-figure:after {
4313
- content: '';
4314
- position: absolute;
4315
- left: 0;
4316
- top: 40px;
4317
- bottom: 40px;
4318
- display: block;
4319
- right: 0;
4320
- width: auto;
4321
- height: auto;
4322
- z-index: -1;
4323
- box-shadow: 0 0 8px rgba(0, 0, 0, 0.6);
4324
- background: #444;
4325
  }
4326
 
4327
- .mfp-figure small {
4328
- color: #BDBDBD;
4329
- display: block;
4330
- font-size: 12px;
4331
- line-height: 14px;
4332
  }
4333
 
4334
- .mfp-figure figure {
4335
- margin: 0;
4336
  }
4337
 
4338
- .mfp-bottom-bar {
4339
- margin-top: -36px;
4340
- position: absolute;
4341
- top: 100%;
4342
- left: 0;
4343
- width: 100%;
4344
- cursor: auto;
4345
  }
4346
 
4347
- .mfp-title {
4348
- text-align: left;
4349
- line-height: 18px;
4350
- color: #F3F3F3;
4351
- word-wrap: break-word;
4352
- padding-right: 36px;
4353
  }
4354
 
4355
- .mfp-image-holder .mfp-content {
4356
- max-width: 100%;
4357
  }
4358
 
4359
- .mfp-gallery .mfp-image-holder .mfp-figure {
4360
- cursor: pointer;
 
4361
  }
4362
 
4363
- button.mfp-close,
4364
- button.mfp-close:hover {
4365
- display: inline-block !important;
4366
- background: transparent;
4367
- width: auto !important;
4368
  }
4369
 
4370
- .mfp-arrow,
4371
- .mfp-arrow:hover {
4372
- background: transparent;
 
 
 
 
4373
  }
4374
 
4375
- @media screen and (max-width: 800px) and (orientation: landscape), screen and (max-height: 300px) {
4376
- /**
4377
- * Remove all paddings around the image on small screen
4378
- */
4379
- .mfp-img-mobile .mfp-image-holder {
4380
- padding-left: 0;
4381
- padding-right: 0;
4382
- }
4383
-
4384
- .mfp-img-mobile img.mfp-img {
4385
- padding: 0;
4386
- }
4387
 
4388
- .mfp-img-mobile .mfp-figure:after {
4389
- top: 0;
4390
- bottom: 0;
4391
- }
 
4392
 
4393
- .mfp-img-mobile .mfp-figure small {
4394
- display: inline;
4395
- margin-left: 5px;
4396
- }
4397
 
4398
- .mfp-img-mobile .mfp-bottom-bar {
4399
- background: rgba(0, 0, 0, 0.6);
4400
- bottom: 0;
4401
- margin: 0;
4402
- top: auto;
4403
- padding: 3px 5px;
4404
- position: fixed;
4405
- box-sizing: border-box;
4406
- }
4407
 
4408
- .mfp-img-mobile .mfp-bottom-bar:empty {
4409
- padding: 0;
4410
- }
 
4411
 
4412
- .mfp-img-mobile .mfp-counter {
4413
- right: 5px;
4414
- top: 3px;
4415
- }
4416
 
4417
- .mfp-img-mobile .mfp-close {
4418
- top: 0;
4419
- right: 0;
4420
- width: 35px;
4421
- height: 35px;
4422
- line-height: 35px;
4423
- background: rgba(0, 0, 0, 0.6);
4424
- position: fixed;
4425
- text-align: center;
4426
- padding: 0;
4427
- }
4428
  }
4429
- @media all and (max-width: 900px) {
4430
- .mfp-arrow {
4431
- transform: scale(0.75);
4432
- }
4433
 
4434
- .mfp-arrow-left {
4435
- transform-origin: 0;
4436
- }
 
 
4437
 
4438
- .mfp-arrow-right {
4439
- transform-origin: 100%;
4440
- }
 
 
 
 
4441
 
4442
- .mfp-container {
4443
- padding-left: 6px;
4444
- padding-right: 6px;
4445
- }
4446
  }
4447
 
4448
- /* ------------------------ */
4449
- /* 17. Infobox Style
4450
- /* ------------------------ */
4451
- /*--- Image/Icon On Top ---*/
4452
- .eael-infobox .infobox-icon {
4453
- height: auto;
4454
  }
4455
 
4456
- .eael-infobox .infobox-icon .infobox-icon-wrap {
4457
- display: flex;
4458
- width: 100%;
4459
- height: auto;
4460
- transition: .3s;
4461
- align-items: center;
4462
- justify-content: center;
4463
  }
4464
 
4465
- .eael-infobox .infobox-icon .infobox-icon-wrap i {
4466
- transition: .3s;
4467
  }
4468
 
4469
- /*--- For Content Alignment ---*/
4470
- .eael-infobox-content-align-left .eael-infobox .infobox-icon,
4471
- .eael-infobox-content-align-left .eael-infobox .infobox-content,
4472
- .eael-infobox-content-align-left .eael-infobox .infobox-button {
4473
- text-align: left;
4474
  }
4475
 
4476
- .eael-infobox-content-align-right .eael-infobox .infobox-icon,
4477
- .eael-infobox-content-align-right .eael-infobox .infobox-content,
4478
- .eael-infobox-content-align-right .eael-infobox .infobox-button {
4479
- text-align: right;
4480
  }
4481
 
4482
- .eael-infobox-content-align-center .eael-infobox .infobox-icon,
4483
- .eael-infobox-content-align-center .eael-infobox .infobox-content,
4484
- .eael-infobox-content-align-center .eael-infobox .infobox-button {
4485
- text-align: center;
4486
  }
4487
 
4488
- /*--- For icon background shape ---*/
4489
- .eael-infobox-icon-bg-shape-square .infobox-icon .infobox-icon-wrap,
4490
- .eael-infobox-icon-bg-shape-radius .infobox-icon .infobox-icon-wrap,
4491
- .eael-infobox-icon-bg-shape-circle .infobox-icon .infobox-icon-wrap {
4492
- width: 90px;
4493
- height: 90px;
4494
- text-align: center;
4495
  }
4496
 
4497
- .eael-infobox-icon-hover-bg-shape-square:hover .infobox-icon .infobox-icon-wrap {
4498
- border-radius: 0;
 
 
4499
  }
4500
 
4501
- .eael-infobox-icon-bg-shape-radius .infobox-icon .infobox-icon-wrap,
4502
- .eael-infobox-icon-hover-bg-shape-radius:hover .infobox-icon .infobox-icon-wrap {
4503
- border-radius: 15px;
4504
  }
4505
 
4506
- .eael-infobox-icon-bg-shape-radius .infobox-icon .infobox-icon-wrap {
4507
- display: flex;
4508
- align-items: center;
4509
- justify-content: center;
4510
  }
4511
 
4512
- .eael-infobox-icon-bg-shape-circle .infobox-icon .infobox-icon-wrap,
4513
- .eael-infobox-icon-hover-bg-shape-circle:hover .infobox-icon .infobox-icon-wrap {
4514
- border-radius: 50%;
 
4515
  }
4516
 
4517
- .eael-infobox-icon-bg-shape-square .infobox-icon .infobox-icon-wrap i,
4518
- .eael-infobox-icon-bg-shape-circle .infobox-icon .infobox-icon-wrap i {
4519
- margin-top: 50%;
4520
- transform: translateY(-50%);
4521
  }
4522
 
4523
- /*--- Infobox Button ---*/
4524
- .eael-infobox .infobox-button a.eael-infobox-button {
4525
- display: inline-block;
4526
- padding: 5px 10px;
4527
- transition: all 300ms ease-in-out 0s;
4528
  }
4529
 
4530
- /*--- For icon bg shape alignment ---*/
4531
- .eael-infobox-content-align-left.eael-infobox-icon-bg-shape-square .infobox-icon,
4532
- .eael-infobox-content-align-left.eael-infobox-icon-bg-shape-radius .infobox-icon,
4533
- .eael-infobox-content-align-left.eael-infobox-icon-bg-shape-circle .infobox-icon {
4534
- display: flex;
4535
- justify-content: flex-start;
4536
  }
4537
 
4538
- .eael-infobox-content-align-center.eael-infobox-icon-bg-shape-square .infobox-icon,
4539
- .eael-infobox-content-align-center.eael-infobox-icon-bg-shape-radius .infobox-icon,
4540
- .eael-infobox-content-align-center.eael-infobox-icon-bg-shape-circle .infobox-icon {
4541
- display: flex;
4542
- justify-content: center;
4543
  }
4544
 
4545
- .eael-infobox-content-align-right.eael-infobox-icon-bg-shape-square .infobox-icon,
4546
- .eael-infobox-content-align-right.eael-infobox-icon-bg-shape-radius .infobox-icon,
4547
- .eael-infobox-content-align-right.eael-infobox-icon-bg-shape-circle .infobox-icon {
4548
- display: flex;
4549
- justify-content: flex-end;
4550
  }
4551
 
4552
- /*--- Image/Icon On Left ---*/
4553
- .eael-infobox.icon-on-left {
4554
- position: relative;
4555
- z-index: 0;
4556
- display: flex;
4557
  }
4558
 
4559
- .eael-infobox.icon-on-right .infobox-icon-wrap,
4560
- .eael-infobox.icon-on-left .infobox-icon-wrap {
4561
- justify-content: center;
4562
- display: flex !important;
4563
- align-items: center;
4564
  }
4565
 
4566
- .eael-infobox.icon-on-left .infobox-icon .infobox-icon-wrap {
4567
- background: none;
4568
- border: 0px;
4569
- text-align: left;
4570
- height: auto;
4571
- display: block;
4572
  }
4573
 
4574
- .eael-infobox .infobox-content p {
4575
- margin: 0 0 15px;
 
4576
  }
4577
 
4578
- .eael-infobox.icon-on-left .infobox-icon .infobox-icon-wrap i {
4579
- margin-top: 0px;
4580
- transform: translateY(0%);
 
 
 
 
 
 
4581
  }
4582
-
4583
- .eael-infobox.icon-on-left .infobox-content {
4584
- padding-left: 15px;
4585
- flex: 1 1 auto;
 
 
 
 
 
4586
  }
4587
-
4588
- .eael-infobox.icon-on-left .infobox-content .title {
4589
- line-height: 1;
4590
- margin: 0 0 10px 0;
 
 
 
 
 
 
 
 
 
4591
  }
4592
 
4593
- /*--- Image/Icon On Right ---*/
4594
- .eael-infobox.icon-on-right {
4595
- position: relative;
4596
- z-index: 0;
4597
  display: flex;
4598
- flex-direction: row-reverse;
4599
  }
4600
 
4601
- .eael-infobox.icon-on-right .infobox-icon .infobox-icon-wrap {
4602
- background: none;
4603
- border: 0px;
4604
- text-align: right;
4605
- width: auto;
4606
- height: auto;
4607
- display: block;
4608
  }
4609
 
4610
- .eael-infobox.icon-on-right .infobox-icon .infobox-icon-wrap i {
4611
- margin-top: 0px;
4612
- transform: translateY(0%);
 
 
 
 
4613
  }
4614
 
4615
- .eael-infobox.icon-on-right .infobox-content {
4616
- padding-right: 15px;
4617
- text-align: right;
4618
- flex: 1 1 auto;
4619
- box-sizing: border-box;
 
4620
  }
4621
 
4622
- .eael-infobox.icon-on-right .infobox-content .title {
4623
- line-height: 1;
4624
- margin: 0 0 10px 0;
 
4625
  }
4626
 
4627
- /*--- Imgae Circle On Top ---*/
4628
- .eael-infobox .infobox-icon img {
4629
- transition: all 300ms ease-in-out 0s;
 
4630
  }
4631
 
4632
- .eael-infobox-hover-img-shape-square:hover .eael-infobox .infobox-icon img {
4633
- border-radius: 0;
 
 
 
 
 
4634
  }
4635
 
4636
- .eael-infobox-shape-circle .eael-infobox .infobox-icon img,
4637
- .eael-infobox-hover-img-shape-circle:hover .eael-infobox .infobox-icon img {
4638
- border-radius: 50%;
4639
  }
4640
 
4641
- .eael-infobox-shape-radius .eael-infobox .infobox-icon img,
4642
- .eael-infobox-hover-img-shape-radius:hover .eael-infobox .infobox-icon img {
4643
- border-radius: 15px;
4644
  }
4645
 
4646
- /*-----------------------------*/
4647
- /* 15. Post Grid Style
4648
- /*-----------------------------*/
4649
- .eael-post-grid {
4650
- margin: 0 -10px;
4651
  }
4652
 
4653
- .eael-grid-post {
4654
- float: left;
4655
- padding: 10px;
4656
  }
4657
 
4658
- .eael-post-carousel .eael-grid-post {
4659
- float: none;
4660
- padding: 0;
4661
  }
4662
 
4663
- .eael-grid-post-holder {
4664
- border: 1px solid rgba(0, 0, 0, 0.1);
4665
  }
4666
 
4667
- .eael-grid-post-holder-inner {
4668
- height: 100%;
 
4669
  }
4670
 
4671
- .eael-entry-media {
4672
- position: relative;
4673
  }
4674
 
4675
- .eael-entry-overlay {
4676
- position: absolute;
 
 
 
4677
  top: 0;
4678
  left: 0;
4679
  width: 100%;
4680
  height: 100%;
4681
- z-index: 2;
4682
- transition: opacity 0.2s ease-in-out, transform 0.25s cubic-bezier(0.19, 1, 0.22, 1);
 
 
 
4683
  }
4684
 
4685
- .eael-entry-overlay > a {
4686
- position: absolute;
4687
  top: 0;
4688
  left: 0;
4689
  width: 100%;
4690
  height: 100%;
4691
- z-index: 3;
4692
- }
4693
-
4694
- .eael-entry-title {
4695
- margin: 10px 0 5px;
4696
- font-size: 1.2em;
4697
  }
4698
 
4699
- .eael-entry-thumbnail img {
 
 
4700
  width: 100%;
4701
- max-width: 100%;
4702
- vertical-align: middle;
4703
- }
4704
-
4705
- .eael-entry-thumbnail > img {
4706
  height: 100%;
 
 
 
 
4707
  }
4708
 
4709
- .eael-entry-footer .eael-author-avatar {
4710
- width: 50px;
 
 
 
4711
  }
4712
 
4713
- .eael-entry-footer .eael-author-avatar .avatar {
4714
- border-radius: 50%;
4715
  }
4716
 
4717
- .eael-post-grid .eael-entry-footer .eael-entry-meta {
4718
- padding-left: 8px;
 
 
 
4719
  text-align: left;
 
4720
  }
4721
 
4722
- .eael-grid-post .eael-entry-meta {
4723
- display: flex;
4724
- flex-direction: row;
4725
- }
4726
-
4727
- .eael-grid-post .eael-entry-footer .eael-entry-meta {
4728
- flex-direction: column;
4729
  }
4730
 
4731
- .eael-entry-meta > div {
4732
- font-size: 12px;
4733
- line-height: 1.2;
4734
- padding-bottom: 5px;
4735
  }
4736
 
4737
- .eael-grid-post-excerpt p {
4738
- margin: 0;
4739
- font-size: 14px;
4740
  }
4741
 
4742
- .eael-entry-meta .eael-entry-footer .eael-posted-by {
4743
- display: block;
 
4744
  }
4745
 
4746
- .eael-grid-post .eael-entry-wrapper,
4747
- .eael-grid-post .eael-entry-footer {
4748
- padding: 15px;
4749
  }
4750
 
4751
- .eael-post-grid .eael-entry-header .eael-entry-meta span.eael-posted-on {
4752
- padding-left: 5px;
 
 
 
 
 
 
4753
  }
4754
 
4755
- .eael-post-grid .eael-entry-header .eael-entry-meta span.eael-posted-on::before {
4756
- content: '\f111';
4757
- font-family: FontAwesome;
4758
- color: inherit;
4759
- opacity: .4;
4760
- font-size: .8em;
4761
- padding-right: 7px;
4762
  }
4763
 
4764
- /*--- Post Grid Thumbnail Hover Effects ---*/
4765
- .eael-entry-media {
4766
- position: relative;
4767
  }
4768
 
4769
- .eael-entry-overlay {
4770
- display: flex;
4771
- align-items: center;
4772
- justify-content: center;
 
 
 
 
 
 
4773
  }
4774
 
4775
- .eael-entry-overlay > i {
4776
- color: #fff;
4777
  }
4778
 
4779
- /*--- fade in ---*/
4780
- .eael-entry-overlay.fade-in {
4781
- visibility: hidden;
4782
- opacity: 0;
4783
- transition: 300ms;
4784
  }
4785
 
4786
- .eael-entry-media:hover .eael-entry-overlay.fade-in {
4787
- visibility: visible;
4788
- opacity: 1;
4789
  }
4790
 
4791
- .eael-entry-media:hover .eael-entry-overlay.fade-in > i {
4792
- transform: translate(0);
4793
- opacity: 1;
4794
  }
4795
 
4796
- /*--- zoom in --- */
4797
- .eael-entry-overlay.zoom-in {
4798
- transform: scale(0.9);
4799
- visibility: hidden;
4800
- opacity: 0;
4801
- transition: 300ms;
 
 
 
 
 
 
 
4802
  }
4803
 
4804
- .eael-entry-media:hover .eael-entry-overlay.zoom-in {
4805
- visibility: visible;
4806
- opacity: 1;
4807
- transform: scale(1);
4808
  }
4809
 
4810
- /*--- slide up ---*/
4811
- .eael-entry-overlay.slide-up {
4812
- transform: translateY(100%);
4813
- visibility: hidden;
4814
- opacity: 0;
4815
- transition: 300ms;
 
 
 
 
 
 
 
 
 
4816
  }
4817
 
4818
- .eael-entry-media:hover .eael-entry-overlay.slide-up {
4819
- transform: translateY(0);
4820
- visibility: visible;
4821
  opacity: 1;
4822
  }
4823
 
4824
- .eael-entry-media {
4825
- overflow: hidden;
4826
  }
4827
 
4828
- /*--- Post Grid & Carousel Hover Styles ---*/
4829
- .eael-entry-media.grid-hover-style-fade-in .eael-entry-overlay {
4830
- opacity: 0;
4831
  }
4832
 
4833
- .eael-entry-media.grid-hover-style-fade-in:hover .eael-entry-overlay {
4834
- opacity: 1;
 
 
 
 
 
4835
  }
4836
 
4837
- .eael-entry-media.grid-hover-style-none .eael-entry-overlay {
4838
- display: none;
 
 
 
 
 
 
4839
  }
4840
 
4841
- .eael-entry-media.grid-hover-style-zoom-in .eael-entry-overlay {
4842
- transform: scale(0.4);
4843
- opacity: 0;
 
 
 
 
 
 
 
4844
  }
4845
 
4846
- .eael-entry-media.grid-hover-style-zoom-in:hover .eael-entry-overlay {
4847
- transform: scale(1);
4848
- opacity: 1;
4849
  }
4850
 
4851
- .eael-entry-media.grid-hover-style-animate-down .eael-entry-overlay {
4852
- transform: translateY(-100%);
 
4853
  }
4854
 
4855
- .eael-entry-media.grid-hover-style-animate-down .eael-entry-overlay > i {
4856
- transform: translateY(-100px);
4857
- transition-delay: 100ms;
4858
- transition-duration: 300ms;
 
 
 
 
 
 
 
 
4859
  }
4860
 
4861
- .eael-entry-media.grid-hover-style-animate-down:hover .eael-entry-overlay {
4862
- transform: translate(0);
 
 
4863
  }
4864
 
4865
- .eael-entry-media.grid-hover-style-animate-down:hover .eael-entry-overlay > i {
4866
- transform: translateY(0);
 
 
4867
  }
4868
 
4869
- .eael-entry-media.grid-hover-style-animate-up .eael-entry-overlay {
4870
- transform: translateY(100%);
4871
- visibility: hidden;
4872
- opacity: 0;
4873
  }
4874
 
4875
- .eael-entry-media.grid-hover-style-animate-up .eael-entry-overlay > i {
4876
- transform: translateY(100px);
4877
- transition-delay: 100ms;
4878
- transition-duration: 300ms;
4879
  }
4880
 
4881
- .eael-entry-media.grid-hover-style-animate-up:hover .eael-entry-overlay {
4882
- transform: translate(0);
4883
- visibility: visible;
4884
- opacity: 1;
4885
  }
4886
 
4887
- .eael-entry-media.grid-hover-style-animate-up:hover .eael-entry-overlay > i {
4888
- transform: translateY(0);
4889
  }
4890
 
4891
- /*--- Post Grid Column Styles ---*/
4892
- .eael-col-1 .eael-post-grid-column {
4893
- float: none;
4894
- width: 100%;
4895
  }
4896
 
4897
- .eael-col-2 .eael-post-grid-column {
4898
- float: left;
4899
- width: 50%;
4900
  }
4901
 
4902
- .eael-col-3 .eael-post-grid-column {
4903
- float: left;
4904
- width: 33.3333%;
4905
  }
4906
 
4907
- .eael-col-4 .eael-post-grid-column {
4908
- float: left;
4909
- width: 25%;
 
4910
  }
4911
 
4912
- .eael-col-5 .eael-post-grid-column {
4913
- float: left;
4914
- width: 20%;
4915
  }
4916
 
4917
- .eael-col-6 .eael-post-grid-column {
4918
- float: left;
4919
- width: 16.6666%;
 
 
4920
  }
4921
 
4922
- @media only screen and (max-width: 979px) {
4923
- .eael-col-1 .eael-post-grid-column,
4924
- .eael-col-2 .eael-post-grid-column,
4925
- .eael-col-3 .eael-post-grid-column,
4926
- .eael-col-4 .eael-post-grid-column,
4927
- .eael-col-5 .eael-post-grid-column,
4928
- .eael-col-6 .eael-post-grid-column {
4929
- width: 33.3333%;
4930
- }
4931
- }
4932
- @media only screen and (max-width: 767px) {
4933
- .eael-col-1 .eael-post-grid-column,
4934
- .eael-col-2 .eael-post-grid-column,
4935
- .eael-col-3 .eael-post-grid-column,
4936
- .eael-col-4 .eael-post-grid-column,
4937
- .eael-col-5 .eael-post-grid-column,
4938
- .eael-col-6 .eael-post-grid-column {
4939
- width: 50%;
4940
- }
4941
- }
4942
- @media only screen and (max-width: 480px) {
4943
- .eael-col-1 .eael-post-grid-column,
4944
- .eael-col-2 .eael-post-grid-column,
4945
- .eael-col-3 .eael-post-grid-column,
4946
- .eael-col-4 .eael-post-grid-column,
4947
- .eael-col-5 .eael-post-grid-column,
4948
- .eael-col-6 .eael-post-grid-column {
4949
- float: none;
4950
- width: 100%;
4951
- }
4952
- }
4953
- .eael-author-avatar > a {
4954
  display: block;
 
 
 
 
 
 
4955
  }
4956
 
4957
- .eael-entry-footer {
4958
- overflow: hidden;
4959
- display: flex;
 
 
 
 
 
 
 
4960
  }
4961
 
4962
- .eael-entry-footer > div {
4963
- display: inline-block;
4964
- float: left;
4965
  }
4966
 
4967
- /*----------------------*/
4968
- /* 13. Ninja Form Styles
4969
- /*----------------------*/
4970
- .eael-ninja-container input,
4971
- .eael-ninja-container textarea {
 
 
 
 
4972
  height: auto;
4973
- padding: 10px;
 
 
4974
  }
4975
 
4976
- .eael-contact-form-align-center .eael-ninja-container,
4977
- .eael-contact-form-btn-align-center .eael-ninja-container .nf-field .nf-field-element input[type="button"] {
4978
- margin-left: auto !important;
4979
- margin-right: auto !important;
4980
  display: block;
4981
- float: none;
 
4982
  }
4983
 
4984
- .eael-contact-form-align-left .eael-ninja-container,
4985
- .eael-contact-form-btn-align-left .eael-ninja-container .nf-field .nf-field-element input[type="button"] {
4986
- float: left;
4987
- width: auto;
4988
  }
4989
 
4990
- .eael-contact-form-align-right .eael-ninja-container,
4991
- .eael-contact-form-btn-align-right .eael-ninja-container .nf-field .nf-field-element input[type="button"] {
4992
- float: right;
4993
- width: auto;
 
 
 
4994
  }
4995
 
4996
- .eael-ninja-container ul.wpuf-form li .wpuf-fields input[type="text"],
4997
- .eael-ninja-container .nf-field .nf-field-element input[type="password"],
4998
- .eael-ninja-container ul.wpuf-form li .wpuf-fields input[type="email"],
4999
- .eael-ninja-container .nf-field .nf-field-element input[type="url"],
5000
- .eael-ninja-container ul.wpuf-form li .wpuf-fields input[type="number"],
5001
- .eael-ninja-container .nf-field .nf-field-element textarea {
5002
- max-width: 100%;
5003
  }
5004
 
5005
- .eael-ninja-form .nf-form-title {
5006
- display: none;
5007
  }
5008
 
5009
- .eael-ninja-form-title-yes .nf-form-title {
5010
- display: block;
5011
  }
5012
 
5013
- .eael-ninja-form .title-description-hide .nf-form-title {
5014
- display: none;
 
 
 
5015
  }
5016
 
5017
- .eael-ninja-form.title-description-hide .nf-form-title {
5018
- display: none;
 
5019
  }
5020
 
5021
- .eael-ninja-form .nf-field-label {
5022
- display: none;
5023
- }
 
 
 
 
 
5024
 
5025
- .eael-ninja-form-labels-yes .nf-field-label {
5026
- display: block;
5027
- }
5028
 
5029
- .eael-ninja-form .submit-container input[type=button] {
5030
- border: 0;
5031
- border-radius: 0;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5032
  }
 
 
 
 
5033
 
5034
- .eael-ninja-form-button-full-width .submit-container input[type=button] {
5035
- width: 100%;
 
 
 
 
 
 
 
 
 
 
5036
  }
5037
 
5038
  /*----------------------------*/
@@ -6004,83 +6069,9 @@ div.tooltipster-sidetip.tooltipster-bottom .tooltipster-arrow {
6004
  margin: 0;
6005
  padding: 0;
6006
  }
6007
- .eael-product-grid .woocommerce ul.products.eael-product-columns-1,
6008
- .eael-post-grid .woocommerce ul.products.eael-product-columns-1 {
6009
- grid-template-columns: 100%;
6010
- }
6011
- .eael-product-grid .woocommerce ul.products.eael-product-columns-2,
6012
- .eael-post-grid .woocommerce ul.products.eael-product-columns-2 {
6013
- grid-template-columns: repeat(2, 1fr);
6014
- }
6015
- @media screen and (max-width: 480px) {
6016
- .eael-product-grid .woocommerce ul.products.eael-product-columns-2,
6017
- .eael-post-grid .woocommerce ul.products.eael-product-columns-2 {
6018
- grid-template-columns: repeat(1, 1fr);
6019
- }
6020
- }
6021
- .eael-product-grid .woocommerce ul.products.eael-product-columns-3,
6022
- .eael-post-grid .woocommerce ul.products.eael-product-columns-3 {
6023
- grid-template-columns: repeat(3, 1fr);
6024
- }
6025
- @media screen and (max-width: 767px) {
6026
- .eael-product-grid .woocommerce ul.products.eael-product-columns-3,
6027
- .eael-post-grid .woocommerce ul.products.eael-product-columns-3 {
6028
- grid-template-columns: repeat(2, 1fr);
6029
- }
6030
- }
6031
- @media screen and (max-width: 480px) {
6032
- .eael-product-grid .woocommerce ul.products.eael-product-columns-3,
6033
- .eael-post-grid .woocommerce ul.products.eael-product-columns-3 {
6034
- grid-template-columns: repeat(1, 1fr);
6035
- }
6036
- }
6037
- .eael-product-grid .woocommerce ul.products.eael-product-columns-4,
6038
- .eael-post-grid .woocommerce ul.products.eael-product-columns-4 {
6039
- grid-template-columns: repeat(4, 1fr);
6040
- }
6041
- @media screen and (max-width: 767px) {
6042
- .eael-product-grid .woocommerce ul.products.eael-product-columns-4,
6043
- .eael-post-grid .woocommerce ul.products.eael-product-columns-4 {
6044
- grid-template-columns: repeat(2, 1fr);
6045
- }
6046
- }
6047
- @media screen and (max-width: 480px) {
6048
- .eael-product-grid .woocommerce ul.products.eael-product-columns-4,
6049
- .eael-post-grid .woocommerce ul.products.eael-product-columns-4 {
6050
- grid-template-columns: repeat(1, 1fr);
6051
- }
6052
- }
6053
- .eael-product-grid .woocommerce ul.products.eael-product-columns-5,
6054
- .eael-post-grid .woocommerce ul.products.eael-product-columns-5 {
6055
- grid-template-columns: repeat(5, 1fr);
6056
- }
6057
- @media screen and (max-width: 767px) {
6058
- .eael-product-grid .woocommerce ul.products.eael-product-columns-5,
6059
- .eael-post-grid .woocommerce ul.products.eael-product-columns-5 {
6060
- grid-template-columns: repeat(2, 1fr);
6061
- }
6062
- }
6063
- @media screen and (max-width: 480px) {
6064
- .eael-product-grid .woocommerce ul.products.eael-product-columns-5,
6065
- .eael-post-grid .woocommerce ul.products.eael-product-columns-5 {
6066
- grid-template-columns: repeat(1, 1fr);
6067
- }
6068
- }
6069
- .eael-product-grid .woocommerce ul.products.eael-product-columns-6,
6070
- .eael-post-grid .woocommerce ul.products.eael-product-columns-6 {
6071
- grid-template-columns: repeat(6, 1fr);
6072
- }
6073
- @media screen and (max-width: 767px) {
6074
- .eael-product-grid .woocommerce ul.products.eael-product-columns-6,
6075
- .eael-post-grid .woocommerce ul.products.eael-product-columns-6 {
6076
- grid-template-columns: repeat(2, 1fr);
6077
- }
6078
- }
6079
- @media screen and (max-width: 480px) {
6080
- .eael-product-grid .woocommerce ul.products.eael-product-columns-6,
6081
- .eael-post-grid .woocommerce ul.products.eael-product-columns-6 {
6082
- grid-template-columns: repeat(1, 1fr);
6083
- }
6084
  }
6085
  .eael-product-grid.eael-product-simple .woocommerce ul.products li.product, .eael-product-grid.eael-product-reveal .woocommerce ul.products li.product,
6086
  .eael-post-grid.eael-product-simple .woocommerce ul.products li.product,
@@ -6429,6 +6420,82 @@ div.tooltipster-sidetip.tooltipster-bottom .tooltipster-arrow {
6429
  transform: translateY(0);
6430
  }
6431
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6432
  @-webkit-keyframes animateStripe {
6433
  0% {
6434
  transform: translate(0, 0);
@@ -7625,19 +7692,26 @@ span.eael-testimonial-quote {
7625
  top: 100%;
7626
  }
7627
  }
7628
- .eael-tooltip-text-align-left .eael-tooltip-text {
 
 
 
 
 
 
 
7629
  text-align: left;
7630
  }
7631
 
7632
- .eael-tooltip-text-align-right .eael-tooltip-text {
7633
  text-align: right;
7634
  }
7635
 
7636
- .eael-tooltip-text-align-center .eael-tooltip-text {
7637
  text-align: center;
7638
  }
7639
 
7640
- .eael-tooltip-text-align-justify .eael-tooltip-text {
7641
  text-align: justify;
7642
  }
7643
 
1095
  margin-left: 5px;
1096
  }
1097
 
1098
+ @charset "UTF-8";
1099
+ table.eael-data-table thead .sorting_asc,
1100
+ table.eael-data-table thead .sorting_desc,
1101
+ table.eael-data-table thead .sorting {
1102
  position: relative;
1103
  z-index: 0;
1104
  outline: 0;
1105
  cursor: pointer;
1106
  }
1107
 
1108
+ table.eael-data-table thead .sorting_asc:after,
1109
+ table.eael-data-table thead .sorting_desc:after,
1110
+ table.eael-data-table thead .sorting:after {
1111
  position: absolute;
1112
  top: 50%;
1113
  right: 10px;
1123
  justify-content: flex-start;
1124
  width: 100%;
1125
  }
1126
+
1127
  .eael-data-table-wrap .eael-data-tables_filter {
1128
  flex-grow: 1;
1129
  flex-basis: 50%;
1130
  text-align: right;
1131
  }
1132
+
1133
  .eael-data-table-wrap .eael-data-tables_filter label {
1134
  font-weight: 700;
1135
  }
1136
+
1137
+ .eael-data-table-wrap .eael-data-tables_filter label input[type=search] {
1138
  height: 40px;
1139
  border: 1px solid rgba(0, 0, 0, 0.09);
1140
  outline: 0;
1141
  padding: 10px;
1142
  margin-left: 10px;
1143
  }
1144
+
1145
  .eael-data-table-wrap .eael-data-tables_length {
1146
  flex-grow: 1;
1147
  flex-basis: 50%;
1148
  }
1149
+
1150
  .eael-data-table-wrap .eael-data-tables_length select {
1151
  width: auto;
1152
  max-width: 120px;
1156
  margin-left: 10px;
1157
  margin-right: 10px;
1158
  }
1159
+
1160
  .eael-data-table-wrap .eael-data-tables_length label {
1161
  font-weight: 700;
1162
  }
1163
+
1164
  .eael-data-table-wrap .eael-data-tables_info {
1165
  flex-grow: 1;
1166
  flex-basis: 50%;
1167
  font-weight: 700;
1168
  }
1169
+
1170
  .eael-data-table-wrap .eael-data-tables_paginate {
1171
  flex-grow: 1;
1172
  flex-basis: 50%;
1173
  text-align: right;
1174
  }
1175
+
1176
  .eael-data-table-wrap .eael-data-tables_paginate .paginate_button {
1177
  padding: 10px 15px;
1178
  background: #f2f2f2;
1179
  margin-right: 2px;
1180
  cursor: pointer;
1181
+ transition: all 0.3s;
1182
  }
1183
+
1184
  .eael-data-table-wrap .eael-data-tables_paginate .paginate_button:hover {
1185
  color: #fff;
1186
  background: #4a4893;
1187
  }
1188
+
1189
  .eael-data-table-wrap .eael-data-tables_paginate .paginate_button.current {
1190
  color: #fff;
1191
  background: #4a4893;
1192
  }
1193
+
1194
  .eael-data-table-wrap .eael-data-tables_paginate .paginate_button.disabled {
1195
  cursor: no-drop;
1196
  background: #f2f2f2;
1197
+ opacity: 0.5;
1198
  color: #888;
1199
  }
1200
 
1211
  border-collapse: collapse;
1212
  border: none;
1213
  }
1214
+
1215
  .eael-data-table tr {
1216
  border-style: none;
1217
  }
1218
+
1219
  .eael-data-table thead tr {
1220
  text-align: left;
1221
  }
1222
+
1223
  .eael-data-table thead tr th {
1224
  padding: 20px 15px;
1225
  background: #4a4893;
1233
  border-style: none;
1234
  background-clip: padding-box;
1235
  }
1236
+
1237
  .eael-data-table thead tr th:hover {
1238
  border-color: #000;
1239
  }
1240
+
1241
  .eael-data-table tbody tr.even {
1242
  transition: background 0.4s ease-in-out;
1243
  }
1244
+
1245
  .eael-data-table tbody tr.even:hover {
1246
  background: rgba(242, 242, 242, 0.7);
1247
  }
1248
+
1249
  .eael-data-table tbody tr.even:last-child {
1250
  border-bottom: 1px solid rgba(0, 0, 0, 0.09);
1251
  }
1252
+
1253
  .eael-data-table tbody tr.odd {
1254
  background: rgba(242, 242, 242, 0.5);
1255
  transition: background 0.2s ease-in-out;
1256
  }
1257
+
1258
  .eael-data-table tbody tr.odd:hover {
1259
  background: rgba(242, 242, 242, 0.7);
1260
  }
1261
+
1262
  .eael-data-table tbody tr.odd:last-child {
1263
  border-bottom: 1px solid rgba(0, 0, 0, 0.09);
1264
  }
1265
+
1266
  .eael-data-table tbody tr td {
1267
  padding: 20px 15px;
1268
  font-size: 14px;
1291
 
1292
  .th-mobile-screen {
1293
  display: inline-block;
1294
+ padding: 0 0.6em;
1295
  margin-right: 10px;
1296
  text-align: center;
1297
  flex-grow: 0;
1298
  flex-shrink: 0;
1299
  flex-basis: 100px;
1300
  }
1301
+
1302
  .th-mobile-screen .eael-data-table-th-img {
1303
  margin: 0 auto 15px auto;
1304
  display: block;
1305
  }
1306
+
1307
  .th-mobile-screen .data-header-icon {
1308
  margin: 0 auto 15px auto;
1309
  display: block;
1318
  width: 100%;
1319
  justify-content: center;
1320
  }
1321
+
1322
  .td-content > p {
1323
  width: 100%;
1324
  justify-content: center;
1327
  .custom-responsive-option-enable .eael-data-table thead {
1328
  display: none;
1329
  }
1330
+
1331
  .custom-responsive-option-enable .eael-data-table tbody tr td {
1332
  float: none;
1333
  clear: left;
1343
  }
1344
  }
1345
  table.eael-data-table thead .sorting:after {
1346
+ content: "";
1347
  }
1348
+
1349
  table.eael-data-table thead .headerSortDown:after {
1350
+ content: "";
1351
  }
1352
+
1353
  table.eael-data-table thead .headerSortUp:after {
1354
+ content: "";
1355
  }
1356
+
1357
  table.eael-data-table thead .sorting_disabled.sorting:after {
1358
  display: none;
1359
  }
1360
+
1361
  table.eael-data-table .sorting.sorting-none:after {
1362
  display: none;
1363
  }
1364
+
1365
  table.eael-data-table .sorting_desc.sorting-none:after {
1366
  display: none;
1367
  }
1368
+
1369
  table.eael-data-table .sorting_asc.sorting-none:after {
1370
  display: none;
1371
  }
1390
  text-align: left;
1391
  }
1392
 
1393
+ .eael-dt-th-align-right .eael-data-table thead tr th {
1394
+ text-align: right;
1395
+ padding-right: 30px;
1396
+ }
1397
+
1398
+ .eael-dt-th-align-center .eael-data-table thead tr th {
1399
+ text-align: center;
1400
+ }
1401
+
1402
  .eael-dt-td-align-left .eael-data-table tbody tr td {
1403
  text-align: left;
1404
  }
1405
 
1406
+ .eael-dt-td-align-center .eael-data-table tbody tr td {
1407
+ text-align: center;
 
1408
  }
1409
 
1410
  .eael-dt-td-align-right .eael-data-table tbody tr td {
1412
  padding-right: 30px;
1413
  }
1414
 
1415
+ @media (max-width: 1024px) {
1416
+ .eael-dt-td-align-tablet-left .eael-data-table tbody tr td {
1417
+ text-align: left;
1418
+ }
1419
+
1420
+ .eael-dt-td-align-tablet-center .eael-data-table tbody tr td {
1421
+ text-align: center;
1422
+ }
1423
+
1424
+ .eael-dt-td-align-tablet-right .eael-data-table tbody tr td {
1425
+ text-align: right;
1426
+ }
1427
  }
1428
+ @media (max-width: 767px) {
1429
+ .eael-dt-td-align-mobile-left .eael-data-table tbody tr td {
1430
+ text-align: left;
1431
+ }
1432
 
1433
+ .eael-dt-td-align-mobile-center .eael-data-table tbody tr td {
1434
+ text-align: center;
1435
+ }
1436
+
1437
+ .eael-dt-td-align-mobile-right .eael-data-table tbody tr td {
1438
+ text-align: right;
1439
+ }
1440
  }
1441
 
1442
  /* -------------------------------- */
1522
  color: #f54;
1523
  }
1524
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1525
  .eael-facebook-feed {
1526
  width: 100%;
1527
  margin: auto;
2296
  }
2297
  }
2298
 
2299
+ .eael-fancy-text-container p {
2300
+ margin: 0;
2301
+ }
2302
+
2303
+ .eael-fancy-text-strings {
2304
+ display: none;
2305
+ }
2306
+
2307
+ .eael-fancy-text-prefix,
2308
+ .eael-fancy-text-suffix {
2309
+ display: inline-block;
2310
+ }
2311
+
2312
+ .morphext > .animated {
2313
+ display: inline-block;
2314
+ }
2315
+
2316
+ .typed-cursor {
2317
+ opacity: 1;
2318
+ -webkit-animation: blink_cursor 0.7s infinite;
2319
+ animation: blink_cursor 0.7s infinite;
2320
+ }
2321
+
2322
+ @keyframes blink_cursor {
2323
+ 0% {
2324
+ opacity: 1;
2325
+ }
2326
+ 50% {
2327
+ opacity: 0;
2328
+ }
2329
+ 100% {
2330
+ opacity: 1;
2331
+ }
2332
+ }
2333
+ @-webkit-keyframes blink_cursor {
2334
+ 0% {
2335
+ opacity: 1;
2336
+ }
2337
+ 50% {
2338
+ opacity: 0;
2339
+ }
2340
+ 100% {
2341
+ opacity: 1;
2342
+ }
2343
+ }
2344
+ .eael-fancy-text-container.style-2 {
2345
+ font-size: 24px;
2346
+ }
2347
+
2348
+ .eael-fancy-text-container.style-2 .eael-fancy-text-strings {
2349
+ background: #ff5544;
2350
+ color: #fff;
2351
+ padding: 10px 25px;
2352
+ }
2353
+
2354
  /*------------------------------*/
2355
  /* 27. Filterable Gallery
2356
  /*------------------------------*/
4053
  }
4054
 
4055
  /* ------------------------ */
4056
+ /* 17. Infobox Style
4057
  /* ------------------------ */
4058
+ /*--- Image/Icon On Top ---*/
4059
+ .eael-infobox .infobox-icon {
4060
+ height: auto;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4061
  }
4062
 
4063
+ .eael-infobox .infobox-icon .infobox-icon-wrap {
4064
+ display: flex;
 
4065
  width: 100%;
4066
+ height: auto;
4067
+ transition: .3s;
4068
+ align-items: center;
4069
+ justify-content: center;
 
4070
  }
4071
 
4072
+ .eael-infobox .infobox-icon .infobox-icon-wrap i {
4073
+ transition: .3s;
 
 
 
4074
  }
4075
 
4076
+ /*--- For Content Alignment ---*/
4077
+ .eael-infobox-content-align-left .eael-infobox .infobox-icon,
4078
+ .eael-infobox-content-align-left .eael-infobox .infobox-content,
4079
+ .eael-infobox-content-align-left .eael-infobox .infobox-button {
4080
+ text-align: left;
4081
  }
4082
 
4083
+ .eael-infobox-content-align-right .eael-infobox .infobox-icon,
4084
+ .eael-infobox-content-align-right .eael-infobox .infobox-content,
4085
+ .eael-infobox-content-align-right .eael-infobox .infobox-button {
4086
+ text-align: right;
 
 
 
4087
  }
4088
 
4089
+ .eael-infobox-content-align-center .eael-infobox .infobox-icon,
4090
+ .eael-infobox-content-align-center .eael-infobox .infobox-content,
4091
+ .eael-infobox-content-align-center .eael-infobox .infobox-button {
4092
+ text-align: center;
4093
  }
4094
 
4095
+ /*--- For icon background shape ---*/
4096
+ .eael-infobox-icon-bg-shape-square .infobox-icon .infobox-icon-wrap,
4097
+ .eael-infobox-icon-bg-shape-radius .infobox-icon .infobox-icon-wrap,
4098
+ .eael-infobox-icon-bg-shape-circle .infobox-icon .infobox-icon-wrap {
4099
+ width: 90px;
4100
+ height: 90px;
4101
+ text-align: center;
4102
  }
4103
 
4104
+ .eael-infobox-icon-hover-bg-shape-square:hover .infobox-icon .infobox-icon-wrap {
4105
+ border-radius: 0;
 
4106
  }
4107
 
4108
+ .eael-infobox-icon-bg-shape-radius .infobox-icon .infobox-icon-wrap,
4109
+ .eael-infobox-icon-hover-bg-shape-radius:hover .infobox-icon .infobox-icon-wrap {
4110
+ border-radius: 15px;
4111
  }
4112
 
4113
+ .eael-infobox-icon-bg-shape-radius .infobox-icon .infobox-icon-wrap {
4114
+ display: flex;
4115
+ align-items: center;
4116
+ justify-content: center;
4117
  }
4118
 
4119
+ .eael-infobox-icon-bg-shape-circle .infobox-icon .infobox-icon-wrap,
4120
+ .eael-infobox-icon-hover-bg-shape-circle:hover .infobox-icon .infobox-icon-wrap {
4121
+ border-radius: 50%;
 
 
 
 
 
4122
  }
4123
 
4124
+ .eael-infobox-icon-bg-shape-square .infobox-icon .infobox-icon-wrap i,
4125
+ .eael-infobox-icon-bg-shape-circle .infobox-icon .infobox-icon-wrap i {
4126
+ margin-top: 50%;
4127
+ transform: translateY(-50%);
4128
  }
4129
 
4130
+ /*--- Infobox Button ---*/
4131
+ .eael-infobox .infobox-button a.eael-infobox-button {
4132
+ display: inline-block;
4133
+ padding: 5px 10px;
4134
+ transition: all 300ms ease-in-out 0s;
4135
  }
4136
 
4137
+ /*--- For icon bg shape alignment ---*/
4138
+ .eael-infobox-content-align-left.eael-infobox-icon-bg-shape-square .infobox-icon,
4139
+ .eael-infobox-content-align-left.eael-infobox-icon-bg-shape-radius .infobox-icon,
4140
+ .eael-infobox-content-align-left.eael-infobox-icon-bg-shape-circle .infobox-icon {
4141
+ display: flex;
4142
+ justify-content: flex-start;
 
 
 
 
4143
  }
4144
 
4145
+ .eael-infobox-content-align-center.eael-infobox-icon-bg-shape-square .infobox-icon,
4146
+ .eael-infobox-content-align-center.eael-infobox-icon-bg-shape-radius .infobox-icon,
4147
+ .eael-infobox-content-align-center.eael-infobox-icon-bg-shape-circle .infobox-icon {
4148
+ display: flex;
4149
+ justify-content: center;
4150
  }
4151
 
4152
+ .eael-infobox-content-align-right.eael-infobox-icon-bg-shape-square .infobox-icon,
4153
+ .eael-infobox-content-align-right.eael-infobox-icon-bg-shape-radius .infobox-icon,
4154
+ .eael-infobox-content-align-right.eael-infobox-icon-bg-shape-circle .infobox-icon {
4155
+ display: flex;
4156
+ justify-content: flex-end;
4157
  }
4158
 
4159
+ /*--- Image/Icon On Left ---*/
4160
+ .eael-infobox.icon-on-left {
4161
+ position: relative;
4162
+ z-index: 0;
4163
+ display: flex;
4164
  }
4165
 
4166
+ .eael-infobox.icon-on-right .infobox-icon-wrap,
4167
+ .eael-infobox.icon-on-left .infobox-icon-wrap {
4168
+ justify-content: center;
4169
+ display: flex !important;
4170
+ align-items: center;
4171
  }
4172
 
4173
+ .eael-infobox.icon-on-left .infobox-icon .infobox-icon-wrap {
4174
+ background: none;
4175
+ border: 0px;
4176
+ text-align: left;
4177
+ height: auto;
 
 
4178
  display: block;
 
 
 
 
 
4179
  }
4180
 
4181
+ .eael-infobox .infobox-content p {
4182
+ margin: 0 0 15px;
 
4183
  }
4184
 
4185
+ .eael-infobox.icon-on-left .infobox-icon .infobox-icon-wrap i {
4186
+ margin-top: 0px;
4187
+ transform: translateY(0%);
 
 
 
 
 
 
 
 
 
 
 
 
4188
  }
4189
 
4190
+ .eael-infobox.icon-on-left .infobox-content {
4191
+ padding-left: 15px;
4192
+ flex: 1 1 auto;
4193
  }
4194
 
4195
+ .eael-infobox.icon-on-left .infobox-content .title {
4196
+ line-height: 1;
4197
+ margin: 0 0 10px 0;
4198
  }
4199
 
4200
+ /*--- Image/Icon On Right ---*/
4201
+ .eael-infobox.icon-on-right {
4202
+ position: relative;
4203
+ z-index: 0;
4204
+ display: flex;
4205
+ flex-direction: row-reverse;
4206
  }
4207
 
4208
+ .eael-infobox.icon-on-right .infobox-icon .infobox-icon-wrap {
4209
+ background: none;
4210
+ border: 0px;
 
4211
  text-align: right;
4212
+ width: auto;
4213
+ height: auto;
4214
+ display: block;
4215
  }
4216
 
4217
+ .eael-infobox.icon-on-right .infobox-icon .infobox-icon-wrap i {
4218
+ margin-top: 0px;
4219
+ transform: translateY(0%);
 
 
 
 
 
4220
  }
4221
 
4222
+ .eael-infobox.icon-on-right .infobox-content {
4223
+ padding-right: 15px;
4224
+ text-align: right;
4225
+ flex: 1 1 auto;
4226
+ box-sizing: border-box;
 
 
 
 
 
4227
  }
4228
 
4229
+ .eael-infobox.icon-on-right .infobox-content .title {
4230
+ line-height: 1;
4231
+ margin: 0 0 10px 0;
4232
  }
4233
 
4234
+ /*--- Imgae Circle On Top ---*/
4235
+ .eael-infobox .infobox-icon img {
4236
+ transition: all 300ms ease-in-out 0s;
4237
  }
4238
 
4239
+ .eael-infobox-hover-img-shape-square:hover .eael-infobox .infobox-icon img {
4240
+ border-radius: 0;
 
 
 
 
 
 
 
 
 
 
4241
  }
4242
 
4243
+ .eael-infobox-shape-circle .eael-infobox .infobox-icon img,
4244
+ .eael-infobox-hover-img-shape-circle:hover .eael-infobox .infobox-icon img {
4245
+ border-radius: 50%;
 
4246
  }
4247
 
4248
+ .eael-infobox-shape-radius .eael-infobox .infobox-icon img,
4249
+ .eael-infobox-hover-img-shape-radius:hover .eael-infobox .infobox-icon img {
4250
+ border-radius: 15px;
 
4251
  }
4252
 
4253
+ /*-----------------------------*/
4254
+ /* 15. Post Grid Style
4255
+ /*-----------------------------*/
4256
+ .eael-post-grid {
4257
+ margin: 0 -10px;
4258
  }
4259
 
4260
+ .eael-grid-post {
4261
+ float: left;
4262
+ padding: 10px;
4263
  }
4264
 
4265
+ .eael-post-carousel .eael-grid-post {
4266
+ float: none;
4267
+ padding: 0;
4268
  }
4269
 
4270
+ .eael-grid-post-holder {
4271
+ border: 1px solid rgba(0, 0, 0, 0.1);
4272
  }
4273
 
4274
+ .eael-grid-post-holder-inner {
4275
+ height: 100%;
 
4276
  }
4277
 
4278
+ .eael-entry-media {
4279
+ position: relative;
4280
  }
4281
 
4282
+ .eael-entry-overlay {
4283
+ position: absolute;
4284
+ top: 0;
4285
+ left: 0;
4286
+ width: 100%;
4287
+ height: 100%;
4288
+ z-index: 2;
4289
+ transition: opacity 0.2s ease-in-out, transform 0.25s cubic-bezier(0.19, 1, 0.22, 1);
4290
  }
4291
 
4292
+ .eael-entry-overlay > a {
4293
+ position: absolute;
4294
+ top: 0;
4295
+ left: 0;
4296
  width: 100%;
4297
+ height: 100%;
4298
+ z-index: 3;
4299
  }
4300
 
4301
+ .eael-entry-title {
4302
+ margin: 10px 0 5px;
4303
+ font-size: 1.2em;
4304
  }
4305
 
4306
+ .eael-entry-thumbnail img {
4307
  width: 100%;
4308
+ max-width: 100%;
4309
+ vertical-align: middle;
 
4310
  }
4311
 
4312
+ .eael-entry-thumbnail > img {
 
 
 
 
 
4313
  height: 100%;
 
 
4314
  }
4315
 
4316
+ .eael-entry-footer .eael-author-avatar {
4317
+ width: 50px;
 
 
 
 
 
 
 
 
4318
  }
4319
 
4320
+ .eael-entry-footer .eael-author-avatar .avatar {
4321
+ border-radius: 50%;
 
4322
  }
4323
 
4324
+ .eael-post-grid .eael-entry-footer .eael-entry-meta {
4325
+ padding-left: 8px;
4326
+ text-align: left;
 
 
 
 
 
 
 
 
 
 
4327
  }
4328
 
4329
+ .eael-grid-post .eael-entry-meta {
4330
+ display: flex;
4331
+ flex-direction: row;
 
 
4332
  }
4333
 
4334
+ .eael-grid-post .eael-entry-footer .eael-entry-meta {
4335
+ flex-direction: column;
4336
  }
4337
 
4338
+ .eael-entry-meta > div {
4339
+ font-size: 12px;
4340
+ line-height: 1.2;
4341
+ padding-bottom: 5px;
 
 
 
4342
  }
4343
 
4344
+ .eael-grid-post-excerpt p {
4345
+ margin: 0;
4346
+ font-size: 14px;
 
 
 
4347
  }
4348
 
4349
+ .eael-entry-meta .eael-entry-footer .eael-posted-by {
4350
+ display: block;
4351
  }
4352
 
4353
+ .eael-grid-post .eael-entry-wrapper,
4354
+ .eael-grid-post .eael-entry-footer {
4355
+ padding: 15px;
4356
  }
4357
 
4358
+ .eael-post-grid .eael-entry-header .eael-entry-meta span.eael-posted-on {
4359
+ padding-left: 5px;
 
 
 
4360
  }
4361
 
4362
+ .eael-post-grid .eael-entry-header .eael-entry-meta span.eael-posted-on::before {
4363
+ content: '\f111';
4364
+ font-family: FontAwesome;
4365
+ color: inherit;
4366
+ opacity: .4;
4367
+ font-size: .8em;
4368
+ padding-right: 7px;
4369
  }
4370
 
4371
+ /*--- Post Grid Thumbnail Hover Effects ---*/
4372
+ .eael-entry-media {
4373
+ position: relative;
4374
+ }
 
 
 
 
 
 
 
 
4375
 
4376
+ .eael-entry-overlay {
4377
+ display: flex;
4378
+ align-items: center;
4379
+ justify-content: center;
4380
+ }
4381
 
4382
+ .eael-entry-overlay > i {
4383
+ color: #fff;
4384
+ }
 
4385
 
4386
+ /*--- fade in ---*/
4387
+ .eael-entry-overlay.fade-in {
4388
+ visibility: hidden;
4389
+ opacity: 0;
4390
+ transition: 300ms;
4391
+ }
 
 
 
4392
 
4393
+ .eael-entry-media:hover .eael-entry-overlay.fade-in {
4394
+ visibility: visible;
4395
+ opacity: 1;
4396
+ }
4397
 
4398
+ .eael-entry-media:hover .eael-entry-overlay.fade-in > i {
4399
+ transform: translate(0);
4400
+ opacity: 1;
4401
+ }
4402
 
4403
+ /*--- zoom in --- */
4404
+ .eael-entry-overlay.zoom-in {
4405
+ transform: scale(0.9);
4406
+ visibility: hidden;
4407
+ opacity: 0;
4408
+ transition: 300ms;
 
 
 
 
 
4409
  }
 
 
 
 
4410
 
4411
+ .eael-entry-media:hover .eael-entry-overlay.zoom-in {
4412
+ visibility: visible;
4413
+ opacity: 1;
4414
+ transform: scale(1);
4415
+ }
4416
 
4417
+ /*--- slide up ---*/
4418
+ .eael-entry-overlay.slide-up {
4419
+ transform: translateY(100%);
4420
+ visibility: hidden;
4421
+ opacity: 0;
4422
+ transition: 300ms;
4423
+ }
4424
 
4425
+ .eael-entry-media:hover .eael-entry-overlay.slide-up {
4426
+ transform: translateY(0);
4427
+ visibility: visible;
4428
+ opacity: 1;
4429
  }
4430
 
4431
+ .eael-entry-media {
4432
+ overflow: hidden;
 
 
 
 
4433
  }
4434
 
4435
+ /*--- Post Grid & Carousel Hover Styles ---*/
4436
+ .eael-entry-media.grid-hover-style-fade-in .eael-entry-overlay {
4437
+ opacity: 0;
 
 
 
 
4438
  }
4439
 
4440
+ .eael-entry-media.grid-hover-style-fade-in:hover .eael-entry-overlay {
4441
+ opacity: 1;
4442
  }
4443
 
4444
+ .eael-entry-media.grid-hover-style-none .eael-entry-overlay {
4445
+ display: none;
 
 
 
4446
  }
4447
 
4448
+ .eael-entry-media.grid-hover-style-zoom-in .eael-entry-overlay {
4449
+ transform: scale(0.4);
4450
+ opacity: 0;
 
4451
  }
4452
 
4453
+ .eael-entry-media.grid-hover-style-zoom-in:hover .eael-entry-overlay {
4454
+ transform: scale(1);
4455
+ opacity: 1;
 
4456
  }
4457
 
4458
+ .eael-entry-media.grid-hover-style-animate-down .eael-entry-overlay {
4459
+ transform: translateY(-100%);
 
 
 
 
 
4460
  }
4461
 
4462
+ .eael-entry-media.grid-hover-style-animate-down .eael-entry-overlay > i {
4463
+ transform: translateY(-100px);
4464
+ transition-delay: 100ms;
4465
+ transition-duration: 300ms;
4466
  }
4467
 
4468
+ .eael-entry-media.grid-hover-style-animate-down:hover .eael-entry-overlay {
4469
+ transform: translate(0);
 
4470
  }
4471
 
4472
+ .eael-entry-media.grid-hover-style-animate-down:hover .eael-entry-overlay > i {
4473
+ transform: translateY(0);
 
 
4474
  }
4475
 
4476
+ .eael-entry-media.grid-hover-style-animate-up .eael-entry-overlay {
4477
+ transform: translateY(100%);
4478
+ visibility: hidden;
4479
+ opacity: 0;
4480
  }
4481
 
4482
+ .eael-entry-media.grid-hover-style-animate-up .eael-entry-overlay > i {
4483
+ transform: translateY(100px);
4484
+ transition-delay: 100ms;
4485
+ transition-duration: 300ms;
4486
  }
4487
 
4488
+ .eael-entry-media.grid-hover-style-animate-up:hover .eael-entry-overlay {
4489
+ transform: translate(0);
4490
+ visibility: visible;
4491
+ opacity: 1;
 
4492
  }
4493
 
4494
+ .eael-entry-media.grid-hover-style-animate-up:hover .eael-entry-overlay > i {
4495
+ transform: translateY(0);
 
 
 
 
4496
  }
4497
 
4498
+ /*--- Post Grid Column Styles ---*/
4499
+ .eael-col-1 .eael-post-grid-column {
4500
+ float: none;
4501
+ width: 100%;
 
4502
  }
4503
 
4504
+ .eael-col-2 .eael-post-grid-column {
4505
+ float: left;
4506
+ width: 50%;
 
 
4507
  }
4508
 
4509
+ .eael-col-3 .eael-post-grid-column {
4510
+ float: left;
4511
+ width: 33.3333%;
 
 
4512
  }
4513
 
4514
+ .eael-col-4 .eael-post-grid-column {
4515
+ float: left;
4516
+ width: 25%;
 
 
4517
  }
4518
 
4519
+ .eael-col-5 .eael-post-grid-column {
4520
+ float: left;
4521
+ width: 20%;
 
 
 
4522
  }
4523
 
4524
+ .eael-col-6 .eael-post-grid-column {
4525
+ float: left;
4526
+ width: 16.6666%;
4527
  }
4528
 
4529
+ @media only screen and (max-width: 979px) {
4530
+ .eael-col-1 .eael-post-grid-column,
4531
+ .eael-col-2 .eael-post-grid-column,
4532
+ .eael-col-3 .eael-post-grid-column,
4533
+ .eael-col-4 .eael-post-grid-column,
4534
+ .eael-col-5 .eael-post-grid-column,
4535
+ .eael-col-6 .eael-post-grid-column {
4536
+ width: 33.3333%;
4537
+ }
4538
  }
4539
+ @media only screen and (max-width: 767px) {
4540
+ .eael-col-1 .eael-post-grid-column,
4541
+ .eael-col-2 .eael-post-grid-column,
4542
+ .eael-col-3 .eael-post-grid-column,
4543
+ .eael-col-4 .eael-post-grid-column,
4544
+ .eael-col-5 .eael-post-grid-column,
4545
+ .eael-col-6 .eael-post-grid-column {
4546
+ width: 50%;
4547
+ }
4548
  }
4549
+ @media only screen and (max-width: 480px) {
4550
+ .eael-col-1 .eael-post-grid-column,
4551
+ .eael-col-2 .eael-post-grid-column,
4552
+ .eael-col-3 .eael-post-grid-column,
4553
+ .eael-col-4 .eael-post-grid-column,
4554
+ .eael-col-5 .eael-post-grid-column,
4555
+ .eael-col-6 .eael-post-grid-column {
4556
+ float: none;
4557
+ width: 100%;
4558
+ }
4559
+ }
4560
+ .eael-author-avatar > a {
4561
+ display: block;
4562
  }
4563
 
4564
+ .eael-entry-footer {
4565
+ overflow: hidden;
 
 
4566
  display: flex;
 
4567
  }
4568
 
4569
+ .eael-entry-footer > div {
4570
+ display: inline-block;
4571
+ float: left;
 
 
 
 
4572
  }
4573
 
4574
+ /*----------------------*/
4575
+ /* 13. Ninja Form Styles
4576
+ /*----------------------*/
4577
+ .eael-ninja-container input,
4578
+ .eael-ninja-container textarea {
4579
+ height: auto;
4580
+ padding: 10px;
4581
  }
4582
 
4583
+ .eael-contact-form-align-center .eael-ninja-container,
4584
+ .eael-contact-form-btn-align-center .eael-ninja-container .nf-field .nf-field-element input[type="button"] {
4585
+ margin-left: auto !important;
4586
+ margin-right: auto !important;
4587
+ display: block;
4588
+ float: none;
4589
  }
4590
 
4591
+ .eael-contact-form-align-left .eael-ninja-container,
4592
+ .eael-contact-form-btn-align-left .eael-ninja-container .nf-field .nf-field-element input[type="button"] {
4593
+ float: left;
4594
+ width: auto;
4595
  }
4596
 
4597
+ .eael-contact-form-align-right .eael-ninja-container,
4598
+ .eael-contact-form-btn-align-right .eael-ninja-container .nf-field .nf-field-element input[type="button"] {
4599
+ float: right;
4600
+ width: auto;
4601
  }
4602
 
4603
+ .eael-ninja-container ul.wpuf-form li .wpuf-fields input[type="text"],
4604
+ .eael-ninja-container .nf-field .nf-field-element input[type="password"],
4605
+ .eael-ninja-container ul.wpuf-form li .wpuf-fields input[type="email"],
4606
+ .eael-ninja-container .nf-field .nf-field-element input[type="url"],
4607
+ .eael-ninja-container ul.wpuf-form li .wpuf-fields input[type="number"],
4608
+ .eael-ninja-container .nf-field .nf-field-element textarea {
4609
+ max-width: 100%;
4610
  }
4611
 
4612
+ .eael-ninja-form .nf-form-title {
4613
+ display: none;
 
4614
  }
4615
 
4616
+ .eael-ninja-form-title-yes .nf-form-title {
4617
+ display: block;
 
4618
  }
4619
 
4620
+ .eael-ninja-form .title-description-hide .nf-form-title {
4621
+ display: none;
 
 
 
4622
  }
4623
 
4624
+ .eael-ninja-form.title-description-hide .nf-form-title {
4625
+ display: none;
 
4626
  }
4627
 
4628
+ .eael-ninja-form .nf-field-label {
4629
+ display: none;
 
4630
  }
4631
 
4632
+ .eael-ninja-form-labels-yes .nf-field-label {
4633
+ display: block;
4634
  }
4635
 
4636
+ .eael-ninja-form .submit-container input[type=button] {
4637
+ border: 0;
4638
+ border-radius: 0;
4639
  }
4640
 
4641
+ .eael-ninja-form-button-full-width .submit-container input[type=button] {
4642
+ width: 100%;
4643
  }
4644
 
4645
+ /* ------------------------ */
4646
+ /* 26. Magnific Popup
4647
+ /* ------------------------ */
4648
+ /*--- Magnific Popup CSS ---*/
4649
+ body div.mfp-bg {
4650
  top: 0;
4651
  left: 0;
4652
  width: 100%;
4653
  height: 100%;
4654
+ z-index: 1042;
4655
+ overflow: hidden;
4656
+ position: fixed;
4657
+ background: #0b0b0b;
4658
+ opacity: 0.8;
4659
  }
4660
 
4661
+ .mfp-wrap {
 
4662
  top: 0;
4663
  left: 0;
4664
  width: 100%;
4665
  height: 100%;
4666
+ z-index: 1043;
4667
+ position: fixed;
4668
+ outline: none !important;
4669
+ -webkit-backface-visibility: hidden;
4670
+ backface-visibility: hidden;
 
4671
  }
4672
 
4673
+ .mfp-container {
4674
+ text-align: center;
4675
+ position: absolute;
4676
  width: 100%;
 
 
 
 
 
4677
  height: 100%;
4678
+ left: 0;
4679
+ top: 0;
4680
+ padding: 0 8px;
4681
+ box-sizing: border-box;
4682
  }
4683
 
4684
+ .mfp-container:before {
4685
+ content: '';
4686
+ display: inline-block;
4687
+ height: 100%;
4688
+ vertical-align: middle;
4689
  }
4690
 
4691
+ .mfp-align-top .mfp-container:before {
4692
+ display: none;
4693
  }
4694
 
4695
+ .mfp-content {
4696
+ position: relative;
4697
+ display: inline-block;
4698
+ vertical-align: middle;
4699
+ margin: 0 auto;
4700
  text-align: left;
4701
+ z-index: 1045;
4702
  }
4703
 
4704
+ .mfp-inline-holder .mfp-content,
4705
+ .mfp-ajax-holder .mfp-content {
4706
+ width: 100%;
4707
+ cursor: auto;
 
 
 
4708
  }
4709
 
4710
+ .mfp-ajax-cur {
4711
+ cursor: progress;
 
 
4712
  }
4713
 
4714
+ .mfp-zoom-out-cur,
4715
+ .mfp-zoom-out-cur .mfp-image-holder .mfp-close {
4716
+ cursor: zoom-out;
4717
  }
4718
 
4719
+ .mfp-zoom {
4720
+ cursor: pointer;
4721
+ cursor: zoom-in;
4722
  }
4723
 
4724
+ .mfp-auto-cursor .mfp-content {
4725
+ cursor: auto;
 
4726
  }
4727
 
4728
+ .mfp-close,
4729
+ .mfp-arrow,
4730
+ .mfp-preloader,
4731
+ .mfp-counter {
4732
+ -webkit-user-select: none;
4733
+ -moz-user-select: none;
4734
+ -ms-user-select: none;
4735
+ user-select: none;
4736
  }
4737
 
4738
+ .mfp-loading.mfp-figure {
4739
+ display: none;
 
 
 
 
 
4740
  }
4741
 
4742
+ .mfp-hide {
4743
+ display: none !important;
 
4744
  }
4745
 
4746
+ .mfp-preloader {
4747
+ color: #CCC;
4748
+ position: absolute;
4749
+ top: 50%;
4750
+ width: auto;
4751
+ text-align: center;
4752
+ margin-top: -0.8em;
4753
+ left: 8px;
4754
+ right: 8px;
4755
+ z-index: 1044;
4756
  }
4757
 
4758
+ .mfp-preloader a {
4759
+ color: #CCC;
4760
  }
4761
 
4762
+ .mfp-preloader a:hover {
4763
+ color: #FFF;
 
 
 
4764
  }
4765
 
4766
+ .mfp-s-ready .mfp-preloader {
4767
+ display: none;
 
4768
  }
4769
 
4770
+ .mfp-s-error .mfp-content {
4771
+ display: none;
 
4772
  }
4773
 
4774
+ button.mfp-close,
4775
+ button.mfp-arrow {
4776
+ overflow: visible;
4777
+ cursor: pointer;
4778
+ background: transparent;
4779
+ border: 0;
4780
+ -webkit-appearance: none;
4781
+ display: block;
4782
+ outline: none;
4783
+ padding: 0;
4784
+ z-index: 1046;
4785
+ box-shadow: none;
4786
+ touch-action: manipulation;
4787
  }
4788
 
4789
+ button::-moz-focus-inner {
4790
+ padding: 0;
4791
+ border: 0;
 
4792
  }
4793
 
4794
+ .mfp-close {
4795
+ width: 44px;
4796
+ height: 44px;
4797
+ line-height: 44px;
4798
+ position: absolute;
4799
+ right: 0;
4800
+ top: 0;
4801
+ text-decoration: none;
4802
+ text-align: center;
4803
+ opacity: 0.65;
4804
+ padding: 0 0 18px 10px;
4805
+ color: #FFF;
4806
+ font-style: normal;
4807
+ font-size: 28px;
4808
+ font-family: Arial, Baskerville, monospace;
4809
  }
4810
 
4811
+ .mfp-close:hover,
4812
+ .mfp-close:focus {
 
4813
  opacity: 1;
4814
  }
4815
 
4816
+ .mfp-close:active {
4817
+ top: 1px;
4818
  }
4819
 
4820
+ .mfp-close-btn-in .mfp-close {
4821
+ color: #333;
 
4822
  }
4823
 
4824
+ .mfp-image-holder .mfp-close,
4825
+ .mfp-iframe-holder .mfp-close {
4826
+ color: #FFF;
4827
+ right: -6px;
4828
+ text-align: right;
4829
+ padding-right: 6px;
4830
+ width: 100%;
4831
  }
4832
 
4833
+ .mfp-counter {
4834
+ position: absolute;
4835
+ top: 0;
4836
+ right: 0;
4837
+ color: #CCC;
4838
+ font-size: 12px;
4839
+ line-height: 18px;
4840
+ white-space: nowrap;
4841
  }
4842
 
4843
+ .mfp-arrow {
4844
+ position: absolute;
4845
+ opacity: 0.65;
4846
+ margin: 0;
4847
+ top: 50%;
4848
+ margin-top: -55px;
4849
+ padding: 0;
4850
+ width: 90px;
4851
+ height: 110px;
4852
+ -webkit-tap-highlight-color: transparent;
4853
  }
4854
 
4855
+ .mfp-arrow:active {
4856
+ margin-top: -54px;
 
4857
  }
4858
 
4859
+ .mfp-arrow:hover,
4860
+ .mfp-arrow:focus {
4861
+ opacity: 1;
4862
  }
4863
 
4864
+ .mfp-arrow:before,
4865
+ .mfp-arrow:after {
4866
+ content: '';
4867
+ display: block;
4868
+ width: 0;
4869
+ height: 0;
4870
+ position: absolute;
4871
+ left: 0;
4872
+ top: 0;
4873
+ margin-top: 35px;
4874
+ margin-left: 35px;
4875
+ border: medium inset transparent;
4876
  }
4877
 
4878
+ .mfp-arrow:after {
4879
+ border-top-width: 13px;
4880
+ border-bottom-width: 13px;
4881
+ top: 8px;
4882
  }
4883
 
4884
+ .mfp-arrow:before {
4885
+ border-top-width: 21px;
4886
+ border-bottom-width: 21px;
4887
+ opacity: 0.7;
4888
  }
4889
 
4890
+ .mfp-arrow-left {
4891
+ left: 0;
 
 
4892
  }
4893
 
4894
+ .mfp-arrow-left:after {
4895
+ border-right: 17px solid #FFF;
4896
+ margin-left: 31px;
 
4897
  }
4898
 
4899
+ .mfp-arrow-left:before {
4900
+ margin-left: 25px;
4901
+ border-right: 27px solid #3F3F3F;
 
4902
  }
4903
 
4904
+ .mfp-arrow-right {
4905
+ right: 0;
4906
  }
4907
 
4908
+ .mfp-arrow-right:after {
4909
+ border-left: 17px solid #FFF;
4910
+ margin-left: 39px;
 
4911
  }
4912
 
4913
+ .mfp-arrow-right:before {
4914
+ border-left: 27px solid #3F3F3F;
 
4915
  }
4916
 
4917
+ .mfp-iframe-holder {
4918
+ padding-top: 40px;
4919
+ padding-bottom: 40px;
4920
  }
4921
 
4922
+ .mfp-iframe-holder .mfp-content {
4923
+ line-height: 0;
4924
+ width: 100%;
4925
+ max-width: 900px;
4926
  }
4927
 
4928
+ .mfp-iframe-holder .mfp-close {
4929
+ top: -40px;
 
4930
  }
4931
 
4932
+ .mfp-iframe-scaler {
4933
+ width: 100%;
4934
+ height: 0;
4935
+ overflow: hidden;
4936
+ padding-top: 56.25%;
4937
  }
4938
 
4939
+ .mfp-iframe-scaler iframe {
4940
+ position: absolute;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4941
  display: block;
4942
+ top: 0;
4943
+ left: 0;
4944
+ width: 100%;
4945
+ height: 100%;
4946
+ box-shadow: 0 0 8px rgba(0, 0, 0, 0.6);
4947
+ background: #000;
4948
  }
4949
 
4950
+ /*--- Main image in popup ---*/
4951
+ img.mfp-img {
4952
+ width: auto;
4953
+ max-width: 100%;
4954
+ height: auto;
4955
+ display: block;
4956
+ line-height: 0;
4957
+ box-sizing: border-box;
4958
+ padding: 40px 0 40px;
4959
+ margin: 0 auto;
4960
  }
4961
 
4962
+ /*--- The shadow behind the image ---*/
4963
+ .mfp-figure {
4964
+ line-height: 0;
4965
  }
4966
 
4967
+ .mfp-figure:after {
4968
+ content: '';
4969
+ position: absolute;
4970
+ left: 0;
4971
+ top: 40px;
4972
+ bottom: 40px;
4973
+ display: block;
4974
+ right: 0;
4975
+ width: auto;
4976
  height: auto;
4977
+ z-index: -1;
4978
+ box-shadow: 0 0 8px rgba(0, 0, 0, 0.6);
4979
+ background: #444;
4980
  }
4981
 
4982
+ .mfp-figure small {
4983
+ color: #BDBDBD;
 
 
4984
  display: block;
4985
+ font-size: 12px;
4986
+ line-height: 14px;
4987
  }
4988
 
4989
+ .mfp-figure figure {
4990
+ margin: 0;
 
 
4991
  }
4992
 
4993
+ .mfp-bottom-bar {
4994
+ margin-top: -36px;
4995
+ position: absolute;
4996
+ top: 100%;
4997
+ left: 0;
4998
+ width: 100%;
4999
+ cursor: auto;
5000
  }
5001
 
5002
+ .mfp-title {
5003
+ text-align: left;
5004
+ line-height: 18px;
5005
+ color: #F3F3F3;
5006
+ word-wrap: break-word;
5007
+ padding-right: 36px;
 
5008
  }
5009
 
5010
+ .mfp-image-holder .mfp-content {
5011
+ max-width: 100%;
5012
  }
5013
 
5014
+ .mfp-gallery .mfp-image-holder .mfp-figure {
5015
+ cursor: pointer;
5016
  }
5017
 
5018
+ button.mfp-close,
5019
+ button.mfp-close:hover {
5020
+ display: inline-block !important;
5021
+ background: transparent;
5022
+ width: auto !important;
5023
  }
5024
 
5025
+ .mfp-arrow,
5026
+ .mfp-arrow:hover {
5027
+ background: transparent;
5028
  }
5029
 
5030
+ @media screen and (max-width: 800px) and (orientation: landscape), screen and (max-height: 300px) {
5031
+ /**
5032
+ * Remove all paddings around the image on small screen
5033
+ */
5034
+ .mfp-img-mobile .mfp-image-holder {
5035
+ padding-left: 0;
5036
+ padding-right: 0;
5037
+ }
5038
 
5039
+ .mfp-img-mobile img.mfp-img {
5040
+ padding: 0;
5041
+ }
5042
 
5043
+ .mfp-img-mobile .mfp-figure:after {
5044
+ top: 0;
5045
+ bottom: 0;
5046
+ }
5047
+
5048
+ .mfp-img-mobile .mfp-figure small {
5049
+ display: inline;
5050
+ margin-left: 5px;
5051
+ }
5052
+
5053
+ .mfp-img-mobile .mfp-bottom-bar {
5054
+ background: rgba(0, 0, 0, 0.6);
5055
+ bottom: 0;
5056
+ margin: 0;
5057
+ top: auto;
5058
+ padding: 3px 5px;
5059
+ position: fixed;
5060
+ box-sizing: border-box;
5061
+ }
5062
+
5063
+ .mfp-img-mobile .mfp-bottom-bar:empty {
5064
+ padding: 0;
5065
+ }
5066
+
5067
+ .mfp-img-mobile .mfp-counter {
5068
+ right: 5px;
5069
+ top: 3px;
5070
+ }
5071
+
5072
+ .mfp-img-mobile .mfp-close {
5073
+ top: 0;
5074
+ right: 0;
5075
+ width: 35px;
5076
+ height: 35px;
5077
+ line-height: 35px;
5078
+ background: rgba(0, 0, 0, 0.6);
5079
+ position: fixed;
5080
+ text-align: center;
5081
+ padding: 0;
5082
+ }
5083
  }
5084
+ @media all and (max-width: 900px) {
5085
+ .mfp-arrow {
5086
+ transform: scale(0.75);
5087
+ }
5088
 
5089
+ .mfp-arrow-left {
5090
+ transform-origin: 0;
5091
+ }
5092
+
5093
+ .mfp-arrow-right {
5094
+ transform-origin: 100%;
5095
+ }
5096
+
5097
+ .mfp-container {
5098
+ padding-left: 6px;
5099
+ padding-right: 6px;
5100
+ }
5101
  }
5102
 
5103
  /*----------------------------*/
6069
  margin: 0;
6070
  padding: 0;
6071
  }
6072
+ .eael-product-grid .woocommerce ul.products.products[class*=columns-] li.product,
6073
+ .eael-post-grid .woocommerce ul.products.products[class*=columns-] li.product {
6074
+ width: 100%;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6075
  }
6076
  .eael-product-grid.eael-product-simple .woocommerce ul.products li.product, .eael-product-grid.eael-product-reveal .woocommerce ul.products li.product,
6077
  .eael-post-grid.eael-product-simple .woocommerce ul.products li.product,
6420
  transform: translateY(0);
6421
  }
6422
 
6423
+ @media only screen and (min-width: 1025px) {
6424
+ .eael-product-grid-column-1 .eael-product-grid .woocommerce ul.products {
6425
+ grid-template-columns: 100%;
6426
+ }
6427
+
6428
+ .eael-product-grid-column-2 .eael-product-grid .woocommerce ul.products {
6429
+ grid-template-columns: repeat(2, 1fr);
6430
+ }
6431
+
6432
+ .eael-product-grid-column-3 .eael-product-grid .woocommerce ul.products {
6433
+ grid-template-columns: repeat(3, 1fr);
6434
+ }
6435
+
6436
+ .eael-product-grid-column-4 .eael-product-grid .woocommerce ul.products {
6437
+ grid-template-columns: repeat(4, 1fr);
6438
+ }
6439
+
6440
+ .eael-product-grid-column-5 .eael-product-grid .woocommerce ul.products {
6441
+ grid-template-columns: repeat(5, 1fr);
6442
+ }
6443
+
6444
+ .eael-product-grid-column-6 .eael-product-grid .woocommerce ul.products {
6445
+ grid-template-columns: repeat(6, 1fr);
6446
+ }
6447
+ }
6448
+ @media only screen and (max-width: 1024px) and (min-width: 766px) {
6449
+ .eael-product-grid-column-tablet-1 .eael-product-grid .woocommerce ul.products {
6450
+ grid-template-columns: 100%;
6451
+ }
6452
+
6453
+ .eael-product-grid-column-tablet-2 .eael-product-grid .woocommerce ul.products {
6454
+ grid-template-columns: repeat(2, 1fr);
6455
+ }
6456
+
6457
+ .eael-product-grid-column-tablet-3 .eael-product-grid .woocommerce ul.products {
6458
+ grid-template-columns: repeat(3, 1fr);
6459
+ }
6460
+
6461
+ .eael-product-grid-column-tablet-4 .eael-product-grid .woocommerce ul.products {
6462
+ grid-template-columns: repeat(4, 1fr);
6463
+ }
6464
+
6465
+ .eael-product-grid-column-tablet-5 .eael-product-grid .woocommerce ul.products {
6466
+ grid-template-columns: repeat(5, 1fr);
6467
+ }
6468
+
6469
+ .eael-product-grid-column-tablet-6 .eael-product-grid .woocommerce ul.products {
6470
+ grid-template-columns: repeat(6, 1fr);
6471
+ }
6472
+ }
6473
+ @media only screen and (max-width: 767px) {
6474
+ .eael-product-grid-column-mobile-1 .eael-product-grid .woocommerce ul.products {
6475
+ grid-template-columns: 100%;
6476
+ }
6477
+
6478
+ .eael-product-grid-column-mobile-2 .eael-product-grid .woocommerce ul.products {
6479
+ grid-template-columns: repeat(2, 1fr);
6480
+ }
6481
+
6482
+ .eael-product-grid-column-mobile-3 .eael-product-grid .woocommerce ul.products {
6483
+ grid-template-columns: repeat(3, 1fr);
6484
+ }
6485
+
6486
+ .eael-product-grid-column-mobile-4 .eael-product-grid .woocommerce ul.products {
6487
+ grid-template-columns: repeat(4, 1fr);
6488
+ }
6489
+
6490
+ .eael-product-grid-column-mobile-5 .eael-product-grid .woocommerce ul.products {
6491
+ grid-template-columns: repeat(5, 1fr);
6492
+ }
6493
+
6494
+ .eael-product-grid-column-mobile-6 .eael-product-grid .woocommerce ul.products {
6495
+ grid-template-columns: repeat(6, 1fr);
6496
+ }
6497
+ }
6498
+
6499
  @-webkit-keyframes animateStripe {
6500
  0% {
6501
  transform: translate(0, 0);
7692
  top: 100%;
7693
  }
7694
  }
7695
+ span.eael-tooltip-content,
7696
+ span.eael-tooltip-content a {
7697
+ width: 100%;
7698
+ display: block;
7699
+ text-align: center;
7700
+ }
7701
+
7702
+ .eael-tooltip-text-align-left .eael-tooltip-text, .eael-tooltip-text-align-left .eael-tooltip-content a {
7703
  text-align: left;
7704
  }
7705
 
7706
+ .eael-tooltip-text-align-right .eael-tooltip-text, .eael-tooltip-text-align-right .eael-tooltip-content a {
7707
  text-align: right;
7708
  }
7709
 
7710
+ .eael-tooltip-text-align-center .eael-tooltip-text, .eael-tooltip-text-align-center .eael-tooltip-content a {
7711
  text-align: center;
7712
  }
7713
 
7714
+ .eael-tooltip-text-align-justify .eael-tooltip-text, .eael-tooltip-text-align-justify .eael-tooltip-content a {
7715
  text-align: justify;
7716
  }
7717
 
assets/front-end/css/eael.min.css CHANGED
@@ -4,37 +4,37 @@
4
  .eael-caldera-form-align-left,.eael-caldera-form-btn-align-left{text-align:left}.eael-caldera-form-align-right,.eael-caldera-form-btn-align-right{text-align:right}.eael-caldera-form-align-center,.eael-caldera-form-btn-align-center{text-align:center}.eael-caldera-form .control-label{display:none}.eael-caldera-form-labels-yes .control-label{display:block}.eael-caldera-form-button-center .form-group input[type=button],.eael-caldera-form-button-center .form-group input[type=submit]{display:block;margin:0 auto}.eael-caldera-form-button-right .form-group input[type=button],.eael-caldera-form-button-right .form-group input[type=submit]{float:right}.eael-caldera-form .intl-tel-input{display:inherit}.eael-custom-radio-checkbox .caldera-grid input[type=checkbox],.eael-custom-radio-checkbox .caldera-grid input[type=radio]{border-style:solid;border-width:0;padding:3px;-webkit-appearance:none}.eael-caldera-form-button-full-width .form-group input[type=button],.eael-caldera-form-button-full-width .form-group input[type=submit]{width:100%}
5
  .eael-call-to-action{width:100%;height:auto;display:block;padding:30px;font-size:16px;color:#4d4d4d;font-weight:400;line-height:27px;margin:0 auto}.eael-call-to-action p{margin-bottom:10px}.eael-call-to-action .title{font-size:36px;font-weight:600;line-height:36px;margin-bottom:10px;text-transform:capitalize;font-style:normal}.eael-call-to-action.cta-center{text-align:center}.eael-call-to-action.cta-right{text-align:right}.eael-call-to-action.cta-left{text-align:left}.eael-call-to-action.bg-lite{background:#f4f4f4}.eael-call-to-action.bg-img{background-image:url(../img/bg.jpg);background-repeat:no-repeat;background-position:center;background-size:cover;position:relative;z-index:0;color:rgba(255,255,255,.7)}.eael-call-to-action.bg-img .icon{color:#fff}.eael-call-to-action.bg-img:after{content:"";position:absolute;width:100%;height:100%;top:0;left:0;z-index:-1;background:rgba(0,0,0,.8)}.eael-call-to-action.bg-img.bg-fixed{background-attachment:fixed;background-position:center center}.eael-call-to-action.bg-img .title{color:rgba(255,255,255,.9)}.eael-call-to-action.cta-flex,.eael-call-to-action.cta-icon-flex{display:flex;justify-content:space-between;align-items:flex-start}.eael-call-to-action.cta-icon-flex .icon{flex-grow:1;font-size:80px;text-align:left;line-height:130px}.eael-call-to-action.cta-icon-flex .action{flex-grow:1;text-align:right;padding-top:22px;flex-basis:22%}.eael-call-to-action.cta-icon-flex .content{flex-grow:1;padding:0 30px}.eael-call-to-action.cta-flex .content{padding:0 15px;flex-grow:1}.eael-call-to-action.cta-flex .action{flex-grow:1;text-align:right;padding-top:25px;flex-basis:23%}.eael-call-to-action .cta-button{position:relative;display:inline-block;padding:12px 30px;background:#f9f9f9;font-size:16px;text-decoration:none;color:#4d4d4d;transition:.5s;-ms-box-shadow:0 0 3px -1px rgba(0,0,0,.2);box-shadow:0 0 3px -1px rgba(0,0,0,.2);margin-right:10px;margin-top:10px;z-index:0;overflow:hidden}.eael-call-to-action .cta-button:last-child{margin-right:0}.eael-call-to-action .cta-button:focus{outline:0}.eael-call-to-action .cta-button:hover{color:#fff;background:#3f51b5;-ms-box-shadow:0 1px 12px 1px rgba(0,0,0,.1);box-shadow:0 1px 12px 1px rgba(0,0,0,.1)}.eael-call-to-action .cta-button.effect-1:after{content:"";position:absolute;width:100%;height:100%;background:#3f51b5;top:0;left:0;transform:translateY(-100%);-webkit-transform:translateY(-100%);-ms-transform:translateY(-100%);z-index:-1;transition:.5s;color:#fff}.eael-call-to-action .cta-button.effect-1:hover::after{transform:translateY(0)}.eael-call-to-action .cta-button.effect-2:after{content:"";position:absolute;width:100%;height:100%;background:#3f51b5;top:0;left:0;z-index:-1;transition:.5s;color:#fff;transform:translateX(-100%)}.eael-call-to-action .cta-button.effect-2:hover::after{transform:translateX(0)}@media only screen and (max-width:768px){.eael-call-to-action.cta-flex,.eael-call-to-action.cta-icon-flex{flex-wrap:wrap}.eael-call-to-action .title{font-size:28px;line-height:36px;margin-top:0}.eael-call-to-action.cta-icon-flex .icon{flex-grow:1;font-size:48px;line-height:90px;text-align:center}.eael-call-to-action.cta-flex .content,.eael-call-to-action.cta-icon-flex .content{flex-grow:1;text-align:center;padding:0}.eael-call-to-action.cta-flex .action,.eael-call-to-action.cta-icon-flex .action{text-align:center;padding-top:0}.eael-call-to-action .cta-button{padding:12px 25px}}@media only screen and (max-width:360px){.eael-call-to-action{font-size:14px;line-height:26px}.eael-call-to-action .cta-button{padding:4px 20px;font-size:12px}.eael-call-to-action .title{font-size:20px;line-height:30px}}
6
  @-webkit-keyframes loaderSpin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}@keyframes loaderSpin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}.eael-load-more-button-wrap{display:flex}.eael-load-more-button{display:flex;align-items:center;justify-content:center;padding:1em 2em;border:0 solid;font-size:16px;overflow:hidden}.eael-load-more-button .button__loader{left:-100%;top:auto;margin-right:5px;transition:all .2s}.eael-load-more-button>span{margin-left:-20px}.eael-load-more-button.button--loading>span{margin-left:0}.eael-load-more-button.button--loading .button__loader{left:0}.eael-btn-loader{border-radius:50%;width:20px;height:20px;font-size:10px;position:relative;text-indent:-9999em;border-top:4px solid rgba(255,255,255,.2);border-right:4px solid rgba(255,255,255,.2);border-bottom:4px solid rgba(255,255,255,.2);border-left:4px solid #fff;transform:translateZ(0);-webkit-animation:loaderSpin 1.1s infinite linear;animation:loaderSpin 1.1s infinite linear}.eael-btn-loader:after{border-radius:50%;width:20px;height:20px}
7
- .eael-contact-form-7.eael-contact-form-btn-align-center input.wpcf7-submit{margin-left:auto!important;margin-right:auto!important;display:block;float:none}.eael-contact-form-7.eael-contact-form-btn-align-left input.wpcf7-submit{float:left;width:auto}.eael-contact-form-7.eael-contact-form-btn-align-right input.wpcf7-submit{float:right;width:auto}.eael-contact-form-7 .uneditable-input,.eael-contact-form-7 input[type=color],.eael-contact-form-7 input[type=date],.eael-contact-form-7 input[type=datetime-local],.eael-contact-form-7 input[type=datetime],.eael-contact-form-7 input[type=email],.eael-contact-form-7 input[type=month],.eael-contact-form-7 input[type=number],.eael-contact-form-7 input[type=password],.eael-contact-form-7 input[type=search],.eael-contact-form-7 input[type=tel],.eael-contact-form-7 input[type=text],.eael-contact-form-7 input[type=time],.eael-contact-form-7 input[type=url],.eael-contact-form-7 input[type=week],.eael-contact-form-7 textarea{transition:border linear .2s,box-shadow linear .2s}.eael-contact-form-7 .wpcf7-form::after,.eael-contact-form-7 .wpcf7-form::before{content:" ";clear:both;display:table}.eael-contact-form-7 .wpcf7-form:after{clear:both;content:"";font-size:0;height:0;display:block;visibility:hidden}.eael-contact-form-7 .wpcf7-form .wpcf7-form-control-wrap,.eael-contact-form-7 .wpcf7-form label{display:block}.eael-contact-form-7 .wpcf7-form p{margin-bottom:0}.eael-contact-form-7.labels-hide .wpcf7-form label{display:none}.eael-contact-form-7-title{margin-bottom:10px}.eael-contact-form-7-description{margin-bottom:20px}.eael-contact-form-7-button-full-width .wpcf7-form-control.wpcf7-submit{width:100%}
8
  .eael-ticker-wrap{overflow:hidden;display:flex;flex-flow:row nowrap;align-items:center;width:100%}.eael-ticker-wrap .ticker-badge{flex:0 0 auto;padding:8px 12px}.eael-ticker-wrap .eael-ticker{overflow:hidden;flex:1 1 auto}.eael-ticker-wrap .eael-ticker .ticker-content{padding:8px 12px;line-height:1.8}.eael-ticker-wrap .eael-ticker .ticker-content p{margin:0}.eael-ticker-wrap .swiper-button-prev{left:auto!important;right:25px}.eael-ticker-wrap div.swiper-slide,.eael-ticker-wrap div.swiper-slide.swiper-slide-next,.eael-ticker-wrap div.swiper-slide.swiper-slide-prev{opacity:0!important}.eael-ticker-wrap div.swiper-slide.swiper-slide-active{opacity:1!important}.eael-ticker-wrap .eael-content-ticker.swiper-container .swiper-slide{text-align:left}@media only screen and (max-width:767px){.eael-ticker-wrap{flex-flow:row wrap}.content-ticker-pagination{display:none}}.eael-ticker-wrap .swiper-button-next,.eael-ticker-wrap .swiper-button-prev{background-image:none;outline:0;display:flex;align-items:center;justify-content:center}
9
- .eael-creative-button-align-center{text-align:center}.eael-creative-button-wrapper{display:flex}.eael-creative-button{flex:0 0 auto;min-width:150px;text-align:center;vertical-align:middle;position:relative;z-index:1;border-radius:2px;padding:20px 30px;font-size:16px;line-height:1;-webkit-backface-visibility:hidden;backface-visibility:hidden;-moz-osx-font-smoothing:grayscale}.eael-creative-button:focus{outline:0}.eael-creative-button--winona{overflow:hidden;padding:0!important;transition:border-color .3s,background-color .3s;transition-timing-function:cubic-bezier(.2,1,.3,1)}.eael-creative-button--winona::after{content:attr(data-text);position:absolute;width:100%;height:100%;top:0;left:0;opacity:0;transform:translate3d(0,25%,0);display:flex;align-items:center;justify-content:center}.eael-creative-button--winona::after,.eael-creative-button--winona>.creative-button-inner{padding:1em 2em;transition:transform .3s,opacity .3s;transition-timing-function:cubic-bezier(.2,1,.3,1)}.eael-creative-button--winona:hover::after{opacity:1;transform:translate3d(0,0,0)}.eael-creative-button--winona:hover>.creative-button-inner{opacity:0;transform:translate3d(0,0,0)}.eael-creative-button--ujarak{transition:border-color .4s,color .4s}.eael-creative-button--ujarak::before{content:'';position:absolute;top:0;left:0;width:100%;height:100%;z-index:-1;opacity:0;transform:scale3d(.7,1,1);transition:transform .4s,opacity .4s;transition-timing-function:cubic-bezier(.2,1,.3,1)}.eael-creative-button--ujarak,.eael-creative-button--ujarak::before{transition-timing-function:cubic-bezier(.2,1,.3,1)}.eael-creative-button--ujarak:hover::before{opacity:1;transform:translate3d(0,0,0)}.eael-creative-button--wayra{overflow:hidden;transition:border-color .3s,color .3s;transition-timing-function:cubic-bezier(.2,1,.3,1)}.eael-creative-button--wayra::before{content:'';position:absolute;top:0;left:0;width:150%;height:100%;z-index:-1;transform:rotate3d(0,0,1,-45deg) translate3d(0,-3em,0);transform-origin:0 100%;transition:transform .3s,opacity .3s,background-color .3s}.eael-creative-button--wayra:hover::before{opacity:1;transform:rotate3d(0,0,1,0deg);transition-timing-function:cubic-bezier(.2,1,.3,1)}.eael-creative-button--tamaya{float:left;min-width:150px;max-width:250px;display:block;margin:1em;padding:1em 2em;border:none;background:0 0;color:inherit;vertical-align:middle;position:relative;z-index:1;-webkit-backface-visibility:hidden;-moz-osx-font-smoothing:grayscale;overflow:hidden;color:#7986cb;min-width:180px}.eael-creative-button--tamaya.button--inverted{color:#37474f;border-color:#37474f}.eael-creative-button--tamaya::after,.eael-creative-button--tamaya::before{content:attr(data-text);position:absolute;width:100%;height:50%;left:0;background:#7986cb;color:#fff;overflow:hidden;transition:transform .3s;transition-timing-function:cubic-bezier(.2,1,.3,1)}.eael-creative-button--tamaya.button--inverted::after,.eael-creative-button--tamaya.button--inverted::before{background:#fff;color:#37474f}.eael-creative-button--tamaya::before{top:0;padding-top:1em}.eael-creative-button--tamaya::after{bottom:0;line-height:0}.eael-creative-button--tamaya span{display:block;transform:scale3d(.2,.2,1);opacity:0;transition:transform .3s,opacity .3s;transition-timing-function:cubic-bezier(.2,1,.3,1)}.eael-creative-button--tamaya:hover::before{transform:translate3d(0,-100%,0)}.eael-creative-button--tamaya:hover::after{transform:translate3d(0,100%,0)}.eael-creative-button--tamaya:hover span{opacity:1;transform:scale3d(1,1,1);content:'Bangladesh'}.eael-creative-button--rayen{overflow:hidden;padding:0!important}.eael-creative-button--rayen::before{content:attr(data-text);position:absolute;top:0;left:0;width:100%;height:100%;transform:translate3d(-100%,0,0);display:flex;align-items:center;justify-content:center}.eael-creative-button--rayen::before,.eael-creative-button--rayen>.creative-button-inner{padding:1em 2em;transition:transform .3s;transition-timing-function:cubic-bezier(.75,0,.125,1)}.eael-creative-button--rayen:hover::before{transform:translate3d(0,0,0)}.eael-creative-button--rayen:hover>.creative-button-inner{transform:translate3d(0,100%,0)}.creative-button-inner{display:flex;flex-direction:row;align-items:center;justify-content:center}.eael-creative-button-icon-left{margin-right:5px}.eael-creative-button-icon-right{margin-left:5px}
10
  .eael-countdown-items{list-style:none;margin:0;padding:0;display:table;table-layout:fixed;width:100%}.eael-countdown-items>li{list-style:none;margin:0;padding:0;display:table-cell;position:relative}.eael-countdown-item>div{text-align:center;padding:20px}.eael-countdown-label-block .eael-countdown-digits,.eael-countdown-label-block .eael-countdown-label{display:block;text-align:center}.eael-countdown-digits{font-size:54px;line-height:1}.eael-countdown-label{font-size:18px;line-height:1;color:#fff}.eael-countdown-show-separator .eael-countdown-digits::after{content:":";position:absolute;left:98%;z-index:9999}.eael-countdown-item:last-child .eael-countdown-digits::after{display:none}.eael-countdown-items.style-1 .eael-countdown-item>div{background:#262625}
 
 
11
  .eael-dual-header{display:block;margin-bottom:50px}.eael-dual-header .title,.eael-dual-header .title span{font-size:36px;font-weight:700;text-transform:uppercase;line-height:48px;margin:10px 0}.eael-dual-header .subtext{font-size:16px;display:block}.eael-dual-header i{display:block;padding:0;margin:20px 0 10px 0;font-size:36px}.eael-dual-header .title span.lead{color:#1abc9c}.eael-dual-header-content-align-center{text-align:center}.eael-dual-header-content-align-left{text-align:left}.eael-dual-header-content-align-right{text-align:right}
12
  .elementor-panel .pro-feature,.elementor-panel .pro-feature a{color:#a4afb7;text-transform:uppercase;letter-spacing:1px;line-height:1.8;font-style:normal}.elementor-panel .pro-feature a{text-decoration:underline;color:#f54!important}.elementor-control-data_table_content_colspan_pro_alert .elementor-control-title,.elementor-control-data_table_content_rowspan_pro_alert .elementor-control-title,.elementor-control-data_table_content_template_pro_alert .elementor-control-title,.elementor-control-data_table_header_colspan_pro_alert .elementor-control-title,.elementor-control-data_table_header_img_pro_alert .elementor-control-title,.elementor-panel .elementor-control-eael_section_pro .elementor-panel-heading-title.elementor-panel-heading-title,.elementor-panel .elementor-control-eael_section_pro .elementor-panel-heading-toggle{color:#f54}.elementor-panel .elementor-control-eael_control_get_pro .elementor-control-field{display:none!important}.elementor-control-eael_fancy_text_style_pro_alert .elementor-control-title,.elementor-control-eael_img_accordion_type_pro_alert .elementor-control-title,.elementor-control-eael_pricing_table_style_pro_alert .elementor-control-title,.elementor-control-eael_section_countdown_style_pro_alert .elementor-control-title,.elementor-control-eael_section_data_table_enabled_pro_alert .elementor-control-title,.elementor-control-eael_team_members_preset_pro_alert .elementor-control-title,.elementor-control-eael_ticker_type_pro_alert .elementor-control-title{color:#f54}
13
- table.eael-data-table thead .sorting,table.eael-data-table thead .sorting_asc,table.eael-data-table thead .sorting_desc{position:relative;z-index:0;outline:0;cursor:pointer}table.eael-data-table thead .sorting:after,table.eael-data-table thead .sorting_asc:after,table.eael-data-table thead .sorting_desc:after{position:absolute;top:50%;right:10px;font-family:FontAwesome;color:#fff;z-index:1;transform:translateY(-50%)}.eael-data-table-wrap .eael-data-tables_wrapper{display:flex;flex-flow:row wrap;justify-content:flex-start;width:100%}.eael-data-table-wrap .eael-data-tables_filter{flex-grow:1;flex-basis:50%;text-align:right}.eael-data-table-wrap .eael-data-tables_filter label{font-weight:700}.eael-data-table-wrap .eael-data-tables_filter label input[type=search]{height:40px;border:1px solid rgba(0,0,0,.09);outline:0;padding:10px;margin-left:10px}.eael-data-table-wrap .eael-data-tables_length{flex-grow:1;flex-basis:50%}.eael-data-table-wrap .eael-data-tables_length select{width:auto;max-width:120px;height:40px;border:1px solid rgba(0,0,0,.09);outline:0;margin-left:10px;margin-right:10px}.eael-data-table-wrap .eael-data-tables_length label{font-weight:700}.eael-data-table-wrap .eael-data-tables_info{flex-grow:1;flex-basis:50%;font-weight:700}.eael-data-table-wrap .eael-data-tables_paginate{flex-grow:1;flex-basis:50%;text-align:right}.eael-data-table-wrap .eael-data-tables_paginate .paginate_button{padding:10px 15px;background:#f2f2f2;margin-right:2px;cursor:pointer;transition:all .3s}.eael-data-table-wrap .eael-data-tables_paginate .paginate_button:hover{color:#fff;background:#4a4893}.eael-data-table-wrap .eael-data-tables_paginate .paginate_button.current{color:#fff;background:#4a4893}.eael-data-table-wrap .eael-data-tables_paginate .paginate_button.disabled{cursor:no-drop;background:#f2f2f2;opacity:.5;color:#888}.data-header-icon{margin-right:10px;position:relative;top:2px}.eael-data-table{width:100%;height:auto;margin:0;border-collapse:collapse;border:none}.eael-data-table tr{border-style:none}.eael-data-table thead tr{text-align:left}.eael-data-table thead tr th{padding:20px 15px;background:#4a4893;font-size:16px;font-weight:600;font-family:Montserrat,sans-serif;line-height:1;color:#fff;border-color:#000;border-width:2px;border-style:none;background-clip:padding-box}.eael-data-table thead tr th:hover{border-color:#000}.eael-data-table tbody tr.even{transition:background .4s ease-in-out}.eael-data-table tbody tr.even:hover{background:rgba(242,242,242,.7)}.eael-data-table tbody tr.even:last-child{border-bottom:1px solid rgba(0,0,0,.09)}.eael-data-table tbody tr.odd{background:rgba(242,242,242,.5);transition:background .2s ease-in-out}.eael-data-table tbody tr.odd:hover{background:rgba(242,242,242,.7)}.eael-data-table tbody tr.odd:last-child{border-bottom:1px solid rgba(0,0,0,.09)}.eael-data-table tbody tr td{padding:20px 15px;font-size:14px;font-family:Montserrat,sans-serif;line-height:1;border-width:2px;border-style:none;background-clip:padding-box}.eael-data-table-th-img{display:inline-block;margin:0 15px 0 0;line-height:1}.th-mobile-screen{display:none}@media (max-width:767px){.eael-data-table-wrap{overflow-x:scroll!important;padding-bottom:5px}.th-mobile-screen{display:inline-block;padding:0 .6em;margin-right:10px;text-align:center;flex-grow:0;flex-shrink:0;flex-basis:100px}.th-mobile-screen .eael-data-table-th-img{margin:0 auto 15px auto;display:block}.th-mobile-screen .data-header-icon{margin:0 auto 15px auto;display:block}.td-content-wrapper{display:flex;width:100%}.td-content{width:100%;justify-content:center}.td-content>p{width:100%;justify-content:center}.custom-responsive-option-enable .eael-data-table thead{display:none}.custom-responsive-option-enable .eael-data-table tbody tr td{float:none;clear:left;width:100%;text-align:left;display:flex;align-items:center}.eael-data-table .td-content{align-items:center;display:flex}}table.eael-data-table thead .sorting:after{content:"\f0dc"}table.eael-data-table thead .headerSortDown:after{content:"\f0dd"}table.eael-data-table thead .headerSortUp:after{content:"\f0de"}table.eael-data-table thead .sorting_disabled.sorting:after{display:none}table.eael-data-table .sorting.sorting-none:after{display:none}table.eael-data-table .sorting_desc.sorting-none:after{display:none}table.eael-data-table .sorting_asc.sorting-none:after{display:none}.eael-table-align-left table.eael-data-table{float:left}.eael-table-align-center table.eael-data-table{margin:0 auto}.eael-table-align-right table.eael-data-table{float:right}.eael-hide-elements .eael-data-tables_info{display:none}.eael-dt-th-align-left .eael-data-table thead tr th{text-align:left}.eael-dt-td-align-left .eael-data-table tbody tr td{text-align:left}.eael-dt-th-align-right .eael-data-table thead tr th{text-align:right;padding-right:30px}.eael-dt-td-align-right .eael-data-table tbody tr td{text-align:right;padding-right:30px}.eael-dt-th-align-center .eael-data-table thead tr th{text-align:center}.eael-dt-td-align-center .eael-data-table tbody tr td{text-align:center}
14
  .eael-facebook-feed{width:100%;margin:auto}.eael-facebook-feed.eael-col-1 .eael-facebook-feed-item{float:none;width:100%}@media only screen and (max-width:979px){.eael-facebook-feed.eael-col-1 .eael-facebook-feed-item{width:50%}}@media only screen and (max-width:480px){.eael-facebook-feed.eael-col-1 .eael-facebook-feed-item{width:100%}}.eael-facebook-feed.eael-col-2 .eael-facebook-feed-item{float:left;width:50%}@media only screen and (max-width:979px){.eael-facebook-feed.eael-col-2 .eael-facebook-feed-item{width:50%}}@media only screen and (max-width:480px){.eael-facebook-feed.eael-col-2 .eael-facebook-feed-item{width:100%}}.eael-facebook-feed.eael-col-3 .eael-facebook-feed-item{float:left;width:33.3333%}@media only screen and (max-width:979px){.eael-facebook-feed.eael-col-3 .eael-facebook-feed-item{width:50%}}@media only screen and (max-width:480px){.eael-facebook-feed.eael-col-3 .eael-facebook-feed-item{width:100%}}.eael-facebook-feed.eael-col-4 .eael-facebook-feed-item{float:left;width:25%}@media only screen and (max-width:979px){.eael-facebook-feed.eael-col-4 .eael-facebook-feed-item{width:50%}}@media only screen and (max-width:480px){.eael-facebook-feed.eael-col-4 .eael-facebook-feed-item{width:100%}}.eael-facebook-feed.eael-col-5 .eael-facebook-feed-item{float:left;width:20%}@media only screen and (max-width:979px){.eael-facebook-feed.eael-col-5 .eael-facebook-feed-item{width:50%}}@media only screen and (max-width:480px){.eael-facebook-feed.eael-col-5 .eael-facebook-feed-item{width:100%}}.eael-facebook-feed.eael-col-6 .eael-facebook-feed-item{float:left;width:16.6666%}@media only screen and (max-width:979px){.eael-facebook-feed.eael-col-6 .eael-facebook-feed-item{width:50%}}@media only screen and (max-width:480px){.eael-facebook-feed.eael-col-6 .eael-facebook-feed-item{width:100%}}.eael-facebook-feed .eael-facebook-feed-item{display:inline-block;line-height:0}.eael-facebook-feed .eael-facebook-feed-item,.eael-facebook-feed .eael-facebook-feed-item-inner{position:relative}.eael-facebook-feed-overlay .eael-facebook-feed-item .eael-facebook-feed-item-overlay{display:flex;justify-content:center;text-align:center;position:absolute;top:0;bottom:0;left:0;right:0;font-size:12px;line-height:1;transform:scale(.8);opacity:0;transition:all .2s}.eael-facebook-feed-overlay .eael-facebook-feed-item .eael-facebook-feed-item-overlay .eael-facebook-feed-item-overlay-inner{position:relative;align-self:center}.eael-facebook-feed-overlay .eael-facebook-feed-item:hover .eael-facebook-feed-item-overlay{transform:scale(1);opacity:1}.eael-facebook-feed-overlay .eael-facebook-feed-meta{margin-bottom:0}.eael-facebook-feed-overlay .eael-facebook-feed-meta span{display:inline-block;margin:0 15px}.eael-facebook-feed-card .eael-facebook-feed-item .eael-facebook-feed-item-inner{margin:10px}.eael-facebook-feed-card .eael-facebook-feed-item .eael-facebook-feed-item-inner .eael-facebook-feed-item-header{padding:8px 12px}.eael-facebook-feed-card .eael-facebook-feed-item .eael-facebook-feed-item-inner .eael-facebook-feed-item-header .eael-facebook-feed-item-user{float:left}.eael-facebook-feed-card .eael-facebook-feed-item .eael-facebook-feed-item-inner .eael-facebook-feed-item-header .eael-facebook-feed-item-user .eael-facebook-feed-avatar{float:left;display:inline-block;width:32px;height:32px;border-radius:50%;margin-right:10px}.eael-facebook-feed-card .eael-facebook-feed-item .eael-facebook-feed-item-inner .eael-facebook-feed-item-header .eael-facebook-feed-item-user .eael-facebook-feed-username{float:left;display:inline-block;font-size:14px;font-weight:400;line-height:32px;margin:0}.eael-facebook-feed-card .eael-facebook-feed-item .eael-facebook-feed-item-inner .eael-facebook-feed-item-header .eael-facebook-feed-post-time{float:right;font-size:11px;font-weight:400;line-height:32px}.eael-facebook-feed-card .eael-facebook-feed-item .eael-facebook-feed-item-inner .eael-facebook-feed-item-content{position:relative;display:block;padding:12px}.eael-facebook-feed-card .eael-facebook-feed-item .eael-facebook-feed-item-inner .eael-facebook-feed-item-content .eael-facebook-feed-message{font-size:14px;font-weight:400;line-height:1.3;margin:0}.eael-facebook-feed-card .eael-facebook-feed-item .eael-facebook-feed-item-inner .eael-facebook-feed-preview-wrap{padding:0}.eael-facebook-feed-card .eael-facebook-feed-item .eael-facebook-feed-item-inner .eael-facebook-feed-preview-wrap .eael-facebook-feed-preview-img{display:block;position:relative;margin-bottom:12px}.eael-facebook-feed-card .eael-facebook-feed-item .eael-facebook-feed-item-inner .eael-facebook-feed-preview-wrap .eael-facebook-feed-preview-overlay{position:absolute;top:0;right:0;bottom:0;left:0;background-color:rgba(0,0,0,.4);display:flex;align-items:center;justify-content:center}.eael-facebook-feed-card .eael-facebook-feed-item .eael-facebook-feed-item-inner .eael-facebook-feed-preview-wrap .eael-facebook-feed-preview-overlay i{font-size:48px;color:#fff}.eael-facebook-feed-card .eael-facebook-feed-item .eael-facebook-feed-item-inner .eael-facebook-feed-preview-wrap .eael-facebook-feed-url-preview{padding:0 12px 15px}.eael-facebook-feed-card .eael-facebook-feed-item .eael-facebook-feed-item-inner .eael-facebook-feed-preview-wrap .eael-facebook-feed-url-preview .eael-facebook-feed-url-host{font-size:12px;font-weight:400;line-height:1;text-transform:uppercase;margin-bottom:5px}.eael-facebook-feed-card .eael-facebook-feed-item .eael-facebook-feed-item-inner .eael-facebook-feed-preview-wrap .eael-facebook-feed-url-preview .eael-facebook-feed-url-title{font-size:15px;font-weight:700;line-height:1.4;margin-top:0;margin-bottom:6px}.eael-facebook-feed-card .eael-facebook-feed-item .eael-facebook-feed-item-inner .eael-facebook-feed-preview-wrap .eael-facebook-feed-url-preview .eael-facebook-feed-url-description{font-size:14px;font-weight:400;line-height:1.2;margin-bottom:0}.eael-facebook-feed-card .eael-facebook-feed-item .eael-facebook-feed-item-inner .eael-facebook-feed-item-footer{font-size:13px;font-weight:400;line-height:30px;padding:8px 12px}.eael-facebook-feed-card .eael-facebook-feed-item .eael-facebook-feed-item-inner .eael-facebook-feed-item-footer span{display:inline-block}.eael-facebook-feed-card .eael-facebook-feed-item .eael-facebook-feed-item-inner .eael-facebook-feed-item-footer span.eael-facebook-feed-post-likes{margin-right:15px}.elementor-widget-eael-facebook-feed .eael-load-more-button-wrap{justify-content:center;margin-top:15px}.elementor-widget-eael-facebook-feed .eael-load-more-button-wrap.no-pagination{display:none}
15
  .eael-fancy-text-container p{margin:0}.eael-fancy-text-strings{display:none}.eael-fancy-text-prefix,.eael-fancy-text-suffix{display:inline-block}.morphext>.animated{display:inline-block}.typed-cursor{opacity:1;-webkit-animation:blink_cursor .7s infinite;animation:blink_cursor .7s infinite}@keyframes blink_cursor{0%{opacity:1}50%{opacity:0}100%{opacity:1}}@-webkit-keyframes blink_cursor{0%{opacity:1}50%{opacity:0}100%{opacity:1}}.eael-fancy-text-container.style-2{font-size:24px}.eael-fancy-text-container.style-2 .eael-fancy-text-strings{background:#f54;color:#fff;padding:10px 25px}
16
  .elementor-widget-eael-feature-list.-icon-position-left .connector-type-modern.rhombus .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-right .connector-type-modern.rhombus .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-top .connector-type-modern.rhombus .eael-feature-list-item:before{top:3px!important}.elementor-widget-eael-feature-list.-icon-position-left .connector-type-modern.rhombus .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-right .connector-type-modern.rhombus .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-top .connector-type-modern.rhombus .eael-feature-list-item:after{top:45px!important}.elementor-widget-eael-feature-list.-icon-position-right .connector,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right .connector{right:0;left:calc(100% - 70px)}.elementor-widget-eael-feature-list.-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item{padding:0 50px 0 0}@media (max-width:767px){.elementor-widget-eael-feature-list.-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item{padding:0 30px 0 0}}.elementor-widget-eael-feature-list.-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before{left:auto;right:0}.elementor-widget-eael-feature-list.-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after{left:auto;right:5px;top:30px}.elementor-widget-eael-feature-list .eael-feature-list-items{list-style-type:none;margin:0;padding:0}.elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item{position:relative}.elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item .connector{display:block;position:absolute;width:0;margin:0 auto;z-index:1;height:100%;top:.5em;font-size:60px;left:0;right:calc(100% - 60px);border-left:2px solid #2ecc71;border-right:none!important}.elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item:last-child .connector{display:none}.elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item .eael-feature-list-icon-box{z-index:2;transition:all .5s}@media (prefers-reduced-motion:reduce){.elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item .eael-feature-list-icon-box{transition:none}}.elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item .eael-feature-list-icon-box .eael-feature-list-icon-inner{background-color:#37368e;transition:all .5s;display:inline-flex}@media (prefers-reduced-motion:reduce){.elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item .eael-feature-list-icon-box .eael-feature-list-icon-inner{transition:none}}.elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item .eael-feature-list-icon-box .eael-feature-list-icon{padding:.5em;transition:all .5s;font-size:30px;line-height:1;color:#37368e;text-align:center;display:inline-flex;display:flex;align-items:center;justify-content:center}@media (prefers-reduced-motion:reduce){.elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item .eael-feature-list-icon-box .eael-feature-list-icon{transition:none}}.elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item .eael-feature-list-icon-box .eael-feature-list-icon i{width:1em;height:1em;position:relative;display:block}.elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item .eael-feature-list-icon-box .eael-feature-list-icon i:before{position:absolute;left:50%;transform:translateX(-50%)}.elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item .eael-feature-list-icon-box .eael-feature-list-img{font-size:8px;line-height:1;max-width:inherit}.elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item .eael-feature-list-content-box{margin:0 0 0 20px}.elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item .eael-feature-list-content-box .eael-feature-list-title{margin-top:-2px;line-height:1.5em}.elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item .eael-feature-list-content-box .eael-feature-list-content{padding:0;margin:0;font-size:14px;line-height:1.5em}.elementor-widget-eael-feature-list .eael-feature-list-items.stacked .eael-feature-list-icon-box .eael-feature-list-icon{color:#fff}.elementor-widget-eael-feature-list .eael-feature-list-items.framed .eael-feature-list-icon-box .eael-feature-list-icon{background-color:#fff}.elementor-widget-eael-feature-list .eael-feature-list-items.circle .eael-feature-list-icon-box .eael-feature-list-icon-inner{border-radius:50%}.elementor-widget-eael-feature-list .eael-feature-list-items.circle .eael-feature-list-icon-box .eael-feature-list-icon-inner .eael-feature-list-icon{border-radius:50%}.elementor-widget-eael-feature-list .eael-feature-list-items.rhombus .eael-feature-list-icon-box .eael-feature-list-icon-inner{transform:rotate(45deg);margin:15px}.elementor-widget-eael-feature-list .eael-feature-list-items.rhombus .eael-feature-list-icon-box .eael-feature-list-icon i{transform:rotate(-45deg)}.elementor-widget-eael-feature-list .eael-feature-list-items.rhombus .eael-feature-list-icon-box .eael-feature-list-icon img{transform:rotate(-45deg)}.elementor-widget-eael-feature-list .eael-feature-list-items.rhombus .eael-feature-list-content-box .eael-feature-list-title{margin-top:15px}.elementor-widget-eael-feature-list .eael-feature-list-items.connector-type-modern .eael-feature-list-item{padding:0 0 0 50px;position:relative}@media (max-width:767px){.elementor-widget-eael-feature-list .eael-feature-list-items.connector-type-modern .eael-feature-list-item{padding:0 0 0 30px;display:block}}.elementor-widget-eael-feature-list .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before{content:"";position:absolute;display:block}.elementor-widget-eael-feature-list .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before{left:0;top:0;z-index:1;border-left:1px solid #000;border-right:none!important;height:100%}.elementor-widget-eael-feature-list .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after{left:5px;top:30px;width:23px;display:block;z-index:2;border-bottom:1px dashed #000;border-top:none!important}.elementor-widget-eael-feature-list .eael-feature-list-items.connector-type-modern .eael-feature-list-item .connector{display:none}@media (min-width:768px){.elementor-widget-eael-feature-list .eael-feature-list-items.connector-type-modern.-icon-position-right .eael-feature-list-item{padding:0 50px 0 0}.elementor-widget-eael-feature-list .eael-feature-list-items.connector-type-modern.-icon-position-right .eael-feature-list-item:before{left:auto;right:0}.elementor-widget-eael-feature-list .eael-feature-list-items.connector-type-modern.-icon-position-right .eael-feature-list-item:after{left:auto;right:5px;top:30px}.elementor-widget-eael-feature-list .eael-feature-list-items.connector-type-modern.-icon-position-right .eael-feature-list-item .connector{display:none}}@media (min-width:1025px){.elementor-widget-eael-feature-list.-icon-position-left .eael-feature-list-content-box{margin-right:0!important;margin-top:0!important;margin-bottom:0!important}.elementor-widget-eael-feature-list.-icon-position-right .eael-feature-list-content-box{margin-left:0!important;margin-top:0!important;margin-bottom:0!important}.elementor-widget-eael-feature-list.-icon-position-top .eael-feature-list-content-box{margin-left:0!important;margin-right:0!important;margin-bottom:0!important}.elementor-widget-eael-feature-list.-icon-position-left .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right .eael-feature-list-item{display:flex}.elementor-widget-eael-feature-list.-icon-position-left .eael-feature-list-item{text-align:left;flex-direction:row}.elementor-widget-eael-feature-list.-icon-position-right .eael-feature-list-item{text-align:right;flex-direction:row-reverse}}@media (max-width:1024px){.elementor-widget-eael-feature-list.-tablet-icon-position-left .eael-feature-list-item,.elementor-widget-eael-feature-list.-tablet-icon-position-right .eael-feature-list-item{display:flex}.elementor-widget-eael-feature-list.-tablet-icon-position-left .eael-feature-list-item{text-align:left;flex-direction:row}.elementor-widget-eael-feature-list.-tablet-icon-position-right .eael-feature-list-item{text-align:right;flex-direction:row-reverse}}@media (min-width:768px) and (max-width:1024px){.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left .eael-feature-list-content-box{margin-right:0!important;margin-top:0!important;margin-bottom:0!important}.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item{padding:0 0 0 50px}}@media (min-width:768px) and (max-width:1024px) and (max-width:767px){.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item{padding:0 0 0 30px}}@media (min-width:768px) and (max-width:1024px){.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before{left:0;right:auto}.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after{left:5px;top:30px}.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top .eael-feature-list-content-box{margin-left:0!important;margin-right:0!important;margin-bottom:0!important}.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item{padding:0 0 0 50px}}@media (min-width:768px) and (max-width:1024px) and (max-width:767px){.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item{padding:0 0 0 30px}}@media (min-width:768px) and (max-width:1024px){.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before{left:0;right:auto}.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after{left:5px}.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right .eael-feature-list-content-box{margin-left:0!important;margin-top:0!important;margin-bottom:0!important}.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item{padding:0 50px 0 0}}@media (min-width:768px) and (max-width:1024px) and (max-width:767px){.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item{padding:0 30px 0 0}}@media (min-width:768px) and (max-width:1024px){.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before{right:0;left:auto}.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after{left:auto;right:5px}}@media (max-width:767px){.elementor-widget-eael-feature-list.-icon-position-left .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right .eael-feature-list-item,.elementor-widget-eael-feature-list.-tablet-icon-position-left .eael-feature-list-item,.elementor-widget-eael-feature-list.-tablet-icon-position-right .eael-feature-list-item{display:block;text-align:left}.elementor-widget-eael-feature-list.-mobile-icon-position-left .eael-feature-list-item,.elementor-widget-eael-feature-list.-mobile-icon-position-right .eael-feature-list-item{display:flex}.elementor-widget-eael-feature-list.-mobile-icon-position-left .eael-feature-list-item{text-align:left;flex-direction:row}.elementor-widget-eael-feature-list.-mobile-icon-position-right .eael-feature-list-item{text-align:right;flex-direction:row-reverse}.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left.-mobile-icon-position-left .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right.-mobile-icon-position-left .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top.-mobile-icon-position-left .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left.-mobile-icon-position-left .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right.-mobile-icon-position-left .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top.-mobile-icon-position-left .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left.-mobile-icon-position-left .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right.-mobile-icon-position-left .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top.-mobile-icon-position-left .eael-feature-list-content-box{margin-right:0!important;margin-top:0!important;margin-bottom:0!important}.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item{padding:0 0 0 50px}}@media (max-width:767px) and (max-width:767px){.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item{padding:0 0 0 30px}}@media (max-width:767px){.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before{left:0;right:auto}.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after{left:5px}.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left.-mobile-icon-position-top .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right.-mobile-icon-position-top .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top.-mobile-icon-position-top .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left.-mobile-icon-position-top .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right.-mobile-icon-position-top .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top.-mobile-icon-position-top .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left.-mobile-icon-position-top .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right.-mobile-icon-position-top .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top.-mobile-icon-position-top .eael-feature-list-content-box{margin-left:0!important;margin-right:0!important;margin-bottom:0!important}.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item{padding:0 0 0 50px}}@media (max-width:767px) and (max-width:767px){.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item{padding:0 0 0 30px}}@media (max-width:767px){.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before{left:0;right:auto}.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after{left:5px}.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left.-mobile-icon-position-right .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right.-mobile-icon-position-right .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top.-mobile-icon-position-right .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left.-mobile-icon-position-right .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right.-mobile-icon-position-right .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top.-mobile-icon-position-right .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left.-mobile-icon-position-right .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right.-mobile-icon-position-right .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top.-mobile-icon-position-right .eael-feature-list-content-box{margin-left:0!important;margin-top:0!important;margin-bottom:0!important}.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item{padding:0 50px 0 0}}@media (max-width:767px) and (max-width:767px){.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item{padding:0 30px 0 0}}@media (max-width:767px){.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before{right:0;left:auto}.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after{left:auto;right:5px}}
17
  .eael-filter-gallery-control{width:100%}.eael-filter-gallery-control ul,.eael-filter-gallery-control ul li{text-align:center}.eael-filter-gallery-control ul{margin:0 0 20px 0;padding:0;text-align:center}.eael-filter-gallery-control{display:flex;flex-flow:1 1 auto;align-items:center;justify-content:center;flex-flow:row wrap;padding:0;margin:0}.eael-filter-gallery-control ul li{list-style:none;font-size:24px;display:inline-block;text-align:center}.eael-filter-gallery-control ul li a.control{font-family:Montserrat,sans-serif;font-size:16px;font-weight:600;padding:10px 25px;margin:10px 6px}.eael-filter-gallery-container{text-align:justify;font-size:.1px}.eael-filter-gallery-container:after{content:'';display:inline-block;width:100%}.eael-filter-gallery-container:not(.eael-cards) .item:before{content:'';display:inline-block;padding-top:56.25%}.eael-filter-gallery-container .item .caption{position:absolute;display:flex;flex-flow:1 1 100%;align-items:center;justify-content:center;z-index:1;top:0;left:0;right:0;bottom:0;transition:transform .4s}.eael-filter-gallery-container.eael-cards .item .caption{display:none}.eael-filter-gallery-container.eael-cards .item .item-img .caption{position:absolute;display:flex;flex-flow:1 1 100%;align-items:center;justify-content:center;z-index:10;top:0;left:0;right:0;bottom:0;transition:transform .4s}.gallery-item-caption-over{width:100%;height:auto}a.eael-gallery-load-more,a.eael-gallery-load-more:hover{text-decoration:none}.eael-filter-gallery-container .item .caption.eael-zoom-in,.eael-filter-gallery-container.eael-cards .item .item-img .caption.eael-zoom-in{transform:scale(0)}.eael-filter-gallery-container .item:hover .caption.eael-zoom-in,.eael-filter-gallery-container.eael-cards .item:hover .item-img .caption.eael-zoom-in{transform:scale(1)}.eael-filter-gallery-container .item .caption.eael-slide-left,.eael-filter-gallery-container.eael-cards .item .item-img .caption.eael-slide-left{transform:translateX(-100%)}.eael-filter-gallery-container .item:hover .caption.eael-slide-left,.eael-filter-gallery-container.eael-cards .item:hover .item-img .caption.eael-slide-left{transform:translateX(0)}.eael-filter-gallery-container .item .caption.eael-slide-right,.eael-filter-gallery-container.eael-cards .item .item-img .caption.eael-slide-right{transform:translateX(100%)}.eael-filter-gallery-container .item:hover .caption.eael-slide-right,.eael-filter-gallery-container.eael-cards .item:hover .item-img .caption.eael-slide-right{transform:translateX(0)}.eael-filter-gallery-container .item .caption.eael-slide-top,.eael-filter-gallery-container.eael-cards .item .item-img .caption.eael-slide-top{transform:translateY(-100%)}.eael-filter-gallery-container .item:hover .caption.eael-slide-top,.eael-filter-gallery-container.eael-cards .item:hover .item-img .caption.eael-slide-top{transform:translateY(0)}.eael-filter-gallery-container .item .caption.eael-slide-bottom,.eael-filter-gallery-container.eael-cards .item .item-img .caption.eael-slide-bottom{transform:translateY(100%)}.eael-filter-gallery-container .item:hover .caption.eael-slide-bottom,.eael-filter-gallery-container.eael-cards .item:hover .item-img .caption.eael-slide-bottom{transform:translateY(0)}.eael-filter-gallery-container .item .caption a{display:inline-block;width:50px;height:50px;text-align:center;line-height:50px;border-radius:50%;margin:0 5px;font-size:20px;cursor:pointer;transition:.3s}.eael-container .item .caption a:nth-child(2),.eael-filter-gallery-container .item .caption a:nth-child(1){transition:.6s;opacity:0}.eael-filter-gallery-container .item .caption a:nth-child(1){transform:translateY(-100%)}.eael-filter-gallery-container .item .caption a:nth-child(2){transform:translateY(100%)}.eael-filter-gallery-container .item .caption:hover a:nth-child(1),.eael-filter-gallery-container .item .caption:hover a:nth-child(2){transform:translateY(0);opacity:1}.eael-filter-gallery-container .item .caption .eael-popup-link{outline:0}.eael-filter-gallery-container.eael-cards .item:before{padding-top:0}.eael-filter-gallery-container.eael-cards .item-img{position:relative;background-repeat:no-repeat;background-position:center;background-size:cover;height:220px;z-index:0;overflow:hidden}.eael-filter-gallery-container.eael-cards .item-content{padding:15px}.eael-filter-gallery-container.eael-cards .item-content .title,.eael-filter-gallery-container.eael-cards .item-content .title a{font-size:20px;line-height:1;margin-bottom:0;transition:.3s}.eael-filter-gallery-container.eael-cards .item-content p{font-size:14px;line-height:26px}.eael-fg-card-content-align-center .eael-filterable-gallery-item-wrap .gallery-item-caption-wrap .gallery-item-caption-over{text-align:center}.eael-fg-card-content-align-right .eael-filterable-gallery-item-wrap .gallery-item-caption-wrap .gallery-item-caption-over{text-align:right}.eael-fg-hoverer-content-align-center .eael-filterable-gallery-item-wrap .gallery-item-caption-wrap .gallery-item-caption-over{text-align:center}.eael-fg-hoverer-content-align-right .eael-filterable-gallery-item-wrap .gallery-item-caption-wrap .gallery-item-caption-over{text-align:right}.eael-fg-content-align-left .eael-cards .item .item-content{text-align:left}.eael-fg-content-align-center .eael-cards .item .item-content{text-align:center}.eael-fg-content-align-right .eael-cards .item .item-content{text-align:right}.mfp-wrap~div.dialog-widget{display:none!important}.eael-filterable-gallery-item-wrap{float:left;width:33.33%}.eael-filter-gallery-container.eael-col-1 .eael-filterable-gallery-item-wrap{width:100%}.eael-filter-gallery-control>ul li{font-size:13px;line-height:1.8;text-transform:uppercase;letter-spacing:1px;padding:6px 15px;cursor:pointer;margin:0 5px;font-weight:400}.eael-filter-gallery-container.eael-col-2 .eael-filterable-gallery-item-wrap{width:50%}.eael-filter-gallery-container.eael-col-4 .eael-filterable-gallery-item-wrap{width:25%}.eael-filter-gallery-container.eael-col-5 .eael-filterable-gallery-item-wrap{width:20%}.eael-gallery-grid-item{margin-left:calc(20px/2);margin-right:calc(20px/2);margin-bottom:20px;position:relative}.gallery-item-caption-wrap,.media-content-wrap{font-size:14px;text-align:left}.gallery-item-thumbnail-wrap.caption-style-card img{max-height:100%;width:100%}.gallery-item-caption-wrap.caption-style-hoverer{position:absolute;left:0;top:0;height:100%;width:100%;padding:15px;z-index:10}.eael-filterable-gallery-item-wrap .eael-gallery-grid-item .gallery-item-thumbnail-wrap>img{height:100%;width:100%;-o-object-fit:cover;object-fit:cover}.fg-item-content,.fg-item-title{color:#fff;font-family:inherit}.gallery-item-caption-wrap.caption-style-card .fg-item-title{font-size:18px;margin:15px 0 15px;line-height:1}.gallery-item-caption-wrap.caption-style-card{background:#f7f7f7}.gallery-item-caption-wrap.caption-style-card .fg-item-title{margin:10px 0 15px;color:#000}.gallery-item-caption-wrap.caption-style-card .fg-item-content{color:#212529;line-height:1.5;font-weight:400}.gallery-item-buttons>a{display:inline-block;font-size:16px;color:#000;margin-right:15px}.gallery-item-buttons>a:visited{color:#000}.gallery-item-caption-wrap.caption-style-card{padding:10px;box-sizing:border-box;font-family:inherit}.gallery-item-caption-wrap .gallery-item-hoverer-bg{position:absolute;left:0;top:0;height:100%;width:100%;content:'';background:#000;z-index:-1;opacity:.7}.gallery-item-caption-wrap.caption-style-hoverer{visibility:hidden;opacity:0;transition:.6s all ease;display:flex;align-items:center}.eael-gallery-grid-item:hover .gallery-item-caption-wrap.caption-style-hoverer{opacity:1;visibility:visible}.gallery-item-caption-wrap.caption-style-hoverer h5{font-size:20px;margin-bottom:5px;line-height:1}.gallery-item-caption-wrap.caption-style-hoverer.eael-slide-up h5{transform:translateY(20px);transition:.6s all ease}.gallery-item-caption-wrap.caption-style-hoverer p{margin-bottom:5px}.gallery-item-caption-wrap.caption-style-hoverer.eael-slide-up p{transform:translateY(40px);transition:.6s all ease}.gallery-item-caption-wrap.caption-style-hoverer.eael-slide-up .gallery-item-buttons{transform:translateY(40px);transition:.6s all ease}.gallery-item-caption-wrap .gallery-item-buttons>a span{display:flex;align-items:center;justify-content:center;border-radius:50%;outline:0;text-decoration:none;display:inline-block;text-align:center}.gallery-item-caption-wrap.caption-style-hoverer.eael-zoom-in{transform:scale(.8);transition:.6s all ease}.eael-gallery-grid-item:hover .gallery-item-caption-wrap.caption-style-hoverer.eael-slide-up .gallery-item-buttons,.eael-gallery-grid-item:hover .gallery-item-caption-wrap.caption-style-hoverer.eael-slide-up h5,.eael-gallery-grid-item:hover .gallery-item-caption-wrap.caption-style-hoverer.eael-slide-up p{transform:translate(0)}.eael-gallery-grid-item:hover .gallery-item-caption-wrap.caption-style-hoverer.eael-zoom-in{transform:scale(1);visibility:visible;opacity:1}.gallery-item-caption-wrap.caption-style-hoverer.eael-none{transition:none}.gallery-item-thumbnail-wrap{position:relative}.video-popup,.video-popup-bg{position:absolute;left:0;top:0;height:100%;width:100%}.video-popup>img{width:62px;position:relative;z-index:1;transition:.3s}.video-popup{display:flex;align-items:center;justify-content:center}.video-popup:hover>img{transform:scale(1.1)}.video-popup-bg{visibility:hidden;opacity:0;transition:350ms}.eael-gallery-grid-item:hover .video-popup-bg{visibility:visible;opacity:1}.gallery-item-thumbnail-wrap>.gallery-item-caption-wrap{position:absolute;left:0;top:0;height:100%;width:100%;display:flex;align-items:center;justify-content:center}.gallery-item-caption-wrap.card-hover-bg{visibility:hidden;opacity:0;transition:.8s}.gallery-item-thumbnail-wrap:hover .gallery-item-caption-wrap.card-hover-bg{visibility:visible;opacity:1}.gallery-item-caption-wrap .gallery-item-buttons>a>i{display:flex;align-items:center;justify-content:center;height:100%}@media only screen and (min-width:1025px){.elementor-element.elementor-grid-1{position:relative}.elementor-element.elementor-grid-1 .eael-filterable-gallery-item-wrap{width:100%;float:left}.elementor-element.elementor-grid-2{position:relative}.elementor-element.elementor-grid-2 .eael-filterable-gallery-item-wrap{width:50%;float:left}.elementor-element.elementor-grid-2 .eael-filterable-gallery-item-wrap:nth-of-type(2n){margin-right:0!important}.elementor-element.elementor-grid-2 .eael-filterable-gallery-item-wrap:nth-of-type(2n+1){clear:left}.elementor-element.elementor-grid-3{position:relative}.elementor-element.elementor-grid-3 .eael-filterable-gallery-item-wrap{width:33.3333%;float:left}.elementor-element.elementor-grid-3 .eael-filterable-gallery-item-wrap:nth-of-type(3n){margin-right:0!important}.elementor-element.elementor-grid-3 .eael-filterable-gallery-item-wrap:nth-of-type(3n+1){clear:left}.elementor-element.elementor-grid-4{position:relative}.elementor-element.elementor-grid-4 .eael-filterable-gallery-item-wrap{width:25%;float:left}.elementor-element.elementor-grid-4 .eael-filterable-gallery-item-wrap:nth-of-type(4n){margin-right:0!important}.elementor-element.elementor-grid-4 .eael-filterable-gallery-item-wrap:nth-of-type(4n+1){clear:left}.elementor-element.elementor-grid-5{position:relative}.elementor-element.elementor-grid-5 .pp-logo-grid{margin-right:-5px}.elementor-element.elementor-grid-5 .eael-filterable-gallery-item-wrap{width:20%;float:left}.elementor-element.elementor-grid-5 .eael-filterable-gallery-item-wrap:nth-of-type(5n){margin-right:0!important}.elementor-element.elementor-grid-5 .eael-filterable-gallery-item-wrap:nth-of-type(5n+1){clear:left}.elementor-element.elementor-grid-6{position:relative}.elementor-element.elementor-grid-6 .pp-logo-grid{margin-right:-6px}.elementor-element.elementor-grid-6 .eael-filterable-gallery-item-wrap{width:16.6667%;float:left}.elementor-element.elementor-grid-6 .eael-filterable-gallery-item-wrap:nth-of-type(6n){margin-right:0!important}.elementor-element.elementor-grid-6 .eael-filterable-gallery-item-wrap:nth-of-type(6n+1){clear:left}}@media only screen and (max-width:1024px) and (min-width:766px){.elementor-element.elementor-grid-tablet-1{position:relative}.elementor-element.elementor-grid-tablet-1 .eael-filterable-gallery-item-wrap{width:100%;float:left}.elementor-element.elementor-grid-tablet-2{position:relative}.elementor-element.elementor-grid-tablet-2 .eael-filterable-gallery-item-wrap{width:50%;float:left}.elementor-element.elementor-grid-tablet-2 .eael-filterable-gallery-item-wrap:nth-of-type(2n){margin-right:0!important}.elementor-element.elementor-grid-tablet-2 .eael-filterable-gallery-item-wrap:nth-of-type(2n+1){clear:left}.elementor-element.elementor-grid-tablet-3{position:relative}.elementor-element.elementor-grid-tablet-3 .eael-filterable-gallery-item-wrap{width:33.3333%;float:left}.elementor-element.elementor-grid-tablet-3 .eael-filterable-gallery-item-wrap:nth-of-type(3n){margin-right:0!important}.elementor-element.elementor-grid-tablet-3 .eael-filterable-gallery-item-wrap:nth-of-type(3n+1){clear:left}.elementor-element.elementor-grid-tablet-4{position:relative}.elementor-element.elementor-grid-tablet-4 .eael-filterable-gallery-item-wrap{width:25%;float:left}.elementor-element.elementor-grid-tablet-4 .eael-filterable-gallery-item-wrap:nth-of-type(4n){margin-right:0!important}.elementor-element.elementor-grid-tablet-4 .eael-filterable-gallery-item-wrap:nth-of-type(4n+1){clear:left}.elementor-element.elementor-grid-tablet-5{position:relative}.elementor-element.elementor-grid-tablet-5 .eael-filterable-gallery-item-wrap{width:20%;float:left}.elementor-element.elementor-grid-tablet-5 .eael-filterable-gallery-item-wrap:nth-of-type(5n){margin-right:0!important}.elementor-element.elementor-grid-tablet-5 .eael-filterable-gallery-item-wrap:nth-of-type(5n+1){clear:left}.elementor-element.elementor-grid-tablet-6{position:relative}.elementor-element.elementor-grid-tablet-6 .pp-logo-grid{margin-right:-6px}.elementor-element.elementor-grid-tablet-6 .eael-filterable-gallery-item-wrap{width:16.6667%;float:left}.elementor-element.elementor-grid-tablet-6 .eael-filterable-gallery-item-wrap:nth-of-type(6n){margin-right:0!important}.elementor-element.elementor-grid-tablet-6 .eael-filterable-gallery-item-wrap:nth-of-type(6n+1){clear:left}}@media only screen and (max-width:767px){.elementor-element.elementor-grid-mobile-1{position:relative}.elementor-element.elementor-grid-mobile-1 .eael-filterable-gallery-item-wrap{width:100%;float:left}.elementor-element.elementor-grid-mobile-2{position:relative}.elementor-element.elementor-grid-mobile-2 .eael-filterable-gallery-item-wrap{width:50%;float:left}.elementor-element.elementor-grid-mobile-2 .eael-filterable-gallery-item-wrap:nth-of-type(2n){margin-right:0!important}.elementor-element.elementor-grid-mobile-2 .eael-filterable-gallery-item-wrap:nth-of-type(2n+1){clear:left}.elementor-element.elementor-grid-mobile-3{position:relative}.elementor-element.elementor-grid-mobile-3 .eael-filterable-gallery-item-wrap{width:33.3333%;float:left}.elementor-element.elementor-grid-mobile-3 .eael-filterable-gallery-item-wrap:nth-of-type(3n){margin-right:0!important}.elementor-element.elementor-grid-mobile-3 .eael-filterable-gallery-item-wrap:nth-of-type(3n+1){clear:left}.elementor-element.elementor-grid-mobile-4{position:relative}.elementor-element.elementor-grid-mobile-4 .eael-filterable-gallery-item-wrap{width:25%;float:left}.elementor-element.elementor-grid-mobile-4 .eael-filterable-gallery-item-wrap:nth-of-type(4n){margin-right:0!important}.elementor-element.elementor-grid-mobile-4 .eael-filterable-gallery-item-wrap:nth-of-type(4n+1){clear:left}.elementor-element.elementor-grid-mobile-5{position:relative}.elementor-element.elementor-grid-mobile-5 .eael-filterable-gallery-item-wrap{width:20%;float:left}.elementor-element.elementor-grid-mobile-5 .eael-filterable-gallery-item-wrap:nth-of-type(5n){margin-right:0!important}.elementor-element.elementor-grid-mobile-5 .eael-filterable-gallery-item-wrap:nth-of-type(5n+1){clear:left}.elementor-element.elementor-grid-mobile-6{position:relative}.elementor-element.elementor-grid-mobile-6 .pp-logo-grid{margin-right:-6px}.elementor-element.elementor-grid-mobile-6 .eael-filterable-gallery-item-wrap{width:16.6667%;float:left}.elementor-element.elementor-grid-mobile-6 .eael-filterable-gallery-item-wrap:nth-of-type(6n){margin-right:0!important}.elementor-element.elementor-grid-mobile-6 .eael-filterable-gallery-item-wrap:nth-of-type(6n+1){clear:left}}.fg-layout-3-filter-controls{margin:0;padding:0;list-style:none}.fg-layout-3-item-content{text-align:center}.fg-layout-3-item-content .fg-item-title{font-size:18px;line-height:1;font-weight:500;margin:0;transition:.3s}.fg-layout-3-item-content .fg-item-content p{font-size:13px;font-weight:400}.fg-filter-wrap{position:relative;flex-basis:30%}.fg-layout-3-filter-controls{position:absolute;left:0;background:#fff;z-index:999;width:150px;visibility:hidden;opacity:0;transition:.3s;width:100%;border-radius:5px;padding-top:7px}.fg-layout-3-filter-controls.open-filters{visibility:visible;opacity:1}.fg-layout-3-filter-controls li.control{padding:5px 5px 5px 10px;cursor:pointer;transition:.3s;font-size:14px;color:#7f8995;font-weight:400}.fg-layout-3-filter-controls li.control:hover{color:#2d425a}.fg-layout-3-filter-controls li.control:first-child{border-top:0 solid}.fg-layout-3-filter-controls li.control:last-child{border-bottom:0 solid}.fg-layout-3-filters-wrap{max-width:600px;margin:15px auto 50px}.fg-filter-wrap button{width:100%;border:0 solid;border-radius:0;padding:17px 13px;font-size:14px;color:#2d425a;background:#f7f8ff;height:55px;border-right:1px solid #abb5ff;border-radius:10px 0 0 10px;outline:0;text-align:center;position:relative}.fg-filter-wrap button>i{font-size:18px;position:absolute;top:50%;transform:translateY(-50%);margin-left:10px}.fg-layout-3-search-box{flex-basis:70%;height:100%}.fg-layout-3-search-box input[type=text]{width:100%;height:100%;margin:0;padding:15px;border:0 solid;outline:0;background:0 0}.fg-layout-3-search-box input[type=text]::-webkit-input-placeholder{color:#7f8995;font-size:13px}.fg-layout-3-search-box input[type=text]::-moz-placeholder{color:#7f8995;font-size:13px}.fg-layout-3-search-box input[type=text]:-ms-input-placeholder{color:#7f8995;font-size:13px}.fg-layout-3-search-box input[type=text]:-moz-placeholder{color:#7f8995;font-size:13px}.fg-layout-3-filters-wrap{height:55px;border-radius:5px;display:flex;flex-wrap:wrap;align-items:center}.fg-layout-3-filters-wrap .fg-layout-3-search-box{background:#f7f8ff;border-radius:0 10px 10px 0}.fg-layout-3-item-thumb{position:relative;overflow:hidden}.fg-layout-3-item-thumb .gallery-item-buttons{text-align:center;position:absolute;left:0;top:0;height:100%;width:100%;display:flex;align-items:center;justify-content:center;z-index:4}.fg-layout-3-item-content{padding:27px 27px 30px;text-align:center}.eael-fg-card-content-align-left .fg-layout-3-item-content{text-align:left}.eael-fg-card-content-align-center .fg-layout-3-item-content{text-align:center}.eael-fg-card-content-align-right .fg-layout-3-item-content{text-align:right}.eael-filterable-gallery-item-wrap .fg-layout-3-item.eael-gallery-grid-item{box-shadow:0 0 30px 0 rgba(3,29,60,.05);border-radius:5px}.fg-caption-head{position:absolute;left:0;top:0;width:100%;display:flex;justify-content:space-between;padding:35px 35px;z-index:3;color:#fff;font-size:18px;font-weight:700}.fg-item-category>span{font-size:12px;color:#fff;background:#fa9196;padding:10px 12px;display:inline-block}.fg-layout-3-item-content{position:relative}.fg-item-category{position:absolute;left:0;top:0;text-align:center;width:100%;height:30px;margin-top:-15px;z-index:11}.fg-item-category span{border-radius:5px;line-height:1;visibility:hidden;opacity:0;transition:.3s}.fg-layout-3-item.eael-gallery-grid-item:hover .fg-item-category span{visibility:visible;opacity:1}
18
  .eael-elements-flip-box-container{position:relative;height:300px;width:100%}.eael-elements-flip-box-container .flipbox-button{display:inline-block;transition:all .4s}.eael-elements-flip-box-container a{display:block}.eael-elements-flip-box-vertical-align{width:100%}.eael-elements-flip-box-padding{padding:0 30px 5px 30px}.eael-elements-flip-box-icon-image{display:inline-block;margin:0 auto 0 auto;line-height:1}.eael-elements-flip-box-icon-image.eael_eleements_flip_front_icon_style_background{background:#ccc}.eael_eleements_flip_front_icon_style_bordered{border:2px solid #fff}.eael_flip_box_icon_border_round{border-radius:100px}.eael_eleements_flip_front_icon_style_background,.eael_eleements_flip_front_icon_style_bordered{padding:15px}.eael-elements-flip-box-icon-image i{font-size:40px}.eael-elements-slider-display-table{width:100%}.eael-elements-flip-box-front-container{text-align:center;position:absolute;top:0;left:0;z-index:2;width:100%;height:100%;background:#0e9dd2;color:#fff;border-color:#000;-webkit-display:flex;display:flex;align-items:center}.eael-elements-flip-box-content,.eael-elements-flip-box-heading{color:#fff}.eael-elements-flip-box-heading.flipbox-linked-title{color:#fff;font-size:1.5em;font-weight:700}.eael-elements-flip-box-rear-container{text-align:center;position:absolute;top:0;left:0;width:100%;height:100%;background:#444;color:#fff;display:flex;align-items:center;border-color:#000}.eael-elements-button-floating-container{position:fixed;z-index:100}.eael-elements-button-floating-container .eael-elements-button{margin-top:0;font-size:14px;position:relative;padding:14px 20px}.eael-elements-button{cursor:pointer;display:inline-block;background:#077bbe;color:#fff;line-height:1;padding:16px 25px;margin-top:15px}.eael-elements-button:hover{background:#077bbe;color:#fff}.eael-elements-flip-box-container{perspective:1000px}.eael-elements-flip-box-front-container,.eael-elements-flip-box-rear-container{transition-duration:.5s;transition-property:all;transition-timing-function:ease}.eael-elements-flip-box-flip-card{width:100%;height:100%;transform-style:preserve-3d;transition:all .5s ease}.eael-elements-flip-box-front-container,.eael-elements-flip-box-rear-container{-webkit-backface-visibility:hidden;backface-visibility:hidden;transform:rotateX(0);transform:rotateY(0)}.eael-animate-flip.eael-animate-up .eael-elements-flip-box-rear-container,.eael-animate-flip.eael-animate-up.eael-elements-flip-box-container:hover .eael-elements-flip-box-flip-card{transform:rotateX(180deg)}.eael-animate-flip.eael-animate-down .eael-elements-flip-box-rear-container,.eael-animate-flip.eael-animate-down.eael-elements-flip-box-container:hover .eael-elements-flip-box-flip-card{transform:rotateX(-180deg)}.eael-animate-flip.eael-animate-left .eael-elements-flip-box-rear-container,.eael-animate-flip.eael-animate-left.eael-elements-flip-box-container:hover .eael-elements-flip-box-flip-card{transform:rotateY(-180deg)}.eael-animate-flip.eael-animate-right .eael-elements-flip-box-rear-container,.eael-animate-flip.eael-animate-right.eael-elements-flip-box-container:hover .eael-elements-flip-box-flip-card{transform:rotateY(180deg)}.eael-animate-push.eael-elements-flip-box-container,.eael-animate-slide.eael-elements-flip-box-container{overflow:hidden}.eael-animate-push .eael-elements-flip-box-rear-container,.eael-animate-slide .eael-elements-flip-box-rear-container{z-index:3}.eael-animate-push.eael-animate-up .eael-elements-flip-box-rear-container,.eael-animate-slide.eael-animate-up .eael-elements-flip-box-rear-container{top:100%}.eael-animate-push.eael-animate-up.eael-elements-flip-box-container:hover .eael-elements-flip-box-rear-container,.eael-animate-slide.eael-animate-up.eael-elements-flip-box-container:hover .eael-elements-flip-box-rear-container{top:0}.eael-animate-push.eael-animate-down .eael-elements-flip-box-rear-container,.eael-animate-slide.eael-animate-down .eael-elements-flip-box-rear-container{top:auto;bottom:100%}.eael-animate-push.eael-animate-down.eael-elements-flip-box-container:hover .eael-elements-flip-box-rear-container,.eael-animate-slide.eael-animate-down.eael-elements-flip-box-container:hover .eael-elements-flip-box-rear-container{top:auto;bottom:0}.eael-animate-push.eael-animate-left .eael-elements-flip-box-rear-container,.eael-animate-slide.eael-animate-left .eael-elements-flip-box-rear-container{left:100%}.eael-animate-push.eael-animate-left.eael-elements-flip-box-container:hover .eael-elements-flip-box-rear-container,.eael-animate-slide.eael-animate-left.eael-elements-flip-box-container:hover .eael-elements-flip-box-rear-container{left:0}.eael-animate-push.eael-animate-right .eael-elements-flip-box-rear-container,.eael-animate-slide.eael-animate-right .eael-elements-flip-box-rear-container{left:auto;right:100%}.eael-animate-push.eael-animate-right.eael-elements-flip-box-container:hover .eael-elements-flip-box-rear-container,.eael-animate-slide.eael-animate-right.eael-elements-flip-box-container:hover .eael-elements-flip-box-rear-container{left:auto;right:0}.eael-animate-push.eael-animate-up.eael-elements-flip-box-container:hover .eael-elements-flip-box-front-container{top:-100%}.eael-animate-push.eael-animate-down.eael-elements-flip-box-container:hover .eael-elements-flip-box-front-container{top:100%}.eael-animate-push.eael-animate-left.eael-elements-flip-box-container:hover .eael-elements-flip-box-front-container{left:-100%}.eael-animate-push.eael-animate-right.eael-elements-flip-box-container:hover .eael-elements-flip-box-front-container{left:100%}.eael-animate-zoom-in .eael-elements-flip-box-rear-container{opacity:0;transform:scale(.75);z-index:3}.eael-animate-zoom-in.eael-elements-flip-box-container:hover .eael-elements-flip-box-rear-container{opacity:1;transform:scale(1)}.eael-animate-zoom-out.eael-elements-flip-box-container:hover .eael-elements-flip-box-front-container{opacity:0;transform:scale(.75)}.eael-animate-fade.eael-elements-flip-box-container:hover .eael-elements-flip-box-front-container{opacity:0}.eael-flipbox-content-align-right .eael-elements-flip-box-padding{text-align:right}.eael-flipbox-content-align-left .eael-elements-flip-box-padding{text-align:left}.eael-flipbox-content-align-center .eael-elements-flip-box-padding{text-align:center}.eael-flipbox-img-circle .eael-elements-flip-box-icon-image img,.eael-flipbox-img-circle .flipbox-back-image-icon img{border-radius:50%;overflow:hidden}
19
- .clearfix::after,.clearfix::before{content:" ";display:table;clear:both}.eael-logo-carousel.nav-top-left,.eael-logo-carousel.nav-top-right,.eael-post-carousel.nav-top-left,.eael-post-carousel.nav-top-right,.eael-product-carousel.nav-top-left,.eael-product-carousel.nav-top-right,.eael-team-slider.nav-top-left,.eael-team-slider.nav-top-right,.eael-testimonial-slider.nav-top-left,.eael-testimonial-slider.nav-top-right{padding-top:40px}.eael-contact-form input[type=date],.eael-contact-form input[type=email],.eael-contact-form input[type=number],.eael-contact-form input[type=tel],.eael-contact-form input[type=text],.eael-contact-form input[type=url],.eael-contact-form textarea{background:#fff;box-shadow:none;-webkit-box-shadow:none;float:none;height:auto;margin:0;outline:0;width:100%}.eael-contact-form input[type=submit]{border:0;float:none;height:auto;margin:0;padding:10px 20px;width:auto;transition:all .25s linear 0s}.eael-contact-form.placeholder-hide input::-webkit-input-placeholder,.eael-contact-form.placeholder-hide textarea::-webkit-input-placeholder{opacity:0;visibility:hidden}.eael-contact-form.placeholder-hide input::-moz-placeholder,.eael-contact-form.placeholder-hide textarea::-moz-placeholder{opacity:0;visibility:hidden}.eael-contact-form.placeholder-hide input:-ms-input-placeholder,.eael-contact-form.placeholder-hide textarea:-ms-input-placeholder{opacity:0;visibility:hidden}.eael-contact-form.placeholder-hide input:-moz-placeholder,.eael-contact-form.placeholder-hide textarea:-moz-placeholder{opacity:0;visibility:hidden}.eael-custom-radio-checkbox input[type=checkbox],.eael-custom-radio-checkbox input[type=radio]{-webkit-appearance:none;-moz-appearance:none;border-style:solid;border-width:0;outline:0;min-width:1px;width:15px;height:15px;background:#ddd;padding:3px}.eael-custom-radio-checkbox input[type=checkbox]:before,.eael-custom-radio-checkbox input[type=radio]:before{content:"";width:100%;height:100%;padding:0;margin:0;display:block}.eael-custom-radio-checkbox input[type=checkbox]:checked:before,.eael-custom-radio-checkbox input[type=radio]:checked:before{background:#999;transition:all .25s linear 0s}.eael-custom-radio-checkbox input[type=radio]{border-radius:50%}.eael-custom-radio-checkbox input[type=radio]:before{border-radius:50%}.eael-post-elements-readmore-btn{font-size:12px;font-weight:500;transition:all .3s ease-in-out;display:inline-block}.elementor-lightbox .dialog-widget-content{width:100%;height:100%}.eael-contact-form-align-left,.elementor-widget-eael-weform.eael-contact-form-align-left .eael-weform-container{margin:0 auto 0 0}.eael-contact-form-align-center,.elementor-widget-eael-weform.eael-contact-form-align-center .eael-weform-container{float:none;margin:0 auto}.eael-contact-form-align-right,.elementor-widget-eael-weform.eael-contact-form-align-right .eael-weform-container{margin:0 0 0 auto}
20
  .eael-fluent-form-wrapper label.ff-el-form-check-label{display:flex;align-items:center}.eael-fluent-form-wrapper label.ff-el-form-check-label input{margin-right:5px}.eael-fluentform-form-button-full-width .ff-btn-submit{width:100%;display:block}.eael-contact-form.eael-fluent-form-wrapper.error-message-hide .ff-el-is-error .text-danger{display:none}.eael-fluentform-form-button-center .ff-el-group .ff-btn-submit,.eael-fluentform-form-button-center .ff-el-group.ff-text-left .ff-btn-submit,.eael-fluentform-form-button-center .ff-el-group.ff-text-right .ff-btn-submit{margin:0 auto;display:flex;align-items:center;justify-content:center}.eael-fluentform-form-button-right .ff-el-group .ff-btn-submit,.eael-fluentform-form-button-right .ff-el-group.ff-text-left .ff-btn-submit,.eael-fluentform-form-button-right .ff-el-group.ff-text-right .ff-btn-submit{float:right}.eael-fluentform-form-button-left .ff-el-group .ff-btn-submit,.eael-fluentform-form-button-left .ff-el-group.ff-text-left .ff-btn-submit,.eael-fluentform-form-button-left .ff-el-group.ff-text-right .ff-btn-submit{float:left}.eael-contact-form.eael-fluent-form-wrapper.fluent-form-labels-hide label{display:none!important}.eael-fluentform-section-break-content-left .ff-el-group.ff-el-section-break{text-align:left}.eael-fluentform-section-break-content-center .ff-el-group.ff-el-section-break{text-align:center}.eael-fluentform-section-break-content-right .ff-el-group.ff-el-section-break{text-align:right}
21
- .eael-gravity-form-align-default,.eael-gravity-form-align-left,.eael-gravity-form-btn-align-left{text-align:left}.eael-gravity-form-align-right,.eael-gravity-form-btn-align-right{text-align:right}.eael-gravity-form-align-center,.eael-gravity-form-btn-align-center{text-align:center}.eael-gravity-form .gform_wrapper .gform_footer{margin:0;padding:0}.gform_wrapper form li,.gform_wrapper li{list-style:none}.eael-gravity-form .gform_wrapper ul.gform_fields li.gfield{padding:0}.eael-gravity-form .gform_wrapper textarea{padding:0}.eael-gravity-form .gform_wrapper .gform_footer input.button,.eael-gravity-form .gform_wrapper .gform_footer input[type=submit],.eael-gravity-form .gform_wrapper .gform_page_footer input.button,.eael-gravity-form .gform_wrapper .gform_page_footer input[type=submit]{margin:0}.eael-gravity-form.title-description-hide .gform_heading{display:none}.eael-gravity-form.labels-hide .gform_wrapper .field_sublabel_below .ginput_complex.ginput_container label,.eael-gravity-form.labels-hide .gform_wrapper .top_label .gfield_label{display:none}.eael-gravity-form-button-full-width .gform_wrapper .gform_footer input[type=submit]{width:100%}
22
  .eael-img-accordion{display:flex;height:50vh}.eael-img-accordion a{position:relative;flex:1;text-align:center;text-decoration:none;color:#fff;background-size:cover;background-position:center;background-repeat:no-repeat;transition:flex .4s}.eael-grow-accordion{flex:3}.eael-img-accordion .overlay{display:flex;align-items:center;justify-content:center;padding:0 10px;position:absolute;top:0;right:0;bottom:0;left:0;transition:background-color .4s}.eael-img-accordion .overlay .overlay-inner{z-index:1}.eael-img-accordion a:after{content:"";position:absolute;width:100%;height:100%;z-index:0;top:0;left:0;bottom:0;right:0;transition:all .3s ease-in-out}.eael-img-accordion .overlay-inner *{visibility:hidden;opacity:0;transform-style:preserve-3d}.eael-img-accordion .overlay h2{color:#fff;transform:translate3d(0,-60px,0)}.eael-img-accordion .overlay p{color:#fff;transform:translate3d(0,60px,0)}.eael-img-accordion .overlay-inner-show *{opacity:1;visibility:visible;transform:none!important;transition:all .3s .3s}@media screen and (max-width:800px){.eael-img-accordion{flex-direction:column}.eael-img-accordion a:hover{flex:1}.eael-img-accordion a:hover .overlay{background-color:transparent}}
 
 
 
23
  .eael-ninja-container input,.eael-ninja-container textarea{height:auto;padding:10px}.eael-contact-form-align-center .eael-ninja-container,.eael-contact-form-btn-align-center .eael-ninja-container .nf-field .nf-field-element input[type=button]{margin-left:auto!important;margin-right:auto!important;display:block;float:none}.eael-contact-form-align-left .eael-ninja-container,.eael-contact-form-btn-align-left .eael-ninja-container .nf-field .nf-field-element input[type=button]{float:left;width:auto}.eael-contact-form-align-right .eael-ninja-container,.eael-contact-form-btn-align-right .eael-ninja-container .nf-field .nf-field-element input[type=button]{float:right;width:auto}.eael-ninja-container .nf-field .nf-field-element input[type=password],.eael-ninja-container .nf-field .nf-field-element input[type=url],.eael-ninja-container .nf-field .nf-field-element textarea,.eael-ninja-container ul.wpuf-form li .wpuf-fields input[type=email],.eael-ninja-container ul.wpuf-form li .wpuf-fields input[type=number],.eael-ninja-container ul.wpuf-form li .wpuf-fields input[type=text]{max-width:100%}.eael-ninja-form .nf-form-title{display:none}.eael-ninja-form-title-yes .nf-form-title{display:block}.eael-ninja-form .title-description-hide .nf-form-title{display:none}.eael-ninja-form.title-description-hide .nf-form-title{display:none}.eael-ninja-form .nf-field-label{display:none}.eael-ninja-form-labels-yes .nf-field-label{display:block}.eael-ninja-form .submit-container input[type=button]{border:0;border-radius:0}.eael-ninja-form-button-full-width .submit-container input[type=button]{width:100%}
24
  .eael-post-grid{margin:0 -10px}.eael-grid-post{float:left;padding:10px}.eael-post-carousel .eael-grid-post{float:none;padding:0}.eael-grid-post-holder{border:1px solid rgba(0,0,0,.1)}.eael-grid-post-holder-inner{height:100%}.eael-entry-media{position:relative}.eael-entry-overlay{position:absolute;top:0;left:0;width:100%;height:100%;z-index:2;transition:opacity .2s ease-in-out,transform .25s cubic-bezier(.19,1,.22,1)}.eael-entry-overlay>a{position:absolute;top:0;left:0;width:100%;height:100%;z-index:3}.eael-entry-title{margin:10px 0 5px;font-size:1.2em}.eael-entry-thumbnail img{width:100%;max-width:100%;vertical-align:middle}.eael-entry-thumbnail>img{height:100%}.eael-entry-footer .eael-author-avatar{width:50px}.eael-entry-footer .eael-author-avatar .avatar{border-radius:50%}.eael-post-grid .eael-entry-footer .eael-entry-meta{padding-left:8px;text-align:left}.eael-grid-post .eael-entry-meta{display:flex;flex-direction:row}.eael-grid-post .eael-entry-footer .eael-entry-meta{flex-direction:column}.eael-entry-meta>div{font-size:12px;line-height:1.2;padding-bottom:5px}.eael-grid-post-excerpt p{margin:0;font-size:14px}.eael-entry-meta .eael-entry-footer .eael-posted-by{display:block}.eael-grid-post .eael-entry-footer,.eael-grid-post .eael-entry-wrapper{padding:15px}.eael-post-grid .eael-entry-header .eael-entry-meta span.eael-posted-on{padding-left:5px}.eael-post-grid .eael-entry-header .eael-entry-meta span.eael-posted-on::before{content:'\f111';font-family:FontAwesome;color:inherit;opacity:.4;font-size:.8em;padding-right:7px}.eael-entry-media{position:relative}.eael-entry-overlay{display:flex;align-items:center;justify-content:center}.eael-entry-overlay>i{color:#fff}.eael-entry-overlay.fade-in{visibility:hidden;opacity:0;transition:.3s}.eael-entry-media:hover .eael-entry-overlay.fade-in{visibility:visible;opacity:1}.eael-entry-media:hover .eael-entry-overlay.fade-in>i{transform:translate(0);opacity:1}.eael-entry-overlay.zoom-in{transform:scale(.9);visibility:hidden;opacity:0;transition:.3s}.eael-entry-media:hover .eael-entry-overlay.zoom-in{visibility:visible;opacity:1;transform:scale(1)}.eael-entry-overlay.slide-up{transform:translateY(100%);visibility:hidden;opacity:0;transition:.3s}.eael-entry-media:hover .eael-entry-overlay.slide-up{transform:translateY(0);visibility:visible;opacity:1}.eael-entry-media{overflow:hidden}.eael-entry-media.grid-hover-style-fade-in .eael-entry-overlay{opacity:0}.eael-entry-media.grid-hover-style-fade-in:hover .eael-entry-overlay{opacity:1}.eael-entry-media.grid-hover-style-none .eael-entry-overlay{display:none}.eael-entry-media.grid-hover-style-zoom-in .eael-entry-overlay{transform:scale(.4);opacity:0}.eael-entry-media.grid-hover-style-zoom-in:hover .eael-entry-overlay{transform:scale(1);opacity:1}.eael-entry-media.grid-hover-style-animate-down .eael-entry-overlay{transform:translateY(-100%)}.eael-entry-media.grid-hover-style-animate-down .eael-entry-overlay>i{transform:translateY(-100px);transition-delay:.1s;transition-duration:.3s}.eael-entry-media.grid-hover-style-animate-down:hover .eael-entry-overlay{transform:translate(0)}.eael-entry-media.grid-hover-style-animate-down:hover .eael-entry-overlay>i{transform:translateY(0)}.eael-entry-media.grid-hover-style-animate-up .eael-entry-overlay{transform:translateY(100%);visibility:hidden;opacity:0}.eael-entry-media.grid-hover-style-animate-up .eael-entry-overlay>i{transform:translateY(100px);transition-delay:.1s;transition-duration:.3s}.eael-entry-media.grid-hover-style-animate-up:hover .eael-entry-overlay{transform:translate(0);visibility:visible;opacity:1}.eael-entry-media.grid-hover-style-animate-up:hover .eael-entry-overlay>i{transform:translateY(0)}.eael-col-1 .eael-post-grid-column{float:none;width:100%}.eael-col-2 .eael-post-grid-column{float:left;width:50%}.eael-col-3 .eael-post-grid-column{float:left;width:33.3333%}.eael-col-4 .eael-post-grid-column{float:left;width:25%}.eael-col-5 .eael-post-grid-column{float:left;width:20%}.eael-col-6 .eael-post-grid-column{float:left;width:16.6666%}@media only screen and (max-width:979px){.eael-col-1 .eael-post-grid-column,.eael-col-2 .eael-post-grid-column,.eael-col-3 .eael-post-grid-column,.eael-col-4 .eael-post-grid-column,.eael-col-5 .eael-post-grid-column,.eael-col-6 .eael-post-grid-column{width:33.3333%}}@media only screen and (max-width:767px){.eael-col-1 .eael-post-grid-column,.eael-col-2 .eael-post-grid-column,.eael-col-3 .eael-post-grid-column,.eael-col-4 .eael-post-grid-column,.eael-col-5 .eael-post-grid-column,.eael-col-6 .eael-post-grid-column{width:50%}}@media only screen and (max-width:480px){.eael-col-1 .eael-post-grid-column,.eael-col-2 .eael-post-grid-column,.eael-col-3 .eael-post-grid-column,.eael-col-4 .eael-post-grid-column,.eael-col-5 .eael-post-grid-column,.eael-col-6 .eael-post-grid-column{float:none;width:100%}}.eael-author-avatar>a{display:block}.eael-entry-footer{overflow:hidden;display:flex}.eael-entry-footer>div{display:inline-block;float:left}
25
- body div.mfp-bg{top:0;left:0;width:100%;height:100%;z-index:1042;overflow:hidden;position:fixed;background:#0b0b0b;opacity:.8}.mfp-wrap{top:0;left:0;width:100%;height:100%;z-index:1043;position:fixed;outline:0!important;-webkit-backface-visibility:hidden;backface-visibility:hidden}.mfp-container{text-align:center;position:absolute;width:100%;height:100%;left:0;top:0;padding:0 8px;box-sizing:border-box}.mfp-container:before{content:'';display:inline-block;height:100%;vertical-align:middle}.mfp-align-top .mfp-container:before{display:none}.mfp-content{position:relative;display:inline-block;vertical-align:middle;margin:0 auto;text-align:left;z-index:1045}.mfp-ajax-holder .mfp-content,.mfp-inline-holder .mfp-content{width:100%;cursor:auto}.mfp-ajax-cur{cursor:progress}.mfp-zoom-out-cur,.mfp-zoom-out-cur .mfp-image-holder .mfp-close{cursor:zoom-out}.mfp-zoom{cursor:pointer;cursor:zoom-in}.mfp-auto-cursor .mfp-content{cursor:auto}.mfp-arrow,.mfp-close,.mfp-counter,.mfp-preloader{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.mfp-loading.mfp-figure{display:none}.mfp-hide{display:none!important}.mfp-preloader{color:#ccc;position:absolute;top:50%;width:auto;text-align:center;margin-top:-.8em;left:8px;right:8px;z-index:1044}.mfp-preloader a{color:#ccc}.mfp-preloader a:hover{color:#fff}.mfp-s-ready .mfp-preloader{display:none}.mfp-s-error .mfp-content{display:none}button.mfp-arrow,button.mfp-close{overflow:visible;cursor:pointer;background:0 0;border:0;-webkit-appearance:none;display:block;outline:0;padding:0;z-index:1046;box-shadow:none;touch-action:manipulation}button::-moz-focus-inner{padding:0;border:0}.mfp-close{width:44px;height:44px;line-height:44px;position:absolute;right:0;top:0;text-decoration:none;text-align:center;opacity:.65;padding:0 0 18px 10px;color:#fff;font-style:normal;font-size:28px;font-family:Arial,Baskerville,monospace}.mfp-close:focus,.mfp-close:hover{opacity:1}.mfp-close:active{top:1px}.mfp-close-btn-in .mfp-close{color:#333}.mfp-iframe-holder .mfp-close,.mfp-image-holder .mfp-close{color:#fff;right:-6px;text-align:right;padding-right:6px;width:100%}.mfp-counter{position:absolute;top:0;right:0;color:#ccc;font-size:12px;line-height:18px;white-space:nowrap}.mfp-arrow{position:absolute;opacity:.65;margin:0;top:50%;margin-top:-55px;padding:0;width:90px;height:110px;-webkit-tap-highlight-color:transparent}.mfp-arrow:active{margin-top:-54px}.mfp-arrow:focus,.mfp-arrow:hover{opacity:1}.mfp-arrow:after,.mfp-arrow:before{content:'';display:block;width:0;height:0;position:absolute;left:0;top:0;margin-top:35px;margin-left:35px;border:medium inset transparent}.mfp-arrow:after{border-top-width:13px;border-bottom-width:13px;top:8px}.mfp-arrow:before{border-top-width:21px;border-bottom-width:21px;opacity:.7}.mfp-arrow-left{left:0}.mfp-arrow-left:after{border-right:17px solid #fff;margin-left:31px}.mfp-arrow-left:before{margin-left:25px;border-right:27px solid #3f3f3f}.mfp-arrow-right{right:0}.mfp-arrow-right:after{border-left:17px solid #fff;margin-left:39px}.mfp-arrow-right:before{border-left:27px solid #3f3f3f}.mfp-iframe-holder{padding-top:40px;padding-bottom:40px}.mfp-iframe-holder .mfp-content{line-height:0;width:100%;max-width:900px}.mfp-iframe-holder .mfp-close{top:-40px}.mfp-iframe-scaler{width:100%;height:0;overflow:hidden;padding-top:56.25%}.mfp-iframe-scaler iframe{position:absolute;display:block;top:0;left:0;width:100%;height:100%;box-shadow:0 0 8px rgba(0,0,0,.6);background:#000}img.mfp-img{width:auto;max-width:100%;height:auto;display:block;line-height:0;box-sizing:border-box;padding:40px 0 40px;margin:0 auto}.mfp-figure{line-height:0}.mfp-figure:after{content:'';position:absolute;left:0;top:40px;bottom:40px;display:block;right:0;width:auto;height:auto;z-index:-1;box-shadow:0 0 8px rgba(0,0,0,.6);background:#444}.mfp-figure small{color:#bdbdbd;display:block;font-size:12px;line-height:14px}.mfp-figure figure{margin:0}.mfp-bottom-bar{margin-top:-36px;position:absolute;top:100%;left:0;width:100%;cursor:auto}.mfp-title{text-align:left;line-height:18px;color:#f3f3f3;word-wrap:break-word;padding-right:36px}.mfp-image-holder .mfp-content{max-width:100%}.mfp-gallery .mfp-image-holder .mfp-figure{cursor:pointer}button.mfp-close,button.mfp-close:hover{display:inline-block!important;background:0 0;width:auto!important}.mfp-arrow,.mfp-arrow:hover{background:0 0}@media screen and (max-width:800px) and (orientation:landscape),screen and (max-height:300px){.mfp-img-mobile .mfp-image-holder{padding-left:0;padding-right:0}.mfp-img-mobile img.mfp-img{padding:0}.mfp-img-mobile .mfp-figure:after{top:0;bottom:0}.mfp-img-mobile .mfp-figure small{display:inline;margin-left:5px}.mfp-img-mobile .mfp-bottom-bar{background:rgba(0,0,0,.6);bottom:0;margin:0;top:auto;padding:3px 5px;position:fixed;box-sizing:border-box}.mfp-img-mobile .mfp-bottom-bar:empty{padding:0}.mfp-img-mobile .mfp-counter{right:5px;top:3px}.mfp-img-mobile .mfp-close{top:0;right:0;width:35px;height:35px;line-height:35px;background:rgba(0,0,0,.6);position:fixed;text-align:center;padding:0}}@media all and (max-width:900px){.mfp-arrow{transform:scale(.75)}.mfp-arrow-left{transform-origin:0}.mfp-arrow-right{transform-origin:100%}.mfp-container{padding-left:6px;padding-right:6px}}
26
- .eael-infobox .infobox-icon{height:auto}.eael-infobox .infobox-icon .infobox-icon-wrap{display:flex;width:100%;height:auto;transition:.3s;align-items:center;justify-content:center}.eael-infobox .infobox-icon .infobox-icon-wrap i{transition:.3s}.eael-infobox-content-align-left .eael-infobox .infobox-button,.eael-infobox-content-align-left .eael-infobox .infobox-content,.eael-infobox-content-align-left .eael-infobox .infobox-icon{text-align:left}.eael-infobox-content-align-right .eael-infobox .infobox-button,.eael-infobox-content-align-right .eael-infobox .infobox-content,.eael-infobox-content-align-right .eael-infobox .infobox-icon{text-align:right}.eael-infobox-content-align-center .eael-infobox .infobox-button,.eael-infobox-content-align-center .eael-infobox .infobox-content,.eael-infobox-content-align-center .eael-infobox .infobox-icon{text-align:center}.eael-infobox-icon-bg-shape-circle .infobox-icon .infobox-icon-wrap,.eael-infobox-icon-bg-shape-radius .infobox-icon .infobox-icon-wrap,.eael-infobox-icon-bg-shape-square .infobox-icon .infobox-icon-wrap{width:90px;height:90px;text-align:center}.eael-infobox-icon-hover-bg-shape-square:hover .infobox-icon .infobox-icon-wrap{border-radius:0}.eael-infobox-icon-bg-shape-radius .infobox-icon .infobox-icon-wrap,.eael-infobox-icon-hover-bg-shape-radius:hover .infobox-icon .infobox-icon-wrap{border-radius:15px}.eael-infobox-icon-bg-shape-radius .infobox-icon .infobox-icon-wrap{display:flex;align-items:center;justify-content:center}.eael-infobox-icon-bg-shape-circle .infobox-icon .infobox-icon-wrap,.eael-infobox-icon-hover-bg-shape-circle:hover .infobox-icon .infobox-icon-wrap{border-radius:50%}.eael-infobox-icon-bg-shape-circle .infobox-icon .infobox-icon-wrap i,.eael-infobox-icon-bg-shape-square .infobox-icon .infobox-icon-wrap i{margin-top:50%;transform:translateY(-50%)}.eael-infobox .infobox-button a.eael-infobox-button{display:inline-block;padding:5px 10px;transition:all .3s ease-in-out 0s}.eael-infobox-content-align-left.eael-infobox-icon-bg-shape-circle .infobox-icon,.eael-infobox-content-align-left.eael-infobox-icon-bg-shape-radius .infobox-icon,.eael-infobox-content-align-left.eael-infobox-icon-bg-shape-square .infobox-icon{display:flex;justify-content:flex-start}.eael-infobox-content-align-center.eael-infobox-icon-bg-shape-circle .infobox-icon,.eael-infobox-content-align-center.eael-infobox-icon-bg-shape-radius .infobox-icon,.eael-infobox-content-align-center.eael-infobox-icon-bg-shape-square .infobox-icon{display:flex;justify-content:center}.eael-infobox-content-align-right.eael-infobox-icon-bg-shape-circle .infobox-icon,.eael-infobox-content-align-right.eael-infobox-icon-bg-shape-radius .infobox-icon,.eael-infobox-content-align-right.eael-infobox-icon-bg-shape-square .infobox-icon{display:flex;justify-content:flex-end}.eael-infobox.icon-on-left{position:relative;z-index:0;display:flex}.eael-infobox.icon-on-left .infobox-icon-wrap,.eael-infobox.icon-on-right .infobox-icon-wrap{justify-content:center;display:flex!important;align-items:center}.eael-infobox.icon-on-left .infobox-icon .infobox-icon-wrap{background:0 0;border:0;text-align:left;height:auto;display:block}.eael-infobox .infobox-content p{margin:0 0 15px}.eael-infobox.icon-on-left .infobox-icon .infobox-icon-wrap i{margin-top:0;transform:translateY(0)}.eael-infobox.icon-on-left .infobox-content{padding-left:15px;flex:1 1 auto}.eael-infobox.icon-on-left .infobox-content .title{line-height:1;margin:0 0 10px 0}.eael-infobox.icon-on-right{position:relative;z-index:0;display:flex;flex-direction:row-reverse}.eael-infobox.icon-on-right .infobox-icon .infobox-icon-wrap{background:0 0;border:0;text-align:right;width:auto;height:auto;display:block}.eael-infobox.icon-on-right .infobox-icon .infobox-icon-wrap i{margin-top:0;transform:translateY(0)}.eael-infobox.icon-on-right .infobox-content{padding-right:15px;text-align:right;flex:1 1 auto;box-sizing:border-box}.eael-infobox.icon-on-right .infobox-content .title{line-height:1;margin:0 0 10px 0}.eael-infobox .infobox-icon img{transition:all .3s ease-in-out 0s}.eael-infobox-hover-img-shape-square:hover .eael-infobox .infobox-icon img{border-radius:0}.eael-infobox-hover-img-shape-circle:hover .eael-infobox .infobox-icon img,.eael-infobox-shape-circle .eael-infobox .infobox-icon img{border-radius:50%}.eael-infobox-hover-img-shape-radius:hover .eael-infobox .infobox-icon img,.eael-infobox-shape-radius .eael-infobox .infobox-icon img{border-radius:15px}
27
  .eael-post-timeline{margin-bottom:0;min-height:100%;overflow:hidden;position:relative}.eael-timeline-column{width:50%;margin-left:0;float:left;margin-top:0!important}.eael-timeline-post{position:relative}.eael-timeline-post:after{background-color:rgba(83,85,86,.2);content:"";width:2px;height:245px;position:absolute;right:0;top:70px}.eael-timeline-post:nth-child(2n):after{display:none}.eael-timeline-bullet{background-color:#9fa9af;border:5px solid #fff;border-radius:50%;box-shadow:0 1px 0 1px rgba(0,0,0,.1);content:"";height:20px;position:absolute;right:-9px;top:60px;width:20px;z-index:3;cursor:pointer}.eael-timeline-post:nth-child(2n) .eael-timeline-bullet{background-color:#9fa9af;border:5px solid #fff;border-radius:50%;bottom:36px;content:"";height:20px;left:-11px;position:absolute;top:300px;width:20px;z-index:3}.eael-timeline-post-inner{background:linear-gradient(45deg,#3f3f46 0,#05abe0 100%) repeat scroll 0 0 transparent;border:8px solid #e5eaed;box-shadow:0 1px 3px 0 rgba(0,0,0,.15);float:right;margin:30px 40px 30px auto;position:relative;height:320px;width:calc(100% - 40px)}.eael-timeline-post:nth-child(even) .eael-timeline-post-inner{float:left;margin-left:40px}.eael-timeline-post-inner:after{border-color:transparent transparent transparent #e5eaed;border-style:solid;border-width:15px;content:"";height:0;position:absolute;right:-36px;top:17px;width:0}.eael-timeline-post:nth-child(2n) .eael-timeline-post-inner:after{border-color:transparent #e5eaed transparent transparent;border-style:solid;border-width:15px;content:"";height:0;left:-36px;position:absolute;top:257px;width:0}.eael-timeline-post:nth-child(2n) .eael-timeline-post-inner::after{border-left-color:transparent!important}.eael-timeline-post p{margin:1.6rem 0 0 0;font-size:.9em;line-height:1.6em}.eael-timeline-post-image{background-size:cover;background-position:center center;background-repeat:no-repeat;display:block;height:100%;overflow:hidden;position:relative;opacity:.6;transition:all .3s}.eael-timeline-post-title{bottom:40px;position:absolute;width:100%}.eael-timeline-post-title h2{color:#fff;font-size:20px;font-weight:700;letter-spacing:1px;line-height:24px;padding:0 25px;text-align:left;text-transform:uppercase}.eael-timeline-post-excerpt{opacity:0;position:absolute;top:0;left:0;transition:all .3s}.eael-timeline-post-excerpt p{color:#fff;font-size:14px;padding:25px}.eael-timeline-post-inner:hover .eael-timeline-post-excerpt{opacity:1;top:10px}.eael-timeline-post-inner:hover .eael-timeline-post-image{opacity:.3}.eael-timeline-post time{opacity:0;background-color:rgba(0,0,0,.7);color:#fff;font-size:10px;border-radius:20px;position:absolute;right:-97px;width:100px;height:30px;line-height:30px;text-align:center;top:50px;z-index:99;transition:all .5s}.eael-timeline-post:nth-child(2n) time{background-color:rgba(0,0,0,.7);border-radius:20px;color:#fff;font-size:10px;height:30px;left:-99px;line-height:30px;position:absolute;text-align:center;top:290px;width:100px;z-index:99}.eael-timeline-post time:before{border-bottom:5px solid rgba(0,0,0,.7);border-left:5px solid transparent;border-right:5px solid transparent;content:"";height:0;left:45px;position:absolute;top:-5px;width:0}.eael-timeline-post:hover time{opacity:1}.eael-timeline-post::after{height:100%}.eael-post-timeline .eael-timeline-post:nth-last-child(2)::after{height:245px}.eael-post-timeline .eael-timeline-post:last-child::after{display:none}.eael-load-more-button-wrap{display:flex}@media only screen and (max-width:1366px){.eael-timeline-post-title h2{font-size:.8em}.eael-timeline-post-excerpt p{font-size:13px}}@media only screen and (max-width:1169px){.eael-timeline-post-inner{height:320px}}@media only screen and (max-width:992px){.eael-post-timeline{margin-left:0}.eael-timeline-bullet,.eael-timeline-post-inner:after,.eael-timeline-post:after,.eael-timeline-post:before{display:none}.eael-timeline-post{display:inline-block;float:left!important;width:50%!important;margin:15px auto}.eael-timeline-post-inner{height:320px;padding-bottom:30px}.eael-timeline-post-title{bottom:50px}.eael-timeline-post-title h2{font-size:.8em;line-height:1.2em}.eael-timeline-post .eael-timeline-post-inner{margin:0 10px auto 0;width:90%}.eael-timeline-post:nth-child(2n) .eael-timeline-post-inner{margin:0 auto 0 10px;width:90%}.eael-timeline-post-excerpt{opacity:0!important}.eael-timeline-post-image{opacity:.3}.eael-timeline-post time,.eael-timeline-post:nth-child(2n) time{background-color:#fff;border-radius:0;color:#444;font-size:12px;text-transform:uppercase;left:0;opacity:1;padding-top:3px;top:275px;width:100%}time:before{display:none}}@media only screen and (max-width:767px){.eael-timeline-post{display:block;float:none!important;margin:20px auto;width:100%!important}.eael-timeline-post .eael-timeline-post-inner,.eael-timeline-post:nth-child(2n) .eael-timeline-post-inner{display:block;float:none;margin:0 auto}}@media only screen and (max-width:479px){.eael-timeline-post .eael-timeline-post-inner,.eael-timeline-post:nth-child(2n) .eael-timeline-post-inner{height:250px;margin:0 auto;width:95%}.eael-timeline-post time,.eael-timeline-post:nth-child(2n) time{top:205px}}
28
  .eael-pricing{-webkit-display:flex;display:flex;justify-content:center;align-items:center}.eael-pricing .eael-pricing-item{width:100%;height:auto;margin:0}.eael-pricing .eael-pricing-button{display:inline-block;padding:12px 25px;background:#00c853;font-size:14px;font-weight:600;color:#fff;text-transform:uppercase;text-decoration:none;transition:.3s;border-radius:4px}.eael-pricing .eael-pricing-button:hover{background:#03b048}.eael-pricing .eael-pricing-item ul{padding:0;margin:0;list-style:none}.eael-pricing .eael-pricing-item ul li.disable-item{text-decoration:line-through;opacity:.5}.eael-pricing .eael-pricing-item ul li span.li-icon{color:#00c853;margin-right:6px}.eael-pricing .eael-pricing-item ul li.disable-item span.li-icon{color:#ef5350}.eael-pricing.style-1{position:relative;z-index:0;text-align:center}.eael-pricing.style-1 .eael-pricing-item{border:1px solid rgba(9,9,9,.1);padding:30px;border-radius:5px;transition:.5s}.eael-pricing.style-1 .eael-pricing-item:hover{box-shadow:0 14px 28px rgba(0,0,0,.25),0 10px 10px rgba(0,0,0,.22)}.eael-pricing.style-1 .eael-pricing-item.featured{position:relative}.eael-pricing.style-1 .eael-pricing-item.ribbon-1:before{content:"";position:absolute;width:100%;height:3px;background:#00c853;top:0;left:0;right:0;z-index:1;border-radius:5px 5px 0 0}.eael-pricing.style-1 .eael-pricing-item.ribbon-2:before{content:"Featured";position:absolute;width:auto;background:#00c853;color:#fff;top:35px;right:-15px;z-index:10;font-size:10px;font-weight:600;text-transform:uppercase;padding:5px 10px}.eael-pricing.style-1 .eael-pricing-item.ribbon-2:after{content:"";position:absolute;top:20px;right:-15px;width:0;height:0;border-bottom:15px solid #00c853;border-right:15px solid transparent;z-index:9;opacity:.9}.eael-pricing.style-1 .eael-pricing-item.ribbon-3:before{content:"Featured";position:absolute;width:auto;background:rgba(0,0,0,.6);color:#fff;top:15px;right:15px;z-index:10;font-size:11px;font-weight:600;text-transform:uppercase;padding:5px 15px}.eael-pricing.style-1 .eael-pricing-item .header{display:block;position:relative;z-index:0;padding-bottom:15px;margin-bottom:15px}.eael-pricing.style-1 .eael-pricing-item .header:after{content:"";position:absolute;width:140px;height:1px;bottom:0;left:0;right:0;margin:0 auto;z-index:1;background:rgba(9,9,9,.1)}.eael-pricing.style-1 .eael-pricing-item .header .title{font-weight:700;line-height:30px;margin:0}.eael-pricing.style-1 .eael-pricing-item .eael-pricing-tag{position:relative;z-index:0;padding:15px 0;margin-bottom:15px}.eael-pricing.style-1 .eael-pricing-item .eael-pricing-tag:after{content:"";position:absolute;width:140px;height:1px;bottom:0;left:0;right:0;margin:0 auto;z-index:1;background:rgba(9,9,9,.04)}.eael-pricing.style-1 .eael-pricing-item .price-tag{position:relative;display:inline-block;font-size:28px;font-weight:500;line-height:0;margin:0 auto}.eael-pricing.style-1 .eael-pricing-item .price-tag .price-currency{font-size:24px;font-weight:700}.eael-pricing.style-1 .eael-pricing-item .price-period{color:#999}.eael-pricing.style-1 .eael-pricing-item .body ul{display:block;width:100%;margin-bottom:15px}.eael-pricing.style-1 .eael-pricing-item .body ul li{display:block;width:100%;height:auto;padding:10px 0;font-size:14px;color:#6d6d6d;border-bottom:1px solid rgba(9,9,9,.04)}.eael-pricing.style-1 .eael-pricing-item .body ul li:last-child{border:none}.eael-pricing.style-1 .eael-pricing-item.featured-large{padding:60px 0}.eael-pricing.style-2{position:relative;z-index:0;text-align:center}.eael-pricing.style-2 .eael-pricing-item{padding:30px 0;border-radius:5px;margin:0;border:1px solid rgba(9,9,9,.1)}.eael-pricing.style-2 .eael-pricing-item.featured{box-shadow:0 14px 28px rgba(0,0,0,.25),0 10px 10px rgba(0,0,0,.22)}.eael-pricing.style-2 .eael-pricing-item.ribbon-1:before{content:"";position:absolute;width:100%;height:3px;background:#00c853;top:0;left:0;right:0;z-index:1;border-radius:5px 5px 0 0}.eael-pricing.style-2 .eael-pricing-item.ribbon-2:before{content:"Featured";position:absolute;width:auto;background:#00c853;color:#fff;top:35px;right:-15px;z-index:10;font-size:10px;font-weight:600;text-transform:uppercase;padding:5px 10px}.eael-pricing.style-2 .eael-pricing-item.ribbon-2:after{content:"";position:absolute;top:20px;right:-15px;width:0;height:0;border-bottom:15px solid #00c853;border-right:15px solid transparent;z-index:9;opacity:.9}.eael-pricing.style-2 .eael-pricing-item.ribbon-3:before{content:"Featured";position:absolute;width:auto;background:rgba(0,0,0,.6);color:#fff;top:15px;right:15px;z-index:10;font-size:11px;font-weight:600;text-transform:uppercase;padding:5px 15px}.eael-pricing.style-2 .eael-pricing-item .eael-pricing-icon .icon{display:inline-block;position:relative;width:80px;height:80px;background:#00c853;border-radius:50%;margin-bottom:30px;transition:.5s;overflow:hidden}.eael-pricing.style-2 .eael-pricing-item .eael-pricing-icon,.eael-pricing.style-2 .eael-pricing-item .eael-pricing-icon .icon{display:flex;align-items:center;justify-content:center}.eael-pricing.style-2 .eael-pricing-item .eael-pricing-icon .icon i{font-size:30px;color:#fff;transition:.5s}.eael-pricing.style-2 .eael-pricing-item:hover .eael-pricing-icon .icon{background:#43a047}.eael-pricing.style-2 .eael-pricing-item:hover .eael-pricing-icon .icon i{color:#fff}.eael-pricing.style-2 .eael-pricing-item .header{background:#c8e6c9;padding:25px 30px;margin-bottom:15px;position:relative;z-index:0}.eael-pricing.style-2 .eael-pricing-item.featured .header:after{content:"";position:absolute;width:100%;height:100%;top:0;left:0;right:0;bottom:0;z-index:-1;background:rgba(255,255,255,.4)}.eael-pricing.style-2 .eael-pricing-item .header .title{font-size:28px;font-weight:700;line-height:40px;margin:0}.eael-pricing.style-2 .eael-pricing-item .header .subititle{font-size:14px;font-weight:600;color:#6d6d6d}.eael-pricing.style-2 .eael-pricing-item .eael-pricing-tag{position:relative;z-index:0;padding:15px 0;margin-bottom:15px}.eael-pricing.style-2 .eael-pricing-item .eael-pricing-tag:after{content:"";position:absolute;width:140px;height:1px;bottom:0;left:0;right:0;margin:0 auto;z-index:1;background:rgba(9,9,9,.04)}.eael-pricing.style-2 .eael-pricing-item .price-tag{position:relative;display:inline-block;font-size:28px;font-weight:500;line-height:0;margin:0 auto}.eael-pricing.style-2 .eael-pricing-item .price-tag .price-currency{font-size:24px;font-weight:700;color:#00c853}.eael-pricing.style-2 .eael-pricing-item .price-period{color:#999}.eael-pricing.style-2 .eael-pricing-item .body ul{display:block;width:100%;margin-bottom:15px}.eael-pricing.style-2 .eael-pricing-item .body ul li{display:block;width:100%;height:auto;padding:10px 15px;font-size:14px;color:#6d6d6d;border-bottom:1px solid rgba(9,9,9,.04)}.eael-pricing.style-2 .eael-pricing-item .body ul li:last-child{border:none}@media only screen and (min-width:768px) and (max-width:992px){.eael-pricing{display:block}.eael-pricing .eael-pricing-item,.eael-pricing.style-2 .eael-pricing-item,.eael-pricing.style-4 .eael-pricing-item{width:100%;margin:0 auto 30px auto}}@media only screen and (max-width:480px){.eael-pricing{display:block}.eael-pricing .eael-pricing-item{width:100%}.eael-pricing .eael-pricing-item,.eael-pricing.style-2 .eael-pricing-item,.eael-pricing.style-4 .eael-pricing-item{margin:0 auto 30px auto}}.eael-pricing-content-align-center .eael-pricing{text-align:center}.eael-pricing-content-align-left .eael-pricing{text-align:left}.eael-pricing-content-align-right .eael-pricing{text-align:right}.eael-pricing-content-align-left .eael-pricing.style-2 .eael-pricing-item .price-tag{padding-left:45px}.eael-pricing-content-align-left .eael-pricing.style-2 .eael-pricing-item .price-tag:before{left:30px}.eael-pricing-content-align-right .eael-pricing.style-2 .eael-pricing-item .eael-pricing-tag{padding-right:30px}.eael-pricing-content-align-left .eael-pricing.style-2 .eael-pricing-item .footer,.eael-pricing-content-align-left .eael-pricing.style-2 .eael-pricing-item .header,.eael-pricing-content-align-left .eael-pricing.style-4 .eael-pricing-item .footer,.eael-pricing-content-align-left .eael-pricing.style-4 .eael-pricing-item .header{padding-left:30px;padding-right:30px}.eael-pricing-content-align-right .eael-pricing.style-2 .eael-pricing-item .footer,.eael-pricing-content-align-right .eael-pricing.style-2 .eael-pricing-item .header,.eael-pricing-content-align-right .eael-pricing.style-4 .eael-pricing-item .footer,.eael-pricing-content-align-right .eael-pricing.style-4 .eael-pricing-item .header{padding-right:30px;padding-left:30px}.eael-pricing-content-align-left .eael-pricing.style-2 .eael-pricing-item .body ul li,.eael-pricing-content-align-left .eael-pricing.style-4 .eael-pricing-item .body ul li{padding-left:30px}.eael-pricing-content-align-right .eael-pricing.style-2 .eael-pricing-item .body ul li,.eael-pricing-content-align-right .eael-pricing.style-4 .eael-pricing-item .body ul li{padding-right:30px}.eael-pricing-content-align-left .eael-pricing.style-3 .eael-pricing-item .header:after{transform:translateX(-80%)}.eael-pricing-content-align-right .eael-pricing.style-3 .eael-pricing-item .header:after{transform:translateX(80%)}.eael-pricing-content-align-left .eael-pricing.style-3 .eael-pricing-item:hover .header:after,.eael-pricing-content-align-right .eael-pricing.style-3 .eael-pricing-item:hover .header:after{transform:translateX(0)}.eael-pricing-content-align-left .eael-pricing.style-1 .eael-pricing-item .eael-pricing-tag:after,.eael-pricing-content-align-left .eael-pricing.style-1 .eael-pricing-item .header:after,.eael-pricing-content-align-left .eael-pricing.style-2 .eael-pricing-item .eael-pricing-tag:after,.eael-pricing-content-align-right .eael-pricing.style-1 .eael-pricing-item .eael-pricing-tag:after,.eael-pricing-content-align-right .eael-pricing.style-1 .eael-pricing-item .header:after,.eael-pricing-content-align-right .eael-pricing.style-2 .eael-pricing-item .eael-pricing-tag:after{margin:0;width:100%}.eael-pricing-button-align-right .eael-pricing.style-1 .footer,.eael-pricing-button-align-right .eael-pricing.style-2 .footer,.eael-pricing-button-align-right .eael-pricing.style-3 .footer,.eael-pricing-button-align-right .eael-pricing.style-4 .footer{text-align:right}.eael-pricing-button-align-center .eael-pricing.style-1 .footer,.eael-pricing-button-align-center .eael-pricing.style-2 .footer,.eael-pricing-button-align-center .eael-pricing.style-3 .footer,.eael-pricing-button-align-center .eael-pricing.style-4 .footer{text-align:center}.eael-pricing-button-align-left .eael-pricing.style-1 .footer,.eael-pricing-button-align-left .eael-pricing.style-2 .footer,.eael-pricing-button-align-left .eael-pricing.style-3 .footer,.eael-pricing-button-align-left .eael-pricing.style-4 .footer{text-align:left}.eael-pricing-content-align-center.eael-pricing-button-align-right .eael-pricing.style-2 .footer,.eael-pricing-content-align-center.eael-pricing-button-align-right .eael-pricing.style-4 .footer{padding-right:30px}.eael-pricing-content-align-center.eael-pricing-button-align-left .eael-pricing.style-2 .footer,.eael-pricing-content-align-center.eael-pricing-button-align-left .eael-pricing.style-4 .footer{padding-left:30px}.only-in-pro{width:100%;-webkit-display:flex;display:flex;align-items:center;justify-content:center;padding:15px;min-width:200px;background:#ef5350;color:#fff;text-align:center}.only-in-pro .title{font-family:Roboto,sans-serif;font-size:24px;line-height:40px;margin:0}div.tooltipster-sidetip.tooltipster-base.tooltipster-right .tooltipster-arrow{position:absolute;top:50%}div.tooltipster-sidetip.tooltipster-top div.tooltipster-box{margin-bottom:0!important}div.tooltipster-sidetip.tooltipster-bottom div.tooltipster-box{margin-top:0!important}.tooltipster-base.tooltipster-sidetip.tooltipster-top .tooltipster-arrow{top:auto;bottom:-8px}div.tooltipster-sidetip.tooltipster-bottom .tooltipster-arrow{top:-8px;bottom:auto}@media only screen and (max-width:480px){.eael-pricing.style-1 .eael-pricing-item .price-tag{display:block}}
29
- .eael-post-grid .woocommerce ul.products,.eael-product-grid .woocommerce ul.products{display:grid;grid-gap:25px;margin:0!important;padding:0!important}.eael-post-grid .woocommerce ul.products:after,.eael-post-grid .woocommerce ul.products:before,.eael-product-grid .woocommerce ul.products:after,.eael-product-grid .woocommerce ul.products:before{display:none}.eael-post-grid .woocommerce ul.products .product,.eael-product-grid .woocommerce ul.products .product{width:100%;margin:0;padding:0}.eael-post-grid .woocommerce ul.products.eael-product-columns-1,.eael-product-grid .woocommerce ul.products.eael-product-columns-1{grid-template-columns:100%}.eael-post-grid .woocommerce ul.products.eael-product-columns-2,.eael-product-grid .woocommerce ul.products.eael-product-columns-2{grid-template-columns:repeat(2,1fr)}@media screen and (max-width:480px){.eael-post-grid .woocommerce ul.products.eael-product-columns-2,.eael-product-grid .woocommerce ul.products.eael-product-columns-2{grid-template-columns:repeat(1,1fr)}}.eael-post-grid .woocommerce ul.products.eael-product-columns-3,.eael-product-grid .woocommerce ul.products.eael-product-columns-3{grid-template-columns:repeat(3,1fr)}@media screen and (max-width:767px){.eael-post-grid .woocommerce ul.products.eael-product-columns-3,.eael-product-grid .woocommerce ul.products.eael-product-columns-3{grid-template-columns:repeat(2,1fr)}}@media screen and (max-width:480px){.eael-post-grid .woocommerce ul.products.eael-product-columns-3,.eael-product-grid .woocommerce ul.products.eael-product-columns-3{grid-template-columns:repeat(1,1fr)}}.eael-post-grid .woocommerce ul.products.eael-product-columns-4,.eael-product-grid .woocommerce ul.products.eael-product-columns-4{grid-template-columns:repeat(4,1fr)}@media screen and (max-width:767px){.eael-post-grid .woocommerce ul.products.eael-product-columns-4,.eael-product-grid .woocommerce ul.products.eael-product-columns-4{grid-template-columns:repeat(2,1fr)}}@media screen and (max-width:480px){.eael-post-grid .woocommerce ul.products.eael-product-columns-4,.eael-product-grid .woocommerce ul.products.eael-product-columns-4{grid-template-columns:repeat(1,1fr)}}.eael-post-grid .woocommerce ul.products.eael-product-columns-5,.eael-product-grid .woocommerce ul.products.eael-product-columns-5{grid-template-columns:repeat(5,1fr)}@media screen and (max-width:767px){.eael-post-grid .woocommerce ul.products.eael-product-columns-5,.eael-product-grid .woocommerce ul.products.eael-product-columns-5{grid-template-columns:repeat(2,1fr)}}@media screen and (max-width:480px){.eael-post-grid .woocommerce ul.products.eael-product-columns-5,.eael-product-grid .woocommerce ul.products.eael-product-columns-5{grid-template-columns:repeat(1,1fr)}}.eael-post-grid .woocommerce ul.products.eael-product-columns-6,.eael-product-grid .woocommerce ul.products.eael-product-columns-6{grid-template-columns:repeat(6,1fr)}@media screen and (max-width:767px){.eael-post-grid .woocommerce ul.products.eael-product-columns-6,.eael-product-grid .woocommerce ul.products.eael-product-columns-6{grid-template-columns:repeat(2,1fr)}}@media screen and (max-width:480px){.eael-post-grid .woocommerce ul.products.eael-product-columns-6,.eael-product-grid .woocommerce ul.products.eael-product-columns-6{grid-template-columns:repeat(1,1fr)}}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product,.eael-post-grid.eael-product-simple .woocommerce ul.products li.product,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product,.eael-product-grid.eael-product-simple .woocommerce ul.products li.product{position:relative;float:left;overflow:hidden;text-align:center;padding:0;border-radius:0;background-color:#fff;box-shadow:none}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product a,.eael-post-grid.eael-product-simple .woocommerce ul.products li.product a,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product a,.eael-product-grid.eael-product-simple .woocommerce ul.products li.product a{text-decoration:none}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product a:hover,.eael-post-grid.eael-product-simple .woocommerce ul.products li.product a:hover,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product a:hover,.eael-product-grid.eael-product-simple .woocommerce ul.products li.product a:hover{outline:0;box-shadow:none}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product img,.eael-post-grid.eael-product-simple .woocommerce ul.products li.product img,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product img,.eael-product-grid.eael-product-simple .woocommerce ul.products li.product img{width:100%;height:auto;-webkit-backface-visibility:hidden;backface-visibility:hidden}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product .woocommerce-loop-product__title,.eael-post-grid.eael-product-simple .woocommerce ul.products li.product .woocommerce-loop-product__title,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product .woocommerce-loop-product__title,.eael-product-grid.eael-product-simple .woocommerce ul.products li.product .woocommerce-loop-product__title{font-size:16px;font-weight:700;line-height:1;color:#333;margin:25px 0 12px;padding:0}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product .onsale,.eael-post-grid.eael-product-simple .woocommerce ul.products li.product .onsale,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product .onsale,.eael-product-grid.eael-product-simple .woocommerce ul.products li.product .onsale{display:block;line-height:170px;font-size:13px;text-align:center;letter-spacing:0;text-shadow:0 1px 1px rgba(0,0,0,.6);text-transform:uppercase;color:#fff;background-color:#ff2a13;border-radius:0;border:none;box-shadow:none;position:absolute;height:100px;width:200px;z-index:1;left:-100px;top:-50px;right:auto;margin:0;padding:0;transform:rotate(-45deg)}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product .price,.eael-post-grid.eael-product-simple .woocommerce ul.products li.product .price,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product .price,.eael-product-grid.eael-product-simple .woocommerce ul.products li.product .price{font-size:14px;margin-bottom:0}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product .price del,.eael-post-grid.eael-product-simple .woocommerce ul.products li.product .price del,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product .price del,.eael-product-grid.eael-product-simple .woocommerce ul.products li.product .price del{opacity:.5;display:inline-block}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product .price ins,.eael-post-grid.eael-product-simple .woocommerce ul.products li.product .price ins,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product .price ins,.eael-product-grid.eael-product-simple .woocommerce ul.products li.product .price ins{font-weight:400;background-color:transparent;color:#ff2a13}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product .star-rating,.eael-post-grid.eael-product-simple .woocommerce ul.products li.product .star-rating,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product .star-rating,.eael-product-grid.eael-product-simple .woocommerce ul.products li.product .star-rating{display:block;float:none;font-size:14px;margin:10px auto}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product .button.add_to_cart_button,.eael-post-grid.eael-product-simple .woocommerce ul.products li.product .button.add_to_cart_button,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product .button.add_to_cart_button,.eael-product-grid.eael-product-simple .woocommerce ul.products li.product .button.add_to_cart_button{display:block;font-size:14px;font-weight:400;line-height:38px;text-align:center;text-transform:uppercase;color:#fff;background-color:#333;padding:0;margin:15px;border-radius:0}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product .button.add_to_cart_button:focus,.eael-post-grid.eael-product-simple .woocommerce ul.products li.product .button.add_to_cart_button:focus,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product .button.add_to_cart_button:focus,.eael-product-grid.eael-product-simple .woocommerce ul.products li.product .button.add_to_cart_button:focus{outline:0}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product a.added_to_cart,.eael-post-grid.eael-product-simple .woocommerce ul.products li.product a.added_to_cart,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product a.added_to_cart,.eael-product-grid.eael-product-simple .woocommerce ul.products li.product a.added_to_cart{display:block;margin:0 0 15px 0;padding:0;font-size:14px;line-height:1;text-transform:capitalize;color:#333;background-color:transparent}.eael-post-grid.eael-product-simple .woocommerce ul.products li.product,.eael-product-grid.eael-product-simple .woocommerce ul.products li.product{border:1px solid #eee}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product{border:1px solid transparent}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product .button.add_to_cart_button,.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product a.added_to_cart,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product .button.add_to_cart_button,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product a.added_to_cart{visibility:hidden;transition:none}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product:hover,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product:hover{border:1px solid #eee}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product:hover .button.add_to_cart_button,.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product:hover a.added_to_cart,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product:hover .button.add_to_cart_button,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product:hover a.added_to_cart{visibility:visible}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product{position:relative;float:left;overflow:hidden;text-align:center;padding:0 0 15px 0;border-radius:0;background-color:#fff;box-shadow:none}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product a,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product a{text-decoration:none}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product a:hover,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product a:hover{outline:0;box-shadow:none}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product img,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product img{width:100%;height:auto;margin:0;-webkit-backface-visibility:hidden;backface-visibility:hidden}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay{position:relative;overflow:hidden;line-height:0}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .button-wrap,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .button-wrap{position:absolute;top:50%;left:0;right:0;text-align:center;transform:translateY(-50%)}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .add_to_cart_button,.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .added_to_cart,.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .product-link,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .add_to_cart_button,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .added_to_cart,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .product-link{display:inline-block;font-size:14px;line-height:38px;text-align:center;color:#fff;background-color:#333;width:38px;height:38px;border-style:none;border-radius:50%;vertical-align:middle;padding:0;margin:0 5px;transform:translateY(20px);opacity:0;transition:transform .2s,opacity .3s}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .add_to_cart_button:focus,.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .added_to_cart:focus,.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .product-link:focus,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .add_to_cart_button:focus,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .added_to_cart:focus,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .product-link:focus{outline:0}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .add_to_cart_button,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .add_to_cart_button{font-size:0}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .add_to_cart_button:before,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .add_to_cart_button:before{display:none}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .add_to_cart_button:after,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .add_to_cart_button:after{content:"\f217";font:normal normal normal 14px/1 FontAwesome;font-size:14px;line-height:38px;text-rendering:auto;-webkit-font-smoothing:antialiased;vertical-align:middle;margin:0;padding:0}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .add_to_cart_button.loading:before,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .add_to_cart_button.loading:before{display:none}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .add_to_cart_button.loading:after,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .add_to_cart_button.loading:after{content:"\f110";display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:14px;line-height:38px;color:#fff;height:auto;width:auto;position:relative;top:0;left:0;margin:0;padding:0}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .added_to_cart,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .added_to_cart{font-size:0}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .added_to_cart:after,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .added_to_cart:after{content:"\f06e";font:normal normal normal 14px/1 FontAwesome;font-size:14px;line-height:38px;color:#fff;text-rendering:auto;-webkit-font-smoothing:antialiased;vertical-align:middle;margin:0;padding:0}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .woocommerce-loop-product__title,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .woocommerce-loop-product__title{font-size:16px;font-weight:700;line-height:1;color:#333;margin:25px 0 12px;padding:0}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .onsale,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .onsale{display:block;line-height:170px;font-size:13px;text-align:center;letter-spacing:0;text-shadow:0 1px 1px rgba(0,0,0,.6);text-transform:uppercase;color:#fff;background-color:#ff2a13;border-radius:0;border:none;box-shadow:none;position:absolute;height:100px;width:200px;z-index:1;left:-100px;top:-50px;right:auto;margin:0;padding:0;transform:rotate(-45deg)}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .price,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .price{font-size:14px;margin-bottom:0}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .price del,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .price del{opacity:.5;display:inline-block}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .price ins,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .price ins{font-weight:400;background-color:transparent;color:#ff2a13}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .star-rating,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .star-rating{display:block;float:none;font-size:14px;margin:10px auto}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product:hover .overlay .add_to_cart_button,.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product:hover .overlay a,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product:hover .overlay .add_to_cart_button,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product:hover .overlay a{opacity:1;transform:translateY(0)}
30
  @-webkit-keyframes animateStripe{0%{transform:translate(0,0)}100%{transform:translate(35px,0)}}@keyframes animateStripe{0%{transform:translate(0,0)}100%{transform:translate(35px,0)}}@-webkit-keyframes animateStripeRTL{0%{transform:translate(0,0)}100%{transform:translate(-35px,0)}}@keyframes animateStripeRTL{0%{transform:translate(0,0)}100%{transform:translate(-35px,0)}}.eael-progressbar{position:relative}.eael-progressbar-title{font-size:20px;font-weight:400}.eael-progressbar-line{position:relative;display:block;width:100%;height:12px;background-color:#eee}.eael-progressbar-line .eael-progressbar-count-wrap{position:absolute;right:0;bottom:calc(100% + 5px);font-size:16px;font-weight:400;line-height:1}.eael-progressbar-line-fill{display:inline-block;position:absolute;top:50%;left:0;width:0;height:12px;background-color:#000;transform:translateY(-50%);transition:width 1.5s linear;overflow:hidden}.eael-progressbar-circle{position:relative;width:200px;height:200px}.eael-progressbar-circle .eael-progressbar-title{font-size:16px;font-weight:400}.eael-progressbar-circle .eael-progressbar-count-wrap{font-size:28px;font-weight:700}.eael-progressbar-circle-shadow{width:220px;height:220px;padding:10px;border-radius:50%}.eael-progressbar-circle-pie{position:absolute;top:0;left:0;width:100%;height:100%;-webkit-clip-path:inset(0 0 0 50%);clip-path:inset(0 0 0 50%)}.eael-progressbar-circle-inner{height:100%;width:100%;border-width:12px;border-style:solid;border-color:#eee;border-radius:50%}.eael-progressbar-circle-half{position:absolute;left:0;top:0;height:100%;width:100%;border-width:12px;border-style:solid;border-color:#000;border-radius:50%;-webkit-clip-path:inset(0 50% 0 0);clip-path:inset(0 50% 0 0)}.eael-progressbar-circle-half-left{transform:rotate(0)}.eael-progressbar-circle-half-right{transform:rotate(180deg);visibility:hidden}.eael-progressbar-circle-inner-content{position:absolute;top:50%;width:100%;transform:translateY(-50%);text-align:center}.eael-progressbar-half-circle{position:relative;width:200px;height:100px;overflow:hidden}.eael-progressbar-half-circle .eael-progressbar-circle-pie{-webkit-clip-path:inset(0 0 50% 0);clip-path:inset(0 0 50% 0)}.eael-progressbar-half-circle .eael-progressbar-circle-half{-webkit-clip-path:inset(50% 0 0 0);clip-path:inset(50% 0 0 0);transform:rotate(0);transition:transform 1.5s linear}.eael-progressbar-half-circle .eael-progressbar-circle-inner-content{top:initial;bottom:0;transform:translateY(0)}.eael-progressbar-half-circle .eael-progressbar-title{font-size:16px;font-weight:400}.eael-progressbar-half-circle .eael-progressbar-count-wrap{font-size:28px;font-weight:700}.eael-progressbar-half-circle-after{position:relative;font-size:12px;font-weight:400;clear:both}.eael-progressbar-postfix-label{float:right}.eael-progressbar-line-stripe .eael-progressbar-line-fill:after{content:'';position:absolute;top:0;left:-35px;width:calc(100% + 70px);height:100%;background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:35px 35px}.eael-progressbar-line-animate .eael-progressbar-line-fill:after{-webkit-animation:animateStripe 2s linear infinite;animation:animateStripe 2s linear infinite}.eael-progressbar-line-animate-rtl .eael-progressbar-line-fill:after{-webkit-animation:animateStripeRTL 2s linear infinite;animation:animateStripeRTL 2s linear infinite}.eael-progressbar-circle-wrap>div{margin:0 auto}.eael-progressbar-box-container.left>div,.eael-progressbar-circle-container.left>div,.eael-progressbar-line-container.left{margin:0 auto 0 0}.eael-progressbar-box-container.center>div,.eael-progressbar-circle-container.center>div,.eael-progressbar-line-container.center{margin:0 auto}.eael-progressbar-box-container.right>div,.eael-progressbar-circle-container.right>div,.eael-progressbar-line-container.right{margin:0 0 0 auto}
31
  .eael-reading-progress-wrap.eael-reading-progress-wrap-local .eael-reading-progress-global{display:none}.eael-reading-progress-wrap.eael-reading-progress-wrap-global .eael-reading-progress-local{display:none}.eael-reading-progress-wrap.eael-reading-progress-wrap-disabled .eael-reading-progress-global,.eael-reading-progress-wrap.eael-reading-progress-wrap-disabled .eael-reading-progress-local{display:none}.eael-reading-progress-wrap .eael-reading-progress{width:100%;position:fixed;top:0;left:0;height:5px;z-index:999999}.eael-reading-progress-wrap .eael-reading-progress.eael-reading-progress-bottom{top:unset;bottom:0}.eael-reading-progress-wrap .eael-reading-progress .eael-reading-progress-fill{height:5px;background-color:#1fd18e;width:0%;transition:width 50ms ease}
32
  .eaelsv-overlay{position:absolute;display:block;width:100%;height:100%;top:0;left:0;right:0;bottom:0;background-color:rgba(0,0,0,.5);z-index:4;cursor:pointer;background-size:cover;background-position:50%;text-align:center;overflow:hidden}.eaelsv-overlay-icon{position:absolute;top:50%;left:50%;font-size:90px;color:#fff;transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%)}.plyr__controls button{box-shadow:none!important}.plyr__controls button:hover{box-shadow:none!important}.plyr__controls{display:none!important}.eael-sticky-video-wrapper{position:relative;width:100%;min-height:200px;margin:0;padding:0;transition:.5s;text-align:left;overflow:hidden}.eael-sticky-video-player2{min-height:20px;overflow:visible}.eael-sticky-video-player2.out{position:fixed;z-index:999;border:0!important;border-radius:0!important;height:200px;width:300px}.eael-sticky-video-wrapper.out .eael-sticky-video-player,.eael-sticky-video-wrapper.out .eael-sticky-video-player2{border-radius:0!important}.eael-sticky-video-player2.in{position:relative;margin:0;padding:0;height:100%;border:0;line-height:1}.owp-play{position:absolute;top:50%;left:50%;transform:translateX(-50%) translateY(-50%)}.owp-play i{font-size:100px;color:#fff;opacity:.8;text-shadow:1px 0 6px rgba(0,0,0,.3);transition:all .5s}.eael-sticky-video-player:hover .owp-play i{opacity:1}.eaelsv-sticky-player-close{position:absolute;right:-25px;top:-36px;display:none;padding:7px;font-size:24px;z-index:9999;cursor:pointer;box-sizing:content-box;overflow:visible}.eaelsv-sticky-player-close:hover{color:#090}.eaelsv-sticky-player-close:after,.eaelsv-sticky-player-close:before{position:absolute;left:15px;background-color:#333}.eaelsv-sticky-player-close:before{transform:rotate(45deg)}.eaelsv-sticky-player-close:after{transform:rotate(-45deg)}
33
  .eael-team-item{overflow:hidden;position:relative}.team-avatar-rounded figure img{border-radius:50%;height:auto}.eael-team-image>figure{margin:0;padding:0}.eael-team-image>figure img{display:block;margin:0 auto}.eael-team-item .eael-team-content{padding:10px}.eael-team-item .eael-team-member-name{font-size:20px;font-weight:700;letter-spacing:.05em;margin:5px 0;text-transform:uppercase}.eael-team-item .eael-team-member-position{font-size:14px;font-weight:400;letter-spacing:.05em;margin:5px 0 10px;text-transform:uppercase}.eael-team-item .eael-team-content,.eael-team-item .eael-team-content .eael-team-text{font-size:14px;line-height:1.5}.eael-team-content>ul{margin:0;padding:0}.eael-team-content li{display:inline-block;list-style:outside none none;margin-right:10px;text-align:center}.eael-team-content li a{font-size:2.5rem}.eael-team-align-left .eael-team-item .eael-team-content li,.eael-team-align-left .eael-team-item .eael-team-content p,.eael-team-align-left .eael-team-item .eael-team-content ul,.eael-team-align-left .eael-team-item .eael-team-member-name,.eael-team-align-left .eael-team-item .eael-team-member-position,.eael-team-align-left .eael-team-item .eael-team-text{text-align:left}.eael-team-align-right .eael-team-item .eael-team-content li,.eael-team-align-right .eael-team-item .eael-team-content p,.eael-team-align-right .eael-team-item .eael-team-content ul,.eael-team-align-right .eael-team-item .eael-team-member-name,.eael-team-align-right .eael-team-item .eael-team-member-position,.eael-team-align-right .eael-team-item .eael-team-text{text-align:right}.eael-team-align-centered .eael-team-item .eael-team-content li,.eael-team-align-centered .eael-team-item .eael-team-content p,.eael-team-align-centered .eael-team-item .eael-team-content ul,.eael-team-align-centered .eael-team-item .eael-team-member-name,.eael-team-align-centered .eael-team-item .eael-team-member-position,.eael-team-align-centered .eael-team-item .eael-team-text{text-align:center}.eael-team-item.eael-team-members-overlay .eael-team-content{bottom:10px;left:10px;margin-bottom:0;padding-top:15%;opacity:0;overflow:hidden;text-overflow:ellipsis;position:absolute;right:10px;top:10px;transition:all 615ms cubic-bezier(.19,1,.22,1) 0s}.eael-team-item.eael-team-members-overlay:hover .eael-team-content{opacity:1}.eael-team-member-social-link>a{display:inline-block;transition:all .3s cubic-bezier(.19,1,.22,1) 0s}.eael-team-member-social-link>a:focus{outline:0}
34
  .eael-testimonial-slider{position:relative}.testimonial-star-rating{padding:0;margin:0}.testimonial-star-rating li{list-style:none;display:inline-block}.testimonial-star-rating li i{color:#d8d8d8}.rating-five .testimonial-star-rating li i{color:#f2b01e}.rating-one .testimonial-star-rating li:first-child i{color:#f2b01e}.rating-two .testimonial-star-rating li:nth-child(1) i,.rating-two .testimonial-star-rating li:nth-child(2) i{color:#f2b01e}.rating-three .testimonial-star-rating li:nth-child(1) i,.rating-three .testimonial-star-rating li:nth-child(2) i,.rating-three .testimonial-star-rating li:nth-child(3) i{color:#f2b01e}.rating-four .testimonial-star-rating li:nth-child(1) i,.rating-four .testimonial-star-rating li:nth-child(2) i,.rating-four .testimonial-star-rating li:nth-child(3) i,.rating-four .testimonial-star-rating li:nth-child(4) i{color:#f2b01e}.eael-testimonial-image img{max-width:100%}.eael-testimonial-image{padding:10px 0 0 0}.eael-testimonial-image>figure{display:block;margin:0}.testimonial-avatar-rounded figure img{border-radius:50%;height:auto}.eael-testimonial-content{margin:0;padding:10px}.eael-testimonial-item>figure{margin:0 auto;padding:0 20px}.eael-testimonial-item .center-text{text-align:center}.eael-testimonial-item .right-text{text-align:right}.eael-testimonial-item .left-text{text-align:left}.eael-testimonial-item .justify-text{text-align:justify}.eael-testimonial-content .eael-testimonial-text{font-size:100%;font-style:italic;line-height:1.5;margin-top:0;margin-bottom:10px;word-wrap:break-word}.eael-testimonial-content .eael-testimonial-user{display:inline-block;font-family:inherit;font-size:105%;font-style:italic;font-weight:400;line-height:1.5;margin-top:0;margin-bottom:0;margin-right:5px}.eael-testimonial-content .eael-testimonial-user-company{display:inline-block;font-family:inherit;font-size:90%;font-style:italic;font-weight:lighter;line-height:1.75;margin-bottom:0;margin-top:1px}.eael-testimonial-image{position:relative}.eael-testimonial-item .eael-testimonial-quote::after{color:inherit!important;content:"\f10e";font-family:"Font Awesome 5 Free";font-size:200%;font-weight:900}.eael-testimonial-slider.default-style .eael-testimonial-align-centered .eael-testimonial-image figure img{margin:0 auto}.eael-testimonial-slider.classic-style .eael-testimonial-align-left .eael-testimonial-image figure img,.eael-testimonial-slider.classic-style .eael-testimonial-align-right .eael-testimonial-image figure img,.eael-testimonial-slider.default-style .eael-testimonial-align-left .eael-testimonial-image figure img,.eael-testimonial-slider.default-style .eael-testimonial-align-right .eael-testimonial-image figure img,.eael-testimonial-slider.middle-style .eael-testimonial-align-left .eael-testimonial-image figure img,.eael-testimonial-slider.middle-style .eael-testimonial-align-right .eael-testimonial-image figure img{margin:0}.eael-testimonial-slider.classic-style .eael-testimonial-align-right .eael-testimonial-image figure,.eael-testimonial-slider.default-style .eael-testimonial-align-right .eael-testimonial-image figure,.eael-testimonial-slider.middle-style .eael-testimonial-align-right .eael-testimonial-image figure{text-align:right}.eael-testimonial-slider.classic-style .eael-testimonial-align-left .eael-testimonial-image figure,.eael-testimonial-slider.default-style .eael-testimonial-align-left .eael-testimonial-image figure,.eael-testimonial-slider.middle-style .eael-testimonial-align-left .eael-testimonial-image figure{text-align:left}.eael-testimonial-slider.classic-style .eael-testimonial-align-right .testimonial-classic-style-content,.eael-testimonial-slider.default-style .eael-testimonial-align-right .default-style-testimonial-content,.eael-testimonial-slider.middle-style .eael-testimonial-align-right .eael-testimonial-text,.eael-testimonial-slider.middle-style .eael-testimonial-align-right .middle-style-content{text-align:right}.eael-testimonial-slider.classic-style .eael-testimonial-align-center .testimonial-classic-style-content,.eael-testimonial-slider.default-style .eael-testimonial-align-center .default-style-testimonial-content,.eael-testimonial-slider.middle-style .eael-testimonial-align-center .eael-testimonial-text,.eael-testimonial-slider.middle-style .eael-testimonial-align-center .middle-style-content{text-align:center}.eael-testimonial-slider.classic-style .eael-testimonial-align-left .testimonial-classic-style-content,.eael-testimonial-slider.default-style .eael-testimonial-align-left .default-style-testimonial-content,.eael-testimonial-slider.middle-style .eael-testimonial-align-left .eael-testimonial-text,.eael-testimonial-slider.middle-style .eael-testimonial-align-left .middle-style-content{text-align:left}.eael-testimonial-slider.icon-img-left-content .eael-testimonial-text>p,.eael-testimonial-slider.icon-img-right-content .eael-testimonial-text>p{margin:0}.icon-img-left-content .eael-testimonial-image{float:left;width:30%}.icon-img-left-content .eael-testimonial-content{float:left;width:70%;text-align:left}.icon-img-left-content.eael-testimonial-item{overflow:hidden;position:relative}.icon-img-left-content .eael-testimonial-quote{position:absolute;right:0}.icon-img-left-content .eael-testimonial-text{margin-top:0}.eael-testimonial-align-centered .eael-testimonial-user,.eael-testimonial-align-centered .eael-testimonial-user-company{float:none;text-align:center}.eael-testimonial-align-centered .eael-testimonial-image>figure img{display:block;margin-left:auto!important;margin-right:auto!important}.icon-img-right-content .eael-testimonial-image{float:right;width:30%}.icon-img-right-content .eael-testimonial-content{float:right;width:70%;text-align:right}.icon-img-right-content.eael-testimonial-item{overflow:hidden;position:relative}.icon-img-right-content .eael-testimonial-quote{position:absolute}.icon-img-right-content .eael-testimonial-text{margin-top:0}.eael-testimonial-item{position:relative}.classic-style.testimonial-alignment-center .eael-testimonial-image,.default-style.testimonial-alignment-center .eael-testimonial-image{text-align:center}.classic-style.testimonial-alignment-right .eael-testimonial-image,.default-style.testimonial-alignment-right .eael-testimonial-image{text-align:right}.classic-style.testimonial-alignment-center .eael-testimonial-image>figure,.default-style.testimonial-alignment-center .eael-testimonial-image>figure{text-align:center}.eael-testimonial-slider.icon-img-left-content .eael-testimonial-align-centered .eael-testimonial-content{text-align:center}.eael-testimonial-slider.icon-img-left-content .eael-testimonial-align-left .eael-testimonial-content{text-align:left}.eael-testimonial-slider.icon-img-left-content .eael-testimonial-align-right .eael-testimonial-content{text-align:right}.eael-testimonial-slider.icon-img-right-content .eael-testimonial-align-centered .eael-testimonial-content{text-align:center}.eael-testimonial-slider.icon-img-right-content .eael-testimonial-align-left .eael-testimonial-content{text-align:left}.eael-testimonial-slider.icon-img-right-content .eael-testimonial-align-right .eael-testimonial-content{text-align:right}span.eael-testimonial-quote{position:absolute;right:10px;top:10px}.eael-testimonial-item.left .eael-testimonial-image{text-align:left}.eael-testimonial-item.center .eael-testimonial-image{text-align:center}.eael-testimonial-item.right .eael-testimonial-image{text-align:right}.eael-testimonial-inline-bio .eael-testimonial-image{float:left}.eael-testimonial-inline-bio .bio-text{padding-top:10px}.eael-testimonial-content.eael-testimonial-inline-bio{overflow:hidden;margin-bottom:0;padding-bottom:0}.eael-testimonial-inline-bio .bio-text,.eael-testimonial-inline-bio .testimonial-star-rating{float:left;width:65%}.eael-testimonial-content.eael-testimonial-inline-bio{text-align:left!important}.testimonial-inline-style .eael-testimonial-image{float:left;max-width:100%;padding:0;margin-right:15px}.testimonial-inline-style{overflow:hidden;text-align:left}.content-top-icon-title-inline .eael-testimonial-align-left .eael-testimonial-text,.content-top-icon-title-inline .eael-testimonial-text{text-align:left}.content-top-icon-title-inline .eael-testimonial-align-centered .eael-testimonial-text{text-align:center}.content-top-icon-title-inline .eael-testimonial-align-right .eael-testimonial-text{text-align:right}.content-bottom-icon-title-inline .eael-testimonial-align-left .eael-testimonial-text,.content-bottom-icon-title-inline .eael-testimonial-text{text-align:left}.content-bottom-icon-title-inline .eael-testimonial-align-centered .eael-testimonial-text{text-align:center}.content-bottom-icon-title-inline .eael-testimonial-align-right .eael-testimonial-text{text-align:right}
35
- .eael-tooltip{position:relative;display:inline-block;min-width:150px;padding:12px 24px;font-size:.93rem;color:#333;line-height:1;cursor:pointer;transition:all .3s ease-in-out}.eael-tooltip .eael-tooltip-text{display:block;width:100%;visibility:hidden;background-color:#000;color:#fff;border-radius:4px;padding:10px;position:absolute;z-index:1;font-size:.93rem;line-height:1.3}.eael-tooltip .eael-tooltip-text p{margin:0}.eael-tooltip .eael-tooltip-text::after{content:"";position:absolute;border-width:5px;border-style:solid}.eael-tooltip:hover .eael-tooltip-text{visibility:visible}.eael-tooltip .eael-tooltip-text.eael-tooltip-left{top:50%;right:100%;transform:translateY(-50%);margin-right:10px}.eael-tooltip:hover .eael-tooltip-text.eael-tooltip-left{-webkit-animation:tooltipLeftIn .3s ease-in-out;animation:tooltipLeftIn .3s ease-in-out}.eael-tooltip .eael-tooltip-text.eael-tooltip-left::after{top:calc(50% - 5px);left:100%;border-color:transparent transparent transparent #000}.eael-tooltip .eael-tooltip-text.eael-tooltip-right{top:50%;left:100%;transform:translateY(-50%);transition:all .3s ease-in-out;margin-left:10px}.eael-tooltip:hover .eael-tooltip-text.eael-tooltip-right{-webkit-animation:tooltipRightIn .3s linear;animation:tooltipRightIn .3s linear}.eael-tooltip .eael-tooltip-text.eael-tooltip-right::after{top:calc(50% - 5px);right:100%;border-color:transparent #000 transparent transparent}.eael-tooltip .eael-tooltip-text.eael-tooltip-top{bottom:calc(100%);left:0;right:0;margin:0 auto 10px auto}.eael-tooltip .eael-tooltip-text.eael-tooltip-top::after{margin-top:0;top:100%;left:calc(50% - 5px);border-color:#000 transparent transparent transparent}.eael-tooltip:hover .eael-tooltip-text.eael-tooltip-top{-webkit-animation:tooltipTopIn .3s linear;animation:tooltipTopIn .3s linear}.eael-tooltip .eael-tooltip-text.eael-tooltip-bottom{top:100%;left:0;right:0;margin:10px auto 0 auto}.eael-tooltip .eael-tooltip-text.eael-tooltip-bottom::after{margin-top:0;bottom:100%;left:calc(50% - 5px);border-color:transparent transparent #000 transparent}.eael-tooltip:hover .eael-tooltip-text.eael-tooltip-bottom{-webkit-animation:tooltipBottomIn .3s linear;animation:tooltipBottomIn .3s linear}.eael-tooltip-align-left{display:flex;width:100%;justify-content:flex-start}.eael-tooltip-align-right{display:flex;width:100%;justify-content:flex-end}.eael-tooltip-align-center{display:flex;width:100%;justify-content:center}.eael-tooltip-align-justify .eael-tooltip{display:flex;justify-content:center;align-items:center}@-webkit-keyframes tooltipRightIn{0%{opacity:0;left:105%}100%{opacity:1;left:100%}}@keyframes tooltipRightIn{0%{opacity:0;left:105%}100%{opacity:1;left:100%}}@-webkit-keyframes tooltipLeftIn{0%{opacity:0;right:105%}100%{opacity:1;right:100%}}@keyframes tooltipLeftIn{0%{opacity:0;right:105%}100%{opacity:1;right:100%}}@-webkit-keyframes tooltipTopIn{0%{opacity:0;bottom:110%}100%{opacity:1;bottom:100%}}@keyframes tooltipTopIn{0%{opacity:0;bottom:110%}100%{opacity:1;bottom:100%}}@-webkit-keyframes tooltipBottomIn{0%{opacity:0;top:110%}100%{opacity:1;top:100%}}@keyframes tooltipBottomIn{0%{opacity:0;top:110%}100%{opacity:1;top:100%}}.eael-tooltip-text-align-left .eael-tooltip-text{text-align:left}.eael-tooltip-text-align-right .eael-tooltip-text{text-align:right}.eael-tooltip-text-align-center .eael-tooltip-text{text-align:center}.eael-tooltip-text-align-justify .eael-tooltip-text{text-align:justify}
36
  .eael-twitter-feed::after,.eael-twitter-feed::before{content:"";clear:both}.eael-twitter-feed-masonry .eael-twitter-feed-item{float:left}@media only screen and (max-width:480px){.eael-twitter-feed-masonry.eael-twitter-feed-col-2 .eael-twitter-feed-item{width:100%!important}}@media only screen and (max-width:480px){.eael-twitter-feed-masonry.eael-twitter-feed-col-3 .eael-twitter-feed-item{width:100%!important}}@media only screen and (max-width:480px){.eael-twitter-feed-masonry.eael-twitter-feed-col-4 .eael-twitter-feed-item{width:100%!important}}.eael-twitter-feed-item .eael-twitter-feed-item-inner{background:#fff;border:1px solid rgba(0,0,0,.1)}.eael-twitter-feed-item a{color:#08c;text-decoration:none}.eael-twitter-feed-item a:hover{outline:0;color:#005580}.eael-twitter-feed-item a:focus{outline:0}.eael-twitter-feed-item .eael-twitter-feed-item-header{padding:20px 15px 0;margin-bottom:10px}.eael-twitter-feed-item .eael-twitter-feed-item-header .eael-twitter-feed-item-avatar{float:left;width:38px;margin-right:10px}.eael-twitter-feed-item .eael-twitter-feed-item-header .eael-twitter-feed-item-avatar img{max-width:100%;height:auto;-o-object-fit:cover;object-fit:cover}.eael-twitter-feed-item .eael-twitter-feed-item-header .eael-twitter-feed-item-avatar.avatar-circle img{border-radius:50%}.eael-twitter-feed-item .eael-twitter-feed-item-header .eael-twitter-feed-item-meta{float:left}.eael-twitter-feed-item .eael-twitter-feed-item-header .eael-twitter-feed-item-meta .eael-twitter-feed-item-icon{color:#1da1f2;margin-right:5px}.eael-twitter-feed-item .eael-twitter-feed-item-header .eael-twitter-feed-item-meta .eael-twitter-feed-item-author{color:#444;line-height:1.5em;font-weight:700}.eael-twitter-feed-item .eael-twitter-feed-item-header .eael-twitter-feed-item-date{float:right;margin-right:10px;font-size:90%;color:#999}.eael-twitter-feed-item .eael-twitter-feed-item-content{padding:0 15px 15px}.eael-twitter-feed-item .eael-twitter-feed-item-content p{color:#666;margin:0 0 5px;min-height:20px;text-overflow:ellipsis;-webkit-line-clamp:5;-webkit-box-orient:vertical}.eael-twitter-feed.swiper-container .swiper-button-next,.eael-twitter-feed.swiper-container .swiper-button-prev{background-image:none;outline:0}
37
  .eael-weform-container input,.eael-weform-container textarea{height:auto;padding:10px}.eael-contact-form-btn-align-center .eael-weform-container ul.wpuf-form .wpuf-submit input[type=submit]{margin-left:auto!important;margin-right:auto!important;display:block;float:none}.eael-contact-form-btn-align-left .eael-weform-container ul.wpuf-form .wpuf-submit input[type=submit]{float:left;width:auto}.eael-contact-form-btn-align-right .eael-weform-container ul.wpuf-form .wpuf-submit input[type=submit]{float:right;width:auto}.eael-weform-container ul.wpuf-form li .wpuf-fields input[type=email],.eael-weform-container ul.wpuf-form li .wpuf-fields input[type=number],.eael-weform-container ul.wpuf-form li .wpuf-fields input[type=password],.eael-weform-container ul.wpuf-form li .wpuf-fields input[type=text],.eael-weform-container ul.wpuf-form li .wpuf-fields input[type=url],.eael-weform-container ul.wpuf-form li .wpuf-fields textarea{max-width:100%}
38
  .eael-wpforms .wpforms-container .wpforms-form .wpforms-page-button,.eael-wpforms .wpforms-container .wpforms-form button[type=submit],.eael-wpforms .wpforms-container .wpforms-form input[type=submit]{border:0}.eael-wpforms .wpforms-container .wpforms-form .wpforms-page-button:hover,.eael-wpforms .wpforms-container .wpforms-form button[type=submit]:hover,.eael-wpforms .wpforms-container .wpforms-form input[type=submit]:hover{border:0}.eael-wpforms .wpforms-container .wpforms-form input[type=checkbox],.eael-wpforms .wpforms-container .wpforms-form input[type=radio]{padding:3px}.eael-wpforms .wpforms-container .wpforms-form .wpforms-field-label{display:none}.eael-wpforms .wpforms-container .wpforms-form .wpforms-field-name .wpforms-field-row{max-width:100%}.eael-wpforms .wpforms-container .wpforms-field input:not([type=radio]):not([type=checkbox]):not([type=submit]):not([type=button]):not([type=image]):not([type=file]),.eael-wpforms .wpforms-container .wpforms-field select,.eael-wpforms .wpforms-container .wpforms-field textarea{max-width:100%!important}.eael-wpforms-labels-yes .wpforms-container .wpforms-form .wpforms-field-label{display:block}.eael-wpforms-form-button-full-width .wpforms-submit-container .wpforms-submit{width:100%}
39
- .tooltipster-fall,.tooltipster-grow.tooltipster-show{-webkit-transition-timing-function:cubic-bezier(.175,.885,.32,1);-moz-transition-timing-function:cubic-bezier(.175,.885,.32,1.15);-ms-transition-timing-function:cubic-bezier(.175,.885,.32,1.15);-o-transition-timing-function:cubic-bezier(.175,.885,.32,1.15)}.tooltipster-base{display:flex;pointer-events:none;position:absolute}.tooltipster-box{flex:1 1 auto}.tooltipster-content{box-sizing:border-box;max-height:100%;max-width:100%;overflow:auto}.tooltipster-ruler{bottom:0;left:0;overflow:hidden;position:fixed;right:0;top:0;visibility:hidden}.tooltipster-fade{opacity:0;-webkit-transition-property:opacity;-moz-transition-property:opacity;-o-transition-property:opacity;-ms-transition-property:opacity;transition-property:opacity}.tooltipster-fade.tooltipster-show{opacity:1}.tooltipster-grow{-webkit-transform:scale(0,0);-moz-transform:scale(0,0);-o-transform:scale(0,0);-ms-transform:scale(0,0);transform:scale(0,0);-webkit-transition-property:-webkit-transform;-moz-transition-property:-moz-transform;-o-transition-property:-o-transform;-ms-transition-property:-ms-transform;transition-property:transform;-webkit-backface-visibility:hidden}.tooltipster-grow.tooltipster-show{-webkit-transform:scale(1,1);-moz-transform:scale(1,1);-o-transform:scale(1,1);-ms-transform:scale(1,1);transform:scale(1,1);-webkit-transition-timing-function:cubic-bezier(.175,.885,.32,1.15);transition-timing-function:cubic-bezier(.175,.885,.32,1.15)}.tooltipster-swing{opacity:0;-webkit-transform:rotateZ(4deg);-moz-transform:rotateZ(4deg);-o-transform:rotateZ(4deg);-ms-transform:rotateZ(4deg);transform:rotateZ(4deg);-webkit-transition-property:-webkit-transform,opacity;-moz-transition-property:-moz-transform;-o-transition-property:-o-transform;-ms-transition-property:-ms-transform;transition-property:transform}.tooltipster-swing.tooltipster-show{opacity:1;-webkit-transform:rotateZ(0);-moz-transform:rotateZ(0);-o-transform:rotateZ(0);-ms-transform:rotateZ(0);transform:rotateZ(0);-webkit-transition-timing-function:cubic-bezier(.23,.635,.495,1);-webkit-transition-timing-function:cubic-bezier(.23,.635,.495,2.4);-moz-transition-timing-function:cubic-bezier(.23,.635,.495,2.4);-ms-transition-timing-function:cubic-bezier(.23,.635,.495,2.4);-o-transition-timing-function:cubic-bezier(.23,.635,.495,2.4);transition-timing-function:cubic-bezier(.23,.635,.495,2.4)}.tooltipster-fall{-webkit-transition-property:top;-moz-transition-property:top;-o-transition-property:top;-ms-transition-property:top;transition-property:top;-webkit-transition-timing-function:cubic-bezier(.175,.885,.32,1.15);transition-timing-function:cubic-bezier(.175,.885,.32,1.15)}.tooltipster-fall.tooltipster-initial{top:0!important}.tooltipster-fall.tooltipster-dying{-webkit-transition-property:all;-moz-transition-property:all;-o-transition-property:all;-ms-transition-property:all;transition-property:all;top:0!important;opacity:0}.tooltipster-slide{-webkit-transition-property:left;-moz-transition-property:left;-o-transition-property:left;-ms-transition-property:left;transition-property:left;-webkit-transition-timing-function:cubic-bezier(.175,.885,.32,1);-webkit-transition-timing-function:cubic-bezier(.175,.885,.32,1.15);-moz-transition-timing-function:cubic-bezier(.175,.885,.32,1.15);-ms-transition-timing-function:cubic-bezier(.175,.885,.32,1.15);-o-transition-timing-function:cubic-bezier(.175,.885,.32,1.15);transition-timing-function:cubic-bezier(.175,.885,.32,1.15)}.tooltipster-slide.tooltipster-initial{left:-40px!important}.tooltipster-slide.tooltipster-dying{-webkit-transition-property:all;-moz-transition-property:all;-o-transition-property:all;-ms-transition-property:all;transition-property:all;left:0!important;opacity:0}@keyframes tooltipster-fading{0%{opacity:0}100%{opacity:1}}.tooltipster-update-fade{animation:tooltipster-fading .4s}@keyframes tooltipster-rotating{25%{transform:rotate(-2deg)}75%{transform:rotate(2deg)}100%{transform:rotate(0)}}.tooltipster-update-rotate{animation:tooltipster-rotating .6s}@keyframes tooltipster-scaling{50%{transform:scale(1.1)}100%{transform:scale(1)}}.tooltipster-update-scale{animation:tooltipster-scaling .6s}.tooltipster-sidetip .tooltipster-box{background:#565656;border:2px solid #000;border-radius:4px}.tooltipster-sidetip.tooltipster-bottom .tooltipster-box{margin-top:8px}.tooltipster-sidetip.tooltipster-left .tooltipster-box{margin-right:8px}.tooltipster-sidetip.tooltipster-right .tooltipster-box{margin-left:8px}.tooltipster-sidetip.tooltipster-top .tooltipster-box{margin-bottom:8px}.tooltipster-sidetip .tooltipster-content{color:#fff;line-height:18px;padding:6px 14px}.tooltipster-sidetip .tooltipster-arrow{overflow:hidden;position:absolute}.tooltipster-sidetip.tooltipster-bottom .tooltipster-arrow{height:10px;margin-left:-10px;top:0;width:20px}.tooltipster-sidetip.tooltipster-left .tooltipster-arrow{height:20px;margin-top:-10px;right:0;top:0;width:10px}.tooltipster-sidetip.tooltipster-right .tooltipster-arrow{height:20px;margin-top:-10px;left:0;top:0;width:10px}.tooltipster-sidetip.tooltipster-top .tooltipster-arrow{bottom:0;height:10px;margin-left:-10px;width:20px}.tooltipster-sidetip .tooltipster-arrow-background,.tooltipster-sidetip .tooltipster-arrow-border{height:0;position:absolute;width:0}.tooltipster-sidetip .tooltipster-arrow-background{border:10px solid transparent}.tooltipster-sidetip.tooltipster-bottom .tooltipster-arrow-background{border-bottom-color:#565656;left:0;top:3px}.tooltipster-sidetip.tooltipster-left .tooltipster-arrow-background{border-left-color:#565656;left:-3px;top:0}.tooltipster-sidetip.tooltipster-right .tooltipster-arrow-background{border-right-color:#565656;left:3px;top:0}.tooltipster-sidetip.tooltipster-top .tooltipster-arrow-background{border-top-color:#565656;left:0;top:-3px}.tooltipster-sidetip .tooltipster-arrow-border{border:10px solid transparent;left:0;top:0}.tooltipster-sidetip.tooltipster-bottom .tooltipster-arrow-border{border-bottom-color:#000}.tooltipster-sidetip.tooltipster-left .tooltipster-arrow-border{border-left-color:#000}.tooltipster-sidetip.tooltipster-right .tooltipster-arrow-border{border-right-color:#000}.tooltipster-sidetip.tooltipster-top .tooltipster-arrow-border{border-top-color:#000}.tooltipster-sidetip .tooltipster-arrow-uncropped{position:relative}.tooltipster-sidetip.tooltipster-bottom .tooltipster-arrow-uncropped{top:-10px}.tooltipster-sidetip.tooltipster-right .tooltipster-arrow-uncropped{left:-10px}
40
- @keyframes plyr-progress{to{background-position:25px 0}}@keyframes plyr-popup{0%{opacity:.5;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}@keyframes plyr-fade-in{from{opacity:0}to{opacity:1}}.plyr{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:subpixel-antialiased;direction:ltr;font-family:Avenir,"Avenir Next","Helvetica Neue","Segoe UI",Helvetica,Arial,sans-serif;font-variant-numeric:tabular-nums;font-weight:500;line-height:1.7;max-width:100%;min-width:200px;position:relative;text-shadow:none;transition:box-shadow .3s ease}.plyr audio,.plyr video{border-radius:inherit;height:auto;vertical-align:middle;width:100%}.plyr button{font:inherit;line-height:inherit;width:auto}.plyr:focus{outline:0}.plyr--full-ui{box-sizing:border-box}.plyr--full-ui *,.plyr--full-ui ::after,.plyr--full-ui ::before{box-sizing:inherit}.plyr--full-ui a,.plyr--full-ui button,.plyr--full-ui input,.plyr--full-ui label{touch-action:manipulation}.plyr__badge{background:#4a5764;border-radius:2px;color:#fff;font-size:9px;line-height:1;padding:3px 4px}.plyr--full-ui ::-webkit-media-text-track-container{display:none}.plyr__captions{animation:plyr-fade-in .3s ease;bottom:0;color:#fff;display:none;font-size:14px;left:0;padding:10px;position:absolute;text-align:center;transition:transform .4s ease-in-out;width:100%}.plyr__captions .plyr__caption{background:rgba(0,0,0,.8);border-radius:2px;-webkit-box-decoration-break:clone;box-decoration-break:clone;line-height:185%;padding:.2em .5em;white-space:pre-wrap}.plyr__captions .plyr__caption div{display:inline}.plyr__captions span:empty{display:none}@media (min-width:480px){.plyr__captions{font-size:16px;padding:20px}}@media (min-width:768px){.plyr__captions{font-size:18px}}.plyr--captions-active .plyr__captions{display:block}.plyr:not(.plyr--hide-controls) .plyr__controls:not(:empty)~.plyr__captions{transform:translateY(-40px)}.plyr__control{background:0 0;border:0;border-radius:3px;color:inherit;cursor:pointer;flex-shrink:0;overflow:visible;padding:7px;position:relative;transition:all .3s ease}.plyr__control svg{display:block;fill:currentColor;height:18px;pointer-events:none;width:18px}.plyr__control:focus{outline:0}.plyr__control.plyr__tab-focus{box-shadow:0 0 0 5px rgba(0,179,255,.5);outline:0}a.plyr__control{text-decoration:none}a.plyr__control::after,a.plyr__control::before{display:none}.plyr__control.plyr__control--pressed .icon--not-pressed,.plyr__control.plyr__control--pressed .label--not-pressed,.plyr__control:not(.plyr__control--pressed) .icon--pressed,.plyr__control:not(.plyr__control--pressed) .label--pressed{display:none}.plyr--audio .plyr__control.plyr__tab-focus,.plyr--audio .plyr__control:hover,.plyr--audio .plyr__control[aria-expanded=true]{background:#00b3ff;color:#fff}.plyr--video .plyr__control.plyr__tab-focus,.plyr--video .plyr__control:hover,.plyr--video .plyr__control[aria-expanded=true]{background:#00b3ff;color:#fff}.plyr__control--overlaid{background:rgba(0,179,255,.8);border:0;border-radius:100%;color:#fff;display:none;left:50%;padding:15px;position:absolute;top:50%;transform:translate(-50%,-50%);z-index:2}.plyr__control--overlaid svg{left:2px;position:relative}.plyr__control--overlaid:focus,.plyr__control--overlaid:hover{background:#00b3ff}.plyr--playing .plyr__control--overlaid{opacity:0;visibility:hidden}.plyr--full-ui.plyr--video .plyr__control--overlaid{display:block}.plyr--full-ui ::-webkit-media-controls{display:none}.plyr__controls{align-items:center;display:flex;justify-content:flex-end;text-align:center}.plyr__controls .plyr__progress__container{flex:1;min-width:0}.plyr__controls .plyr__controls__item{margin-left:2.5px}.plyr__controls .plyr__controls__item:first-child{margin-left:0;margin-right:auto}.plyr__controls .plyr__controls__item.plyr__progress__container{padding-left:2.5px}.plyr__controls .plyr__controls__item.plyr__time{padding:0 5px}.plyr__controls .plyr__controls__item.plyr__progress__container:first-child,.plyr__controls .plyr__controls__item.plyr__time+.plyr__time,.plyr__controls .plyr__controls__item.plyr__time:first-child{padding-left:0}.plyr__controls .plyr__controls__item.plyr__volume{padding-right:5px}.plyr__controls .plyr__controls__item.plyr__volume:first-child{padding-right:0}.plyr__controls:empty{display:none}.plyr--audio .plyr__controls{background:#fff;border-radius:inherit;color:#4a5764;padding:10px}.plyr--video .plyr__controls{background:linear-gradient(rgba(0,0,0,0),rgba(0,0,0,.7));border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;bottom:0;color:#fff;left:0;padding:20px 5px 5px;position:absolute;right:0;transition:opacity .4s ease-in-out,transform .4s ease-in-out;z-index:3}@media (min-width:480px){.plyr--video .plyr__controls{padding:35px 10px 10px}}.plyr--video.plyr--hide-controls .plyr__controls{opacity:0;pointer-events:none;transform:translateY(100%)}.plyr [data-plyr=airplay],.plyr [data-plyr=captions],.plyr [data-plyr=fullscreen],.plyr [data-plyr=pip]{display:none}.plyr--airplay-supported [data-plyr=airplay],.plyr--captions-enabled [data-plyr=captions],.plyr--fullscreen-enabled [data-plyr=fullscreen],.plyr--pip-supported [data-plyr=pip]{display:inline-block}.plyr__menu{display:flex;position:relative}.plyr__menu .plyr__control svg{transition:transform .3s ease}.plyr__menu .plyr__control[aria-expanded=true] svg{transform:rotate(90deg)}.plyr__menu .plyr__control[aria-expanded=true] .plyr__tooltip{display:none}.plyr__menu__container{animation:plyr-popup .2s ease;background:rgba(255,255,255,.9);border-radius:4px;bottom:100%;box-shadow:0 1px 2px rgba(0,0,0,.15);color:#4a5764;font-size:16px;margin-bottom:10px;position:absolute;right:-3px;text-align:left;white-space:nowrap;z-index:3}.plyr__menu__container>div{overflow:hidden;transition:height .35s cubic-bezier(.4,0,.2,1),width .35s cubic-bezier(.4,0,.2,1)}.plyr__menu__container::after{border:4px solid transparent;border-top-color:rgba(255,255,255,.9);content:'';height:0;position:absolute;right:15px;top:100%;width:0}.plyr__menu__container [role=menu]{padding:7px}.plyr__menu__container [role=menuitem],.plyr__menu__container [role=menuitemradio]{margin-top:2px}.plyr__menu__container [role=menuitem]:first-child,.plyr__menu__container [role=menuitemradio]:first-child{margin-top:0}.plyr__menu__container .plyr__control{align-items:center;color:#4a5764;display:flex;font-size:14px;padding:4px 11px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}.plyr__menu__container .plyr__control>span{align-items:inherit;display:flex;width:100%}.plyr__menu__container .plyr__control::after{border:4px solid transparent;content:'';position:absolute;top:50%;transform:translateY(-50%)}.plyr__menu__container .plyr__control--forward{padding-right:28px}.plyr__menu__container .plyr__control--forward::after{border-left-color:rgba(74,87,100,.8);right:5px}.plyr__menu__container .plyr__control--forward.plyr__tab-focus::after,.plyr__menu__container .plyr__control--forward:hover::after{border-left-color:currentColor}.plyr__menu__container .plyr__control--back{font-weight:500;margin:7px;margin-bottom:3px;padding-left:28px;position:relative;width:calc(100% - 14px)}.plyr__menu__container .plyr__control--back::after{border-right-color:rgba(74,87,100,.8);left:7px}.plyr__menu__container .plyr__control--back::before{background:#c1c9d1;box-shadow:0 1px 0 #fff;content:'';height:1px;left:0;margin-top:4px;overflow:hidden;position:absolute;right:0;top:100%}.plyr__menu__container .plyr__control--back.plyr__tab-focus::after,.plyr__menu__container .plyr__control--back:hover::after{border-right-color:currentColor}.plyr__menu__container .plyr__control[role=menuitemradio]{padding-left:7px}.plyr__menu__container .plyr__control[role=menuitemradio]::after,.plyr__menu__container .plyr__control[role=menuitemradio]::before{border-radius:100%}.plyr__menu__container .plyr__control[role=menuitemradio]::before{background:rgba(0,0,0,.1);content:'';display:block;flex-shrink:0;height:16px;margin-right:10px;transition:all .3s ease;width:16px}.plyr__menu__container .plyr__control[role=menuitemradio]::after{background:#fff;border:0;height:6px;left:12px;opacity:0;top:50%;transform:translateY(-50%) scale(0);transition:transform .3s ease,opacity .3s ease;width:6px}.plyr__menu__container .plyr__control[role=menuitemradio][aria-checked=true]::before{background:#00b3ff}.plyr__menu__container .plyr__control[role=menuitemradio][aria-checked=true]::after{opacity:1;transform:translateY(-50%) scale(1)}.plyr__menu__container .plyr__control[role=menuitemradio].plyr__tab-focus::before,.plyr__menu__container .plyr__control[role=menuitemradio]:hover::before{background:rgba(0,0,0,.1)}.plyr__menu__container .plyr__menu__value{align-items:center;display:flex;margin-left:auto;margin-right:-5px;overflow:hidden;padding-left:25px;pointer-events:none}.plyr--full-ui input[type=range]{-webkit-appearance:none;background:0 0;border:0;border-radius:26px;color:#00b3ff;display:block;height:19px;margin:0;padding:0;transition:box-shadow .3s ease;width:100%}.plyr--full-ui input[type=range]::-webkit-slider-runnable-track{background:0 0;border:0;border-radius:2.5px;height:5px;transition:box-shadow .3s ease;-webkit-user-select:none;user-select:none;background-image:linear-gradient(to right,currentColor var(--value,0),transparent var(--value,0))}.plyr--full-ui input[type=range]::-webkit-slider-thumb{background:#fff;border:0;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(35,41,47,.2);height:13px;position:relative;transition:all .2s ease;width:13px;-webkit-appearance:none;margin-top:-4px}.plyr--full-ui input[type=range]::-moz-range-track{background:0 0;border:0;border-radius:2.5px;height:5px;transition:box-shadow .3s ease;-moz-user-select:none;user-select:none}.plyr--full-ui input[type=range]::-moz-range-thumb{background:#fff;border:0;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(35,41,47,.2);height:13px;position:relative;transition:all .2s ease;width:13px}.plyr--full-ui input[type=range]::-moz-range-progress{background:currentColor;border-radius:2.5px;height:5px}.plyr--full-ui input[type=range]::-ms-track{background:0 0;border:0;border-radius:2.5px;height:5px;transition:box-shadow .3s ease;-ms-user-select:none;user-select:none;color:transparent}.plyr--full-ui input[type=range]::-ms-fill-upper{background:0 0;border:0;border-radius:2.5px;height:5px;transition:box-shadow .3s ease;-ms-user-select:none;user-select:none}.plyr--full-ui input[type=range]::-ms-fill-lower{background:0 0;border:0;border-radius:2.5px;height:5px;transition:box-shadow .3s ease;-ms-user-select:none;user-select:none;background:currentColor}.plyr--full-ui input[type=range]::-ms-thumb{background:#fff;border:0;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(35,41,47,.2);height:13px;position:relative;transition:all .2s ease;width:13px;margin-top:0}.plyr--full-ui input[type=range]::-ms-tooltip{display:none}.plyr--full-ui input[type=range]:focus{outline:0}.plyr--full-ui input[type=range]::-moz-focus-outer{border:0}.plyr--full-ui input[type=range].plyr__tab-focus::-webkit-slider-runnable-track{box-shadow:0 0 0 5px rgba(0,179,255,.5);outline:0}.plyr--full-ui input[type=range].plyr__tab-focus::-moz-range-track{box-shadow:0 0 0 5px rgba(0,179,255,.5);outline:0}.plyr--full-ui input[type=range].plyr__tab-focus::-ms-track{box-shadow:0 0 0 5px rgba(0,179,255,.5);outline:0}.plyr--full-ui.plyr--video input[type=range]::-webkit-slider-runnable-track{background-color:rgba(255,255,255,.25)}.plyr--full-ui.plyr--video input[type=range]::-moz-range-track{background-color:rgba(255,255,255,.25)}.plyr--full-ui.plyr--video input[type=range]::-ms-track{background-color:rgba(255,255,255,.25)}.plyr--full-ui.plyr--video input[type=range]:active::-webkit-slider-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(35,41,47,.2),0 0 0 3px rgba(255,255,255,.5)}.plyr--full-ui.plyr--video input[type=range]:active::-moz-range-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(35,41,47,.2),0 0 0 3px rgba(255,255,255,.5)}.plyr--full-ui.plyr--video input[type=range]:active::-ms-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(35,41,47,.2),0 0 0 3px rgba(255,255,255,.5)}.plyr--full-ui.plyr--audio input[type=range]::-webkit-slider-runnable-track{background-color:rgba(193,201,209,.66)}.plyr--full-ui.plyr--audio input[type=range]::-moz-range-track{background-color:rgba(193,201,209,.66)}.plyr--full-ui.plyr--audio input[type=range]::-ms-track{background-color:rgba(193,201,209,.66)}.plyr--full-ui.plyr--audio input[type=range]:active::-webkit-slider-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(35,41,47,.2),0 0 0 3px rgba(0,0,0,.1)}.plyr--full-ui.plyr--audio input[type=range]:active::-moz-range-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(35,41,47,.2),0 0 0 3px rgba(0,0,0,.1)}.plyr--full-ui.plyr--audio input[type=range]:active::-ms-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(35,41,47,.2),0 0 0 3px rgba(0,0,0,.1)}.plyr__poster{background-color:#000;background-position:50% 50%;background-repeat:no-repeat;background-size:contain;height:100%;left:0;opacity:0;position:absolute;top:0;transition:opacity .2s ease;width:100%;z-index:1}.plyr--stopped.plyr__poster-enabled .plyr__poster{opacity:1}.plyr__time{font-size:14px}.plyr__time+.plyr__time::before{content:'\2044';margin-right:10px}@media (max-width:767px){.plyr__time+.plyr__time{display:none}}.plyr--video .plyr__time{text-shadow:0 1px 1px rgba(0,0,0,.15)}.plyr__tooltip{background:rgba(255,255,255,.9);border-radius:3px;bottom:100%;box-shadow:0 1px 2px rgba(0,0,0,.15);color:#4a5764;font-size:14px;font-weight:500;left:50%;line-height:1.3;margin-bottom:10px;opacity:0;padding:5px 7.5px;pointer-events:none;position:absolute;transform:translate(-50%,10px) scale(.8);transform-origin:50% 100%;transition:transform .2s .1s ease,opacity .2s .1s ease;white-space:nowrap;z-index:2}.plyr__tooltip::before{border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid rgba(255,255,255,.9);bottom:-4px;content:'';height:0;left:50%;position:absolute;transform:translateX(-50%);width:0;z-index:2}.plyr .plyr__control.plyr__tab-focus .plyr__tooltip,.plyr .plyr__control:hover .plyr__tooltip,.plyr__tooltip--visible{opacity:1;transform:translate(-50%,0) scale(1)}.plyr .plyr__control:hover .plyr__tooltip{z-index:3}.plyr__controls>.plyr__control:first-child .plyr__tooltip,.plyr__controls>.plyr__control:first-child+.plyr__control .plyr__tooltip{left:0;transform:translate(0,10px) scale(.8);transform-origin:0 100%}.plyr__controls>.plyr__control:first-child .plyr__tooltip::before,.plyr__controls>.plyr__control:first-child+.plyr__control .plyr__tooltip::before{left:16px}.plyr__controls>.plyr__control:last-child .plyr__tooltip{left:auto;right:0;transform:translate(0,10px) scale(.8);transform-origin:100% 100%}.plyr__controls>.plyr__control:last-child .plyr__tooltip::before{left:auto;right:16px;transform:translateX(50%)}.plyr__controls>.plyr__control:first-child .plyr__tooltip--visible,.plyr__controls>.plyr__control:first-child+.plyr__control .plyr__tooltip--visible,.plyr__controls>.plyr__control:first-child+.plyr__control.plyr__tab-focus .plyr__tooltip,.plyr__controls>.plyr__control:first-child+.plyr__control:hover .plyr__tooltip,.plyr__controls>.plyr__control:first-child.plyr__tab-focus .plyr__tooltip,.plyr__controls>.plyr__control:first-child:hover .plyr__tooltip,.plyr__controls>.plyr__control:last-child .plyr__tooltip--visible,.plyr__controls>.plyr__control:last-child.plyr__tab-focus .plyr__tooltip,.plyr__controls>.plyr__control:last-child:hover .plyr__tooltip{transform:translate(0,0) scale(1)}.plyr--video{background:#000;overflow:hidden}.plyr--video.plyr--menu-open{overflow:visible}.plyr__video-wrapper{background:#000;border-radius:inherit;overflow:hidden;position:relative;z-index:0}.plyr__video-embed,.plyr__video-wrapper--fixed-ratio{height:0;padding-bottom:56.25%}.plyr__video-embed iframe,.plyr__video-wrapper--fixed-ratio video{border:0;height:100%;left:0;position:absolute;top:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}.plyr--full-ui .plyr__video-embed>.plyr__video-embed__container{padding-bottom:240%;position:relative;transform:translateY(-38.28125%)}.plyr__progress{left:6.5px;margin-right:13px;position:relative}.plyr__progress input[type=range],.plyr__progress__buffer{margin-left:-6.5px;margin-right:-6.5px;width:calc(100% + 13px)}.plyr__progress input[type=range]{position:relative;z-index:2}.plyr__progress .plyr__tooltip{font-size:14px;left:0}.plyr__progress__buffer{-webkit-appearance:none;background:0 0;border:0;border-radius:100px;height:5px;left:0;margin-top:-2.5px;padding:0;position:absolute;top:50%}.plyr__progress__buffer::-webkit-progress-bar{background:0 0}.plyr__progress__buffer::-webkit-progress-value{background:currentColor;border-radius:100px;min-width:5px;transition:width .2s ease}.plyr__progress__buffer::-moz-progress-bar{background:currentColor;border-radius:100px;min-width:5px;transition:width .2s ease}.plyr__progress__buffer::-ms-fill{border-radius:100px;transition:width .2s ease}.plyr--video .plyr__progress__buffer{box-shadow:0 1px 1px rgba(0,0,0,.15);color:rgba(255,255,255,.25)}.plyr--audio .plyr__progress__buffer{color:rgba(193,201,209,.66)}.plyr--loading .plyr__progress__buffer{animation:plyr-progress 1s linear infinite;background-image:linear-gradient(-45deg,rgba(35,41,47,.6) 25%,transparent 25%,transparent 50%,rgba(35,41,47,.6) 50%,rgba(35,41,47,.6) 75%,transparent 75%,transparent);background-repeat:repeat-x;background-size:25px 25px;color:transparent}.plyr--video.plyr--loading .plyr__progress__buffer{background-color:rgba(255,255,255,.25)}.plyr--audio.plyr--loading .plyr__progress__buffer{background-color:rgba(193,201,209,.66)}.plyr__volume{align-items:center;display:flex;flex:1;position:relative}.plyr__volume input[type=range]{margin-left:5px;position:relative;z-index:2}@media (min-width:480px){.plyr__volume{max-width:90px}}@media (min-width:768px){.plyr__volume{max-width:110px}}.plyr--is-ios .plyr__volume{display:none!important}.plyr--is-ios.plyr--vimeo [data-plyr=mute]{display:none!important}.plyr:-webkit-full-screen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-ms-fullscreen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:fullscreen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-webkit-full-screen video{height:100%}.plyr:-ms-fullscreen video{height:100%}.plyr:fullscreen video{height:100%}.plyr:-webkit-full-screen .plyr__video-wrapper{height:100%;position:static}.plyr:-ms-fullscreen .plyr__video-wrapper{height:100%;position:static}.plyr:fullscreen .plyr__video-wrapper{height:100%;position:static}.plyr:-webkit-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;position:relative;top:50%;transform:translateY(-50%)}.plyr:-ms-fullscreen.plyr--vimeo .plyr__video-wrapper{height:0;position:relative;top:50%;transform:translateY(-50%)}.plyr:fullscreen.plyr--vimeo .plyr__video-wrapper{height:0;position:relative;top:50%;transform:translateY(-50%)}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-ms-fullscreen .plyr__control .icon--exit-fullscreen{display:block}.plyr:fullscreen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-ms-fullscreen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:fullscreen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-webkit-full-screen.plyr--hide-controls{cursor:none}.plyr:-ms-fullscreen.plyr--hide-controls{cursor:none}.plyr:fullscreen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:-webkit-full-screen .plyr__captions{font-size:21px}.plyr:-ms-fullscreen .plyr__captions{font-size:21px}.plyr:fullscreen .plyr__captions{font-size:21px}}.plyr:-webkit-full-screen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-webkit-full-screen video{height:100%}.plyr:-webkit-full-screen .plyr__video-wrapper{height:100%;position:static}.plyr:-webkit-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;position:relative;top:50%;transform:translateY(-50%)}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-webkit-full-screen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:-webkit-full-screen .plyr__captions{font-size:21px}}.plyr:-moz-full-screen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-moz-full-screen video{height:100%}.plyr:-moz-full-screen .plyr__video-wrapper{height:100%;position:static}.plyr:-moz-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;position:relative;top:50%;transform:translateY(-50%)}.plyr:-moz-full-screen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-moz-full-screen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-moz-full-screen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:-moz-full-screen .plyr__captions{font-size:21px}}.plyr:-ms-fullscreen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-ms-fullscreen video{height:100%}.plyr:-ms-fullscreen .plyr__video-wrapper{height:100%;position:static}.plyr:-ms-fullscreen.plyr--vimeo .plyr__video-wrapper{height:0;position:relative;top:50%;transform:translateY(-50%)}.plyr:-ms-fullscreen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-ms-fullscreen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-ms-fullscreen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:-ms-fullscreen .plyr__captions{font-size:21px}}.plyr--fullscreen-fallback{background:#000;border-radius:0!important;height:100%;margin:0;width:100%;bottom:0;left:0;position:fixed;right:0;top:0;z-index:10000000}.plyr--fullscreen-fallback video{height:100%}.plyr--fullscreen-fallback .plyr__video-wrapper{height:100%;position:static}.plyr--fullscreen-fallback.plyr--vimeo .plyr__video-wrapper{height:0;position:relative;top:50%;transform:translateY(-50%)}.plyr--fullscreen-fallback .plyr__control .icon--exit-fullscreen{display:block}.plyr--fullscreen-fallback .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr--fullscreen-fallback.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr--fullscreen-fallback .plyr__captions{font-size:21px}}.plyr__ads{border-radius:inherit;bottom:0;cursor:pointer;left:0;overflow:hidden;position:absolute;right:0;top:0;z-index:-1}.plyr__ads>div,.plyr__ads>div iframe{height:100%;position:absolute;width:100%}.plyr__ads::after{background:rgba(35,41,47,.8);border-radius:2px;bottom:10px;color:#fff;content:attr(data-badge-text);font-size:11px;padding:2px 6px;pointer-events:none;position:absolute;right:10px;z-index:3}.plyr__ads::after:empty{display:none}.plyr__cues{background:currentColor;display:block;height:5px;left:0;margin:-2.5px 0 0;opacity:.8;position:absolute;top:50%;width:3px;z-index:3}.plyr__preview-thumb{background-color:rgba(255,255,255,.9);border-radius:3px;bottom:100%;box-shadow:0 1px 2px rgba(0,0,0,.15);margin-bottom:10px;opacity:0;padding:3px;pointer-events:none;position:absolute;transform:translate(0,10px) scale(.8);transform-origin:50% 100%;transition:transform .2s .1s ease,opacity .2s .1s ease;z-index:2}.plyr__preview-thumb--is-shown{opacity:1;transform:translate(0,0) scale(1)}.plyr__preview-thumb::before{border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid rgba(255,255,255,.9);bottom:-4px;content:'';height:0;left:50%;position:absolute;transform:translateX(-50%);width:0;z-index:2}.plyr__preview-thumb__image-container{background:#c1c9d1;border-radius:2px;overflow:hidden;position:relative;z-index:0}.plyr__preview-thumb__image-container img{height:100%;left:0;max-height:none;max-width:none;position:absolute;top:0;width:100%}.plyr__preview-thumb__time-container{bottom:6px;left:0;position:absolute;right:0;white-space:nowrap;z-index:3}.plyr__preview-thumb__time-container span{background-color:rgba(0,0,0,.55);border-radius:2px;color:#fff;font-size:14px;padding:3px 6px}.plyr__preview-scrubbing{bottom:0;filter:blur(1px);height:100%;left:0;margin:auto;opacity:0;overflow:hidden;position:absolute;right:0;top:0;transition:opacity .3s ease;width:100%;z-index:1}.plyr__preview-scrubbing--is-shown{opacity:1}.plyr__preview-scrubbing img{height:100%;left:0;max-height:none;max-width:none;object-fit:contain;position:absolute;top:0;width:100%}.plyr--no-transition{transition:none!important}.plyr__sr-only{clip:rect(1px,1px,1px,1px);overflow:hidden;border:0!important;height:1px!important;padding:0!important;position:absolute!important;width:1px!important}.plyr [hidden]{display:none!important}
4
  .eael-caldera-form-align-left,.eael-caldera-form-btn-align-left{text-align:left}.eael-caldera-form-align-right,.eael-caldera-form-btn-align-right{text-align:right}.eael-caldera-form-align-center,.eael-caldera-form-btn-align-center{text-align:center}.eael-caldera-form .control-label{display:none}.eael-caldera-form-labels-yes .control-label{display:block}.eael-caldera-form-button-center .form-group input[type=button],.eael-caldera-form-button-center .form-group input[type=submit]{display:block;margin:0 auto}.eael-caldera-form-button-right .form-group input[type=button],.eael-caldera-form-button-right .form-group input[type=submit]{float:right}.eael-caldera-form .intl-tel-input{display:inherit}.eael-custom-radio-checkbox .caldera-grid input[type=checkbox],.eael-custom-radio-checkbox .caldera-grid input[type=radio]{border-style:solid;border-width:0;padding:3px;-webkit-appearance:none}.eael-caldera-form-button-full-width .form-group input[type=button],.eael-caldera-form-button-full-width .form-group input[type=submit]{width:100%}
5
  .eael-call-to-action{width:100%;height:auto;display:block;padding:30px;font-size:16px;color:#4d4d4d;font-weight:400;line-height:27px;margin:0 auto}.eael-call-to-action p{margin-bottom:10px}.eael-call-to-action .title{font-size:36px;font-weight:600;line-height:36px;margin-bottom:10px;text-transform:capitalize;font-style:normal}.eael-call-to-action.cta-center{text-align:center}.eael-call-to-action.cta-right{text-align:right}.eael-call-to-action.cta-left{text-align:left}.eael-call-to-action.bg-lite{background:#f4f4f4}.eael-call-to-action.bg-img{background-image:url(../img/bg.jpg);background-repeat:no-repeat;background-position:center;background-size:cover;position:relative;z-index:0;color:rgba(255,255,255,.7)}.eael-call-to-action.bg-img .icon{color:#fff}.eael-call-to-action.bg-img:after{content:"";position:absolute;width:100%;height:100%;top:0;left:0;z-index:-1;background:rgba(0,0,0,.8)}.eael-call-to-action.bg-img.bg-fixed{background-attachment:fixed;background-position:center center}.eael-call-to-action.bg-img .title{color:rgba(255,255,255,.9)}.eael-call-to-action.cta-flex,.eael-call-to-action.cta-icon-flex{display:flex;justify-content:space-between;align-items:flex-start}.eael-call-to-action.cta-icon-flex .icon{flex-grow:1;font-size:80px;text-align:left;line-height:130px}.eael-call-to-action.cta-icon-flex .action{flex-grow:1;text-align:right;padding-top:22px;flex-basis:22%}.eael-call-to-action.cta-icon-flex .content{flex-grow:1;padding:0 30px}.eael-call-to-action.cta-flex .content{padding:0 15px;flex-grow:1}.eael-call-to-action.cta-flex .action{flex-grow:1;text-align:right;padding-top:25px;flex-basis:23%}.eael-call-to-action .cta-button{position:relative;display:inline-block;padding:12px 30px;background:#f9f9f9;font-size:16px;text-decoration:none;color:#4d4d4d;transition:.5s;-ms-box-shadow:0 0 3px -1px rgba(0,0,0,.2);box-shadow:0 0 3px -1px rgba(0,0,0,.2);margin-right:10px;margin-top:10px;z-index:0;overflow:hidden}.eael-call-to-action .cta-button:last-child{margin-right:0}.eael-call-to-action .cta-button:focus{outline:0}.eael-call-to-action .cta-button:hover{color:#fff;background:#3f51b5;-ms-box-shadow:0 1px 12px 1px rgba(0,0,0,.1);box-shadow:0 1px 12px 1px rgba(0,0,0,.1)}.eael-call-to-action .cta-button.effect-1:after{content:"";position:absolute;width:100%;height:100%;background:#3f51b5;top:0;left:0;transform:translateY(-100%);-webkit-transform:translateY(-100%);-ms-transform:translateY(-100%);z-index:-1;transition:.5s;color:#fff}.eael-call-to-action .cta-button.effect-1:hover::after{transform:translateY(0)}.eael-call-to-action .cta-button.effect-2:after{content:"";position:absolute;width:100%;height:100%;background:#3f51b5;top:0;left:0;z-index:-1;transition:.5s;color:#fff;transform:translateX(-100%)}.eael-call-to-action .cta-button.effect-2:hover::after{transform:translateX(0)}@media only screen and (max-width:768px){.eael-call-to-action.cta-flex,.eael-call-to-action.cta-icon-flex{flex-wrap:wrap}.eael-call-to-action .title{font-size:28px;line-height:36px;margin-top:0}.eael-call-to-action.cta-icon-flex .icon{flex-grow:1;font-size:48px;line-height:90px;text-align:center}.eael-call-to-action.cta-flex .content,.eael-call-to-action.cta-icon-flex .content{flex-grow:1;text-align:center;padding:0}.eael-call-to-action.cta-flex .action,.eael-call-to-action.cta-icon-flex .action{text-align:center;padding-top:0}.eael-call-to-action .cta-button{padding:12px 25px}}@media only screen and (max-width:360px){.eael-call-to-action{font-size:14px;line-height:26px}.eael-call-to-action .cta-button{padding:4px 20px;font-size:12px}.eael-call-to-action .title{font-size:20px;line-height:30px}}
6
  @-webkit-keyframes loaderSpin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}@keyframes loaderSpin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}.eael-load-more-button-wrap{display:flex}.eael-load-more-button{display:flex;align-items:center;justify-content:center;padding:1em 2em;border:0 solid;font-size:16px;overflow:hidden}.eael-load-more-button .button__loader{left:-100%;top:auto;margin-right:5px;transition:all .2s}.eael-load-more-button>span{margin-left:-20px}.eael-load-more-button.button--loading>span{margin-left:0}.eael-load-more-button.button--loading .button__loader{left:0}.eael-btn-loader{border-radius:50%;width:20px;height:20px;font-size:10px;position:relative;text-indent:-9999em;border-top:4px solid rgba(255,255,255,.2);border-right:4px solid rgba(255,255,255,.2);border-bottom:4px solid rgba(255,255,255,.2);border-left:4px solid #fff;transform:translateZ(0);-webkit-animation:loaderSpin 1.1s infinite linear;animation:loaderSpin 1.1s infinite linear}.eael-btn-loader:after{border-radius:50%;width:20px;height:20px}
 
7
  .eael-ticker-wrap{overflow:hidden;display:flex;flex-flow:row nowrap;align-items:center;width:100%}.eael-ticker-wrap .ticker-badge{flex:0 0 auto;padding:8px 12px}.eael-ticker-wrap .eael-ticker{overflow:hidden;flex:1 1 auto}.eael-ticker-wrap .eael-ticker .ticker-content{padding:8px 12px;line-height:1.8}.eael-ticker-wrap .eael-ticker .ticker-content p{margin:0}.eael-ticker-wrap .swiper-button-prev{left:auto!important;right:25px}.eael-ticker-wrap div.swiper-slide,.eael-ticker-wrap div.swiper-slide.swiper-slide-next,.eael-ticker-wrap div.swiper-slide.swiper-slide-prev{opacity:0!important}.eael-ticker-wrap div.swiper-slide.swiper-slide-active{opacity:1!important}.eael-ticker-wrap .eael-content-ticker.swiper-container .swiper-slide{text-align:left}@media only screen and (max-width:767px){.eael-ticker-wrap{flex-flow:row wrap}.content-ticker-pagination{display:none}}.eael-ticker-wrap .swiper-button-next,.eael-ticker-wrap .swiper-button-prev{background-image:none;outline:0;display:flex;align-items:center;justify-content:center}
8
+ .eael-contact-form-7.eael-contact-form-btn-align-center input.wpcf7-submit{margin-left:auto!important;margin-right:auto!important;display:block;float:none}.eael-contact-form-7.eael-contact-form-btn-align-left input.wpcf7-submit{float:left;width:auto}.eael-contact-form-7.eael-contact-form-btn-align-right input.wpcf7-submit{float:right;width:auto}.eael-contact-form-7 .uneditable-input,.eael-contact-form-7 input[type=color],.eael-contact-form-7 input[type=date],.eael-contact-form-7 input[type=datetime-local],.eael-contact-form-7 input[type=datetime],.eael-contact-form-7 input[type=email],.eael-contact-form-7 input[type=month],.eael-contact-form-7 input[type=number],.eael-contact-form-7 input[type=password],.eael-contact-form-7 input[type=search],.eael-contact-form-7 input[type=tel],.eael-contact-form-7 input[type=text],.eael-contact-form-7 input[type=time],.eael-contact-form-7 input[type=url],.eael-contact-form-7 input[type=week],.eael-contact-form-7 textarea{transition:border linear .2s,box-shadow linear .2s}.eael-contact-form-7 .wpcf7-form::after,.eael-contact-form-7 .wpcf7-form::before{content:" ";clear:both;display:table}.eael-contact-form-7 .wpcf7-form:after{clear:both;content:"";font-size:0;height:0;display:block;visibility:hidden}.eael-contact-form-7 .wpcf7-form .wpcf7-form-control-wrap,.eael-contact-form-7 .wpcf7-form label{display:block}.eael-contact-form-7 .wpcf7-form p{margin-bottom:0}.eael-contact-form-7.labels-hide .wpcf7-form label{display:none}.eael-contact-form-7-title{margin-bottom:10px}.eael-contact-form-7-description{margin-bottom:20px}.eael-contact-form-7-button-full-width .wpcf7-form-control.wpcf7-submit{width:100%}
9
  .eael-countdown-items{list-style:none;margin:0;padding:0;display:table;table-layout:fixed;width:100%}.eael-countdown-items>li{list-style:none;margin:0;padding:0;display:table-cell;position:relative}.eael-countdown-item>div{text-align:center;padding:20px}.eael-countdown-label-block .eael-countdown-digits,.eael-countdown-label-block .eael-countdown-label{display:block;text-align:center}.eael-countdown-digits{font-size:54px;line-height:1}.eael-countdown-label{font-size:18px;line-height:1;color:#fff}.eael-countdown-show-separator .eael-countdown-digits::after{content:":";position:absolute;left:98%;z-index:9999}.eael-countdown-item:last-child .eael-countdown-digits::after{display:none}.eael-countdown-items.style-1 .eael-countdown-item>div{background:#262625}
10
+ .eael-creative-button-align-center{text-align:center}.eael-creative-button-wrapper{display:flex}.eael-creative-button{flex:0 0 auto;min-width:150px;text-align:center;vertical-align:middle;position:relative;z-index:1;border-radius:2px;padding:20px 30px;font-size:16px;line-height:1;-webkit-backface-visibility:hidden;backface-visibility:hidden;-moz-osx-font-smoothing:grayscale}.eael-creative-button:focus{outline:0}.eael-creative-button--winona{overflow:hidden;padding:0!important;transition:border-color .3s,background-color .3s;transition-timing-function:cubic-bezier(.2,1,.3,1)}.eael-creative-button--winona::after{content:attr(data-text);position:absolute;width:100%;height:100%;top:0;left:0;opacity:0;transform:translate3d(0,25%,0);display:flex;align-items:center;justify-content:center}.eael-creative-button--winona::after,.eael-creative-button--winona>.creative-button-inner{padding:1em 2em;transition:transform .3s,opacity .3s;transition-timing-function:cubic-bezier(.2,1,.3,1)}.eael-creative-button--winona:hover::after{opacity:1;transform:translate3d(0,0,0)}.eael-creative-button--winona:hover>.creative-button-inner{opacity:0;transform:translate3d(0,0,0)}.eael-creative-button--ujarak{transition:border-color .4s,color .4s}.eael-creative-button--ujarak::before{content:'';position:absolute;top:0;left:0;width:100%;height:100%;z-index:-1;opacity:0;transform:scale3d(.7,1,1);transition:transform .4s,opacity .4s;transition-timing-function:cubic-bezier(.2,1,.3,1)}.eael-creative-button--ujarak,.eael-creative-button--ujarak::before{transition-timing-function:cubic-bezier(.2,1,.3,1)}.eael-creative-button--ujarak:hover::before{opacity:1;transform:translate3d(0,0,0)}.eael-creative-button--wayra{overflow:hidden;transition:border-color .3s,color .3s;transition-timing-function:cubic-bezier(.2,1,.3,1)}.eael-creative-button--wayra::before{content:'';position:absolute;top:0;left:0;width:150%;height:100%;z-index:-1;transform:rotate3d(0,0,1,-45deg) translate3d(0,-3em,0);transform-origin:0 100%;transition:transform .3s,opacity .3s,background-color .3s}.eael-creative-button--wayra:hover::before{opacity:1;transform:rotate3d(0,0,1,0deg);transition-timing-function:cubic-bezier(.2,1,.3,1)}.eael-creative-button--tamaya{float:left;min-width:150px;max-width:250px;display:block;margin:1em;padding:1em 2em;border:none;background:0 0;color:inherit;vertical-align:middle;position:relative;z-index:1;-webkit-backface-visibility:hidden;-moz-osx-font-smoothing:grayscale;overflow:hidden;color:#7986cb;min-width:180px}.eael-creative-button--tamaya.button--inverted{color:#37474f;border-color:#37474f}.eael-creative-button--tamaya::after,.eael-creative-button--tamaya::before{content:attr(data-text);position:absolute;width:100%;height:50%;left:0;background:#7986cb;color:#fff;overflow:hidden;transition:transform .3s;transition-timing-function:cubic-bezier(.2,1,.3,1)}.eael-creative-button--tamaya.button--inverted::after,.eael-creative-button--tamaya.button--inverted::before{background:#fff;color:#37474f}.eael-creative-button--tamaya::before{top:0;padding-top:1em}.eael-creative-button--tamaya::after{bottom:0;line-height:0}.eael-creative-button--tamaya span{display:block;transform:scale3d(.2,.2,1);opacity:0;transition:transform .3s,opacity .3s;transition-timing-function:cubic-bezier(.2,1,.3,1)}.eael-creative-button--tamaya:hover::before{transform:translate3d(0,-100%,0)}.eael-creative-button--tamaya:hover::after{transform:translate3d(0,100%,0)}.eael-creative-button--tamaya:hover span{opacity:1;transform:scale3d(1,1,1);content:'Bangladesh'}.eael-creative-button--rayen{overflow:hidden;padding:0!important}.eael-creative-button--rayen::before{content:attr(data-text);position:absolute;top:0;left:0;width:100%;height:100%;transform:translate3d(-100%,0,0);display:flex;align-items:center;justify-content:center}.eael-creative-button--rayen::before,.eael-creative-button--rayen>.creative-button-inner{padding:1em 2em;transition:transform .3s;transition-timing-function:cubic-bezier(.75,0,.125,1)}.eael-creative-button--rayen:hover::before{transform:translate3d(0,0,0)}.eael-creative-button--rayen:hover>.creative-button-inner{transform:translate3d(0,100%,0)}.creative-button-inner{display:flex;flex-direction:row;align-items:center;justify-content:center}.eael-creative-button-icon-left{margin-right:5px}.eael-creative-button-icon-right{margin-left:5px}
11
+ @charset "UTF-8";table.eael-data-table thead .sorting,table.eael-data-table thead .sorting_asc,table.eael-data-table thead .sorting_desc{position:relative;z-index:0;outline:0;cursor:pointer}table.eael-data-table thead .sorting:after,table.eael-data-table thead .sorting_asc:after,table.eael-data-table thead .sorting_desc:after{position:absolute;top:50%;right:10px;font-family:FontAwesome;color:#fff;z-index:1;transform:translateY(-50%)}.eael-data-table-wrap .eael-data-tables_wrapper{display:flex;flex-flow:row wrap;justify-content:flex-start;width:100%}.eael-data-table-wrap .eael-data-tables_filter{flex-grow:1;flex-basis:50%;text-align:right}.eael-data-table-wrap .eael-data-tables_filter label{font-weight:700}.eael-data-table-wrap .eael-data-tables_filter label input[type=search]{height:40px;border:1px solid rgba(0,0,0,.09);outline:0;padding:10px;margin-left:10px}.eael-data-table-wrap .eael-data-tables_length{flex-grow:1;flex-basis:50%}.eael-data-table-wrap .eael-data-tables_length select{width:auto;max-width:120px;height:40px;border:1px solid rgba(0,0,0,.09);outline:0;margin-left:10px;margin-right:10px}.eael-data-table-wrap .eael-data-tables_length label{font-weight:700}.eael-data-table-wrap .eael-data-tables_info{flex-grow:1;flex-basis:50%;font-weight:700}.eael-data-table-wrap .eael-data-tables_paginate{flex-grow:1;flex-basis:50%;text-align:right}.eael-data-table-wrap .eael-data-tables_paginate .paginate_button{padding:10px 15px;background:#f2f2f2;margin-right:2px;cursor:pointer;transition:all .3s}.eael-data-table-wrap .eael-data-tables_paginate .paginate_button:hover{color:#fff;background:#4a4893}.eael-data-table-wrap .eael-data-tables_paginate .paginate_button.current{color:#fff;background:#4a4893}.eael-data-table-wrap .eael-data-tables_paginate .paginate_button.disabled{cursor:no-drop;background:#f2f2f2;opacity:.5;color:#888}.data-header-icon{margin-right:10px;position:relative;top:2px}.eael-data-table{width:100%;height:auto;margin:0;border-collapse:collapse;border:none}.eael-data-table tr{border-style:none}.eael-data-table thead tr{text-align:left}.eael-data-table thead tr th{padding:20px 15px;background:#4a4893;font-size:16px;font-weight:600;font-family:Montserrat,sans-serif;line-height:1;color:#fff;border-color:#000;border-width:2px;border-style:none;background-clip:padding-box}.eael-data-table thead tr th:hover{border-color:#000}.eael-data-table tbody tr.even{transition:background .4s ease-in-out}.eael-data-table tbody tr.even:hover{background:rgba(242,242,242,.7)}.eael-data-table tbody tr.even:last-child{border-bottom:1px solid rgba(0,0,0,.09)}.eael-data-table tbody tr.odd{background:rgba(242,242,242,.5);transition:background .2s ease-in-out}.eael-data-table tbody tr.odd:hover{background:rgba(242,242,242,.7)}.eael-data-table tbody tr.odd:last-child{border-bottom:1px solid rgba(0,0,0,.09)}.eael-data-table tbody tr td{padding:20px 15px;font-size:14px;font-family:Montserrat,sans-serif;line-height:1;border-width:2px;border-style:none;background-clip:padding-box}.eael-data-table-th-img{display:inline-block;margin:0 15px 0 0;line-height:1}.th-mobile-screen{display:none}@media (max-width:767px){.eael-data-table-wrap{overflow-x:scroll!important;padding-bottom:5px}.th-mobile-screen{display:inline-block;padding:0 .6em;margin-right:10px;text-align:center;flex-grow:0;flex-shrink:0;flex-basis:100px}.th-mobile-screen .eael-data-table-th-img{margin:0 auto 15px auto;display:block}.th-mobile-screen .data-header-icon{margin:0 auto 15px auto;display:block}.td-content-wrapper{display:flex;width:100%}.td-content{width:100%;justify-content:center}.td-content>p{width:100%;justify-content:center}.custom-responsive-option-enable .eael-data-table thead{display:none}.custom-responsive-option-enable .eael-data-table tbody tr td{float:none;clear:left;width:100%;text-align:left;display:flex;align-items:center}.eael-data-table .td-content{align-items:center;display:flex}}table.eael-data-table thead .sorting:after{content:""}table.eael-data-table thead .headerSortDown:after{content:""}table.eael-data-table thead .headerSortUp:after{content:""}table.eael-data-table thead .sorting_disabled.sorting:after{display:none}table.eael-data-table .sorting.sorting-none:after{display:none}table.eael-data-table .sorting_desc.sorting-none:after{display:none}table.eael-data-table .sorting_asc.sorting-none:after{display:none}.eael-table-align-left table.eael-data-table{float:left}.eael-table-align-center table.eael-data-table{margin:0 auto}.eael-table-align-right table.eael-data-table{float:right}.eael-hide-elements .eael-data-tables_info{display:none}.eael-dt-th-align-left .eael-data-table thead tr th{text-align:left}.eael-dt-th-align-right .eael-data-table thead tr th{text-align:right;padding-right:30px}.eael-dt-th-align-center .eael-data-table thead tr th{text-align:center}.eael-dt-td-align-left .eael-data-table tbody tr td{text-align:left}.eael-dt-td-align-center .eael-data-table tbody tr td{text-align:center}.eael-dt-td-align-right .eael-data-table tbody tr td{text-align:right;padding-right:30px}@media (max-width:1024px){.eael-dt-td-align-tablet-left .eael-data-table tbody tr td{text-align:left}.eael-dt-td-align-tablet-center .eael-data-table tbody tr td{text-align:center}.eael-dt-td-align-tablet-right .eael-data-table tbody tr td{text-align:right}}@media (max-width:767px){.eael-dt-td-align-mobile-left .eael-data-table tbody tr td{text-align:left}.eael-dt-td-align-mobile-center .eael-data-table tbody tr td{text-align:center}.eael-dt-td-align-mobile-right .eael-data-table tbody tr td{text-align:right}}
12
  .eael-dual-header{display:block;margin-bottom:50px}.eael-dual-header .title,.eael-dual-header .title span{font-size:36px;font-weight:700;text-transform:uppercase;line-height:48px;margin:10px 0}.eael-dual-header .subtext{font-size:16px;display:block}.eael-dual-header i{display:block;padding:0;margin:20px 0 10px 0;font-size:36px}.eael-dual-header .title span.lead{color:#1abc9c}.eael-dual-header-content-align-center{text-align:center}.eael-dual-header-content-align-left{text-align:left}.eael-dual-header-content-align-right{text-align:right}
13
  .elementor-panel .pro-feature,.elementor-panel .pro-feature a{color:#a4afb7;text-transform:uppercase;letter-spacing:1px;line-height:1.8;font-style:normal}.elementor-panel .pro-feature a{text-decoration:underline;color:#f54!important}.elementor-control-data_table_content_colspan_pro_alert .elementor-control-title,.elementor-control-data_table_content_rowspan_pro_alert .elementor-control-title,.elementor-control-data_table_content_template_pro_alert .elementor-control-title,.elementor-control-data_table_header_colspan_pro_alert .elementor-control-title,.elementor-control-data_table_header_img_pro_alert .elementor-control-title,.elementor-panel .elementor-control-eael_section_pro .elementor-panel-heading-title.elementor-panel-heading-title,.elementor-panel .elementor-control-eael_section_pro .elementor-panel-heading-toggle{color:#f54}.elementor-panel .elementor-control-eael_control_get_pro .elementor-control-field{display:none!important}.elementor-control-eael_fancy_text_style_pro_alert .elementor-control-title,.elementor-control-eael_img_accordion_type_pro_alert .elementor-control-title,.elementor-control-eael_pricing_table_style_pro_alert .elementor-control-title,.elementor-control-eael_section_countdown_style_pro_alert .elementor-control-title,.elementor-control-eael_section_data_table_enabled_pro_alert .elementor-control-title,.elementor-control-eael_team_members_preset_pro_alert .elementor-control-title,.elementor-control-eael_ticker_type_pro_alert .elementor-control-title{color:#f54}
 
14
  .eael-facebook-feed{width:100%;margin:auto}.eael-facebook-feed.eael-col-1 .eael-facebook-feed-item{float:none;width:100%}@media only screen and (max-width:979px){.eael-facebook-feed.eael-col-1 .eael-facebook-feed-item{width:50%}}@media only screen and (max-width:480px){.eael-facebook-feed.eael-col-1 .eael-facebook-feed-item{width:100%}}.eael-facebook-feed.eael-col-2 .eael-facebook-feed-item{float:left;width:50%}@media only screen and (max-width:979px){.eael-facebook-feed.eael-col-2 .eael-facebook-feed-item{width:50%}}@media only screen and (max-width:480px){.eael-facebook-feed.eael-col-2 .eael-facebook-feed-item{width:100%}}.eael-facebook-feed.eael-col-3 .eael-facebook-feed-item{float:left;width:33.3333%}@media only screen and (max-width:979px){.eael-facebook-feed.eael-col-3 .eael-facebook-feed-item{width:50%}}@media only screen and (max-width:480px){.eael-facebook-feed.eael-col-3 .eael-facebook-feed-item{width:100%}}.eael-facebook-feed.eael-col-4 .eael-facebook-feed-item{float:left;width:25%}@media only screen and (max-width:979px){.eael-facebook-feed.eael-col-4 .eael-facebook-feed-item{width:50%}}@media only screen and (max-width:480px){.eael-facebook-feed.eael-col-4 .eael-facebook-feed-item{width:100%}}.eael-facebook-feed.eael-col-5 .eael-facebook-feed-item{float:left;width:20%}@media only screen and (max-width:979px){.eael-facebook-feed.eael-col-5 .eael-facebook-feed-item{width:50%}}@media only screen and (max-width:480px){.eael-facebook-feed.eael-col-5 .eael-facebook-feed-item{width:100%}}.eael-facebook-feed.eael-col-6 .eael-facebook-feed-item{float:left;width:16.6666%}@media only screen and (max-width:979px){.eael-facebook-feed.eael-col-6 .eael-facebook-feed-item{width:50%}}@media only screen and (max-width:480px){.eael-facebook-feed.eael-col-6 .eael-facebook-feed-item{width:100%}}.eael-facebook-feed .eael-facebook-feed-item{display:inline-block;line-height:0}.eael-facebook-feed .eael-facebook-feed-item,.eael-facebook-feed .eael-facebook-feed-item-inner{position:relative}.eael-facebook-feed-overlay .eael-facebook-feed-item .eael-facebook-feed-item-overlay{display:flex;justify-content:center;text-align:center;position:absolute;top:0;bottom:0;left:0;right:0;font-size:12px;line-height:1;transform:scale(.8);opacity:0;transition:all .2s}.eael-facebook-feed-overlay .eael-facebook-feed-item .eael-facebook-feed-item-overlay .eael-facebook-feed-item-overlay-inner{position:relative;align-self:center}.eael-facebook-feed-overlay .eael-facebook-feed-item:hover .eael-facebook-feed-item-overlay{transform:scale(1);opacity:1}.eael-facebook-feed-overlay .eael-facebook-feed-meta{margin-bottom:0}.eael-facebook-feed-overlay .eael-facebook-feed-meta span{display:inline-block;margin:0 15px}.eael-facebook-feed-card .eael-facebook-feed-item .eael-facebook-feed-item-inner{margin:10px}.eael-facebook-feed-card .eael-facebook-feed-item .eael-facebook-feed-item-inner .eael-facebook-feed-item-header{padding:8px 12px}.eael-facebook-feed-card .eael-facebook-feed-item .eael-facebook-feed-item-inner .eael-facebook-feed-item-header .eael-facebook-feed-item-user{float:left}.eael-facebook-feed-card .eael-facebook-feed-item .eael-facebook-feed-item-inner .eael-facebook-feed-item-header .eael-facebook-feed-item-user .eael-facebook-feed-avatar{float:left;display:inline-block;width:32px;height:32px;border-radius:50%;margin-right:10px}.eael-facebook-feed-card .eael-facebook-feed-item .eael-facebook-feed-item-inner .eael-facebook-feed-item-header .eael-facebook-feed-item-user .eael-facebook-feed-username{float:left;display:inline-block;font-size:14px;font-weight:400;line-height:32px;margin:0}.eael-facebook-feed-card .eael-facebook-feed-item .eael-facebook-feed-item-inner .eael-facebook-feed-item-header .eael-facebook-feed-post-time{float:right;font-size:11px;font-weight:400;line-height:32px}.eael-facebook-feed-card .eael-facebook-feed-item .eael-facebook-feed-item-inner .eael-facebook-feed-item-content{position:relative;display:block;padding:12px}.eael-facebook-feed-card .eael-facebook-feed-item .eael-facebook-feed-item-inner .eael-facebook-feed-item-content .eael-facebook-feed-message{font-size:14px;font-weight:400;line-height:1.3;margin:0}.eael-facebook-feed-card .eael-facebook-feed-item .eael-facebook-feed-item-inner .eael-facebook-feed-preview-wrap{padding:0}.eael-facebook-feed-card .eael-facebook-feed-item .eael-facebook-feed-item-inner .eael-facebook-feed-preview-wrap .eael-facebook-feed-preview-img{display:block;position:relative;margin-bottom:12px}.eael-facebook-feed-card .eael-facebook-feed-item .eael-facebook-feed-item-inner .eael-facebook-feed-preview-wrap .eael-facebook-feed-preview-overlay{position:absolute;top:0;right:0;bottom:0;left:0;background-color:rgba(0,0,0,.4);display:flex;align-items:center;justify-content:center}.eael-facebook-feed-card .eael-facebook-feed-item .eael-facebook-feed-item-inner .eael-facebook-feed-preview-wrap .eael-facebook-feed-preview-overlay i{font-size:48px;color:#fff}.eael-facebook-feed-card .eael-facebook-feed-item .eael-facebook-feed-item-inner .eael-facebook-feed-preview-wrap .eael-facebook-feed-url-preview{padding:0 12px 15px}.eael-facebook-feed-card .eael-facebook-feed-item .eael-facebook-feed-item-inner .eael-facebook-feed-preview-wrap .eael-facebook-feed-url-preview .eael-facebook-feed-url-host{font-size:12px;font-weight:400;line-height:1;text-transform:uppercase;margin-bottom:5px}.eael-facebook-feed-card .eael-facebook-feed-item .eael-facebook-feed-item-inner .eael-facebook-feed-preview-wrap .eael-facebook-feed-url-preview .eael-facebook-feed-url-title{font-size:15px;font-weight:700;line-height:1.4;margin-top:0;margin-bottom:6px}.eael-facebook-feed-card .eael-facebook-feed-item .eael-facebook-feed-item-inner .eael-facebook-feed-preview-wrap .eael-facebook-feed-url-preview .eael-facebook-feed-url-description{font-size:14px;font-weight:400;line-height:1.2;margin-bottom:0}.eael-facebook-feed-card .eael-facebook-feed-item .eael-facebook-feed-item-inner .eael-facebook-feed-item-footer{font-size:13px;font-weight:400;line-height:30px;padding:8px 12px}.eael-facebook-feed-card .eael-facebook-feed-item .eael-facebook-feed-item-inner .eael-facebook-feed-item-footer span{display:inline-block}.eael-facebook-feed-card .eael-facebook-feed-item .eael-facebook-feed-item-inner .eael-facebook-feed-item-footer span.eael-facebook-feed-post-likes{margin-right:15px}.elementor-widget-eael-facebook-feed .eael-load-more-button-wrap{justify-content:center;margin-top:15px}.elementor-widget-eael-facebook-feed .eael-load-more-button-wrap.no-pagination{display:none}
15
  .eael-fancy-text-container p{margin:0}.eael-fancy-text-strings{display:none}.eael-fancy-text-prefix,.eael-fancy-text-suffix{display:inline-block}.morphext>.animated{display:inline-block}.typed-cursor{opacity:1;-webkit-animation:blink_cursor .7s infinite;animation:blink_cursor .7s infinite}@keyframes blink_cursor{0%{opacity:1}50%{opacity:0}100%{opacity:1}}@-webkit-keyframes blink_cursor{0%{opacity:1}50%{opacity:0}100%{opacity:1}}.eael-fancy-text-container.style-2{font-size:24px}.eael-fancy-text-container.style-2 .eael-fancy-text-strings{background:#f54;color:#fff;padding:10px 25px}
16
  .elementor-widget-eael-feature-list.-icon-position-left .connector-type-modern.rhombus .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-right .connector-type-modern.rhombus .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-top .connector-type-modern.rhombus .eael-feature-list-item:before{top:3px!important}.elementor-widget-eael-feature-list.-icon-position-left .connector-type-modern.rhombus .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-right .connector-type-modern.rhombus .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-top .connector-type-modern.rhombus .eael-feature-list-item:after{top:45px!important}.elementor-widget-eael-feature-list.-icon-position-right .connector,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right .connector{right:0;left:calc(100% - 70px)}.elementor-widget-eael-feature-list.-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item{padding:0 50px 0 0}@media (max-width:767px){.elementor-widget-eael-feature-list.-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item{padding:0 30px 0 0}}.elementor-widget-eael-feature-list.-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before{left:auto;right:0}.elementor-widget-eael-feature-list.-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after{left:auto;right:5px;top:30px}.elementor-widget-eael-feature-list .eael-feature-list-items{list-style-type:none;margin:0;padding:0}.elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item{position:relative}.elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item .connector{display:block;position:absolute;width:0;margin:0 auto;z-index:1;height:100%;top:.5em;font-size:60px;left:0;right:calc(100% - 60px);border-left:2px solid #2ecc71;border-right:none!important}.elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item:last-child .connector{display:none}.elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item .eael-feature-list-icon-box{z-index:2;transition:all .5s}@media (prefers-reduced-motion:reduce){.elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item .eael-feature-list-icon-box{transition:none}}.elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item .eael-feature-list-icon-box .eael-feature-list-icon-inner{background-color:#37368e;transition:all .5s;display:inline-flex}@media (prefers-reduced-motion:reduce){.elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item .eael-feature-list-icon-box .eael-feature-list-icon-inner{transition:none}}.elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item .eael-feature-list-icon-box .eael-feature-list-icon{padding:.5em;transition:all .5s;font-size:30px;line-height:1;color:#37368e;text-align:center;display:inline-flex;display:flex;align-items:center;justify-content:center}@media (prefers-reduced-motion:reduce){.elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item .eael-feature-list-icon-box .eael-feature-list-icon{transition:none}}.elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item .eael-feature-list-icon-box .eael-feature-list-icon i{width:1em;height:1em;position:relative;display:block}.elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item .eael-feature-list-icon-box .eael-feature-list-icon i:before{position:absolute;left:50%;transform:translateX(-50%)}.elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item .eael-feature-list-icon-box .eael-feature-list-img{font-size:8px;line-height:1;max-width:inherit}.elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item .eael-feature-list-content-box{margin:0 0 0 20px}.elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item .eael-feature-list-content-box .eael-feature-list-title{margin-top:-2px;line-height:1.5em}.elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item .eael-feature-list-content-box .eael-feature-list-content{padding:0;margin:0;font-size:14px;line-height:1.5em}.elementor-widget-eael-feature-list .eael-feature-list-items.stacked .eael-feature-list-icon-box .eael-feature-list-icon{color:#fff}.elementor-widget-eael-feature-list .eael-feature-list-items.framed .eael-feature-list-icon-box .eael-feature-list-icon{background-color:#fff}.elementor-widget-eael-feature-list .eael-feature-list-items.circle .eael-feature-list-icon-box .eael-feature-list-icon-inner{border-radius:50%}.elementor-widget-eael-feature-list .eael-feature-list-items.circle .eael-feature-list-icon-box .eael-feature-list-icon-inner .eael-feature-list-icon{border-radius:50%}.elementor-widget-eael-feature-list .eael-feature-list-items.rhombus .eael-feature-list-icon-box .eael-feature-list-icon-inner{transform:rotate(45deg);margin:15px}.elementor-widget-eael-feature-list .eael-feature-list-items.rhombus .eael-feature-list-icon-box .eael-feature-list-icon i{transform:rotate(-45deg)}.elementor-widget-eael-feature-list .eael-feature-list-items.rhombus .eael-feature-list-icon-box .eael-feature-list-icon img{transform:rotate(-45deg)}.elementor-widget-eael-feature-list .eael-feature-list-items.rhombus .eael-feature-list-content-box .eael-feature-list-title{margin-top:15px}.elementor-widget-eael-feature-list .eael-feature-list-items.connector-type-modern .eael-feature-list-item{padding:0 0 0 50px;position:relative}@media (max-width:767px){.elementor-widget-eael-feature-list .eael-feature-list-items.connector-type-modern .eael-feature-list-item{padding:0 0 0 30px;display:block}}.elementor-widget-eael-feature-list .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before{content:"";position:absolute;display:block}.elementor-widget-eael-feature-list .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before{left:0;top:0;z-index:1;border-left:1px solid #000;border-right:none!important;height:100%}.elementor-widget-eael-feature-list .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after{left:5px;top:30px;width:23px;display:block;z-index:2;border-bottom:1px dashed #000;border-top:none!important}.elementor-widget-eael-feature-list .eael-feature-list-items.connector-type-modern .eael-feature-list-item .connector{display:none}@media (min-width:768px){.elementor-widget-eael-feature-list .eael-feature-list-items.connector-type-modern.-icon-position-right .eael-feature-list-item{padding:0 50px 0 0}.elementor-widget-eael-feature-list .eael-feature-list-items.connector-type-modern.-icon-position-right .eael-feature-list-item:before{left:auto;right:0}.elementor-widget-eael-feature-list .eael-feature-list-items.connector-type-modern.-icon-position-right .eael-feature-list-item:after{left:auto;right:5px;top:30px}.elementor-widget-eael-feature-list .eael-feature-list-items.connector-type-modern.-icon-position-right .eael-feature-list-item .connector{display:none}}@media (min-width:1025px){.elementor-widget-eael-feature-list.-icon-position-left .eael-feature-list-content-box{margin-right:0!important;margin-top:0!important;margin-bottom:0!important}.elementor-widget-eael-feature-list.-icon-position-right .eael-feature-list-content-box{margin-left:0!important;margin-top:0!important;margin-bottom:0!important}.elementor-widget-eael-feature-list.-icon-position-top .eael-feature-list-content-box{margin-left:0!important;margin-right:0!important;margin-bottom:0!important}.elementor-widget-eael-feature-list.-icon-position-left .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right .eael-feature-list-item{display:flex}.elementor-widget-eael-feature-list.-icon-position-left .eael-feature-list-item{text-align:left;flex-direction:row}.elementor-widget-eael-feature-list.-icon-position-right .eael-feature-list-item{text-align:right;flex-direction:row-reverse}}@media (max-width:1024px){.elementor-widget-eael-feature-list.-tablet-icon-position-left .eael-feature-list-item,.elementor-widget-eael-feature-list.-tablet-icon-position-right .eael-feature-list-item{display:flex}.elementor-widget-eael-feature-list.-tablet-icon-position-left .eael-feature-list-item{text-align:left;flex-direction:row}.elementor-widget-eael-feature-list.-tablet-icon-position-right .eael-feature-list-item{text-align:right;flex-direction:row-reverse}}@media (min-width:768px) and (max-width:1024px){.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left .eael-feature-list-content-box{margin-right:0!important;margin-top:0!important;margin-bottom:0!important}.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item{padding:0 0 0 50px}}@media (min-width:768px) and (max-width:1024px) and (max-width:767px){.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item{padding:0 0 0 30px}}@media (min-width:768px) and (max-width:1024px){.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before{left:0;right:auto}.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after{left:5px;top:30px}.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top .eael-feature-list-content-box{margin-left:0!important;margin-right:0!important;margin-bottom:0!important}.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item{padding:0 0 0 50px}}@media (min-width:768px) and (max-width:1024px) and (max-width:767px){.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item{padding:0 0 0 30px}}@media (min-width:768px) and (max-width:1024px){.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before{left:0;right:auto}.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after{left:5px}.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right .eael-feature-list-content-box{margin-left:0!important;margin-top:0!important;margin-bottom:0!important}.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item{padding:0 50px 0 0}}@media (min-width:768px) and (max-width:1024px) and (max-width:767px){.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item{padding:0 30px 0 0}}@media (min-width:768px) and (max-width:1024px){.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before{right:0;left:auto}.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after{left:auto;right:5px}}@media (max-width:767px){.elementor-widget-eael-feature-list.-icon-position-left .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right .eael-feature-list-item,.elementor-widget-eael-feature-list.-tablet-icon-position-left .eael-feature-list-item,.elementor-widget-eael-feature-list.-tablet-icon-position-right .eael-feature-list-item{display:block;text-align:left}.elementor-widget-eael-feature-list.-mobile-icon-position-left .eael-feature-list-item,.elementor-widget-eael-feature-list.-mobile-icon-position-right .eael-feature-list-item{display:flex}.elementor-widget-eael-feature-list.-mobile-icon-position-left .eael-feature-list-item{text-align:left;flex-direction:row}.elementor-widget-eael-feature-list.-mobile-icon-position-right .eael-feature-list-item{text-align:right;flex-direction:row-reverse}.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left.-mobile-icon-position-left .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right.-mobile-icon-position-left .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top.-mobile-icon-position-left .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left.-mobile-icon-position-left .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right.-mobile-icon-position-left .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top.-mobile-icon-position-left .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left.-mobile-icon-position-left .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right.-mobile-icon-position-left .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top.-mobile-icon-position-left .eael-feature-list-content-box{margin-right:0!important;margin-top:0!important;margin-bottom:0!important}.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item{padding:0 0 0 50px}}@media (max-width:767px) and (max-width:767px){.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item{padding:0 0 0 30px}}@media (max-width:767px){.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before{left:0;right:auto}.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after{left:5px}.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left.-mobile-icon-position-top .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right.-mobile-icon-position-top .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top.-mobile-icon-position-top .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left.-mobile-icon-position-top .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right.-mobile-icon-position-top .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top.-mobile-icon-position-top .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left.-mobile-icon-position-top .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right.-mobile-icon-position-top .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top.-mobile-icon-position-top .eael-feature-list-content-box{margin-left:0!important;margin-right:0!important;margin-bottom:0!important}.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item{padding:0 0 0 50px}}@media (max-width:767px) and (max-width:767px){.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item{padding:0 0 0 30px}}@media (max-width:767px){.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before{left:0;right:auto}.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after{left:5px}.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left.-mobile-icon-position-right .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right.-mobile-icon-position-right .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top.-mobile-icon-position-right .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left.-mobile-icon-position-right .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right.-mobile-icon-position-right .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top.-mobile-icon-position-right .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left.-mobile-icon-position-right .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right.-mobile-icon-position-right .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top.-mobile-icon-position-right .eael-feature-list-content-box{margin-left:0!important;margin-top:0!important;margin-bottom:0!important}.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item{padding:0 50px 0 0}}@media (max-width:767px) and (max-width:767px){.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item{padding:0 30px 0 0}}@media (max-width:767px){.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before{right:0;left:auto}.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after{left:auto;right:5px}}
17
  .eael-filter-gallery-control{width:100%}.eael-filter-gallery-control ul,.eael-filter-gallery-control ul li{text-align:center}.eael-filter-gallery-control ul{margin:0 0 20px 0;padding:0;text-align:center}.eael-filter-gallery-control{display:flex;flex-flow:1 1 auto;align-items:center;justify-content:center;flex-flow:row wrap;padding:0;margin:0}.eael-filter-gallery-control ul li{list-style:none;font-size:24px;display:inline-block;text-align:center}.eael-filter-gallery-control ul li a.control{font-family:Montserrat,sans-serif;font-size:16px;font-weight:600;padding:10px 25px;margin:10px 6px}.eael-filter-gallery-container{text-align:justify;font-size:.1px}.eael-filter-gallery-container:after{content:'';display:inline-block;width:100%}.eael-filter-gallery-container:not(.eael-cards) .item:before{content:'';display:inline-block;padding-top:56.25%}.eael-filter-gallery-container .item .caption{position:absolute;display:flex;flex-flow:1 1 100%;align-items:center;justify-content:center;z-index:1;top:0;left:0;right:0;bottom:0;transition:transform .4s}.eael-filter-gallery-container.eael-cards .item .caption{display:none}.eael-filter-gallery-container.eael-cards .item .item-img .caption{position:absolute;display:flex;flex-flow:1 1 100%;align-items:center;justify-content:center;z-index:10;top:0;left:0;right:0;bottom:0;transition:transform .4s}.gallery-item-caption-over{width:100%;height:auto}a.eael-gallery-load-more,a.eael-gallery-load-more:hover{text-decoration:none}.eael-filter-gallery-container .item .caption.eael-zoom-in,.eael-filter-gallery-container.eael-cards .item .item-img .caption.eael-zoom-in{transform:scale(0)}.eael-filter-gallery-container .item:hover .caption.eael-zoom-in,.eael-filter-gallery-container.eael-cards .item:hover .item-img .caption.eael-zoom-in{transform:scale(1)}.eael-filter-gallery-container .item .caption.eael-slide-left,.eael-filter-gallery-container.eael-cards .item .item-img .caption.eael-slide-left{transform:translateX(-100%)}.eael-filter-gallery-container .item:hover .caption.eael-slide-left,.eael-filter-gallery-container.eael-cards .item:hover .item-img .caption.eael-slide-left{transform:translateX(0)}.eael-filter-gallery-container .item .caption.eael-slide-right,.eael-filter-gallery-container.eael-cards .item .item-img .caption.eael-slide-right{transform:translateX(100%)}.eael-filter-gallery-container .item:hover .caption.eael-slide-right,.eael-filter-gallery-container.eael-cards .item:hover .item-img .caption.eael-slide-right{transform:translateX(0)}.eael-filter-gallery-container .item .caption.eael-slide-top,.eael-filter-gallery-container.eael-cards .item .item-img .caption.eael-slide-top{transform:translateY(-100%)}.eael-filter-gallery-container .item:hover .caption.eael-slide-top,.eael-filter-gallery-container.eael-cards .item:hover .item-img .caption.eael-slide-top{transform:translateY(0)}.eael-filter-gallery-container .item .caption.eael-slide-bottom,.eael-filter-gallery-container.eael-cards .item .item-img .caption.eael-slide-bottom{transform:translateY(100%)}.eael-filter-gallery-container .item:hover .caption.eael-slide-bottom,.eael-filter-gallery-container.eael-cards .item:hover .item-img .caption.eael-slide-bottom{transform:translateY(0)}.eael-filter-gallery-container .item .caption a{display:inline-block;width:50px;height:50px;text-align:center;line-height:50px;border-radius:50%;margin:0 5px;font-size:20px;cursor:pointer;transition:.3s}.eael-container .item .caption a:nth-child(2),.eael-filter-gallery-container .item .caption a:nth-child(1){transition:.6s;opacity:0}.eael-filter-gallery-container .item .caption a:nth-child(1){transform:translateY(-100%)}.eael-filter-gallery-container .item .caption a:nth-child(2){transform:translateY(100%)}.eael-filter-gallery-container .item .caption:hover a:nth-child(1),.eael-filter-gallery-container .item .caption:hover a:nth-child(2){transform:translateY(0);opacity:1}.eael-filter-gallery-container .item .caption .eael-popup-link{outline:0}.eael-filter-gallery-container.eael-cards .item:before{padding-top:0}.eael-filter-gallery-container.eael-cards .item-img{position:relative;background-repeat:no-repeat;background-position:center;background-size:cover;height:220px;z-index:0;overflow:hidden}.eael-filter-gallery-container.eael-cards .item-content{padding:15px}.eael-filter-gallery-container.eael-cards .item-content .title,.eael-filter-gallery-container.eael-cards .item-content .title a{font-size:20px;line-height:1;margin-bottom:0;transition:.3s}.eael-filter-gallery-container.eael-cards .item-content p{font-size:14px;line-height:26px}.eael-fg-card-content-align-center .eael-filterable-gallery-item-wrap .gallery-item-caption-wrap .gallery-item-caption-over{text-align:center}.eael-fg-card-content-align-right .eael-filterable-gallery-item-wrap .gallery-item-caption-wrap .gallery-item-caption-over{text-align:right}.eael-fg-hoverer-content-align-center .eael-filterable-gallery-item-wrap .gallery-item-caption-wrap .gallery-item-caption-over{text-align:center}.eael-fg-hoverer-content-align-right .eael-filterable-gallery-item-wrap .gallery-item-caption-wrap .gallery-item-caption-over{text-align:right}.eael-fg-content-align-left .eael-cards .item .item-content{text-align:left}.eael-fg-content-align-center .eael-cards .item .item-content{text-align:center}.eael-fg-content-align-right .eael-cards .item .item-content{text-align:right}.mfp-wrap~div.dialog-widget{display:none!important}.eael-filterable-gallery-item-wrap{float:left;width:33.33%}.eael-filter-gallery-container.eael-col-1 .eael-filterable-gallery-item-wrap{width:100%}.eael-filter-gallery-control>ul li{font-size:13px;line-height:1.8;text-transform:uppercase;letter-spacing:1px;padding:6px 15px;cursor:pointer;margin:0 5px;font-weight:400}.eael-filter-gallery-container.eael-col-2 .eael-filterable-gallery-item-wrap{width:50%}.eael-filter-gallery-container.eael-col-4 .eael-filterable-gallery-item-wrap{width:25%}.eael-filter-gallery-container.eael-col-5 .eael-filterable-gallery-item-wrap{width:20%}.eael-gallery-grid-item{margin-left:calc(20px/2);margin-right:calc(20px/2);margin-bottom:20px;position:relative}.gallery-item-caption-wrap,.media-content-wrap{font-size:14px;text-align:left}.gallery-item-thumbnail-wrap.caption-style-card img{max-height:100%;width:100%}.gallery-item-caption-wrap.caption-style-hoverer{position:absolute;left:0;top:0;height:100%;width:100%;padding:15px;z-index:10}.eael-filterable-gallery-item-wrap .eael-gallery-grid-item .gallery-item-thumbnail-wrap>img{height:100%;width:100%;-o-object-fit:cover;object-fit:cover}.fg-item-content,.fg-item-title{color:#fff;font-family:inherit}.gallery-item-caption-wrap.caption-style-card .fg-item-title{font-size:18px;margin:15px 0 15px;line-height:1}.gallery-item-caption-wrap.caption-style-card{background:#f7f7f7}.gallery-item-caption-wrap.caption-style-card .fg-item-title{margin:10px 0 15px;color:#000}.gallery-item-caption-wrap.caption-style-card .fg-item-content{color:#212529;line-height:1.5;font-weight:400}.gallery-item-buttons>a{display:inline-block;font-size:16px;color:#000;margin-right:15px}.gallery-item-buttons>a:visited{color:#000}.gallery-item-caption-wrap.caption-style-card{padding:10px;box-sizing:border-box;font-family:inherit}.gallery-item-caption-wrap .gallery-item-hoverer-bg{position:absolute;left:0;top:0;height:100%;width:100%;content:'';background:#000;z-index:-1;opacity:.7}.gallery-item-caption-wrap.caption-style-hoverer{visibility:hidden;opacity:0;transition:.6s all ease;display:flex;align-items:center}.eael-gallery-grid-item:hover .gallery-item-caption-wrap.caption-style-hoverer{opacity:1;visibility:visible}.gallery-item-caption-wrap.caption-style-hoverer h5{font-size:20px;margin-bottom:5px;line-height:1}.gallery-item-caption-wrap.caption-style-hoverer.eael-slide-up h5{transform:translateY(20px);transition:.6s all ease}.gallery-item-caption-wrap.caption-style-hoverer p{margin-bottom:5px}.gallery-item-caption-wrap.caption-style-hoverer.eael-slide-up p{transform:translateY(40px);transition:.6s all ease}.gallery-item-caption-wrap.caption-style-hoverer.eael-slide-up .gallery-item-buttons{transform:translateY(40px);transition:.6s all ease}.gallery-item-caption-wrap .gallery-item-buttons>a span{display:flex;align-items:center;justify-content:center;border-radius:50%;outline:0;text-decoration:none;display:inline-block;text-align:center}.gallery-item-caption-wrap.caption-style-hoverer.eael-zoom-in{transform:scale(.8);transition:.6s all ease}.eael-gallery-grid-item:hover .gallery-item-caption-wrap.caption-style-hoverer.eael-slide-up .gallery-item-buttons,.eael-gallery-grid-item:hover .gallery-item-caption-wrap.caption-style-hoverer.eael-slide-up h5,.eael-gallery-grid-item:hover .gallery-item-caption-wrap.caption-style-hoverer.eael-slide-up p{transform:translate(0)}.eael-gallery-grid-item:hover .gallery-item-caption-wrap.caption-style-hoverer.eael-zoom-in{transform:scale(1);visibility:visible;opacity:1}.gallery-item-caption-wrap.caption-style-hoverer.eael-none{transition:none}.gallery-item-thumbnail-wrap{position:relative}.video-popup,.video-popup-bg{position:absolute;left:0;top:0;height:100%;width:100%}.video-popup>img{width:62px;position:relative;z-index:1;transition:.3s}.video-popup{display:flex;align-items:center;justify-content:center}.video-popup:hover>img{transform:scale(1.1)}.video-popup-bg{visibility:hidden;opacity:0;transition:350ms}.eael-gallery-grid-item:hover .video-popup-bg{visibility:visible;opacity:1}.gallery-item-thumbnail-wrap>.gallery-item-caption-wrap{position:absolute;left:0;top:0;height:100%;width:100%;display:flex;align-items:center;justify-content:center}.gallery-item-caption-wrap.card-hover-bg{visibility:hidden;opacity:0;transition:.8s}.gallery-item-thumbnail-wrap:hover .gallery-item-caption-wrap.card-hover-bg{visibility:visible;opacity:1}.gallery-item-caption-wrap .gallery-item-buttons>a>i{display:flex;align-items:center;justify-content:center;height:100%}@media only screen and (min-width:1025px){.elementor-element.elementor-grid-1{position:relative}.elementor-element.elementor-grid-1 .eael-filterable-gallery-item-wrap{width:100%;float:left}.elementor-element.elementor-grid-2{position:relative}.elementor-element.elementor-grid-2 .eael-filterable-gallery-item-wrap{width:50%;float:left}.elementor-element.elementor-grid-2 .eael-filterable-gallery-item-wrap:nth-of-type(2n){margin-right:0!important}.elementor-element.elementor-grid-2 .eael-filterable-gallery-item-wrap:nth-of-type(2n+1){clear:left}.elementor-element.elementor-grid-3{position:relative}.elementor-element.elementor-grid-3 .eael-filterable-gallery-item-wrap{width:33.3333%;float:left}.elementor-element.elementor-grid-3 .eael-filterable-gallery-item-wrap:nth-of-type(3n){margin-right:0!important}.elementor-element.elementor-grid-3 .eael-filterable-gallery-item-wrap:nth-of-type(3n+1){clear:left}.elementor-element.elementor-grid-4{position:relative}.elementor-element.elementor-grid-4 .eael-filterable-gallery-item-wrap{width:25%;float:left}.elementor-element.elementor-grid-4 .eael-filterable-gallery-item-wrap:nth-of-type(4n){margin-right:0!important}.elementor-element.elementor-grid-4 .eael-filterable-gallery-item-wrap:nth-of-type(4n+1){clear:left}.elementor-element.elementor-grid-5{position:relative}.elementor-element.elementor-grid-5 .pp-logo-grid{margin-right:-5px}.elementor-element.elementor-grid-5 .eael-filterable-gallery-item-wrap{width:20%;float:left}.elementor-element.elementor-grid-5 .eael-filterable-gallery-item-wrap:nth-of-type(5n){margin-right:0!important}.elementor-element.elementor-grid-5 .eael-filterable-gallery-item-wrap:nth-of-type(5n+1){clear:left}.elementor-element.elementor-grid-6{position:relative}.elementor-element.elementor-grid-6 .pp-logo-grid{margin-right:-6px}.elementor-element.elementor-grid-6 .eael-filterable-gallery-item-wrap{width:16.6667%;float:left}.elementor-element.elementor-grid-6 .eael-filterable-gallery-item-wrap:nth-of-type(6n){margin-right:0!important}.elementor-element.elementor-grid-6 .eael-filterable-gallery-item-wrap:nth-of-type(6n+1){clear:left}}@media only screen and (max-width:1024px) and (min-width:766px){.elementor-element.elementor-grid-tablet-1{position:relative}.elementor-element.elementor-grid-tablet-1 .eael-filterable-gallery-item-wrap{width:100%;float:left}.elementor-element.elementor-grid-tablet-2{position:relative}.elementor-element.elementor-grid-tablet-2 .eael-filterable-gallery-item-wrap{width:50%;float:left}.elementor-element.elementor-grid-tablet-2 .eael-filterable-gallery-item-wrap:nth-of-type(2n){margin-right:0!important}.elementor-element.elementor-grid-tablet-2 .eael-filterable-gallery-item-wrap:nth-of-type(2n+1){clear:left}.elementor-element.elementor-grid-tablet-3{position:relative}.elementor-element.elementor-grid-tablet-3 .eael-filterable-gallery-item-wrap{width:33.3333%;float:left}.elementor-element.elementor-grid-tablet-3 .eael-filterable-gallery-item-wrap:nth-of-type(3n){margin-right:0!important}.elementor-element.elementor-grid-tablet-3 .eael-filterable-gallery-item-wrap:nth-of-type(3n+1){clear:left}.elementor-element.elementor-grid-tablet-4{position:relative}.elementor-element.elementor-grid-tablet-4 .eael-filterable-gallery-item-wrap{width:25%;float:left}.elementor-element.elementor-grid-tablet-4 .eael-filterable-gallery-item-wrap:nth-of-type(4n){margin-right:0!important}.elementor-element.elementor-grid-tablet-4 .eael-filterable-gallery-item-wrap:nth-of-type(4n+1){clear:left}.elementor-element.elementor-grid-tablet-5{position:relative}.elementor-element.elementor-grid-tablet-5 .eael-filterable-gallery-item-wrap{width:20%;float:left}.elementor-element.elementor-grid-tablet-5 .eael-filterable-gallery-item-wrap:nth-of-type(5n){margin-right:0!important}.elementor-element.elementor-grid-tablet-5 .eael-filterable-gallery-item-wrap:nth-of-type(5n+1){clear:left}.elementor-element.elementor-grid-tablet-6{position:relative}.elementor-element.elementor-grid-tablet-6 .pp-logo-grid{margin-right:-6px}.elementor-element.elementor-grid-tablet-6 .eael-filterable-gallery-item-wrap{width:16.6667%;float:left}.elementor-element.elementor-grid-tablet-6 .eael-filterable-gallery-item-wrap:nth-of-type(6n){margin-right:0!important}.elementor-element.elementor-grid-tablet-6 .eael-filterable-gallery-item-wrap:nth-of-type(6n+1){clear:left}}@media only screen and (max-width:767px){.elementor-element.elementor-grid-mobile-1{position:relative}.elementor-element.elementor-grid-mobile-1 .eael-filterable-gallery-item-wrap{width:100%;float:left}.elementor-element.elementor-grid-mobile-2{position:relative}.elementor-element.elementor-grid-mobile-2 .eael-filterable-gallery-item-wrap{width:50%;float:left}.elementor-element.elementor-grid-mobile-2 .eael-filterable-gallery-item-wrap:nth-of-type(2n){margin-right:0!important}.elementor-element.elementor-grid-mobile-2 .eael-filterable-gallery-item-wrap:nth-of-type(2n+1){clear:left}.elementor-element.elementor-grid-mobile-3{position:relative}.elementor-element.elementor-grid-mobile-3 .eael-filterable-gallery-item-wrap{width:33.3333%;float:left}.elementor-element.elementor-grid-mobile-3 .eael-filterable-gallery-item-wrap:nth-of-type(3n){margin-right:0!important}.elementor-element.elementor-grid-mobile-3 .eael-filterable-gallery-item-wrap:nth-of-type(3n+1){clear:left}.elementor-element.elementor-grid-mobile-4{position:relative}.elementor-element.elementor-grid-mobile-4 .eael-filterable-gallery-item-wrap{width:25%;float:left}.elementor-element.elementor-grid-mobile-4 .eael-filterable-gallery-item-wrap:nth-of-type(4n){margin-right:0!important}.elementor-element.elementor-grid-mobile-4 .eael-filterable-gallery-item-wrap:nth-of-type(4n+1){clear:left}.elementor-element.elementor-grid-mobile-5{position:relative}.elementor-element.elementor-grid-mobile-5 .eael-filterable-gallery-item-wrap{width:20%;float:left}.elementor-element.elementor-grid-mobile-5 .eael-filterable-gallery-item-wrap:nth-of-type(5n){margin-right:0!important}.elementor-element.elementor-grid-mobile-5 .eael-filterable-gallery-item-wrap:nth-of-type(5n+1){clear:left}.elementor-element.elementor-grid-mobile-6{position:relative}.elementor-element.elementor-grid-mobile-6 .pp-logo-grid{margin-right:-6px}.elementor-element.elementor-grid-mobile-6 .eael-filterable-gallery-item-wrap{width:16.6667%;float:left}.elementor-element.elementor-grid-mobile-6 .eael-filterable-gallery-item-wrap:nth-of-type(6n){margin-right:0!important}.elementor-element.elementor-grid-mobile-6 .eael-filterable-gallery-item-wrap:nth-of-type(6n+1){clear:left}}.fg-layout-3-filter-controls{margin:0;padding:0;list-style:none}.fg-layout-3-item-content{text-align:center}.fg-layout-3-item-content .fg-item-title{font-size:18px;line-height:1;font-weight:500;margin:0;transition:.3s}.fg-layout-3-item-content .fg-item-content p{font-size:13px;font-weight:400}.fg-filter-wrap{position:relative;flex-basis:30%}.fg-layout-3-filter-controls{position:absolute;left:0;background:#fff;z-index:999;width:150px;visibility:hidden;opacity:0;transition:.3s;width:100%;border-radius:5px;padding-top:7px}.fg-layout-3-filter-controls.open-filters{visibility:visible;opacity:1}.fg-layout-3-filter-controls li.control{padding:5px 5px 5px 10px;cursor:pointer;transition:.3s;font-size:14px;color:#7f8995;font-weight:400}.fg-layout-3-filter-controls li.control:hover{color:#2d425a}.fg-layout-3-filter-controls li.control:first-child{border-top:0 solid}.fg-layout-3-filter-controls li.control:last-child{border-bottom:0 solid}.fg-layout-3-filters-wrap{max-width:600px;margin:15px auto 50px}.fg-filter-wrap button{width:100%;border:0 solid;border-radius:0;padding:17px 13px;font-size:14px;color:#2d425a;background:#f7f8ff;height:55px;border-right:1px solid #abb5ff;border-radius:10px 0 0 10px;outline:0;text-align:center;position:relative}.fg-filter-wrap button>i{font-size:18px;position:absolute;top:50%;transform:translateY(-50%);margin-left:10px}.fg-layout-3-search-box{flex-basis:70%;height:100%}.fg-layout-3-search-box input[type=text]{width:100%;height:100%;margin:0;padding:15px;border:0 solid;outline:0;background:0 0}.fg-layout-3-search-box input[type=text]::-webkit-input-placeholder{color:#7f8995;font-size:13px}.fg-layout-3-search-box input[type=text]::-moz-placeholder{color:#7f8995;font-size:13px}.fg-layout-3-search-box input[type=text]:-ms-input-placeholder{color:#7f8995;font-size:13px}.fg-layout-3-search-box input[type=text]:-moz-placeholder{color:#7f8995;font-size:13px}.fg-layout-3-filters-wrap{height:55px;border-radius:5px;display:flex;flex-wrap:wrap;align-items:center}.fg-layout-3-filters-wrap .fg-layout-3-search-box{background:#f7f8ff;border-radius:0 10px 10px 0}.fg-layout-3-item-thumb{position:relative;overflow:hidden}.fg-layout-3-item-thumb .gallery-item-buttons{text-align:center;position:absolute;left:0;top:0;height:100%;width:100%;display:flex;align-items:center;justify-content:center;z-index:4}.fg-layout-3-item-content{padding:27px 27px 30px;text-align:center}.eael-fg-card-content-align-left .fg-layout-3-item-content{text-align:left}.eael-fg-card-content-align-center .fg-layout-3-item-content{text-align:center}.eael-fg-card-content-align-right .fg-layout-3-item-content{text-align:right}.eael-filterable-gallery-item-wrap .fg-layout-3-item.eael-gallery-grid-item{box-shadow:0 0 30px 0 rgba(3,29,60,.05);border-radius:5px}.fg-caption-head{position:absolute;left:0;top:0;width:100%;display:flex;justify-content:space-between;padding:35px 35px;z-index:3;color:#fff;font-size:18px;font-weight:700}.fg-item-category>span{font-size:12px;color:#fff;background:#fa9196;padding:10px 12px;display:inline-block}.fg-layout-3-item-content{position:relative}.fg-item-category{position:absolute;left:0;top:0;text-align:center;width:100%;height:30px;margin-top:-15px;z-index:11}.fg-item-category span{border-radius:5px;line-height:1;visibility:hidden;opacity:0;transition:.3s}.fg-layout-3-item.eael-gallery-grid-item:hover .fg-item-category span{visibility:visible;opacity:1}
18
  .eael-elements-flip-box-container{position:relative;height:300px;width:100%}.eael-elements-flip-box-container .flipbox-button{display:inline-block;transition:all .4s}.eael-elements-flip-box-container a{display:block}.eael-elements-flip-box-vertical-align{width:100%}.eael-elements-flip-box-padding{padding:0 30px 5px 30px}.eael-elements-flip-box-icon-image{display:inline-block;margin:0 auto 0 auto;line-height:1}.eael-elements-flip-box-icon-image.eael_eleements_flip_front_icon_style_background{background:#ccc}.eael_eleements_flip_front_icon_style_bordered{border:2px solid #fff}.eael_flip_box_icon_border_round{border-radius:100px}.eael_eleements_flip_front_icon_style_background,.eael_eleements_flip_front_icon_style_bordered{padding:15px}.eael-elements-flip-box-icon-image i{font-size:40px}.eael-elements-slider-display-table{width:100%}.eael-elements-flip-box-front-container{text-align:center;position:absolute;top:0;left:0;z-index:2;width:100%;height:100%;background:#0e9dd2;color:#fff;border-color:#000;-webkit-display:flex;display:flex;align-items:center}.eael-elements-flip-box-content,.eael-elements-flip-box-heading{color:#fff}.eael-elements-flip-box-heading.flipbox-linked-title{color:#fff;font-size:1.5em;font-weight:700}.eael-elements-flip-box-rear-container{text-align:center;position:absolute;top:0;left:0;width:100%;height:100%;background:#444;color:#fff;display:flex;align-items:center;border-color:#000}.eael-elements-button-floating-container{position:fixed;z-index:100}.eael-elements-button-floating-container .eael-elements-button{margin-top:0;font-size:14px;position:relative;padding:14px 20px}.eael-elements-button{cursor:pointer;display:inline-block;background:#077bbe;color:#fff;line-height:1;padding:16px 25px;margin-top:15px}.eael-elements-button:hover{background:#077bbe;color:#fff}.eael-elements-flip-box-container{perspective:1000px}.eael-elements-flip-box-front-container,.eael-elements-flip-box-rear-container{transition-duration:.5s;transition-property:all;transition-timing-function:ease}.eael-elements-flip-box-flip-card{width:100%;height:100%;transform-style:preserve-3d;transition:all .5s ease}.eael-elements-flip-box-front-container,.eael-elements-flip-box-rear-container{-webkit-backface-visibility:hidden;backface-visibility:hidden;transform:rotateX(0);transform:rotateY(0)}.eael-animate-flip.eael-animate-up .eael-elements-flip-box-rear-container,.eael-animate-flip.eael-animate-up.eael-elements-flip-box-container:hover .eael-elements-flip-box-flip-card{transform:rotateX(180deg)}.eael-animate-flip.eael-animate-down .eael-elements-flip-box-rear-container,.eael-animate-flip.eael-animate-down.eael-elements-flip-box-container:hover .eael-elements-flip-box-flip-card{transform:rotateX(-180deg)}.eael-animate-flip.eael-animate-left .eael-elements-flip-box-rear-container,.eael-animate-flip.eael-animate-left.eael-elements-flip-box-container:hover .eael-elements-flip-box-flip-card{transform:rotateY(-180deg)}.eael-animate-flip.eael-animate-right .eael-elements-flip-box-rear-container,.eael-animate-flip.eael-animate-right.eael-elements-flip-box-container:hover .eael-elements-flip-box-flip-card{transform:rotateY(180deg)}.eael-animate-push.eael-elements-flip-box-container,.eael-animate-slide.eael-elements-flip-box-container{overflow:hidden}.eael-animate-push .eael-elements-flip-box-rear-container,.eael-animate-slide .eael-elements-flip-box-rear-container{z-index:3}.eael-animate-push.eael-animate-up .eael-elements-flip-box-rear-container,.eael-animate-slide.eael-animate-up .eael-elements-flip-box-rear-container{top:100%}.eael-animate-push.eael-animate-up.eael-elements-flip-box-container:hover .eael-elements-flip-box-rear-container,.eael-animate-slide.eael-animate-up.eael-elements-flip-box-container:hover .eael-elements-flip-box-rear-container{top:0}.eael-animate-push.eael-animate-down .eael-elements-flip-box-rear-container,.eael-animate-slide.eael-animate-down .eael-elements-flip-box-rear-container{top:auto;bottom:100%}.eael-animate-push.eael-animate-down.eael-elements-flip-box-container:hover .eael-elements-flip-box-rear-container,.eael-animate-slide.eael-animate-down.eael-elements-flip-box-container:hover .eael-elements-flip-box-rear-container{top:auto;bottom:0}.eael-animate-push.eael-animate-left .eael-elements-flip-box-rear-container,.eael-animate-slide.eael-animate-left .eael-elements-flip-box-rear-container{left:100%}.eael-animate-push.eael-animate-left.eael-elements-flip-box-container:hover .eael-elements-flip-box-rear-container,.eael-animate-slide.eael-animate-left.eael-elements-flip-box-container:hover .eael-elements-flip-box-rear-container{left:0}.eael-animate-push.eael-animate-right .eael-elements-flip-box-rear-container,.eael-animate-slide.eael-animate-right .eael-elements-flip-box-rear-container{left:auto;right:100%}.eael-animate-push.eael-animate-right.eael-elements-flip-box-container:hover .eael-elements-flip-box-rear-container,.eael-animate-slide.eael-animate-right.eael-elements-flip-box-container:hover .eael-elements-flip-box-rear-container{left:auto;right:0}.eael-animate-push.eael-animate-up.eael-elements-flip-box-container:hover .eael-elements-flip-box-front-container{top:-100%}.eael-animate-push.eael-animate-down.eael-elements-flip-box-container:hover .eael-elements-flip-box-front-container{top:100%}.eael-animate-push.eael-animate-left.eael-elements-flip-box-container:hover .eael-elements-flip-box-front-container{left:-100%}.eael-animate-push.eael-animate-right.eael-elements-flip-box-container:hover .eael-elements-flip-box-front-container{left:100%}.eael-animate-zoom-in .eael-elements-flip-box-rear-container{opacity:0;transform:scale(.75);z-index:3}.eael-animate-zoom-in.eael-elements-flip-box-container:hover .eael-elements-flip-box-rear-container{opacity:1;transform:scale(1)}.eael-animate-zoom-out.eael-elements-flip-box-container:hover .eael-elements-flip-box-front-container{opacity:0;transform:scale(.75)}.eael-animate-fade.eael-elements-flip-box-container:hover .eael-elements-flip-box-front-container{opacity:0}.eael-flipbox-content-align-right .eael-elements-flip-box-padding{text-align:right}.eael-flipbox-content-align-left .eael-elements-flip-box-padding{text-align:left}.eael-flipbox-content-align-center .eael-elements-flip-box-padding{text-align:center}.eael-flipbox-img-circle .eael-elements-flip-box-icon-image img,.eael-flipbox-img-circle .flipbox-back-image-icon img{border-radius:50%;overflow:hidden}
 
19
  .eael-fluent-form-wrapper label.ff-el-form-check-label{display:flex;align-items:center}.eael-fluent-form-wrapper label.ff-el-form-check-label input{margin-right:5px}.eael-fluentform-form-button-full-width .ff-btn-submit{width:100%;display:block}.eael-contact-form.eael-fluent-form-wrapper.error-message-hide .ff-el-is-error .text-danger{display:none}.eael-fluentform-form-button-center .ff-el-group .ff-btn-submit,.eael-fluentform-form-button-center .ff-el-group.ff-text-left .ff-btn-submit,.eael-fluentform-form-button-center .ff-el-group.ff-text-right .ff-btn-submit{margin:0 auto;display:flex;align-items:center;justify-content:center}.eael-fluentform-form-button-right .ff-el-group .ff-btn-submit,.eael-fluentform-form-button-right .ff-el-group.ff-text-left .ff-btn-submit,.eael-fluentform-form-button-right .ff-el-group.ff-text-right .ff-btn-submit{float:right}.eael-fluentform-form-button-left .ff-el-group .ff-btn-submit,.eael-fluentform-form-button-left .ff-el-group.ff-text-left .ff-btn-submit,.eael-fluentform-form-button-left .ff-el-group.ff-text-right .ff-btn-submit{float:left}.eael-contact-form.eael-fluent-form-wrapper.fluent-form-labels-hide label{display:none!important}.eael-fluentform-section-break-content-left .ff-el-group.ff-el-section-break{text-align:left}.eael-fluentform-section-break-content-center .ff-el-group.ff-el-section-break{text-align:center}.eael-fluentform-section-break-content-right .ff-el-group.ff-el-section-break{text-align:right}
20
+ .clearfix::after,.clearfix::before{content:" ";display:table;clear:both}.eael-logo-carousel.nav-top-left,.eael-logo-carousel.nav-top-right,.eael-post-carousel.nav-top-left,.eael-post-carousel.nav-top-right,.eael-product-carousel.nav-top-left,.eael-product-carousel.nav-top-right,.eael-team-slider.nav-top-left,.eael-team-slider.nav-top-right,.eael-testimonial-slider.nav-top-left,.eael-testimonial-slider.nav-top-right{padding-top:40px}.eael-contact-form input[type=date],.eael-contact-form input[type=email],.eael-contact-form input[type=number],.eael-contact-form input[type=tel],.eael-contact-form input[type=text],.eael-contact-form input[type=url],.eael-contact-form textarea{background:#fff;box-shadow:none;-webkit-box-shadow:none;float:none;height:auto;margin:0;outline:0;width:100%}.eael-contact-form input[type=submit]{border:0;float:none;height:auto;margin:0;padding:10px 20px;width:auto;transition:all .25s linear 0s}.eael-contact-form.placeholder-hide input::-webkit-input-placeholder,.eael-contact-form.placeholder-hide textarea::-webkit-input-placeholder{opacity:0;visibility:hidden}.eael-contact-form.placeholder-hide input::-moz-placeholder,.eael-contact-form.placeholder-hide textarea::-moz-placeholder{opacity:0;visibility:hidden}.eael-contact-form.placeholder-hide input:-ms-input-placeholder,.eael-contact-form.placeholder-hide textarea:-ms-input-placeholder{opacity:0;visibility:hidden}.eael-contact-form.placeholder-hide input:-moz-placeholder,.eael-contact-form.placeholder-hide textarea:-moz-placeholder{opacity:0;visibility:hidden}.eael-custom-radio-checkbox input[type=checkbox],.eael-custom-radio-checkbox input[type=radio]{-webkit-appearance:none;-moz-appearance:none;border-style:solid;border-width:0;outline:0;min-width:1px;width:15px;height:15px;background:#ddd;padding:3px}.eael-custom-radio-checkbox input[type=checkbox]:before,.eael-custom-radio-checkbox input[type=radio]:before{content:"";width:100%;height:100%;padding:0;margin:0;display:block}.eael-custom-radio-checkbox input[type=checkbox]:checked:before,.eael-custom-radio-checkbox input[type=radio]:checked:before{background:#999;transition:all .25s linear 0s}.eael-custom-radio-checkbox input[type=radio]{border-radius:50%}.eael-custom-radio-checkbox input[type=radio]:before{border-radius:50%}.eael-post-elements-readmore-btn{font-size:12px;font-weight:500;transition:all .3s ease-in-out;display:inline-block}.elementor-lightbox .dialog-widget-content{width:100%;height:100%}.eael-contact-form-align-left,.elementor-widget-eael-weform.eael-contact-form-align-left .eael-weform-container{margin:0 auto 0 0}.eael-contact-form-align-center,.elementor-widget-eael-weform.eael-contact-form-align-center .eael-weform-container{float:none;margin:0 auto}.eael-contact-form-align-right,.elementor-widget-eael-weform.eael-contact-form-align-right .eael-weform-container{margin:0 0 0 auto}
21
  .eael-img-accordion{display:flex;height:50vh}.eael-img-accordion a{position:relative;flex:1;text-align:center;text-decoration:none;color:#fff;background-size:cover;background-position:center;background-repeat:no-repeat;transition:flex .4s}.eael-grow-accordion{flex:3}.eael-img-accordion .overlay{display:flex;align-items:center;justify-content:center;padding:0 10px;position:absolute;top:0;right:0;bottom:0;left:0;transition:background-color .4s}.eael-img-accordion .overlay .overlay-inner{z-index:1}.eael-img-accordion a:after{content:"";position:absolute;width:100%;height:100%;z-index:0;top:0;left:0;bottom:0;right:0;transition:all .3s ease-in-out}.eael-img-accordion .overlay-inner *{visibility:hidden;opacity:0;transform-style:preserve-3d}.eael-img-accordion .overlay h2{color:#fff;transform:translate3d(0,-60px,0)}.eael-img-accordion .overlay p{color:#fff;transform:translate3d(0,60px,0)}.eael-img-accordion .overlay-inner-show *{opacity:1;visibility:visible;transform:none!important;transition:all .3s .3s}@media screen and (max-width:800px){.eael-img-accordion{flex-direction:column}.eael-img-accordion a:hover{flex:1}.eael-img-accordion a:hover .overlay{background-color:transparent}}
22
+ .eael-gravity-form-align-default,.eael-gravity-form-align-left,.eael-gravity-form-btn-align-left{text-align:left}.eael-gravity-form-align-right,.eael-gravity-form-btn-align-right{text-align:right}.eael-gravity-form-align-center,.eael-gravity-form-btn-align-center{text-align:center}.eael-gravity-form .gform_wrapper .gform_footer{margin:0;padding:0}.gform_wrapper form li,.gform_wrapper li{list-style:none}.eael-gravity-form .gform_wrapper ul.gform_fields li.gfield{padding:0}.eael-gravity-form .gform_wrapper textarea{padding:0}.eael-gravity-form .gform_wrapper .gform_footer input.button,.eael-gravity-form .gform_wrapper .gform_footer input[type=submit],.eael-gravity-form .gform_wrapper .gform_page_footer input.button,.eael-gravity-form .gform_wrapper .gform_page_footer input[type=submit]{margin:0}.eael-gravity-form.title-description-hide .gform_heading{display:none}.eael-gravity-form.labels-hide .gform_wrapper .field_sublabel_below .ginput_complex.ginput_container label,.eael-gravity-form.labels-hide .gform_wrapper .top_label .gfield_label{display:none}.eael-gravity-form-button-full-width .gform_wrapper .gform_footer input[type=submit]{width:100%}
23
+ .eael-infobox .infobox-icon{height:auto}.eael-infobox .infobox-icon .infobox-icon-wrap{display:flex;width:100%;height:auto;transition:.3s;align-items:center;justify-content:center}.eael-infobox .infobox-icon .infobox-icon-wrap i{transition:.3s}.eael-infobox-content-align-left .eael-infobox .infobox-button,.eael-infobox-content-align-left .eael-infobox .infobox-content,.eael-infobox-content-align-left .eael-infobox .infobox-icon{text-align:left}.eael-infobox-content-align-right .eael-infobox .infobox-button,.eael-infobox-content-align-right .eael-infobox .infobox-content,.eael-infobox-content-align-right .eael-infobox .infobox-icon{text-align:right}.eael-infobox-content-align-center .eael-infobox .infobox-button,.eael-infobox-content-align-center .eael-infobox .infobox-content,.eael-infobox-content-align-center .eael-infobox .infobox-icon{text-align:center}.eael-infobox-icon-bg-shape-circle .infobox-icon .infobox-icon-wrap,.eael-infobox-icon-bg-shape-radius .infobox-icon .infobox-icon-wrap,.eael-infobox-icon-bg-shape-square .infobox-icon .infobox-icon-wrap{width:90px;height:90px;text-align:center}.eael-infobox-icon-hover-bg-shape-square:hover .infobox-icon .infobox-icon-wrap{border-radius:0}.eael-infobox-icon-bg-shape-radius .infobox-icon .infobox-icon-wrap,.eael-infobox-icon-hover-bg-shape-radius:hover .infobox-icon .infobox-icon-wrap{border-radius:15px}.eael-infobox-icon-bg-shape-radius .infobox-icon .infobox-icon-wrap{display:flex;align-items:center;justify-content:center}.eael-infobox-icon-bg-shape-circle .infobox-icon .infobox-icon-wrap,.eael-infobox-icon-hover-bg-shape-circle:hover .infobox-icon .infobox-icon-wrap{border-radius:50%}.eael-infobox-icon-bg-shape-circle .infobox-icon .infobox-icon-wrap i,.eael-infobox-icon-bg-shape-square .infobox-icon .infobox-icon-wrap i{margin-top:50%;transform:translateY(-50%)}.eael-infobox .infobox-button a.eael-infobox-button{display:inline-block;padding:5px 10px;transition:all .3s ease-in-out 0s}.eael-infobox-content-align-left.eael-infobox-icon-bg-shape-circle .infobox-icon,.eael-infobox-content-align-left.eael-infobox-icon-bg-shape-radius .infobox-icon,.eael-infobox-content-align-left.eael-infobox-icon-bg-shape-square .infobox-icon{display:flex;justify-content:flex-start}.eael-infobox-content-align-center.eael-infobox-icon-bg-shape-circle .infobox-icon,.eael-infobox-content-align-center.eael-infobox-icon-bg-shape-radius .infobox-icon,.eael-infobox-content-align-center.eael-infobox-icon-bg-shape-square .infobox-icon{display:flex;justify-content:center}.eael-infobox-content-align-right.eael-infobox-icon-bg-shape-circle .infobox-icon,.eael-infobox-content-align-right.eael-infobox-icon-bg-shape-radius .infobox-icon,.eael-infobox-content-align-right.eael-infobox-icon-bg-shape-square .infobox-icon{display:flex;justify-content:flex-end}.eael-infobox.icon-on-left{position:relative;z-index:0;display:flex}.eael-infobox.icon-on-left .infobox-icon-wrap,.eael-infobox.icon-on-right .infobox-icon-wrap{justify-content:center;display:flex!important;align-items:center}.eael-infobox.icon-on-left .infobox-icon .infobox-icon-wrap{background:0 0;border:0;text-align:left;height:auto;display:block}.eael-infobox .infobox-content p{margin:0 0 15px}.eael-infobox.icon-on-left .infobox-icon .infobox-icon-wrap i{margin-top:0;transform:translateY(0)}.eael-infobox.icon-on-left .infobox-content{padding-left:15px;flex:1 1 auto}.eael-infobox.icon-on-left .infobox-content .title{line-height:1;margin:0 0 10px 0}.eael-infobox.icon-on-right{position:relative;z-index:0;display:flex;flex-direction:row-reverse}.eael-infobox.icon-on-right .infobox-icon .infobox-icon-wrap{background:0 0;border:0;text-align:right;width:auto;height:auto;display:block}.eael-infobox.icon-on-right .infobox-icon .infobox-icon-wrap i{margin-top:0;transform:translateY(0)}.eael-infobox.icon-on-right .infobox-content{padding-right:15px;text-align:right;flex:1 1 auto;box-sizing:border-box}.eael-infobox.icon-on-right .infobox-content .title{line-height:1;margin:0 0 10px 0}.eael-infobox .infobox-icon img{transition:all .3s ease-in-out 0s}.eael-infobox-hover-img-shape-square:hover .eael-infobox .infobox-icon img{border-radius:0}.eael-infobox-hover-img-shape-circle:hover .eael-infobox .infobox-icon img,.eael-infobox-shape-circle .eael-infobox .infobox-icon img{border-radius:50%}.eael-infobox-hover-img-shape-radius:hover .eael-infobox .infobox-icon img,.eael-infobox-shape-radius .eael-infobox .infobox-icon img{border-radius:15px}
24
+ body div.mfp-bg{top:0;left:0;width:100%;height:100%;z-index:1042;overflow:hidden;position:fixed;background:#0b0b0b;opacity:.8}.mfp-wrap{top:0;left:0;width:100%;height:100%;z-index:1043;position:fixed;outline:0!important;-webkit-backface-visibility:hidden;backface-visibility:hidden}.mfp-container{text-align:center;position:absolute;width:100%;height:100%;left:0;top:0;padding:0 8px;box-sizing:border-box}.mfp-container:before{content:'';display:inline-block;height:100%;vertical-align:middle}.mfp-align-top .mfp-container:before{display:none}.mfp-content{position:relative;display:inline-block;vertical-align:middle;margin:0 auto;text-align:left;z-index:1045}.mfp-ajax-holder .mfp-content,.mfp-inline-holder .mfp-content{width:100%;cursor:auto}.mfp-ajax-cur{cursor:progress}.mfp-zoom-out-cur,.mfp-zoom-out-cur .mfp-image-holder .mfp-close{cursor:zoom-out}.mfp-zoom{cursor:pointer;cursor:zoom-in}.mfp-auto-cursor .mfp-content{cursor:auto}.mfp-arrow,.mfp-close,.mfp-counter,.mfp-preloader{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.mfp-loading.mfp-figure{display:none}.mfp-hide{display:none!important}.mfp-preloader{color:#ccc;position:absolute;top:50%;width:auto;text-align:center;margin-top:-.8em;left:8px;right:8px;z-index:1044}.mfp-preloader a{color:#ccc}.mfp-preloader a:hover{color:#fff}.mfp-s-ready .mfp-preloader{display:none}.mfp-s-error .mfp-content{display:none}button.mfp-arrow,button.mfp-close{overflow:visible;cursor:pointer;background:0 0;border:0;-webkit-appearance:none;display:block;outline:0;padding:0;z-index:1046;box-shadow:none;touch-action:manipulation}button::-moz-focus-inner{padding:0;border:0}.mfp-close{width:44px;height:44px;line-height:44px;position:absolute;right:0;top:0;text-decoration:none;text-align:center;opacity:.65;padding:0 0 18px 10px;color:#fff;font-style:normal;font-size:28px;font-family:Arial,Baskerville,monospace}.mfp-close:focus,.mfp-close:hover{opacity:1}.mfp-close:active{top:1px}.mfp-close-btn-in .mfp-close{color:#333}.mfp-iframe-holder .mfp-close,.mfp-image-holder .mfp-close{color:#fff;right:-6px;text-align:right;padding-right:6px;width:100%}.mfp-counter{position:absolute;top:0;right:0;color:#ccc;font-size:12px;line-height:18px;white-space:nowrap}.mfp-arrow{position:absolute;opacity:.65;margin:0;top:50%;margin-top:-55px;padding:0;width:90px;height:110px;-webkit-tap-highlight-color:transparent}.mfp-arrow:active{margin-top:-54px}.mfp-arrow:focus,.mfp-arrow:hover{opacity:1}.mfp-arrow:after,.mfp-arrow:before{content:'';display:block;width:0;height:0;position:absolute;left:0;top:0;margin-top:35px;margin-left:35px;border:medium inset transparent}.mfp-arrow:after{border-top-width:13px;border-bottom-width:13px;top:8px}.mfp-arrow:before{border-top-width:21px;border-bottom-width:21px;opacity:.7}.mfp-arrow-left{left:0}.mfp-arrow-left:after{border-right:17px solid #fff;margin-left:31px}.mfp-arrow-left:before{margin-left:25px;border-right:27px solid #3f3f3f}.mfp-arrow-right{right:0}.mfp-arrow-right:after{border-left:17px solid #fff;margin-left:39px}.mfp-arrow-right:before{border-left:27px solid #3f3f3f}.mfp-iframe-holder{padding-top:40px;padding-bottom:40px}.mfp-iframe-holder .mfp-content{line-height:0;width:100%;max-width:900px}.mfp-iframe-holder .mfp-close{top:-40px}.mfp-iframe-scaler{width:100%;height:0;overflow:hidden;padding-top:56.25%}.mfp-iframe-scaler iframe{position:absolute;display:block;top:0;left:0;width:100%;height:100%;box-shadow:0 0 8px rgba(0,0,0,.6);background:#000}img.mfp-img{width:auto;max-width:100%;height:auto;display:block;line-height:0;box-sizing:border-box;padding:40px 0 40px;margin:0 auto}.mfp-figure{line-height:0}.mfp-figure:after{content:'';position:absolute;left:0;top:40px;bottom:40px;display:block;right:0;width:auto;height:auto;z-index:-1;box-shadow:0 0 8px rgba(0,0,0,.6);background:#444}.mfp-figure small{color:#bdbdbd;display:block;font-size:12px;line-height:14px}.mfp-figure figure{margin:0}.mfp-bottom-bar{margin-top:-36px;position:absolute;top:100%;left:0;width:100%;cursor:auto}.mfp-title{text-align:left;line-height:18px;color:#f3f3f3;word-wrap:break-word;padding-right:36px}.mfp-image-holder .mfp-content{max-width:100%}.mfp-gallery .mfp-image-holder .mfp-figure{cursor:pointer}button.mfp-close,button.mfp-close:hover{display:inline-block!important;background:0 0;width:auto!important}.mfp-arrow,.mfp-arrow:hover{background:0 0}@media screen and (max-width:800px) and (orientation:landscape),screen and (max-height:300px){.mfp-img-mobile .mfp-image-holder{padding-left:0;padding-right:0}.mfp-img-mobile img.mfp-img{padding:0}.mfp-img-mobile .mfp-figure:after{top:0;bottom:0}.mfp-img-mobile .mfp-figure small{display:inline;margin-left:5px}.mfp-img-mobile .mfp-bottom-bar{background:rgba(0,0,0,.6);bottom:0;margin:0;top:auto;padding:3px 5px;position:fixed;box-sizing:border-box}.mfp-img-mobile .mfp-bottom-bar:empty{padding:0}.mfp-img-mobile .mfp-counter{right:5px;top:3px}.mfp-img-mobile .mfp-close{top:0;right:0;width:35px;height:35px;line-height:35px;background:rgba(0,0,0,.6);position:fixed;text-align:center;padding:0}}@media all and (max-width:900px){.mfp-arrow{transform:scale(.75)}.mfp-arrow-left{transform-origin:0}.mfp-arrow-right{transform-origin:100%}.mfp-container{padding-left:6px;padding-right:6px}}
25
  .eael-ninja-container input,.eael-ninja-container textarea{height:auto;padding:10px}.eael-contact-form-align-center .eael-ninja-container,.eael-contact-form-btn-align-center .eael-ninja-container .nf-field .nf-field-element input[type=button]{margin-left:auto!important;margin-right:auto!important;display:block;float:none}.eael-contact-form-align-left .eael-ninja-container,.eael-contact-form-btn-align-left .eael-ninja-container .nf-field .nf-field-element input[type=button]{float:left;width:auto}.eael-contact-form-align-right .eael-ninja-container,.eael-contact-form-btn-align-right .eael-ninja-container .nf-field .nf-field-element input[type=button]{float:right;width:auto}.eael-ninja-container .nf-field .nf-field-element input[type=password],.eael-ninja-container .nf-field .nf-field-element input[type=url],.eael-ninja-container .nf-field .nf-field-element textarea,.eael-ninja-container ul.wpuf-form li .wpuf-fields input[type=email],.eael-ninja-container ul.wpuf-form li .wpuf-fields input[type=number],.eael-ninja-container ul.wpuf-form li .wpuf-fields input[type=text]{max-width:100%}.eael-ninja-form .nf-form-title{display:none}.eael-ninja-form-title-yes .nf-form-title{display:block}.eael-ninja-form .title-description-hide .nf-form-title{display:none}.eael-ninja-form.title-description-hide .nf-form-title{display:none}.eael-ninja-form .nf-field-label{display:none}.eael-ninja-form-labels-yes .nf-field-label{display:block}.eael-ninja-form .submit-container input[type=button]{border:0;border-radius:0}.eael-ninja-form-button-full-width .submit-container input[type=button]{width:100%}
26
  .eael-post-grid{margin:0 -10px}.eael-grid-post{float:left;padding:10px}.eael-post-carousel .eael-grid-post{float:none;padding:0}.eael-grid-post-holder{border:1px solid rgba(0,0,0,.1)}.eael-grid-post-holder-inner{height:100%}.eael-entry-media{position:relative}.eael-entry-overlay{position:absolute;top:0;left:0;width:100%;height:100%;z-index:2;transition:opacity .2s ease-in-out,transform .25s cubic-bezier(.19,1,.22,1)}.eael-entry-overlay>a{position:absolute;top:0;left:0;width:100%;height:100%;z-index:3}.eael-entry-title{margin:10px 0 5px;font-size:1.2em}.eael-entry-thumbnail img{width:100%;max-width:100%;vertical-align:middle}.eael-entry-thumbnail>img{height:100%}.eael-entry-footer .eael-author-avatar{width:50px}.eael-entry-footer .eael-author-avatar .avatar{border-radius:50%}.eael-post-grid .eael-entry-footer .eael-entry-meta{padding-left:8px;text-align:left}.eael-grid-post .eael-entry-meta{display:flex;flex-direction:row}.eael-grid-post .eael-entry-footer .eael-entry-meta{flex-direction:column}.eael-entry-meta>div{font-size:12px;line-height:1.2;padding-bottom:5px}.eael-grid-post-excerpt p{margin:0;font-size:14px}.eael-entry-meta .eael-entry-footer .eael-posted-by{display:block}.eael-grid-post .eael-entry-footer,.eael-grid-post .eael-entry-wrapper{padding:15px}.eael-post-grid .eael-entry-header .eael-entry-meta span.eael-posted-on{padding-left:5px}.eael-post-grid .eael-entry-header .eael-entry-meta span.eael-posted-on::before{content:'\f111';font-family:FontAwesome;color:inherit;opacity:.4;font-size:.8em;padding-right:7px}.eael-entry-media{position:relative}.eael-entry-overlay{display:flex;align-items:center;justify-content:center}.eael-entry-overlay>i{color:#fff}.eael-entry-overlay.fade-in{visibility:hidden;opacity:0;transition:.3s}.eael-entry-media:hover .eael-entry-overlay.fade-in{visibility:visible;opacity:1}.eael-entry-media:hover .eael-entry-overlay.fade-in>i{transform:translate(0);opacity:1}.eael-entry-overlay.zoom-in{transform:scale(.9);visibility:hidden;opacity:0;transition:.3s}.eael-entry-media:hover .eael-entry-overlay.zoom-in{visibility:visible;opacity:1;transform:scale(1)}.eael-entry-overlay.slide-up{transform:translateY(100%);visibility:hidden;opacity:0;transition:.3s}.eael-entry-media:hover .eael-entry-overlay.slide-up{transform:translateY(0);visibility:visible;opacity:1}.eael-entry-media{overflow:hidden}.eael-entry-media.grid-hover-style-fade-in .eael-entry-overlay{opacity:0}.eael-entry-media.grid-hover-style-fade-in:hover .eael-entry-overlay{opacity:1}.eael-entry-media.grid-hover-style-none .eael-entry-overlay{display:none}.eael-entry-media.grid-hover-style-zoom-in .eael-entry-overlay{transform:scale(.4);opacity:0}.eael-entry-media.grid-hover-style-zoom-in:hover .eael-entry-overlay{transform:scale(1);opacity:1}.eael-entry-media.grid-hover-style-animate-down .eael-entry-overlay{transform:translateY(-100%)}.eael-entry-media.grid-hover-style-animate-down .eael-entry-overlay>i{transform:translateY(-100px);transition-delay:.1s;transition-duration:.3s}.eael-entry-media.grid-hover-style-animate-down:hover .eael-entry-overlay{transform:translate(0)}.eael-entry-media.grid-hover-style-animate-down:hover .eael-entry-overlay>i{transform:translateY(0)}.eael-entry-media.grid-hover-style-animate-up .eael-entry-overlay{transform:translateY(100%);visibility:hidden;opacity:0}.eael-entry-media.grid-hover-style-animate-up .eael-entry-overlay>i{transform:translateY(100px);transition-delay:.1s;transition-duration:.3s}.eael-entry-media.grid-hover-style-animate-up:hover .eael-entry-overlay{transform:translate(0);visibility:visible;opacity:1}.eael-entry-media.grid-hover-style-animate-up:hover .eael-entry-overlay>i{transform:translateY(0)}.eael-col-1 .eael-post-grid-column{float:none;width:100%}.eael-col-2 .eael-post-grid-column{float:left;width:50%}.eael-col-3 .eael-post-grid-column{float:left;width:33.3333%}.eael-col-4 .eael-post-grid-column{float:left;width:25%}.eael-col-5 .eael-post-grid-column{float:left;width:20%}.eael-col-6 .eael-post-grid-column{float:left;width:16.6666%}@media only screen and (max-width:979px){.eael-col-1 .eael-post-grid-column,.eael-col-2 .eael-post-grid-column,.eael-col-3 .eael-post-grid-column,.eael-col-4 .eael-post-grid-column,.eael-col-5 .eael-post-grid-column,.eael-col-6 .eael-post-grid-column{width:33.3333%}}@media only screen and (max-width:767px){.eael-col-1 .eael-post-grid-column,.eael-col-2 .eael-post-grid-column,.eael-col-3 .eael-post-grid-column,.eael-col-4 .eael-post-grid-column,.eael-col-5 .eael-post-grid-column,.eael-col-6 .eael-post-grid-column{width:50%}}@media only screen and (max-width:480px){.eael-col-1 .eael-post-grid-column,.eael-col-2 .eael-post-grid-column,.eael-col-3 .eael-post-grid-column,.eael-col-4 .eael-post-grid-column,.eael-col-5 .eael-post-grid-column,.eael-col-6 .eael-post-grid-column{float:none;width:100%}}.eael-author-avatar>a{display:block}.eael-entry-footer{overflow:hidden;display:flex}.eael-entry-footer>div{display:inline-block;float:left}
 
 
27
  .eael-post-timeline{margin-bottom:0;min-height:100%;overflow:hidden;position:relative}.eael-timeline-column{width:50%;margin-left:0;float:left;margin-top:0!important}.eael-timeline-post{position:relative}.eael-timeline-post:after{background-color:rgba(83,85,86,.2);content:"";width:2px;height:245px;position:absolute;right:0;top:70px}.eael-timeline-post:nth-child(2n):after{display:none}.eael-timeline-bullet{background-color:#9fa9af;border:5px solid #fff;border-radius:50%;box-shadow:0 1px 0 1px rgba(0,0,0,.1);content:"";height:20px;position:absolute;right:-9px;top:60px;width:20px;z-index:3;cursor:pointer}.eael-timeline-post:nth-child(2n) .eael-timeline-bullet{background-color:#9fa9af;border:5px solid #fff;border-radius:50%;bottom:36px;content:"";height:20px;left:-11px;position:absolute;top:300px;width:20px;z-index:3}.eael-timeline-post-inner{background:linear-gradient(45deg,#3f3f46 0,#05abe0 100%) repeat scroll 0 0 transparent;border:8px solid #e5eaed;box-shadow:0 1px 3px 0 rgba(0,0,0,.15);float:right;margin:30px 40px 30px auto;position:relative;height:320px;width:calc(100% - 40px)}.eael-timeline-post:nth-child(even) .eael-timeline-post-inner{float:left;margin-left:40px}.eael-timeline-post-inner:after{border-color:transparent transparent transparent #e5eaed;border-style:solid;border-width:15px;content:"";height:0;position:absolute;right:-36px;top:17px;width:0}.eael-timeline-post:nth-child(2n) .eael-timeline-post-inner:after{border-color:transparent #e5eaed transparent transparent;border-style:solid;border-width:15px;content:"";height:0;left:-36px;position:absolute;top:257px;width:0}.eael-timeline-post:nth-child(2n) .eael-timeline-post-inner::after{border-left-color:transparent!important}.eael-timeline-post p{margin:1.6rem 0 0 0;font-size:.9em;line-height:1.6em}.eael-timeline-post-image{background-size:cover;background-position:center center;background-repeat:no-repeat;display:block;height:100%;overflow:hidden;position:relative;opacity:.6;transition:all .3s}.eael-timeline-post-title{bottom:40px;position:absolute;width:100%}.eael-timeline-post-title h2{color:#fff;font-size:20px;font-weight:700;letter-spacing:1px;line-height:24px;padding:0 25px;text-align:left;text-transform:uppercase}.eael-timeline-post-excerpt{opacity:0;position:absolute;top:0;left:0;transition:all .3s}.eael-timeline-post-excerpt p{color:#fff;font-size:14px;padding:25px}.eael-timeline-post-inner:hover .eael-timeline-post-excerpt{opacity:1;top:10px}.eael-timeline-post-inner:hover .eael-timeline-post-image{opacity:.3}.eael-timeline-post time{opacity:0;background-color:rgba(0,0,0,.7);color:#fff;font-size:10px;border-radius:20px;position:absolute;right:-97px;width:100px;height:30px;line-height:30px;text-align:center;top:50px;z-index:99;transition:all .5s}.eael-timeline-post:nth-child(2n) time{background-color:rgba(0,0,0,.7);border-radius:20px;color:#fff;font-size:10px;height:30px;left:-99px;line-height:30px;position:absolute;text-align:center;top:290px;width:100px;z-index:99}.eael-timeline-post time:before{border-bottom:5px solid rgba(0,0,0,.7);border-left:5px solid transparent;border-right:5px solid transparent;content:"";height:0;left:45px;position:absolute;top:-5px;width:0}.eael-timeline-post:hover time{opacity:1}.eael-timeline-post::after{height:100%}.eael-post-timeline .eael-timeline-post:nth-last-child(2)::after{height:245px}.eael-post-timeline .eael-timeline-post:last-child::after{display:none}.eael-load-more-button-wrap{display:flex}@media only screen and (max-width:1366px){.eael-timeline-post-title h2{font-size:.8em}.eael-timeline-post-excerpt p{font-size:13px}}@media only screen and (max-width:1169px){.eael-timeline-post-inner{height:320px}}@media only screen and (max-width:992px){.eael-post-timeline{margin-left:0}.eael-timeline-bullet,.eael-timeline-post-inner:after,.eael-timeline-post:after,.eael-timeline-post:before{display:none}.eael-timeline-post{display:inline-block;float:left!important;width:50%!important;margin:15px auto}.eael-timeline-post-inner{height:320px;padding-bottom:30px}.eael-timeline-post-title{bottom:50px}.eael-timeline-post-title h2{font-size:.8em;line-height:1.2em}.eael-timeline-post .eael-timeline-post-inner{margin:0 10px auto 0;width:90%}.eael-timeline-post:nth-child(2n) .eael-timeline-post-inner{margin:0 auto 0 10px;width:90%}.eael-timeline-post-excerpt{opacity:0!important}.eael-timeline-post-image{opacity:.3}.eael-timeline-post time,.eael-timeline-post:nth-child(2n) time{background-color:#fff;border-radius:0;color:#444;font-size:12px;text-transform:uppercase;left:0;opacity:1;padding-top:3px;top:275px;width:100%}time:before{display:none}}@media only screen and (max-width:767px){.eael-timeline-post{display:block;float:none!important;margin:20px auto;width:100%!important}.eael-timeline-post .eael-timeline-post-inner,.eael-timeline-post:nth-child(2n) .eael-timeline-post-inner{display:block;float:none;margin:0 auto}}@media only screen and (max-width:479px){.eael-timeline-post .eael-timeline-post-inner,.eael-timeline-post:nth-child(2n) .eael-timeline-post-inner{height:250px;margin:0 auto;width:95%}.eael-timeline-post time,.eael-timeline-post:nth-child(2n) time{top:205px}}
28
  .eael-pricing{-webkit-display:flex;display:flex;justify-content:center;align-items:center}.eael-pricing .eael-pricing-item{width:100%;height:auto;margin:0}.eael-pricing .eael-pricing-button{display:inline-block;padding:12px 25px;background:#00c853;font-size:14px;font-weight:600;color:#fff;text-transform:uppercase;text-decoration:none;transition:.3s;border-radius:4px}.eael-pricing .eael-pricing-button:hover{background:#03b048}.eael-pricing .eael-pricing-item ul{padding:0;margin:0;list-style:none}.eael-pricing .eael-pricing-item ul li.disable-item{text-decoration:line-through;opacity:.5}.eael-pricing .eael-pricing-item ul li span.li-icon{color:#00c853;margin-right:6px}.eael-pricing .eael-pricing-item ul li.disable-item span.li-icon{color:#ef5350}.eael-pricing.style-1{position:relative;z-index:0;text-align:center}.eael-pricing.style-1 .eael-pricing-item{border:1px solid rgba(9,9,9,.1);padding:30px;border-radius:5px;transition:.5s}.eael-pricing.style-1 .eael-pricing-item:hover{box-shadow:0 14px 28px rgba(0,0,0,.25),0 10px 10px rgba(0,0,0,.22)}.eael-pricing.style-1 .eael-pricing-item.featured{position:relative}.eael-pricing.style-1 .eael-pricing-item.ribbon-1:before{content:"";position:absolute;width:100%;height:3px;background:#00c853;top:0;left:0;right:0;z-index:1;border-radius:5px 5px 0 0}.eael-pricing.style-1 .eael-pricing-item.ribbon-2:before{content:"Featured";position:absolute;width:auto;background:#00c853;color:#fff;top:35px;right:-15px;z-index:10;font-size:10px;font-weight:600;text-transform:uppercase;padding:5px 10px}.eael-pricing.style-1 .eael-pricing-item.ribbon-2:after{content:"";position:absolute;top:20px;right:-15px;width:0;height:0;border-bottom:15px solid #00c853;border-right:15px solid transparent;z-index:9;opacity:.9}.eael-pricing.style-1 .eael-pricing-item.ribbon-3:before{content:"Featured";position:absolute;width:auto;background:rgba(0,0,0,.6);color:#fff;top:15px;right:15px;z-index:10;font-size:11px;font-weight:600;text-transform:uppercase;padding:5px 15px}.eael-pricing.style-1 .eael-pricing-item .header{display:block;position:relative;z-index:0;padding-bottom:15px;margin-bottom:15px}.eael-pricing.style-1 .eael-pricing-item .header:after{content:"";position:absolute;width:140px;height:1px;bottom:0;left:0;right:0;margin:0 auto;z-index:1;background:rgba(9,9,9,.1)}.eael-pricing.style-1 .eael-pricing-item .header .title{font-weight:700;line-height:30px;margin:0}.eael-pricing.style-1 .eael-pricing-item .eael-pricing-tag{position:relative;z-index:0;padding:15px 0;margin-bottom:15px}.eael-pricing.style-1 .eael-pricing-item .eael-pricing-tag:after{content:"";position:absolute;width:140px;height:1px;bottom:0;left:0;right:0;margin:0 auto;z-index:1;background:rgba(9,9,9,.04)}.eael-pricing.style-1 .eael-pricing-item .price-tag{position:relative;display:inline-block;font-size:28px;font-weight:500;line-height:0;margin:0 auto}.eael-pricing.style-1 .eael-pricing-item .price-tag .price-currency{font-size:24px;font-weight:700}.eael-pricing.style-1 .eael-pricing-item .price-period{color:#999}.eael-pricing.style-1 .eael-pricing-item .body ul{display:block;width:100%;margin-bottom:15px}.eael-pricing.style-1 .eael-pricing-item .body ul li{display:block;width:100%;height:auto;padding:10px 0;font-size:14px;color:#6d6d6d;border-bottom:1px solid rgba(9,9,9,.04)}.eael-pricing.style-1 .eael-pricing-item .body ul li:last-child{border:none}.eael-pricing.style-1 .eael-pricing-item.featured-large{padding:60px 0}.eael-pricing.style-2{position:relative;z-index:0;text-align:center}.eael-pricing.style-2 .eael-pricing-item{padding:30px 0;border-radius:5px;margin:0;border:1px solid rgba(9,9,9,.1)}.eael-pricing.style-2 .eael-pricing-item.featured{box-shadow:0 14px 28px rgba(0,0,0,.25),0 10px 10px rgba(0,0,0,.22)}.eael-pricing.style-2 .eael-pricing-item.ribbon-1:before{content:"";position:absolute;width:100%;height:3px;background:#00c853;top:0;left:0;right:0;z-index:1;border-radius:5px 5px 0 0}.eael-pricing.style-2 .eael-pricing-item.ribbon-2:before{content:"Featured";position:absolute;width:auto;background:#00c853;color:#fff;top:35px;right:-15px;z-index:10;font-size:10px;font-weight:600;text-transform:uppercase;padding:5px 10px}.eael-pricing.style-2 .eael-pricing-item.ribbon-2:after{content:"";position:absolute;top:20px;right:-15px;width:0;height:0;border-bottom:15px solid #00c853;border-right:15px solid transparent;z-index:9;opacity:.9}.eael-pricing.style-2 .eael-pricing-item.ribbon-3:before{content:"Featured";position:absolute;width:auto;background:rgba(0,0,0,.6);color:#fff;top:15px;right:15px;z-index:10;font-size:11px;font-weight:600;text-transform:uppercase;padding:5px 15px}.eael-pricing.style-2 .eael-pricing-item .eael-pricing-icon .icon{display:inline-block;position:relative;width:80px;height:80px;background:#00c853;border-radius:50%;margin-bottom:30px;transition:.5s;overflow:hidden}.eael-pricing.style-2 .eael-pricing-item .eael-pricing-icon,.eael-pricing.style-2 .eael-pricing-item .eael-pricing-icon .icon{display:flex;align-items:center;justify-content:center}.eael-pricing.style-2 .eael-pricing-item .eael-pricing-icon .icon i{font-size:30px;color:#fff;transition:.5s}.eael-pricing.style-2 .eael-pricing-item:hover .eael-pricing-icon .icon{background:#43a047}.eael-pricing.style-2 .eael-pricing-item:hover .eael-pricing-icon .icon i{color:#fff}.eael-pricing.style-2 .eael-pricing-item .header{background:#c8e6c9;padding:25px 30px;margin-bottom:15px;position:relative;z-index:0}.eael-pricing.style-2 .eael-pricing-item.featured .header:after{content:"";position:absolute;width:100%;height:100%;top:0;left:0;right:0;bottom:0;z-index:-1;background:rgba(255,255,255,.4)}.eael-pricing.style-2 .eael-pricing-item .header .title{font-size:28px;font-weight:700;line-height:40px;margin:0}.eael-pricing.style-2 .eael-pricing-item .header .subititle{font-size:14px;font-weight:600;color:#6d6d6d}.eael-pricing.style-2 .eael-pricing-item .eael-pricing-tag{position:relative;z-index:0;padding:15px 0;margin-bottom:15px}.eael-pricing.style-2 .eael-pricing-item .eael-pricing-tag:after{content:"";position:absolute;width:140px;height:1px;bottom:0;left:0;right:0;margin:0 auto;z-index:1;background:rgba(9,9,9,.04)}.eael-pricing.style-2 .eael-pricing-item .price-tag{position:relative;display:inline-block;font-size:28px;font-weight:500;line-height:0;margin:0 auto}.eael-pricing.style-2 .eael-pricing-item .price-tag .price-currency{font-size:24px;font-weight:700;color:#00c853}.eael-pricing.style-2 .eael-pricing-item .price-period{color:#999}.eael-pricing.style-2 .eael-pricing-item .body ul{display:block;width:100%;margin-bottom:15px}.eael-pricing.style-2 .eael-pricing-item .body ul li{display:block;width:100%;height:auto;padding:10px 15px;font-size:14px;color:#6d6d6d;border-bottom:1px solid rgba(9,9,9,.04)}.eael-pricing.style-2 .eael-pricing-item .body ul li:last-child{border:none}@media only screen and (min-width:768px) and (max-width:992px){.eael-pricing{display:block}.eael-pricing .eael-pricing-item,.eael-pricing.style-2 .eael-pricing-item,.eael-pricing.style-4 .eael-pricing-item{width:100%;margin:0 auto 30px auto}}@media only screen and (max-width:480px){.eael-pricing{display:block}.eael-pricing .eael-pricing-item{width:100%}.eael-pricing .eael-pricing-item,.eael-pricing.style-2 .eael-pricing-item,.eael-pricing.style-4 .eael-pricing-item{margin:0 auto 30px auto}}.eael-pricing-content-align-center .eael-pricing{text-align:center}.eael-pricing-content-align-left .eael-pricing{text-align:left}.eael-pricing-content-align-right .eael-pricing{text-align:right}.eael-pricing-content-align-left .eael-pricing.style-2 .eael-pricing-item .price-tag{padding-left:45px}.eael-pricing-content-align-left .eael-pricing.style-2 .eael-pricing-item .price-tag:before{left:30px}.eael-pricing-content-align-right .eael-pricing.style-2 .eael-pricing-item .eael-pricing-tag{padding-right:30px}.eael-pricing-content-align-left .eael-pricing.style-2 .eael-pricing-item .footer,.eael-pricing-content-align-left .eael-pricing.style-2 .eael-pricing-item .header,.eael-pricing-content-align-left .eael-pricing.style-4 .eael-pricing-item .footer,.eael-pricing-content-align-left .eael-pricing.style-4 .eael-pricing-item .header{padding-left:30px;padding-right:30px}.eael-pricing-content-align-right .eael-pricing.style-2 .eael-pricing-item .footer,.eael-pricing-content-align-right .eael-pricing.style-2 .eael-pricing-item .header,.eael-pricing-content-align-right .eael-pricing.style-4 .eael-pricing-item .footer,.eael-pricing-content-align-right .eael-pricing.style-4 .eael-pricing-item .header{padding-right:30px;padding-left:30px}.eael-pricing-content-align-left .eael-pricing.style-2 .eael-pricing-item .body ul li,.eael-pricing-content-align-left .eael-pricing.style-4 .eael-pricing-item .body ul li{padding-left:30px}.eael-pricing-content-align-right .eael-pricing.style-2 .eael-pricing-item .body ul li,.eael-pricing-content-align-right .eael-pricing.style-4 .eael-pricing-item .body ul li{padding-right:30px}.eael-pricing-content-align-left .eael-pricing.style-3 .eael-pricing-item .header:after{transform:translateX(-80%)}.eael-pricing-content-align-right .eael-pricing.style-3 .eael-pricing-item .header:after{transform:translateX(80%)}.eael-pricing-content-align-left .eael-pricing.style-3 .eael-pricing-item:hover .header:after,.eael-pricing-content-align-right .eael-pricing.style-3 .eael-pricing-item:hover .header:after{transform:translateX(0)}.eael-pricing-content-align-left .eael-pricing.style-1 .eael-pricing-item .eael-pricing-tag:after,.eael-pricing-content-align-left .eael-pricing.style-1 .eael-pricing-item .header:after,.eael-pricing-content-align-left .eael-pricing.style-2 .eael-pricing-item .eael-pricing-tag:after,.eael-pricing-content-align-right .eael-pricing.style-1 .eael-pricing-item .eael-pricing-tag:after,.eael-pricing-content-align-right .eael-pricing.style-1 .eael-pricing-item .header:after,.eael-pricing-content-align-right .eael-pricing.style-2 .eael-pricing-item .eael-pricing-tag:after{margin:0;width:100%}.eael-pricing-button-align-right .eael-pricing.style-1 .footer,.eael-pricing-button-align-right .eael-pricing.style-2 .footer,.eael-pricing-button-align-right .eael-pricing.style-3 .footer,.eael-pricing-button-align-right .eael-pricing.style-4 .footer{text-align:right}.eael-pricing-button-align-center .eael-pricing.style-1 .footer,.eael-pricing-button-align-center .eael-pricing.style-2 .footer,.eael-pricing-button-align-center .eael-pricing.style-3 .footer,.eael-pricing-button-align-center .eael-pricing.style-4 .footer{text-align:center}.eael-pricing-button-align-left .eael-pricing.style-1 .footer,.eael-pricing-button-align-left .eael-pricing.style-2 .footer,.eael-pricing-button-align-left .eael-pricing.style-3 .footer,.eael-pricing-button-align-left .eael-pricing.style-4 .footer{text-align:left}.eael-pricing-content-align-center.eael-pricing-button-align-right .eael-pricing.style-2 .footer,.eael-pricing-content-align-center.eael-pricing-button-align-right .eael-pricing.style-4 .footer{padding-right:30px}.eael-pricing-content-align-center.eael-pricing-button-align-left .eael-pricing.style-2 .footer,.eael-pricing-content-align-center.eael-pricing-button-align-left .eael-pricing.style-4 .footer{padding-left:30px}.only-in-pro{width:100%;-webkit-display:flex;display:flex;align-items:center;justify-content:center;padding:15px;min-width:200px;background:#ef5350;color:#fff;text-align:center}.only-in-pro .title{font-family:Roboto,sans-serif;font-size:24px;line-height:40px;margin:0}div.tooltipster-sidetip.tooltipster-base.tooltipster-right .tooltipster-arrow{position:absolute;top:50%}div.tooltipster-sidetip.tooltipster-top div.tooltipster-box{margin-bottom:0!important}div.tooltipster-sidetip.tooltipster-bottom div.tooltipster-box{margin-top:0!important}.tooltipster-base.tooltipster-sidetip.tooltipster-top .tooltipster-arrow{top:auto;bottom:-8px}div.tooltipster-sidetip.tooltipster-bottom .tooltipster-arrow{top:-8px;bottom:auto}@media only screen and (max-width:480px){.eael-pricing.style-1 .eael-pricing-item .price-tag{display:block}}
29
+ .eael-post-grid .woocommerce ul.products,.eael-product-grid .woocommerce ul.products{display:grid;grid-gap:25px;margin:0!important;padding:0!important}.eael-post-grid .woocommerce ul.products:after,.eael-post-grid .woocommerce ul.products:before,.eael-product-grid .woocommerce ul.products:after,.eael-product-grid .woocommerce ul.products:before{display:none}.eael-post-grid .woocommerce ul.products .product,.eael-product-grid .woocommerce ul.products .product{width:100%;margin:0;padding:0}.eael-post-grid .woocommerce ul.products.products[class*=columns-] li.product,.eael-product-grid .woocommerce ul.products.products[class*=columns-] li.product{width:100%}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product,.eael-post-grid.eael-product-simple .woocommerce ul.products li.product,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product,.eael-product-grid.eael-product-simple .woocommerce ul.products li.product{position:relative;float:left;overflow:hidden;text-align:center;padding:0;border-radius:0;background-color:#fff;box-shadow:none}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product a,.eael-post-grid.eael-product-simple .woocommerce ul.products li.product a,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product a,.eael-product-grid.eael-product-simple .woocommerce ul.products li.product a{text-decoration:none}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product a:hover,.eael-post-grid.eael-product-simple .woocommerce ul.products li.product a:hover,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product a:hover,.eael-product-grid.eael-product-simple .woocommerce ul.products li.product a:hover{outline:0;box-shadow:none}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product img,.eael-post-grid.eael-product-simple .woocommerce ul.products li.product img,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product img,.eael-product-grid.eael-product-simple .woocommerce ul.products li.product img{width:100%;height:auto;-webkit-backface-visibility:hidden;backface-visibility:hidden}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product .woocommerce-loop-product__title,.eael-post-grid.eael-product-simple .woocommerce ul.products li.product .woocommerce-loop-product__title,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product .woocommerce-loop-product__title,.eael-product-grid.eael-product-simple .woocommerce ul.products li.product .woocommerce-loop-product__title{font-size:16px;font-weight:700;line-height:1;color:#333;margin:25px 0 12px;padding:0}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product .onsale,.eael-post-grid.eael-product-simple .woocommerce ul.products li.product .onsale,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product .onsale,.eael-product-grid.eael-product-simple .woocommerce ul.products li.product .onsale{display:block;line-height:170px;font-size:13px;text-align:center;letter-spacing:0;text-shadow:0 1px 1px rgba(0,0,0,.6);text-transform:uppercase;color:#fff;background-color:#ff2a13;border-radius:0;border:none;box-shadow:none;position:absolute;height:100px;width:200px;z-index:1;left:-100px;top:-50px;right:auto;margin:0;padding:0;transform:rotate(-45deg)}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product .price,.eael-post-grid.eael-product-simple .woocommerce ul.products li.product .price,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product .price,.eael-product-grid.eael-product-simple .woocommerce ul.products li.product .price{font-size:14px;margin-bottom:0}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product .price del,.eael-post-grid.eael-product-simple .woocommerce ul.products li.product .price del,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product .price del,.eael-product-grid.eael-product-simple .woocommerce ul.products li.product .price del{opacity:.5;display:inline-block}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product .price ins,.eael-post-grid.eael-product-simple .woocommerce ul.products li.product .price ins,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product .price ins,.eael-product-grid.eael-product-simple .woocommerce ul.products li.product .price ins{font-weight:400;background-color:transparent;color:#ff2a13}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product .star-rating,.eael-post-grid.eael-product-simple .woocommerce ul.products li.product .star-rating,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product .star-rating,.eael-product-grid.eael-product-simple .woocommerce ul.products li.product .star-rating{display:block;float:none;font-size:14px;margin:10px auto}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product .button.add_to_cart_button,.eael-post-grid.eael-product-simple .woocommerce ul.products li.product .button.add_to_cart_button,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product .button.add_to_cart_button,.eael-product-grid.eael-product-simple .woocommerce ul.products li.product .button.add_to_cart_button{display:block;font-size:14px;font-weight:400;line-height:38px;text-align:center;text-transform:uppercase;color:#fff;background-color:#333;padding:0;margin:15px;border-radius:0}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product .button.add_to_cart_button:focus,.eael-post-grid.eael-product-simple .woocommerce ul.products li.product .button.add_to_cart_button:focus,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product .button.add_to_cart_button:focus,.eael-product-grid.eael-product-simple .woocommerce ul.products li.product .button.add_to_cart_button:focus{outline:0}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product a.added_to_cart,.eael-post-grid.eael-product-simple .woocommerce ul.products li.product a.added_to_cart,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product a.added_to_cart,.eael-product-grid.eael-product-simple .woocommerce ul.products li.product a.added_to_cart{display:block;margin:0 0 15px 0;padding:0;font-size:14px;line-height:1;text-transform:capitalize;color:#333;background-color:transparent}.eael-post-grid.eael-product-simple .woocommerce ul.products li.product,.eael-product-grid.eael-product-simple .woocommerce ul.products li.product{border:1px solid #eee}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product{border:1px solid transparent}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product .button.add_to_cart_button,.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product a.added_to_cart,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product .button.add_to_cart_button,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product a.added_to_cart{visibility:hidden;transition:none}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product:hover,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product:hover{border:1px solid #eee}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product:hover .button.add_to_cart_button,.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product:hover a.added_to_cart,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product:hover .button.add_to_cart_button,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product:hover a.added_to_cart{visibility:visible}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product{position:relative;float:left;overflow:hidden;text-align:center;padding:0 0 15px 0;border-radius:0;background-color:#fff;box-shadow:none}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product a,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product a{text-decoration:none}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product a:hover,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product a:hover{outline:0;box-shadow:none}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product img,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product img{width:100%;height:auto;margin:0;-webkit-backface-visibility:hidden;backface-visibility:hidden}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay{position:relative;overflow:hidden;line-height:0}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .button-wrap,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .button-wrap{position:absolute;top:50%;left:0;right:0;text-align:center;transform:translateY(-50%)}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .add_to_cart_button,.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .added_to_cart,.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .product-link,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .add_to_cart_button,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .added_to_cart,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .product-link{display:inline-block;font-size:14px;line-height:38px;text-align:center;color:#fff;background-color:#333;width:38px;height:38px;border-style:none;border-radius:50%;vertical-align:middle;padding:0;margin:0 5px;transform:translateY(20px);opacity:0;transition:transform .2s,opacity .3s}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .add_to_cart_button:focus,.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .added_to_cart:focus,.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .product-link:focus,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .add_to_cart_button:focus,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .added_to_cart:focus,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .product-link:focus{outline:0}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .add_to_cart_button,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .add_to_cart_button{font-size:0}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .add_to_cart_button:before,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .add_to_cart_button:before{display:none}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .add_to_cart_button:after,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .add_to_cart_button:after{content:"\f217";font:normal normal normal 14px/1 FontAwesome;font-size:14px;line-height:38px;text-rendering:auto;-webkit-font-smoothing:antialiased;vertical-align:middle;margin:0;padding:0}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .add_to_cart_button.loading:before,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .add_to_cart_button.loading:before{display:none}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .add_to_cart_button.loading:after,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .add_to_cart_button.loading:after{content:"\f110";display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:14px;line-height:38px;color:#fff;height:auto;width:auto;position:relative;top:0;left:0;margin:0;padding:0}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .added_to_cart,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .added_to_cart{font-size:0}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .added_to_cart:after,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .added_to_cart:after{content:"\f06e";font:normal normal normal 14px/1 FontAwesome;font-size:14px;line-height:38px;color:#fff;text-rendering:auto;-webkit-font-smoothing:antialiased;vertical-align:middle;margin:0;padding:0}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .woocommerce-loop-product__title,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .woocommerce-loop-product__title{font-size:16px;font-weight:700;line-height:1;color:#333;margin:25px 0 12px;padding:0}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .onsale,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .onsale{display:block;line-height:170px;font-size:13px;text-align:center;letter-spacing:0;text-shadow:0 1px 1px rgba(0,0,0,.6);text-transform:uppercase;color:#fff;background-color:#ff2a13;border-radius:0;border:none;box-shadow:none;position:absolute;height:100px;width:200px;z-index:1;left:-100px;top:-50px;right:auto;margin:0;padding:0;transform:rotate(-45deg)}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .price,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .price{font-size:14px;margin-bottom:0}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .price del,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .price del{opacity:.5;display:inline-block}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .price ins,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .price ins{font-weight:400;background-color:transparent;color:#ff2a13}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .star-rating,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .star-rating{display:block;float:none;font-size:14px;margin:10px auto}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product:hover .overlay .add_to_cart_button,.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product:hover .overlay a,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product:hover .overlay .add_to_cart_button,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product:hover .overlay a{opacity:1;transform:translateY(0)}@media only screen and (min-width:1025px){.eael-product-grid-column-1 .eael-product-grid .woocommerce ul.products{grid-template-columns:100%}.eael-product-grid-column-2 .eael-product-grid .woocommerce ul.products{grid-template-columns:repeat(2,1fr)}.eael-product-grid-column-3 .eael-product-grid .woocommerce ul.products{grid-template-columns:repeat(3,1fr)}.eael-product-grid-column-4 .eael-product-grid .woocommerce ul.products{grid-template-columns:repeat(4,1fr)}.eael-product-grid-column-5 .eael-product-grid .woocommerce ul.products{grid-template-columns:repeat(5,1fr)}.eael-product-grid-column-6 .eael-product-grid .woocommerce ul.products{grid-template-columns:repeat(6,1fr)}}@media only screen and (max-width:1024px) and (min-width:766px){.eael-product-grid-column-tablet-1 .eael-product-grid .woocommerce ul.products{grid-template-columns:100%}.eael-product-grid-column-tablet-2 .eael-product-grid .woocommerce ul.products{grid-template-columns:repeat(2,1fr)}.eael-product-grid-column-tablet-3 .eael-product-grid .woocommerce ul.products{grid-template-columns:repeat(3,1fr)}.eael-product-grid-column-tablet-4 .eael-product-grid .woocommerce ul.products{grid-template-columns:repeat(4,1fr)}.eael-product-grid-column-tablet-5 .eael-product-grid .woocommerce ul.products{grid-template-columns:repeat(5,1fr)}.eael-product-grid-column-tablet-6 .eael-product-grid .woocommerce ul.products{grid-template-columns:repeat(6,1fr)}}@media only screen and (max-width:767px){.eael-product-grid-column-mobile-1 .eael-product-grid .woocommerce ul.products{grid-template-columns:100%}.eael-product-grid-column-mobile-2 .eael-product-grid .woocommerce ul.products{grid-template-columns:repeat(2,1fr)}.eael-product-grid-column-mobile-3 .eael-product-grid .woocommerce ul.products{grid-template-columns:repeat(3,1fr)}.eael-product-grid-column-mobile-4 .eael-product-grid .woocommerce ul.products{grid-template-columns:repeat(4,1fr)}.eael-product-grid-column-mobile-5 .eael-product-grid .woocommerce ul.products{grid-template-columns:repeat(5,1fr)}.eael-product-grid-column-mobile-6 .eael-product-grid .woocommerce ul.products{grid-template-columns:repeat(6,1fr)}}
30
  @-webkit-keyframes animateStripe{0%{transform:translate(0,0)}100%{transform:translate(35px,0)}}@keyframes animateStripe{0%{transform:translate(0,0)}100%{transform:translate(35px,0)}}@-webkit-keyframes animateStripeRTL{0%{transform:translate(0,0)}100%{transform:translate(-35px,0)}}@keyframes animateStripeRTL{0%{transform:translate(0,0)}100%{transform:translate(-35px,0)}}.eael-progressbar{position:relative}.eael-progressbar-title{font-size:20px;font-weight:400}.eael-progressbar-line{position:relative;display:block;width:100%;height:12px;background-color:#eee}.eael-progressbar-line .eael-progressbar-count-wrap{position:absolute;right:0;bottom:calc(100% + 5px);font-size:16px;font-weight:400;line-height:1}.eael-progressbar-line-fill{display:inline-block;position:absolute;top:50%;left:0;width:0;height:12px;background-color:#000;transform:translateY(-50%);transition:width 1.5s linear;overflow:hidden}.eael-progressbar-circle{position:relative;width:200px;height:200px}.eael-progressbar-circle .eael-progressbar-title{font-size:16px;font-weight:400}.eael-progressbar-circle .eael-progressbar-count-wrap{font-size:28px;font-weight:700}.eael-progressbar-circle-shadow{width:220px;height:220px;padding:10px;border-radius:50%}.eael-progressbar-circle-pie{position:absolute;top:0;left:0;width:100%;height:100%;-webkit-clip-path:inset(0 0 0 50%);clip-path:inset(0 0 0 50%)}.eael-progressbar-circle-inner{height:100%;width:100%;border-width:12px;border-style:solid;border-color:#eee;border-radius:50%}.eael-progressbar-circle-half{position:absolute;left:0;top:0;height:100%;width:100%;border-width:12px;border-style:solid;border-color:#000;border-radius:50%;-webkit-clip-path:inset(0 50% 0 0);clip-path:inset(0 50% 0 0)}.eael-progressbar-circle-half-left{transform:rotate(0)}.eael-progressbar-circle-half-right{transform:rotate(180deg);visibility:hidden}.eael-progressbar-circle-inner-content{position:absolute;top:50%;width:100%;transform:translateY(-50%);text-align:center}.eael-progressbar-half-circle{position:relative;width:200px;height:100px;overflow:hidden}.eael-progressbar-half-circle .eael-progressbar-circle-pie{-webkit-clip-path:inset(0 0 50% 0);clip-path:inset(0 0 50% 0)}.eael-progressbar-half-circle .eael-progressbar-circle-half{-webkit-clip-path:inset(50% 0 0 0);clip-path:inset(50% 0 0 0);transform:rotate(0);transition:transform 1.5s linear}.eael-progressbar-half-circle .eael-progressbar-circle-inner-content{top:initial;bottom:0;transform:translateY(0)}.eael-progressbar-half-circle .eael-progressbar-title{font-size:16px;font-weight:400}.eael-progressbar-half-circle .eael-progressbar-count-wrap{font-size:28px;font-weight:700}.eael-progressbar-half-circle-after{position:relative;font-size:12px;font-weight:400;clear:both}.eael-progressbar-postfix-label{float:right}.eael-progressbar-line-stripe .eael-progressbar-line-fill:after{content:'';position:absolute;top:0;left:-35px;width:calc(100% + 70px);height:100%;background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:35px 35px}.eael-progressbar-line-animate .eael-progressbar-line-fill:after{-webkit-animation:animateStripe 2s linear infinite;animation:animateStripe 2s linear infinite}.eael-progressbar-line-animate-rtl .eael-progressbar-line-fill:after{-webkit-animation:animateStripeRTL 2s linear infinite;animation:animateStripeRTL 2s linear infinite}.eael-progressbar-circle-wrap>div{margin:0 auto}.eael-progressbar-box-container.left>div,.eael-progressbar-circle-container.left>div,.eael-progressbar-line-container.left{margin:0 auto 0 0}.eael-progressbar-box-container.center>div,.eael-progressbar-circle-container.center>div,.eael-progressbar-line-container.center{margin:0 auto}.eael-progressbar-box-container.right>div,.eael-progressbar-circle-container.right>div,.eael-progressbar-line-container.right{margin:0 0 0 auto}
31
  .eael-reading-progress-wrap.eael-reading-progress-wrap-local .eael-reading-progress-global{display:none}.eael-reading-progress-wrap.eael-reading-progress-wrap-global .eael-reading-progress-local{display:none}.eael-reading-progress-wrap.eael-reading-progress-wrap-disabled .eael-reading-progress-global,.eael-reading-progress-wrap.eael-reading-progress-wrap-disabled .eael-reading-progress-local{display:none}.eael-reading-progress-wrap .eael-reading-progress{width:100%;position:fixed;top:0;left:0;height:5px;z-index:999999}.eael-reading-progress-wrap .eael-reading-progress.eael-reading-progress-bottom{top:unset;bottom:0}.eael-reading-progress-wrap .eael-reading-progress .eael-reading-progress-fill{height:5px;background-color:#1fd18e;width:0%;transition:width 50ms ease}
32
  .eaelsv-overlay{position:absolute;display:block;width:100%;height:100%;top:0;left:0;right:0;bottom:0;background-color:rgba(0,0,0,.5);z-index:4;cursor:pointer;background-size:cover;background-position:50%;text-align:center;overflow:hidden}.eaelsv-overlay-icon{position:absolute;top:50%;left:50%;font-size:90px;color:#fff;transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%)}.plyr__controls button{box-shadow:none!important}.plyr__controls button:hover{box-shadow:none!important}.plyr__controls{display:none!important}.eael-sticky-video-wrapper{position:relative;width:100%;min-height:200px;margin:0;padding:0;transition:.5s;text-align:left;overflow:hidden}.eael-sticky-video-player2{min-height:20px;overflow:visible}.eael-sticky-video-player2.out{position:fixed;z-index:999;border:0!important;border-radius:0!important;height:200px;width:300px}.eael-sticky-video-wrapper.out .eael-sticky-video-player,.eael-sticky-video-wrapper.out .eael-sticky-video-player2{border-radius:0!important}.eael-sticky-video-player2.in{position:relative;margin:0;padding:0;height:100%;border:0;line-height:1}.owp-play{position:absolute;top:50%;left:50%;transform:translateX(-50%) translateY(-50%)}.owp-play i{font-size:100px;color:#fff;opacity:.8;text-shadow:1px 0 6px rgba(0,0,0,.3);transition:all .5s}.eael-sticky-video-player:hover .owp-play i{opacity:1}.eaelsv-sticky-player-close{position:absolute;right:-25px;top:-36px;display:none;padding:7px;font-size:24px;z-index:9999;cursor:pointer;box-sizing:content-box;overflow:visible}.eaelsv-sticky-player-close:hover{color:#090}.eaelsv-sticky-player-close:after,.eaelsv-sticky-player-close:before{position:absolute;left:15px;background-color:#333}.eaelsv-sticky-player-close:before{transform:rotate(45deg)}.eaelsv-sticky-player-close:after{transform:rotate(-45deg)}
33
  .eael-team-item{overflow:hidden;position:relative}.team-avatar-rounded figure img{border-radius:50%;height:auto}.eael-team-image>figure{margin:0;padding:0}.eael-team-image>figure img{display:block;margin:0 auto}.eael-team-item .eael-team-content{padding:10px}.eael-team-item .eael-team-member-name{font-size:20px;font-weight:700;letter-spacing:.05em;margin:5px 0;text-transform:uppercase}.eael-team-item .eael-team-member-position{font-size:14px;font-weight:400;letter-spacing:.05em;margin:5px 0 10px;text-transform:uppercase}.eael-team-item .eael-team-content,.eael-team-item .eael-team-content .eael-team-text{font-size:14px;line-height:1.5}.eael-team-content>ul{margin:0;padding:0}.eael-team-content li{display:inline-block;list-style:outside none none;margin-right:10px;text-align:center}.eael-team-content li a{font-size:2.5rem}.eael-team-align-left .eael-team-item .eael-team-content li,.eael-team-align-left .eael-team-item .eael-team-content p,.eael-team-align-left .eael-team-item .eael-team-content ul,.eael-team-align-left .eael-team-item .eael-team-member-name,.eael-team-align-left .eael-team-item .eael-team-member-position,.eael-team-align-left .eael-team-item .eael-team-text{text-align:left}.eael-team-align-right .eael-team-item .eael-team-content li,.eael-team-align-right .eael-team-item .eael-team-content p,.eael-team-align-right .eael-team-item .eael-team-content ul,.eael-team-align-right .eael-team-item .eael-team-member-name,.eael-team-align-right .eael-team-item .eael-team-member-position,.eael-team-align-right .eael-team-item .eael-team-text{text-align:right}.eael-team-align-centered .eael-team-item .eael-team-content li,.eael-team-align-centered .eael-team-item .eael-team-content p,.eael-team-align-centered .eael-team-item .eael-team-content ul,.eael-team-align-centered .eael-team-item .eael-team-member-name,.eael-team-align-centered .eael-team-item .eael-team-member-position,.eael-team-align-centered .eael-team-item .eael-team-text{text-align:center}.eael-team-item.eael-team-members-overlay .eael-team-content{bottom:10px;left:10px;margin-bottom:0;padding-top:15%;opacity:0;overflow:hidden;text-overflow:ellipsis;position:absolute;right:10px;top:10px;transition:all 615ms cubic-bezier(.19,1,.22,1) 0s}.eael-team-item.eael-team-members-overlay:hover .eael-team-content{opacity:1}.eael-team-member-social-link>a{display:inline-block;transition:all .3s cubic-bezier(.19,1,.22,1) 0s}.eael-team-member-social-link>a:focus{outline:0}
34
  .eael-testimonial-slider{position:relative}.testimonial-star-rating{padding:0;margin:0}.testimonial-star-rating li{list-style:none;display:inline-block}.testimonial-star-rating li i{color:#d8d8d8}.rating-five .testimonial-star-rating li i{color:#f2b01e}.rating-one .testimonial-star-rating li:first-child i{color:#f2b01e}.rating-two .testimonial-star-rating li:nth-child(1) i,.rating-two .testimonial-star-rating li:nth-child(2) i{color:#f2b01e}.rating-three .testimonial-star-rating li:nth-child(1) i,.rating-three .testimonial-star-rating li:nth-child(2) i,.rating-three .testimonial-star-rating li:nth-child(3) i{color:#f2b01e}.rating-four .testimonial-star-rating li:nth-child(1) i,.rating-four .testimonial-star-rating li:nth-child(2) i,.rating-four .testimonial-star-rating li:nth-child(3) i,.rating-four .testimonial-star-rating li:nth-child(4) i{color:#f2b01e}.eael-testimonial-image img{max-width:100%}.eael-testimonial-image{padding:10px 0 0 0}.eael-testimonial-image>figure{display:block;margin:0}.testimonial-avatar-rounded figure img{border-radius:50%;height:auto}.eael-testimonial-content{margin:0;padding:10px}.eael-testimonial-item>figure{margin:0 auto;padding:0 20px}.eael-testimonial-item .center-text{text-align:center}.eael-testimonial-item .right-text{text-align:right}.eael-testimonial-item .left-text{text-align:left}.eael-testimonial-item .justify-text{text-align:justify}.eael-testimonial-content .eael-testimonial-text{font-size:100%;font-style:italic;line-height:1.5;margin-top:0;margin-bottom:10px;word-wrap:break-word}.eael-testimonial-content .eael-testimonial-user{display:inline-block;font-family:inherit;font-size:105%;font-style:italic;font-weight:400;line-height:1.5;margin-top:0;margin-bottom:0;margin-right:5px}.eael-testimonial-content .eael-testimonial-user-company{display:inline-block;font-family:inherit;font-size:90%;font-style:italic;font-weight:lighter;line-height:1.75;margin-bottom:0;margin-top:1px}.eael-testimonial-image{position:relative}.eael-testimonial-item .eael-testimonial-quote::after{color:inherit!important;content:"\f10e";font-family:"Font Awesome 5 Free";font-size:200%;font-weight:900}.eael-testimonial-slider.default-style .eael-testimonial-align-centered .eael-testimonial-image figure img{margin:0 auto}.eael-testimonial-slider.classic-style .eael-testimonial-align-left .eael-testimonial-image figure img,.eael-testimonial-slider.classic-style .eael-testimonial-align-right .eael-testimonial-image figure img,.eael-testimonial-slider.default-style .eael-testimonial-align-left .eael-testimonial-image figure img,.eael-testimonial-slider.default-style .eael-testimonial-align-right .eael-testimonial-image figure img,.eael-testimonial-slider.middle-style .eael-testimonial-align-left .eael-testimonial-image figure img,.eael-testimonial-slider.middle-style .eael-testimonial-align-right .eael-testimonial-image figure img{margin:0}.eael-testimonial-slider.classic-style .eael-testimonial-align-right .eael-testimonial-image figure,.eael-testimonial-slider.default-style .eael-testimonial-align-right .eael-testimonial-image figure,.eael-testimonial-slider.middle-style .eael-testimonial-align-right .eael-testimonial-image figure{text-align:right}.eael-testimonial-slider.classic-style .eael-testimonial-align-left .eael-testimonial-image figure,.eael-testimonial-slider.default-style .eael-testimonial-align-left .eael-testimonial-image figure,.eael-testimonial-slider.middle-style .eael-testimonial-align-left .eael-testimonial-image figure{text-align:left}.eael-testimonial-slider.classic-style .eael-testimonial-align-right .testimonial-classic-style-content,.eael-testimonial-slider.default-style .eael-testimonial-align-right .default-style-testimonial-content,.eael-testimonial-slider.middle-style .eael-testimonial-align-right .eael-testimonial-text,.eael-testimonial-slider.middle-style .eael-testimonial-align-right .middle-style-content{text-align:right}.eael-testimonial-slider.classic-style .eael-testimonial-align-center .testimonial-classic-style-content,.eael-testimonial-slider.default-style .eael-testimonial-align-center .default-style-testimonial-content,.eael-testimonial-slider.middle-style .eael-testimonial-align-center .eael-testimonial-text,.eael-testimonial-slider.middle-style .eael-testimonial-align-center .middle-style-content{text-align:center}.eael-testimonial-slider.classic-style .eael-testimonial-align-left .testimonial-classic-style-content,.eael-testimonial-slider.default-style .eael-testimonial-align-left .default-style-testimonial-content,.eael-testimonial-slider.middle-style .eael-testimonial-align-left .eael-testimonial-text,.eael-testimonial-slider.middle-style .eael-testimonial-align-left .middle-style-content{text-align:left}.eael-testimonial-slider.icon-img-left-content .eael-testimonial-text>p,.eael-testimonial-slider.icon-img-right-content .eael-testimonial-text>p{margin:0}.icon-img-left-content .eael-testimonial-image{float:left;width:30%}.icon-img-left-content .eael-testimonial-content{float:left;width:70%;text-align:left}.icon-img-left-content.eael-testimonial-item{overflow:hidden;position:relative}.icon-img-left-content .eael-testimonial-quote{position:absolute;right:0}.icon-img-left-content .eael-testimonial-text{margin-top:0}.eael-testimonial-align-centered .eael-testimonial-user,.eael-testimonial-align-centered .eael-testimonial-user-company{float:none;text-align:center}.eael-testimonial-align-centered .eael-testimonial-image>figure img{display:block;margin-left:auto!important;margin-right:auto!important}.icon-img-right-content .eael-testimonial-image{float:right;width:30%}.icon-img-right-content .eael-testimonial-content{float:right;width:70%;text-align:right}.icon-img-right-content.eael-testimonial-item{overflow:hidden;position:relative}.icon-img-right-content .eael-testimonial-quote{position:absolute}.icon-img-right-content .eael-testimonial-text{margin-top:0}.eael-testimonial-item{position:relative}.classic-style.testimonial-alignment-center .eael-testimonial-image,.default-style.testimonial-alignment-center .eael-testimonial-image{text-align:center}.classic-style.testimonial-alignment-right .eael-testimonial-image,.default-style.testimonial-alignment-right .eael-testimonial-image{text-align:right}.classic-style.testimonial-alignment-center .eael-testimonial-image>figure,.default-style.testimonial-alignment-center .eael-testimonial-image>figure{text-align:center}.eael-testimonial-slider.icon-img-left-content .eael-testimonial-align-centered .eael-testimonial-content{text-align:center}.eael-testimonial-slider.icon-img-left-content .eael-testimonial-align-left .eael-testimonial-content{text-align:left}.eael-testimonial-slider.icon-img-left-content .eael-testimonial-align-right .eael-testimonial-content{text-align:right}.eael-testimonial-slider.icon-img-right-content .eael-testimonial-align-centered .eael-testimonial-content{text-align:center}.eael-testimonial-slider.icon-img-right-content .eael-testimonial-align-left .eael-testimonial-content{text-align:left}.eael-testimonial-slider.icon-img-right-content .eael-testimonial-align-right .eael-testimonial-content{text-align:right}span.eael-testimonial-quote{position:absolute;right:10px;top:10px}.eael-testimonial-item.left .eael-testimonial-image{text-align:left}.eael-testimonial-item.center .eael-testimonial-image{text-align:center}.eael-testimonial-item.right .eael-testimonial-image{text-align:right}.eael-testimonial-inline-bio .eael-testimonial-image{float:left}.eael-testimonial-inline-bio .bio-text{padding-top:10px}.eael-testimonial-content.eael-testimonial-inline-bio{overflow:hidden;margin-bottom:0;padding-bottom:0}.eael-testimonial-inline-bio .bio-text,.eael-testimonial-inline-bio .testimonial-star-rating{float:left;width:65%}.eael-testimonial-content.eael-testimonial-inline-bio{text-align:left!important}.testimonial-inline-style .eael-testimonial-image{float:left;max-width:100%;padding:0;margin-right:15px}.testimonial-inline-style{overflow:hidden;text-align:left}.content-top-icon-title-inline .eael-testimonial-align-left .eael-testimonial-text,.content-top-icon-title-inline .eael-testimonial-text{text-align:left}.content-top-icon-title-inline .eael-testimonial-align-centered .eael-testimonial-text{text-align:center}.content-top-icon-title-inline .eael-testimonial-align-right .eael-testimonial-text{text-align:right}.content-bottom-icon-title-inline .eael-testimonial-align-left .eael-testimonial-text,.content-bottom-icon-title-inline .eael-testimonial-text{text-align:left}.content-bottom-icon-title-inline .eael-testimonial-align-centered .eael-testimonial-text{text-align:center}.content-bottom-icon-title-inline .eael-testimonial-align-right .eael-testimonial-text{text-align:right}
35
+ .eael-tooltip{position:relative;display:inline-block;min-width:150px;padding:12px 24px;font-size:.93rem;color:#333;line-height:1;cursor:pointer;transition:all .3s ease-in-out}.eael-tooltip .eael-tooltip-text{display:block;width:100%;visibility:hidden;background-color:#000;color:#fff;border-radius:4px;padding:10px;position:absolute;z-index:1;font-size:.93rem;line-height:1.3}.eael-tooltip .eael-tooltip-text p{margin:0}.eael-tooltip .eael-tooltip-text::after{content:"";position:absolute;border-width:5px;border-style:solid}.eael-tooltip:hover .eael-tooltip-text{visibility:visible}.eael-tooltip .eael-tooltip-text.eael-tooltip-left{top:50%;right:100%;transform:translateY(-50%);margin-right:10px}.eael-tooltip:hover .eael-tooltip-text.eael-tooltip-left{-webkit-animation:tooltipLeftIn .3s ease-in-out;animation:tooltipLeftIn .3s ease-in-out}.eael-tooltip .eael-tooltip-text.eael-tooltip-left::after{top:calc(50% - 5px);left:100%;border-color:transparent transparent transparent #000}.eael-tooltip .eael-tooltip-text.eael-tooltip-right{top:50%;left:100%;transform:translateY(-50%);transition:all .3s ease-in-out;margin-left:10px}.eael-tooltip:hover .eael-tooltip-text.eael-tooltip-right{-webkit-animation:tooltipRightIn .3s linear;animation:tooltipRightIn .3s linear}.eael-tooltip .eael-tooltip-text.eael-tooltip-right::after{top:calc(50% - 5px);right:100%;border-color:transparent #000 transparent transparent}.eael-tooltip .eael-tooltip-text.eael-tooltip-top{bottom:calc(100%);left:0;right:0;margin:0 auto 10px auto}.eael-tooltip .eael-tooltip-text.eael-tooltip-top::after{margin-top:0;top:100%;left:calc(50% - 5px);border-color:#000 transparent transparent transparent}.eael-tooltip:hover .eael-tooltip-text.eael-tooltip-top{-webkit-animation:tooltipTopIn .3s linear;animation:tooltipTopIn .3s linear}.eael-tooltip .eael-tooltip-text.eael-tooltip-bottom{top:100%;left:0;right:0;margin:10px auto 0 auto}.eael-tooltip .eael-tooltip-text.eael-tooltip-bottom::after{margin-top:0;bottom:100%;left:calc(50% - 5px);border-color:transparent transparent #000 transparent}.eael-tooltip:hover .eael-tooltip-text.eael-tooltip-bottom{-webkit-animation:tooltipBottomIn .3s linear;animation:tooltipBottomIn .3s linear}.eael-tooltip-align-left{display:flex;width:100%;justify-content:flex-start}.eael-tooltip-align-right{display:flex;width:100%;justify-content:flex-end}.eael-tooltip-align-center{display:flex;width:100%;justify-content:center}.eael-tooltip-align-justify .eael-tooltip{display:flex;justify-content:center;align-items:center}@-webkit-keyframes tooltipRightIn{0%{opacity:0;left:105%}100%{opacity:1;left:100%}}@keyframes tooltipRightIn{0%{opacity:0;left:105%}100%{opacity:1;left:100%}}@-webkit-keyframes tooltipLeftIn{0%{opacity:0;right:105%}100%{opacity:1;right:100%}}@keyframes tooltipLeftIn{0%{opacity:0;right:105%}100%{opacity:1;right:100%}}@-webkit-keyframes tooltipTopIn{0%{opacity:0;bottom:110%}100%{opacity:1;bottom:100%}}@keyframes tooltipTopIn{0%{opacity:0;bottom:110%}100%{opacity:1;bottom:100%}}@-webkit-keyframes tooltipBottomIn{0%{opacity:0;top:110%}100%{opacity:1;top:100%}}@keyframes tooltipBottomIn{0%{opacity:0;top:110%}100%{opacity:1;top:100%}}span.eael-tooltip-content,span.eael-tooltip-content a{width:100%;display:block;text-align:center}.eael-tooltip-text-align-left .eael-tooltip-content a,.eael-tooltip-text-align-left .eael-tooltip-text{text-align:left}.eael-tooltip-text-align-right .eael-tooltip-content a,.eael-tooltip-text-align-right .eael-tooltip-text{text-align:right}.eael-tooltip-text-align-center .eael-tooltip-content a,.eael-tooltip-text-align-center .eael-tooltip-text{text-align:center}.eael-tooltip-text-align-justify .eael-tooltip-content a,.eael-tooltip-text-align-justify .eael-tooltip-text{text-align:justify}
36
  .eael-twitter-feed::after,.eael-twitter-feed::before{content:"";clear:both}.eael-twitter-feed-masonry .eael-twitter-feed-item{float:left}@media only screen and (max-width:480px){.eael-twitter-feed-masonry.eael-twitter-feed-col-2 .eael-twitter-feed-item{width:100%!important}}@media only screen and (max-width:480px){.eael-twitter-feed-masonry.eael-twitter-feed-col-3 .eael-twitter-feed-item{width:100%!important}}@media only screen and (max-width:480px){.eael-twitter-feed-masonry.eael-twitter-feed-col-4 .eael-twitter-feed-item{width:100%!important}}.eael-twitter-feed-item .eael-twitter-feed-item-inner{background:#fff;border:1px solid rgba(0,0,0,.1)}.eael-twitter-feed-item a{color:#08c;text-decoration:none}.eael-twitter-feed-item a:hover{outline:0;color:#005580}.eael-twitter-feed-item a:focus{outline:0}.eael-twitter-feed-item .eael-twitter-feed-item-header{padding:20px 15px 0;margin-bottom:10px}.eael-twitter-feed-item .eael-twitter-feed-item-header .eael-twitter-feed-item-avatar{float:left;width:38px;margin-right:10px}.eael-twitter-feed-item .eael-twitter-feed-item-header .eael-twitter-feed-item-avatar img{max-width:100%;height:auto;-o-object-fit:cover;object-fit:cover}.eael-twitter-feed-item .eael-twitter-feed-item-header .eael-twitter-feed-item-avatar.avatar-circle img{border-radius:50%}.eael-twitter-feed-item .eael-twitter-feed-item-header .eael-twitter-feed-item-meta{float:left}.eael-twitter-feed-item .eael-twitter-feed-item-header .eael-twitter-feed-item-meta .eael-twitter-feed-item-icon{color:#1da1f2;margin-right:5px}.eael-twitter-feed-item .eael-twitter-feed-item-header .eael-twitter-feed-item-meta .eael-twitter-feed-item-author{color:#444;line-height:1.5em;font-weight:700}.eael-twitter-feed-item .eael-twitter-feed-item-header .eael-twitter-feed-item-date{float:right;margin-right:10px;font-size:90%;color:#999}.eael-twitter-feed-item .eael-twitter-feed-item-content{padding:0 15px 15px}.eael-twitter-feed-item .eael-twitter-feed-item-content p{color:#666;margin:0 0 5px;min-height:20px;text-overflow:ellipsis;-webkit-line-clamp:5;-webkit-box-orient:vertical}.eael-twitter-feed.swiper-container .swiper-button-next,.eael-twitter-feed.swiper-container .swiper-button-prev{background-image:none;outline:0}
37
  .eael-weform-container input,.eael-weform-container textarea{height:auto;padding:10px}.eael-contact-form-btn-align-center .eael-weform-container ul.wpuf-form .wpuf-submit input[type=submit]{margin-left:auto!important;margin-right:auto!important;display:block;float:none}.eael-contact-form-btn-align-left .eael-weform-container ul.wpuf-form .wpuf-submit input[type=submit]{float:left;width:auto}.eael-contact-form-btn-align-right .eael-weform-container ul.wpuf-form .wpuf-submit input[type=submit]{float:right;width:auto}.eael-weform-container ul.wpuf-form li .wpuf-fields input[type=email],.eael-weform-container ul.wpuf-form li .wpuf-fields input[type=number],.eael-weform-container ul.wpuf-form li .wpuf-fields input[type=password],.eael-weform-container ul.wpuf-form li .wpuf-fields input[type=text],.eael-weform-container ul.wpuf-form li .wpuf-fields input[type=url],.eael-weform-container ul.wpuf-form li .wpuf-fields textarea{max-width:100%}
38
  .eael-wpforms .wpforms-container .wpforms-form .wpforms-page-button,.eael-wpforms .wpforms-container .wpforms-form button[type=submit],.eael-wpforms .wpforms-container .wpforms-form input[type=submit]{border:0}.eael-wpforms .wpforms-container .wpforms-form .wpforms-page-button:hover,.eael-wpforms .wpforms-container .wpforms-form button[type=submit]:hover,.eael-wpforms .wpforms-container .wpforms-form input[type=submit]:hover{border:0}.eael-wpforms .wpforms-container .wpforms-form input[type=checkbox],.eael-wpforms .wpforms-container .wpforms-form input[type=radio]{padding:3px}.eael-wpforms .wpforms-container .wpforms-form .wpforms-field-label{display:none}.eael-wpforms .wpforms-container .wpforms-form .wpforms-field-name .wpforms-field-row{max-width:100%}.eael-wpforms .wpforms-container .wpforms-field input:not([type=radio]):not([type=checkbox]):not([type=submit]):not([type=button]):not([type=image]):not([type=file]),.eael-wpforms .wpforms-container .wpforms-field select,.eael-wpforms .wpforms-container .wpforms-field textarea{max-width:100%!important}.eael-wpforms-labels-yes .wpforms-container .wpforms-form .wpforms-field-label{display:block}.eael-wpforms-form-button-full-width .wpforms-submit-container .wpforms-submit{width:100%}
39
+ @keyframes plyr-progress{to{background-position:25px 0}}@keyframes plyr-popup{0%{opacity:.5;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}@keyframes plyr-fade-in{from{opacity:0}to{opacity:1}}.plyr{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:subpixel-antialiased;direction:ltr;font-family:Avenir,"Avenir Next","Helvetica Neue","Segoe UI",Helvetica,Arial,sans-serif;font-variant-numeric:tabular-nums;font-weight:500;line-height:1.7;max-width:100%;min-width:200px;position:relative;text-shadow:none;transition:box-shadow .3s ease}.plyr audio,.plyr video{border-radius:inherit;height:auto;vertical-align:middle;width:100%}.plyr button{font:inherit;line-height:inherit;width:auto}.plyr:focus{outline:0}.plyr--full-ui{box-sizing:border-box}.plyr--full-ui *,.plyr--full-ui ::after,.plyr--full-ui ::before{box-sizing:inherit}.plyr--full-ui a,.plyr--full-ui button,.plyr--full-ui input,.plyr--full-ui label{touch-action:manipulation}.plyr__badge{background:#4a5764;border-radius:2px;color:#fff;font-size:9px;line-height:1;padding:3px 4px}.plyr--full-ui ::-webkit-media-text-track-container{display:none}.plyr__captions{animation:plyr-fade-in .3s ease;bottom:0;color:#fff;display:none;font-size:14px;left:0;padding:10px;position:absolute;text-align:center;transition:transform .4s ease-in-out;width:100%}.plyr__captions .plyr__caption{background:rgba(0,0,0,.8);border-radius:2px;-webkit-box-decoration-break:clone;box-decoration-break:clone;line-height:185%;padding:.2em .5em;white-space:pre-wrap}.plyr__captions .plyr__caption div{display:inline}.plyr__captions span:empty{display:none}@media (min-width:480px){.plyr__captions{font-size:16px;padding:20px}}@media (min-width:768px){.plyr__captions{font-size:18px}}.plyr--captions-active .plyr__captions{display:block}.plyr:not(.plyr--hide-controls) .plyr__controls:not(:empty)~.plyr__captions{transform:translateY(-40px)}.plyr__control{background:0 0;border:0;border-radius:3px;color:inherit;cursor:pointer;flex-shrink:0;overflow:visible;padding:7px;position:relative;transition:all .3s ease}.plyr__control svg{display:block;fill:currentColor;height:18px;pointer-events:none;width:18px}.plyr__control:focus{outline:0}.plyr__control.plyr__tab-focus{box-shadow:0 0 0 5px rgba(0,179,255,.5);outline:0}a.plyr__control{text-decoration:none}a.plyr__control::after,a.plyr__control::before{display:none}.plyr__control.plyr__control--pressed .icon--not-pressed,.plyr__control.plyr__control--pressed .label--not-pressed,.plyr__control:not(.plyr__control--pressed) .icon--pressed,.plyr__control:not(.plyr__control--pressed) .label--pressed{display:none}.plyr--audio .plyr__control.plyr__tab-focus,.plyr--audio .plyr__control:hover,.plyr--audio .plyr__control[aria-expanded=true]{background:#00b3ff;color:#fff}.plyr--video .plyr__control.plyr__tab-focus,.plyr--video .plyr__control:hover,.plyr--video .plyr__control[aria-expanded=true]{background:#00b3ff;color:#fff}.plyr__control--overlaid{background:rgba(0,179,255,.8);border:0;border-radius:100%;color:#fff;display:none;left:50%;padding:15px;position:absolute;top:50%;transform:translate(-50%,-50%);z-index:2}.plyr__control--overlaid svg{left:2px;position:relative}.plyr__control--overlaid:focus,.plyr__control--overlaid:hover{background:#00b3ff}.plyr--playing .plyr__control--overlaid{opacity:0;visibility:hidden}.plyr--full-ui.plyr--video .plyr__control--overlaid{display:block}.plyr--full-ui ::-webkit-media-controls{display:none}.plyr__controls{align-items:center;display:flex;justify-content:flex-end;text-align:center}.plyr__controls .plyr__progress__container{flex:1;min-width:0}.plyr__controls .plyr__controls__item{margin-left:2.5px}.plyr__controls .plyr__controls__item:first-child{margin-left:0;margin-right:auto}.plyr__controls .plyr__controls__item.plyr__progress__container{padding-left:2.5px}.plyr__controls .plyr__controls__item.plyr__time{padding:0 5px}.plyr__controls .plyr__controls__item.plyr__progress__container:first-child,.plyr__controls .plyr__controls__item.plyr__time+.plyr__time,.plyr__controls .plyr__controls__item.plyr__time:first-child{padding-left:0}.plyr__controls .plyr__controls__item.plyr__volume{padding-right:5px}.plyr__controls .plyr__controls__item.plyr__volume:first-child{padding-right:0}.plyr__controls:empty{display:none}.plyr--audio .plyr__controls{background:#fff;border-radius:inherit;color:#4a5764;padding:10px}.plyr--video .plyr__controls{background:linear-gradient(rgba(0,0,0,0),rgba(0,0,0,.7));border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;bottom:0;color:#fff;left:0;padding:20px 5px 5px;position:absolute;right:0;transition:opacity .4s ease-in-out,transform .4s ease-in-out;z-index:3}@media (min-width:480px){.plyr--video .plyr__controls{padding:35px 10px 10px}}.plyr--video.plyr--hide-controls .plyr__controls{opacity:0;pointer-events:none;transform:translateY(100%)}.plyr [data-plyr=airplay],.plyr [data-plyr=captions],.plyr [data-plyr=fullscreen],.plyr [data-plyr=pip]{display:none}.plyr--airplay-supported [data-plyr=airplay],.plyr--captions-enabled [data-plyr=captions],.plyr--fullscreen-enabled [data-plyr=fullscreen],.plyr--pip-supported [data-plyr=pip]{display:inline-block}.plyr__menu{display:flex;position:relative}.plyr__menu .plyr__control svg{transition:transform .3s ease}.plyr__menu .plyr__control[aria-expanded=true] svg{transform:rotate(90deg)}.plyr__menu .plyr__control[aria-expanded=true] .plyr__tooltip{display:none}.plyr__menu__container{animation:plyr-popup .2s ease;background:rgba(255,255,255,.9);border-radius:4px;bottom:100%;box-shadow:0 1px 2px rgba(0,0,0,.15);color:#4a5764;font-size:16px;margin-bottom:10px;position:absolute;right:-3px;text-align:left;white-space:nowrap;z-index:3}.plyr__menu__container>div{overflow:hidden;transition:height .35s cubic-bezier(.4,0,.2,1),width .35s cubic-bezier(.4,0,.2,1)}.plyr__menu__container::after{border:4px solid transparent;border-top-color:rgba(255,255,255,.9);content:'';height:0;position:absolute;right:15px;top:100%;width:0}.plyr__menu__container [role=menu]{padding:7px}.plyr__menu__container [role=menuitem],.plyr__menu__container [role=menuitemradio]{margin-top:2px}.plyr__menu__container [role=menuitem]:first-child,.plyr__menu__container [role=menuitemradio]:first-child{margin-top:0}.plyr__menu__container .plyr__control{align-items:center;color:#4a5764;display:flex;font-size:14px;padding:4px 11px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}.plyr__menu__container .plyr__control>span{align-items:inherit;display:flex;width:100%}.plyr__menu__container .plyr__control::after{border:4px solid transparent;content:'';position:absolute;top:50%;transform:translateY(-50%)}.plyr__menu__container .plyr__control--forward{padding-right:28px}.plyr__menu__container .plyr__control--forward::after{border-left-color:rgba(74,87,100,.8);right:5px}.plyr__menu__container .plyr__control--forward.plyr__tab-focus::after,.plyr__menu__container .plyr__control--forward:hover::after{border-left-color:currentColor}.plyr__menu__container .plyr__control--back{font-weight:500;margin:7px;margin-bottom:3px;padding-left:28px;position:relative;width:calc(100% - 14px)}.plyr__menu__container .plyr__control--back::after{border-right-color:rgba(74,87,100,.8);left:7px}.plyr__menu__container .plyr__control--back::before{background:#c1c9d1;box-shadow:0 1px 0 #fff;content:'';height:1px;left:0;margin-top:4px;overflow:hidden;position:absolute;right:0;top:100%}.plyr__menu__container .plyr__control--back.plyr__tab-focus::after,.plyr__menu__container .plyr__control--back:hover::after{border-right-color:currentColor}.plyr__menu__container .plyr__control[role=menuitemradio]{padding-left:7px}.plyr__menu__container .plyr__control[role=menuitemradio]::after,.plyr__menu__container .plyr__control[role=menuitemradio]::before{border-radius:100%}.plyr__menu__container .plyr__control[role=menuitemradio]::before{background:rgba(0,0,0,.1);content:'';display:block;flex-shrink:0;height:16px;margin-right:10px;transition:all .3s ease;width:16px}.plyr__menu__container .plyr__control[role=menuitemradio]::after{background:#fff;border:0;height:6px;left:12px;opacity:0;top:50%;transform:translateY(-50%) scale(0);transition:transform .3s ease,opacity .3s ease;width:6px}.plyr__menu__container .plyr__control[role=menuitemradio][aria-checked=true]::before{background:#00b3ff}.plyr__menu__container .plyr__control[role=menuitemradio][aria-checked=true]::after{opacity:1;transform:translateY(-50%) scale(1)}.plyr__menu__container .plyr__control[role=menuitemradio].plyr__tab-focus::before,.plyr__menu__container .plyr__control[role=menuitemradio]:hover::before{background:rgba(0,0,0,.1)}.plyr__menu__container .plyr__menu__value{align-items:center;display:flex;margin-left:auto;margin-right:-5px;overflow:hidden;padding-left:25px;pointer-events:none}.plyr--full-ui input[type=range]{-webkit-appearance:none;background:0 0;border:0;border-radius:26px;color:#00b3ff;display:block;height:19px;margin:0;padding:0;transition:box-shadow .3s ease;width:100%}.plyr--full-ui input[type=range]::-webkit-slider-runnable-track{background:0 0;border:0;border-radius:2.5px;height:5px;transition:box-shadow .3s ease;-webkit-user-select:none;user-select:none;background-image:linear-gradient(to right,currentColor var(--value,0),transparent var(--value,0))}.plyr--full-ui input[type=range]::-webkit-slider-thumb{background:#fff;border:0;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(35,41,47,.2);height:13px;position:relative;transition:all .2s ease;width:13px;-webkit-appearance:none;margin-top:-4px}.plyr--full-ui input[type=range]::-moz-range-track{background:0 0;border:0;border-radius:2.5px;height:5px;transition:box-shadow .3s ease;-moz-user-select:none;user-select:none}.plyr--full-ui input[type=range]::-moz-range-thumb{background:#fff;border:0;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(35,41,47,.2);height:13px;position:relative;transition:all .2s ease;width:13px}.plyr--full-ui input[type=range]::-moz-range-progress{background:currentColor;border-radius:2.5px;height:5px}.plyr--full-ui input[type=range]::-ms-track{background:0 0;border:0;border-radius:2.5px;height:5px;transition:box-shadow .3s ease;-ms-user-select:none;user-select:none;color:transparent}.plyr--full-ui input[type=range]::-ms-fill-upper{background:0 0;border:0;border-radius:2.5px;height:5px;transition:box-shadow .3s ease;-ms-user-select:none;user-select:none}.plyr--full-ui input[type=range]::-ms-fill-lower{background:0 0;border:0;border-radius:2.5px;height:5px;transition:box-shadow .3s ease;-ms-user-select:none;user-select:none;background:currentColor}.plyr--full-ui input[type=range]::-ms-thumb{background:#fff;border:0;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(35,41,47,.2);height:13px;position:relative;transition:all .2s ease;width:13px;margin-top:0}.plyr--full-ui input[type=range]::-ms-tooltip{display:none}.plyr--full-ui input[type=range]:focus{outline:0}.plyr--full-ui input[type=range]::-moz-focus-outer{border:0}.plyr--full-ui input[type=range].plyr__tab-focus::-webkit-slider-runnable-track{box-shadow:0 0 0 5px rgba(0,179,255,.5);outline:0}.plyr--full-ui input[type=range].plyr__tab-focus::-moz-range-track{box-shadow:0 0 0 5px rgba(0,179,255,.5);outline:0}.plyr--full-ui input[type=range].plyr__tab-focus::-ms-track{box-shadow:0 0 0 5px rgba(0,179,255,.5);outline:0}.plyr--full-ui.plyr--video input[type=range]::-webkit-slider-runnable-track{background-color:rgba(255,255,255,.25)}.plyr--full-ui.plyr--video input[type=range]::-moz-range-track{background-color:rgba(255,255,255,.25)}.plyr--full-ui.plyr--video input[type=range]::-ms-track{background-color:rgba(255,255,255,.25)}.plyr--full-ui.plyr--video input[type=range]:active::-webkit-slider-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(35,41,47,.2),0 0 0 3px rgba(255,255,255,.5)}.plyr--full-ui.plyr--video input[type=range]:active::-moz-range-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(35,41,47,.2),0 0 0 3px rgba(255,255,255,.5)}.plyr--full-ui.plyr--video input[type=range]:active::-ms-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(35,41,47,.2),0 0 0 3px rgba(255,255,255,.5)}.plyr--full-ui.plyr--audio input[type=range]::-webkit-slider-runnable-track{background-color:rgba(193,201,209,.66)}.plyr--full-ui.plyr--audio input[type=range]::-moz-range-track{background-color:rgba(193,201,209,.66)}.plyr--full-ui.plyr--audio input[type=range]::-ms-track{background-color:rgba(193,201,209,.66)}.plyr--full-ui.plyr--audio input[type=range]:active::-webkit-slider-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(35,41,47,.2),0 0 0 3px rgba(0,0,0,.1)}.plyr--full-ui.plyr--audio input[type=range]:active::-moz-range-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(35,41,47,.2),0 0 0 3px rgba(0,0,0,.1)}.plyr--full-ui.plyr--audio input[type=range]:active::-ms-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(35,41,47,.2),0 0 0 3px rgba(0,0,0,.1)}.plyr__poster{background-color:#000;background-position:50% 50%;background-repeat:no-repeat;background-size:contain;height:100%;left:0;opacity:0;position:absolute;top:0;transition:opacity .2s ease;width:100%;z-index:1}.plyr--stopped.plyr__poster-enabled .plyr__poster{opacity:1}.plyr__time{font-size:14px}.plyr__time+.plyr__time::before{content:'\2044';margin-right:10px}@media (max-width:767px){.plyr__time+.plyr__time{display:none}}.plyr--video .plyr__time{text-shadow:0 1px 1px rgba(0,0,0,.15)}.plyr__tooltip{background:rgba(255,255,255,.9);border-radius:3px;bottom:100%;box-shadow:0 1px 2px rgba(0,0,0,.15);color:#4a5764;font-size:14px;font-weight:500;left:50%;line-height:1.3;margin-bottom:10px;opacity:0;padding:5px 7.5px;pointer-events:none;position:absolute;transform:translate(-50%,10px) scale(.8);transform-origin:50% 100%;transition:transform .2s .1s ease,opacity .2s .1s ease;white-space:nowrap;z-index:2}.plyr__tooltip::before{border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid rgba(255,255,255,.9);bottom:-4px;content:'';height:0;left:50%;position:absolute;transform:translateX(-50%);width:0;z-index:2}.plyr .plyr__control.plyr__tab-focus .plyr__tooltip,.plyr .plyr__control:hover .plyr__tooltip,.plyr__tooltip--visible{opacity:1;transform:translate(-50%,0) scale(1)}.plyr .plyr__control:hover .plyr__tooltip{z-index:3}.plyr__controls>.plyr__control:first-child .plyr__tooltip,.plyr__controls>.plyr__control:first-child+.plyr__control .plyr__tooltip{left:0;transform:translate(0,10px) scale(.8);transform-origin:0 100%}.plyr__controls>.plyr__control:first-child .plyr__tooltip::before,.plyr__controls>.plyr__control:first-child+.plyr__control .plyr__tooltip::before{left:16px}.plyr__controls>.plyr__control:last-child .plyr__tooltip{left:auto;right:0;transform:translate(0,10px) scale(.8);transform-origin:100% 100%}.plyr__controls>.plyr__control:last-child .plyr__tooltip::before{left:auto;right:16px;transform:translateX(50%)}.plyr__controls>.plyr__control:first-child .plyr__tooltip--visible,.plyr__controls>.plyr__control:first-child+.plyr__control .plyr__tooltip--visible,.plyr__controls>.plyr__control:first-child+.plyr__control.plyr__tab-focus .plyr__tooltip,.plyr__controls>.plyr__control:first-child+.plyr__control:hover .plyr__tooltip,.plyr__controls>.plyr__control:first-child.plyr__tab-focus .plyr__tooltip,.plyr__controls>.plyr__control:first-child:hover .plyr__tooltip,.plyr__controls>.plyr__control:last-child .plyr__tooltip--visible,.plyr__controls>.plyr__control:last-child.plyr__tab-focus .plyr__tooltip,.plyr__controls>.plyr__control:last-child:hover .plyr__tooltip{transform:translate(0,0) scale(1)}.plyr--video{background:#000;overflow:hidden}.plyr--video.plyr--menu-open{overflow:visible}.plyr__video-wrapper{background:#000;border-radius:inherit;overflow:hidden;position:relative;z-index:0}.plyr__video-embed,.plyr__video-wrapper--fixed-ratio{height:0;padding-bottom:56.25%}.plyr__video-embed iframe,.plyr__video-wrapper--fixed-ratio video{border:0;height:100%;left:0;position:absolute;top:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}.plyr--full-ui .plyr__video-embed>.plyr__video-embed__container{padding-bottom:240%;position:relative;transform:translateY(-38.28125%)}.plyr__progress{left:6.5px;margin-right:13px;position:relative}.plyr__progress input[type=range],.plyr__progress__buffer{margin-left:-6.5px;margin-right:-6.5px;width:calc(100% + 13px)}.plyr__progress input[type=range]{position:relative;z-index:2}.plyr__progress .plyr__tooltip{font-size:14px;left:0}.plyr__progress__buffer{-webkit-appearance:none;background:0 0;border:0;border-radius:100px;height:5px;left:0;margin-top:-2.5px;padding:0;position:absolute;top:50%}.plyr__progress__buffer::-webkit-progress-bar{background:0 0}.plyr__progress__buffer::-webkit-progress-value{background:currentColor;border-radius:100px;min-width:5px;transition:width .2s ease}.plyr__progress__buffer::-moz-progress-bar{background:currentColor;border-radius:100px;min-width:5px;transition:width .2s ease}.plyr__progress__buffer::-ms-fill{border-radius:100px;transition:width .2s ease}.plyr--video .plyr__progress__buffer{box-shadow:0 1px 1px rgba(0,0,0,.15);color:rgba(255,255,255,.25)}.plyr--audio .plyr__progress__buffer{color:rgba(193,201,209,.66)}.plyr--loading .plyr__progress__buffer{animation:plyr-progress 1s linear infinite;background-image:linear-gradient(-45deg,rgba(35,41,47,.6) 25%,transparent 25%,transparent 50%,rgba(35,41,47,.6) 50%,rgba(35,41,47,.6) 75%,transparent 75%,transparent);background-repeat:repeat-x;background-size:25px 25px;color:transparent}.plyr--video.plyr--loading .plyr__progress__buffer{background-color:rgba(255,255,255,.25)}.plyr--audio.plyr--loading .plyr__progress__buffer{background-color:rgba(193,201,209,.66)}.plyr__volume{align-items:center;display:flex;flex:1;position:relative}.plyr__volume input[type=range]{margin-left:5px;position:relative;z-index:2}@media (min-width:480px){.plyr__volume{max-width:90px}}@media (min-width:768px){.plyr__volume{max-width:110px}}.plyr--is-ios .plyr__volume{display:none!important}.plyr--is-ios.plyr--vimeo [data-plyr=mute]{display:none!important}.plyr:-webkit-full-screen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-ms-fullscreen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:fullscreen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-webkit-full-screen video{height:100%}.plyr:-ms-fullscreen video{height:100%}.plyr:fullscreen video{height:100%}.plyr:-webkit-full-screen .plyr__video-wrapper{height:100%;position:static}.plyr:-ms-fullscreen .plyr__video-wrapper{height:100%;position:static}.plyr:fullscreen .plyr__video-wrapper{height:100%;position:static}.plyr:-webkit-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;position:relative;top:50%;transform:translateY(-50%)}.plyr:-ms-fullscreen.plyr--vimeo .plyr__video-wrapper{height:0;position:relative;top:50%;transform:translateY(-50%)}.plyr:fullscreen.plyr--vimeo .plyr__video-wrapper{height:0;position:relative;top:50%;transform:translateY(-50%)}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-ms-fullscreen .plyr__control .icon--exit-fullscreen{display:block}.plyr:fullscreen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-ms-fullscreen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:fullscreen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-webkit-full-screen.plyr--hide-controls{cursor:none}.plyr:-ms-fullscreen.plyr--hide-controls{cursor:none}.plyr:fullscreen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:-webkit-full-screen .plyr__captions{font-size:21px}.plyr:-ms-fullscreen .plyr__captions{font-size:21px}.plyr:fullscreen .plyr__captions{font-size:21px}}.plyr:-webkit-full-screen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-webkit-full-screen video{height:100%}.plyr:-webkit-full-screen .plyr__video-wrapper{height:100%;position:static}.plyr:-webkit-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;position:relative;top:50%;transform:translateY(-50%)}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-webkit-full-screen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:-webkit-full-screen .plyr__captions{font-size:21px}}.plyr:-moz-full-screen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-moz-full-screen video{height:100%}.plyr:-moz-full-screen .plyr__video-wrapper{height:100%;position:static}.plyr:-moz-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;position:relative;top:50%;transform:translateY(-50%)}.plyr:-moz-full-screen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-moz-full-screen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-moz-full-screen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:-moz-full-screen .plyr__captions{font-size:21px}}.plyr:-ms-fullscreen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-ms-fullscreen video{height:100%}.plyr:-ms-fullscreen .plyr__video-wrapper{height:100%;position:static}.plyr:-ms-fullscreen.plyr--vimeo .plyr__video-wrapper{height:0;position:relative;top:50%;transform:translateY(-50%)}.plyr:-ms-fullscreen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-ms-fullscreen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-ms-fullscreen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:-ms-fullscreen .plyr__captions{font-size:21px}}.plyr--fullscreen-fallback{background:#000;border-radius:0!important;height:100%;margin:0;width:100%;bottom:0;left:0;position:fixed;right:0;top:0;z-index:10000000}.plyr--fullscreen-fallback video{height:100%}.plyr--fullscreen-fallback .plyr__video-wrapper{height:100%;position:static}.plyr--fullscreen-fallback.plyr--vimeo .plyr__video-wrapper{height:0;position:relative;top:50%;transform:translateY(-50%)}.plyr--fullscreen-fallback .plyr__control .icon--exit-fullscreen{display:block}.plyr--fullscreen-fallback .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr--fullscreen-fallback.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr--fullscreen-fallback .plyr__captions{font-size:21px}}.plyr__ads{border-radius:inherit;bottom:0;cursor:pointer;left:0;overflow:hidden;position:absolute;right:0;top:0;z-index:-1}.plyr__ads>div,.plyr__ads>div iframe{height:100%;position:absolute;width:100%}.plyr__ads::after{background:rgba(35,41,47,.8);border-radius:2px;bottom:10px;color:#fff;content:attr(data-badge-text);font-size:11px;padding:2px 6px;pointer-events:none;position:absolute;right:10px;z-index:3}.plyr__ads::after:empty{display:none}.plyr__cues{background:currentColor;display:block;height:5px;left:0;margin:-2.5px 0 0;opacity:.8;position:absolute;top:50%;width:3px;z-index:3}.plyr__preview-thumb{background-color:rgba(255,255,255,.9);border-radius:3px;bottom:100%;box-shadow:0 1px 2px rgba(0,0,0,.15);margin-bottom:10px;opacity:0;padding:3px;pointer-events:none;position:absolute;transform:translate(0,10px) scale(.8);transform-origin:50% 100%;transition:transform .2s .1s ease,opacity .2s .1s ease;z-index:2}.plyr__preview-thumb--is-shown{opacity:1;transform:translate(0,0) scale(1)}.plyr__preview-thumb::before{border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid rgba(255,255,255,.9);bottom:-4px;content:'';height:0;left:50%;position:absolute;transform:translateX(-50%);width:0;z-index:2}.plyr__preview-thumb__image-container{background:#c1c9d1;border-radius:2px;overflow:hidden;position:relative;z-index:0}.plyr__preview-thumb__image-container img{height:100%;left:0;max-height:none;max-width:none;position:absolute;top:0;width:100%}.plyr__preview-thumb__time-container{bottom:6px;left:0;position:absolute;right:0;white-space:nowrap;z-index:3}.plyr__preview-thumb__time-container span{background-color:rgba(0,0,0,.55);border-radius:2px;color:#fff;font-size:14px;padding:3px 6px}.plyr__preview-scrubbing{bottom:0;filter:blur(1px);height:100%;left:0;margin:auto;opacity:0;overflow:hidden;position:absolute;right:0;top:0;transition:opacity .3s ease;width:100%;z-index:1}.plyr__preview-scrubbing--is-shown{opacity:1}.plyr__preview-scrubbing img{height:100%;left:0;max-height:none;max-width:none;object-fit:contain;position:absolute;top:0;width:100%}.plyr--no-transition{transition:none!important}.plyr__sr-only{clip:rect(1px,1px,1px,1px);overflow:hidden;border:0!important;height:1px!important;padding:0!important;position:absolute!important;width:1px!important}.plyr [hidden]{display:none!important}
40
+ .tooltipster-fall,.tooltipster-grow.tooltipster-show{-webkit-transition-timing-function:cubic-bezier(.175,.885,.32,1);-moz-transition-timing-function:cubic-bezier(.175,.885,.32,1.15);-ms-transition-timing-function:cubic-bezier(.175,.885,.32,1.15);-o-transition-timing-function:cubic-bezier(.175,.885,.32,1.15)}.tooltipster-base{display:flex;pointer-events:none;position:absolute}.tooltipster-box{flex:1 1 auto}.tooltipster-content{box-sizing:border-box;max-height:100%;max-width:100%;overflow:auto}.tooltipster-ruler{bottom:0;left:0;overflow:hidden;position:fixed;right:0;top:0;visibility:hidden}.tooltipster-fade{opacity:0;-webkit-transition-property:opacity;-moz-transition-property:opacity;-o-transition-property:opacity;-ms-transition-property:opacity;transition-property:opacity}.tooltipster-fade.tooltipster-show{opacity:1}.tooltipster-grow{-webkit-transform:scale(0,0);-moz-transform:scale(0,0);-o-transform:scale(0,0);-ms-transform:scale(0,0);transform:scale(0,0);-webkit-transition-property:-webkit-transform;-moz-transition-property:-moz-transform;-o-transition-property:-o-transform;-ms-transition-property:-ms-transform;transition-property:transform;-webkit-backface-visibility:hidden}.tooltipster-grow.tooltipster-show{-webkit-transform:scale(1,1);-moz-transform:scale(1,1);-o-transform:scale(1,1);-ms-transform:scale(1,1);transform:scale(1,1);-webkit-transition-timing-function:cubic-bezier(.175,.885,.32,1.15);transition-timing-function:cubic-bezier(.175,.885,.32,1.15)}.tooltipster-swing{opacity:0;-webkit-transform:rotateZ(4deg);-moz-transform:rotateZ(4deg);-o-transform:rotateZ(4deg);-ms-transform:rotateZ(4deg);transform:rotateZ(4deg);-webkit-transition-property:-webkit-transform,opacity;-moz-transition-property:-moz-transform;-o-transition-property:-o-transform;-ms-transition-property:-ms-transform;transition-property:transform}.tooltipster-swing.tooltipster-show{opacity:1;-webkit-transform:rotateZ(0);-moz-transform:rotateZ(0);-o-transform:rotateZ(0);-ms-transform:rotateZ(0);transform:rotateZ(0);-webkit-transition-timing-function:cubic-bezier(.23,.635,.495,1);-webkit-transition-timing-function:cubic-bezier(.23,.635,.495,2.4);-moz-transition-timing-function:cubic-bezier(.23,.635,.495,2.4);-ms-transition-timing-function:cubic-bezier(.23,.635,.495,2.4);-o-transition-timing-function:cubic-bezier(.23,.635,.495,2.4);transition-timing-function:cubic-bezier(.23,.635,.495,2.4)}.tooltipster-fall{-webkit-transition-property:top;-moz-transition-property:top;-o-transition-property:top;-ms-transition-property:top;transition-property:top;-webkit-transition-timing-function:cubic-bezier(.175,.885,.32,1.15);transition-timing-function:cubic-bezier(.175,.885,.32,1.15)}.tooltipster-fall.tooltipster-initial{top:0!important}.tooltipster-fall.tooltipster-dying{-webkit-transition-property:all;-moz-transition-property:all;-o-transition-property:all;-ms-transition-property:all;transition-property:all;top:0!important;opacity:0}.tooltipster-slide{-webkit-transition-property:left;-moz-transition-property:left;-o-transition-property:left;-ms-transition-property:left;transition-property:left;-webkit-transition-timing-function:cubic-bezier(.175,.885,.32,1);-webkit-transition-timing-function:cubic-bezier(.175,.885,.32,1.15);-moz-transition-timing-function:cubic-bezier(.175,.885,.32,1.15);-ms-transition-timing-function:cubic-bezier(.175,.885,.32,1.15);-o-transition-timing-function:cubic-bezier(.175,.885,.32,1.15);transition-timing-function:cubic-bezier(.175,.885,.32,1.15)}.tooltipster-slide.tooltipster-initial{left:-40px!important}.tooltipster-slide.tooltipster-dying{-webkit-transition-property:all;-moz-transition-property:all;-o-transition-property:all;-ms-transition-property:all;transition-property:all;left:0!important;opacity:0}@keyframes tooltipster-fading{0%{opacity:0}100%{opacity:1}}.tooltipster-update-fade{animation:tooltipster-fading .4s}@keyframes tooltipster-rotating{25%{transform:rotate(-2deg)}75%{transform:rotate(2deg)}100%{transform:rotate(0)}}.tooltipster-update-rotate{animation:tooltipster-rotating .6s}@keyframes tooltipster-scaling{50%{transform:scale(1.1)}100%{transform:scale(1)}}.tooltipster-update-scale{animation:tooltipster-scaling .6s}.tooltipster-sidetip .tooltipster-box{background:#565656;border:2px solid #000;border-radius:4px}.tooltipster-sidetip.tooltipster-bottom .tooltipster-box{margin-top:8px}.tooltipster-sidetip.tooltipster-left .tooltipster-box{margin-right:8px}.tooltipster-sidetip.tooltipster-right .tooltipster-box{margin-left:8px}.tooltipster-sidetip.tooltipster-top .tooltipster-box{margin-bottom:8px}.tooltipster-sidetip .tooltipster-content{color:#fff;line-height:18px;padding:6px 14px}.tooltipster-sidetip .tooltipster-arrow{overflow:hidden;position:absolute}.tooltipster-sidetip.tooltipster-bottom .tooltipster-arrow{height:10px;margin-left:-10px;top:0;width:20px}.tooltipster-sidetip.tooltipster-left .tooltipster-arrow{height:20px;margin-top:-10px;right:0;top:0;width:10px}.tooltipster-sidetip.tooltipster-right .tooltipster-arrow{height:20px;margin-top:-10px;left:0;top:0;width:10px}.tooltipster-sidetip.tooltipster-top .tooltipster-arrow{bottom:0;height:10px;margin-left:-10px;width:20px}.tooltipster-sidetip .tooltipster-arrow-background,.tooltipster-sidetip .tooltipster-arrow-border{height:0;position:absolute;width:0}.tooltipster-sidetip .tooltipster-arrow-background{border:10px solid transparent}.tooltipster-sidetip.tooltipster-bottom .tooltipster-arrow-background{border-bottom-color:#565656;left:0;top:3px}.tooltipster-sidetip.tooltipster-left .tooltipster-arrow-background{border-left-color:#565656;left:-3px;top:0}.tooltipster-sidetip.tooltipster-right .tooltipster-arrow-background{border-right-color:#565656;left:3px;top:0}.tooltipster-sidetip.tooltipster-top .tooltipster-arrow-background{border-top-color:#565656;left:0;top:-3px}.tooltipster-sidetip .tooltipster-arrow-border{border:10px solid transparent;left:0;top:0}.tooltipster-sidetip.tooltipster-bottom .tooltipster-arrow-border{border-bottom-color:#000}.tooltipster-sidetip.tooltipster-left .tooltipster-arrow-border{border-left-color:#000}.tooltipster-sidetip.tooltipster-right .tooltipster-arrow-border{border-right-color:#000}.tooltipster-sidetip.tooltipster-top .tooltipster-arrow-border{border-top-color:#000}.tooltipster-sidetip .tooltipster-arrow-uncropped{position:relative}.tooltipster-sidetip.tooltipster-bottom .tooltipster-arrow-uncropped{top:-10px}.tooltipster-sidetip.tooltipster-right .tooltipster-arrow-uncropped{left:-10px}
assets/front-end/css/product-grid/index.css CHANGED
@@ -19,83 +19,9 @@
19
  margin: 0;
20
  padding: 0;
21
  }
22
- .eael-product-grid .woocommerce ul.products.eael-product-columns-1,
23
- .eael-post-grid .woocommerce ul.products.eael-product-columns-1 {
24
- grid-template-columns: 100%;
25
- }
26
- .eael-product-grid .woocommerce ul.products.eael-product-columns-2,
27
- .eael-post-grid .woocommerce ul.products.eael-product-columns-2 {
28
- grid-template-columns: repeat(2, 1fr);
29
- }
30
- @media screen and (max-width: 480px) {
31
- .eael-product-grid .woocommerce ul.products.eael-product-columns-2,
32
- .eael-post-grid .woocommerce ul.products.eael-product-columns-2 {
33
- grid-template-columns: repeat(1, 1fr);
34
- }
35
- }
36
- .eael-product-grid .woocommerce ul.products.eael-product-columns-3,
37
- .eael-post-grid .woocommerce ul.products.eael-product-columns-3 {
38
- grid-template-columns: repeat(3, 1fr);
39
- }
40
- @media screen and (max-width: 767px) {
41
- .eael-product-grid .woocommerce ul.products.eael-product-columns-3,
42
- .eael-post-grid .woocommerce ul.products.eael-product-columns-3 {
43
- grid-template-columns: repeat(2, 1fr);
44
- }
45
- }
46
- @media screen and (max-width: 480px) {
47
- .eael-product-grid .woocommerce ul.products.eael-product-columns-3,
48
- .eael-post-grid .woocommerce ul.products.eael-product-columns-3 {
49
- grid-template-columns: repeat(1, 1fr);
50
- }
51
- }
52
- .eael-product-grid .woocommerce ul.products.eael-product-columns-4,
53
- .eael-post-grid .woocommerce ul.products.eael-product-columns-4 {
54
- grid-template-columns: repeat(4, 1fr);
55
- }
56
- @media screen and (max-width: 767px) {
57
- .eael-product-grid .woocommerce ul.products.eael-product-columns-4,
58
- .eael-post-grid .woocommerce ul.products.eael-product-columns-4 {
59
- grid-template-columns: repeat(2, 1fr);
60
- }
61
- }
62
- @media screen and (max-width: 480px) {
63
- .eael-product-grid .woocommerce ul.products.eael-product-columns-4,
64
- .eael-post-grid .woocommerce ul.products.eael-product-columns-4 {
65
- grid-template-columns: repeat(1, 1fr);
66
- }
67
- }
68
- .eael-product-grid .woocommerce ul.products.eael-product-columns-5,
69
- .eael-post-grid .woocommerce ul.products.eael-product-columns-5 {
70
- grid-template-columns: repeat(5, 1fr);
71
- }
72
- @media screen and (max-width: 767px) {
73
- .eael-product-grid .woocommerce ul.products.eael-product-columns-5,
74
- .eael-post-grid .woocommerce ul.products.eael-product-columns-5 {
75
- grid-template-columns: repeat(2, 1fr);
76
- }
77
- }
78
- @media screen and (max-width: 480px) {
79
- .eael-product-grid .woocommerce ul.products.eael-product-columns-5,
80
- .eael-post-grid .woocommerce ul.products.eael-product-columns-5 {
81
- grid-template-columns: repeat(1, 1fr);
82
- }
83
- }
84
- .eael-product-grid .woocommerce ul.products.eael-product-columns-6,
85
- .eael-post-grid .woocommerce ul.products.eael-product-columns-6 {
86
- grid-template-columns: repeat(6, 1fr);
87
- }
88
- @media screen and (max-width: 767px) {
89
- .eael-product-grid .woocommerce ul.products.eael-product-columns-6,
90
- .eael-post-grid .woocommerce ul.products.eael-product-columns-6 {
91
- grid-template-columns: repeat(2, 1fr);
92
- }
93
- }
94
- @media screen and (max-width: 480px) {
95
- .eael-product-grid .woocommerce ul.products.eael-product-columns-6,
96
- .eael-post-grid .woocommerce ul.products.eael-product-columns-6 {
97
- grid-template-columns: repeat(1, 1fr);
98
- }
99
  }
100
  .eael-product-grid.eael-product-simple .woocommerce ul.products li.product, .eael-product-grid.eael-product-reveal .woocommerce ul.products li.product,
101
  .eael-post-grid.eael-product-simple .woocommerce ul.products li.product,
@@ -443,3 +369,79 @@
443
  opacity: 1;
444
  transform: translateY(0);
445
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
19
  margin: 0;
20
  padding: 0;
21
  }
22
+ .eael-product-grid .woocommerce ul.products.products[class*=columns-] li.product,
23
+ .eael-post-grid .woocommerce ul.products.products[class*=columns-] li.product {
24
+ width: 100%;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
25
  }
26
  .eael-product-grid.eael-product-simple .woocommerce ul.products li.product, .eael-product-grid.eael-product-reveal .woocommerce ul.products li.product,
27
  .eael-post-grid.eael-product-simple .woocommerce ul.products li.product,
369
  opacity: 1;
370
  transform: translateY(0);
371
  }
372
+
373
+ @media only screen and (min-width: 1025px) {
374
+ .eael-product-grid-column-1 .eael-product-grid .woocommerce ul.products {
375
+ grid-template-columns: 100%;
376
+ }
377
+
378
+ .eael-product-grid-column-2 .eael-product-grid .woocommerce ul.products {
379
+ grid-template-columns: repeat(2, 1fr);
380
+ }
381
+
382
+ .eael-product-grid-column-3 .eael-product-grid .woocommerce ul.products {
383
+ grid-template-columns: repeat(3, 1fr);
384
+ }
385
+
386
+ .eael-product-grid-column-4 .eael-product-grid .woocommerce ul.products {
387
+ grid-template-columns: repeat(4, 1fr);
388
+ }
389
+
390
+ .eael-product-grid-column-5 .eael-product-grid .woocommerce ul.products {
391
+ grid-template-columns: repeat(5, 1fr);
392
+ }
393
+
394
+ .eael-product-grid-column-6 .eael-product-grid .woocommerce ul.products {
395
+ grid-template-columns: repeat(6, 1fr);
396
+ }
397
+ }
398
+ @media only screen and (max-width: 1024px) and (min-width: 766px) {
399
+ .eael-product-grid-column-tablet-1 .eael-product-grid .woocommerce ul.products {
400
+ grid-template-columns: 100%;
401
+ }
402
+
403
+ .eael-product-grid-column-tablet-2 .eael-product-grid .woocommerce ul.products {
404
+ grid-template-columns: repeat(2, 1fr);
405
+ }
406
+
407
+ .eael-product-grid-column-tablet-3 .eael-product-grid .woocommerce ul.products {
408
+ grid-template-columns: repeat(3, 1fr);
409
+ }
410
+
411
+ .eael-product-grid-column-tablet-4 .eael-product-grid .woocommerce ul.products {
412
+ grid-template-columns: repeat(4, 1fr);
413
+ }
414
+
415
+ .eael-product-grid-column-tablet-5 .eael-product-grid .woocommerce ul.products {
416
+ grid-template-columns: repeat(5, 1fr);
417
+ }
418
+
419
+ .eael-product-grid-column-tablet-6 .eael-product-grid .woocommerce ul.products {
420
+ grid-template-columns: repeat(6, 1fr);
421
+ }
422
+ }
423
+ @media only screen and (max-width: 767px) {
424
+ .eael-product-grid-column-mobile-1 .eael-product-grid .woocommerce ul.products {
425
+ grid-template-columns: 100%;
426
+ }
427
+
428
+ .eael-product-grid-column-mobile-2 .eael-product-grid .woocommerce ul.products {
429
+ grid-template-columns: repeat(2, 1fr);
430
+ }
431
+
432
+ .eael-product-grid-column-mobile-3 .eael-product-grid .woocommerce ul.products {
433
+ grid-template-columns: repeat(3, 1fr);
434
+ }
435
+
436
+ .eael-product-grid-column-mobile-4 .eael-product-grid .woocommerce ul.products {
437
+ grid-template-columns: repeat(4, 1fr);
438
+ }
439
+
440
+ .eael-product-grid-column-mobile-5 .eael-product-grid .woocommerce ul.products {
441
+ grid-template-columns: repeat(5, 1fr);
442
+ }
443
+
444
+ .eael-product-grid-column-mobile-6 .eael-product-grid .woocommerce ul.products {
445
+ grid-template-columns: repeat(6, 1fr);
446
+ }
447
+ }
assets/front-end/css/product-grid/index.min.css CHANGED
@@ -1 +1 @@
1
- .eael-post-grid .woocommerce ul.products,.eael-product-grid .woocommerce ul.products{display:grid;grid-gap:25px;margin:0!important;padding:0!important}.eael-post-grid .woocommerce ul.products:after,.eael-post-grid .woocommerce ul.products:before,.eael-product-grid .woocommerce ul.products:after,.eael-product-grid .woocommerce ul.products:before{display:none}.eael-post-grid .woocommerce ul.products .product,.eael-product-grid .woocommerce ul.products .product{width:100%;margin:0;padding:0}.eael-post-grid .woocommerce ul.products.eael-product-columns-1,.eael-product-grid .woocommerce ul.products.eael-product-columns-1{grid-template-columns:100%}.eael-post-grid .woocommerce ul.products.eael-product-columns-2,.eael-product-grid .woocommerce ul.products.eael-product-columns-2{grid-template-columns:repeat(2,1fr)}@media screen and (max-width:480px){.eael-post-grid .woocommerce ul.products.eael-product-columns-2,.eael-product-grid .woocommerce ul.products.eael-product-columns-2{grid-template-columns:repeat(1,1fr)}}.eael-post-grid .woocommerce ul.products.eael-product-columns-3,.eael-product-grid .woocommerce ul.products.eael-product-columns-3{grid-template-columns:repeat(3,1fr)}@media screen and (max-width:767px){.eael-post-grid .woocommerce ul.products.eael-product-columns-3,.eael-product-grid .woocommerce ul.products.eael-product-columns-3{grid-template-columns:repeat(2,1fr)}}@media screen and (max-width:480px){.eael-post-grid .woocommerce ul.products.eael-product-columns-3,.eael-product-grid .woocommerce ul.products.eael-product-columns-3{grid-template-columns:repeat(1,1fr)}}.eael-post-grid .woocommerce ul.products.eael-product-columns-4,.eael-product-grid .woocommerce ul.products.eael-product-columns-4{grid-template-columns:repeat(4,1fr)}@media screen and (max-width:767px){.eael-post-grid .woocommerce ul.products.eael-product-columns-4,.eael-product-grid .woocommerce ul.products.eael-product-columns-4{grid-template-columns:repeat(2,1fr)}}@media screen and (max-width:480px){.eael-post-grid .woocommerce ul.products.eael-product-columns-4,.eael-product-grid .woocommerce ul.products.eael-product-columns-4{grid-template-columns:repeat(1,1fr)}}.eael-post-grid .woocommerce ul.products.eael-product-columns-5,.eael-product-grid .woocommerce ul.products.eael-product-columns-5{grid-template-columns:repeat(5,1fr)}@media screen and (max-width:767px){.eael-post-grid .woocommerce ul.products.eael-product-columns-5,.eael-product-grid .woocommerce ul.products.eael-product-columns-5{grid-template-columns:repeat(2,1fr)}}@media screen and (max-width:480px){.eael-post-grid .woocommerce ul.products.eael-product-columns-5,.eael-product-grid .woocommerce ul.products.eael-product-columns-5{grid-template-columns:repeat(1,1fr)}}.eael-post-grid .woocommerce ul.products.eael-product-columns-6,.eael-product-grid .woocommerce ul.products.eael-product-columns-6{grid-template-columns:repeat(6,1fr)}@media screen and (max-width:767px){.eael-post-grid .woocommerce ul.products.eael-product-columns-6,.eael-product-grid .woocommerce ul.products.eael-product-columns-6{grid-template-columns:repeat(2,1fr)}}@media screen and (max-width:480px){.eael-post-grid .woocommerce ul.products.eael-product-columns-6,.eael-product-grid .woocommerce ul.products.eael-product-columns-6{grid-template-columns:repeat(1,1fr)}}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product,.eael-post-grid.eael-product-simple .woocommerce ul.products li.product,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product,.eael-product-grid.eael-product-simple .woocommerce ul.products li.product{position:relative;float:left;overflow:hidden;text-align:center;padding:0;border-radius:0;background-color:#fff;box-shadow:none}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product a,.eael-post-grid.eael-product-simple .woocommerce ul.products li.product a,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product a,.eael-product-grid.eael-product-simple .woocommerce ul.products li.product a{text-decoration:none}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product a:hover,.eael-post-grid.eael-product-simple .woocommerce ul.products li.product a:hover,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product a:hover,.eael-product-grid.eael-product-simple .woocommerce ul.products li.product a:hover{outline:0;box-shadow:none}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product img,.eael-post-grid.eael-product-simple .woocommerce ul.products li.product img,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product img,.eael-product-grid.eael-product-simple .woocommerce ul.products li.product img{width:100%;height:auto;-webkit-backface-visibility:hidden;backface-visibility:hidden}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product .woocommerce-loop-product__title,.eael-post-grid.eael-product-simple .woocommerce ul.products li.product .woocommerce-loop-product__title,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product .woocommerce-loop-product__title,.eael-product-grid.eael-product-simple .woocommerce ul.products li.product .woocommerce-loop-product__title{font-size:16px;font-weight:700;line-height:1;color:#333;margin:25px 0 12px;padding:0}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product .onsale,.eael-post-grid.eael-product-simple .woocommerce ul.products li.product .onsale,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product .onsale,.eael-product-grid.eael-product-simple .woocommerce ul.products li.product .onsale{display:block;line-height:170px;font-size:13px;text-align:center;letter-spacing:0;text-shadow:0 1px 1px rgba(0,0,0,.6);text-transform:uppercase;color:#fff;background-color:#ff2a13;border-radius:0;border:none;box-shadow:none;position:absolute;height:100px;width:200px;z-index:1;left:-100px;top:-50px;right:auto;margin:0;padding:0;transform:rotate(-45deg)}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product .price,.eael-post-grid.eael-product-simple .woocommerce ul.products li.product .price,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product .price,.eael-product-grid.eael-product-simple .woocommerce ul.products li.product .price{font-size:14px;margin-bottom:0}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product .price del,.eael-post-grid.eael-product-simple .woocommerce ul.products li.product .price del,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product .price del,.eael-product-grid.eael-product-simple .woocommerce ul.products li.product .price del{opacity:.5;display:inline-block}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product .price ins,.eael-post-grid.eael-product-simple .woocommerce ul.products li.product .price ins,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product .price ins,.eael-product-grid.eael-product-simple .woocommerce ul.products li.product .price ins{font-weight:400;background-color:transparent;color:#ff2a13}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product .star-rating,.eael-post-grid.eael-product-simple .woocommerce ul.products li.product .star-rating,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product .star-rating,.eael-product-grid.eael-product-simple .woocommerce ul.products li.product .star-rating{display:block;float:none;font-size:14px;margin:10px auto}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product .button.add_to_cart_button,.eael-post-grid.eael-product-simple .woocommerce ul.products li.product .button.add_to_cart_button,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product .button.add_to_cart_button,.eael-product-grid.eael-product-simple .woocommerce ul.products li.product .button.add_to_cart_button{display:block;font-size:14px;font-weight:400;line-height:38px;text-align:center;text-transform:uppercase;color:#fff;background-color:#333;padding:0;margin:15px;border-radius:0}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product .button.add_to_cart_button:focus,.eael-post-grid.eael-product-simple .woocommerce ul.products li.product .button.add_to_cart_button:focus,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product .button.add_to_cart_button:focus,.eael-product-grid.eael-product-simple .woocommerce ul.products li.product .button.add_to_cart_button:focus{outline:0}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product a.added_to_cart,.eael-post-grid.eael-product-simple .woocommerce ul.products li.product a.added_to_cart,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product a.added_to_cart,.eael-product-grid.eael-product-simple .woocommerce ul.products li.product a.added_to_cart{display:block;margin:0 0 15px 0;padding:0;font-size:14px;line-height:1;text-transform:capitalize;color:#333;background-color:transparent}.eael-post-grid.eael-product-simple .woocommerce ul.products li.product,.eael-product-grid.eael-product-simple .woocommerce ul.products li.product{border:1px solid #eee}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product{border:1px solid transparent}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product .button.add_to_cart_button,.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product a.added_to_cart,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product .button.add_to_cart_button,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product a.added_to_cart{visibility:hidden;transition:none}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product:hover,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product:hover{border:1px solid #eee}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product:hover .button.add_to_cart_button,.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product:hover a.added_to_cart,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product:hover .button.add_to_cart_button,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product:hover a.added_to_cart{visibility:visible}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product{position:relative;float:left;overflow:hidden;text-align:center;padding:0 0 15px 0;border-radius:0;background-color:#fff;box-shadow:none}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product a,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product a{text-decoration:none}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product a:hover,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product a:hover{outline:0;box-shadow:none}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product img,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product img{width:100%;height:auto;margin:0;-webkit-backface-visibility:hidden;backface-visibility:hidden}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay{position:relative;overflow:hidden;line-height:0}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .button-wrap,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .button-wrap{position:absolute;top:50%;left:0;right:0;text-align:center;transform:translateY(-50%)}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .add_to_cart_button,.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .added_to_cart,.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .product-link,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .add_to_cart_button,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .added_to_cart,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .product-link{display:inline-block;font-size:14px;line-height:38px;text-align:center;color:#fff;background-color:#333;width:38px;height:38px;border-style:none;border-radius:50%;vertical-align:middle;padding:0;margin:0 5px;transform:translateY(20px);opacity:0;transition:transform .2s,opacity .3s}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .add_to_cart_button:focus,.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .added_to_cart:focus,.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .product-link:focus,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .add_to_cart_button:focus,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .added_to_cart:focus,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .product-link:focus{outline:0}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .add_to_cart_button,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .add_to_cart_button{font-size:0}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .add_to_cart_button:before,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .add_to_cart_button:before{display:none}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .add_to_cart_button:after,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .add_to_cart_button:after{content:"\f217";font:normal normal normal 14px/1 FontAwesome;font-size:14px;line-height:38px;text-rendering:auto;-webkit-font-smoothing:antialiased;vertical-align:middle;margin:0;padding:0}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .add_to_cart_button.loading:before,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .add_to_cart_button.loading:before{display:none}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .add_to_cart_button.loading:after,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .add_to_cart_button.loading:after{content:"\f110";display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:14px;line-height:38px;color:#fff;height:auto;width:auto;position:relative;top:0;left:0;margin:0;padding:0}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .added_to_cart,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .added_to_cart{font-size:0}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .added_to_cart:after,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .added_to_cart:after{content:"\f06e";font:normal normal normal 14px/1 FontAwesome;font-size:14px;line-height:38px;color:#fff;text-rendering:auto;-webkit-font-smoothing:antialiased;vertical-align:middle;margin:0;padding:0}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .woocommerce-loop-product__title,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .woocommerce-loop-product__title{font-size:16px;font-weight:700;line-height:1;color:#333;margin:25px 0 12px;padding:0}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .onsale,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .onsale{display:block;line-height:170px;font-size:13px;text-align:center;letter-spacing:0;text-shadow:0 1px 1px rgba(0,0,0,.6);text-transform:uppercase;color:#fff;background-color:#ff2a13;border-radius:0;border:none;box-shadow:none;position:absolute;height:100px;width:200px;z-index:1;left:-100px;top:-50px;right:auto;margin:0;padding:0;transform:rotate(-45deg)}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .price,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .price{font-size:14px;margin-bottom:0}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .price del,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .price del{opacity:.5;display:inline-block}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .price ins,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .price ins{font-weight:400;background-color:transparent;color:#ff2a13}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .star-rating,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .star-rating{display:block;float:none;font-size:14px;margin:10px auto}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product:hover .overlay .add_to_cart_button,.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product:hover .overlay a,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product:hover .overlay .add_to_cart_button,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product:hover .overlay a{opacity:1;transform:translateY(0)}
1
+ .eael-post-grid .woocommerce ul.products,.eael-product-grid .woocommerce ul.products{display:grid;grid-gap:25px;margin:0!important;padding:0!important}.eael-post-grid .woocommerce ul.products:after,.eael-post-grid .woocommerce ul.products:before,.eael-product-grid .woocommerce ul.products:after,.eael-product-grid .woocommerce ul.products:before{display:none}.eael-post-grid .woocommerce ul.products .product,.eael-product-grid .woocommerce ul.products .product{width:100%;margin:0;padding:0}.eael-post-grid .woocommerce ul.products.products[class*=columns-] li.product,.eael-product-grid .woocommerce ul.products.products[class*=columns-] li.product{width:100%}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product,.eael-post-grid.eael-product-simple .woocommerce ul.products li.product,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product,.eael-product-grid.eael-product-simple .woocommerce ul.products li.product{position:relative;float:left;overflow:hidden;text-align:center;padding:0;border-radius:0;background-color:#fff;box-shadow:none}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product a,.eael-post-grid.eael-product-simple .woocommerce ul.products li.product a,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product a,.eael-product-grid.eael-product-simple .woocommerce ul.products li.product a{text-decoration:none}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product a:hover,.eael-post-grid.eael-product-simple .woocommerce ul.products li.product a:hover,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product a:hover,.eael-product-grid.eael-product-simple .woocommerce ul.products li.product a:hover{outline:0;box-shadow:none}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product img,.eael-post-grid.eael-product-simple .woocommerce ul.products li.product img,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product img,.eael-product-grid.eael-product-simple .woocommerce ul.products li.product img{width:100%;height:auto;-webkit-backface-visibility:hidden;backface-visibility:hidden}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product .woocommerce-loop-product__title,.eael-post-grid.eael-product-simple .woocommerce ul.products li.product .woocommerce-loop-product__title,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product .woocommerce-loop-product__title,.eael-product-grid.eael-product-simple .woocommerce ul.products li.product .woocommerce-loop-product__title{font-size:16px;font-weight:700;line-height:1;color:#333;margin:25px 0 12px;padding:0}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product .onsale,.eael-post-grid.eael-product-simple .woocommerce ul.products li.product .onsale,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product .onsale,.eael-product-grid.eael-product-simple .woocommerce ul.products li.product .onsale{display:block;line-height:170px;font-size:13px;text-align:center;letter-spacing:0;text-shadow:0 1px 1px rgba(0,0,0,.6);text-transform:uppercase;color:#fff;background-color:#ff2a13;border-radius:0;border:none;box-shadow:none;position:absolute;height:100px;width:200px;z-index:1;left:-100px;top:-50px;right:auto;margin:0;padding:0;transform:rotate(-45deg)}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product .price,.eael-post-grid.eael-product-simple .woocommerce ul.products li.product .price,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product .price,.eael-product-grid.eael-product-simple .woocommerce ul.products li.product .price{font-size:14px;margin-bottom:0}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product .price del,.eael-post-grid.eael-product-simple .woocommerce ul.products li.product .price del,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product .price del,.eael-product-grid.eael-product-simple .woocommerce ul.products li.product .price del{opacity:.5;display:inline-block}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product .price ins,.eael-post-grid.eael-product-simple .woocommerce ul.products li.product .price ins,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product .price ins,.eael-product-grid.eael-product-simple .woocommerce ul.products li.product .price ins{font-weight:400;background-color:transparent;color:#ff2a13}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product .star-rating,.eael-post-grid.eael-product-simple .woocommerce ul.products li.product .star-rating,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product .star-rating,.eael-product-grid.eael-product-simple .woocommerce ul.products li.product .star-rating{display:block;float:none;font-size:14px;margin:10px auto}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product .button.add_to_cart_button,.eael-post-grid.eael-product-simple .woocommerce ul.products li.product .button.add_to_cart_button,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product .button.add_to_cart_button,.eael-product-grid.eael-product-simple .woocommerce ul.products li.product .button.add_to_cart_button{display:block;font-size:14px;font-weight:400;line-height:38px;text-align:center;text-transform:uppercase;color:#fff;background-color:#333;padding:0;margin:15px;border-radius:0}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product .button.add_to_cart_button:focus,.eael-post-grid.eael-product-simple .woocommerce ul.products li.product .button.add_to_cart_button:focus,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product .button.add_to_cart_button:focus,.eael-product-grid.eael-product-simple .woocommerce ul.products li.product .button.add_to_cart_button:focus{outline:0}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product a.added_to_cart,.eael-post-grid.eael-product-simple .woocommerce ul.products li.product a.added_to_cart,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product a.added_to_cart,.eael-product-grid.eael-product-simple .woocommerce ul.products li.product a.added_to_cart{display:block;margin:0 0 15px 0;padding:0;font-size:14px;line-height:1;text-transform:capitalize;color:#333;background-color:transparent}.eael-post-grid.eael-product-simple .woocommerce ul.products li.product,.eael-product-grid.eael-product-simple .woocommerce ul.products li.product{border:1px solid #eee}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product{border:1px solid transparent}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product .button.add_to_cart_button,.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product a.added_to_cart,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product .button.add_to_cart_button,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product a.added_to_cart{visibility:hidden;transition:none}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product:hover,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product:hover{border:1px solid #eee}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product:hover .button.add_to_cart_button,.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product:hover a.added_to_cart,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product:hover .button.add_to_cart_button,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product:hover a.added_to_cart{visibility:visible}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product{position:relative;float:left;overflow:hidden;text-align:center;padding:0 0 15px 0;border-radius:0;background-color:#fff;box-shadow:none}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product a,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product a{text-decoration:none}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product a:hover,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product a:hover{outline:0;box-shadow:none}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product img,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product img{width:100%;height:auto;margin:0;-webkit-backface-visibility:hidden;backface-visibility:hidden}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay{position:relative;overflow:hidden;line-height:0}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .button-wrap,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .button-wrap{position:absolute;top:50%;left:0;right:0;text-align:center;transform:translateY(-50%)}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .add_to_cart_button,.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .added_to_cart,.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .product-link,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .add_to_cart_button,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .added_to_cart,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .product-link{display:inline-block;font-size:14px;line-height:38px;text-align:center;color:#fff;background-color:#333;width:38px;height:38px;border-style:none;border-radius:50%;vertical-align:middle;padding:0;margin:0 5px;transform:translateY(20px);opacity:0;transition:transform .2s,opacity .3s}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .add_to_cart_button:focus,.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .added_to_cart:focus,.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .product-link:focus,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .add_to_cart_button:focus,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .added_to_cart:focus,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .product-link:focus{outline:0}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .add_to_cart_button,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .add_to_cart_button{font-size:0}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .add_to_cart_button:before,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .add_to_cart_button:before{display:none}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .add_to_cart_button:after,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .add_to_cart_button:after{content:"\f217";font:normal normal normal 14px/1 FontAwesome;font-size:14px;line-height:38px;text-rendering:auto;-webkit-font-smoothing:antialiased;vertical-align:middle;margin:0;padding:0}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .add_to_cart_button.loading:before,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .add_to_cart_button.loading:before{display:none}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .add_to_cart_button.loading:after,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .add_to_cart_button.loading:after{content:"\f110";display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:14px;line-height:38px;color:#fff;height:auto;width:auto;position:relative;top:0;left:0;margin:0;padding:0}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .added_to_cart,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .added_to_cart{font-size:0}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .added_to_cart:after,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .added_to_cart:after{content:"\f06e";font:normal normal normal 14px/1 FontAwesome;font-size:14px;line-height:38px;color:#fff;text-rendering:auto;-webkit-font-smoothing:antialiased;vertical-align:middle;margin:0;padding:0}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .woocommerce-loop-product__title,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .woocommerce-loop-product__title{font-size:16px;font-weight:700;line-height:1;color:#333;margin:25px 0 12px;padding:0}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .onsale,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .onsale{display:block;line-height:170px;font-size:13px;text-align:center;letter-spacing:0;text-shadow:0 1px 1px rgba(0,0,0,.6);text-transform:uppercase;color:#fff;background-color:#ff2a13;border-radius:0;border:none;box-shadow:none;position:absolute;height:100px;width:200px;z-index:1;left:-100px;top:-50px;right:auto;margin:0;padding:0;transform:rotate(-45deg)}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .price,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .price{font-size:14px;margin-bottom:0}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .price del,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .price del{opacity:.5;display:inline-block}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .price ins,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .price ins{font-weight:400;background-color:transparent;color:#ff2a13}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .star-rating,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .star-rating{display:block;float:none;font-size:14px;margin:10px auto}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product:hover .overlay .add_to_cart_button,.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product:hover .overlay a,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product:hover .overlay .add_to_cart_button,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product:hover .overlay a{opacity:1;transform:translateY(0)}@media only screen and (min-width:1025px){.eael-product-grid-column-1 .eael-product-grid .woocommerce ul.products{grid-template-columns:100%}.eael-product-grid-column-2 .eael-product-grid .woocommerce ul.products{grid-template-columns:repeat(2,1fr)}.eael-product-grid-column-3 .eael-product-grid .woocommerce ul.products{grid-template-columns:repeat(3,1fr)}.eael-product-grid-column-4 .eael-product-grid .woocommerce ul.products{grid-template-columns:repeat(4,1fr)}.eael-product-grid-column-5 .eael-product-grid .woocommerce ul.products{grid-template-columns:repeat(5,1fr)}.eael-product-grid-column-6 .eael-product-grid .woocommerce ul.products{grid-template-columns:repeat(6,1fr)}}@media only screen and (max-width:1024px) and (min-width:766px){.eael-product-grid-column-tablet-1 .eael-product-grid .woocommerce ul.products{grid-template-columns:100%}.eael-product-grid-column-tablet-2 .eael-product-grid .woocommerce ul.products{grid-template-columns:repeat(2,1fr)}.eael-product-grid-column-tablet-3 .eael-product-grid .woocommerce ul.products{grid-template-columns:repeat(3,1fr)}.eael-product-grid-column-tablet-4 .eael-product-grid .woocommerce ul.products{grid-template-columns:repeat(4,1fr)}.eael-product-grid-column-tablet-5 .eael-product-grid .woocommerce ul.products{grid-template-columns:repeat(5,1fr)}.eael-product-grid-column-tablet-6 .eael-product-grid .woocommerce ul.products{grid-template-columns:repeat(6,1fr)}}@media only screen and (max-width:767px){.eael-product-grid-column-mobile-1 .eael-product-grid .woocommerce ul.products{grid-template-columns:100%}.eael-product-grid-column-mobile-2 .eael-product-grid .woocommerce ul.products{grid-template-columns:repeat(2,1fr)}.eael-product-grid-column-mobile-3 .eael-product-grid .woocommerce ul.products{grid-template-columns:repeat(3,1fr)}.eael-product-grid-column-mobile-4 .eael-product-grid .woocommerce ul.products{grid-template-columns:repeat(4,1fr)}.eael-product-grid-column-mobile-5 .eael-product-grid .woocommerce ul.products{grid-template-columns:repeat(5,1fr)}.eael-product-grid-column-mobile-6 .eael-product-grid .woocommerce ul.products{grid-template-columns:repeat(6,1fr)}}
assets/front-end/css/tooltip/index.css CHANGED
@@ -226,18 +226,25 @@
226
  top: 100%;
227
  }
228
  }
229
- .eael-tooltip-text-align-left .eael-tooltip-text {
 
 
 
 
 
 
 
230
  text-align: left;
231
  }
232
 
233
- .eael-tooltip-text-align-right .eael-tooltip-text {
234
  text-align: right;
235
  }
236
 
237
- .eael-tooltip-text-align-center .eael-tooltip-text {
238
  text-align: center;
239
  }
240
 
241
- .eael-tooltip-text-align-justify .eael-tooltip-text {
242
  text-align: justify;
243
  }
226
  top: 100%;
227
  }
228
  }
229
+ span.eael-tooltip-content,
230
+ span.eael-tooltip-content a {
231
+ width: 100%;
232
+ display: block;
233
+ text-align: center;
234
+ }
235
+
236
+ .eael-tooltip-text-align-left .eael-tooltip-text, .eael-tooltip-text-align-left .eael-tooltip-content a {
237
  text-align: left;
238
  }
239
 
240
+ .eael-tooltip-text-align-right .eael-tooltip-text, .eael-tooltip-text-align-right .eael-tooltip-content a {
241
  text-align: right;
242
  }
243
 
244
+ .eael-tooltip-text-align-center .eael-tooltip-text, .eael-tooltip-text-align-center .eael-tooltip-content a {
245
  text-align: center;
246
  }
247
 
248
+ .eael-tooltip-text-align-justify .eael-tooltip-text, .eael-tooltip-text-align-justify .eael-tooltip-content a {
249
  text-align: justify;
250
  }
assets/front-end/css/tooltip/index.min.css CHANGED
@@ -1 +1 @@
1
- .eael-tooltip{position:relative;display:inline-block;min-width:150px;padding:12px 24px;font-size:.93rem;color:#333;line-height:1;cursor:pointer;transition:all .3s ease-in-out}.eael-tooltip .eael-tooltip-text{display:block;width:100%;visibility:hidden;background-color:#000;color:#fff;border-radius:4px;padding:10px;position:absolute;z-index:1;font-size:.93rem;line-height:1.3}.eael-tooltip .eael-tooltip-text p{margin:0}.eael-tooltip .eael-tooltip-text::after{content:"";position:absolute;border-width:5px;border-style:solid}.eael-tooltip:hover .eael-tooltip-text{visibility:visible}.eael-tooltip .eael-tooltip-text.eael-tooltip-left{top:50%;right:100%;transform:translateY(-50%);margin-right:10px}.eael-tooltip:hover .eael-tooltip-text.eael-tooltip-left{-webkit-animation:tooltipLeftIn .3s ease-in-out;animation:tooltipLeftIn .3s ease-in-out}.eael-tooltip .eael-tooltip-text.eael-tooltip-left::after{top:calc(50% - 5px);left:100%;border-color:transparent transparent transparent #000}.eael-tooltip .eael-tooltip-text.eael-tooltip-right{top:50%;left:100%;transform:translateY(-50%);transition:all .3s ease-in-out;margin-left:10px}.eael-tooltip:hover .eael-tooltip-text.eael-tooltip-right{-webkit-animation:tooltipRightIn .3s linear;animation:tooltipRightIn .3s linear}.eael-tooltip .eael-tooltip-text.eael-tooltip-right::after{top:calc(50% - 5px);right:100%;border-color:transparent #000 transparent transparent}.eael-tooltip .eael-tooltip-text.eael-tooltip-top{bottom:calc(100%);left:0;right:0;margin:0 auto 10px auto}.eael-tooltip .eael-tooltip-text.eael-tooltip-top::after{margin-top:0;top:100%;left:calc(50% - 5px);border-color:#000 transparent transparent transparent}.eael-tooltip:hover .eael-tooltip-text.eael-tooltip-top{-webkit-animation:tooltipTopIn .3s linear;animation:tooltipTopIn .3s linear}.eael-tooltip .eael-tooltip-text.eael-tooltip-bottom{top:100%;left:0;right:0;margin:10px auto 0 auto}.eael-tooltip .eael-tooltip-text.eael-tooltip-bottom::after{margin-top:0;bottom:100%;left:calc(50% - 5px);border-color:transparent transparent #000 transparent}.eael-tooltip:hover .eael-tooltip-text.eael-tooltip-bottom{-webkit-animation:tooltipBottomIn .3s linear;animation:tooltipBottomIn .3s linear}.eael-tooltip-align-left{display:flex;width:100%;justify-content:flex-start}.eael-tooltip-align-right{display:flex;width:100%;justify-content:flex-end}.eael-tooltip-align-center{display:flex;width:100%;justify-content:center}.eael-tooltip-align-justify .eael-tooltip{display:flex;justify-content:center;align-items:center}@-webkit-keyframes tooltipRightIn{0%{opacity:0;left:105%}100%{opacity:1;left:100%}}@keyframes tooltipRightIn{0%{opacity:0;left:105%}100%{opacity:1;left:100%}}@-webkit-keyframes tooltipLeftIn{0%{opacity:0;right:105%}100%{opacity:1;right:100%}}@keyframes tooltipLeftIn{0%{opacity:0;right:105%}100%{opacity:1;right:100%}}@-webkit-keyframes tooltipTopIn{0%{opacity:0;bottom:110%}100%{opacity:1;bottom:100%}}@keyframes tooltipTopIn{0%{opacity:0;bottom:110%}100%{opacity:1;bottom:100%}}@-webkit-keyframes tooltipBottomIn{0%{opacity:0;top:110%}100%{opacity:1;top:100%}}@keyframes tooltipBottomIn{0%{opacity:0;top:110%}100%{opacity:1;top:100%}}.eael-tooltip-text-align-left .eael-tooltip-text{text-align:left}.eael-tooltip-text-align-right .eael-tooltip-text{text-align:right}.eael-tooltip-text-align-center .eael-tooltip-text{text-align:center}.eael-tooltip-text-align-justify .eael-tooltip-text{text-align:justify}
1
+ .eael-tooltip{position:relative;display:inline-block;min-width:150px;padding:12px 24px;font-size:.93rem;color:#333;line-height:1;cursor:pointer;transition:all .3s ease-in-out}.eael-tooltip .eael-tooltip-text{display:block;width:100%;visibility:hidden;background-color:#000;color:#fff;border-radius:4px;padding:10px;position:absolute;z-index:1;font-size:.93rem;line-height:1.3}.eael-tooltip .eael-tooltip-text p{margin:0}.eael-tooltip .eael-tooltip-text::after{content:"";position:absolute;border-width:5px;border-style:solid}.eael-tooltip:hover .eael-tooltip-text{visibility:visible}.eael-tooltip .eael-tooltip-text.eael-tooltip-left{top:50%;right:100%;transform:translateY(-50%);margin-right:10px}.eael-tooltip:hover .eael-tooltip-text.eael-tooltip-left{-webkit-animation:tooltipLeftIn .3s ease-in-out;animation:tooltipLeftIn .3s ease-in-out}.eael-tooltip .eael-tooltip-text.eael-tooltip-left::after{top:calc(50% - 5px);left:100%;border-color:transparent transparent transparent #000}.eael-tooltip .eael-tooltip-text.eael-tooltip-right{top:50%;left:100%;transform:translateY(-50%);transition:all .3s ease-in-out;margin-left:10px}.eael-tooltip:hover .eael-tooltip-text.eael-tooltip-right{-webkit-animation:tooltipRightIn .3s linear;animation:tooltipRightIn .3s linear}.eael-tooltip .eael-tooltip-text.eael-tooltip-right::after{top:calc(50% - 5px);right:100%;border-color:transparent #000 transparent transparent}.eael-tooltip .eael-tooltip-text.eael-tooltip-top{bottom:calc(100%);left:0;right:0;margin:0 auto 10px auto}.eael-tooltip .eael-tooltip-text.eael-tooltip-top::after{margin-top:0;top:100%;left:calc(50% - 5px);border-color:#000 transparent transparent transparent}.eael-tooltip:hover .eael-tooltip-text.eael-tooltip-top{-webkit-animation:tooltipTopIn .3s linear;animation:tooltipTopIn .3s linear}.eael-tooltip .eael-tooltip-text.eael-tooltip-bottom{top:100%;left:0;right:0;margin:10px auto 0 auto}.eael-tooltip .eael-tooltip-text.eael-tooltip-bottom::after{margin-top:0;bottom:100%;left:calc(50% - 5px);border-color:transparent transparent #000 transparent}.eael-tooltip:hover .eael-tooltip-text.eael-tooltip-bottom{-webkit-animation:tooltipBottomIn .3s linear;animation:tooltipBottomIn .3s linear}.eael-tooltip-align-left{display:flex;width:100%;justify-content:flex-start}.eael-tooltip-align-right{display:flex;width:100%;justify-content:flex-end}.eael-tooltip-align-center{display:flex;width:100%;justify-content:center}.eael-tooltip-align-justify .eael-tooltip{display:flex;justify-content:center;align-items:center}@-webkit-keyframes tooltipRightIn{0%{opacity:0;left:105%}100%{opacity:1;left:100%}}@keyframes tooltipRightIn{0%{opacity:0;left:105%}100%{opacity:1;left:100%}}@-webkit-keyframes tooltipLeftIn{0%{opacity:0;right:105%}100%{opacity:1;right:100%}}@keyframes tooltipLeftIn{0%{opacity:0;right:105%}100%{opacity:1;right:100%}}@-webkit-keyframes tooltipTopIn{0%{opacity:0;bottom:110%}100%{opacity:1;bottom:100%}}@keyframes tooltipTopIn{0%{opacity:0;bottom:110%}100%{opacity:1;bottom:100%}}@-webkit-keyframes tooltipBottomIn{0%{opacity:0;top:110%}100%{opacity:1;top:100%}}@keyframes tooltipBottomIn{0%{opacity:0;top:110%}100%{opacity:1;top:100%}}span.eael-tooltip-content,span.eael-tooltip-content a{width:100%;display:block;text-align:center}.eael-tooltip-text-align-left .eael-tooltip-content a,.eael-tooltip-text-align-left .eael-tooltip-text{text-align:left}.eael-tooltip-text-align-right .eael-tooltip-content a,.eael-tooltip-text-align-right .eael-tooltip-text{text-align:right}.eael-tooltip-text-align-center .eael-tooltip-content a,.eael-tooltip-text-align-center .eael-tooltip-text{text-align:center}.eael-tooltip-text-align-justify .eael-tooltip-content a,.eael-tooltip-text-align-justify .eael-tooltip-text{text-align:justify}
assets/front-end/js/eael.js CHANGED
@@ -5599,6 +5599,53 @@ var trim = String.prototype.trim ?
5599
  }));
5600
 
5601
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5602
  /*! Magnific Popup - v1.1.0 - 2016-02-20
5603
  * http://dimsemenov.com/plugins/magnific-popup/
5604
  * Copyright (c) 2016 Dmitry Semenov; */
@@ -7460,9286 +7507,107 @@ var trim = String.prototype.trim ?
7460
  /*>>retina*/
7461
  _checkInstance();
7462
  }));
7463
- (function($) {
7464
- $.fn.eaelProgressBar = function() {
7465
- var $this = $(this)
7466
- var $layout = $this.data('layout')
7467
- var $num = $this.data('count')
7468
- var $duration = $this.data('duration')
7469
-
7470
- $this.one('inview', function() {
7471
- if ($layout == 'line') {
7472
- $('.eael-progressbar-line-fill', $this).css({
7473
- 'width': $num + '%',
7474
- })
7475
- } else if ($layout == 'half_circle') {
7476
- $('.eael-progressbar-circle-half', $this).css({
7477
- 'transform': 'rotate(' + ($num * 1.8) + 'deg)',
7478
- })
7479
- }
7480
-
7481
- $('.eael-progressbar-count', $this).prop({
7482
- 'counter': 0
7483
- }).animate({
7484
- counter: $num
7485
- }, {
7486
- duration: $duration,
7487
- easing: 'linear',
7488
- step: function(counter) {
7489
- if ($layout == 'circle') {
7490
- var rotate = (counter * 3.6)
7491
- $('.eael-progressbar-circle-half-left', $this).css({
7492
- 'transform': "rotate(" + rotate + "deg)",
7493
- })
7494
- if (rotate > 180) {
7495
- $('.eael-progressbar-circle-pie', $this).css({
7496
- 'clip-path': 'inset(0)'
7497
- })
7498
- $('.eael-progressbar-circle-half-right', $this).css({
7499
- 'visibility': 'visible'
7500
- })
7501
- }
7502
- }
7503
-
7504
- $(this).text(Math.ceil(counter))
7505
- }
7506
- })
7507
- })
7508
- }
7509
- }(jQuery));
7510
- typeof navigator === "object" && (function (global, factory) {
7511
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
7512
- typeof define === 'function' && define.amd ? define('Plyr', factory) :
7513
- (global = global || self, global.Plyr = factory());
7514
- }(this, function () { 'use strict';
7515
-
7516
- function _classCallCheck(instance, Constructor) {
7517
- if (!(instance instanceof Constructor)) {
7518
- throw new TypeError("Cannot call a class as a function");
7519
- }
7520
- }
7521
-
7522
- function _defineProperties(target, props) {
7523
- for (var i = 0; i < props.length; i++) {
7524
- var descriptor = props[i];
7525
- descriptor.enumerable = descriptor.enumerable || false;
7526
- descriptor.configurable = true;
7527
- if ("value" in descriptor) descriptor.writable = true;
7528
- Object.defineProperty(target, descriptor.key, descriptor);
7529
- }
7530
- }
7531
-
7532
- function _createClass(Constructor, protoProps, staticProps) {
7533
- if (protoProps) _defineProperties(Constructor.prototype, protoProps);
7534
- if (staticProps) _defineProperties(Constructor, staticProps);
7535
- return Constructor;
7536
- }
7537
-
7538
- function _defineProperty(obj, key, value) {
7539
- if (key in obj) {
7540
- Object.defineProperty(obj, key, {
7541
- value: value,
7542
- enumerable: true,
7543
- configurable: true,
7544
- writable: true
7545
- });
7546
- } else {
7547
- obj[key] = value;
7548
- }
7549
-
7550
- return obj;
7551
- }
7552
-
7553
- function _slicedToArray(arr, i) {
7554
- return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest();
7555
- }
7556
-
7557
- function _toConsumableArray(arr) {
7558
- return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread();
7559
- }
7560
-
7561
- function _arrayWithoutHoles(arr) {
7562
- if (Array.isArray(arr)) {
7563
- for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];
7564
-
7565
- return arr2;
7566
- }
7567
  }
 
7568
 
7569
- function _arrayWithHoles(arr) {
7570
- if (Array.isArray(arr)) return arr;
7571
- }
7572
 
7573
- function _iterableToArray(iter) {
7574
- if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter);
7575
- }
7576
-
7577
- function _iterableToArrayLimit(arr, i) {
7578
- var _arr = [];
7579
- var _n = true;
7580
- var _d = false;
7581
- var _e = undefined;
7582
-
7583
- try {
7584
- for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {
7585
- _arr.push(_s.value);
7586
-
7587
- if (i && _arr.length === i) break;
7588
- }
7589
- } catch (err) {
7590
- _d = true;
7591
- _e = err;
7592
- } finally {
7593
- try {
7594
- if (!_n && _i["return"] != null) _i["return"]();
7595
- } finally {
7596
- if (_d) throw _e;
7597
- }
7598
- }
7599
-
7600
- return _arr;
7601
- }
7602
-
7603
- function _nonIterableSpread() {
7604
- throw new TypeError("Invalid attempt to spread non-iterable instance");
7605
- }
7606
-
7607
- function _nonIterableRest() {
7608
- throw new TypeError("Invalid attempt to destructure non-iterable instance");
7609
- }
7610
-
7611
- var defaults = {
7612
- addCSS: true,
7613
- // Add CSS to the element to improve usability (required here or in your CSS!)
7614
- thumbWidth: 15,
7615
- // The width of the thumb handle
7616
- watch: true // Watch for new elements that match a string target
7617
-
7618
- };
7619
-
7620
- // Element matches a selector
7621
- function matches(element, selector) {
7622
-
7623
- function match() {
7624
- return Array.from(document.querySelectorAll(selector)).includes(this);
7625
- }
7626
-
7627
- var matches = match;
7628
- return matches.call(element, selector);
7629
- }
7630
-
7631
- // Trigger event
7632
- function trigger(element, type) {
7633
- if (!element || !type) {
7634
- return;
7635
- } // Create and dispatch the event
7636
-
7637
-
7638
- var event = new Event(type); // Dispatch the event
7639
-
7640
- element.dispatchEvent(event);
7641
- }
7642
-
7643
- // ==========================================================================
7644
- // Type checking utils
7645
- // ==========================================================================
7646
- var getConstructor = function getConstructor(input) {
7647
- return input !== null && typeof input !== 'undefined' ? input.constructor : null;
7648
- };
7649
-
7650
- var instanceOf = function instanceOf(input, constructor) {
7651
- return Boolean(input && constructor && input instanceof constructor);
7652
- };
7653
-
7654
- var isNullOrUndefined = function isNullOrUndefined(input) {
7655
- return input === null || typeof input === 'undefined';
7656
- };
7657
-
7658
- var isObject = function isObject(input) {
7659
- return getConstructor(input) === Object;
7660
- };
7661
-
7662
- var isNumber = function isNumber(input) {
7663
- return getConstructor(input) === Number && !Number.isNaN(input);
7664
- };
7665
-
7666
- var isString = function isString(input) {
7667
- return getConstructor(input) === String;
7668
- };
7669
-
7670
- var isBoolean = function isBoolean(input) {
7671
- return getConstructor(input) === Boolean;
7672
- };
7673
-
7674
- var isFunction = function isFunction(input) {
7675
- return getConstructor(input) === Function;
7676
- };
7677
-
7678
- var isArray = function isArray(input) {
7679
- return Array.isArray(input);
7680
- };
7681
-
7682
- var isNodeList = function isNodeList(input) {
7683
- return instanceOf(input, NodeList);
7684
- };
7685
-
7686
- var isElement = function isElement(input) {
7687
- return instanceOf(input, Element);
7688
- };
7689
-
7690
- var isEvent = function isEvent(input) {
7691
- return instanceOf(input, Event);
7692
- };
7693
-
7694
- var isEmpty = function isEmpty(input) {
7695
- return isNullOrUndefined(input) || (isString(input) || isArray(input) || isNodeList(input)) && !input.length || isObject(input) && !Object.keys(input).length;
7696
- };
7697
-
7698
- var is = {
7699
- nullOrUndefined: isNullOrUndefined,
7700
- object: isObject,
7701
- number: isNumber,
7702
- string: isString,
7703
- boolean: isBoolean,
7704
- function: isFunction,
7705
- array: isArray,
7706
- nodeList: isNodeList,
7707
- element: isElement,
7708
- event: isEvent,
7709
- empty: isEmpty
7710
- };
7711
-
7712
- // Get the number of decimal places
7713
- function getDecimalPlaces(value) {
7714
- var match = "".concat(value).match(/(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/);
7715
-
7716
- if (!match) {
7717
- return 0;
7718
- }
7719
-
7720
- return Math.max(0, // Number of digits right of decimal point.
7721
- (match[1] ? match[1].length : 0) - ( // Adjust for scientific notation.
7722
- match[2] ? +match[2] : 0));
7723
- } // Round to the nearest step
7724
-
7725
- function round(number, step) {
7726
- if (step < 1) {
7727
- var places = getDecimalPlaces(step);
7728
- return parseFloat(number.toFixed(places));
7729
- }
7730
-
7731
- return Math.round(number / step) * step;
7732
- }
7733
-
7734
- var RangeTouch =
7735
- /*#__PURE__*/
7736
- function () {
7737
- /**
7738
- * Setup a new instance
7739
- * @param {String|Element} target
7740
- * @param {Object} options
7741
- */
7742
- function RangeTouch(target, options) {
7743
- _classCallCheck(this, RangeTouch);
7744
-
7745
- if (is.element(target)) {
7746
- // An Element is passed, use it directly
7747
- this.element = target;
7748
- } else if (is.string(target)) {
7749
- // A CSS Selector is passed, fetch it from the DOM
7750
- this.element = document.querySelector(target);
7751
- }
7752
-
7753
- if (!is.element(this.element) || !is.empty(this.element.rangeTouch)) {
7754
- return;
7755
- }
7756
-
7757
- this.config = Object.assign({}, defaults, options);
7758
- this.init();
7759
- }
7760
-
7761
- _createClass(RangeTouch, [{
7762
- key: "init",
7763
- value: function init() {
7764
- // Bail if not a touch enabled device
7765
- if (!RangeTouch.enabled) {
7766
- return;
7767
- } // Add useful CSS
7768
-
7769
-
7770
- if (this.config.addCSS) {
7771
- // TODO: Restore original values on destroy
7772
- this.element.style.userSelect = 'none';
7773
- this.element.style.webKitUserSelect = 'none';
7774
- this.element.style.touchAction = 'manipulation';
7775
- }
7776
-
7777
- this.listeners(true);
7778
- this.element.rangeTouch = this;
7779
- }
7780
- }, {
7781
- key: "destroy",
7782
- value: function destroy() {
7783
- // Bail if not a touch enabled device
7784
- if (!RangeTouch.enabled) {
7785
- return;
7786
- }
7787
-
7788
- this.listeners(false);
7789
- this.element.rangeTouch = null;
7790
- }
7791
- }, {
7792
- key: "listeners",
7793
- value: function listeners(toggle) {
7794
- var _this = this;
7795
-
7796
- var method = toggle ? 'addEventListener' : 'removeEventListener'; // Listen for events
7797
-
7798
- ['touchstart', 'touchmove', 'touchend'].forEach(function (type) {
7799
- _this.element[method](type, function (event) {
7800
- return _this.set(event);
7801
- }, false);
7802
- });
7803
- }
7804
- /**
7805
- * Get the value based on touch position
7806
- * @param {Event} event
7807
- */
7808
-
7809
- }, {
7810
- key: "get",
7811
- value: function get(event) {
7812
- if (!RangeTouch.enabled || !is.event(event)) {
7813
- return null;
7814
- }
7815
-
7816
- var input = event.target;
7817
- var touch = event.changedTouches[0];
7818
- var min = parseFloat(input.getAttribute('min')) || 0;
7819
- var max = parseFloat(input.getAttribute('max')) || 100;
7820
- var step = parseFloat(input.getAttribute('step')) || 1;
7821
- var delta = max - min; // Calculate percentage
7822
-
7823
- var percent;
7824
- var clientRect = input.getBoundingClientRect();
7825
- var thumbWidth = 100 / clientRect.width * (this.config.thumbWidth / 2) / 100; // Determine left percentage
7826
-
7827
- percent = 100 / clientRect.width * (touch.clientX - clientRect.left); // Don't allow outside bounds
7828
-
7829
- if (percent < 0) {
7830
- percent = 0;
7831
- } else if (percent > 100) {
7832
- percent = 100;
7833
- } // Factor in the thumb offset
7834
-
7835
-
7836
- if (percent < 50) {
7837
- percent -= (100 - percent * 2) * thumbWidth;
7838
- } else if (percent > 50) {
7839
- percent += (percent - 50) * 2 * thumbWidth;
7840
- } // Find the closest step to the mouse position
7841
-
7842
-
7843
- return min + round(delta * (percent / 100), step);
7844
- }
7845
- /**
7846
- * Update range value based on position
7847
- * @param {Event} event
7848
- */
7849
-
7850
- }, {
7851
- key: "set",
7852
- value: function set(event) {
7853
- if (!RangeTouch.enabled || !is.event(event) || event.target.disabled) {
7854
- return;
7855
- } // Prevent text highlight on iOS
7856
-
7857
-
7858
- event.preventDefault(); // Set value
7859
-
7860
- event.target.value = this.get(event); // Trigger event
7861
-
7862
- trigger(event.target, event.type === 'touchend' ? 'change' : 'input');
7863
- }
7864
- }], [{
7865
- key: "setup",
7866
-
7867
- /**
7868
- * Setup multiple instances
7869
- * @param {String|Element|NodeList|Array} target
7870
- * @param {Object} options
7871
- */
7872
- value: function setup(target) {
7873
- var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
7874
- var targets = null;
7875
-
7876
- if (is.empty(target) || is.string(target)) {
7877
- targets = Array.from(document.querySelectorAll(is.string(target) ? target : 'input[type="range"]'));
7878
- } else if (is.element(target)) {
7879
- targets = [target];
7880
- } else if (is.nodeList(target)) {
7881
- targets = Array.from(target);
7882
- } else if (is.array(target)) {
7883
- targets = target.filter(is.element);
7884
- }
7885
-
7886
- if (is.empty(targets)) {
7887
- return null;
7888
- }
7889
-
7890
- var config = Object.assign({}, defaults, options);
7891
-
7892
- if (is.string(target) && config.watch) {
7893
- // Create an observer instance
7894
- var observer = new MutationObserver(function (mutations) {
7895
- Array.from(mutations).forEach(function (mutation) {
7896
- Array.from(mutation.addedNodes).forEach(function (node) {
7897
- if (!is.element(node) || !matches(node, target)) {
7898
- return;
7899
- } // eslint-disable-next-line no-unused-vars
7900
-
7901
-
7902
- var range = new RangeTouch(node, config);
7903
- });
7904
- });
7905
- }); // Pass in the target node, as well as the observer options
7906
-
7907
- observer.observe(document.body, {
7908
- childList: true,
7909
- subtree: true
7910
- });
7911
- }
7912
-
7913
- return targets.map(function (t) {
7914
- return new RangeTouch(t, options);
7915
- });
7916
- }
7917
- }, {
7918
- key: "enabled",
7919
- get: function get() {
7920
- return 'ontouchstart' in document.documentElement;
7921
- }
7922
- }]);
7923
-
7924
- return RangeTouch;
7925
- }();
7926
-
7927
- // ==========================================================================
7928
- // Type checking utils
7929
- // ==========================================================================
7930
- var getConstructor$1 = function getConstructor(input) {
7931
- return input !== null && typeof input !== 'undefined' ? input.constructor : null;
7932
- };
7933
-
7934
- var instanceOf$1 = function instanceOf(input, constructor) {
7935
- return Boolean(input && constructor && input instanceof constructor);
7936
- };
7937
-
7938
- var isNullOrUndefined$1 = function isNullOrUndefined(input) {
7939
- return input === null || typeof input === 'undefined';
7940
- };
7941
-
7942
- var isObject$1 = function isObject(input) {
7943
- return getConstructor$1(input) === Object;
7944
- };
7945
-
7946
- var isNumber$1 = function isNumber(input) {
7947
- return getConstructor$1(input) === Number && !Number.isNaN(input);
7948
- };
7949
-
7950
- var isString$1 = function isString(input) {
7951
- return getConstructor$1(input) === String;
7952
- };
7953
-
7954
- var isBoolean$1 = function isBoolean(input) {
7955
- return getConstructor$1(input) === Boolean;
7956
- };
7957
-
7958
- var isFunction$1 = function isFunction(input) {
7959
- return getConstructor$1(input) === Function;
7960
- };
7961
-
7962
- var isArray$1 = function isArray(input) {
7963
- return Array.isArray(input);
7964
- };
7965
-
7966
- var isWeakMap = function isWeakMap(input) {
7967
- return instanceOf$1(input, WeakMap);
7968
- };
7969
-
7970
- var isNodeList$1 = function isNodeList(input) {
7971
- return instanceOf$1(input, NodeList);
7972
- };
7973
-
7974
- var isElement$1 = function isElement(input) {
7975
- return instanceOf$1(input, Element);
7976
- };
7977
-
7978
- var isTextNode = function isTextNode(input) {
7979
- return getConstructor$1(input) === Text;
7980
- };
7981
-
7982
- var isEvent$1 = function isEvent(input) {
7983
- return instanceOf$1(input, Event);
7984
- };
7985
-
7986
- var isKeyboardEvent = function isKeyboardEvent(input) {
7987
- return instanceOf$1(input, KeyboardEvent);
7988
- };
7989
-
7990
- var isCue = function isCue(input) {
7991
- return instanceOf$1(input, window.TextTrackCue) || instanceOf$1(input, window.VTTCue);
7992
- };
7993
-
7994
- var isTrack = function isTrack(input) {
7995
- return instanceOf$1(input, TextTrack) || !isNullOrUndefined$1(input) && isString$1(input.kind);
7996
- };
7997
-
7998
- var isPromise = function isPromise(input) {
7999
- return instanceOf$1(input, Promise);
8000
- };
8001
-
8002
- var isEmpty$1 = function isEmpty(input) {
8003
- return isNullOrUndefined$1(input) || (isString$1(input) || isArray$1(input) || isNodeList$1(input)) && !input.length || isObject$1(input) && !Object.keys(input).length;
8004
- };
8005
-
8006
- var isUrl = function isUrl(input) {
8007
- // Accept a URL object
8008
- if (instanceOf$1(input, window.URL)) {
8009
- return true;
8010
- } // Must be string from here
8011
-
8012
-
8013
- if (!isString$1(input)) {
8014
- return false;
8015
- } // Add the protocol if required
8016
-
8017
-
8018
- var string = input;
8019
-
8020
- if (!input.startsWith('http://') || !input.startsWith('https://')) {
8021
- string = "http://".concat(input);
8022
- }
8023
-
8024
- try {
8025
- return !isEmpty$1(new URL(string).hostname);
8026
- } catch (e) {
8027
- return false;
8028
- }
8029
- };
8030
-
8031
- var is$1 = {
8032
- nullOrUndefined: isNullOrUndefined$1,
8033
- object: isObject$1,
8034
- number: isNumber$1,
8035
- string: isString$1,
8036
- boolean: isBoolean$1,
8037
- function: isFunction$1,
8038
- array: isArray$1,
8039
- weakMap: isWeakMap,
8040
- nodeList: isNodeList$1,
8041
- element: isElement$1,
8042
- textNode: isTextNode,
8043
- event: isEvent$1,
8044
- keyboardEvent: isKeyboardEvent,
8045
- cue: isCue,
8046
- track: isTrack,
8047
- promise: isPromise,
8048
- url: isUrl,
8049
- empty: isEmpty$1
8050
- };
8051
-
8052
- // ==========================================================================
8053
- var transitionEndEvent = function () {
8054
- var element = document.createElement('span');
8055
- var events = {
8056
- WebkitTransition: 'webkitTransitionEnd',
8057
- MozTransition: 'transitionend',
8058
- OTransition: 'oTransitionEnd otransitionend',
8059
- transition: 'transitionend'
8060
- };
8061
- var type = Object.keys(events).find(function (event) {
8062
- return element.style[event] !== undefined;
8063
- });
8064
- return is$1.string(type) ? events[type] : false;
8065
- }(); // Force repaint of element
8066
-
8067
- function repaint(element, delay) {
8068
- setTimeout(function () {
8069
- try {
8070
- // eslint-disable-next-line no-param-reassign
8071
- element.hidden = true; // eslint-disable-next-line no-unused-expressions
8072
-
8073
- element.offsetHeight; // eslint-disable-next-line no-param-reassign
8074
-
8075
- element.hidden = false;
8076
- } catch (e) {// Do nothing
8077
- }
8078
- }, delay);
8079
- }
8080
-
8081
- // ==========================================================================
8082
- // Browser sniffing
8083
- // Unfortunately, due to mixed support, UA sniffing is required
8084
- // ==========================================================================
8085
- var browser = {
8086
- isIE:
8087
- /* @cc_on!@ */
8088
- !!document.documentMode,
8089
- isEdge: window.navigator.userAgent.includes('Edge'),
8090
- isWebkit: 'WebkitAppearance' in document.documentElement.style && !/Edge/.test(navigator.userAgent),
8091
- isIPhone: /(iPhone|iPod)/gi.test(navigator.platform),
8092
- isIos: /(iPad|iPhone|iPod)/gi.test(navigator.platform)
8093
- };
8094
-
8095
- // ==========================================================================
8096
- // https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md
8097
- // https://www.youtube.com/watch?v=NPM6172J22g
8098
-
8099
- var supportsPassiveListeners = function () {
8100
- // Test via a getter in the options object to see if the passive property is accessed
8101
- var supported = false;
8102
-
8103
- try {
8104
- var options = Object.defineProperty({}, 'passive', {
8105
- get: function get() {
8106
- supported = true;
8107
- return null;
8108
- }
8109
- });
8110
- window.addEventListener('test', null, options);
8111
- window.removeEventListener('test', null, options);
8112
- } catch (e) {// Do nothing
8113
- }
8114
-
8115
- return supported;
8116
- }(); // Toggle event listener
8117
-
8118
-
8119
- function toggleListener(element, event, callback) {
8120
- var _this = this;
8121
-
8122
- var toggle = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
8123
- var passive = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;
8124
- var capture = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : false;
8125
-
8126
- // Bail if no element, event, or callback
8127
- if (!element || !('addEventListener' in element) || is$1.empty(event) || !is$1.function(callback)) {
8128
- return;
8129
- } // Allow multiple events
8130
-
8131
-
8132
- var events = event.split(' '); // Build options
8133
- // Default to just the capture boolean for browsers with no passive listener support
8134
-
8135
- var options = capture; // If passive events listeners are supported
8136
-
8137
- if (supportsPassiveListeners) {
8138
- options = {
8139
- // Whether the listener can be passive (i.e. default never prevented)
8140
- passive: passive,
8141
- // Whether the listener is a capturing listener or not
8142
- capture: capture
8143
- };
8144
- } // If a single node is passed, bind the event listener
8145
-
8146
-
8147
- events.forEach(function (type) {
8148
- if (_this && _this.eventListeners && toggle) {
8149
- // Cache event listener
8150
- _this.eventListeners.push({
8151
- element: element,
8152
- type: type,
8153
- callback: callback,
8154
- options: options
8155
- });
8156
- }
8157
-
8158
- element[toggle ? 'addEventListener' : 'removeEventListener'](type, callback, options);
8159
- });
8160
- } // Bind event handler
8161
-
8162
- function on(element) {
8163
- var events = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
8164
- var callback = arguments.length > 2 ? arguments[2] : undefined;
8165
- var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;
8166
- var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
8167
- toggleListener.call(this, element, events, callback, true, passive, capture);
8168
- } // Unbind event handler
8169
-
8170
- function off(element) {
8171
- var events = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
8172
- var callback = arguments.length > 2 ? arguments[2] : undefined;
8173
- var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;
8174
- var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
8175
- toggleListener.call(this, element, events, callback, false, passive, capture);
8176
- } // Bind once-only event handler
8177
-
8178
- function once(element) {
8179
- var _this2 = this;
8180
-
8181
- var events = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
8182
- var callback = arguments.length > 2 ? arguments[2] : undefined;
8183
- var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;
8184
- var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
8185
-
8186
- var onceCallback = function onceCallback() {
8187
- off(element, events, onceCallback, passive, capture);
8188
-
8189
- for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
8190
- args[_key] = arguments[_key];
8191
- }
8192
-
8193
- callback.apply(_this2, args);
8194
- };
8195
-
8196
- toggleListener.call(this, element, events, onceCallback, true, passive, capture);
8197
- } // Trigger event
8198
-
8199
- function triggerEvent(element) {
8200
- var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
8201
- var bubbles = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
8202
- var detail = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
8203
-
8204
- // Bail if no element
8205
- if (!is$1.element(element) || is$1.empty(type)) {
8206
- return;
8207
- } // Create and dispatch the event
8208
-
8209
-
8210
- var event = new CustomEvent(type, {
8211
- bubbles: bubbles,
8212
- detail: Object.assign({}, detail, {
8213
- plyr: this
8214
- })
8215
- }); // Dispatch the event
8216
-
8217
- element.dispatchEvent(event);
8218
- } // Unbind all cached event listeners
8219
-
8220
- function unbindListeners() {
8221
- if (this && this.eventListeners) {
8222
- this.eventListeners.forEach(function (item) {
8223
- var element = item.element,
8224
- type = item.type,
8225
- callback = item.callback,
8226
- options = item.options;
8227
- element.removeEventListener(type, callback, options);
8228
- });
8229
- this.eventListeners = [];
8230
- }
8231
- } // Run method when / if player is ready
8232
-
8233
- function ready() {
8234
- var _this3 = this;
8235
-
8236
- return new Promise(function (resolve) {
8237
- return _this3.ready ? setTimeout(resolve, 0) : on.call(_this3, _this3.elements.container, 'ready', resolve);
8238
- }).then(function () {});
8239
- }
8240
-
8241
- function cloneDeep(object) {
8242
- return JSON.parse(JSON.stringify(object));
8243
- } // Get a nested value in an object
8244
-
8245
- function getDeep(object, path) {
8246
- return path.split('.').reduce(function (obj, key) {
8247
- return obj && obj[key];
8248
- }, object);
8249
- } // Deep extend destination object with N more objects
8250
-
8251
- function extend() {
8252
- var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
8253
-
8254
- for (var _len = arguments.length, sources = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
8255
- sources[_key - 1] = arguments[_key];
8256
- }
8257
-
8258
- if (!sources.length) {
8259
- return target;
8260
- }
8261
-
8262
- var source = sources.shift();
8263
-
8264
- if (!is$1.object(source)) {
8265
- return target;
8266
- }
8267
-
8268
- Object.keys(source).forEach(function (key) {
8269
- if (is$1.object(source[key])) {
8270
- if (!Object.keys(target).includes(key)) {
8271
- Object.assign(target, _defineProperty({}, key, {}));
8272
- }
8273
-
8274
- extend(target[key], source[key]);
8275
- } else {
8276
- Object.assign(target, _defineProperty({}, key, source[key]));
8277
- }
8278
- });
8279
- return extend.apply(void 0, [target].concat(sources));
8280
- }
8281
-
8282
- function wrap(elements, wrapper) {
8283
- // Convert `elements` to an array, if necessary.
8284
- var targets = elements.length ? elements : [elements]; // Loops backwards to prevent having to clone the wrapper on the
8285
- // first element (see `child` below).
8286
-
8287
- Array.from(targets).reverse().forEach(function (element, index) {
8288
- var child = index > 0 ? wrapper.cloneNode(true) : wrapper; // Cache the current parent and sibling.
8289
-
8290
- var parent = element.parentNode;
8291
- var sibling = element.nextSibling; // Wrap the element (is automatically removed from its current
8292
- // parent).
8293
-
8294
- child.appendChild(element); // If the element had a sibling, insert the wrapper before
8295
- // the sibling to maintain the HTML structure; otherwise, just
8296
- // append it to the parent.
8297
-
8298
- if (sibling) {
8299
- parent.insertBefore(child, sibling);
8300
- } else {
8301
- parent.appendChild(child);
8302
- }
8303
- });
8304
- } // Set attributes
8305
-
8306
- function setAttributes(element, attributes) {
8307
- if (!is$1.element(element) || is$1.empty(attributes)) {
8308
- return;
8309
- } // Assume null and undefined attributes should be left out,
8310
- // Setting them would otherwise convert them to "null" and "undefined"
8311
-
8312
-
8313
- Object.entries(attributes).filter(function (_ref) {
8314
- var _ref2 = _slicedToArray(_ref, 2),
8315
- value = _ref2[1];
8316
-
8317
- return !is$1.nullOrUndefined(value);
8318
- }).forEach(function (_ref3) {
8319
- var _ref4 = _slicedToArray(_ref3, 2),
8320
- key = _ref4[0],
8321
- value = _ref4[1];
8322
-
8323
- return element.setAttribute(key, value);
8324
- });
8325
- } // Create a DocumentFragment
8326
-
8327
- function createElement(type, attributes, text) {
8328
- // Create a new <element>
8329
- var element = document.createElement(type); // Set all passed attributes
8330
-
8331
- if (is$1.object(attributes)) {
8332
- setAttributes(element, attributes);
8333
- } // Add text node
8334
-
8335
-
8336
- if (is$1.string(text)) {
8337
- element.innerText = text;
8338
- } // Return built element
8339
-
8340
-
8341
- return element;
8342
- } // Inaert an element after another
8343
-
8344
- function insertAfter(element, target) {
8345
- if (!is$1.element(element) || !is$1.element(target)) {
8346
- return;
8347
- }
8348
-
8349
- target.parentNode.insertBefore(element, target.nextSibling);
8350
- } // Insert a DocumentFragment
8351
-
8352
- function insertElement(type, parent, attributes, text) {
8353
- if (!is$1.element(parent)) {
8354
- return;
8355
- }
8356
-
8357
- parent.appendChild(createElement(type, attributes, text));
8358
- } // Remove element(s)
8359
-
8360
- function removeElement(element) {
8361
- if (is$1.nodeList(element) || is$1.array(element)) {
8362
- Array.from(element).forEach(removeElement);
8363
- return;
8364
- }
8365
-
8366
- if (!is$1.element(element) || !is$1.element(element.parentNode)) {
8367
- return;
8368
- }
8369
-
8370
- element.parentNode.removeChild(element);
8371
- } // Remove all child elements
8372
-
8373
- function emptyElement(element) {
8374
- if (!is$1.element(element)) {
8375
- return;
8376
- }
8377
-
8378
- var length = element.childNodes.length;
8379
-
8380
- while (length > 0) {
8381
- element.removeChild(element.lastChild);
8382
- length -= 1;
8383
- }
8384
- } // Replace element
8385
-
8386
- function replaceElement(newChild, oldChild) {
8387
- if (!is$1.element(oldChild) || !is$1.element(oldChild.parentNode) || !is$1.element(newChild)) {
8388
- return null;
8389
- }
8390
-
8391
- oldChild.parentNode.replaceChild(newChild, oldChild);
8392
- return newChild;
8393
- } // Get an attribute object from a string selector
8394
-
8395
- function getAttributesFromSelector(sel, existingAttributes) {
8396
- // For example:
8397
- // '.test' to { class: 'test' }
8398
- // '#test' to { id: 'test' }
8399
- // '[data-test="test"]' to { 'data-test': 'test' }
8400
- if (!is$1.string(sel) || is$1.empty(sel)) {
8401
- return {};
8402
- }
8403
-
8404
- var attributes = {};
8405
- var existing = extend({}, existingAttributes);
8406
- sel.split(',').forEach(function (s) {
8407
- // Remove whitespace
8408
- var selector = s.trim();
8409
- var className = selector.replace('.', '');
8410
- var stripped = selector.replace(/[[\]]/g, ''); // Get the parts and value
8411
-
8412
- var parts = stripped.split('=');
8413
-
8414
- var _parts = _slicedToArray(parts, 1),
8415
- key = _parts[0];
8416
-
8417
- var value = parts.length > 1 ? parts[1].replace(/["']/g, '') : ''; // Get the first character
8418
-
8419
- var start = selector.charAt(0);
8420
-
8421
- switch (start) {
8422
- case '.':
8423
- // Add to existing classname
8424
- if (is$1.string(existing.class)) {
8425
- attributes.class = "".concat(existing.class, " ").concat(className);
8426
- } else {
8427
- attributes.class = className;
8428
- }
8429
-
8430
- break;
8431
-
8432
- case '#':
8433
- // ID selector
8434
- attributes.id = selector.replace('#', '');
8435
- break;
8436
-
8437
- case '[':
8438
- // Attribute selector
8439
- attributes[key] = value;
8440
- break;
8441
-
8442
- default:
8443
- break;
8444
- }
8445
- });
8446
- return extend(existing, attributes);
8447
- } // Toggle hidden
8448
-
8449
- function toggleHidden(element, hidden) {
8450
- if (!is$1.element(element)) {
8451
- return;
8452
- }
8453
-
8454
- var hide = hidden;
8455
-
8456
- if (!is$1.boolean(hide)) {
8457
- hide = !element.hidden;
8458
- } // eslint-disable-next-line no-param-reassign
8459
-
8460
-
8461
- element.hidden = hide;
8462
- } // Mirror Element.classList.toggle, with IE compatibility for "force" argument
8463
-
8464
- function toggleClass(element, className, force) {
8465
- if (is$1.nodeList(element)) {
8466
- return Array.from(element).map(function (e) {
8467
- return toggleClass(e, className, force);
8468
- });
8469
- }
8470
-
8471
- if (is$1.element(element)) {
8472
- var method = 'toggle';
8473
-
8474
- if (typeof force !== 'undefined') {
8475
- method = force ? 'add' : 'remove';
8476
- }
8477
-
8478
- element.classList[method](className);
8479
- return element.classList.contains(className);
8480
- }
8481
-
8482
- return false;
8483
- } // Has class name
8484
-
8485
- function hasClass(element, className) {
8486
- return is$1.element(element) && element.classList.contains(className);
8487
- } // Element matches selector
8488
-
8489
- function matches$1(element, selector) {
8490
-
8491
- function match() {
8492
- return Array.from(document.querySelectorAll(selector)).includes(this);
8493
- }
8494
-
8495
- var method = match;
8496
- return method.call(element, selector);
8497
- } // Find all elements
8498
-
8499
- function getElements(selector) {
8500
- return this.elements.container.querySelectorAll(selector);
8501
- } // Find a single element
8502
-
8503
- function getElement(selector) {
8504
- return this.elements.container.querySelector(selector);
8505
- } // Trap focus inside container
8506
-
8507
- function trapFocus() {
8508
- var element = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
8509
- var toggle = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
8510
-
8511
- if (!is$1.element(element)) {
8512
- return;
8513
- }
8514
-
8515
- var focusable = getElements.call(this, 'button:not(:disabled), input:not(:disabled), [tabindex]');
8516
- var first = focusable[0];
8517
- var last = focusable[focusable.length - 1];
8518
-
8519
- var trap = function trap(event) {
8520
- // Bail if not tab key or not fullscreen
8521
- if (event.key !== 'Tab' || event.keyCode !== 9) {
8522
- return;
8523
- } // Get the current focused element
8524
-
8525
-
8526
- var focused = document.activeElement;
8527
-
8528
- if (focused === last && !event.shiftKey) {
8529
- // Move focus to first element that can be tabbed if Shift isn't used
8530
- first.focus();
8531
- event.preventDefault();
8532
- } else if (focused === first && event.shiftKey) {
8533
- // Move focus to last element that can be tabbed if Shift is used
8534
- last.focus();
8535
- event.preventDefault();
8536
- }
8537
- };
8538
-
8539
- toggleListener.call(this, this.elements.container, 'keydown', trap, toggle, false);
8540
- } // Set focus and tab focus class
8541
-
8542
- function setFocus() {
8543
- var element = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
8544
- var tabFocus = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
8545
-
8546
- if (!is$1.element(element)) {
8547
- return;
8548
- } // Set regular focus
8549
-
8550
-
8551
- element.focus({
8552
- preventScroll: true
8553
- }); // If we want to mimic keyboard focus via tab
8554
-
8555
- if (tabFocus) {
8556
- toggleClass(element, this.config.classNames.tabFocus);
8557
- }
8558
- }
8559
-
8560
- var defaultCodecs = {
8561
- 'audio/ogg': 'vorbis',
8562
- 'audio/wav': '1',
8563
- 'video/webm': 'vp8, vorbis',
8564
- 'video/mp4': 'avc1.42E01E, mp4a.40.2',
8565
- 'video/ogg': 'theora'
8566
- }; // Check for feature support
8567
-
8568
- var support = {
8569
- // Basic support
8570
- audio: 'canPlayType' in document.createElement('audio'),
8571
- video: 'canPlayType' in document.createElement('video'),
8572
- // Check for support
8573
- // Basic functionality vs full UI
8574
- check: function check(type, provider, playsinline) {
8575
- var canPlayInline = browser.isIPhone && playsinline && support.playsinline;
8576
- var api = support[type] || provider !== 'html5';
8577
- var ui = api && support.rangeInput && (type !== 'video' || !browser.isIPhone || canPlayInline);
8578
- return {
8579
- api: api,
8580
- ui: ui
8581
- };
8582
- },
8583
- // Picture-in-picture support
8584
- // Safari & Chrome only currently
8585
- pip: function () {
8586
- if (browser.isIPhone) {
8587
- return false;
8588
- } // Safari
8589
- // https://developer.apple.com/documentation/webkitjs/adding_picture_in_picture_to_your_safari_media_controls
8590
-
8591
-
8592
- if (is$1.function(createElement('video').webkitSetPresentationMode)) {
8593
- return true;
8594
- } // Chrome
8595
- // https://developers.google.com/web/updates/2018/10/watch-video-using-picture-in-picture
8596
-
8597
-
8598
- if (document.pictureInPictureEnabled && !createElement('video').disablePictureInPicture) {
8599
- return true;
8600
- }
8601
-
8602
- return false;
8603
- }(),
8604
- // Airplay support
8605
- // Safari only currently
8606
- airplay: is$1.function(window.WebKitPlaybackTargetAvailabilityEvent),
8607
- // Inline playback support
8608
- // https://webkit.org/blog/6784/new-video-policies-for-ios/
8609
- playsinline: 'playsInline' in document.createElement('video'),
8610
- // Check for mime type support against a player instance
8611
- // Credits: http://diveintohtml5.info/everything.html
8612
- // Related: http://www.leanbackplayer.com/test/h5mt.html
8613
- mime: function mime(input) {
8614
- if (is$1.empty(input)) {
8615
- return false;
8616
- }
8617
-
8618
- var _input$split = input.split('/'),
8619
- _input$split2 = _slicedToArray(_input$split, 1),
8620
- mediaType = _input$split2[0];
8621
-
8622
- var type = input; // Verify we're using HTML5 and there's no media type mismatch
8623
-
8624
- if (!this.isHTML5 || mediaType !== this.type) {
8625
- return false;
8626
- } // Add codec if required
8627
-
8628
-
8629
- if (Object.keys(defaultCodecs).includes(type)) {
8630
- type += "; codecs=\"".concat(defaultCodecs[input], "\"");
8631
- }
8632
-
8633
- try {
8634
- return Boolean(type && this.media.canPlayType(type).replace(/no/, ''));
8635
- } catch (e) {
8636
- return false;
8637
- }
8638
- },
8639
- // Check for textTracks support
8640
- textTracks: 'textTracks' in document.createElement('video'),
8641
- // <input type="range"> Sliders
8642
- rangeInput: function () {
8643
- var range = document.createElement('input');
8644
- range.type = 'range';
8645
- return range.type === 'range';
8646
- }(),
8647
- // Touch
8648
- // NOTE: Remember a device can be mouse + touch enabled so we check on first touch event
8649
- touch: 'ontouchstart' in document.documentElement,
8650
- // Detect transitions support
8651
- transitions: transitionEndEvent !== false,
8652
- // Reduced motion iOS & MacOS setting
8653
- // https://webkit.org/blog/7551/responsive-design-for-motion/
8654
- reducedMotion: 'matchMedia' in window && window.matchMedia('(prefers-reduced-motion)').matches
8655
- };
8656
-
8657
- function validateRatio(input) {
8658
- if (!is$1.array(input) && (!is$1.string(input) || !input.includes(':'))) {
8659
- return false;
8660
- }
8661
-
8662
- var ratio = is$1.array(input) ? input : input.split(':');
8663
- return ratio.map(Number).every(is$1.number);
8664
- }
8665
- function reduceAspectRatio(ratio) {
8666
- if (!is$1.array(ratio) || !ratio.every(is$1.number)) {
8667
- return null;
8668
- }
8669
-
8670
- var _ratio = _slicedToArray(ratio, 2),
8671
- width = _ratio[0],
8672
- height = _ratio[1];
8673
-
8674
- var getDivider = function getDivider(w, h) {
8675
- return h === 0 ? w : getDivider(h, w % h);
8676
- };
8677
-
8678
- var divider = getDivider(width, height);
8679
- return [width / divider, height / divider];
8680
- }
8681
- function getAspectRatio(input) {
8682
- var parse = function parse(ratio) {
8683
- return validateRatio(ratio) ? ratio.split(':').map(Number) : null;
8684
- }; // Try provided ratio
8685
-
8686
-
8687
- var ratio = parse(input); // Get from config
8688
-
8689
- if (ratio === null) {
8690
- ratio = parse(this.config.ratio);
8691
- } // Get from embed
8692
-
8693
-
8694
- if (ratio === null && !is$1.empty(this.embed) && is$1.array(this.embed.ratio)) {
8695
- ratio = this.embed.ratio;
8696
- } // Get from HTML5 video
8697
-
8698
-
8699
- if (ratio === null && this.isHTML5) {
8700
- var _this$media = this.media,
8701
- videoWidth = _this$media.videoWidth,
8702
- videoHeight = _this$media.videoHeight;
8703
- ratio = reduceAspectRatio([videoWidth, videoHeight]);
8704
- }
8705
-
8706
- return ratio;
8707
- } // Set aspect ratio for responsive container
8708
-
8709
- function setAspectRatio(input) {
8710
- if (!this.isVideo) {
8711
- return {};
8712
- }
8713
-
8714
- var ratio = getAspectRatio.call(this, input);
8715
-
8716
- var _ref = is$1.array(ratio) ? ratio : [0, 0],
8717
- _ref2 = _slicedToArray(_ref, 2),
8718
- w = _ref2[0],
8719
- h = _ref2[1];
8720
-
8721
- var padding = 100 / w * h;
8722
- this.elements.wrapper.style.paddingBottom = "".concat(padding, "%"); // For Vimeo we have an extra <div> to hide the standard controls and UI
8723
-
8724
- if (this.isVimeo && this.supported.ui) {
8725
- var height = 240;
8726
- var offset = (height - padding) / (height / 50);
8727
- this.media.style.transform = "translateY(-".concat(offset, "%)");
8728
- } else if (this.isHTML5) {
8729
- this.elements.wrapper.classList.toggle(this.config.classNames.videoFixedRatio, ratio !== null);
8730
- }
8731
-
8732
- return {
8733
- padding: padding,
8734
- ratio: ratio
8735
- };
8736
- }
8737
-
8738
- // ==========================================================================
8739
- var html5 = {
8740
- getSources: function getSources() {
8741
- var _this = this;
8742
-
8743
- if (!this.isHTML5) {
8744
- return [];
8745
- }
8746
-
8747
- var sources = Array.from(this.media.querySelectorAll('source')); // Filter out unsupported sources (if type is specified)
8748
-
8749
- return sources.filter(function (source) {
8750
- var type = source.getAttribute('type');
8751
-
8752
- if (is$1.empty(type)) {
8753
- return true;
8754
- }
8755
-
8756
- return support.mime.call(_this, type);
8757
- });
8758
- },
8759
- // Get quality levels
8760
- getQualityOptions: function getQualityOptions() {
8761
- // Get sizes from <source> elements
8762
- return html5.getSources.call(this).map(function (source) {
8763
- return Number(source.getAttribute('size'));
8764
- }).filter(Boolean);
8765
- },
8766
- extend: function extend() {
8767
- if (!this.isHTML5) {
8768
- return;
8769
- }
8770
-
8771
- var player = this; // Set aspect ratio if fixed
8772
-
8773
- if (!is$1.empty(this.config.ratio)) {
8774
- setAspectRatio.call(player);
8775
- } // Quality
8776
-
8777
-
8778
- Object.defineProperty(player.media, 'quality', {
8779
- get: function get() {
8780
- // Get sources
8781
- var sources = html5.getSources.call(player);
8782
- var source = sources.find(function (s) {
8783
- return s.getAttribute('src') === player.source;
8784
- }); // Return size, if match is found
8785
-
8786
- return source && Number(source.getAttribute('size'));
8787
- },
8788
- set: function set(input) {
8789
- // Get sources
8790
- var sources = html5.getSources.call(player); // Get first match for requested size
8791
-
8792
- var source = sources.find(function (s) {
8793
- return Number(s.getAttribute('size')) === input;
8794
- }); // No matching source found
8795
-
8796
- if (!source) {
8797
- return;
8798
- } // Get current state
8799
-
8800
-
8801
- var _player$media = player.media,
8802
- currentTime = _player$media.currentTime,
8803
- paused = _player$media.paused,
8804
- preload = _player$media.preload,
8805
- readyState = _player$media.readyState; // Set new source
8806
-
8807
- player.media.src = source.getAttribute('src'); // Prevent loading if preload="none" and the current source isn't loaded (#1044)
8808
-
8809
- if (preload !== 'none' || readyState) {
8810
- // Restore time
8811
- player.once('loadedmetadata', function () {
8812
- player.currentTime = currentTime; // Resume playing
8813
-
8814
- if (!paused) {
8815
- player.play();
8816
- }
8817
- }); // Load new source
8818
-
8819
- player.media.load();
8820
- } // Trigger change event
8821
-
8822
-
8823
- triggerEvent.call(player, player.media, 'qualitychange', false, {
8824
- quality: input
8825
- });
8826
- }
8827
- });
8828
- },
8829
- // Cancel current network requests
8830
- // See https://github.com/sampotts/plyr/issues/174
8831
- cancelRequests: function cancelRequests() {
8832
- if (!this.isHTML5) {
8833
- return;
8834
- } // Remove child sources
8835
-
8836
-
8837
- removeElement(html5.getSources.call(this)); // Set blank video src attribute
8838
- // This is to prevent a MEDIA_ERR_SRC_NOT_SUPPORTED error
8839
- // Info: http://stackoverflow.com/questions/32231579/how-to-properly-dispose-of-an-html5-video-and-close-socket-or-connection
8840
-
8841
- this.media.setAttribute('src', this.config.blankVideo); // Load the new empty source
8842
- // This will cancel existing requests
8843
- // See https://github.com/sampotts/plyr/issues/174
8844
-
8845
- this.media.load(); // Debugging
8846
-
8847
- this.debug.log('Cancelled network requests');
8848
- }
8849
- };
8850
-
8851
- // ==========================================================================
8852
-
8853
- function dedupe(array) {
8854
- if (!is$1.array(array)) {
8855
- return array;
8856
- }
8857
-
8858
- return array.filter(function (item, index) {
8859
- return array.indexOf(item) === index;
8860
- });
8861
- } // Get the closest value in an array
8862
-
8863
- function closest(array, value) {
8864
- if (!is$1.array(array) || !array.length) {
8865
- return null;
8866
- }
8867
-
8868
- return array.reduce(function (prev, curr) {
8869
- return Math.abs(curr - value) < Math.abs(prev - value) ? curr : prev;
8870
- });
8871
- }
8872
-
8873
- // ==========================================================================
8874
-
8875
- function generateId(prefix) {
8876
- return "".concat(prefix, "-").concat(Math.floor(Math.random() * 10000));
8877
- } // Format string
8878
-
8879
- function format(input) {
8880
- for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
8881
- args[_key - 1] = arguments[_key];
8882
- }
8883
-
8884
- if (is$1.empty(input)) {
8885
- return input;
8886
- }
8887
-
8888
- return input.toString().replace(/{(\d+)}/g, function (match, i) {
8889
- return args[i].toString();
8890
- });
8891
- } // Get percentage
8892
-
8893
- function getPercentage(current, max) {
8894
- if (current === 0 || max === 0 || Number.isNaN(current) || Number.isNaN(max)) {
8895
- return 0;
8896
- }
8897
-
8898
- return (current / max * 100).toFixed(2);
8899
- } // Replace all occurances of a string in a string
8900
-
8901
- function replaceAll() {
8902
- var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
8903
- var find = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
8904
- var replace = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';
8905
- return input.replace(new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\]/\\])/g, '\\$1'), 'g'), replace.toString());
8906
- } // Convert to title case
8907
-
8908
- function toTitleCase() {
8909
- var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
8910
- return input.toString().replace(/\w\S*/g, function (text) {
8911
- return text.charAt(0).toUpperCase() + text.substr(1).toLowerCase();
8912
- });
8913
- } // Convert string to pascalCase
8914
-
8915
- function toPascalCase() {
8916
- var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
8917
- var string = input.toString(); // Convert kebab case
8918
-
8919
- string = replaceAll(string, '-', ' '); // Convert snake case
8920
-
8921
- string = replaceAll(string, '_', ' '); // Convert to title case
8922
-
8923
- string = toTitleCase(string); // Convert to pascal case
8924
-
8925
- return replaceAll(string, ' ', '');
8926
- } // Convert string to pascalCase
8927
-
8928
- function toCamelCase() {
8929
- var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
8930
- var string = input.toString(); // Convert to pascal case
8931
-
8932
- string = toPascalCase(string); // Convert first character to lowercase
8933
-
8934
- return string.charAt(0).toLowerCase() + string.slice(1);
8935
- } // Remove HTML from a string
8936
-
8937
- function stripHTML(source) {
8938
- var fragment = document.createDocumentFragment();
8939
- var element = document.createElement('div');
8940
- fragment.appendChild(element);
8941
- element.innerHTML = source;
8942
- return fragment.firstChild.innerText;
8943
- } // Like outerHTML, but also works for DocumentFragment
8944
-
8945
- function getHTML(element) {
8946
- var wrapper = document.createElement('div');
8947
- wrapper.appendChild(element);
8948
- return wrapper.innerHTML;
8949
- }
8950
-
8951
- var resources = {
8952
- pip: 'PIP',
8953
- airplay: 'AirPlay',
8954
- html5: 'HTML5',
8955
- vimeo: 'Vimeo',
8956
- youtube: 'YouTube'
8957
- };
8958
- var i18n = {
8959
- get: function get() {
8960
- var key = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
8961
- var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
8962
-
8963
- if (is$1.empty(key) || is$1.empty(config)) {
8964
- return '';
8965
- }
8966
-
8967
- var string = getDeep(config.i18n, key);
8968
-
8969
- if (is$1.empty(string)) {
8970
- if (Object.keys(resources).includes(key)) {
8971
- return resources[key];
8972
- }
8973
-
8974
- return '';
8975
- }
8976
-
8977
- var replace = {
8978
- '{seektime}': config.seekTime,
8979
- '{title}': config.title
8980
- };
8981
- Object.entries(replace).forEach(function (_ref) {
8982
- var _ref2 = _slicedToArray(_ref, 2),
8983
- k = _ref2[0],
8984
- v = _ref2[1];
8985
-
8986
- string = replaceAll(string, k, v);
8987
- });
8988
- return string;
8989
- }
8990
- };
8991
-
8992
- var Storage =
8993
- /*#__PURE__*/
8994
- function () {
8995
- function Storage(player) {
8996
- _classCallCheck(this, Storage);
8997
-
8998
- this.enabled = player.config.storage.enabled;
8999
- this.key = player.config.storage.key;
9000
- } // Check for actual support (see if we can use it)
9001
-
9002
-
9003
- _createClass(Storage, [{
9004
- key: "get",
9005
- value: function get(key) {
9006
- if (!Storage.supported || !this.enabled) {
9007
- return null;
9008
- }
9009
-
9010
- var store = window.localStorage.getItem(this.key);
9011
-
9012
- if (is$1.empty(store)) {
9013
- return null;
9014
- }
9015
-
9016
- var json = JSON.parse(store);
9017
- return is$1.string(key) && key.length ? json[key] : json;
9018
- }
9019
- }, {
9020
- key: "set",
9021
- value: function set(object) {
9022
- // Bail if we don't have localStorage support or it's disabled
9023
- if (!Storage.supported || !this.enabled) {
9024
- return;
9025
- } // Can only store objectst
9026
-
9027
-
9028
- if (!is$1.object(object)) {
9029
- return;
9030
- } // Get current storage
9031
-
9032
-
9033
- var storage = this.get(); // Default to empty object
9034
-
9035
- if (is$1.empty(storage)) {
9036
- storage = {};
9037
- } // Update the working copy of the values
9038
-
9039
-
9040
- extend(storage, object); // Update storage
9041
-
9042
- window.localStorage.setItem(this.key, JSON.stringify(storage));
9043
- }
9044
- }], [{
9045
- key: "supported",
9046
- get: function get() {
9047
- try {
9048
- if (!('localStorage' in window)) {
9049
- return false;
9050
- }
9051
-
9052
- var test = '___test'; // Try to use it (it might be disabled, e.g. user is in private mode)
9053
- // see: https://github.com/sampotts/plyr/issues/131
9054
-
9055
- window.localStorage.setItem(test, test);
9056
- window.localStorage.removeItem(test);
9057
- return true;
9058
- } catch (e) {
9059
- return false;
9060
- }
9061
- }
9062
- }]);
9063
-
9064
- return Storage;
9065
- }();
9066
-
9067
- // ==========================================================================
9068
- // Fetch wrapper
9069
- // Using XHR to avoid issues with older browsers
9070
- // ==========================================================================
9071
- function fetch(url) {
9072
- var responseType = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'text';
9073
- return new Promise(function (resolve, reject) {
9074
- try {
9075
- var request = new XMLHttpRequest(); // Check for CORS support
9076
-
9077
- if (!('withCredentials' in request)) {
9078
- return;
9079
- }
9080
-
9081
- request.addEventListener('load', function () {
9082
- if (responseType === 'text') {
9083
- try {
9084
- resolve(JSON.parse(request.responseText));
9085
- } catch (e) {
9086
- resolve(request.responseText);
9087
- }
9088
- } else {
9089
- resolve(request.response);
9090
- }
9091
- });
9092
- request.addEventListener('error', function () {
9093
- throw new Error(request.status);
9094
- });
9095
- request.open('GET', url, true); // Set the required response type
9096
-
9097
- request.responseType = responseType;
9098
- request.send();
9099
- } catch (e) {
9100
- reject(e);
9101
- }
9102
- });
9103
- }
9104
-
9105
- // ==========================================================================
9106
-
9107
- function loadSprite(url, id) {
9108
- if (!is$1.string(url)) {
9109
- return;
9110
- }
9111
-
9112
- var prefix = 'cache';
9113
- var hasId = is$1.string(id);
9114
- var isCached = false;
9115
-
9116
- var exists = function exists() {
9117
- return document.getElementById(id) !== null;
9118
- };
9119
-
9120
- var update = function update(container, data) {
9121
- // eslint-disable-next-line no-param-reassign
9122
- container.innerHTML = data; // Check again incase of race condition
9123
-
9124
- if (hasId && exists()) {
9125
- return;
9126
- } // Inject the SVG to the body
9127
-
9128
-
9129
- document.body.insertAdjacentElement('afterbegin', container);
9130
- }; // Only load once if ID set
9131
-
9132
-
9133
- if (!hasId || !exists()) {
9134
- var useStorage = Storage.supported; // Create container
9135
-
9136
- var container = document.createElement('div');
9137
- container.setAttribute('hidden', '');
9138
-
9139
- if (hasId) {
9140
- container.setAttribute('id', id);
9141
- } // Check in cache
9142
-
9143
-
9144
- if (useStorage) {
9145
- var cached = window.localStorage.getItem("".concat(prefix, "-").concat(id));
9146
- isCached = cached !== null;
9147
-
9148
- if (isCached) {
9149
- var data = JSON.parse(cached);
9150
- update(container, data.content);
9151
- }
9152
- } // Get the sprite
9153
-
9154
-
9155
- fetch(url).then(function (result) {
9156
- if (is$1.empty(result)) {
9157
- return;
9158
- }
9159
-
9160
- if (useStorage) {
9161
- window.localStorage.setItem("".concat(prefix, "-").concat(id), JSON.stringify({
9162
- content: result
9163
- }));
9164
- }
9165
-
9166
- update(container, result);
9167
- }).catch(function () {});
9168
- }
9169
- }
9170
-
9171
- // ==========================================================================
9172
-
9173
- var getHours = function getHours(value) {
9174
- return Math.trunc(value / 60 / 60 % 60, 10);
9175
- };
9176
- var getMinutes = function getMinutes(value) {
9177
- return Math.trunc(value / 60 % 60, 10);
9178
- };
9179
- var getSeconds = function getSeconds(value) {
9180
- return Math.trunc(value % 60, 10);
9181
- }; // Format time to UI friendly string
9182
-
9183
- function formatTime() {
9184
- var time = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
9185
- var displayHours = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
9186
- var inverted = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
9187
-
9188
- // Bail if the value isn't a number
9189
- if (!is$1.number(time)) {
9190
- return formatTime(null, displayHours, inverted);
9191
- } // Format time component to add leading zero
9192
-
9193
-
9194
- var format = function format(value) {
9195
- return "0".concat(value).slice(-2);
9196
- }; // Breakdown to hours, mins, secs
9197
-
9198
-
9199
- var hours = getHours(time);
9200
- var mins = getMinutes(time);
9201
- var secs = getSeconds(time); // Do we need to display hours?
9202
-
9203
- if (displayHours || hours > 0) {
9204
- hours = "".concat(hours, ":");
9205
- } else {
9206
- hours = '';
9207
- } // Render
9208
-
9209
-
9210
- return "".concat(inverted && time > 0 ? '-' : '').concat(hours).concat(format(mins), ":").concat(format(secs));
9211
- }
9212
-
9213
- var controls = {
9214
- // Get icon URL
9215
- getIconUrl: function getIconUrl() {
9216
- var url = new URL(this.config.iconUrl, window.location);
9217
- var cors = url.host !== window.location.host || browser.isIE && !window.svg4everybody;
9218
- return {
9219
- url: this.config.iconUrl,
9220
- cors: cors
9221
- };
9222
- },
9223
- // Find the UI controls
9224
- findElements: function findElements() {
9225
- try {
9226
- this.elements.controls = getElement.call(this, this.config.selectors.controls.wrapper); // Buttons
9227
-
9228
- this.elements.buttons = {
9229
- play: getElements.call(this, this.config.selectors.buttons.play),
9230
- pause: getElement.call(this, this.config.selectors.buttons.pause),
9231
- restart: getElement.call(this, this.config.selectors.buttons.restart),
9232
- rewind: getElement.call(this, this.config.selectors.buttons.rewind),
9233
- fastForward: getElement.call(this, this.config.selectors.buttons.fastForward),
9234
- mute: getElement.call(this, this.config.selectors.buttons.mute),
9235
- pip: getElement.call(this, this.config.selectors.buttons.pip),
9236
- airplay: getElement.call(this, this.config.selectors.buttons.airplay),
9237
- settings: getElement.call(this, this.config.selectors.buttons.settings),
9238
- captions: getElement.call(this, this.config.selectors.buttons.captions),
9239
- fullscreen: getElement.call(this, this.config.selectors.buttons.fullscreen)
9240
- }; // Progress
9241
-
9242
- this.elements.progress = getElement.call(this, this.config.selectors.progress); // Inputs
9243
-
9244
- this.elements.inputs = {
9245
- seek: getElement.call(this, this.config.selectors.inputs.seek),
9246
- volume: getElement.call(this, this.config.selectors.inputs.volume)
9247
- }; // Display
9248
-
9249
- this.elements.display = {
9250
- buffer: getElement.call(this, this.config.selectors.display.buffer),
9251
- currentTime: getElement.call(this, this.config.selectors.display.currentTime),
9252
- duration: getElement.call(this, this.config.selectors.display.duration)
9253
- }; // Seek tooltip
9254
-
9255
- if (is$1.element(this.elements.progress)) {
9256
- this.elements.display.seekTooltip = this.elements.progress.querySelector(".".concat(this.config.classNames.tooltip));
9257
- }
9258
-
9259
- return true;
9260
- } catch (error) {
9261
- // Log it
9262
- this.debug.warn('It looks like there is a problem with your custom controls HTML', error); // Restore native video controls
9263
-
9264
- this.toggleNativeControls(true);
9265
- return false;
9266
- }
9267
- },
9268
- // Create <svg> icon
9269
- createIcon: function createIcon(type, attributes) {
9270
- var namespace = 'http://www.w3.org/2000/svg';
9271
- var iconUrl = controls.getIconUrl.call(this);
9272
- var iconPath = "".concat(!iconUrl.cors ? iconUrl.url : '', "#").concat(this.config.iconPrefix); // Create <svg>
9273
-
9274
- var icon = document.createElementNS(namespace, 'svg');
9275
- setAttributes(icon, extend(attributes, {
9276
- role: 'presentation',
9277
- focusable: 'false'
9278
- })); // Create the <use> to reference sprite
9279
-
9280
- var use = document.createElementNS(namespace, 'use');
9281
- var path = "".concat(iconPath, "-").concat(type); // Set `href` attributes
9282
- // https://github.com/sampotts/plyr/issues/460
9283
- // https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/xlink:href
9284
-
9285
- if ('href' in use) {
9286
- use.setAttributeNS('http://www.w3.org/1999/xlink', 'href', path);
9287
- } // Always set the older attribute even though it's "deprecated" (it'll be around for ages)
9288
-
9289
-
9290
- use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path); // Add <use> to <svg>
9291
-
9292
- icon.appendChild(use);
9293
- return icon;
9294
- },
9295
- // Create hidden text label
9296
- createLabel: function createLabel(key) {
9297
- var attr = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
9298
- var text = i18n.get(key, this.config);
9299
- var attributes = Object.assign({}, attr, {
9300
- class: [attr.class, this.config.classNames.hidden].filter(Boolean).join(' ')
9301
- });
9302
- return createElement('span', attributes, text);
9303
- },
9304
- // Create a badge
9305
- createBadge: function createBadge(text) {
9306
- if (is$1.empty(text)) {
9307
- return null;
9308
- }
9309
-
9310
- var badge = createElement('span', {
9311
- class: this.config.classNames.menu.value
9312
- });
9313
- badge.appendChild(createElement('span', {
9314
- class: this.config.classNames.menu.badge
9315
- }, text));
9316
- return badge;
9317
- },
9318
- // Create a <button>
9319
- createButton: function createButton(buttonType, attr) {
9320
- var _this = this;
9321
-
9322
- var attributes = extend({}, attr);
9323
- var type = toCamelCase(buttonType);
9324
- var props = {
9325
- element: 'button',
9326
- toggle: false,
9327
- label: null,
9328
- icon: null,
9329
- labelPressed: null,
9330
- iconPressed: null
9331
- };
9332
- ['element', 'icon', 'label'].forEach(function (key) {
9333
- if (Object.keys(attributes).includes(key)) {
9334
- props[key] = attributes[key];
9335
- delete attributes[key];
9336
- }
9337
- }); // Default to 'button' type to prevent form submission
9338
-
9339
- if (props.element === 'button' && !Object.keys(attributes).includes('type')) {
9340
- attributes.type = 'button';
9341
- } // Set class name
9342
-
9343
-
9344
- if (Object.keys(attributes).includes('class')) {
9345
- if (!attributes.class.split(' ').some(function (c) {
9346
- return c === _this.config.classNames.control;
9347
- })) {
9348
- extend(attributes, {
9349
- class: "".concat(attributes.class, " ").concat(this.config.classNames.control)
9350
- });
9351
- }
9352
- } else {
9353
- attributes.class = this.config.classNames.control;
9354
- } // Large play button
9355
-
9356
-
9357
- switch (buttonType) {
9358
- case 'play':
9359
- props.toggle = true;
9360
- props.label = 'play';
9361
- props.labelPressed = 'pause';
9362
- props.icon = 'play';
9363
- props.iconPressed = 'pause';
9364
- break;
9365
-
9366
- case 'mute':
9367
- props.toggle = true;
9368
- props.label = 'mute';
9369
- props.labelPressed = 'unmute';
9370
- props.icon = 'volume';
9371
- props.iconPressed = 'muted';
9372
- break;
9373
-
9374
- case 'captions':
9375
- props.toggle = true;
9376
- props.label = 'enableCaptions';
9377
- props.labelPressed = 'disableCaptions';
9378
- props.icon = 'captions-off';
9379
- props.iconPressed = 'captions-on';
9380
- break;
9381
-
9382
- case 'fullscreen':
9383
- props.toggle = true;
9384
- props.label = 'enterFullscreen';
9385
- props.labelPressed = 'exitFullscreen';
9386
- props.icon = 'enter-fullscreen';
9387
- props.iconPressed = 'exit-fullscreen';
9388
- break;
9389
-
9390
- case 'play-large':
9391
- attributes.class += " ".concat(this.config.classNames.control, "--overlaid");
9392
- type = 'play';
9393
- props.label = 'play';
9394
- props.icon = 'play';
9395
- break;
9396
-
9397
- default:
9398
- if (is$1.empty(props.label)) {
9399
- props.label = type;
9400
- }
9401
-
9402
- if (is$1.empty(props.icon)) {
9403
- props.icon = buttonType;
9404
- }
9405
-
9406
- }
9407
-
9408
- var button = createElement(props.element); // Setup toggle icon and labels
9409
-
9410
- if (props.toggle) {
9411
- // Icon
9412
- button.appendChild(controls.createIcon.call(this, props.iconPressed, {
9413
- class: 'icon--pressed'
9414
- }));
9415
- button.appendChild(controls.createIcon.call(this, props.icon, {
9416
- class: 'icon--not-pressed'
9417
- })); // Label/Tooltip
9418
-
9419
- button.appendChild(controls.createLabel.call(this, props.labelPressed, {
9420
- class: 'label--pressed'
9421
- }));
9422
- button.appendChild(controls.createLabel.call(this, props.label, {
9423
- class: 'label--not-pressed'
9424
- }));
9425
- } else {
9426
- button.appendChild(controls.createIcon.call(this, props.icon));
9427
- button.appendChild(controls.createLabel.call(this, props.label));
9428
- } // Merge and set attributes
9429
-
9430
-
9431
- extend(attributes, getAttributesFromSelector(this.config.selectors.buttons[type], attributes));
9432
- setAttributes(button, attributes); // We have multiple play buttons
9433
-
9434
- if (type === 'play') {
9435
- if (!is$1.array(this.elements.buttons[type])) {
9436
- this.elements.buttons[type] = [];
9437
- }
9438
-
9439
- this.elements.buttons[type].push(button);
9440
- } else {
9441
- this.elements.buttons[type] = button;
9442
- }
9443
-
9444
- return button;
9445
- },
9446
- // Create an <input type='range'>
9447
- createRange: function createRange(type, attributes) {
9448
- // Seek input
9449
- var input = createElement('input', extend(getAttributesFromSelector(this.config.selectors.inputs[type]), {
9450
- type: 'range',
9451
- min: 0,
9452
- max: 100,
9453
- step: 0.01,
9454
- value: 0,
9455
- autocomplete: 'off',
9456
- // A11y fixes for https://github.com/sampotts/plyr/issues/905
9457
- role: 'slider',
9458
- 'aria-label': i18n.get(type, this.config),
9459
- 'aria-valuemin': 0,
9460
- 'aria-valuemax': 100,
9461
- 'aria-valuenow': 0
9462
- }, attributes));
9463
- this.elements.inputs[type] = input; // Set the fill for webkit now
9464
-
9465
- controls.updateRangeFill.call(this, input); // Improve support on touch devices
9466
-
9467
- RangeTouch.setup(input);
9468
- return input;
9469
- },
9470
- // Create a <progress>
9471
- createProgress: function createProgress(type, attributes) {
9472
- var progress = createElement('progress', extend(getAttributesFromSelector(this.config.selectors.display[type]), {
9473
- min: 0,
9474
- max: 100,
9475
- value: 0,
9476
- role: 'progressbar',
9477
- 'aria-hidden': true
9478
- }, attributes)); // Create the label inside
9479
-
9480
- if (type !== 'volume') {
9481
- progress.appendChild(createElement('span', null, '0'));
9482
- var suffixKey = {
9483
- played: 'played',
9484
- buffer: 'buffered'
9485
- }[type];
9486
- var suffix = suffixKey ? i18n.get(suffixKey, this.config) : '';
9487
- progress.innerText = "% ".concat(suffix.toLowerCase());
9488
- }
9489
-
9490
- this.elements.display[type] = progress;
9491
- return progress;
9492
- },
9493
- // Create time display
9494
- createTime: function createTime(type, attrs) {
9495
- var attributes = getAttributesFromSelector(this.config.selectors.display[type], attrs);
9496
- var container = createElement('div', extend(attributes, {
9497
- class: "".concat(attributes.class ? attributes.class : '', " ").concat(this.config.classNames.display.time, " ").trim(),
9498
- 'aria-label': i18n.get(type, this.config)
9499
- }), '00:00'); // Reference for updates
9500
-
9501
- this.elements.display[type] = container;
9502
- return container;
9503
- },
9504
- // Bind keyboard shortcuts for a menu item
9505
- // We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus
9506
- // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143
9507
- bindMenuItemShortcuts: function bindMenuItemShortcuts(menuItem, type) {
9508
- var _this2 = this;
9509
-
9510
- // Navigate through menus via arrow keys and space
9511
- on(menuItem, 'keydown keyup', function (event) {
9512
- // We only care about space and ⬆️ ⬇️️ ➡️
9513
- if (![32, 38, 39, 40].includes(event.which)) {
9514
- return;
9515
- } // Prevent play / seek
9516
-
9517
-
9518
- event.preventDefault();
9519
- event.stopPropagation(); // We're just here to prevent the keydown bubbling
9520
-
9521
- if (event.type === 'keydown') {
9522
- return;
9523
- }
9524
-
9525
- var isRadioButton = matches$1(menuItem, '[role="menuitemradio"]'); // Show the respective menu
9526
-
9527
- if (!isRadioButton && [32, 39].includes(event.which)) {
9528
- controls.showMenuPanel.call(_this2, type, true);
9529
- } else {
9530
- var target;
9531
-
9532
- if (event.which !== 32) {
9533
- if (event.which === 40 || isRadioButton && event.which === 39) {
9534
- target = menuItem.nextElementSibling;
9535
-
9536
- if (!is$1.element(target)) {
9537
- target = menuItem.parentNode.firstElementChild;
9538
- }
9539
- } else {
9540
- target = menuItem.previousElementSibling;
9541
-
9542
- if (!is$1.element(target)) {
9543
- target = menuItem.parentNode.lastElementChild;
9544
- }
9545
- }
9546
-
9547
- setFocus.call(_this2, target, true);
9548
- }
9549
- }
9550
- }, false); // Enter will fire a `click` event but we still need to manage focus
9551
- // So we bind to keyup which fires after and set focus here
9552
-
9553
- on(menuItem, 'keyup', function (event) {
9554
- if (event.which !== 13) {
9555
- return;
9556
- }
9557
-
9558
- controls.focusFirstMenuItem.call(_this2, null, true);
9559
- });
9560
- },
9561
- // Create a settings menu item
9562
- createMenuItem: function createMenuItem(_ref) {
9563
- var _this3 = this;
9564
-
9565
- var value = _ref.value,
9566
- list = _ref.list,
9567
- type = _ref.type,
9568
- title = _ref.title,
9569
- _ref$badge = _ref.badge,
9570
- badge = _ref$badge === void 0 ? null : _ref$badge,
9571
- _ref$checked = _ref.checked,
9572
- checked = _ref$checked === void 0 ? false : _ref$checked;
9573
- var attributes = getAttributesFromSelector(this.config.selectors.inputs[type]);
9574
- var menuItem = createElement('button', extend(attributes, {
9575
- type: 'button',
9576
- role: 'menuitemradio',
9577
- class: "".concat(this.config.classNames.control, " ").concat(attributes.class ? attributes.class : '').trim(),
9578
- 'aria-checked': checked,
9579
- value: value
9580
- }));
9581
- var flex = createElement('span'); // We have to set as HTML incase of special characters
9582
-
9583
- flex.innerHTML = title;
9584
-
9585
- if (is$1.element(badge)) {
9586
- flex.appendChild(badge);
9587
- }
9588
-
9589
- menuItem.appendChild(flex); // Replicate radio button behaviour
9590
-
9591
- Object.defineProperty(menuItem, 'checked', {
9592
- enumerable: true,
9593
- get: function get() {
9594
- return menuItem.getAttribute('aria-checked') === 'true';
9595
- },
9596
- set: function set(check) {
9597
- // Ensure exclusivity
9598
- if (check) {
9599
- Array.from(menuItem.parentNode.children).filter(function (node) {
9600
- return matches$1(node, '[role="menuitemradio"]');
9601
- }).forEach(function (node) {
9602
- return node.setAttribute('aria-checked', 'false');
9603
- });
9604
- }
9605
-
9606
- menuItem.setAttribute('aria-checked', check ? 'true' : 'false');
9607
- }
9608
- });
9609
- this.listeners.bind(menuItem, 'click keyup', function (event) {
9610
- if (is$1.keyboardEvent(event) && event.which !== 32) {
9611
- return;
9612
- }
9613
-
9614
- event.preventDefault();
9615
- event.stopPropagation();
9616
- menuItem.checked = true;
9617
-
9618
- switch (type) {
9619
- case 'language':
9620
- _this3.currentTrack = Number(value);
9621
- break;
9622
-
9623
- case 'quality':
9624
- _this3.quality = value;
9625
- break;
9626
-
9627
- case 'speed':
9628
- _this3.speed = parseFloat(value);
9629
- break;
9630
-
9631
- default:
9632
- break;
9633
- }
9634
-
9635
- controls.showMenuPanel.call(_this3, 'home', is$1.keyboardEvent(event));
9636
- }, type, false);
9637
- controls.bindMenuItemShortcuts.call(this, menuItem, type);
9638
- list.appendChild(menuItem);
9639
- },
9640
- // Format a time for display
9641
- formatTime: function formatTime$1() {
9642
- var time = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
9643
- var inverted = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
9644
-
9645
- // Bail if the value isn't a number
9646
- if (!is$1.number(time)) {
9647
- return time;
9648
- } // Always display hours if duration is over an hour
9649
-
9650
-
9651
- var forceHours = getHours(this.duration) > 0;
9652
- return formatTime(time, forceHours, inverted);
9653
- },
9654
- // Update the displayed time
9655
- updateTimeDisplay: function updateTimeDisplay() {
9656
- var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
9657
- var time = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
9658
- var inverted = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
9659
-
9660
- // Bail if there's no element to display or the value isn't a number
9661
- if (!is$1.element(target) || !is$1.number(time)) {
9662
- return;
9663
- } // eslint-disable-next-line no-param-reassign
9664
-
9665
-
9666
- target.innerText = controls.formatTime(time, inverted);
9667
- },
9668
- // Update volume UI and storage
9669
- updateVolume: function updateVolume() {
9670
- if (!this.supported.ui) {
9671
- return;
9672
- } // Update range
9673
-
9674
-
9675
- if (is$1.element(this.elements.inputs.volume)) {
9676
- controls.setRange.call(this, this.elements.inputs.volume, this.muted ? 0 : this.volume);
9677
- } // Update mute state
9678
-
9679
-
9680
- if (is$1.element(this.elements.buttons.mute)) {
9681
- this.elements.buttons.mute.pressed = this.muted || this.volume === 0;
9682
- }
9683
- },
9684
- // Update seek value and lower fill
9685
- setRange: function setRange(target) {
9686
- var value = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
9687
-
9688
- if (!is$1.element(target)) {
9689
- return;
9690
- } // eslint-disable-next-line
9691
-
9692
-
9693
- target.value = value; // Webkit range fill
9694
-
9695
- controls.updateRangeFill.call(this, target);
9696
- },
9697
- // Update <progress> elements
9698
- updateProgress: function updateProgress(event) {
9699
- var _this4 = this;
9700
-
9701
- if (!this.supported.ui || !is$1.event(event)) {
9702
- return;
9703
- }
9704
-
9705
- var value = 0;
9706
-
9707
- var setProgress = function setProgress(target, input) {
9708
- var val = is$1.number(input) ? input : 0;
9709
- var progress = is$1.element(target) ? target : _this4.elements.display.buffer; // Update value and label
9710
-
9711
- if (is$1.element(progress)) {
9712
- progress.value = val; // Update text label inside
9713
-
9714
- var label = progress.getElementsByTagName('span')[0];
9715
-
9716
- if (is$1.element(label)) {
9717
- label.childNodes[0].nodeValue = val;
9718
- }
9719
- }
9720
- };
9721
-
9722
- if (event) {
9723
- switch (event.type) {
9724
- // Video playing
9725
- case 'timeupdate':
9726
- case 'seeking':
9727
- case 'seeked':
9728
- value = getPercentage(this.currentTime, this.duration); // Set seek range value only if it's a 'natural' time event
9729
-
9730
- if (event.type === 'timeupdate') {
9731
- controls.setRange.call(this, this.elements.inputs.seek, value);
9732
- }
9733
-
9734
- break;
9735
- // Check buffer status
9736
-
9737
- case 'playing':
9738
- case 'progress':
9739
- setProgress(this.elements.display.buffer, this.buffered * 100);
9740
- break;
9741
-
9742
- default:
9743
- break;
9744
- }
9745
- }
9746
- },
9747
- // Webkit polyfill for lower fill range
9748
- updateRangeFill: function updateRangeFill(target) {
9749
- // Get range from event if event passed
9750
- var range = is$1.event(target) ? target.target : target; // Needs to be a valid <input type='range'>
9751
-
9752
- if (!is$1.element(range) || range.getAttribute('type') !== 'range') {
9753
- return;
9754
- } // Set aria values for https://github.com/sampotts/plyr/issues/905
9755
-
9756
-
9757
- if (matches$1(range, this.config.selectors.inputs.seek)) {
9758
- range.setAttribute('aria-valuenow', this.currentTime);
9759
- var currentTime = controls.formatTime(this.currentTime);
9760
- var duration = controls.formatTime(this.duration);
9761
- var format = i18n.get('seekLabel', this.config);
9762
- range.setAttribute('aria-valuetext', format.replace('{currentTime}', currentTime).replace('{duration}', duration));
9763
- } else if (matches$1(range, this.config.selectors.inputs.volume)) {
9764
- var percent = range.value * 100;
9765
- range.setAttribute('aria-valuenow', percent);
9766
- range.setAttribute('aria-valuetext', "".concat(percent.toFixed(1), "%"));
9767
- } else {
9768
- range.setAttribute('aria-valuenow', range.value);
9769
- } // WebKit only
9770
-
9771
-
9772
- if (!browser.isWebkit) {
9773
- return;
9774
- } // Set CSS custom property
9775
-
9776
-
9777
- range.style.setProperty('--value', "".concat(range.value / range.max * 100, "%"));
9778
- },
9779
- // Update hover tooltip for seeking
9780
- updateSeekTooltip: function updateSeekTooltip(event) {
9781
- var _this5 = this;
9782
-
9783
- // Bail if setting not true
9784
- if (!this.config.tooltips.seek || !is$1.element(this.elements.inputs.seek) || !is$1.element(this.elements.display.seekTooltip) || this.duration === 0) {
9785
- return;
9786
- }
9787
-
9788
- var visible = "".concat(this.config.classNames.tooltip, "--visible");
9789
-
9790
- var toggle = function toggle(show) {
9791
- return toggleClass(_this5.elements.display.seekTooltip, visible, show);
9792
- }; // Hide on touch
9793
-
9794
-
9795
- if (this.touch) {
9796
- toggle(false);
9797
- return;
9798
- } // Determine percentage, if already visible
9799
-
9800
-
9801
- var percent = 0;
9802
- var clientRect = this.elements.progress.getBoundingClientRect();
9803
-
9804
- if (is$1.event(event)) {
9805
- percent = 100 / clientRect.width * (event.pageX - clientRect.left);
9806
- } else if (hasClass(this.elements.display.seekTooltip, visible)) {
9807
- percent = parseFloat(this.elements.display.seekTooltip.style.left, 10);
9808
- } else {
9809
- return;
9810
- } // Set bounds
9811
-
9812
-
9813
- if (percent < 0) {
9814
- percent = 0;
9815
- } else if (percent > 100) {
9816
- percent = 100;
9817
- } // Display the time a click would seek to
9818
-
9819
-
9820
- controls.updateTimeDisplay.call(this, this.elements.display.seekTooltip, this.duration / 100 * percent); // Set position
9821
-
9822
- this.elements.display.seekTooltip.style.left = "".concat(percent, "%"); // Show/hide the tooltip
9823
- // If the event is a moues in/out and percentage is inside bounds
9824
-
9825
- if (is$1.event(event) && ['mouseenter', 'mouseleave'].includes(event.type)) {
9826
- toggle(event.type === 'mouseenter');
9827
- }
9828
- },
9829
- // Handle time change event
9830
- timeUpdate: function timeUpdate(event) {
9831
- // Only invert if only one time element is displayed and used for both duration and currentTime
9832
- var invert = !is$1.element(this.elements.display.duration) && this.config.invertTime; // Duration
9833
-
9834
- controls.updateTimeDisplay.call(this, this.elements.display.currentTime, invert ? this.duration - this.currentTime : this.currentTime, invert); // Ignore updates while seeking
9835
-
9836
- if (event && event.type === 'timeupdate' && this.media.seeking) {
9837
- return;
9838
- } // Playing progress
9839
-
9840
-
9841
- controls.updateProgress.call(this, event);
9842
- },
9843
- // Show the duration on metadataloaded or durationchange events
9844
- durationUpdate: function durationUpdate() {
9845
- // Bail if no UI or durationchange event triggered after playing/seek when invertTime is false
9846
- if (!this.supported.ui || !this.config.invertTime && this.currentTime) {
9847
- return;
9848
- } // If duration is the 2**32 (shaka), Infinity (HLS), DASH-IF (Number.MAX_SAFE_INTEGER || Number.MAX_VALUE) indicating live we hide the currentTime and progressbar.
9849
- // https://github.com/video-dev/hls.js/blob/5820d29d3c4c8a46e8b75f1e3afa3e68c1a9a2db/src/controller/buffer-controller.js#L415
9850
- // https://github.com/google/shaka-player/blob/4d889054631f4e1cf0fbd80ddd2b71887c02e232/lib/media/streaming_engine.js#L1062
9851
- // https://github.com/Dash-Industry-Forum/dash.js/blob/69859f51b969645b234666800d4cb596d89c602d/src/dash/models/DashManifestModel.js#L338
9852
-
9853
-
9854
- if (this.duration >= Math.pow(2, 32)) {
9855
- toggleHidden(this.elements.display.currentTime, true);
9856
- toggleHidden(this.elements.progress, true);
9857
- return;
9858
- } // Update ARIA values
9859
-
9860
-
9861
- if (is$1.element(this.elements.inputs.seek)) {
9862
- this.elements.inputs.seek.setAttribute('aria-valuemax', this.duration);
9863
- } // If there's a spot to display duration
9864
-
9865
-
9866
- var hasDuration = is$1.element(this.elements.display.duration); // If there's only one time display, display duration there
9867
-
9868
- if (!hasDuration && this.config.displayDuration && this.paused) {
9869
- controls.updateTimeDisplay.call(this, this.elements.display.currentTime, this.duration);
9870
- } // If there's a duration element, update content
9871
-
9872
-
9873
- if (hasDuration) {
9874
- controls.updateTimeDisplay.call(this, this.elements.display.duration, this.duration);
9875
- } // Update the tooltip (if visible)
9876
-
9877
-
9878
- controls.updateSeekTooltip.call(this);
9879
- },
9880
- // Hide/show a tab
9881
- toggleMenuButton: function toggleMenuButton(setting, toggle) {
9882
- toggleHidden(this.elements.settings.buttons[setting], !toggle);
9883
- },
9884
- // Update the selected setting
9885
- updateSetting: function updateSetting(setting, container, input) {
9886
- var pane = this.elements.settings.panels[setting];
9887
- var value = null;
9888
- var list = container;
9889
-
9890
- if (setting === 'captions') {
9891
- value = this.currentTrack;
9892
- } else {
9893
- value = !is$1.empty(input) ? input : this[setting]; // Get default
9894
-
9895
- if (is$1.empty(value)) {
9896
- value = this.config[setting].default;
9897
- } // Unsupported value
9898
-
9899
-
9900
- if (!is$1.empty(this.options[setting]) && !this.options[setting].includes(value)) {
9901
- this.debug.warn("Unsupported value of '".concat(value, "' for ").concat(setting));
9902
- return;
9903
- } // Disabled value
9904
-
9905
-
9906
- if (!this.config[setting].options.includes(value)) {
9907
- this.debug.warn("Disabled value of '".concat(value, "' for ").concat(setting));
9908
- return;
9909
- }
9910
- } // Get the list if we need to
9911
-
9912
-
9913
- if (!is$1.element(list)) {
9914
- list = pane && pane.querySelector('[role="menu"]');
9915
- } // If there's no list it means it's not been rendered...
9916
-
9917
-
9918
- if (!is$1.element(list)) {
9919
- return;
9920
- } // Update the label
9921
-
9922
-
9923
- var label = this.elements.settings.buttons[setting].querySelector(".".concat(this.config.classNames.menu.value));
9924
- label.innerHTML = controls.getLabel.call(this, setting, value); // Find the radio option and check it
9925
-
9926
- var target = list && list.querySelector("[value=\"".concat(value, "\"]"));
9927
-
9928
- if (is$1.element(target)) {
9929
- target.checked = true;
9930
- }
9931
- },
9932
- // Translate a value into a nice label
9933
- getLabel: function getLabel(setting, value) {
9934
- switch (setting) {
9935
- case 'speed':
9936
- return value === 1 ? i18n.get('normal', this.config) : "".concat(value, "&times;");
9937
-
9938
- case 'quality':
9939
- if (is$1.number(value)) {
9940
- var label = i18n.get("qualityLabel.".concat(value), this.config);
9941
-
9942
- if (!label.length) {
9943
- return "".concat(value, "p");
9944
- }
9945
-
9946
- return label;
9947
- }
9948
-
9949
- return toTitleCase(value);
9950
-
9951
- case 'captions':
9952
- return captions.getLabel.call(this);
9953
-
9954
- default:
9955
- return null;
9956
- }
9957
- },
9958
- // Set the quality menu
9959
- setQualityMenu: function setQualityMenu(options) {
9960
- var _this6 = this;
9961
-
9962
- // Menu required
9963
- if (!is$1.element(this.elements.settings.panels.quality)) {
9964
- return;
9965
- }
9966
-
9967
- var type = 'quality';
9968
- var list = this.elements.settings.panels.quality.querySelector('[role="menu"]'); // Set options if passed and filter based on uniqueness and config
9969
-
9970
- if (is$1.array(options)) {
9971
- this.options.quality = dedupe(options).filter(function (quality) {
9972
- return _this6.config.quality.options.includes(quality);
9973
- });
9974
- } // Toggle the pane and tab
9975
-
9976
-
9977
- var toggle = !is$1.empty(this.options.quality) && this.options.quality.length > 1;
9978
- controls.toggleMenuButton.call(this, type, toggle); // Empty the menu
9979
-
9980
- emptyElement(list); // Check if we need to toggle the parent
9981
-
9982
- controls.checkMenu.call(this); // If we're hiding, nothing more to do
9983
-
9984
- if (!toggle) {
9985
- return;
9986
- } // Get the badge HTML for HD, 4K etc
9987
-
9988
-
9989
- var getBadge = function getBadge(quality) {
9990
- var label = i18n.get("qualityBadge.".concat(quality), _this6.config);
9991
-
9992
- if (!label.length) {
9993
- return null;
9994
- }
9995
-
9996
- return controls.createBadge.call(_this6, label);
9997
- }; // Sort options by the config and then render options
9998
-
9999
-
10000
- this.options.quality.sort(function (a, b) {
10001
- var sorting = _this6.config.quality.options;
10002
- return sorting.indexOf(a) > sorting.indexOf(b) ? 1 : -1;
10003
- }).forEach(function (quality) {
10004
- controls.createMenuItem.call(_this6, {
10005
- value: quality,
10006
- list: list,
10007
- type: type,
10008
- title: controls.getLabel.call(_this6, 'quality', quality),
10009
- badge: getBadge(quality)
10010
- });
10011
- });
10012
- controls.updateSetting.call(this, type, list);
10013
- },
10014
- // Set the looping options
10015
-
10016
- /* setLoopMenu() {
10017
- // Menu required
10018
- if (!is.element(this.elements.settings.panels.loop)) {
10019
- return;
10020
- }
10021
- const options = ['start', 'end', 'all', 'reset'];
10022
- const list = this.elements.settings.panels.loop.querySelector('[role="menu"]');
10023
- // Show the pane and tab
10024
- toggleHidden(this.elements.settings.buttons.loop, false);
10025
- toggleHidden(this.elements.settings.panels.loop, false);
10026
- // Toggle the pane and tab
10027
- const toggle = !is.empty(this.loop.options);
10028
- controls.toggleMenuButton.call(this, 'loop', toggle);
10029
- // Empty the menu
10030
- emptyElement(list);
10031
- options.forEach(option => {
10032
- const item = createElement('li');
10033
- const button = createElement(
10034
- 'button',
10035
- extend(getAttributesFromSelector(this.config.selectors.buttons.loop), {
10036
- type: 'button',
10037
- class: this.config.classNames.control,
10038
- 'data-plyr-loop-action': option,
10039
- }),
10040
- i18n.get(option, this.config)
10041
- );
10042
- if (['start', 'end'].includes(option)) {
10043
- const badge = controls.createBadge.call(this, '00:00');
10044
- button.appendChild(badge);
10045
- }
10046
- item.appendChild(button);
10047
- list.appendChild(item);
10048
- });
10049
- }, */
10050
- // Get current selected caption language
10051
- // TODO: rework this to user the getter in the API?
10052
- // Set a list of available captions languages
10053
- setCaptionsMenu: function setCaptionsMenu() {
10054
- var _this7 = this;
10055
-
10056
- // Menu required
10057
- if (!is$1.element(this.elements.settings.panels.captions)) {
10058
- return;
10059
- } // TODO: Captions or language? Currently it's mixed
10060
-
10061
-
10062
- var type = 'captions';
10063
- var list = this.elements.settings.panels.captions.querySelector('[role="menu"]');
10064
- var tracks = captions.getTracks.call(this);
10065
- var toggle = Boolean(tracks.length); // Toggle the pane and tab
10066
-
10067
- controls.toggleMenuButton.call(this, type, toggle); // Empty the menu
10068
-
10069
- emptyElement(list); // Check if we need to toggle the parent
10070
-
10071
- controls.checkMenu.call(this); // If there's no captions, bail
10072
-
10073
- if (!toggle) {
10074
- return;
10075
- } // Generate options data
10076
-
10077
-
10078
- var options = tracks.map(function (track, value) {
10079
- return {
10080
- value: value,
10081
- checked: _this7.captions.toggled && _this7.currentTrack === value,
10082
- title: captions.getLabel.call(_this7, track),
10083
- badge: track.language && controls.createBadge.call(_this7, track.language.toUpperCase()),
10084
- list: list,
10085
- type: 'language'
10086
- };
10087
- }); // Add the "Disabled" option to turn off captions
10088
-
10089
- options.unshift({
10090
- value: -1,
10091
- checked: !this.captions.toggled,
10092
- title: i18n.get('disabled', this.config),
10093
- list: list,
10094
- type: 'language'
10095
- }); // Generate options
10096
-
10097
- options.forEach(controls.createMenuItem.bind(this));
10098
- controls.updateSetting.call(this, type, list);
10099
- },
10100
- // Set a list of available captions languages
10101
- setSpeedMenu: function setSpeedMenu(options) {
10102
- var _this8 = this;
10103
-
10104
- // Menu required
10105
- if (!is$1.element(this.elements.settings.panels.speed)) {
10106
- return;
10107
- }
10108
-
10109
- var type = 'speed';
10110
- var list = this.elements.settings.panels.speed.querySelector('[role="menu"]'); // Set the speed options
10111
-
10112
- if (is$1.array(options)) {
10113
- this.options.speed = options;
10114
- } else if (this.isHTML5 || this.isVimeo) {
10115
- this.options.speed = [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2];
10116
- } // Set options if passed and filter based on config
10117
-
10118
-
10119
- this.options.speed = this.options.speed.filter(function (speed) {
10120
- return _this8.config.speed.options.includes(speed);
10121
- }); // Toggle the pane and tab
10122
-
10123
- var toggle = !is$1.empty(this.options.speed) && this.options.speed.length > 1;
10124
- controls.toggleMenuButton.call(this, type, toggle); // Empty the menu
10125
-
10126
- emptyElement(list); // Check if we need to toggle the parent
10127
-
10128
- controls.checkMenu.call(this); // If we're hiding, nothing more to do
10129
-
10130
- if (!toggle) {
10131
- return;
10132
- } // Create items
10133
-
10134
-
10135
- this.options.speed.forEach(function (speed) {
10136
- controls.createMenuItem.call(_this8, {
10137
- value: speed,
10138
- list: list,
10139
- type: type,
10140
- title: controls.getLabel.call(_this8, 'speed', speed)
10141
- });
10142
- });
10143
- controls.updateSetting.call(this, type, list);
10144
- },
10145
- // Check if we need to hide/show the settings menu
10146
- checkMenu: function checkMenu() {
10147
- var buttons = this.elements.settings.buttons;
10148
- var visible = !is$1.empty(buttons) && Object.values(buttons).some(function (button) {
10149
- return !button.hidden;
10150
- });
10151
- toggleHidden(this.elements.settings.menu, !visible);
10152
- },
10153
- // Focus the first menu item in a given (or visible) menu
10154
- focusFirstMenuItem: function focusFirstMenuItem(pane) {
10155
- var tabFocus = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
10156
-
10157
- if (this.elements.settings.popup.hidden) {
10158
- return;
10159
- }
10160
-
10161
- var target = pane;
10162
-
10163
- if (!is$1.element(target)) {
10164
- target = Object.values(this.elements.settings.panels).find(function (p) {
10165
- return !p.hidden;
10166
- });
10167
- }
10168
-
10169
- var firstItem = target.querySelector('[role^="menuitem"]');
10170
- setFocus.call(this, firstItem, tabFocus);
10171
- },
10172
- // Show/hide menu
10173
- toggleMenu: function toggleMenu(input) {
10174
- var popup = this.elements.settings.popup;
10175
- var button = this.elements.buttons.settings; // Menu and button are required
10176
-
10177
- if (!is$1.element(popup) || !is$1.element(button)) {
10178
- return;
10179
- } // True toggle by default
10180
-
10181
-
10182
- var hidden = popup.hidden;
10183
- var show = hidden;
10184
-
10185
- if (is$1.boolean(input)) {
10186
- show = input;
10187
- } else if (is$1.keyboardEvent(input) && input.which === 27) {
10188
- show = false;
10189
- } else if (is$1.event(input)) {
10190
- // If Plyr is in a shadowDOM, the event target is set to the component, instead of the
10191
- // Element in the shadowDOM. The path, if available, is complete.
10192
- var target = is$1.function(input.composedPath) ? input.composedPath()[0] : input.target;
10193
- var isMenuItem = popup.contains(target); // If the click was inside the menu or if the click
10194
- // wasn't the button or menu item and we're trying to
10195
- // show the menu (a doc click shouldn't show the menu)
10196
-
10197
- if (isMenuItem || !isMenuItem && input.target !== button && show) {
10198
- return;
10199
- }
10200
- } // Set button attributes
10201
-
10202
-
10203
- button.setAttribute('aria-expanded', show); // Show the actual popup
10204
-
10205
- toggleHidden(popup, !show); // Add class hook
10206
-
10207
- toggleClass(this.elements.container, this.config.classNames.menu.open, show); // Focus the first item if key interaction
10208
-
10209
- if (show && is$1.keyboardEvent(input)) {
10210
- controls.focusFirstMenuItem.call(this, null, true);
10211
- } else if (!show && !hidden) {
10212
- // If closing, re-focus the button
10213
- setFocus.call(this, button, is$1.keyboardEvent(input));
10214
- }
10215
- },
10216
- // Get the natural size of a menu panel
10217
- getMenuSize: function getMenuSize(tab) {
10218
- var clone = tab.cloneNode(true);
10219
- clone.style.position = 'absolute';
10220
- clone.style.opacity = 0;
10221
- clone.removeAttribute('hidden'); // Append to parent so we get the "real" size
10222
-
10223
- tab.parentNode.appendChild(clone); // Get the sizes before we remove
10224
-
10225
- var width = clone.scrollWidth;
10226
- var height = clone.scrollHeight; // Remove from the DOM
10227
-
10228
- removeElement(clone);
10229
- return {
10230
- width: width,
10231
- height: height
10232
- };
10233
- },
10234
- // Show a panel in the menu
10235
- showMenuPanel: function showMenuPanel() {
10236
- var _this9 = this;
10237
-
10238
- var type = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
10239
- var tabFocus = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
10240
- var target = this.elements.container.querySelector("#plyr-settings-".concat(this.id, "-").concat(type)); // Nothing to show, bail
10241
-
10242
- if (!is$1.element(target)) {
10243
- return;
10244
- } // Hide all other panels
10245
-
10246
-
10247
- var container = target.parentNode;
10248
- var current = Array.from(container.children).find(function (node) {
10249
- return !node.hidden;
10250
- }); // If we can do fancy animations, we'll animate the height/width
10251
-
10252
- if (support.transitions && !support.reducedMotion) {
10253
- // Set the current width as a base
10254
- container.style.width = "".concat(current.scrollWidth, "px");
10255
- container.style.height = "".concat(current.scrollHeight, "px"); // Get potential sizes
10256
-
10257
- var size = controls.getMenuSize.call(this, target); // Restore auto height/width
10258
-
10259
- var restore = function restore(event) {
10260
- // We're only bothered about height and width on the container
10261
- if (event.target !== container || !['width', 'height'].includes(event.propertyName)) {
10262
- return;
10263
- } // Revert back to auto
10264
-
10265
-
10266
- container.style.width = '';
10267
- container.style.height = ''; // Only listen once
10268
-
10269
- off.call(_this9, container, transitionEndEvent, restore);
10270
- }; // Listen for the transition finishing and restore auto height/width
10271
-
10272
-
10273
- on.call(this, container, transitionEndEvent, restore); // Set dimensions to target
10274
-
10275
- container.style.width = "".concat(size.width, "px");
10276
- container.style.height = "".concat(size.height, "px");
10277
- } // Set attributes on current tab
10278
-
10279
-
10280
- toggleHidden(current, true); // Set attributes on target
10281
-
10282
- toggleHidden(target, false); // Focus the first item
10283
-
10284
- controls.focusFirstMenuItem.call(this, target, tabFocus);
10285
- },
10286
- // Set the download URL
10287
- setDownloadUrl: function setDownloadUrl() {
10288
- var button = this.elements.buttons.download; // Bail if no button
10289
-
10290
- if (!is$1.element(button)) {
10291
- return;
10292
- } // Set attribute
10293
-
10294
-
10295
- button.setAttribute('href', this.download);
10296
- },
10297
- // Build the default HTML
10298
- create: function create(data) {
10299
- var _this10 = this;
10300
-
10301
- var bindMenuItemShortcuts = controls.bindMenuItemShortcuts,
10302
- createButton = controls.createButton,
10303
- createProgress = controls.createProgress,
10304
- createRange = controls.createRange,
10305
- createTime = controls.createTime,
10306
- setQualityMenu = controls.setQualityMenu,
10307
- setSpeedMenu = controls.setSpeedMenu,
10308
- showMenuPanel = controls.showMenuPanel;
10309
- this.elements.controls = null; // Larger overlaid play button
10310
-
10311
- if (this.config.controls.includes('play-large')) {
10312
- this.elements.container.appendChild(createButton.call(this, 'play-large'));
10313
- } // Create the container
10314
-
10315
-
10316
- var container = createElement('div', getAttributesFromSelector(this.config.selectors.controls.wrapper));
10317
- this.elements.controls = container; // Default item attributes
10318
-
10319
- var defaultAttributes = {
10320
- class: 'plyr__controls__item'
10321
- }; // Loop through controls in order
10322
-
10323
- dedupe(this.config.controls).forEach(function (control) {
10324
- // Restart button
10325
- if (control === 'restart') {
10326
- container.appendChild(createButton.call(_this10, 'restart', defaultAttributes));
10327
- } // Rewind button
10328
-
10329
-
10330
- if (control === 'rewind') {
10331
- container.appendChild(createButton.call(_this10, 'rewind', defaultAttributes));
10332
- } // Play/Pause button
10333
-
10334
-
10335
- if (control === 'play') {
10336
- container.appendChild(createButton.call(_this10, 'play', defaultAttributes));
10337
- } // Fast forward button
10338
-
10339
-
10340
- if (control === 'fast-forward') {
10341
- container.appendChild(createButton.call(_this10, 'fast-forward', defaultAttributes));
10342
- } // Progress
10343
-
10344
-
10345
- if (control === 'progress') {
10346
- var progressContainer = createElement('div', {
10347
- class: "".concat(defaultAttributes.class, " plyr__progress__container")
10348
- });
10349
- var progress = createElement('div', getAttributesFromSelector(_this10.config.selectors.progress)); // Seek range slider
10350
-
10351
- progress.appendChild(createRange.call(_this10, 'seek', {
10352
- id: "plyr-seek-".concat(data.id)
10353
- })); // Buffer progress
10354
-
10355
- progress.appendChild(createProgress.call(_this10, 'buffer')); // TODO: Add loop display indicator
10356
- // Seek tooltip
10357
-
10358
- if (_this10.config.tooltips.seek) {
10359
- var tooltip = createElement('span', {
10360
- class: _this10.config.classNames.tooltip
10361
- }, '00:00');
10362
- progress.appendChild(tooltip);
10363
- _this10.elements.display.seekTooltip = tooltip;
10364
- }
10365
-
10366
- _this10.elements.progress = progress;
10367
- progressContainer.appendChild(_this10.elements.progress);
10368
- container.appendChild(progressContainer);
10369
- } // Media current time display
10370
-
10371
-
10372
- if (control === 'current-time') {
10373
- container.appendChild(createTime.call(_this10, 'currentTime', defaultAttributes));
10374
- } // Media duration display
10375
-
10376
-
10377
- if (control === 'duration') {
10378
- container.appendChild(createTime.call(_this10, 'duration', defaultAttributes));
10379
- } // Volume controls
10380
-
10381
-
10382
- if (control === 'mute' || control === 'volume') {
10383
- var volume = _this10.elements.volume; // Create the volume container if needed
10384
-
10385
- if (!is$1.element(volume) || !container.contains(volume)) {
10386
- volume = createElement('div', extend({}, defaultAttributes, {
10387
- class: "".concat(defaultAttributes.class, " plyr__volume").trim()
10388
- }));
10389
- _this10.elements.volume = volume;
10390
- container.appendChild(volume);
10391
- } // Toggle mute button
10392
-
10393
-
10394
- if (control === 'mute') {
10395
- volume.appendChild(createButton.call(_this10, 'mute'));
10396
- } // Volume range control
10397
-
10398
-
10399
- if (control === 'volume') {
10400
- // Set the attributes
10401
- var attributes = {
10402
- max: 1,
10403
- step: 0.05,
10404
- value: _this10.config.volume
10405
- }; // Create the volume range slider
10406
-
10407
- volume.appendChild(createRange.call(_this10, 'volume', extend(attributes, {
10408
- id: "plyr-volume-".concat(data.id)
10409
- })));
10410
- }
10411
- } // Toggle captions button
10412
-
10413
-
10414
- if (control === 'captions') {
10415
- container.appendChild(createButton.call(_this10, 'captions', defaultAttributes));
10416
- } // Settings button / menu
10417
-
10418
-
10419
- if (control === 'settings' && !is$1.empty(_this10.config.settings)) {
10420
- var wrapper = createElement('div', extend({}, defaultAttributes, {
10421
- class: "".concat(defaultAttributes.class, " plyr__menu").trim(),
10422
- hidden: ''
10423
- }));
10424
- wrapper.appendChild(createButton.call(_this10, 'settings', {
10425
- 'aria-haspopup': true,
10426
- 'aria-controls': "plyr-settings-".concat(data.id),
10427
- 'aria-expanded': false
10428
- }));
10429
- var popup = createElement('div', {
10430
- class: 'plyr__menu__container',
10431
- id: "plyr-settings-".concat(data.id),
10432
- hidden: ''
10433
- });
10434
- var inner = createElement('div');
10435
- var home = createElement('div', {
10436
- id: "plyr-settings-".concat(data.id, "-home")
10437
- }); // Create the menu
10438
-
10439
- var menu = createElement('div', {
10440
- role: 'menu'
10441
- });
10442
- home.appendChild(menu);
10443
- inner.appendChild(home);
10444
- _this10.elements.settings.panels.home = home; // Build the menu items
10445
-
10446
- _this10.config.settings.forEach(function (type) {
10447
- // TODO: bundle this with the createMenuItem helper and bindings
10448
- var menuItem = createElement('button', extend(getAttributesFromSelector(_this10.config.selectors.buttons.settings), {
10449
- type: 'button',
10450
- class: "".concat(_this10.config.classNames.control, " ").concat(_this10.config.classNames.control, "--forward"),
10451
- role: 'menuitem',
10452
- 'aria-haspopup': true,
10453
- hidden: ''
10454
- })); // Bind menu shortcuts for keyboard users
10455
-
10456
- bindMenuItemShortcuts.call(_this10, menuItem, type); // Show menu on click
10457
-
10458
- on(menuItem, 'click', function () {
10459
- showMenuPanel.call(_this10, type, false);
10460
- });
10461
- var flex = createElement('span', null, i18n.get(type, _this10.config));
10462
- var value = createElement('span', {
10463
- class: _this10.config.classNames.menu.value
10464
- }); // Speed contains HTML entities
10465
-
10466
- value.innerHTML = data[type];
10467
- flex.appendChild(value);
10468
- menuItem.appendChild(flex);
10469
- menu.appendChild(menuItem); // Build the panes
10470
-
10471
- var pane = createElement('div', {
10472
- id: "plyr-settings-".concat(data.id, "-").concat(type),
10473
- hidden: ''
10474
- }); // Back button
10475
-
10476
- var backButton = createElement('button', {
10477
- type: 'button',
10478
- class: "".concat(_this10.config.classNames.control, " ").concat(_this10.config.classNames.control, "--back")
10479
- }); // Visible label
10480
-
10481
- backButton.appendChild(createElement('span', {
10482
- 'aria-hidden': true
10483
- }, i18n.get(type, _this10.config))); // Screen reader label
10484
-
10485
- backButton.appendChild(createElement('span', {
10486
- class: _this10.config.classNames.hidden
10487
- }, i18n.get('menuBack', _this10.config))); // Go back via keyboard
10488
-
10489
- on(pane, 'keydown', function (event) {
10490
- // We only care about <-
10491
- if (event.which !== 37) {
10492
- return;
10493
- } // Prevent seek
10494
-
10495
-
10496
- event.preventDefault();
10497
- event.stopPropagation(); // Show the respective menu
10498
-
10499
- showMenuPanel.call(_this10, 'home', true);
10500
- }, false); // Go back via button click
10501
-
10502
- on(backButton, 'click', function () {
10503
- showMenuPanel.call(_this10, 'home', false);
10504
- }); // Add to pane
10505
-
10506
- pane.appendChild(backButton); // Menu
10507
-
10508
- pane.appendChild(createElement('div', {
10509
- role: 'menu'
10510
- }));
10511
- inner.appendChild(pane);
10512
- _this10.elements.settings.buttons[type] = menuItem;
10513
- _this10.elements.settings.panels[type] = pane;
10514
- });
10515
-
10516
- popup.appendChild(inner);
10517
- wrapper.appendChild(popup);
10518
- container.appendChild(wrapper);
10519
- _this10.elements.settings.popup = popup;
10520
- _this10.elements.settings.menu = wrapper;
10521
- } // Picture in picture button
10522
-
10523
-
10524
- if (control === 'pip' && support.pip) {
10525
- container.appendChild(createButton.call(_this10, 'pip', defaultAttributes));
10526
- } // Airplay button
10527
-
10528
-
10529
- if (control === 'airplay' && support.airplay) {
10530
- container.appendChild(createButton.call(_this10, 'airplay', defaultAttributes));
10531
- } // Download button
10532
-
10533
-
10534
- if (control === 'download') {
10535
- var _attributes = extend({}, defaultAttributes, {
10536
- element: 'a',
10537
- href: _this10.download,
10538
- target: '_blank'
10539
- });
10540
-
10541
- var download = _this10.config.urls.download;
10542
-
10543
- if (!is$1.url(download) && _this10.isEmbed) {
10544
- extend(_attributes, {
10545
- icon: "logo-".concat(_this10.provider),
10546
- label: _this10.provider
10547
- });
10548
- }
10549
-
10550
- container.appendChild(createButton.call(_this10, 'download', _attributes));
10551
- } // Toggle fullscreen button
10552
-
10553
-
10554
- if (control === 'fullscreen') {
10555
- container.appendChild(createButton.call(_this10, 'fullscreen', defaultAttributes));
10556
- }
10557
- }); // Set available quality levels
10558
-
10559
- if (this.isHTML5) {
10560
- setQualityMenu.call(this, html5.getQualityOptions.call(this));
10561
- }
10562
-
10563
- setSpeedMenu.call(this);
10564
- return container;
10565
- },
10566
- // Insert controls
10567
- inject: function inject() {
10568
- var _this11 = this;
10569
-
10570
- // Sprite
10571
- if (this.config.loadSprite) {
10572
- var icon = controls.getIconUrl.call(this); // Only load external sprite using AJAX
10573
-
10574
- if (icon.cors) {
10575
- loadSprite(icon.url, 'sprite-plyr');
10576
- }
10577
- } // Create a unique ID
10578
-
10579
-
10580
- this.id = Math.floor(Math.random() * 10000); // Null by default
10581
-
10582
- var container = null;
10583
- this.elements.controls = null; // Set template properties
10584
-
10585
- var props = {
10586
- id: this.id,
10587
- seektime: this.config.seekTime,
10588
- title: this.config.title
10589
- };
10590
- var update = true; // If function, run it and use output
10591
-
10592
- if (is$1.function(this.config.controls)) {
10593
- this.config.controls = this.config.controls.call(this, props);
10594
- } // Convert falsy controls to empty array (primarily for empty strings)
10595
-
10596
-
10597
- if (!this.config.controls) {
10598
- this.config.controls = [];
10599
- }
10600
-
10601
- if (is$1.element(this.config.controls) || is$1.string(this.config.controls)) {
10602
- // HTMLElement or Non-empty string passed as the option
10603
- container = this.config.controls;
10604
- } else {
10605
- // Create controls
10606
- container = controls.create.call(this, {
10607
- id: this.id,
10608
- seektime: this.config.seekTime,
10609
- speed: this.speed,
10610
- quality: this.quality,
10611
- captions: captions.getLabel.call(this) // TODO: Looping
10612
- // loop: 'None',
10613
-
10614
- });
10615
- update = false;
10616
- } // Replace props with their value
10617
-
10618
-
10619
- var replace = function replace(input) {
10620
- var result = input;
10621
- Object.entries(props).forEach(function (_ref2) {
10622
- var _ref3 = _slicedToArray(_ref2, 2),
10623
- key = _ref3[0],
10624
- value = _ref3[1];
10625
-
10626
- result = replaceAll(result, "{".concat(key, "}"), value);
10627
- });
10628
- return result;
10629
- }; // Update markup
10630
-
10631
-
10632
- if (update) {
10633
- if (is$1.string(this.config.controls)) {
10634
- container = replace(container);
10635
- } else if (is$1.element(container)) {
10636
- container.innerHTML = replace(container.innerHTML);
10637
- }
10638
- } // Controls container
10639
-
10640
-
10641
- var target; // Inject to custom location
10642
-
10643
- if (is$1.string(this.config.selectors.controls.container)) {
10644
- target = document.querySelector(this.config.selectors.controls.container);
10645
- } // Inject into the container by default
10646
-
10647
-
10648
- if (!is$1.element(target)) {
10649
- target = this.elements.container;
10650
- } // Inject controls HTML (needs to be before captions, hence "afterbegin")
10651
-
10652
-
10653
- var insertMethod = is$1.element(container) ? 'insertAdjacentElement' : 'insertAdjacentHTML';
10654
- target[insertMethod]('afterbegin', container); // Find the elements if need be
10655
-
10656
- if (!is$1.element(this.elements.controls)) {
10657
- controls.findElements.call(this);
10658
- } // Add pressed property to buttons
10659
-
10660
-
10661
- if (!is$1.empty(this.elements.buttons)) {
10662
- var addProperty = function addProperty(button) {
10663
- var className = _this11.config.classNames.controlPressed;
10664
- Object.defineProperty(button, 'pressed', {
10665
- enumerable: true,
10666
- get: function get() {
10667
- return hasClass(button, className);
10668
- },
10669
- set: function set() {
10670
- var pressed = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
10671
- toggleClass(button, className, pressed);
10672
- }
10673
- });
10674
- }; // Toggle classname when pressed property is set
10675
-
10676
-
10677
- Object.values(this.elements.buttons).filter(Boolean).forEach(function (button) {
10678
- if (is$1.array(button) || is$1.nodeList(button)) {
10679
- Array.from(button).filter(Boolean).forEach(addProperty);
10680
- } else {
10681
- addProperty(button);
10682
- }
10683
- });
10684
- } // Edge sometimes doesn't finish the paint so force a repaint
10685
-
10686
-
10687
- if (browser.isEdge) {
10688
- repaint(target);
10689
- } // Setup tooltips
10690
-
10691
-
10692
- if (this.config.tooltips.controls) {
10693
- var _this$config = this.config,
10694
- classNames = _this$config.classNames,
10695
- selectors = _this$config.selectors;
10696
- var selector = "".concat(selectors.controls.wrapper, " ").concat(selectors.labels, " .").concat(classNames.hidden);
10697
- var labels = getElements.call(this, selector);
10698
- Array.from(labels).forEach(function (label) {
10699
- toggleClass(label, _this11.config.classNames.hidden, false);
10700
- toggleClass(label, _this11.config.classNames.tooltip, true);
10701
- });
10702
- }
10703
- }
10704
- };
10705
-
10706
- /**
10707
- * Parse a string to a URL object
10708
- * @param {String} input - the URL to be parsed
10709
- * @param {Boolean} safe - failsafe parsing
10710
- */
10711
-
10712
- function parseUrl(input) {
10713
- var safe = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
10714
- var url = input;
10715
-
10716
- if (safe) {
10717
- var parser = document.createElement('a');
10718
- parser.href = url;
10719
- url = parser.href;
10720
- }
10721
-
10722
- try {
10723
- return new URL(url);
10724
- } catch (e) {
10725
- return null;
10726
- }
10727
- } // Convert object to URLSearchParams
10728
-
10729
- function buildUrlParams(input) {
10730
- var params = new URLSearchParams();
10731
-
10732
- if (is$1.object(input)) {
10733
- Object.entries(input).forEach(function (_ref) {
10734
- var _ref2 = _slicedToArray(_ref, 2),
10735
- key = _ref2[0],
10736
- value = _ref2[1];
10737
-
10738
- params.set(key, value);
10739
- });
10740
- }
10741
-
10742
- return params;
10743
- }
10744
-
10745
- var captions = {
10746
- // Setup captions
10747
- setup: function setup() {
10748
- // Requires UI support
10749
- if (!this.supported.ui) {
10750
- return;
10751
- } // Only Vimeo and HTML5 video supported at this point
10752
-
10753
-
10754
- if (!this.isVideo || this.isYouTube || this.isHTML5 && !support.textTracks) {
10755
- // Clear menu and hide
10756
- if (is$1.array(this.config.controls) && this.config.controls.includes('settings') && this.config.settings.includes('captions')) {
10757
- controls.setCaptionsMenu.call(this);
10758
- }
10759
-
10760
- return;
10761
- } // Inject the container
10762
-
10763
-
10764
- if (!is$1.element(this.elements.captions)) {
10765
- this.elements.captions = createElement('div', getAttributesFromSelector(this.config.selectors.captions));
10766
- insertAfter(this.elements.captions, this.elements.wrapper);
10767
- } // Fix IE captions if CORS is used
10768
- // Fetch captions and inject as blobs instead (data URIs not supported!)
10769
-
10770
-
10771
- if (browser.isIE && window.URL) {
10772
- var elements = this.media.querySelectorAll('track');
10773
- Array.from(elements).forEach(function (track) {
10774
- var src = track.getAttribute('src');
10775
- var url = parseUrl(src);
10776
-
10777
- if (url !== null && url.hostname !== window.location.href.hostname && ['http:', 'https:'].includes(url.protocol)) {
10778
- fetch(src, 'blob').then(function (blob) {
10779
- track.setAttribute('src', window.URL.createObjectURL(blob));
10780
- }).catch(function () {
10781
- removeElement(track);
10782
- });
10783
- }
10784
- });
10785
- } // Get and set initial data
10786
- // The "preferred" options are not realized unless / until the wanted language has a match
10787
- // * languages: Array of user's browser languages.
10788
- // * language: The language preferred by user settings or config
10789
- // * active: The state preferred by user settings or config
10790
- // * toggled: The real captions state
10791
-
10792
-
10793
- var browserLanguages = navigator.languages || [navigator.language || navigator.userLanguage || 'en'];
10794
- var languages = dedupe(browserLanguages.map(function (language) {
10795
- return language.split('-')[0];
10796
- }));
10797
- var language = (this.storage.get('language') || this.config.captions.language || 'auto').toLowerCase(); // Use first browser language when language is 'auto'
10798
-
10799
- if (language === 'auto') {
10800
- var _languages = _slicedToArray(languages, 1);
10801
-
10802
- language = _languages[0];
10803
- }
10804
-
10805
- var active = this.storage.get('captions');
10806
-
10807
- if (!is$1.boolean(active)) {
10808
- active = this.config.captions.active;
10809
- }
10810
-
10811
- Object.assign(this.captions, {
10812
- toggled: false,
10813
- active: active,
10814
- language: language,
10815
- languages: languages
10816
- }); // Watch changes to textTracks and update captions menu
10817
-
10818
- if (this.isHTML5) {
10819
- var trackEvents = this.config.captions.update ? 'addtrack removetrack' : 'removetrack';
10820
- on.call(this, this.media.textTracks, trackEvents, captions.update.bind(this));
10821
- } // Update available languages in list next tick (the event must not be triggered before the listeners)
10822
-
10823
-
10824
- setTimeout(captions.update.bind(this), 0);
10825
- },
10826
- // Update available language options in settings based on tracks
10827
- update: function update() {
10828
- var _this = this;
10829
-
10830
- var tracks = captions.getTracks.call(this, true); // Get the wanted language
10831
-
10832
- var _this$captions = this.captions,
10833
- active = _this$captions.active,
10834
- language = _this$captions.language,
10835
- meta = _this$captions.meta,
10836
- currentTrackNode = _this$captions.currentTrackNode;
10837
- var languageExists = Boolean(tracks.find(function (track) {
10838
- return track.language === language;
10839
- })); // Handle tracks (add event listener and "pseudo"-default)
10840
-
10841
- if (this.isHTML5 && this.isVideo) {
10842
- tracks.filter(function (track) {
10843
- return !meta.get(track);
10844
- }).forEach(function (track) {
10845
- _this.debug.log('Track added', track); // Attempt to store if the original dom element was "default"
10846
-
10847
-
10848
- meta.set(track, {
10849
- default: track.mode === 'showing'
10850
- }); // Turn off native caption rendering to avoid double captions
10851
- // eslint-disable-next-line no-param-reassign
10852
-
10853
- track.mode = 'hidden'; // Add event listener for cue changes
10854
-
10855
- on.call(_this, track, 'cuechange', function () {
10856
- return captions.updateCues.call(_this);
10857
- });
10858
- });
10859
- } // Update language first time it matches, or if the previous matching track was removed
10860
-
10861
-
10862
- if (languageExists && this.language !== language || !tracks.includes(currentTrackNode)) {
10863
- captions.setLanguage.call(this, language);
10864
- captions.toggle.call(this, active && languageExists);
10865
- } // Enable or disable captions based on track length
10866
-
10867
-
10868
- toggleClass(this.elements.container, this.config.classNames.captions.enabled, !is$1.empty(tracks)); // Update available languages in list
10869
-
10870
- if ((this.config.controls || []).includes('settings') && this.config.settings.includes('captions')) {
10871
- controls.setCaptionsMenu.call(this);
10872
- }
10873
- },
10874
- // Toggle captions display
10875
- // Used internally for the toggleCaptions method, with the passive option forced to false
10876
- toggle: function toggle(input) {
10877
- var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
10878
-
10879
- // If there's no full support
10880
- if (!this.supported.ui) {
10881
- return;
10882
- }
10883
-
10884
- var toggled = this.captions.toggled; // Current state
10885
-
10886
- var activeClass = this.config.classNames.captions.active; // Get the next state
10887
- // If the method is called without parameter, toggle based on current value
10888
-
10889
- var active = is$1.nullOrUndefined(input) ? !toggled : input; // Update state and trigger event
10890
-
10891
- if (active !== toggled) {
10892
- // When passive, don't override user preferences
10893
- if (!passive) {
10894
- this.captions.active = active;
10895
- this.storage.set({
10896
- captions: active
10897
- });
10898
- } // Force language if the call isn't passive and there is no matching language to toggle to
10899
-
10900
-
10901
- if (!this.language && active && !passive) {
10902
- var tracks = captions.getTracks.call(this);
10903
- var track = captions.findTrack.call(this, [this.captions.language].concat(_toConsumableArray(this.captions.languages)), true); // Override user preferences to avoid switching languages if a matching track is added
10904
-
10905
- this.captions.language = track.language; // Set caption, but don't store in localStorage as user preference
10906
-
10907
- captions.set.call(this, tracks.indexOf(track));
10908
- return;
10909
- } // Toggle button if it's enabled
10910
-
10911
-
10912
- if (this.elements.buttons.captions) {
10913
- this.elements.buttons.captions.pressed = active;
10914
- } // Add class hook
10915
-
10916
-
10917
- toggleClass(this.elements.container, activeClass, active);
10918
- this.captions.toggled = active; // Update settings menu
10919
-
10920
- controls.updateSetting.call(this, 'captions'); // Trigger event (not used internally)
10921
-
10922
- triggerEvent.call(this, this.media, active ? 'captionsenabled' : 'captionsdisabled');
10923
- }
10924
- },
10925
- // Set captions by track index
10926
- // Used internally for the currentTrack setter with the passive option forced to false
10927
- set: function set(index) {
10928
- var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
10929
- var tracks = captions.getTracks.call(this); // Disable captions if setting to -1
10930
-
10931
- if (index === -1) {
10932
- captions.toggle.call(this, false, passive);
10933
- return;
10934
- }
10935
-
10936
- if (!is$1.number(index)) {
10937
- this.debug.warn('Invalid caption argument', index);
10938
- return;
10939
- }
10940
-
10941
- if (!(index in tracks)) {
10942
- this.debug.warn('Track not found', index);
10943
- return;
10944
- }
10945
-
10946
- if (this.captions.currentTrack !== index) {
10947
- this.captions.currentTrack = index;
10948
- var track = tracks[index];
10949
-
10950
- var _ref = track || {},
10951
- language = _ref.language; // Store reference to node for invalidation on remove
10952
-
10953
-
10954
- this.captions.currentTrackNode = track; // Update settings menu
10955
-
10956
- controls.updateSetting.call(this, 'captions'); // When passive, don't override user preferences
10957
-
10958
- if (!passive) {
10959
- this.captions.language = language;
10960
- this.storage.set({
10961
- language: language
10962
- });
10963
- } // Handle Vimeo captions
10964
-
10965
-
10966
- if (this.isVimeo) {
10967
- this.embed.enableTextTrack(language);
10968
- } // Trigger event
10969
-
10970
-
10971
- triggerEvent.call(this, this.media, 'languagechange');
10972
- } // Show captions
10973
-
10974
-
10975
- captions.toggle.call(this, true, passive);
10976
-
10977
- if (this.isHTML5 && this.isVideo) {
10978
- // If we change the active track while a cue is already displayed we need to update it
10979
- captions.updateCues.call(this);
10980
- }
10981
- },
10982
- // Set captions by language
10983
- // Used internally for the language setter with the passive option forced to false
10984
- setLanguage: function setLanguage(input) {
10985
- var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
10986
-
10987
- if (!is$1.string(input)) {
10988
- this.debug.warn('Invalid language argument', input);
10989
- return;
10990
- } // Normalize
10991
-
10992
-
10993
- var language = input.toLowerCase();
10994
- this.captions.language = language; // Set currentTrack
10995
-
10996
- var tracks = captions.getTracks.call(this);
10997
- var track = captions.findTrack.call(this, [language]);
10998
- captions.set.call(this, tracks.indexOf(track), passive);
10999
- },
11000
- // Get current valid caption tracks
11001
- // If update is false it will also ignore tracks without metadata
11002
- // This is used to "freeze" the language options when captions.update is false
11003
- getTracks: function getTracks() {
11004
- var _this2 = this;
11005
-
11006
- var update = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
11007
- // Handle media or textTracks missing or null
11008
- var tracks = Array.from((this.media || {}).textTracks || []); // For HTML5, use cache instead of current tracks when it exists (if captions.update is false)
11009
- // Filter out removed tracks and tracks that aren't captions/subtitles (for example metadata)
11010
-
11011
- return tracks.filter(function (track) {
11012
- return !_this2.isHTML5 || update || _this2.captions.meta.has(track);
11013
- }).filter(function (track) {
11014
- return ['captions', 'subtitles'].includes(track.kind);
11015
- });
11016
- },
11017
- // Match tracks based on languages and get the first
11018
- findTrack: function findTrack(languages) {
11019
- var _this3 = this;
11020
-
11021
- var force = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
11022
- var tracks = captions.getTracks.call(this);
11023
-
11024
- var sortIsDefault = function sortIsDefault(track) {
11025
- return Number((_this3.captions.meta.get(track) || {}).default);
11026
- };
11027
-
11028
- var sorted = Array.from(tracks).sort(function (a, b) {
11029
- return sortIsDefault(b) - sortIsDefault(a);
11030
- });
11031
- var track;
11032
- languages.every(function (language) {
11033
- track = sorted.find(function (t) {
11034
- return t.language === language;
11035
- });
11036
- return !track; // Break iteration if there is a match
11037
- }); // If no match is found but is required, get first
11038
-
11039
- return track || (force ? sorted[0] : undefined);
11040
- },
11041
- // Get the current track
11042
- getCurrentTrack: function getCurrentTrack() {
11043
- return captions.getTracks.call(this)[this.currentTrack];
11044
- },
11045
- // Get UI label for track
11046
- getLabel: function getLabel(track) {
11047
- var currentTrack = track;
11048
-
11049
- if (!is$1.track(currentTrack) && support.textTracks && this.captions.toggled) {
11050
- currentTrack = captions.getCurrentTrack.call(this);
11051
- }
11052
-
11053
- if (is$1.track(currentTrack)) {
11054
- if (!is$1.empty(currentTrack.label)) {
11055
- return currentTrack.label;
11056
- }
11057
-
11058
- if (!is$1.empty(currentTrack.language)) {
11059
- return track.language.toUpperCase();
11060
- }
11061
-
11062
- return i18n.get('enabled', this.config);
11063
- }
11064
-
11065
- return i18n.get('disabled', this.config);
11066
- },
11067
- // Update captions using current track's active cues
11068
- // Also optional array argument in case there isn't any track (ex: vimeo)
11069
- updateCues: function updateCues(input) {
11070
- // Requires UI
11071
- if (!this.supported.ui) {
11072
- return;
11073
- }
11074
-
11075
- if (!is$1.element(this.elements.captions)) {
11076
- this.debug.warn('No captions element to render to');
11077
- return;
11078
- } // Only accept array or empty input
11079
-
11080
-
11081
- if (!is$1.nullOrUndefined(input) && !Array.isArray(input)) {
11082
- this.debug.warn('updateCues: Invalid input', input);
11083
- return;
11084
- }
11085
-
11086
- var cues = input; // Get cues from track
11087
-
11088
- if (!cues) {
11089
- var track = captions.getCurrentTrack.call(this);
11090
- cues = Array.from((track || {}).activeCues || []).map(function (cue) {
11091
- return cue.getCueAsHTML();
11092
- }).map(getHTML);
11093
- } // Set new caption text
11094
-
11095
-
11096
- var content = cues.map(function (cueText) {
11097
- return cueText.trim();
11098
- }).join('\n');
11099
- var changed = content !== this.elements.captions.innerHTML;
11100
-
11101
- if (changed) {
11102
- // Empty the container and create a new child element
11103
- emptyElement(this.elements.captions);
11104
- var caption = createElement('span', getAttributesFromSelector(this.config.selectors.caption));
11105
- caption.innerHTML = content;
11106
- this.elements.captions.appendChild(caption); // Trigger event
11107
-
11108
- triggerEvent.call(this, this.media, 'cuechange');
11109
- }
11110
- }
11111
- };
11112
-
11113
- // ==========================================================================
11114
- // Plyr default config
11115
- // ==========================================================================
11116
- var defaults$1 = {
11117
- // Disable
11118
- enabled: true,
11119
- // Custom media title
11120
- title: '',
11121
- // Logging to console
11122
- debug: false,
11123
- // Auto play (if supported)
11124
- autoplay: false,
11125
- // Only allow one media playing at once (vimeo only)
11126
- autopause: true,
11127
- // Allow inline playback on iOS (this effects YouTube/Vimeo - HTML5 requires the attribute present)
11128
- // TODO: Remove iosNative fullscreen option in favour of this (logic needs work)
11129
- playsinline: true,
11130
- // Default time to skip when rewind/fast forward
11131
- seekTime: 10,
11132
- // Default volume
11133
- volume: 1,
11134
- muted: false,
11135
- // Pass a custom duration
11136
- duration: null,
11137
- // Display the media duration on load in the current time position
11138
- // If you have opted to display both duration and currentTime, this is ignored
11139
- displayDuration: true,
11140
- // Invert the current time to be a countdown
11141
- invertTime: true,
11142
- // Clicking the currentTime inverts it's value to show time left rather than elapsed
11143
- toggleInvert: true,
11144
- // Force an aspect ratio
11145
- // The format must be `'w:h'` (e.g. `'16:9'`)
11146
- ratio: null,
11147
- // Click video container to play/pause
11148
- clickToPlay: true,
11149
- // Auto hide the controls
11150
- hideControls: true,
11151
- // Reset to start when playback ended
11152
- resetOnEnd: false,
11153
- // Disable the standard context menu
11154
- disableContextMenu: true,
11155
- // Sprite (for icons)
11156
- loadSprite: true,
11157
- iconPrefix: 'plyr',
11158
- iconUrl: 'https://cdn.plyr.io/3.5.6/plyr.svg',
11159
- // Blank video (used to prevent errors on source change)
11160
- blankVideo: 'https://cdn.plyr.io/static/blank.mp4',
11161
- // Quality default
11162
- quality: {
11163
- default: 576,
11164
- options: [4320, 2880, 2160, 1440, 1080, 720, 576, 480, 360, 240]
11165
- },
11166
- // Set loops
11167
- loop: {
11168
- active: false // start: null,
11169
- // end: null,
11170
-
11171
- },
11172
- // Speed default and options to display
11173
- speed: {
11174
- selected: 1,
11175
- options: [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2]
11176
- },
11177
- // Keyboard shortcut settings
11178
- keyboard: {
11179
- focused: true,
11180
- global: false
11181
- },
11182
- // Display tooltips
11183
- tooltips: {
11184
- controls: false,
11185
- seek: true
11186
- },
11187
- // Captions settings
11188
- captions: {
11189
- active: false,
11190
- language: 'auto',
11191
- // Listen to new tracks added after Plyr is initialized.
11192
- // This is needed for streaming captions, but may result in unselectable options
11193
- update: false
11194
- },
11195
- // Fullscreen settings
11196
- fullscreen: {
11197
- enabled: true,
11198
- // Allow fullscreen?
11199
- fallback: true,
11200
- // Fallback using full viewport/window
11201
- iosNative: false // Use the native fullscreen in iOS (disables custom controls)
11202
-
11203
- },
11204
- // Local storage
11205
- storage: {
11206
- enabled: true,
11207
- key: 'plyr'
11208
- },
11209
- // Default controls
11210
- controls: ['play-large', // 'restart',
11211
- // 'rewind',
11212
- 'play', // 'fast-forward',
11213
- 'progress', 'current-time', // 'duration',
11214
- 'mute', 'volume', 'captions', 'settings', 'pip', 'airplay', // 'download',
11215
- 'fullscreen'],
11216
- settings: ['captions', 'quality', 'speed'],
11217
- // Localisation
11218
- i18n: {
11219
- restart: 'Restart',
11220
- rewind: 'Rewind {seektime}s',
11221
- play: 'Play',
11222
- pause: 'Pause',
11223
- fastForward: 'Forward {seektime}s',
11224
- seek: 'Seek',
11225
- seekLabel: '{currentTime} of {duration}',
11226
- played: 'Played',
11227
- buffered: 'Buffered',
11228
- currentTime: 'Current time',
11229
- duration: 'Duration',
11230
- volume: 'Volume',
11231
- mute: 'Mute',
11232
- unmute: 'Unmute',
11233
- enableCaptions: 'Enable captions',
11234
- disableCaptions: 'Disable captions',
11235
- download: 'Download',
11236
- enterFullscreen: 'Enter fullscreen',
11237
- exitFullscreen: 'Exit fullscreen',
11238
- frameTitle: 'Player for {title}',
11239
- captions: 'Captions',
11240
- settings: 'Settings',
11241
- menuBack: 'Go back to previous menu',
11242
- speed: 'Speed',
11243
- normal: 'Normal',
11244
- quality: 'Quality',
11245
- loop: 'Loop',
11246
- start: 'Start',
11247
- end: 'End',
11248
- all: 'All',
11249
- reset: 'Reset',
11250
- disabled: 'Disabled',
11251
- enabled: 'Enabled',
11252
- advertisement: 'Ad',
11253
- qualityBadge: {
11254
- 2160: '4K',
11255
- 1440: 'HD',
11256
- 1080: 'HD',
11257
- 720: 'HD',
11258
- 576: 'SD',
11259
- 480: 'SD'
11260
- }
11261
- },
11262
- // URLs
11263
- urls: {
11264
- download: null,
11265
- vimeo: {
11266
- sdk: 'https://player.vimeo.com/api/player.js',
11267
- iframe: 'https://player.vimeo.com/video/{0}?{1}',
11268
- api: 'https://vimeo.com/api/v2/video/{0}.json'
11269
- },
11270
- youtube: {
11271
- sdk: 'https://www.youtube.com/iframe_api',
11272
- api: 'https://noembed.com/embed?url=https://www.youtube.com/watch?v={0}'
11273
- },
11274
- googleIMA: {
11275
- sdk: 'https://imasdk.googleapis.com/js/sdkloader/ima3.js'
11276
- }
11277
- },
11278
- // Custom control listeners
11279
- listeners: {
11280
- seek: null,
11281
- play: null,
11282
- pause: null,
11283
- restart: null,
11284
- rewind: null,
11285
- fastForward: null,
11286
- mute: null,
11287
- volume: null,
11288
- captions: null,
11289
- download: null,
11290
- fullscreen: null,
11291
- pip: null,
11292
- airplay: null,
11293
- speed: null,
11294
- quality: null,
11295
- loop: null,
11296
- language: null
11297
- },
11298
- // Events to watch and bubble
11299
- events: [// Events to watch on HTML5 media elements and bubble
11300
- // https://developer.mozilla.org/en/docs/Web/Guide/Events/Media_events
11301
- 'ended', 'progress', 'stalled', 'playing', 'waiting', 'canplay', 'canplaythrough', 'loadstart', 'loadeddata', 'loadedmetadata', 'timeupdate', 'volumechange', 'play', 'pause', 'error', 'seeking', 'seeked', 'emptied', 'ratechange', 'cuechange', // Custom events
11302
- 'download', 'enterfullscreen', 'exitfullscreen', 'captionsenabled', 'captionsdisabled', 'languagechange', 'controlshidden', 'controlsshown', 'ready', // YouTube
11303
- 'statechange', // Quality
11304
- 'qualitychange', // Ads
11305
- 'adsloaded', 'adscontentpause', 'adscontentresume', 'adstarted', 'adsmidpoint', 'adscomplete', 'adsallcomplete', 'adsimpression', 'adsclick'],
11306
- // Selectors
11307
- // Change these to match your template if using custom HTML
11308
- selectors: {
11309
- editable: 'input, textarea, select, [contenteditable]',
11310
- container: '.plyr',
11311
- controls: {
11312
- container: null,
11313
- wrapper: '.plyr__controls'
11314
- },
11315
- labels: '[data-plyr]',
11316
- buttons: {
11317
- play: '[data-plyr="play"]',
11318
- pause: '[data-plyr="pause"]',
11319
- restart: '[data-plyr="restart"]',
11320
- rewind: '[data-plyr="rewind"]',
11321
- fastForward: '[data-plyr="fast-forward"]',
11322
- mute: '[data-plyr="mute"]',
11323
- captions: '[data-plyr="captions"]',
11324
- download: '[data-plyr="download"]',
11325
- fullscreen: '[data-plyr="fullscreen"]',
11326
- pip: '[data-plyr="pip"]',
11327
- airplay: '[data-plyr="airplay"]',
11328
- settings: '[data-plyr="settings"]',
11329
- loop: '[data-plyr="loop"]'
11330
- },
11331
- inputs: {
11332
- seek: '[data-plyr="seek"]',
11333
- volume: '[data-plyr="volume"]',
11334
- speed: '[data-plyr="speed"]',
11335
- language: '[data-plyr="language"]',
11336
- quality: '[data-plyr="quality"]'
11337
- },
11338
- display: {
11339
- currentTime: '.plyr__time--current',
11340
- duration: '.plyr__time--duration',
11341
- buffer: '.plyr__progress__buffer',
11342
- loop: '.plyr__progress__loop',
11343
- // Used later
11344
- volume: '.plyr__volume--display'
11345
- },
11346
- progress: '.plyr__progress',
11347
- captions: '.plyr__captions',
11348
- caption: '.plyr__caption'
11349
- },
11350
- // Class hooks added to the player in different states
11351
- classNames: {
11352
- type: 'plyr--{0}',
11353
- provider: 'plyr--{0}',
11354
- video: 'plyr__video-wrapper',
11355
- embed: 'plyr__video-embed',
11356
- videoFixedRatio: 'plyr__video-wrapper--fixed-ratio',
11357
- embedContainer: 'plyr__video-embed__container',
11358
- poster: 'plyr__poster',
11359
- posterEnabled: 'plyr__poster-enabled',
11360
- ads: 'plyr__ads',
11361
- control: 'plyr__control',
11362
- controlPressed: 'plyr__control--pressed',
11363
- playing: 'plyr--playing',
11364
- paused: 'plyr--paused',
11365
- stopped: 'plyr--stopped',
11366
- loading: 'plyr--loading',
11367
- hover: 'plyr--hover',
11368
- tooltip: 'plyr__tooltip',
11369
- cues: 'plyr__cues',
11370
- hidden: 'plyr__sr-only',
11371
- hideControls: 'plyr--hide-controls',
11372
- isIos: 'plyr--is-ios',
11373
- isTouch: 'plyr--is-touch',
11374
- uiSupported: 'plyr--full-ui',
11375
- noTransition: 'plyr--no-transition',
11376
- display: {
11377
- time: 'plyr__time'
11378
- },
11379
- menu: {
11380
- value: 'plyr__menu__value',
11381
- badge: 'plyr__badge',
11382
- open: 'plyr--menu-open'
11383
- },
11384
- captions: {
11385
- enabled: 'plyr--captions-enabled',
11386
- active: 'plyr--captions-active'
11387
- },
11388
- fullscreen: {
11389
- enabled: 'plyr--fullscreen-enabled',
11390
- fallback: 'plyr--fullscreen-fallback'
11391
- },
11392
- pip: {
11393
- supported: 'plyr--pip-supported',
11394
- active: 'plyr--pip-active'
11395
- },
11396
- airplay: {
11397
- supported: 'plyr--airplay-supported',
11398
- active: 'plyr--airplay-active'
11399
- },
11400
- tabFocus: 'plyr__tab-focus',
11401
- previewThumbnails: {
11402
- // Tooltip thumbs
11403
- thumbContainer: 'plyr__preview-thumb',
11404
- thumbContainerShown: 'plyr__preview-thumb--is-shown',
11405
- imageContainer: 'plyr__preview-thumb__image-container',
11406
- timeContainer: 'plyr__preview-thumb__time-container',
11407
- // Scrubbing
11408
- scrubbingContainer: 'plyr__preview-scrubbing',
11409
- scrubbingContainerShown: 'plyr__preview-scrubbing--is-shown'
11410
- }
11411
- },
11412
- // Embed attributes
11413
- attributes: {
11414
- embed: {
11415
- provider: 'data-plyr-provider',
11416
- id: 'data-plyr-embed-id'
11417
- }
11418
- },
11419
- // Advertisements plugin
11420
- // Register for an account here: http://vi.ai/publisher-video-monetization/?aid=plyrio
11421
- ads: {
11422
- enabled: false,
11423
- publisherId: '',
11424
- tagUrl: ''
11425
- },
11426
- // Preview Thumbnails plugin
11427
- previewThumbnails: {
11428
- enabled: false,
11429
- src: ''
11430
- },
11431
- // Vimeo plugin
11432
- vimeo: {
11433
- byline: false,
11434
- portrait: false,
11435
- title: false,
11436
- speed: true,
11437
- transparent: false
11438
- },
11439
- // YouTube plugin
11440
- youtube: {
11441
- noCookie: false,
11442
- // Whether to use an alternative version of YouTube without cookies
11443
- rel: 0,
11444
- // No related vids
11445
- showinfo: 0,
11446
- // Hide info
11447
- iv_load_policy: 3,
11448
- // Hide annotations
11449
- modestbranding: 1 // Hide logos as much as possible (they still show one in the corner when paused)
11450
-
11451
- }
11452
- };
11453
-
11454
- // ==========================================================================
11455
- // Plyr states
11456
- // ==========================================================================
11457
- var pip = {
11458
- active: 'picture-in-picture',
11459
- inactive: 'inline'
11460
- };
11461
-
11462
- // ==========================================================================
11463
- // Plyr supported types and providers
11464
- // ==========================================================================
11465
- var providers = {
11466
- html5: 'html5',
11467
- youtube: 'youtube',
11468
- vimeo: 'vimeo'
11469
- };
11470
- var types = {
11471
- audio: 'audio',
11472
- video: 'video'
11473
- };
11474
- /**
11475
- * Get provider by URL
11476
- * @param {String} url
11477
- */
11478
-
11479
- function getProviderByUrl(url) {
11480
- // YouTube
11481
- if (/^(https?:\/\/)?(www\.)?(youtube\.com|youtube-nocookie\.com|youtu\.?be)\/.+$/.test(url)) {
11482
- return providers.youtube;
11483
- } // Vimeo
11484
-
11485
-
11486
- if (/^https?:\/\/player.vimeo.com\/video\/\d{0,9}(?=\b|\/)/.test(url)) {
11487
- return providers.vimeo;
11488
- }
11489
-
11490
- return null;
11491
- }
11492
-
11493
- // ==========================================================================
11494
- // Console wrapper
11495
- // ==========================================================================
11496
- var noop = function noop() {};
11497
-
11498
- var Console =
11499
- /*#__PURE__*/
11500
- function () {
11501
- function Console() {
11502
- var enabled = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
11503
-
11504
- _classCallCheck(this, Console);
11505
-
11506
- this.enabled = window.console && enabled;
11507
-
11508
- if (this.enabled) {
11509
- this.log('Debugging enabled');
11510
- }
11511
- }
11512
-
11513
- _createClass(Console, [{
11514
- key: "log",
11515
- get: function get() {
11516
- // eslint-disable-next-line no-console
11517
- return this.enabled ? Function.prototype.bind.call(console.log, console) : noop;
11518
- }
11519
- }, {
11520
- key: "warn",
11521
- get: function get() {
11522
- // eslint-disable-next-line no-console
11523
- return this.enabled ? Function.prototype.bind.call(console.warn, console) : noop;
11524
- }
11525
- }, {
11526
- key: "error",
11527
- get: function get() {
11528
- // eslint-disable-next-line no-console
11529
- return this.enabled ? Function.prototype.bind.call(console.error, console) : noop;
11530
- }
11531
- }]);
11532
-
11533
- return Console;
11534
- }();
11535
-
11536
- function onChange() {
11537
- if (!this.enabled) {
11538
- return;
11539
- } // Update toggle button
11540
-
11541
-
11542
- var button = this.player.elements.buttons.fullscreen;
11543
-
11544
- if (is$1.element(button)) {
11545
- button.pressed = this.active;
11546
- } // Trigger an event
11547
-
11548
-
11549
- triggerEvent.call(this.player, this.target, this.active ? 'enterfullscreen' : 'exitfullscreen', true); // Trap focus in container
11550
-
11551
- if (!browser.isIos) {
11552
- trapFocus.call(this.player, this.target, this.active);
11553
- }
11554
- }
11555
-
11556
- function toggleFallback() {
11557
- var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
11558
-
11559
- // Store or restore scroll position
11560
- if (toggle) {
11561
- this.scrollPosition = {
11562
- x: window.scrollX || 0,
11563
- y: window.scrollY || 0
11564
- };
11565
- } else {
11566
- window.scrollTo(this.scrollPosition.x, this.scrollPosition.y);
11567
- } // Toggle scroll
11568
-
11569
-
11570
- document.body.style.overflow = toggle ? 'hidden' : ''; // Toggle class hook
11571
-
11572
- toggleClass(this.target, this.player.config.classNames.fullscreen.fallback, toggle); // Force full viewport on iPhone X+
11573
-
11574
- if (browser.isIos) {
11575
- var viewport = document.head.querySelector('meta[name="viewport"]');
11576
- var property = 'viewport-fit=cover'; // Inject the viewport meta if required
11577
-
11578
- if (!viewport) {
11579
- viewport = document.createElement('meta');
11580
- viewport.setAttribute('name', 'viewport');
11581
- } // Check if the property already exists
11582
-
11583
-
11584
- var hasProperty = is$1.string(viewport.content) && viewport.content.includes(property);
11585
-
11586
- if (toggle) {
11587
- this.cleanupViewport = !hasProperty;
11588
-
11589
- if (!hasProperty) {
11590
- viewport.content += ",".concat(property);
11591
- }
11592
- } else if (this.cleanupViewport) {
11593
- viewport.content = viewport.content.split(',').filter(function (part) {
11594
- return part.trim() !== property;
11595
- }).join(',');
11596
- }
11597
- } // Toggle button and fire events
11598
-
11599
-
11600
- onChange.call(this);
11601
- }
11602
-
11603
- var Fullscreen =
11604
- /*#__PURE__*/
11605
- function () {
11606
- function Fullscreen(player) {
11607
- var _this = this;
11608
-
11609
- _classCallCheck(this, Fullscreen);
11610
-
11611
- // Keep reference to parent
11612
- this.player = player; // Get prefix
11613
-
11614
- this.prefix = Fullscreen.prefix;
11615
- this.property = Fullscreen.property; // Scroll position
11616
-
11617
- this.scrollPosition = {
11618
- x: 0,
11619
- y: 0
11620
- }; // Force the use of 'full window/browser' rather than fullscreen
11621
-
11622
- this.forceFallback = player.config.fullscreen.fallback === 'force'; // Register event listeners
11623
- // Handle event (incase user presses escape etc)
11624
-
11625
- on.call(this.player, document, this.prefix === 'ms' ? 'MSFullscreenChange' : "".concat(this.prefix, "fullscreenchange"), function () {
11626
- // TODO: Filter for target??
11627
- onChange.call(_this);
11628
- }); // Fullscreen toggle on double click
11629
-
11630
- on.call(this.player, this.player.elements.container, 'dblclick', function (event) {
11631
- // Ignore double click in controls
11632
- if (is$1.element(_this.player.elements.controls) && _this.player.elements.controls.contains(event.target)) {
11633
- return;
11634
- }
11635
-
11636
- _this.toggle();
11637
- }); // Update the UI
11638
-
11639
- this.update();
11640
- } // Determine if native supported
11641
-
11642
-
11643
- _createClass(Fullscreen, [{
11644
- key: "update",
11645
- // Update UI
11646
- value: function update() {
11647
- if (this.enabled) {
11648
- var mode;
11649
-
11650
- if (this.forceFallback) {
11651
- mode = 'Fallback (forced)';
11652
- } else if (Fullscreen.native) {
11653
- mode = 'Native';
11654
- } else {
11655
- mode = 'Fallback';
11656
- }
11657
-
11658
- this.player.debug.log("".concat(mode, " fullscreen enabled"));
11659
- } else {
11660
- this.player.debug.log('Fullscreen not supported and fallback disabled');
11661
- } // Add styling hook to show button
11662
-
11663
-
11664
- toggleClass(this.player.elements.container, this.player.config.classNames.fullscreen.enabled, this.enabled);
11665
- } // Make an element fullscreen
11666
-
11667
- }, {
11668
- key: "enter",
11669
- value: function enter() {
11670
- if (!this.enabled) {
11671
- return;
11672
- } // iOS native fullscreen doesn't need the request step
11673
-
11674
-
11675
- if (browser.isIos && this.player.config.fullscreen.iosNative) {
11676
- this.target.webkitEnterFullscreen();
11677
- } else if (!Fullscreen.native || this.forceFallback) {
11678
- toggleFallback.call(this, true);
11679
- } else if (!this.prefix) {
11680
- this.target.requestFullscreen();
11681
- } else if (!is$1.empty(this.prefix)) {
11682
- this.target["".concat(this.prefix, "Request").concat(this.property)]();
11683
- }
11684
- } // Bail from fullscreen
11685
-
11686
- }, {
11687
- key: "exit",
11688
- value: function exit() {
11689
- if (!this.enabled) {
11690
- return;
11691
- } // iOS native fullscreen
11692
-
11693
-
11694
- if (browser.isIos && this.player.config.fullscreen.iosNative) {
11695
- this.target.webkitExitFullscreen();
11696
- this.player.play();
11697
- } else if (!Fullscreen.native || this.forceFallback) {
11698
- toggleFallback.call(this, false);
11699
- } else if (!this.prefix) {
11700
- (document.cancelFullScreen || document.exitFullscreen).call(document);
11701
- } else if (!is$1.empty(this.prefix)) {
11702
- var action = this.prefix === 'moz' ? 'Cancel' : 'Exit';
11703
- document["".concat(this.prefix).concat(action).concat(this.property)]();
11704
- }
11705
- } // Toggle state
11706
-
11707
- }, {
11708
- key: "toggle",
11709
- value: function toggle() {
11710
- if (!this.active) {
11711
- this.enter();
11712
- } else {
11713
- this.exit();
11714
- }
11715
- }
11716
- }, {
11717
- key: "usingNative",
11718
- // If we're actually using native
11719
- get: function get() {
11720
- return Fullscreen.native && !this.forceFallback;
11721
- } // Get the prefix for handlers
11722
-
11723
- }, {
11724
- key: "enabled",
11725
- // Determine if fullscreen is enabled
11726
- get: function get() {
11727
- return (Fullscreen.native || this.player.config.fullscreen.fallback) && this.player.config.fullscreen.enabled && this.player.supported.ui && this.player.isVideo;
11728
- } // Get active state
11729
-
11730
- }, {
11731
- key: "active",
11732
- get: function get() {
11733
- if (!this.enabled) {
11734
- return false;
11735
- } // Fallback using classname
11736
-
11737
-
11738
- if (!Fullscreen.native || this.forceFallback) {
11739
- return hasClass(this.target, this.player.config.classNames.fullscreen.fallback);
11740
- }
11741
-
11742
- var element = !this.prefix ? document.fullscreenElement : document["".concat(this.prefix).concat(this.property, "Element")];
11743
- return element === this.target;
11744
- } // Get target element
11745
-
11746
- }, {
11747
- key: "target",
11748
- get: function get() {
11749
- return browser.isIos && this.player.config.fullscreen.iosNative ? this.player.media : this.player.elements.container;
11750
- }
11751
- }], [{
11752
- key: "native",
11753
- get: function get() {
11754
- return !!(document.fullscreenEnabled || document.webkitFullscreenEnabled || document.mozFullScreenEnabled || document.msFullscreenEnabled);
11755
- }
11756
- }, {
11757
- key: "prefix",
11758
- get: function get() {
11759
- // No prefix
11760
- if (is$1.function(document.exitFullscreen)) {
11761
- return '';
11762
- } // Check for fullscreen support by vendor prefix
11763
-
11764
-
11765
- var value = '';
11766
- var prefixes = ['webkit', 'moz', 'ms'];
11767
- prefixes.some(function (pre) {
11768
- if (is$1.function(document["".concat(pre, "ExitFullscreen")]) || is$1.function(document["".concat(pre, "CancelFullScreen")])) {
11769
- value = pre;
11770
- return true;
11771
- }
11772
-
11773
- return false;
11774
- });
11775
- return value;
11776
- }
11777
- }, {
11778
- key: "property",
11779
- get: function get() {
11780
- return this.prefix === 'moz' ? 'FullScreen' : 'Fullscreen';
11781
- }
11782
- }]);
11783
-
11784
- return Fullscreen;
11785
- }();
11786
-
11787
- // ==========================================================================
11788
- // Load image avoiding xhr/fetch CORS issues
11789
- // Server status can't be obtained this way unfortunately, so this uses "naturalWidth" to determine if the image has loaded
11790
- // By default it checks if it is at least 1px, but you can add a second argument to change this
11791
- // ==========================================================================
11792
- function loadImage(src) {
11793
- var minWidth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
11794
- return new Promise(function (resolve, reject) {
11795
- var image = new Image();
11796
-
11797
- var handler = function handler() {
11798
- delete image.onload;
11799
- delete image.onerror;
11800
- (image.naturalWidth >= minWidth ? resolve : reject)(image);
11801
- };
11802
-
11803
- Object.assign(image, {
11804
- onload: handler,
11805
- onerror: handler,
11806
- src: src
11807
- });
11808
- });
11809
- }
11810
-
11811
- // ==========================================================================
11812
- var ui = {
11813
- addStyleHook: function addStyleHook() {
11814
- toggleClass(this.elements.container, this.config.selectors.container.replace('.', ''), true);
11815
- toggleClass(this.elements.container, this.config.classNames.uiSupported, this.supported.ui);
11816
- },
11817
- // Toggle native HTML5 media controls
11818
- toggleNativeControls: function toggleNativeControls() {
11819
- var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
11820
-
11821
- if (toggle && this.isHTML5) {
11822
- this.media.setAttribute('controls', '');
11823
- } else {
11824
- this.media.removeAttribute('controls');
11825
- }
11826
- },
11827
- // Setup the UI
11828
- build: function build() {
11829
- var _this = this;
11830
-
11831
- // Re-attach media element listeners
11832
- // TODO: Use event bubbling?
11833
- this.listeners.media(); // Don't setup interface if no support
11834
-
11835
- if (!this.supported.ui) {
11836
- this.debug.warn("Basic support only for ".concat(this.provider, " ").concat(this.type)); // Restore native controls
11837
-
11838
- ui.toggleNativeControls.call(this, true); // Bail
11839
-
11840
- return;
11841
- } // Inject custom controls if not present
11842
-
11843
-
11844
- if (!is$1.element(this.elements.controls)) {
11845
- // Inject custom controls
11846
- controls.inject.call(this); // Re-attach control listeners
11847
-
11848
- this.listeners.controls();
11849
- } // Remove native controls
11850
-
11851
-
11852
- ui.toggleNativeControls.call(this); // Setup captions for HTML5
11853
-
11854
- if (this.isHTML5) {
11855
- captions.setup.call(this);
11856
- } // Reset volume
11857
-
11858
-
11859
- this.volume = null; // Reset mute state
11860
-
11861
- this.muted = null; // Reset loop state
11862
-
11863
- this.loop = null; // Reset quality setting
11864
-
11865
- this.quality = null; // Reset speed
11866
-
11867
- this.speed = null; // Reset volume display
11868
-
11869
- controls.updateVolume.call(this); // Reset time display
11870
-
11871
- controls.timeUpdate.call(this); // Update the UI
11872
-
11873
- ui.checkPlaying.call(this); // Check for picture-in-picture support
11874
-
11875
- toggleClass(this.elements.container, this.config.classNames.pip.supported, support.pip && this.isHTML5 && this.isVideo); // Check for airplay support
11876
-
11877
- toggleClass(this.elements.container, this.config.classNames.airplay.supported, support.airplay && this.isHTML5); // Add iOS class
11878
-
11879
- toggleClass(this.elements.container, this.config.classNames.isIos, browser.isIos); // Add touch class
11880
-
11881
- toggleClass(this.elements.container, this.config.classNames.isTouch, this.touch); // Ready for API calls
11882
-
11883
- this.ready = true; // Ready event at end of execution stack
11884
-
11885
- setTimeout(function () {
11886
- triggerEvent.call(_this, _this.media, 'ready');
11887
- }, 0); // Set the title
11888
-
11889
- ui.setTitle.call(this); // Assure the poster image is set, if the property was added before the element was created
11890
-
11891
- if (this.poster) {
11892
- ui.setPoster.call(this, this.poster, false).catch(function () {});
11893
- } // Manually set the duration if user has overridden it.
11894
- // The event listeners for it doesn't get called if preload is disabled (#701)
11895
-
11896
-
11897
- if (this.config.duration) {
11898
- controls.durationUpdate.call(this);
11899
- }
11900
- },
11901
- // Setup aria attribute for play and iframe title
11902
- setTitle: function setTitle() {
11903
- // Find the current text
11904
- var label = i18n.get('play', this.config); // If there's a media title set, use that for the label
11905
-
11906
- if (is$1.string(this.config.title) && !is$1.empty(this.config.title)) {
11907
- label += ", ".concat(this.config.title);
11908
- } // If there's a play button, set label
11909
-
11910
-
11911
- Array.from(this.elements.buttons.play || []).forEach(function (button) {
11912
- button.setAttribute('aria-label', label);
11913
- }); // Set iframe title
11914
- // https://github.com/sampotts/plyr/issues/124
11915
-
11916
- if (this.isEmbed) {
11917
- var iframe = getElement.call(this, 'iframe');
11918
-
11919
- if (!is$1.element(iframe)) {
11920
- return;
11921
- } // Default to media type
11922
-
11923
-
11924
- var title = !is$1.empty(this.config.title) ? this.config.title : 'video';
11925
- var format = i18n.get('frameTitle', this.config);
11926
- iframe.setAttribute('title', format.replace('{title}', title));
11927
- }
11928
- },
11929
- // Toggle poster
11930
- togglePoster: function togglePoster(enable) {
11931
- toggleClass(this.elements.container, this.config.classNames.posterEnabled, enable);
11932
- },
11933
- // Set the poster image (async)
11934
- // Used internally for the poster setter, with the passive option forced to false
11935
- setPoster: function setPoster(poster) {
11936
- var _this2 = this;
11937
-
11938
- var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
11939
-
11940
- // Don't override if call is passive
11941
- if (passive && this.poster) {
11942
- return Promise.reject(new Error('Poster already set'));
11943
- } // Set property synchronously to respect the call order
11944
-
11945
-
11946
- this.media.setAttribute('poster', poster); // Wait until ui is ready
11947
-
11948
- return ready.call(this) // Load image
11949
- .then(function () {
11950
- return loadImage(poster);
11951
- }).catch(function (err) {
11952
- // Hide poster on error unless it's been set by another call
11953
- if (poster === _this2.poster) {
11954
- ui.togglePoster.call(_this2, false);
11955
- } // Rethrow
11956
-
11957
-
11958
- throw err;
11959
- }).then(function () {
11960
- // Prevent race conditions
11961
- if (poster !== _this2.poster) {
11962
- throw new Error('setPoster cancelled by later call to setPoster');
11963
- }
11964
- }).then(function () {
11965
- Object.assign(_this2.elements.poster.style, {
11966
- backgroundImage: "url('".concat(poster, "')"),
11967
- // Reset backgroundSize as well (since it can be set to "cover" for padded thumbnails for youtube)
11968
- backgroundSize: ''
11969
- });
11970
- ui.togglePoster.call(_this2, true);
11971
- return poster;
11972
- });
11973
- },
11974
- // Check playing state
11975
- checkPlaying: function checkPlaying(event) {
11976
- var _this3 = this;
11977
-
11978
- // Class hooks
11979
- toggleClass(this.elements.container, this.config.classNames.playing, this.playing);
11980
- toggleClass(this.elements.container, this.config.classNames.paused, this.paused);
11981
- toggleClass(this.elements.container, this.config.classNames.stopped, this.stopped); // Set state
11982
-
11983
- Array.from(this.elements.buttons.play || []).forEach(function (target) {
11984
- Object.assign(target, {
11985
- pressed: _this3.playing
11986
- });
11987
- }); // Only update controls on non timeupdate events
11988
-
11989
- if (is$1.event(event) && event.type === 'timeupdate') {
11990
- return;
11991
- } // Toggle controls
11992
-
11993
-
11994
- ui.toggleControls.call(this);
11995
- },
11996
- // Check if media is loading
11997
- checkLoading: function checkLoading(event) {
11998
- var _this4 = this;
11999
-
12000
- this.loading = ['stalled', 'waiting'].includes(event.type); // Clear timer
12001
-
12002
- clearTimeout(this.timers.loading); // Timer to prevent flicker when seeking
12003
-
12004
- this.timers.loading = setTimeout(function () {
12005
- // Update progress bar loading class state
12006
- toggleClass(_this4.elements.container, _this4.config.classNames.loading, _this4.loading); // Update controls visibility
12007
-
12008
- ui.toggleControls.call(_this4);
12009
- }, this.loading ? 250 : 0);
12010
- },
12011
- // Toggle controls based on state and `force` argument
12012
- toggleControls: function toggleControls(force) {
12013
- var controlsElement = this.elements.controls;
12014
-
12015
- if (controlsElement && this.config.hideControls) {
12016
- // Don't hide controls if a touch-device user recently seeked. (Must be limited to touch devices, or it occasionally prevents desktop controls from hiding.)
12017
- var recentTouchSeek = this.touch && this.lastSeekTime + 2000 > Date.now(); // Show controls if force, loading, paused, button interaction, or recent seek, otherwise hide
12018
-
12019
- this.toggleControls(Boolean(force || this.loading || this.paused || controlsElement.pressed || controlsElement.hover || recentTouchSeek));
12020
- }
12021
- }
12022
- };
12023
-
12024
- var Listeners =
12025
- /*#__PURE__*/
12026
- function () {
12027
- function Listeners(player) {
12028
- _classCallCheck(this, Listeners);
12029
-
12030
- this.player = player;
12031
- this.lastKey = null;
12032
- this.focusTimer = null;
12033
- this.lastKeyDown = null;
12034
- this.handleKey = this.handleKey.bind(this);
12035
- this.toggleMenu = this.toggleMenu.bind(this);
12036
- this.setTabFocus = this.setTabFocus.bind(this);
12037
- this.firstTouch = this.firstTouch.bind(this);
12038
- } // Handle key presses
12039
-
12040
-
12041
- _createClass(Listeners, [{
12042
- key: "handleKey",
12043
- value: function handleKey(event) {
12044
- var player = this.player;
12045
- var elements = player.elements;
12046
- var code = event.keyCode ? event.keyCode : event.which;
12047
- var pressed = event.type === 'keydown';
12048
- var repeat = pressed && code === this.lastKey; // Bail if a modifier key is set
12049
-
12050
- if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) {
12051
- return;
12052
- } // If the event is bubbled from the media element
12053
- // Firefox doesn't get the keycode for whatever reason
12054
-
12055
-
12056
- if (!is$1.number(code)) {
12057
- return;
12058
- } // Seek by the number keys
12059
-
12060
-
12061
- var seekByKey = function seekByKey() {
12062
- // Divide the max duration into 10th's and times by the number value
12063
- player.currentTime = player.duration / 10 * (code - 48);
12064
- }; // Handle the key on keydown
12065
- // Reset on keyup
12066
-
12067
-
12068
- if (pressed) {
12069
- // Check focused element
12070
- // and if the focused element is not editable (e.g. text input)
12071
- // and any that accept key input http://webaim.org/techniques/keyboard/
12072
- var focused = document.activeElement;
12073
-
12074
- if (is$1.element(focused)) {
12075
- var editable = player.config.selectors.editable;
12076
- var seek = elements.inputs.seek;
12077
-
12078
- if (focused !== seek && matches$1(focused, editable)) {
12079
- return;
12080
- }
12081
-
12082
- if (event.which === 32 && matches$1(focused, 'button, [role^="menuitem"]')) {
12083
- return;
12084
- }
12085
- } // Which keycodes should we prevent default
12086
-
12087
-
12088
- var preventDefault = [32, 37, 38, 39, 40, 48, 49, 50, 51, 52, 53, 54, 56, 57, 67, 70, 73, 75, 76, 77, 79]; // If the code is found prevent default (e.g. prevent scrolling for arrows)
12089
-
12090
- if (preventDefault.includes(code)) {
12091
- event.preventDefault();
12092
- event.stopPropagation();
12093
- }
12094
-
12095
- switch (code) {
12096
- case 48:
12097
- case 49:
12098
- case 50:
12099
- case 51:
12100
- case 52:
12101
- case 53:
12102
- case 54:
12103
- case 55:
12104
- case 56:
12105
- case 57:
12106
- // 0-9
12107
- if (!repeat) {
12108
- seekByKey();
12109
- }
12110
-
12111
- break;
12112
-
12113
- case 32:
12114
- case 75:
12115
- // Space and K key
12116
- if (!repeat) {
12117
- player.togglePlay();
12118
- }
12119
-
12120
- break;
12121
-
12122
- case 38:
12123
- // Arrow up
12124
- player.increaseVolume(0.1);
12125
- break;
12126
-
12127
- case 40:
12128
- // Arrow down
12129
- player.decreaseVolume(0.1);
12130
- break;
12131
-
12132
- case 77:
12133
- // M key
12134
- if (!repeat) {
12135
- player.muted = !player.muted;
12136
- }
12137
-
12138
- break;
12139
-
12140
- case 39:
12141
- // Arrow forward
12142
- player.forward();
12143
- break;
12144
-
12145
- case 37:
12146
- // Arrow back
12147
- player.rewind();
12148
- break;
12149
-
12150
- case 70:
12151
- // F key
12152
- player.fullscreen.toggle();
12153
- break;
12154
-
12155
- case 67:
12156
- // C key
12157
- if (!repeat) {
12158
- player.toggleCaptions();
12159
- }
12160
-
12161
- break;
12162
-
12163
- case 76:
12164
- // L key
12165
- player.loop = !player.loop;
12166
- break;
12167
-
12168
- /* case 73:
12169
- this.setLoop('start');
12170
- break;
12171
- case 76:
12172
- this.setLoop();
12173
- break;
12174
- case 79:
12175
- this.setLoop('end');
12176
- break; */
12177
-
12178
- default:
12179
- break;
12180
- } // Escape is handle natively when in full screen
12181
- // So we only need to worry about non native
12182
-
12183
-
12184
- if (code === 27 && !player.fullscreen.usingNative && player.fullscreen.active) {
12185
- player.fullscreen.toggle();
12186
- } // Store last code for next cycle
12187
-
12188
-
12189
- this.lastKey = code;
12190
- } else {
12191
- this.lastKey = null;
12192
- }
12193
- } // Toggle menu
12194
-
12195
- }, {
12196
- key: "toggleMenu",
12197
- value: function toggleMenu(event) {
12198
- controls.toggleMenu.call(this.player, event);
12199
- } // Device is touch enabled
12200
-
12201
- }, {
12202
- key: "firstTouch",
12203
- value: function firstTouch() {
12204
- var player = this.player;
12205
- var elements = player.elements;
12206
- player.touch = true; // Add touch class
12207
-
12208
- toggleClass(elements.container, player.config.classNames.isTouch, true);
12209
- }
12210
- }, {
12211
- key: "setTabFocus",
12212
- value: function setTabFocus(event) {
12213
- var player = this.player;
12214
- var elements = player.elements;
12215
- clearTimeout(this.focusTimer); // Ignore any key other than tab
12216
-
12217
- if (event.type === 'keydown' && event.which !== 9) {
12218
- return;
12219
- } // Store reference to event timeStamp
12220
-
12221
-
12222
- if (event.type === 'keydown') {
12223
- this.lastKeyDown = event.timeStamp;
12224
- } // Remove current classes
12225
-
12226
-
12227
- var removeCurrent = function removeCurrent() {
12228
- var className = player.config.classNames.tabFocus;
12229
- var current = getElements.call(player, ".".concat(className));
12230
- toggleClass(current, className, false);
12231
- }; // Determine if a key was pressed to trigger this event
12232
-
12233
-
12234
- var wasKeyDown = event.timeStamp - this.lastKeyDown <= 20; // Ignore focus events if a key was pressed prior
12235
-
12236
- if (event.type === 'focus' && !wasKeyDown) {
12237
- return;
12238
- } // Remove all current
12239
-
12240
-
12241
- removeCurrent(); // Delay the adding of classname until the focus has changed
12242
- // This event fires before the focusin event
12243
-
12244
- this.focusTimer = setTimeout(function () {
12245
- var focused = document.activeElement; // Ignore if current focus element isn't inside the player
12246
-
12247
- if (!elements.container.contains(focused)) {
12248
- return;
12249
- }
12250
-
12251
- toggleClass(document.activeElement, player.config.classNames.tabFocus, true);
12252
- }, 10);
12253
- } // Global window & document listeners
12254
-
12255
- }, {
12256
- key: "global",
12257
- value: function global() {
12258
- var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
12259
- var player = this.player; // Keyboard shortcuts
12260
-
12261
- if (player.config.keyboard.global) {
12262
- toggleListener.call(player, window, 'keydown keyup', this.handleKey, toggle, false);
12263
- } // Click anywhere closes menu
12264
-
12265
-
12266
- toggleListener.call(player, document.body, 'click', this.toggleMenu, toggle); // Detect touch by events
12267
-
12268
- once.call(player, document.body, 'touchstart', this.firstTouch); // Tab focus detection
12269
-
12270
- toggleListener.call(player, document.body, 'keydown focus blur', this.setTabFocus, toggle, false, true);
12271
- } // Container listeners
12272
-
12273
- }, {
12274
- key: "container",
12275
- value: function container() {
12276
- var player = this.player;
12277
- var config = player.config,
12278
- elements = player.elements,
12279
- timers = player.timers; // Keyboard shortcuts
12280
-
12281
- if (!config.keyboard.global && config.keyboard.focused) {
12282
- on.call(player, elements.container, 'keydown keyup', this.handleKey, false);
12283
- } // Toggle controls on mouse events and entering fullscreen
12284
-
12285
-
12286
- on.call(player, elements.container, 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen', function (event) {
12287
- var controlsElement = elements.controls; // Remove button states for fullscreen
12288
-
12289
- if (controlsElement && event.type === 'enterfullscreen') {
12290
- controlsElement.pressed = false;
12291
- controlsElement.hover = false;
12292
- } // Show, then hide after a timeout unless another control event occurs
12293
-
12294
-
12295
- var show = ['touchstart', 'touchmove', 'mousemove'].includes(event.type);
12296
- var delay = 0;
12297
-
12298
- if (show) {
12299
- ui.toggleControls.call(player, true); // Use longer timeout for touch devices
12300
-
12301
- delay = player.touch ? 3000 : 2000;
12302
- } // Clear timer
12303
-
12304
-
12305
- clearTimeout(timers.controls); // Set new timer to prevent flicker when seeking
12306
-
12307
- timers.controls = setTimeout(function () {
12308
- return ui.toggleControls.call(player, false);
12309
- }, delay);
12310
- }); // Set a gutter for Vimeo
12311
-
12312
- var setGutter = function setGutter(ratio, padding, toggle) {
12313
- if (!player.isVimeo) {
12314
- return;
12315
- }
12316
-
12317
- var target = player.elements.wrapper.firstChild;
12318
-
12319
- var _ratio = _slicedToArray(ratio, 2),
12320
- y = _ratio[1];
12321
-
12322
- var _getAspectRatio$call = getAspectRatio.call(player),
12323
- _getAspectRatio$call2 = _slicedToArray(_getAspectRatio$call, 2),
12324
- videoX = _getAspectRatio$call2[0],
12325
- videoY = _getAspectRatio$call2[1];
12326
-
12327
- target.style.maxWidth = toggle ? "".concat(y / videoY * videoX, "px") : null;
12328
- target.style.margin = toggle ? '0 auto' : null;
12329
- }; // Resize on fullscreen change
12330
-
12331
-
12332
- var setPlayerSize = function setPlayerSize(measure) {
12333
- // If we don't need to measure the viewport
12334
- if (!measure) {
12335
- return setAspectRatio.call(player);
12336
- }
12337
-
12338
- var rect = elements.container.getBoundingClientRect();
12339
- var width = rect.width,
12340
- height = rect.height;
12341
- return setAspectRatio.call(player, "".concat(width, ":").concat(height));
12342
- };
12343
-
12344
- var resized = function resized() {
12345
- clearTimeout(timers.resized);
12346
- timers.resized = setTimeout(setPlayerSize, 50);
12347
- };
12348
-
12349
- on.call(player, elements.container, 'enterfullscreen exitfullscreen', function (event) {
12350
- var _player$fullscreen = player.fullscreen,
12351
- target = _player$fullscreen.target,
12352
- usingNative = _player$fullscreen.usingNative; // Ignore events not from target
12353
-
12354
- if (target !== elements.container) {
12355
- return;
12356
- } // If it's not an embed and no ratio specified
12357
-
12358
-
12359
- if (!player.isEmbed && is$1.empty(player.config.ratio)) {
12360
- return;
12361
- }
12362
-
12363
- var isEnter = event.type === 'enterfullscreen'; // Set the player size when entering fullscreen to viewport size
12364
-
12365
- var _setPlayerSize = setPlayerSize(isEnter),
12366
- padding = _setPlayerSize.padding,
12367
- ratio = _setPlayerSize.ratio; // Set Vimeo gutter
12368
-
12369
-
12370
- setGutter(ratio, padding, isEnter); // If not using native fullscreen, we need to check for resizes of viewport
12371
-
12372
- if (!usingNative) {
12373
- if (isEnter) {
12374
- on.call(player, window, 'resize', resized);
12375
- } else {
12376
- off.call(player, window, 'resize', resized);
12377
- }
12378
- }
12379
- });
12380
- } // Listen for media events
12381
-
12382
- }, {
12383
- key: "media",
12384
- value: function media() {
12385
- var _this = this;
12386
-
12387
- var player = this.player;
12388
- var elements = player.elements; // Time change on media
12389
-
12390
- on.call(player, player.media, 'timeupdate seeking seeked', function (event) {
12391
- return controls.timeUpdate.call(player, event);
12392
- }); // Display duration
12393
-
12394
- on.call(player, player.media, 'durationchange loadeddata loadedmetadata', function (event) {
12395
- return controls.durationUpdate.call(player, event);
12396
- }); // Check for audio tracks on load
12397
- // We can't use `loadedmetadata` as it doesn't seem to have audio tracks at that point
12398
-
12399
- on.call(player, player.media, 'canplay loadeddata', function () {
12400
- toggleHidden(elements.volume, !player.hasAudio);
12401
- toggleHidden(elements.buttons.mute, !player.hasAudio);
12402
- }); // Handle the media finishing
12403
-
12404
- on.call(player, player.media, 'ended', function () {
12405
- // Show poster on end
12406
- if (player.isHTML5 && player.isVideo && player.config.resetOnEnd) {
12407
- // Restart
12408
- player.restart();
12409
- }
12410
- }); // Check for buffer progress
12411
-
12412
- on.call(player, player.media, 'progress playing seeking seeked', function (event) {
12413
- return controls.updateProgress.call(player, event);
12414
- }); // Handle volume changes
12415
-
12416
- on.call(player, player.media, 'volumechange', function (event) {
12417
- return controls.updateVolume.call(player, event);
12418
- }); // Handle play/pause
12419
-
12420
- on.call(player, player.media, 'playing play pause ended emptied timeupdate', function (event) {
12421
- return ui.checkPlaying.call(player, event);
12422
- }); // Loading state
12423
-
12424
- on.call(player, player.media, 'waiting canplay seeked playing', function (event) {
12425
- return ui.checkLoading.call(player, event);
12426
- }); // Click video
12427
-
12428
- if (player.supported.ui && player.config.clickToPlay && !player.isAudio) {
12429
- // Re-fetch the wrapper
12430
- var wrapper = getElement.call(player, ".".concat(player.config.classNames.video)); // Bail if there's no wrapper (this should never happen)
12431
-
12432
- if (!is$1.element(wrapper)) {
12433
- return;
12434
- } // On click play, pause or restart
12435
-
12436
-
12437
- on.call(player, elements.container, 'click', function (event) {
12438
- var targets = [elements.container, wrapper]; // Ignore if click if not container or in video wrapper
12439
-
12440
- if (!targets.includes(event.target) && !wrapper.contains(event.target)) {
12441
- return;
12442
- } // Touch devices will just show controls (if hidden)
12443
-
12444
-
12445
- if (player.touch && player.config.hideControls) {
12446
- return;
12447
- }
12448
-
12449
- if (player.ended) {
12450
- _this.proxy(event, player.restart, 'restart');
12451
-
12452
- _this.proxy(event, player.play, 'play');
12453
- } else {
12454
- _this.proxy(event, player.togglePlay, 'play');
12455
- }
12456
- });
12457
- } // Disable right click
12458
-
12459
-
12460
- if (player.supported.ui && player.config.disableContextMenu) {
12461
- on.call(player, elements.wrapper, 'contextmenu', function (event) {
12462
- event.preventDefault();
12463
- }, false);
12464
- } // Volume change
12465
-
12466
-
12467
- on.call(player, player.media, 'volumechange', function () {
12468
- // Save to storage
12469
- player.storage.set({
12470
- volume: player.volume,
12471
- muted: player.muted
12472
- });
12473
- }); // Speed change
12474
-
12475
- on.call(player, player.media, 'ratechange', function () {
12476
- // Update UI
12477
- controls.updateSetting.call(player, 'speed'); // Save to storage
12478
-
12479
-
12480
- player.storage.set({
12481
- speed: player.speed
12482
- });
12483
- }); // Quality change
12484
-
12485
- on.call(player, player.media, 'qualitychange', function (event) {
12486
- // Update UI
12487
- controls.updateSetting.call(player, 'quality', null, event.detail.quality);
12488
- }); // Update download link when ready and if quality changes
12489
-
12490
- on.call(player, player.media, 'ready qualitychange', function () {
12491
- controls.setDownloadUrl.call(player);
12492
- }); // Proxy events to container
12493
- // Bubble up key events for Edge
12494
-
12495
- var proxyEvents = player.config.events.concat(['keyup', 'keydown']).join(' ');
12496
- on.call(player, player.media, proxyEvents, function (event) {
12497
- var _event$detail = event.detail,
12498
- detail = _event$detail === void 0 ? {} : _event$detail; // Get error details from media
12499
-
12500
- if (event.type === 'error') {
12501
- detail = player.media.error;
12502
- }
12503
-
12504
- triggerEvent.call(player, elements.container, event.type, true, detail);
12505
- });
12506
- } // Run default and custom handlers
12507
-
12508
- }, {
12509
- key: "proxy",
12510
- value: function proxy(event, defaultHandler, customHandlerKey) {
12511
- var player = this.player;
12512
- var customHandler = player.config.listeners[customHandlerKey];
12513
- var hasCustomHandler = is$1.function(customHandler);
12514
- var returned = true; // Execute custom handler
12515
-
12516
- if (hasCustomHandler) {
12517
- returned = customHandler.call(player, event);
12518
- } // Only call default handler if not prevented in custom handler
12519
-
12520
-
12521
- if (returned && is$1.function(defaultHandler)) {
12522
- defaultHandler.call(player, event);
12523
- }
12524
- } // Trigger custom and default handlers
12525
-
12526
- }, {
12527
- key: "bind",
12528
- value: function bind(element, type, defaultHandler, customHandlerKey) {
12529
- var _this2 = this;
12530
-
12531
- var passive = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;
12532
- var player = this.player;
12533
- var customHandler = player.config.listeners[customHandlerKey];
12534
- var hasCustomHandler = is$1.function(customHandler);
12535
- on.call(player, element, type, function (event) {
12536
- return _this2.proxy(event, defaultHandler, customHandlerKey);
12537
- }, passive && !hasCustomHandler);
12538
- } // Listen for control events
12539
-
12540
- }, {
12541
- key: "controls",
12542
- value: function controls$1() {
12543
- var _this3 = this;
12544
-
12545
- var player = this.player;
12546
- var elements = player.elements; // IE doesn't support input event, so we fallback to change
12547
-
12548
- var inputEvent = browser.isIE ? 'change' : 'input'; // Play/pause toggle
12549
-
12550
- if (elements.buttons.play) {
12551
- Array.from(elements.buttons.play).forEach(function (button) {
12552
- _this3.bind(button, 'click', player.togglePlay, 'play');
12553
- });
12554
- } // Pause
12555
-
12556
-
12557
- this.bind(elements.buttons.restart, 'click', player.restart, 'restart'); // Rewind
12558
-
12559
- this.bind(elements.buttons.rewind, 'click', player.rewind, 'rewind'); // Rewind
12560
-
12561
- this.bind(elements.buttons.fastForward, 'click', player.forward, 'fastForward'); // Mute toggle
12562
-
12563
- this.bind(elements.buttons.mute, 'click', function () {
12564
- player.muted = !player.muted;
12565
- }, 'mute'); // Captions toggle
12566
-
12567
- this.bind(elements.buttons.captions, 'click', function () {
12568
- return player.toggleCaptions();
12569
- }); // Download
12570
-
12571
- this.bind(elements.buttons.download, 'click', function () {
12572
- triggerEvent.call(player, player.media, 'download');
12573
- }, 'download'); // Fullscreen toggle
12574
-
12575
- this.bind(elements.buttons.fullscreen, 'click', function () {
12576
- player.fullscreen.toggle();
12577
- }, 'fullscreen'); // Picture-in-Picture
12578
-
12579
- this.bind(elements.buttons.pip, 'click', function () {
12580
- player.pip = 'toggle';
12581
- }, 'pip'); // Airplay
12582
-
12583
- this.bind(elements.buttons.airplay, 'click', player.airplay, 'airplay'); // Settings menu - click toggle
12584
-
12585
- this.bind(elements.buttons.settings, 'click', function (event) {
12586
- // Prevent the document click listener closing the menu
12587
- event.stopPropagation();
12588
-
12589
- controls.toggleMenu.call(player, event);
12590
- }); // Settings menu - keyboard toggle
12591
- // We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus
12592
- // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143
12593
-
12594
- this.bind(elements.buttons.settings, 'keyup', function (event) {
12595
- var code = event.which; // We only care about space and return
12596
-
12597
- if (![13, 32].includes(code)) {
12598
- return;
12599
- } // Because return triggers a click anyway, all we need to do is set focus
12600
-
12601
-
12602
- if (code === 13) {
12603
- controls.focusFirstMenuItem.call(player, null, true);
12604
-
12605
- return;
12606
- } // Prevent scroll
12607
-
12608
-
12609
- event.preventDefault(); // Prevent playing video (Firefox)
12610
-
12611
- event.stopPropagation(); // Toggle menu
12612
-
12613
- controls.toggleMenu.call(player, event);
12614
- }, null, false // Can't be passive as we're preventing default
12615
- ); // Escape closes menu
12616
-
12617
- this.bind(elements.settings.menu, 'keydown', function (event) {
12618
- if (event.which === 27) {
12619
- controls.toggleMenu.call(player, event);
12620
- }
12621
- }); // Set range input alternative "value", which matches the tooltip time (#954)
12622
-
12623
- this.bind(elements.inputs.seek, 'mousedown mousemove', function (event) {
12624
- var rect = elements.progress.getBoundingClientRect();
12625
- var percent = 100 / rect.width * (event.pageX - rect.left);
12626
- event.currentTarget.setAttribute('seek-value', percent);
12627
- }); // Pause while seeking
12628
-
12629
- this.bind(elements.inputs.seek, 'mousedown mouseup keydown keyup touchstart touchend', function (event) {
12630
- var seek = event.currentTarget;
12631
- var code = event.keyCode ? event.keyCode : event.which;
12632
- var attribute = 'play-on-seeked';
12633
-
12634
- if (is$1.keyboardEvent(event) && code !== 39 && code !== 37) {
12635
- return;
12636
- } // Record seek time so we can prevent hiding controls for a few seconds after seek
12637
-
12638
-
12639
- player.lastSeekTime = Date.now(); // Was playing before?
12640
-
12641
- var play = seek.hasAttribute(attribute); // Done seeking
12642
-
12643
- var done = ['mouseup', 'touchend', 'keyup'].includes(event.type); // If we're done seeking and it was playing, resume playback
12644
-
12645
- if (play && done) {
12646
- seek.removeAttribute(attribute);
12647
- player.play();
12648
- } else if (!done && player.playing) {
12649
- seek.setAttribute(attribute, '');
12650
- player.pause();
12651
- }
12652
- }); // Fix range inputs on iOS
12653
- // Super weird iOS bug where after you interact with an <input type="range">,
12654
- // it takes over further interactions on the page. This is a hack
12655
-
12656
- if (browser.isIos) {
12657
- var inputs = getElements.call(player, 'input[type="range"]');
12658
- Array.from(inputs).forEach(function (input) {
12659
- return _this3.bind(input, inputEvent, function (event) {
12660
- return repaint(event.target);
12661
- });
12662
- });
12663
- } // Seek
12664
-
12665
-
12666
- this.bind(elements.inputs.seek, inputEvent, function (event) {
12667
- var seek = event.currentTarget; // If it exists, use seek-value instead of "value" for consistency with tooltip time (#954)
12668
-
12669
- var seekTo = seek.getAttribute('seek-value');
12670
-
12671
- if (is$1.empty(seekTo)) {
12672
- seekTo = seek.value;
12673
- }
12674
-
12675
- seek.removeAttribute('seek-value');
12676
- player.currentTime = seekTo / seek.max * player.duration;
12677
- }, 'seek'); // Seek tooltip
12678
-
12679
- this.bind(elements.progress, 'mouseenter mouseleave mousemove', function (event) {
12680
- return controls.updateSeekTooltip.call(player, event);
12681
- }); // Preview thumbnails plugin
12682
- // TODO: Really need to work on some sort of plug-in wide event bus or pub-sub for this
12683
-
12684
- this.bind(elements.progress, 'mousemove touchmove', function (event) {
12685
- var previewThumbnails = player.previewThumbnails;
12686
-
12687
- if (previewThumbnails && previewThumbnails.loaded) {
12688
- previewThumbnails.startMove(event);
12689
- }
12690
- }); // Hide thumbnail preview - on mouse click, mouse leave, and video play/seek. All four are required, e.g., for buffering
12691
-
12692
- this.bind(elements.progress, 'mouseleave click', function () {
12693
- var previewThumbnails = player.previewThumbnails;
12694
-
12695
- if (previewThumbnails && previewThumbnails.loaded) {
12696
- previewThumbnails.endMove(false, true);
12697
- }
12698
- }); // Show scrubbing preview
12699
-
12700
- this.bind(elements.progress, 'mousedown touchstart', function (event) {
12701
- var previewThumbnails = player.previewThumbnails;
12702
-
12703
- if (previewThumbnails && previewThumbnails.loaded) {
12704
- previewThumbnails.startScrubbing(event);
12705
- }
12706
- });
12707
- this.bind(elements.progress, 'mouseup touchend', function (event) {
12708
- var previewThumbnails = player.previewThumbnails;
12709
-
12710
- if (previewThumbnails && previewThumbnails.loaded) {
12711
- previewThumbnails.endScrubbing(event);
12712
- }
12713
- }); // Polyfill for lower fill in <input type="range"> for webkit
12714
-
12715
- if (browser.isWebkit) {
12716
- Array.from(getElements.call(player, 'input[type="range"]')).forEach(function (element) {
12717
- _this3.bind(element, 'input', function (event) {
12718
- return controls.updateRangeFill.call(player, event.target);
12719
- });
12720
- });
12721
- } // Current time invert
12722
- // Only if one time element is used for both currentTime and duration
12723
-
12724
-
12725
- if (player.config.toggleInvert && !is$1.element(elements.display.duration)) {
12726
- this.bind(elements.display.currentTime, 'click', function () {
12727
- // Do nothing if we're at the start
12728
- if (player.currentTime === 0) {
12729
- return;
12730
- }
12731
-
12732
- player.config.invertTime = !player.config.invertTime;
12733
-
12734
- controls.timeUpdate.call(player);
12735
- });
12736
- } // Volume
12737
-
12738
-
12739
- this.bind(elements.inputs.volume, inputEvent, function (event) {
12740
- player.volume = event.target.value;
12741
- }, 'volume'); // Update controls.hover state (used for ui.toggleControls to avoid hiding when interacting)
12742
-
12743
- this.bind(elements.controls, 'mouseenter mouseleave', function (event) {
12744
- elements.controls.hover = !player.touch && event.type === 'mouseenter';
12745
- }); // Update controls.pressed state (used for ui.toggleControls to avoid hiding when interacting)
12746
-
12747
- this.bind(elements.controls, 'mousedown mouseup touchstart touchend touchcancel', function (event) {
12748
- elements.controls.pressed = ['mousedown', 'touchstart'].includes(event.type);
12749
- }); // Show controls when they receive focus (e.g., when using keyboard tab key)
12750
-
12751
- this.bind(elements.controls, 'focusin', function () {
12752
- var config = player.config,
12753
- timers = player.timers; // Skip transition to prevent focus from scrolling the parent element
12754
-
12755
- toggleClass(elements.controls, config.classNames.noTransition, true); // Toggle
12756
-
12757
- ui.toggleControls.call(player, true); // Restore transition
12758
-
12759
- setTimeout(function () {
12760
- toggleClass(elements.controls, config.classNames.noTransition, false);
12761
- }, 0); // Delay a little more for mouse users
12762
-
12763
- var delay = _this3.touch ? 3000 : 4000; // Clear timer
12764
-
12765
- clearTimeout(timers.controls); // Hide again after delay
12766
-
12767
- timers.controls = setTimeout(function () {
12768
- return ui.toggleControls.call(player, false);
12769
- }, delay);
12770
- }); // Mouse wheel for volume
12771
-
12772
- this.bind(elements.inputs.volume, 'wheel', function (event) {
12773
- // Detect "natural" scroll - suppored on OS X Safari only
12774
- // Other browsers on OS X will be inverted until support improves
12775
- var inverted = event.webkitDirectionInvertedFromDevice; // Get delta from event. Invert if `inverted` is true
12776
-
12777
- var _map = [event.deltaX, -event.deltaY].map(function (value) {
12778
- return inverted ? -value : value;
12779
- }),
12780
- _map2 = _slicedToArray(_map, 2),
12781
- x = _map2[0],
12782
- y = _map2[1]; // Using the biggest delta, normalize to 1 or -1 (or 0 if no delta)
12783
-
12784
-
12785
- var direction = Math.sign(Math.abs(x) > Math.abs(y) ? x : y); // Change the volume by 2%
12786
-
12787
- player.increaseVolume(direction / 50); // Don't break page scrolling at max and min
12788
-
12789
- var volume = player.media.volume;
12790
-
12791
- if (direction === 1 && volume < 1 || direction === -1 && volume > 0) {
12792
- event.preventDefault();
12793
- }
12794
- }, 'volume', false);
12795
- }
12796
- }]);
12797
-
12798
- return Listeners;
12799
- }();
12800
-
12801
- var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
12802
-
12803
- function createCommonjsModule(fn, module) {
12804
- return module = { exports: {} }, fn(module, module.exports), module.exports;
12805
- }
12806
-
12807
- var loadjs_umd = createCommonjsModule(function (module, exports) {
12808
- (function (root, factory) {
12809
- {
12810
- module.exports = factory();
12811
- }
12812
- })(commonjsGlobal, function () {
12813
- /**
12814
- * Global dependencies.
12815
- * @global {Object} document - DOM
12816
- */
12817
- var devnull = function devnull() {},
12818
- bundleIdCache = {},
12819
- bundleResultCache = {},
12820
- bundleCallbackQueue = {};
12821
- /**
12822
- * Subscribe to bundle load event.
12823
- * @param {string[]} bundleIds - Bundle ids
12824
- * @param {Function} callbackFn - The callback function
12825
- */
12826
-
12827
-
12828
- function subscribe(bundleIds, callbackFn) {
12829
- // listify
12830
- bundleIds = bundleIds.push ? bundleIds : [bundleIds];
12831
- var depsNotFound = [],
12832
- i = bundleIds.length,
12833
- numWaiting = i,
12834
- fn,
12835
- bundleId,
12836
- r,
12837
- q; // define callback function
12838
-
12839
- fn = function fn(bundleId, pathsNotFound) {
12840
- if (pathsNotFound.length) depsNotFound.push(bundleId);
12841
- numWaiting--;
12842
- if (!numWaiting) callbackFn(depsNotFound);
12843
- }; // register callback
12844
-
12845
-
12846
- while (i--) {
12847
- bundleId = bundleIds[i]; // execute callback if in result cache
12848
-
12849
- r = bundleResultCache[bundleId];
12850
-
12851
- if (r) {
12852
- fn(bundleId, r);
12853
- continue;
12854
- } // add to callback queue
12855
-
12856
-
12857
- q = bundleCallbackQueue[bundleId] = bundleCallbackQueue[bundleId] || [];
12858
- q.push(fn);
12859
- }
12860
- }
12861
- /**
12862
- * Publish bundle load event.
12863
- * @param {string} bundleId - Bundle id
12864
- * @param {string[]} pathsNotFound - List of files not found
12865
- */
12866
-
12867
-
12868
- function publish(bundleId, pathsNotFound) {
12869
- // exit if id isn't defined
12870
- if (!bundleId) return;
12871
- var q = bundleCallbackQueue[bundleId]; // cache result
12872
-
12873
- bundleResultCache[bundleId] = pathsNotFound; // exit if queue is empty
12874
-
12875
- if (!q) return; // empty callback queue
12876
-
12877
- while (q.length) {
12878
- q[0](bundleId, pathsNotFound);
12879
- q.splice(0, 1);
12880
- }
12881
- }
12882
- /**
12883
- * Execute callbacks.
12884
- * @param {Object or Function} args - The callback args
12885
- * @param {string[]} depsNotFound - List of dependencies not found
12886
- */
12887
-
12888
-
12889
- function executeCallbacks(args, depsNotFound) {
12890
- // accept function as argument
12891
- if (args.call) args = {
12892
- success: args
12893
- }; // success and error callbacks
12894
-
12895
- if (depsNotFound.length) (args.error || devnull)(depsNotFound);else (args.success || devnull)(args);
12896
- }
12897
- /**
12898
- * Load individual file.
12899
- * @param {string} path - The file path
12900
- * @param {Function} callbackFn - The callback function
12901
- */
12902
-
12903
-
12904
- function loadFile(path, callbackFn, args, numTries) {
12905
- var doc = document,
12906
- async = args.async,
12907
- maxTries = (args.numRetries || 0) + 1,
12908
- beforeCallbackFn = args.before || devnull,
12909
- pathStripped = path.replace(/^(css|img)!/, ''),
12910
- isLegacyIECss,
12911
- e;
12912
- numTries = numTries || 0;
12913
-
12914
- if (/(^css!|\.css$)/.test(path)) {
12915
- // css
12916
- e = doc.createElement('link');
12917
- e.rel = 'stylesheet';
12918
- e.href = pathStripped; // tag IE9+
12919
-
12920
- isLegacyIECss = 'hideFocus' in e; // use preload in IE Edge (to detect load errors)
12921
-
12922
- if (isLegacyIECss && e.relList) {
12923
- isLegacyIECss = 0;
12924
- e.rel = 'preload';
12925
- e.as = 'style';
12926
- }
12927
- } else if (/(^img!|\.(png|gif|jpg|svg)$)/.test(path)) {
12928
- // image
12929
- e = doc.createElement('img');
12930
- e.src = pathStripped;
12931
- } else {
12932
- // javascript
12933
- e = doc.createElement('script');
12934
- e.src = path;
12935
- e.async = async === undefined ? true : async;
12936
- }
12937
-
12938
- e.onload = e.onerror = e.onbeforeload = function (ev) {
12939
- var result = ev.type[0]; // treat empty stylesheets as failures to get around lack of onerror
12940
- // support in IE9-11
12941
-
12942
- if (isLegacyIECss) {
12943
- try {
12944
- if (!e.sheet.cssText.length) result = 'e';
12945
- } catch (x) {
12946
- // sheets objects created from load errors don't allow access to
12947
- // `cssText` (unless error is Code:18 SecurityError)
12948
- if (x.code != 18) result = 'e';
12949
- }
12950
- } // handle retries in case of load failure
12951
-
12952
-
12953
- if (result == 'e') {
12954
- // increment counter
12955
- numTries += 1; // exit function and try again
12956
-
12957
- if (numTries < maxTries) {
12958
- return loadFile(path, callbackFn, args, numTries);
12959
- }
12960
- } else if (e.rel == 'preload' && e.as == 'style') {
12961
- // activate preloaded stylesheets
12962
- return e.rel = 'stylesheet'; // jshint ignore:line
12963
- } // execute callback
12964
-
12965
-
12966
- callbackFn(path, result, ev.defaultPrevented);
12967
- }; // add to document (unless callback returns `false`)
12968
-
12969
-
12970
- if (beforeCallbackFn(path, e) !== false) doc.head.appendChild(e);
12971
- }
12972
- /**
12973
- * Load multiple files.
12974
- * @param {string[]} paths - The file paths
12975
- * @param {Function} callbackFn - The callback function
12976
- */
12977
-
12978
-
12979
- function loadFiles(paths, callbackFn, args) {
12980
- // listify paths
12981
- paths = paths.push ? paths : [paths];
12982
- var numWaiting = paths.length,
12983
- x = numWaiting,
12984
- pathsNotFound = [],
12985
- fn,
12986
- i; // define callback function
12987
-
12988
- fn = function fn(path, result, defaultPrevented) {
12989
- // handle error
12990
- if (result == 'e') pathsNotFound.push(path); // handle beforeload event. If defaultPrevented then that means the load
12991
- // will be blocked (ex. Ghostery/ABP on Safari)
12992
-
12993
- if (result == 'b') {
12994
- if (defaultPrevented) pathsNotFound.push(path);else return;
12995
- }
12996
-
12997
- numWaiting--;
12998
- if (!numWaiting) callbackFn(pathsNotFound);
12999
- }; // load scripts
13000
-
13001
-
13002
- for (i = 0; i < x; i++) {
13003
- loadFile(paths[i], fn, args);
13004
- }
13005
- }
13006
- /**
13007
- * Initiate script load and register bundle.
13008
- * @param {(string|string[])} paths - The file paths
13009
- * @param {(string|Function|Object)} [arg1] - The (1) bundleId or (2) success
13010
- * callback or (3) object literal with success/error arguments, numRetries,
13011
- * etc.
13012
- * @param {(Function|Object)} [arg2] - The (1) success callback or (2) object
13013
- * literal with success/error arguments, numRetries, etc.
13014
- */
13015
-
13016
-
13017
- function loadjs(paths, arg1, arg2) {
13018
- var bundleId, args; // bundleId (if string)
13019
-
13020
- if (arg1 && arg1.trim) bundleId = arg1; // args (default is {})
13021
-
13022
- args = (bundleId ? arg2 : arg1) || {}; // throw error if bundle is already defined
13023
-
13024
- if (bundleId) {
13025
- if (bundleId in bundleIdCache) {
13026
- throw "LoadJS";
13027
- } else {
13028
- bundleIdCache[bundleId] = true;
13029
- }
13030
- }
13031
-
13032
- function loadFn(resolve, reject) {
13033
- loadFiles(paths, function (pathsNotFound) {
13034
- // execute callbacks
13035
- executeCallbacks(args, pathsNotFound); // resolve Promise
13036
-
13037
- if (resolve) {
13038
- executeCallbacks({
13039
- success: resolve,
13040
- error: reject
13041
- }, pathsNotFound);
13042
- } // publish bundle load event
13043
-
13044
-
13045
- publish(bundleId, pathsNotFound);
13046
- }, args);
13047
- }
13048
-
13049
- if (args.returnPromise) return new Promise(loadFn);else loadFn();
13050
- }
13051
- /**
13052
- * Execute callbacks when dependencies have been satisfied.
13053
- * @param {(string|string[])} deps - List of bundle ids
13054
- * @param {Object} args - success/error arguments
13055
- */
13056
-
13057
-
13058
- loadjs.ready = function ready(deps, args) {
13059
- // subscribe to bundle load event
13060
- subscribe(deps, function (depsNotFound) {
13061
- // execute callbacks
13062
- executeCallbacks(args, depsNotFound);
13063
- });
13064
- return loadjs;
13065
- };
13066
- /**
13067
- * Manually satisfy bundle dependencies.
13068
- * @param {string} bundleId - The bundle id
13069
- */
13070
-
13071
-
13072
- loadjs.done = function done(bundleId) {
13073
- publish(bundleId, []);
13074
- };
13075
- /**
13076
- * Reset loadjs dependencies statuses
13077
- */
13078
-
13079
-
13080
- loadjs.reset = function reset() {
13081
- bundleIdCache = {};
13082
- bundleResultCache = {};
13083
- bundleCallbackQueue = {};
13084
- };
13085
- /**
13086
- * Determine if bundle has already been defined
13087
- * @param String} bundleId - The bundle id
13088
- */
13089
-
13090
-
13091
- loadjs.isDefined = function isDefined(bundleId) {
13092
- return bundleId in bundleIdCache;
13093
- }; // export
13094
-
13095
-
13096
- return loadjs;
13097
- });
13098
- });
13099
-
13100
- // ==========================================================================
13101
- function loadScript(url) {
13102
- return new Promise(function (resolve, reject) {
13103
- loadjs_umd(url, {
13104
- success: resolve,
13105
- error: reject
13106
- });
13107
- });
13108
- }
13109
-
13110
- function parseId(url) {
13111
- if (is$1.empty(url)) {
13112
- return null;
13113
- }
13114
-
13115
- if (is$1.number(Number(url))) {
13116
- return url;
13117
- }
13118
-
13119
- var regex = /^.*(vimeo.com\/|video\/)(\d+).*/;
13120
- return url.match(regex) ? RegExp.$2 : url;
13121
- } // Set playback state and trigger change (only on actual change)
13122
-
13123
-
13124
- function assurePlaybackState(play) {
13125
- if (play && !this.embed.hasPlayed) {
13126
- this.embed.hasPlayed = true;
13127
- }
13128
-
13129
- if (this.media.paused === play) {
13130
- this.media.paused = !play;
13131
- triggerEvent.call(this, this.media, play ? 'play' : 'pause');
13132
- }
13133
- }
13134
-
13135
- var vimeo = {
13136
- setup: function setup() {
13137
- var _this = this;
13138
-
13139
- // Add embed class for responsive
13140
- toggleClass(this.elements.wrapper, this.config.classNames.embed, true); // Set intial ratio
13141
-
13142
- setAspectRatio.call(this); // Load the SDK if not already
13143
-
13144
- if (!is$1.object(window.Vimeo)) {
13145
- loadScript(this.config.urls.vimeo.sdk).then(function () {
13146
- vimeo.ready.call(_this);
13147
- }).catch(function (error) {
13148
- _this.debug.warn('Vimeo SDK (player.js) failed to load', error);
13149
- });
13150
- } else {
13151
- vimeo.ready.call(this);
13152
- }
13153
- },
13154
- // API Ready
13155
- ready: function ready() {
13156
- var _this2 = this;
13157
-
13158
- var player = this;
13159
- var config = player.config.vimeo; // Get Vimeo params for the iframe
13160
-
13161
- var params = buildUrlParams(extend({}, {
13162
- loop: player.config.loop.active,
13163
- autoplay: player.autoplay,
13164
- muted: player.muted,
13165
- gesture: 'media',
13166
- playsinline: !this.config.fullscreen.iosNative
13167
- }, config)); // Get the source URL or ID
13168
-
13169
- var source = player.media.getAttribute('src'); // Get from <div> if needed
13170
-
13171
- if (is$1.empty(source)) {
13172
- source = player.media.getAttribute(player.config.attributes.embed.id);
13173
- }
13174
-
13175
- var id = parseId(source); // Build an iframe
13176
-
13177
- var iframe = createElement('iframe');
13178
- var src = format(player.config.urls.vimeo.iframe, id, params);
13179
- iframe.setAttribute('src', src);
13180
- iframe.setAttribute('allowfullscreen', '');
13181
- iframe.setAttribute('allowtransparency', '');
13182
- iframe.setAttribute('allow', 'autoplay'); // Get poster, if already set
13183
-
13184
- var poster = player.poster; // Inject the package
13185
-
13186
- var wrapper = createElement('div', {
13187
- poster: poster,
13188
- class: player.config.classNames.embedContainer
13189
- });
13190
- wrapper.appendChild(iframe);
13191
- player.media = replaceElement(wrapper, player.media); // Get poster image
13192
-
13193
- fetch(format(player.config.urls.vimeo.api, id), 'json').then(function (response) {
13194
- if (is$1.empty(response)) {
13195
- return;
13196
- } // Get the URL for thumbnail
13197
-
13198
-
13199
- var url = new URL(response[0].thumbnail_large); // Get original image
13200
-
13201
- url.pathname = "".concat(url.pathname.split('_')[0], ".jpg"); // Set and show poster
13202
-
13203
- ui.setPoster.call(player, url.href).catch(function () {});
13204
- }); // Setup instance
13205
- // https://github.com/vimeo/player.js
13206
-
13207
- player.embed = new window.Vimeo.Player(iframe, {
13208
- autopause: player.config.autopause,
13209
- muted: player.muted
13210
- });
13211
- player.media.paused = true;
13212
- player.media.currentTime = 0; // Disable native text track rendering
13213
-
13214
- if (player.supported.ui) {
13215
- player.embed.disableTextTrack();
13216
- } // Create a faux HTML5 API using the Vimeo API
13217
-
13218
-
13219
- player.media.play = function () {
13220
- assurePlaybackState.call(player, true);
13221
- return player.embed.play();
13222
- };
13223
-
13224
- player.media.pause = function () {
13225
- assurePlaybackState.call(player, false);
13226
- return player.embed.pause();
13227
- };
13228
-
13229
- player.media.stop = function () {
13230
- player.pause();
13231
- player.currentTime = 0;
13232
- }; // Seeking
13233
-
13234
-
13235
- var currentTime = player.media.currentTime;
13236
- Object.defineProperty(player.media, 'currentTime', {
13237
- get: function get() {
13238
- return currentTime;
13239
- },
13240
- set: function set(time) {
13241
- // Vimeo will automatically play on seek if the video hasn't been played before
13242
- // Get current paused state and volume etc
13243
- var embed = player.embed,
13244
- media = player.media,
13245
- paused = player.paused,
13246
- volume = player.volume;
13247
- var restorePause = paused && !embed.hasPlayed; // Set seeking state and trigger event
13248
-
13249
- media.seeking = true;
13250
- triggerEvent.call(player, media, 'seeking'); // If paused, mute until seek is complete
13251
-
13252
- Promise.resolve(restorePause && embed.setVolume(0)) // Seek
13253
- .then(function () {
13254
- return embed.setCurrentTime(time);
13255
- }) // Restore paused
13256
- .then(function () {
13257
- return restorePause && embed.pause();
13258
- }) // Restore volume
13259
- .then(function () {
13260
- return restorePause && embed.setVolume(volume);
13261
- }).catch(function () {// Do nothing
13262
- });
13263
- }
13264
- }); // Playback speed
13265
-
13266
- var speed = player.config.speed.selected;
13267
- Object.defineProperty(player.media, 'playbackRate', {
13268
- get: function get() {
13269
- return speed;
13270
- },
13271
- set: function set(input) {
13272
- player.embed.setPlaybackRate(input).then(function () {
13273
- speed = input;
13274
- triggerEvent.call(player, player.media, 'ratechange');
13275
- }).catch(function (error) {
13276
- // Hide menu item (and menu if empty)
13277
- if (error.name === 'Error') {
13278
- controls.setSpeedMenu.call(player, []);
13279
- }
13280
- });
13281
- }
13282
- }); // Volume
13283
-
13284
- var volume = player.config.volume;
13285
- Object.defineProperty(player.media, 'volume', {
13286
- get: function get() {
13287
- return volume;
13288
- },
13289
- set: function set(input) {
13290
- player.embed.setVolume(input).then(function () {
13291
- volume = input;
13292
- triggerEvent.call(player, player.media, 'volumechange');
13293
- });
13294
- }
13295
- }); // Muted
13296
-
13297
- var muted = player.config.muted;
13298
- Object.defineProperty(player.media, 'muted', {
13299
- get: function get() {
13300
- return muted;
13301
- },
13302
- set: function set(input) {
13303
- var toggle = is$1.boolean(input) ? input : false;
13304
- player.embed.setVolume(toggle ? 0 : player.config.volume).then(function () {
13305
- muted = toggle;
13306
- triggerEvent.call(player, player.media, 'volumechange');
13307
- });
13308
- }
13309
- }); // Loop
13310
-
13311
- var loop = player.config.loop;
13312
- Object.defineProperty(player.media, 'loop', {
13313
- get: function get() {
13314
- return loop;
13315
- },
13316
- set: function set(input) {
13317
- var toggle = is$1.boolean(input) ? input : player.config.loop.active;
13318
- player.embed.setLoop(toggle).then(function () {
13319
- loop = toggle;
13320
- });
13321
- }
13322
- }); // Source
13323
-
13324
- var currentSrc;
13325
- player.embed.getVideoUrl().then(function (value) {
13326
- currentSrc = value;
13327
- controls.setDownloadUrl.call(player);
13328
- }).catch(function (error) {
13329
- _this2.debug.warn(error);
13330
- });
13331
- Object.defineProperty(player.media, 'currentSrc', {
13332
- get: function get() {
13333
- return currentSrc;
13334
- }
13335
- }); // Ended
13336
-
13337
- Object.defineProperty(player.media, 'ended', {
13338
- get: function get() {
13339
- return player.currentTime === player.duration;
13340
- }
13341
- }); // Set aspect ratio based on video size
13342
-
13343
- Promise.all([player.embed.getVideoWidth(), player.embed.getVideoHeight()]).then(function (dimensions) {
13344
- var _dimensions = _slicedToArray(dimensions, 2),
13345
- width = _dimensions[0],
13346
- height = _dimensions[1];
13347
-
13348
- player.embed.ratio = [width, height];
13349
- setAspectRatio.call(_this2);
13350
- }); // Set autopause
13351
-
13352
- player.embed.setAutopause(player.config.autopause).then(function (state) {
13353
- player.config.autopause = state;
13354
- }); // Get title
13355
-
13356
- player.embed.getVideoTitle().then(function (title) {
13357
- player.config.title = title;
13358
- ui.setTitle.call(_this2);
13359
- }); // Get current time
13360
-
13361
- player.embed.getCurrentTime().then(function (value) {
13362
- currentTime = value;
13363
- triggerEvent.call(player, player.media, 'timeupdate');
13364
- }); // Get duration
13365
-
13366
- player.embed.getDuration().then(function (value) {
13367
- player.media.duration = value;
13368
- triggerEvent.call(player, player.media, 'durationchange');
13369
- }); // Get captions
13370
-
13371
- player.embed.getTextTracks().then(function (tracks) {
13372
- player.media.textTracks = tracks;
13373
- captions.setup.call(player);
13374
- });
13375
- player.embed.on('cuechange', function (_ref) {
13376
- var _ref$cues = _ref.cues,
13377
- cues = _ref$cues === void 0 ? [] : _ref$cues;
13378
- var strippedCues = cues.map(function (cue) {
13379
- return stripHTML(cue.text);
13380
- });
13381
- captions.updateCues.call(player, strippedCues);
13382
- });
13383
- player.embed.on('loaded', function () {
13384
- // Assure state and events are updated on autoplay
13385
- player.embed.getPaused().then(function (paused) {
13386
- assurePlaybackState.call(player, !paused);
13387
-
13388
- if (!paused) {
13389
- triggerEvent.call(player, player.media, 'playing');
13390
- }
13391
- });
13392
-
13393
- if (is$1.element(player.embed.element) && player.supported.ui) {
13394
- var frame = player.embed.element; // Fix keyboard focus issues
13395
- // https://github.com/sampotts/plyr/issues/317
13396
-
13397
- frame.setAttribute('tabindex', -1);
13398
- }
13399
- });
13400
- player.embed.on('play', function () {
13401
- assurePlaybackState.call(player, true);
13402
- triggerEvent.call(player, player.media, 'playing');
13403
- });
13404
- player.embed.on('pause', function () {
13405
- assurePlaybackState.call(player, false);
13406
- });
13407
- player.embed.on('timeupdate', function (data) {
13408
- player.media.seeking = false;
13409
- currentTime = data.seconds;
13410
- triggerEvent.call(player, player.media, 'timeupdate');
13411
- });
13412
- player.embed.on('progress', function (data) {
13413
- player.media.buffered = data.percent;
13414
- triggerEvent.call(player, player.media, 'progress'); // Check all loaded
13415
-
13416
- if (parseInt(data.percent, 10) === 1) {
13417
- triggerEvent.call(player, player.media, 'canplaythrough');
13418
- } // Get duration as if we do it before load, it gives an incorrect value
13419
- // https://github.com/sampotts/plyr/issues/891
13420
-
13421
-
13422
- player.embed.getDuration().then(function (value) {
13423
- if (value !== player.media.duration) {
13424
- player.media.duration = value;
13425
- triggerEvent.call(player, player.media, 'durationchange');
13426
- }
13427
- });
13428
- });
13429
- player.embed.on('seeked', function () {
13430
- player.media.seeking = false;
13431
- triggerEvent.call(player, player.media, 'seeked');
13432
- });
13433
- player.embed.on('ended', function () {
13434
- player.media.paused = true;
13435
- triggerEvent.call(player, player.media, 'ended');
13436
- });
13437
- player.embed.on('error', function (detail) {
13438
- player.media.error = detail;
13439
- triggerEvent.call(player, player.media, 'error');
13440
- }); // Rebuild UI
13441
-
13442
- setTimeout(function () {
13443
- return ui.build.call(player);
13444
- }, 0);
13445
- }
13446
- };
13447
-
13448
- // ==========================================================================
13449
-
13450
- function parseId$1(url) {
13451
- if (is$1.empty(url)) {
13452
- return null;
13453
- }
13454
-
13455
- var regex = /^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|&v=)([^#&?]*).*/;
13456
- return url.match(regex) ? RegExp.$2 : url;
13457
- } // Set playback state and trigger change (only on actual change)
13458
-
13459
-
13460
- function assurePlaybackState$1(play) {
13461
- if (play && !this.embed.hasPlayed) {
13462
- this.embed.hasPlayed = true;
13463
- }
13464
-
13465
- if (this.media.paused === play) {
13466
- this.media.paused = !play;
13467
- triggerEvent.call(this, this.media, play ? 'play' : 'pause');
13468
- }
13469
- }
13470
-
13471
- function getHost(config) {
13472
- if (config.noCookie) {
13473
- return 'https://www.youtube-nocookie.com';
13474
- }
13475
-
13476
- if (window.location.protocol === 'http:') {
13477
- return 'http://www.youtube.com';
13478
- } // Use YouTube's default
13479
-
13480
-
13481
- return undefined;
13482
- }
13483
-
13484
- var youtube = {
13485
- setup: function setup() {
13486
- var _this = this;
13487
-
13488
- // Add embed class for responsive
13489
- toggleClass(this.elements.wrapper, this.config.classNames.embed, true); // Setup API
13490
-
13491
- if (is$1.object(window.YT) && is$1.function(window.YT.Player)) {
13492
- youtube.ready.call(this);
13493
- } else {
13494
- // Reference current global callback
13495
- var callback = window.onYouTubeIframeAPIReady; // Set callback to process queue
13496
-
13497
- window.onYouTubeIframeAPIReady = function () {
13498
- // Call global callback if set
13499
- if (is$1.function(callback)) {
13500
- callback();
13501
- }
13502
-
13503
- youtube.ready.call(_this);
13504
- }; // Load the SDK
13505
-
13506
-
13507
- loadScript(this.config.urls.youtube.sdk).catch(function (error) {
13508
- _this.debug.warn('YouTube API failed to load', error);
13509
- });
13510
- }
13511
- },
13512
- // Get the media title
13513
- getTitle: function getTitle(videoId) {
13514
- var _this2 = this;
13515
-
13516
- var url = format(this.config.urls.youtube.api, videoId);
13517
- fetch(url).then(function (data) {
13518
- if (is$1.object(data)) {
13519
- var title = data.title,
13520
- height = data.height,
13521
- width = data.width; // Set title
13522
-
13523
- _this2.config.title = title;
13524
- ui.setTitle.call(_this2); // Set aspect ratio
13525
-
13526
- _this2.embed.ratio = [width, height];
13527
- }
13528
-
13529
- setAspectRatio.call(_this2);
13530
- }).catch(function () {
13531
- // Set aspect ratio
13532
- setAspectRatio.call(_this2);
13533
- });
13534
- },
13535
- // API ready
13536
- ready: function ready() {
13537
- var player = this; // Ignore already setup (race condition)
13538
-
13539
- var currentId = player.media && player.media.getAttribute('id');
13540
-
13541
- if (!is$1.empty(currentId) && currentId.startsWith('youtube-')) {
13542
- return;
13543
- } // Get the source URL or ID
13544
-
13545
-
13546
- var source = player.media.getAttribute('src'); // Get from <div> if needed
13547
-
13548
- if (is$1.empty(source)) {
13549
- source = player.media.getAttribute(this.config.attributes.embed.id);
13550
- } // Replace the <iframe> with a <div> due to YouTube API issues
13551
-
13552
-
13553
- var videoId = parseId$1(source);
13554
- var id = generateId(player.provider); // Get poster, if already set
13555
-
13556
- var poster = player.poster; // Replace media element
13557
-
13558
- var container = createElement('div', {
13559
- id: id,
13560
- poster: poster
13561
- });
13562
- player.media = replaceElement(container, player.media); // Id to poster wrapper
13563
-
13564
- var posterSrc = function posterSrc(s) {
13565
- return "https://i.ytimg.com/vi/".concat(videoId, "/").concat(s, "default.jpg");
13566
- }; // Check thumbnail images in order of quality, but reject fallback thumbnails (120px wide)
13567
-
13568
-
13569
- loadImage(posterSrc('maxres'), 121) // Higest quality and unpadded
13570
- .catch(function () {
13571
- return loadImage(posterSrc('sd'), 121);
13572
- }) // 480p padded 4:3
13573
- .catch(function () {
13574
- return loadImage(posterSrc('hq'));
13575
- }) // 360p padded 4:3. Always exists
13576
- .then(function (image) {
13577
- return ui.setPoster.call(player, image.src);
13578
- }).then(function (src) {
13579
- // If the image is padded, use background-size "cover" instead (like youtube does too with their posters)
13580
- if (!src.includes('maxres')) {
13581
- player.elements.poster.style.backgroundSize = 'cover';
13582
- }
13583
- }).catch(function () {});
13584
- var config = player.config.youtube; // Setup instance
13585
- // https://developers.google.com/youtube/iframe_api_reference
13586
-
13587
- player.embed = new window.YT.Player(id, {
13588
- videoId: videoId,
13589
- host: getHost(config),
13590
- playerVars: extend({}, {
13591
- autoplay: player.config.autoplay ? 1 : 0,
13592
- // Autoplay
13593
- hl: player.config.hl,
13594
- // iframe interface language
13595
- controls: player.supported.ui ? 0 : 1,
13596
- // Only show controls if not fully supported
13597
- disablekb: 1,
13598
- // Disable keyboard as we handle it
13599
- playsinline: !player.config.fullscreen.iosNative ? 1 : 0,
13600
- // Allow iOS inline playback
13601
- // Captions are flaky on YouTube
13602
- cc_load_policy: player.captions.active ? 1 : 0,
13603
- cc_lang_pref: player.config.captions.language,
13604
- // Tracking for stats
13605
- widget_referrer: window ? window.location.href : null
13606
- }, config),
13607
- events: {
13608
- onError: function onError(event) {
13609
- // YouTube may fire onError twice, so only handle it once
13610
- if (!player.media.error) {
13611
- var code = event.data; // Messages copied from https://developers.google.com/youtube/iframe_api_reference#onError
13612
-
13613
- var message = {
13614
- 2: 'The request contains an invalid parameter value. For example, this error occurs if you specify a video ID that does not have 11 characters, or if the video ID contains invalid characters, such as exclamation points or asterisks.',
13615
- 5: 'The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.',
13616
- 100: 'The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private.',
13617
- 101: 'The owner of the requested video does not allow it to be played in embedded players.',
13618
- 150: 'The owner of the requested video does not allow it to be played in embedded players.'
13619
- }[code] || 'An unknown error occured';
13620
- player.media.error = {
13621
- code: code,
13622
- message: message
13623
- };
13624
- triggerEvent.call(player, player.media, 'error');
13625
- }
13626
- },
13627
- onPlaybackRateChange: function onPlaybackRateChange(event) {
13628
- // Get the instance
13629
- var instance = event.target; // Get current speed
13630
-
13631
- player.media.playbackRate = instance.getPlaybackRate();
13632
- triggerEvent.call(player, player.media, 'ratechange');
13633
- },
13634
- onReady: function onReady(event) {
13635
- // Bail if onReady has already been called. See issue #1108
13636
- if (is$1.function(player.media.play)) {
13637
- return;
13638
- } // Get the instance
13639
-
13640
-
13641
- var instance = event.target; // Get the title
13642
-
13643
- youtube.getTitle.call(player, videoId); // Create a faux HTML5 API using the YouTube API
13644
-
13645
- player.media.play = function () {
13646
- assurePlaybackState$1.call(player, true);
13647
- instance.playVideo();
13648
- };
13649
-
13650
- player.media.pause = function () {
13651
- assurePlaybackState$1.call(player, false);
13652
- instance.pauseVideo();
13653
- };
13654
-
13655
- player.media.stop = function () {
13656
- instance.stopVideo();
13657
- };
13658
-
13659
- player.media.duration = instance.getDuration();
13660
- player.media.paused = true; // Seeking
13661
-
13662
- player.media.currentTime = 0;
13663
- Object.defineProperty(player.media, 'currentTime', {
13664
- get: function get() {
13665
- return Number(instance.getCurrentTime());
13666
- },
13667
- set: function set(time) {
13668
- // If paused and never played, mute audio preventively (YouTube starts playing on seek if the video hasn't been played yet).
13669
- if (player.paused && !player.embed.hasPlayed) {
13670
- player.embed.mute();
13671
- } // Set seeking state and trigger event
13672
-
13673
-
13674
- player.media.seeking = true;
13675
- triggerEvent.call(player, player.media, 'seeking'); // Seek after events sent
13676
-
13677
- instance.seekTo(time);
13678
- }
13679
- }); // Playback speed
13680
-
13681
- Object.defineProperty(player.media, 'playbackRate', {
13682
- get: function get() {
13683
- return instance.getPlaybackRate();
13684
- },
13685
- set: function set(input) {
13686
- instance.setPlaybackRate(input);
13687
- }
13688
- }); // Volume
13689
-
13690
- var volume = player.config.volume;
13691
- Object.defineProperty(player.media, 'volume', {
13692
- get: function get() {
13693
- return volume;
13694
- },
13695
- set: function set(input) {
13696
- volume = input;
13697
- instance.setVolume(volume * 100);
13698
- triggerEvent.call(player, player.media, 'volumechange');
13699
- }
13700
- }); // Muted
13701
-
13702
- var muted = player.config.muted;
13703
- Object.defineProperty(player.media, 'muted', {
13704
- get: function get() {
13705
- return muted;
13706
- },
13707
- set: function set(input) {
13708
- var toggle = is$1.boolean(input) ? input : muted;
13709
- muted = toggle;
13710
- instance[toggle ? 'mute' : 'unMute']();
13711
- triggerEvent.call(player, player.media, 'volumechange');
13712
- }
13713
- }); // Source
13714
-
13715
- Object.defineProperty(player.media, 'currentSrc', {
13716
- get: function get() {
13717
- return instance.getVideoUrl();
13718
- }
13719
- }); // Ended
13720
-
13721
- Object.defineProperty(player.media, 'ended', {
13722
- get: function get() {
13723
- return player.currentTime === player.duration;
13724
- }
13725
- }); // Get available speeds
13726
-
13727
- player.options.speed = instance.getAvailablePlaybackRates(); // Set the tabindex to avoid focus entering iframe
13728
-
13729
- if (player.supported.ui) {
13730
- player.media.setAttribute('tabindex', -1);
13731
- }
13732
-
13733
- triggerEvent.call(player, player.media, 'timeupdate');
13734
- triggerEvent.call(player, player.media, 'durationchange'); // Reset timer
13735
-
13736
- clearInterval(player.timers.buffering); // Setup buffering
13737
-
13738
- player.timers.buffering = setInterval(function () {
13739
- // Get loaded % from YouTube
13740
- player.media.buffered = instance.getVideoLoadedFraction(); // Trigger progress only when we actually buffer something
13741
-
13742
- if (player.media.lastBuffered === null || player.media.lastBuffered < player.media.buffered) {
13743
- triggerEvent.call(player, player.media, 'progress');
13744
- } // Set last buffer point
13745
-
13746
-
13747
- player.media.lastBuffered = player.media.buffered; // Bail if we're at 100%
13748
-
13749
- if (player.media.buffered === 1) {
13750
- clearInterval(player.timers.buffering); // Trigger event
13751
-
13752
- triggerEvent.call(player, player.media, 'canplaythrough');
13753
- }
13754
- }, 200); // Rebuild UI
13755
-
13756
- setTimeout(function () {
13757
- return ui.build.call(player);
13758
- }, 50);
13759
- },
13760
- onStateChange: function onStateChange(event) {
13761
- // Get the instance
13762
- var instance = event.target; // Reset timer
13763
-
13764
- clearInterval(player.timers.playing);
13765
- var seeked = player.media.seeking && [1, 2].includes(event.data);
13766
-
13767
- if (seeked) {
13768
- // Unset seeking and fire seeked event
13769
- player.media.seeking = false;
13770
- triggerEvent.call(player, player.media, 'seeked');
13771
- } // Handle events
13772
- // -1 Unstarted
13773
- // 0 Ended
13774
- // 1 Playing
13775
- // 2 Paused
13776
- // 3 Buffering
13777
- // 5 Video cued
13778
-
13779
-
13780
- switch (event.data) {
13781
- case -1:
13782
- // Update scrubber
13783
- triggerEvent.call(player, player.media, 'timeupdate'); // Get loaded % from YouTube
13784
-
13785
- player.media.buffered = instance.getVideoLoadedFraction();
13786
- triggerEvent.call(player, player.media, 'progress');
13787
- break;
13788
-
13789
- case 0:
13790
- assurePlaybackState$1.call(player, false); // YouTube doesn't support loop for a single video, so mimick it.
13791
-
13792
- if (player.media.loop) {
13793
- // YouTube needs a call to `stopVideo` before playing again
13794
- instance.stopVideo();
13795
- instance.playVideo();
13796
- } else {
13797
- triggerEvent.call(player, player.media, 'ended');
13798
- }
13799
-
13800
- break;
13801
-
13802
- case 1:
13803
- // Restore paused state (YouTube starts playing on seek if the video hasn't been played yet)
13804
- if (!player.config.autoplay && player.media.paused && !player.embed.hasPlayed) {
13805
- player.media.pause();
13806
- } else {
13807
- assurePlaybackState$1.call(player, true);
13808
- triggerEvent.call(player, player.media, 'playing'); // Poll to get playback progress
13809
-
13810
- player.timers.playing = setInterval(function () {
13811
- triggerEvent.call(player, player.media, 'timeupdate');
13812
- }, 50); // Check duration again due to YouTube bug
13813
- // https://github.com/sampotts/plyr/issues/374
13814
- // https://code.google.com/p/gdata-issues/issues/detail?id=8690
13815
-
13816
- if (player.media.duration !== instance.getDuration()) {
13817
- player.media.duration = instance.getDuration();
13818
- triggerEvent.call(player, player.media, 'durationchange');
13819
- }
13820
- }
13821
-
13822
- break;
13823
-
13824
- case 2:
13825
- // Restore audio (YouTube starts playing on seek if the video hasn't been played yet)
13826
- if (!player.muted) {
13827
- player.embed.unMute();
13828
- }
13829
-
13830
- assurePlaybackState$1.call(player, false);
13831
- break;
13832
-
13833
- default:
13834
- break;
13835
- }
13836
-
13837
- triggerEvent.call(player, player.elements.container, 'statechange', false, {
13838
- code: event.data
13839
- });
13840
- }
13841
- }
13842
- });
13843
- }
13844
- };
13845
-
13846
- // ==========================================================================
13847
- var media = {
13848
- // Setup media
13849
- setup: function setup() {
13850
- // If there's no media, bail
13851
- if (!this.media) {
13852
- this.debug.warn('No media element found!');
13853
- return;
13854
- } // Add type class
13855
-
13856
-
13857
- toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', this.type), true); // Add provider class
13858
-
13859
- toggleClass(this.elements.container, this.config.classNames.provider.replace('{0}', this.provider), true); // Add video class for embeds
13860
- // This will require changes if audio embeds are added
13861
-
13862
- if (this.isEmbed) {
13863
- toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', 'video'), true);
13864
- } // Inject the player wrapper
13865
-
13866
-
13867
- if (this.isVideo) {
13868
- // Create the wrapper div
13869
- this.elements.wrapper = createElement('div', {
13870
- class: this.config.classNames.video
13871
- }); // Wrap the video in a container
13872
-
13873
- wrap(this.media, this.elements.wrapper); // Faux poster container
13874
-
13875
- this.elements.poster = createElement('div', {
13876
- class: this.config.classNames.poster
13877
- });
13878
- this.elements.wrapper.appendChild(this.elements.poster);
13879
- }
13880
-
13881
- if (this.isHTML5) {
13882
- html5.extend.call(this);
13883
- } else if (this.isYouTube) {
13884
- youtube.setup.call(this);
13885
- } else if (this.isVimeo) {
13886
- vimeo.setup.call(this);
13887
- }
13888
- }
13889
- };
13890
-
13891
- var destroy = function destroy(instance) {
13892
- // Destroy our adsManager
13893
- if (instance.manager) {
13894
- instance.manager.destroy();
13895
- } // Destroy our adsManager
13896
-
13897
-
13898
- if (instance.elements.displayContainer) {
13899
- instance.elements.displayContainer.destroy();
13900
- }
13901
-
13902
- instance.elements.container.remove();
13903
- };
13904
-
13905
- var Ads =
13906
- /*#__PURE__*/
13907
- function () {
13908
- /**
13909
- * Ads constructor.
13910
- * @param {Object} player
13911
- * @return {Ads}
13912
- */
13913
- function Ads(player) {
13914
- var _this = this;
13915
-
13916
- _classCallCheck(this, Ads);
13917
-
13918
- this.player = player;
13919
- this.config = player.config.ads;
13920
- this.playing = false;
13921
- this.initialized = false;
13922
- this.elements = {
13923
- container: null,
13924
- displayContainer: null
13925
- };
13926
- this.manager = null;
13927
- this.loader = null;
13928
- this.cuePoints = null;
13929
- this.events = {};
13930
- this.safetyTimer = null;
13931
- this.countdownTimer = null; // Setup a promise to resolve when the IMA manager is ready
13932
-
13933
- this.managerPromise = new Promise(function (resolve, reject) {
13934
- // The ad is loaded and ready
13935
- _this.on('loaded', resolve); // Ads failed
13936
-
13937
-
13938
- _this.on('error', reject);
13939
- });
13940
- this.load();
13941
- }
13942
-
13943
- _createClass(Ads, [{
13944
- key: "load",
13945
-
13946
- /**
13947
- * Load the IMA SDK
13948
- */
13949
- value: function load() {
13950
- var _this2 = this;
13951
-
13952
- if (!this.enabled) {
13953
- return;
13954
- } // Check if the Google IMA3 SDK is loaded or load it ourselves
13955
-
13956
-
13957
- if (!is$1.object(window.google) || !is$1.object(window.google.ima)) {
13958
- loadScript(this.player.config.urls.googleIMA.sdk).then(function () {
13959
- _this2.ready();
13960
- }).catch(function () {
13961
- // Script failed to load or is blocked
13962
- _this2.trigger('error', new Error('Google IMA SDK failed to load'));
13963
- });
13964
- } else {
13965
- this.ready();
13966
- }
13967
- }
13968
- /**
13969
- * Get the ads instance ready
13970
- */
13971
-
13972
- }, {
13973
- key: "ready",
13974
- value: function ready() {
13975
- var _this3 = this;
13976
-
13977
- // Double check we're enabled
13978
- if (!this.enabled) {
13979
- destroy(this);
13980
- } // Start ticking our safety timer. If the whole advertisement
13981
- // thing doesn't resolve within our set time; we bail
13982
-
13983
-
13984
- this.startSafetyTimer(12000, 'ready()'); // Clear the safety timer
13985
-
13986
- this.managerPromise.then(function () {
13987
- _this3.clearSafetyTimer('onAdsManagerLoaded()');
13988
- }); // Set listeners on the Plyr instance
13989
-
13990
- this.listeners(); // Setup the IMA SDK
13991
-
13992
- this.setupIMA();
13993
- } // Build the tag URL
13994
-
13995
- }, {
13996
- key: "setupIMA",
13997
-
13998
- /**
13999
- * In order for the SDK to display ads for our video, we need to tell it where to put them,
14000
- * so here we define our ad container. This div is set up to render on top of the video player.
14001
- * Using the code below, we tell the SDK to render ads within that div. We also provide a
14002
- * handle to the content video player - the SDK will poll the current time of our player to
14003
- * properly place mid-rolls. After we create the ad display container, we initialize it. On
14004
- * mobile devices, this initialization is done as the result of a user action.
14005
- */
14006
- value: function setupIMA() {
14007
- // Create the container for our advertisements
14008
- this.elements.container = createElement('div', {
14009
- class: this.player.config.classNames.ads
14010
- });
14011
- this.player.elements.container.appendChild(this.elements.container); // So we can run VPAID2
14012
-
14013
- google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED); // Set language
14014
-
14015
- google.ima.settings.setLocale(this.player.config.ads.language); // Set playback for iOS10+
14016
-
14017
- google.ima.settings.setDisableCustomPlaybackForIOS10Plus(this.player.config.playsinline); // We assume the adContainer is the video container of the plyr element that will house the ads
14018
-
14019
- this.elements.displayContainer = new google.ima.AdDisplayContainer(this.elements.container, this.player.media); // Request video ads to be pre-loaded
14020
-
14021
- this.requestAds();
14022
- }
14023
- /**
14024
- * Request advertisements
14025
- */
14026
-
14027
- }, {
14028
- key: "requestAds",
14029
- value: function requestAds() {
14030
- var _this4 = this;
14031
-
14032
- var container = this.player.elements.container;
14033
-
14034
- try {
14035
- // Create ads loader
14036
- this.loader = new google.ima.AdsLoader(this.elements.displayContainer); // Listen and respond to ads loaded and error events
14037
-
14038
- this.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, function (event) {
14039
- return _this4.onAdsManagerLoaded(event);
14040
- }, false);
14041
- this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) {
14042
- return _this4.onAdError(error);
14043
- }, false); // Request video ads
14044
-
14045
- var request = new google.ima.AdsRequest();
14046
- request.adTagUrl = this.tagUrl; // Specify the linear and nonlinear slot sizes. This helps the SDK
14047
- // to select the correct creative if multiple are returned
14048
-
14049
- request.linearAdSlotWidth = container.offsetWidth;
14050
- request.linearAdSlotHeight = container.offsetHeight;
14051
- request.nonLinearAdSlotWidth = container.offsetWidth;
14052
- request.nonLinearAdSlotHeight = container.offsetHeight; // We only overlay ads as we only support video.
14053
-
14054
- request.forceNonLinearFullSlot = false; // Mute based on current state
14055
-
14056
- request.setAdWillPlayMuted(!this.player.muted);
14057
- this.loader.requestAds(request);
14058
- } catch (e) {
14059
- this.onAdError(e);
14060
- }
14061
- }
14062
- /**
14063
- * Update the ad countdown
14064
- * @param {Boolean} start
14065
- */
14066
-
14067
- }, {
14068
- key: "pollCountdown",
14069
- value: function pollCountdown() {
14070
- var _this5 = this;
14071
-
14072
- var start = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
14073
-
14074
- if (!start) {
14075
- clearInterval(this.countdownTimer);
14076
- this.elements.container.removeAttribute('data-badge-text');
14077
- return;
14078
- }
14079
-
14080
- var update = function update() {
14081
- var time = formatTime(Math.max(_this5.manager.getRemainingTime(), 0));
14082
- var label = "".concat(i18n.get('advertisement', _this5.player.config), " - ").concat(time);
14083
-
14084
- _this5.elements.container.setAttribute('data-badge-text', label);
14085
- };
14086
-
14087
- this.countdownTimer = setInterval(update, 100);
14088
- }
14089
- /**
14090
- * This method is called whenever the ads are ready inside the AdDisplayContainer
14091
- * @param {Event} adsManagerLoadedEvent
14092
- */
14093
-
14094
- }, {
14095
- key: "onAdsManagerLoaded",
14096
- value: function onAdsManagerLoaded(event) {
14097
- var _this6 = this;
14098
-
14099
- // Load could occur after a source change (race condition)
14100
- if (!this.enabled) {
14101
- return;
14102
- } // Get the ads manager
14103
-
14104
-
14105
- var settings = new google.ima.AdsRenderingSettings(); // Tell the SDK to save and restore content video state on our behalf
14106
-
14107
- settings.restoreCustomPlaybackStateOnAdBreakComplete = true;
14108
- settings.enablePreloading = true; // The SDK is polling currentTime on the contentPlayback. And needs a duration
14109
- // so it can determine when to start the mid- and post-roll
14110
-
14111
- this.manager = event.getAdsManager(this.player, settings); // Get the cue points for any mid-rolls by filtering out the pre- and post-roll
14112
-
14113
- this.cuePoints = this.manager.getCuePoints(); // Add listeners to the required events
14114
- // Advertisement error events
14115
-
14116
- this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) {
14117
- return _this6.onAdError(error);
14118
- }); // Advertisement regular events
14119
-
14120
- Object.keys(google.ima.AdEvent.Type).forEach(function (type) {
14121
- _this6.manager.addEventListener(google.ima.AdEvent.Type[type], function (e) {
14122
- return _this6.onAdEvent(e);
14123
- });
14124
- }); // Resolve our adsManager
14125
-
14126
- this.trigger('loaded');
14127
- }
14128
- }, {
14129
- key: "addCuePoints",
14130
- value: function addCuePoints() {
14131
- var _this7 = this;
14132
-
14133
- // Add advertisement cue's within the time line if available
14134
- if (!is$1.empty(this.cuePoints)) {
14135
- this.cuePoints.forEach(function (cuePoint) {
14136
- if (cuePoint !== 0 && cuePoint !== -1 && cuePoint < _this7.player.duration) {
14137
- var seekElement = _this7.player.elements.progress;
14138
-
14139
- if (is$1.element(seekElement)) {
14140
- var cuePercentage = 100 / _this7.player.duration * cuePoint;
14141
- var cue = createElement('span', {
14142
- class: _this7.player.config.classNames.cues
14143
- });
14144
- cue.style.left = "".concat(cuePercentage.toString(), "%");
14145
- seekElement.appendChild(cue);
14146
- }
14147
- }
14148
- });
14149
- }
14150
- }
14151
- /**
14152
- * This is where all the event handling takes place. Retrieve the ad from the event. Some
14153
- * events (e.g. ALL_ADS_COMPLETED) don't have the ad object associated
14154
- * https://developers.google.com/interactive-media-ads/docs/sdks/html5/v3/apis#ima.AdEvent.Type
14155
- * @param {Event} event
14156
- */
14157
-
14158
- }, {
14159
- key: "onAdEvent",
14160
- value: function onAdEvent(event) {
14161
- var _this8 = this;
14162
-
14163
- var container = this.player.elements.container; // Retrieve the ad from the event. Some events (e.g. ALL_ADS_COMPLETED)
14164
- // don't have ad object associated
14165
-
14166
- var ad = event.getAd();
14167
- var adData = event.getAdData(); // Proxy event
14168
-
14169
- var dispatchEvent = function dispatchEvent(type) {
14170
- triggerEvent.call(_this8.player, _this8.player.media, "ads".concat(type.replace(/_/g, '').toLowerCase()));
14171
- }; // Bubble the event
14172
-
14173
-
14174
- dispatchEvent(event.type);
14175
-
14176
- switch (event.type) {
14177
- case google.ima.AdEvent.Type.LOADED:
14178
- // This is the first event sent for an ad - it is possible to determine whether the
14179
- // ad is a video ad or an overlay
14180
- this.trigger('loaded'); // Start countdown
14181
-
14182
- this.pollCountdown(true);
14183
-
14184
- if (!ad.isLinear()) {
14185
- // Position AdDisplayContainer correctly for overlay
14186
- ad.width = container.offsetWidth;
14187
- ad.height = container.offsetHeight;
14188
- } // console.info('Ad type: ' + event.getAd().getAdPodInfo().getPodIndex());
14189
- // console.info('Ad time: ' + event.getAd().getAdPodInfo().getTimeOffset());
14190
-
14191
-
14192
- break;
14193
-
14194
- case google.ima.AdEvent.Type.STARTED:
14195
- // Set volume to match player
14196
- this.manager.setVolume(this.player.volume);
14197
- break;
14198
-
14199
- case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:
14200
- // All ads for the current videos are done. We can now request new advertisements
14201
- // in case the video is re-played
14202
- // TODO: Example for what happens when a next video in a playlist would be loaded.
14203
- // So here we load a new video when all ads are done.
14204
- // Then we load new ads within a new adsManager. When the video
14205
- // Is started - after - the ads are loaded, then we get ads.
14206
- // You can also easily test cancelling and reloading by running
14207
- // player.ads.cancel() and player.ads.play from the console I guess.
14208
- // this.player.source = {
14209
- // type: 'video',
14210
- // title: 'View From A Blue Moon',
14211
- // sources: [{
14212
- // src:
14213
- // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.mp4', type:
14214
- // 'video/mp4', }], poster:
14215
- // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.jpg', tracks:
14216
- // [ { kind: 'captions', label: 'English', srclang: 'en', src:
14217
- // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.en.vtt',
14218
- // default: true, }, { kind: 'captions', label: 'French', srclang: 'fr', src:
14219
- // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.fr.vtt', }, ],
14220
- // };
14221
- // TODO: So there is still this thing where a video should only be allowed to start
14222
- // playing when the IMA SDK is ready or has failed
14223
- this.loadAds();
14224
- break;
14225
-
14226
- case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED:
14227
- // This event indicates the ad has started - the video player can adjust the UI,
14228
- // for example display a pause button and remaining time. Fired when content should
14229
- // be paused. This usually happens right before an ad is about to cover the content
14230
- this.pauseContent();
14231
- break;
14232
-
14233
- case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:
14234
- // This event indicates the ad has finished - the video player can perform
14235
- // appropriate UI actions, such as removing the timer for remaining time detection.
14236
- // Fired when content should be resumed. This usually happens when an ad finishes
14237
- // or collapses
14238
- this.pollCountdown();
14239
- this.resumeContent();
14240
- break;
14241
-
14242
- case google.ima.AdEvent.Type.LOG:
14243
- if (adData.adError) {
14244
- this.player.debug.warn("Non-fatal ad error: ".concat(adData.adError.getMessage()));
14245
- }
14246
-
14247
- break;
14248
-
14249
- default:
14250
- break;
14251
- }
14252
- }
14253
- /**
14254
- * Any ad error handling comes through here
14255
- * @param {Event} event
14256
- */
14257
-
14258
- }, {
14259
- key: "onAdError",
14260
- value: function onAdError(event) {
14261
- this.cancel();
14262
- this.player.debug.warn('Ads error', event);
14263
- }
14264
- /**
14265
- * Setup hooks for Plyr and window events. This ensures
14266
- * the mid- and post-roll launch at the correct time. And
14267
- * resize the advertisement when the player resizes
14268
- */
14269
-
14270
- }, {
14271
- key: "listeners",
14272
- value: function listeners() {
14273
- var _this9 = this;
14274
-
14275
- var container = this.player.elements.container;
14276
- var time;
14277
- this.player.on('canplay', function () {
14278
- _this9.addCuePoints();
14279
- });
14280
- this.player.on('ended', function () {
14281
- _this9.loader.contentComplete();
14282
- });
14283
- this.player.on('timeupdate', function () {
14284
- time = _this9.player.currentTime;
14285
- });
14286
- this.player.on('seeked', function () {
14287
- var seekedTime = _this9.player.currentTime;
14288
-
14289
- if (is$1.empty(_this9.cuePoints)) {
14290
- return;
14291
- }
14292
-
14293
- _this9.cuePoints.forEach(function (cuePoint, index) {
14294
- if (time < cuePoint && cuePoint < seekedTime) {
14295
- _this9.manager.discardAdBreak();
14296
-
14297
- _this9.cuePoints.splice(index, 1);
14298
- }
14299
- });
14300
- }); // Listen to the resizing of the window. And resize ad accordingly
14301
- // TODO: eventually implement ResizeObserver
14302
-
14303
- window.addEventListener('resize', function () {
14304
- if (_this9.manager) {
14305
- _this9.manager.resize(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);
14306
- }
14307
- });
14308
- }
14309
- /**
14310
- * Initialize the adsManager and start playing advertisements
14311
- */
14312
-
14313
- }, {
14314
- key: "play",
14315
- value: function play() {
14316
- var _this10 = this;
14317
-
14318
- var container = this.player.elements.container;
14319
-
14320
- if (!this.managerPromise) {
14321
- this.resumeContent();
14322
- } // Play the requested advertisement whenever the adsManager is ready
14323
-
14324
-
14325
- this.managerPromise.then(function () {
14326
- // Set volume to match player
14327
- _this10.manager.setVolume(_this10.player.volume); // Initialize the container. Must be done via a user action on mobile devices
14328
-
14329
-
14330
- _this10.elements.displayContainer.initialize();
14331
-
14332
- try {
14333
- if (!_this10.initialized) {
14334
- // Initialize the ads manager. Ad rules playlist will start at this time
14335
- _this10.manager.init(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL); // Call play to start showing the ad. Single video and overlay ads will
14336
- // start at this time; the call will be ignored for ad rules
14337
-
14338
-
14339
- _this10.manager.start();
14340
- }
14341
-
14342
- _this10.initialized = true;
14343
- } catch (adError) {
14344
- // An error may be thrown if there was a problem with the
14345
- // VAST response
14346
- _this10.onAdError(adError);
14347
- }
14348
- }).catch(function () {});
14349
- }
14350
- /**
14351
- * Resume our video
14352
- */
14353
-
14354
- }, {
14355
- key: "resumeContent",
14356
- value: function resumeContent() {
14357
- // Hide the advertisement container
14358
- this.elements.container.style.zIndex = ''; // Ad is stopped
14359
-
14360
- this.playing = false; // Play video
14361
-
14362
- this.player.media.play();
14363
- }
14364
- /**
14365
- * Pause our video
14366
- */
14367
-
14368
- }, {
14369
- key: "pauseContent",
14370
- value: function pauseContent() {
14371
- // Show the advertisement container
14372
- this.elements.container.style.zIndex = 3; // Ad is playing
14373
-
14374
- this.playing = true; // Pause our video.
14375
-
14376
- this.player.media.pause();
14377
- }
14378
- /**
14379
- * Destroy the adsManager so we can grab new ads after this. If we don't then we're not
14380
- * allowed to call new ads based on google policies, as they interpret this as an accidental
14381
- * video requests. https://developers.google.com/interactive-
14382
- * media-ads/docs/sdks/android/faq#8
14383
- */
14384
-
14385
- }, {
14386
- key: "cancel",
14387
- value: function cancel() {
14388
- // Pause our video
14389
- if (this.initialized) {
14390
- this.resumeContent();
14391
- } // Tell our instance that we're done for now
14392
-
14393
-
14394
- this.trigger('error'); // Re-create our adsManager
14395
-
14396
- this.loadAds();
14397
- }
14398
- /**
14399
- * Re-create our adsManager
14400
- */
14401
-
14402
- }, {
14403
- key: "loadAds",
14404
- value: function loadAds() {
14405
- var _this11 = this;
14406
-
14407
- // Tell our adsManager to go bye bye
14408
- this.managerPromise.then(function () {
14409
- // Destroy our adsManager
14410
- if (_this11.manager) {
14411
- _this11.manager.destroy();
14412
- } // Re-set our adsManager promises
14413
-
14414
-
14415
- _this11.managerPromise = new Promise(function (resolve) {
14416
- _this11.on('loaded', resolve);
14417
-
14418
- _this11.player.debug.log(_this11.manager);
14419
- }); // Now request some new advertisements
14420
-
14421
- _this11.requestAds();
14422
- }).catch(function () {});
14423
- }
14424
- /**
14425
- * Handles callbacks after an ad event was invoked
14426
- * @param {String} event - Event type
14427
- */
14428
-
14429
- }, {
14430
- key: "trigger",
14431
- value: function trigger(event) {
14432
- var _this12 = this;
14433
-
14434
- for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
14435
- args[_key - 1] = arguments[_key];
14436
- }
14437
-
14438
- var handlers = this.events[event];
14439
-
14440
- if (is$1.array(handlers)) {
14441
- handlers.forEach(function (handler) {
14442
- if (is$1.function(handler)) {
14443
- handler.apply(_this12, args);
14444
- }
14445
- });
14446
- }
14447
- }
14448
- /**
14449
- * Add event listeners
14450
- * @param {String} event - Event type
14451
- * @param {Function} callback - Callback for when event occurs
14452
- * @return {Ads}
14453
- */
14454
-
14455
- }, {
14456
- key: "on",
14457
- value: function on(event, callback) {
14458
- if (!is$1.array(this.events[event])) {
14459
- this.events[event] = [];
14460
- }
14461
-
14462
- this.events[event].push(callback);
14463
- return this;
14464
- }
14465
- /**
14466
- * Setup a safety timer for when the ad network doesn't respond for whatever reason.
14467
- * The advertisement has 12 seconds to get its things together. We stop this timer when the
14468
- * advertisement is playing, or when a user action is required to start, then we clear the
14469
- * timer on ad ready
14470
- * @param {Number} time
14471
- * @param {String} from
14472
- */
14473
-
14474
- }, {
14475
- key: "startSafetyTimer",
14476
- value: function startSafetyTimer(time, from) {
14477
- var _this13 = this;
14478
-
14479
- this.player.debug.log("Safety timer invoked from: ".concat(from));
14480
- this.safetyTimer = setTimeout(function () {
14481
- _this13.cancel();
14482
-
14483
- _this13.clearSafetyTimer('startSafetyTimer()');
14484
- }, time);
14485
- }
14486
- /**
14487
- * Clear our safety timer(s)
14488
- * @param {String} from
14489
- */
14490
-
14491
- }, {
14492
- key: "clearSafetyTimer",
14493
- value: function clearSafetyTimer(from) {
14494
- if (!is$1.nullOrUndefined(this.safetyTimer)) {
14495
- this.player.debug.log("Safety timer cleared from: ".concat(from));
14496
- clearTimeout(this.safetyTimer);
14497
- this.safetyTimer = null;
14498
- }
14499
- }
14500
- }, {
14501
- key: "enabled",
14502
- get: function get() {
14503
- var config = this.config;
14504
- return this.player.isHTML5 && this.player.isVideo && config.enabled && (!is$1.empty(config.publisherId) || is$1.url(config.tagUrl));
14505
- }
14506
- }, {
14507
- key: "tagUrl",
14508
- get: function get() {
14509
- var config = this.config;
14510
-
14511
- if (is$1.url(config.tagUrl)) {
14512
- return config.tagUrl;
14513
- }
14514
-
14515
- var params = {
14516
- AV_PUBLISHERID: '58c25bb0073ef448b1087ad6',
14517
- AV_CHANNELID: '5a0458dc28a06145e4519d21',
14518
- AV_URL: window.location.hostname,
14519
- cb: Date.now(),
14520
- AV_WIDTH: 640,
14521
- AV_HEIGHT: 480,
14522
- AV_CDIM2: this.publisherId
14523
- };
14524
- var base = 'https://go.aniview.com/api/adserver6/vast/';
14525
- return "".concat(base, "?").concat(buildUrlParams(params));
14526
- }
14527
- }]);
14528
-
14529
- return Ads;
14530
- }();
14531
-
14532
- var parseVtt = function parseVtt(vttDataString) {
14533
- var processedList = [];
14534
- var frames = vttDataString.split(/\r\n\r\n|\n\n|\r\r/);
14535
- frames.forEach(function (frame) {
14536
- var result = {};
14537
- var lines = frame.split(/\r\n|\n|\r/);
14538
- lines.forEach(function (line) {
14539
- if (!is$1.number(result.startTime)) {
14540
- // The line with start and end times on it is the first line of interest
14541
- var matchTimes = line.match(/([0-9]{2})?:?([0-9]{2}):([0-9]{2}).([0-9]{2,3})( ?--> ?)([0-9]{2})?:?([0-9]{2}):([0-9]{2}).([0-9]{2,3})/); // Note that this currently ignores caption formatting directives that are optionally on the end of this line - fine for non-captions VTT
14542
-
14543
- if (matchTimes) {
14544
- result.startTime = Number(matchTimes[1] || 0) * 60 * 60 + Number(matchTimes[2]) * 60 + Number(matchTimes[3]) + Number("0.".concat(matchTimes[4]));
14545
- result.endTime = Number(matchTimes[6] || 0) * 60 * 60 + Number(matchTimes[7]) * 60 + Number(matchTimes[8]) + Number("0.".concat(matchTimes[9]));
14546
- }
14547
- } else if (!is$1.empty(line.trim()) && is$1.empty(result.text)) {
14548
- // If we already have the startTime, then we're definitely up to the text line(s)
14549
- var lineSplit = line.trim().split('#xywh=');
14550
-
14551
- var _lineSplit = _slicedToArray(lineSplit, 1);
14552
-
14553
- result.text = _lineSplit[0];
14554
-
14555
- // If there's content in lineSplit[1], then we have sprites. If not, then it's just one frame per image
14556
- if (lineSplit[1]) {
14557
- var _lineSplit$1$split = lineSplit[1].split(',');
14558
-
14559
- var _lineSplit$1$split2 = _slicedToArray(_lineSplit$1$split, 4);
14560
-
14561
- result.x = _lineSplit$1$split2[0];
14562
- result.y = _lineSplit$1$split2[1];
14563
- result.w = _lineSplit$1$split2[2];
14564
- result.h = _lineSplit$1$split2[3];
14565
- }
14566
- }
14567
- });
14568
-
14569
- if (result.text) {
14570
- processedList.push(result);
14571
- }
14572
- });
14573
- return processedList;
14574
- };
14575
- /**
14576
- * Preview thumbnails for seek hover and scrubbing
14577
- * Seeking: Hover over the seek bar (desktop only): shows a small preview container above the seek bar
14578
- * Scrubbing: Click and drag the seek bar (desktop and mobile): shows the preview image over the entire video, as if the video is scrubbing at very high speed
14579
- *
14580
- * Notes:
14581
- * - Thumbs are set via JS settings on Plyr init, not HTML5 'track' property. Using the track property would be a bit gross, because it doesn't support custom 'kinds'. kind=metadata might be used for something else, and we want to allow multiple thumbnails tracks. Tracks must have a unique combination of 'kind' and 'label'. We would have to do something like kind=metadata,label=thumbnails1 / kind=metadata,label=thumbnails2. Square peg, round hole
14582
- * - VTT info: the image URL is relative to the VTT, not the current document. But if the url starts with a slash, it will naturally be relative to the current domain. https://support.jwplayer.com/articles/how-to-add-preview-thumbnails
14583
- * - This implementation uses multiple separate img elements. Other implementations use background-image on one element. This would be nice and simple, but Firefox and Safari have flickering issues with replacing backgrounds of larger images. It seems that YouTube perhaps only avoids this because they don't have the option for high-res previews (even the fullscreen ones, when mousedown/seeking). Images appear over the top of each other, and previous ones are discarded once the new ones have been rendered
14584
- */
14585
-
14586
-
14587
- var PreviewThumbnails =
14588
- /*#__PURE__*/
14589
- function () {
14590
- /**
14591
- * PreviewThumbnails constructor.
14592
- * @param {Plyr} player
14593
- * @return {PreviewThumbnails}
14594
- */
14595
- function PreviewThumbnails(player) {
14596
- _classCallCheck(this, PreviewThumbnails);
14597
-
14598
- this.player = player;
14599
- this.thumbnails = [];
14600
- this.loaded = false;
14601
- this.lastMouseMoveTime = Date.now();
14602
- this.mouseDown = false;
14603
- this.loadedImages = [];
14604
- this.elements = {
14605
- thumb: {},
14606
- scrubbing: {}
14607
- };
14608
- this.load();
14609
- }
14610
-
14611
- _createClass(PreviewThumbnails, [{
14612
- key: "load",
14613
- value: function load() {
14614
- var _this = this;
14615
-
14616
- // Togglethe regular seek tooltip
14617
- if (this.player.elements.display.seekTooltip) {
14618
- this.player.elements.display.seekTooltip.hidden = this.enabled;
14619
- }
14620
-
14621
- if (!this.enabled) {
14622
- return;
14623
- }
14624
-
14625
- this.getThumbnails().then(function () {
14626
- if (!_this.enabled) {
14627
- return;
14628
- } // Render DOM elements
14629
-
14630
-
14631
- _this.render(); // Check to see if thumb container size was specified manually in CSS
14632
-
14633
-
14634
- _this.determineContainerAutoSizing();
14635
-
14636
- _this.loaded = true;
14637
- });
14638
- } // Download VTT files and parse them
14639
-
14640
- }, {
14641
- key: "getThumbnails",
14642
- value: function getThumbnails() {
14643
- var _this2 = this;
14644
-
14645
- return new Promise(function (resolve) {
14646
- var src = _this2.player.config.previewThumbnails.src;
14647
-
14648
- if (is$1.empty(src)) {
14649
- throw new Error('Missing previewThumbnails.src config attribute');
14650
- } // If string, convert into single-element list
14651
-
14652
-
14653
- var urls = is$1.string(src) ? [src] : src; // Loop through each src URL. Download and process the VTT file, storing the resulting data in this.thumbnails
14654
-
14655
- var promises = urls.map(function (u) {
14656
- return _this2.getThumbnail(u);
14657
- });
14658
- Promise.all(promises).then(function () {
14659
- // Sort smallest to biggest (e.g., [120p, 480p, 1080p])
14660
- _this2.thumbnails.sort(function (x, y) {
14661
- return x.height - y.height;
14662
- });
14663
-
14664
- _this2.player.debug.log('Preview thumbnails', _this2.thumbnails);
14665
-
14666
- resolve();
14667
- });
14668
- });
14669
- } // Process individual VTT file
14670
-
14671
- }, {
14672
- key: "getThumbnail",
14673
- value: function getThumbnail(url) {
14674
- var _this3 = this;
14675
-
14676
- return new Promise(function (resolve) {
14677
- fetch(url).then(function (response) {
14678
- var thumbnail = {
14679
- frames: parseVtt(response),
14680
- height: null,
14681
- urlPrefix: ''
14682
- }; // If the URLs don't start with '/', then we need to set their relative path to be the location of the VTT file
14683
- // If the URLs do start with '/', then they obviously don't need a prefix, so it will remain blank
14684
- // If the thumbnail URLs start with with none of '/', 'http://' or 'https://', then we need to set their relative path to be the location of the VTT file
14685
-
14686
- if (!thumbnail.frames[0].text.startsWith('/') && !thumbnail.frames[0].text.startsWith('http://') && !thumbnail.frames[0].text.startsWith('https://')) {
14687
- thumbnail.urlPrefix = url.substring(0, url.lastIndexOf('/') + 1);
14688
- } // Download the first frame, so that we can determine/set the height of this thumbnailsDef
14689
-
14690
-
14691
- var tempImage = new Image();
14692
-
14693
- tempImage.onload = function () {
14694
- thumbnail.height = tempImage.naturalHeight;
14695
- thumbnail.width = tempImage.naturalWidth;
14696
-
14697
- _this3.thumbnails.push(thumbnail);
14698
-
14699
- resolve();
14700
- };
14701
-
14702
- tempImage.src = thumbnail.urlPrefix + thumbnail.frames[0].text;
14703
- });
14704
- });
14705
- }
14706
- }, {
14707
- key: "startMove",
14708
- value: function startMove(event) {
14709
- if (!this.loaded) {
14710
- return;
14711
- }
14712
-
14713
- if (!is$1.event(event) || !['touchmove', 'mousemove'].includes(event.type)) {
14714
- return;
14715
- } // Wait until media has a duration
14716
-
14717
-
14718
- if (!this.player.media.duration) {
14719
- return;
14720
- }
14721
-
14722
- if (event.type === 'touchmove') {
14723
- // Calculate seek hover position as approx video seconds
14724
- this.seekTime = this.player.media.duration * (this.player.elements.inputs.seek.value / 100);
14725
- } else {
14726
- // Calculate seek hover position as approx video seconds
14727
- var clientRect = this.player.elements.progress.getBoundingClientRect();
14728
- var percentage = 100 / clientRect.width * (event.pageX - clientRect.left);
14729
- this.seekTime = this.player.media.duration * (percentage / 100);
14730
-
14731
- if (this.seekTime < 0) {
14732
- // The mousemove fires for 10+px out to the left
14733
- this.seekTime = 0;
14734
- }
14735
-
14736
- if (this.seekTime > this.player.media.duration - 1) {
14737
- // Took 1 second off the duration for safety, because different players can disagree on the real duration of a video
14738
- this.seekTime = this.player.media.duration - 1;
14739
- }
14740
-
14741
- this.mousePosX = event.pageX; // Set time text inside image container
14742
-
14743
- this.elements.thumb.time.innerText = formatTime(this.seekTime);
14744
- } // Download and show image
14745
-
14746
-
14747
- this.showImageAtCurrentTime();
14748
- }
14749
- }, {
14750
- key: "endMove",
14751
- value: function endMove() {
14752
- this.toggleThumbContainer(false, true);
14753
- }
14754
- }, {
14755
- key: "startScrubbing",
14756
- value: function startScrubbing(event) {
14757
- // Only act on left mouse button (0), or touch device (event.button is false)
14758
- if (event.button === false || event.button === 0) {
14759
- this.mouseDown = true; // Wait until media has a duration
14760
-
14761
- if (this.player.media.duration) {
14762
- this.toggleScrubbingContainer(true);
14763
- this.toggleThumbContainer(false, true); // Download and show image
14764
-
14765
- this.showImageAtCurrentTime();
14766
- }
14767
- }
14768
- }
14769
- }, {
14770
- key: "endScrubbing",
14771
- value: function endScrubbing() {
14772
- var _this4 = this;
14773
-
14774
- this.mouseDown = false; // Hide scrubbing preview. But wait until the video has successfully seeked before hiding the scrubbing preview
14775
-
14776
- if (Math.ceil(this.lastTime) === Math.ceil(this.player.media.currentTime)) {
14777
- // The video was already seeked/loaded at the chosen time - hide immediately
14778
- this.toggleScrubbingContainer(false);
14779
- } else {
14780
- // The video hasn't seeked yet. Wait for that
14781
- once.call(this.player, this.player.media, 'timeupdate', function () {
14782
- // Re-check mousedown - we might have already started scrubbing again
14783
- if (!_this4.mouseDown) {
14784
- _this4.toggleScrubbingContainer(false);
14785
- }
14786
- });
14787
- }
14788
- }
14789
- /**
14790
- * Setup hooks for Plyr and window events
14791
- */
14792
-
14793
- }, {
14794
- key: "listeners",
14795
- value: function listeners() {
14796
- var _this5 = this;
14797
-
14798
- // Hide thumbnail preview - on mouse click, mouse leave (in listeners.js for now), and video play/seek. All four are required, e.g., for buffering
14799
- this.player.on('play', function () {
14800
- _this5.toggleThumbContainer(false, true);
14801
- });
14802
- this.player.on('seeked', function () {
14803
- _this5.toggleThumbContainer(false);
14804
- });
14805
- this.player.on('timeupdate', function () {
14806
- _this5.lastTime = _this5.player.media.currentTime;
14807
- });
14808
- }
14809
- /**
14810
- * Create HTML elements for image containers
14811
- */
14812
-
14813
- }, {
14814
- key: "render",
14815
- value: function render() {
14816
- // Create HTML element: plyr__preview-thumbnail-container
14817
- this.elements.thumb.container = createElement('div', {
14818
- class: this.player.config.classNames.previewThumbnails.thumbContainer
14819
- }); // Wrapper for the image for styling
14820
-
14821
- this.elements.thumb.imageContainer = createElement('div', {
14822
- class: this.player.config.classNames.previewThumbnails.imageContainer
14823
- });
14824
- this.elements.thumb.container.appendChild(this.elements.thumb.imageContainer); // Create HTML element, parent+span: time text (e.g., 01:32:00)
14825
-
14826
- var timeContainer = createElement('div', {
14827
- class: this.player.config.classNames.previewThumbnails.timeContainer
14828
- });
14829
- this.elements.thumb.time = createElement('span', {}, '00:00');
14830
- timeContainer.appendChild(this.elements.thumb.time);
14831
- this.elements.thumb.container.appendChild(timeContainer); // Inject the whole thumb
14832
-
14833
- if (is$1.element(this.player.elements.progress)) {
14834
- this.player.elements.progress.appendChild(this.elements.thumb.container);
14835
- } // Create HTML element: plyr__preview-scrubbing-container
14836
-
14837
-
14838
- this.elements.scrubbing.container = createElement('div', {
14839
- class: this.player.config.classNames.previewThumbnails.scrubbingContainer
14840
- });
14841
- this.player.elements.wrapper.appendChild(this.elements.scrubbing.container);
14842
- }
14843
- }, {
14844
- key: "showImageAtCurrentTime",
14845
- value: function showImageAtCurrentTime() {
14846
- var _this6 = this;
14847
-
14848
- if (this.mouseDown) {
14849
- this.setScrubbingContainerSize();
14850
- } else {
14851
- this.setThumbContainerSizeAndPos();
14852
- } // Find the desired thumbnail index
14853
- // TODO: Handle a video longer than the thumbs where thumbNum is null
14854
-
14855
-
14856
- var thumbNum = this.thumbnails[0].frames.findIndex(function (frame) {
14857
- return _this6.seekTime >= frame.startTime && _this6.seekTime <= frame.endTime;
14858
- });
14859
- var hasThumb = thumbNum >= 0;
14860
- var qualityIndex = 0; // Show the thumb container if we're not scrubbing
14861
-
14862
- if (!this.mouseDown) {
14863
- this.toggleThumbContainer(hasThumb);
14864
- } // No matching thumb found
14865
-
14866
-
14867
- if (!hasThumb) {
14868
- return;
14869
- } // Check to see if we've already downloaded higher quality versions of this image
14870
-
14871
-
14872
- this.thumbnails.forEach(function (thumbnail, index) {
14873
- if (_this6.loadedImages.includes(thumbnail.frames[thumbNum].text)) {
14874
- qualityIndex = index;
14875
- }
14876
- }); // Only proceed if either thumbnum or thumbfilename has changed
14877
-
14878
- if (thumbNum !== this.showingThumb) {
14879
- this.showingThumb = thumbNum;
14880
- this.loadImage(qualityIndex);
14881
- }
14882
- } // Show the image that's currently specified in this.showingThumb
14883
-
14884
- }, {
14885
- key: "loadImage",
14886
- value: function loadImage() {
14887
- var _this7 = this;
14888
-
14889
- var qualityIndex = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
14890
- var thumbNum = this.showingThumb;
14891
- var thumbnail = this.thumbnails[qualityIndex];
14892
- var urlPrefix = thumbnail.urlPrefix;
14893
- var frame = thumbnail.frames[thumbNum];
14894
- var thumbFilename = thumbnail.frames[thumbNum].text;
14895
- var thumbUrl = urlPrefix + thumbFilename;
14896
-
14897
- if (!this.currentImageElement || this.currentImageElement.dataset.filename !== thumbFilename) {
14898
- // If we're already loading a previous image, remove its onload handler - we don't want it to load after this one
14899
- // Only do this if not using sprites. Without sprites we really want to show as many images as possible, as a best-effort
14900
- if (this.loadingImage && this.usingSprites) {
14901
- this.loadingImage.onload = null;
14902
- } // We're building and adding a new image. In other implementations of similar functionality (YouTube), background image
14903
- // is instead used. But this causes issues with larger images in Firefox and Safari - switching between background
14904
- // images causes a flicker. Putting a new image over the top does not
14905
-
14906
-
14907
- var previewImage = new Image();
14908
- previewImage.src = thumbUrl;
14909
- previewImage.dataset.index = thumbNum;
14910
- previewImage.dataset.filename = thumbFilename;
14911
- this.showingThumbFilename = thumbFilename;
14912
- this.player.debug.log("Loading image: ".concat(thumbUrl)); // For some reason, passing the named function directly causes it to execute immediately. So I've wrapped it in an anonymous function...
14913
-
14914
- previewImage.onload = function () {
14915
- return _this7.showImage(previewImage, frame, qualityIndex, thumbNum, thumbFilename, true);
14916
- };
14917
-
14918
- this.loadingImage = previewImage;
14919
- this.removeOldImages(previewImage);
14920
- } else {
14921
- // Update the existing image
14922
- this.showImage(this.currentImageElement, frame, qualityIndex, thumbNum, thumbFilename, false);
14923
- this.currentImageElement.dataset.index = thumbNum;
14924
- this.removeOldImages(this.currentImageElement);
14925
- }
14926
- }
14927
- }, {
14928
- key: "showImage",
14929
- value: function showImage(previewImage, frame, qualityIndex, thumbNum, thumbFilename) {
14930
- var newImage = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : true;
14931
- this.player.debug.log("Showing thumb: ".concat(thumbFilename, ". num: ").concat(thumbNum, ". qual: ").concat(qualityIndex, ". newimg: ").concat(newImage));
14932
- this.setImageSizeAndOffset(previewImage, frame);
14933
-
14934
- if (newImage) {
14935
- this.currentImageContainer.appendChild(previewImage);
14936
- this.currentImageElement = previewImage;
14937
-
14938
- if (!this.loadedImages.includes(thumbFilename)) {
14939
- this.loadedImages.push(thumbFilename);
14940
- }
14941
- } // Preload images before and after the current one
14942
- // Show higher quality of the same frame
14943
- // Each step here has a short time delay, and only continues if still hovering/seeking the same spot. This is to protect slow connections from overloading
14944
-
14945
-
14946
- this.preloadNearby(thumbNum, true).then(this.preloadNearby(thumbNum, false)).then(this.getHigherQuality(qualityIndex, previewImage, frame, thumbFilename));
14947
- } // Remove all preview images that aren't the designated current image
14948
-
14949
- }, {
14950
- key: "removeOldImages",
14951
- value: function removeOldImages(currentImage) {
14952
- var _this8 = this;
14953
-
14954
- // Get a list of all images, convert it from a DOM list to an array
14955
- Array.from(this.currentImageContainer.children).forEach(function (image) {
14956
- if (image.tagName.toLowerCase() !== 'img') {
14957
- return;
14958
- }
14959
-
14960
- var removeDelay = _this8.usingSprites ? 500 : 1000;
14961
-
14962
- if (image.dataset.index !== currentImage.dataset.index && !image.dataset.deleting) {
14963
- // Wait 200ms, as the new image can take some time to show on certain browsers (even though it was downloaded before showing). This will prevent flicker, and show some generosity towards slower clients
14964
- // First set attribute 'deleting' to prevent multi-handling of this on repeat firing of this function
14965
- // eslint-disable-next-line no-param-reassign
14966
- image.dataset.deleting = true; // This has to be set before the timeout - to prevent issues switching between hover and scrub
14967
-
14968
- var currentImageContainer = _this8.currentImageContainer;
14969
- setTimeout(function () {
14970
- currentImageContainer.removeChild(image);
14971
-
14972
- _this8.player.debug.log("Removing thumb: ".concat(image.dataset.filename));
14973
- }, removeDelay);
14974
- }
14975
- });
14976
- } // Preload images before and after the current one. Only if the user is still hovering/seeking the same frame
14977
- // This will only preload the lowest quality
14978
-
14979
- }, {
14980
- key: "preloadNearby",
14981
- value: function preloadNearby(thumbNum) {
14982
- var _this9 = this;
14983
-
14984
- var forward = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
14985
- return new Promise(function (resolve) {
14986
- setTimeout(function () {
14987
- var oldThumbFilename = _this9.thumbnails[0].frames[thumbNum].text;
14988
-
14989
- if (_this9.showingThumbFilename === oldThumbFilename) {
14990
- // Find the nearest thumbs with different filenames. Sometimes it'll be the next index, but in the case of sprites, it might be 100+ away
14991
- var thumbnailsClone;
14992
-
14993
- if (forward) {
14994
- thumbnailsClone = _this9.thumbnails[0].frames.slice(thumbNum);
14995
- } else {
14996
- thumbnailsClone = _this9.thumbnails[0].frames.slice(0, thumbNum).reverse();
14997
- }
14998
-
14999
- var foundOne = false;
15000
- thumbnailsClone.forEach(function (frame) {
15001
- var newThumbFilename = frame.text;
15002
-
15003
- if (newThumbFilename !== oldThumbFilename) {
15004
- // Found one with a different filename. Make sure it hasn't already been loaded on this page visit
15005
- if (!_this9.loadedImages.includes(newThumbFilename)) {
15006
- foundOne = true;
15007
-
15008
- _this9.player.debug.log("Preloading thumb filename: ".concat(newThumbFilename));
15009
-
15010
- var urlPrefix = _this9.thumbnails[0].urlPrefix;
15011
- var thumbURL = urlPrefix + newThumbFilename;
15012
- var previewImage = new Image();
15013
- previewImage.src = thumbURL;
15014
-
15015
- previewImage.onload = function () {
15016
- _this9.player.debug.log("Preloaded thumb filename: ".concat(newThumbFilename));
15017
-
15018
- if (!_this9.loadedImages.includes(newThumbFilename)) _this9.loadedImages.push(newThumbFilename); // We don't resolve until the thumb is loaded
15019
-
15020
- resolve();
15021
- };
15022
- }
15023
- }
15024
- }); // If there are none to preload then we want to resolve immediately
15025
-
15026
- if (!foundOne) {
15027
- resolve();
15028
- }
15029
- }
15030
- }, 300);
15031
- });
15032
- } // If user has been hovering current image for half a second, look for a higher quality one
15033
-
15034
- }, {
15035
- key: "getHigherQuality",
15036
- value: function getHigherQuality(currentQualityIndex, previewImage, frame, thumbFilename) {
15037
- var _this10 = this;
15038
-
15039
- if (currentQualityIndex < this.thumbnails.length - 1) {
15040
- // Only use the higher quality version if it's going to look any better - if the current thumb is of a lower pixel density than the thumbnail container
15041
- var previewImageHeight = previewImage.naturalHeight;
15042
-
15043
- if (this.usingSprites) {
15044
- previewImageHeight = frame.h;
15045
- }
15046
-
15047
- if (previewImageHeight < this.thumbContainerHeight) {
15048
- // Recurse back to the loadImage function - show a higher quality one, but only if the viewer is on this frame for a while
15049
- setTimeout(function () {
15050
- // Make sure the mouse hasn't already moved on and started hovering at another image
15051
- if (_this10.showingThumbFilename === thumbFilename) {
15052
- _this10.player.debug.log("Showing higher quality thumb for: ".concat(thumbFilename));
15053
-
15054
- _this10.loadImage(currentQualityIndex + 1);
15055
- }
15056
- }, 300);
15057
- }
15058
- }
15059
- }
15060
- }, {
15061
- key: "toggleThumbContainer",
15062
- value: function toggleThumbContainer() {
15063
- var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
15064
- var clearShowing = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
15065
- var className = this.player.config.classNames.previewThumbnails.thumbContainerShown;
15066
- this.elements.thumb.container.classList.toggle(className, toggle);
15067
-
15068
- if (!toggle && clearShowing) {
15069
- this.showingThumb = null;
15070
- this.showingThumbFilename = null;
15071
- }
15072
- }
15073
- }, {
15074
- key: "toggleScrubbingContainer",
15075
- value: function toggleScrubbingContainer() {
15076
- var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
15077
- var className = this.player.config.classNames.previewThumbnails.scrubbingContainerShown;
15078
- this.elements.scrubbing.container.classList.toggle(className, toggle);
15079
-
15080
- if (!toggle) {
15081
- this.showingThumb = null;
15082
- this.showingThumbFilename = null;
15083
- }
15084
- }
15085
- }, {
15086
- key: "determineContainerAutoSizing",
15087
- value: function determineContainerAutoSizing() {
15088
- if (this.elements.thumb.imageContainer.clientHeight > 20) {
15089
- // This will prevent auto sizing in this.setThumbContainerSizeAndPos()
15090
- this.sizeSpecifiedInCSS = true;
15091
- }
15092
- } // Set the size to be about a quarter of the size of video. Unless option dynamicSize === false, in which case it needs to be set in CSS
15093
-
15094
- }, {
15095
- key: "setThumbContainerSizeAndPos",
15096
- value: function setThumbContainerSizeAndPos() {
15097
- if (!this.sizeSpecifiedInCSS) {
15098
- var thumbWidth = Math.floor(this.thumbContainerHeight * this.thumbAspectRatio);
15099
- this.elements.thumb.imageContainer.style.height = "".concat(this.thumbContainerHeight, "px");
15100
- this.elements.thumb.imageContainer.style.width = "".concat(thumbWidth, "px");
15101
- }
15102
-
15103
- this.setThumbContainerPos();
15104
- }
15105
- }, {
15106
- key: "setThumbContainerPos",
15107
- value: function setThumbContainerPos() {
15108
- var seekbarRect = this.player.elements.progress.getBoundingClientRect();
15109
- var plyrRect = this.player.elements.container.getBoundingClientRect();
15110
- var container = this.elements.thumb.container; // Find the lowest and highest desired left-position, so we don't slide out the side of the video container
15111
-
15112
- var minVal = plyrRect.left - seekbarRect.left + 10;
15113
- var maxVal = plyrRect.right - seekbarRect.left - container.clientWidth - 10; // Set preview container position to: mousepos, minus seekbar.left, minus half of previewContainer.clientWidth
15114
-
15115
- var previewPos = this.mousePosX - seekbarRect.left - container.clientWidth / 2;
15116
-
15117
- if (previewPos < minVal) {
15118
- previewPos = minVal;
15119
- }
15120
-
15121
- if (previewPos > maxVal) {
15122
- previewPos = maxVal;
15123
- }
15124
-
15125
- container.style.left = "".concat(previewPos, "px");
15126
- } // Can't use 100% width, in case the video is a different aspect ratio to the video container
15127
-
15128
- }, {
15129
- key: "setScrubbingContainerSize",
15130
- value: function setScrubbingContainerSize() {
15131
- this.elements.scrubbing.container.style.width = "".concat(this.player.media.clientWidth, "px"); // Can't use media.clientHeight - html5 video goes big and does black bars above and below
15132
-
15133
- this.elements.scrubbing.container.style.height = "".concat(this.player.media.clientWidth / this.thumbAspectRatio, "px");
15134
- } // Sprites need to be offset to the correct location
15135
-
15136
- }, {
15137
- key: "setImageSizeAndOffset",
15138
- value: function setImageSizeAndOffset(previewImage, frame) {
15139
- if (!this.usingSprites) {
15140
- return;
15141
- } // Find difference between height and preview container height
15142
-
15143
-
15144
- var multiplier = this.thumbContainerHeight / frame.h; // eslint-disable-next-line no-param-reassign
15145
-
15146
- previewImage.style.height = "".concat(Math.floor(previewImage.naturalHeight * multiplier), "px"); // eslint-disable-next-line no-param-reassign
15147
-
15148
- previewImage.style.width = "".concat(Math.floor(previewImage.naturalWidth * multiplier), "px"); // eslint-disable-next-line no-param-reassign
15149
-
15150
- previewImage.style.left = "-".concat(frame.x * multiplier, "px"); // eslint-disable-next-line no-param-reassign
15151
-
15152
- previewImage.style.top = "-".concat(frame.y * multiplier, "px");
15153
- }
15154
- }, {
15155
- key: "enabled",
15156
- get: function get() {
15157
- return this.player.isHTML5 && this.player.isVideo && this.player.config.previewThumbnails.enabled;
15158
- }
15159
- }, {
15160
- key: "currentImageContainer",
15161
- get: function get() {
15162
- if (this.mouseDown) {
15163
- return this.elements.scrubbing.container;
15164
- }
15165
-
15166
- return this.elements.thumb.imageContainer;
15167
- }
15168
- }, {
15169
- key: "usingSprites",
15170
- get: function get() {
15171
- return Object.keys(this.thumbnails[0].frames[0]).includes('w');
15172
- }
15173
- }, {
15174
- key: "thumbAspectRatio",
15175
- get: function get() {
15176
- if (this.usingSprites) {
15177
- return this.thumbnails[0].frames[0].w / this.thumbnails[0].frames[0].h;
15178
- }
15179
-
15180
- return this.thumbnails[0].width / this.thumbnails[0].height;
15181
- }
15182
- }, {
15183
- key: "thumbContainerHeight",
15184
- get: function get() {
15185
- if (this.mouseDown) {
15186
- // Can't use media.clientHeight - HTML5 video goes big and does black bars above and below
15187
- return Math.floor(this.player.media.clientWidth / this.thumbAspectRatio);
15188
- }
15189
-
15190
- return Math.floor(this.player.media.clientWidth / this.thumbAspectRatio / 4);
15191
- }
15192
- }, {
15193
- key: "currentImageElement",
15194
- get: function get() {
15195
- if (this.mouseDown) {
15196
- return this.currentScrubbingImageElement;
15197
- }
15198
-
15199
- return this.currentThumbnailImageElement;
15200
- },
15201
- set: function set(element) {
15202
- if (this.mouseDown) {
15203
- this.currentScrubbingImageElement = element;
15204
- } else {
15205
- this.currentThumbnailImageElement = element;
15206
- }
15207
- }
15208
- }]);
15209
-
15210
- return PreviewThumbnails;
15211
- }();
15212
-
15213
- var source = {
15214
- // Add elements to HTML5 media (source, tracks, etc)
15215
- insertElements: function insertElements(type, attributes) {
15216
- var _this = this;
15217
-
15218
- if (is$1.string(attributes)) {
15219
- insertElement(type, this.media, {
15220
- src: attributes
15221
- });
15222
- } else if (is$1.array(attributes)) {
15223
- attributes.forEach(function (attribute) {
15224
- insertElement(type, _this.media, attribute);
15225
- });
15226
- }
15227
- },
15228
- // Update source
15229
- // Sources are not checked for support so be careful
15230
- change: function change(input) {
15231
- var _this2 = this;
15232
-
15233
- if (!getDeep(input, 'sources.length')) {
15234
- this.debug.warn('Invalid source format');
15235
- return;
15236
- } // Cancel current network requests
15237
-
15238
-
15239
- html5.cancelRequests.call(this); // Destroy instance and re-setup
15240
-
15241
- this.destroy.call(this, function () {
15242
- // Reset quality options
15243
- _this2.options.quality = []; // Remove elements
15244
-
15245
- removeElement(_this2.media);
15246
- _this2.media = null; // Reset class name
15247
-
15248
- if (is$1.element(_this2.elements.container)) {
15249
- _this2.elements.container.removeAttribute('class');
15250
- } // Set the type and provider
15251
-
15252
-
15253
- var sources = input.sources,
15254
- type = input.type;
15255
-
15256
- var _sources = _slicedToArray(sources, 1),
15257
- _sources$ = _sources[0],
15258
- _sources$$provider = _sources$.provider,
15259
- provider = _sources$$provider === void 0 ? providers.html5 : _sources$$provider,
15260
- src = _sources$.src;
15261
-
15262
- var tagName = provider === 'html5' ? type : 'div';
15263
- var attributes = provider === 'html5' ? {} : {
15264
- src: src
15265
- };
15266
- Object.assign(_this2, {
15267
- provider: provider,
15268
- type: type,
15269
- // Check for support
15270
- supported: support.check(type, provider, _this2.config.playsinline),
15271
- // Create new element
15272
- media: createElement(tagName, attributes)
15273
- }); // Inject the new element
15274
-
15275
- _this2.elements.container.appendChild(_this2.media); // Autoplay the new source?
15276
-
15277
-
15278
- if (is$1.boolean(input.autoplay)) {
15279
- _this2.config.autoplay = input.autoplay;
15280
- } // Set attributes for audio and video
15281
-
15282
-
15283
- if (_this2.isHTML5) {
15284
- if (_this2.config.crossorigin) {
15285
- _this2.media.setAttribute('crossorigin', '');
15286
- }
15287
-
15288
- if (_this2.config.autoplay) {
15289
- _this2.media.setAttribute('autoplay', '');
15290
- }
15291
-
15292
- if (!is$1.empty(input.poster)) {
15293
- _this2.poster = input.poster;
15294
- }
15295
-
15296
- if (_this2.config.loop.active) {
15297
- _this2.media.setAttribute('loop', '');
15298
- }
15299
-
15300
- if (_this2.config.muted) {
15301
- _this2.media.setAttribute('muted', '');
15302
- }
15303
-
15304
- if (_this2.config.playsinline) {
15305
- _this2.media.setAttribute('playsinline', '');
15306
- }
15307
- } // Restore class hook
15308
-
15309
-
15310
- ui.addStyleHook.call(_this2); // Set new sources for html5
15311
-
15312
- if (_this2.isHTML5) {
15313
- source.insertElements.call(_this2, 'source', sources);
15314
- } // Set video title
15315
-
15316
-
15317
- _this2.config.title = input.title; // Set up from scratch
15318
-
15319
- media.setup.call(_this2); // HTML5 stuff
15320
-
15321
- if (_this2.isHTML5) {
15322
- // Setup captions
15323
- if (Object.keys(input).includes('tracks')) {
15324
- source.insertElements.call(_this2, 'track', input.tracks);
15325
- }
15326
- } // If HTML5 or embed but not fully supported, setupInterface and call ready now
15327
-
15328
-
15329
- if (_this2.isHTML5 || _this2.isEmbed && !_this2.supported.ui) {
15330
- // Setup interface
15331
- ui.build.call(_this2);
15332
- } // Load HTML5 sources
15333
-
15334
-
15335
- if (_this2.isHTML5) {
15336
- _this2.media.load();
15337
- } // Reload thumbnails
15338
-
15339
-
15340
- if (_this2.previewThumbnails) {
15341
- _this2.previewThumbnails.load();
15342
- } // Update the fullscreen support
15343
-
15344
-
15345
- _this2.fullscreen.update();
15346
- }, true);
15347
- }
15348
- };
15349
-
15350
- /**
15351
- * Returns a number whose value is limited to the given range.
15352
- *
15353
- * Example: limit the output of this computation to between 0 and 255
15354
- * (x * 255).clamp(0, 255)
15355
- *
15356
- * @param {Number} input
15357
- * @param {Number} min The lower boundary of the output range
15358
- * @param {Number} max The upper boundary of the output range
15359
- * @returns A number in the range [min, max]
15360
- * @type Number
15361
- */
15362
- function clamp() {
15363
- var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
15364
- var min = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
15365
- var max = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 255;
15366
- return Math.min(Math.max(input, min), max);
15367
- }
15368
-
15369
- // TODO: Use a WeakMap for private globals
15370
- // const globals = new WeakMap();
15371
- // Plyr instance
15372
-
15373
- var Plyr =
15374
- /*#__PURE__*/
15375
- function () {
15376
- function Plyr(target, options) {
15377
- var _this = this;
15378
-
15379
- _classCallCheck(this, Plyr);
15380
-
15381
- this.timers = {}; // State
15382
-
15383
- this.ready = false;
15384
- this.loading = false;
15385
- this.failed = false; // Touch device
15386
-
15387
- this.touch = support.touch; // Set the media element
15388
-
15389
- this.media = target; // String selector passed
15390
-
15391
- if (is$1.string(this.media)) {
15392
- this.media = document.querySelectorAll(this.media);
15393
- } // jQuery, NodeList or Array passed, use first element
15394
-
15395
-
15396
- if (window.jQuery && this.media instanceof jQuery || is$1.nodeList(this.media) || is$1.array(this.media)) {
15397
- // eslint-disable-next-line
15398
- this.media = this.media[0];
15399
- } // Set config
15400
-
15401
-
15402
- this.config = extend({}, defaults$1, Plyr.defaults, options || {}, function () {
15403
- try {
15404
- return JSON.parse(_this.media.getAttribute('data-plyr-config'));
15405
- } catch (e) {
15406
- return {};
15407
- }
15408
- }()); // Elements cache
15409
-
15410
- this.elements = {
15411
- container: null,
15412
- captions: null,
15413
- buttons: {},
15414
- display: {},
15415
- progress: {},
15416
- inputs: {},
15417
- settings: {
15418
- popup: null,
15419
- menu: null,
15420
- panels: {},
15421
- buttons: {}
15422
- }
15423
- }; // Captions
15424
-
15425
- this.captions = {
15426
- active: null,
15427
- currentTrack: -1,
15428
- meta: new WeakMap()
15429
- }; // Fullscreen
15430
-
15431
- this.fullscreen = {
15432
- active: false
15433
- }; // Options
15434
-
15435
- this.options = {
15436
- speed: [],
15437
- quality: []
15438
- }; // Debugging
15439
- // TODO: move to globals
15440
-
15441
- this.debug = new Console(this.config.debug); // Log config options and support
15442
-
15443
- this.debug.log('Config', this.config);
15444
- this.debug.log('Support', support); // We need an element to setup
15445
-
15446
- if (is$1.nullOrUndefined(this.media) || !is$1.element(this.media)) {
15447
- this.debug.error('Setup failed: no suitable element passed');
15448
- return;
15449
- } // Bail if the element is initialized
15450
-
15451
-
15452
- if (this.media.plyr) {
15453
- this.debug.warn('Target already setup');
15454
- return;
15455
- } // Bail if not enabled
15456
-
15457
-
15458
- if (!this.config.enabled) {
15459
- this.debug.error('Setup failed: disabled by config');
15460
- return;
15461
- } // Bail if disabled or no basic support
15462
- // You may want to disable certain UAs etc
15463
-
15464
-
15465
- if (!support.check().api) {
15466
- this.debug.error('Setup failed: no support');
15467
- return;
15468
- } // Cache original element state for .destroy()
15469
-
15470
-
15471
- var clone = this.media.cloneNode(true);
15472
- clone.autoplay = false;
15473
- this.elements.original = clone; // Set media type based on tag or data attribute
15474
- // Supported: video, audio, vimeo, youtube
15475
-
15476
- var type = this.media.tagName.toLowerCase(); // Embed properties
15477
-
15478
- var iframe = null;
15479
- var url = null; // Different setup based on type
15480
-
15481
- switch (type) {
15482
- case 'div':
15483
- // Find the frame
15484
- iframe = this.media.querySelector('iframe'); // <iframe> type
15485
-
15486
- if (is$1.element(iframe)) {
15487
- // Detect provider
15488
- url = parseUrl(iframe.getAttribute('src'));
15489
- this.provider = getProviderByUrl(url.toString()); // Rework elements
15490
-
15491
- this.elements.container = this.media;
15492
- this.media = iframe; // Reset classname
15493
-
15494
- this.elements.container.className = ''; // Get attributes from URL and set config
15495
-
15496
- if (url.search.length) {
15497
- var truthy = ['1', 'true'];
15498
-
15499
- if (truthy.includes(url.searchParams.get('autoplay'))) {
15500
- this.config.autoplay = true;
15501
- }
15502
-
15503
- if (truthy.includes(url.searchParams.get('loop'))) {
15504
- this.config.loop.active = true;
15505
- } // TODO: replace fullscreen.iosNative with this playsinline config option
15506
- // YouTube requires the playsinline in the URL
15507
-
15508
-
15509
- if (this.isYouTube) {
15510
- this.config.playsinline = truthy.includes(url.searchParams.get('playsinline'));
15511
- this.config.youtube.hl = url.searchParams.get('hl'); // TODO: Should this be setting language?
15512
- } else {
15513
- this.config.playsinline = true;
15514
- }
15515
- }
15516
- } else {
15517
- // <div> with attributes
15518
- this.provider = this.media.getAttribute(this.config.attributes.embed.provider); // Remove attribute
15519
-
15520
- this.media.removeAttribute(this.config.attributes.embed.provider);
15521
- } // Unsupported or missing provider
15522
-
15523
-
15524
- if (is$1.empty(this.provider) || !Object.keys(providers).includes(this.provider)) {
15525
- this.debug.error('Setup failed: Invalid provider');
15526
- return;
15527
- } // Audio will come later for external providers
15528
-
15529
-
15530
- this.type = types.video;
15531
- break;
15532
-
15533
- case 'video':
15534
- case 'audio':
15535
- this.type = type;
15536
- this.provider = providers.html5; // Get config from attributes
15537
-
15538
- if (this.media.hasAttribute('crossorigin')) {
15539
- this.config.crossorigin = true;
15540
- }
15541
-
15542
- if (this.media.hasAttribute('autoplay')) {
15543
- this.config.autoplay = true;
15544
- }
15545
-
15546
- if (this.media.hasAttribute('playsinline') || this.media.hasAttribute('webkit-playsinline')) {
15547
- this.config.playsinline = true;
15548
- }
15549
-
15550
- if (this.media.hasAttribute('muted')) {
15551
- this.config.muted = true;
15552
- }
15553
-
15554
- if (this.media.hasAttribute('loop')) {
15555
- this.config.loop.active = true;
15556
- }
15557
-
15558
- break;
15559
-
15560
- default:
15561
- this.debug.error('Setup failed: unsupported type');
15562
- return;
15563
- } // Check for support again but with type
15564
-
15565
-
15566
- this.supported = support.check(this.type, this.provider, this.config.playsinline); // If no support for even API, bail
15567
-
15568
- if (!this.supported.api) {
15569
- this.debug.error('Setup failed: no support');
15570
- return;
15571
- }
15572
-
15573
- this.eventListeners = []; // Create listeners
15574
-
15575
- this.listeners = new Listeners(this); // Setup local storage for user settings
15576
-
15577
- this.storage = new Storage(this); // Store reference
15578
-
15579
- this.media.plyr = this; // Wrap media
15580
-
15581
- if (!is$1.element(this.elements.container)) {
15582
- this.elements.container = createElement('div', {
15583
- tabindex: 0
15584
- });
15585
- wrap(this.media, this.elements.container);
15586
- } // Add style hook
15587
-
15588
-
15589
- ui.addStyleHook.call(this); // Setup media
15590
-
15591
- media.setup.call(this); // Listen for events if debugging
15592
-
15593
- if (this.config.debug) {
15594
- on.call(this, this.elements.container, this.config.events.join(' '), function (event) {
15595
- _this.debug.log("event: ".concat(event.type));
15596
- });
15597
- } // Setup interface
15598
- // If embed but not fully supported, build interface now to avoid flash of controls
15599
-
15600
-
15601
- if (this.isHTML5 || this.isEmbed && !this.supported.ui) {
15602
- ui.build.call(this);
15603
- } // Container listeners
15604
-
15605
-
15606
- this.listeners.container(); // Global listeners
15607
-
15608
- this.listeners.global(); // Setup fullscreen
15609
-
15610
- this.fullscreen = new Fullscreen(this); // Setup ads if provided
15611
-
15612
- if (this.config.ads.enabled) {
15613
- this.ads = new Ads(this);
15614
- } // Autoplay if required
15615
-
15616
-
15617
- if (this.isHTML5 && this.config.autoplay) {
15618
- setTimeout(function () {
15619
- return _this.play();
15620
- }, 10);
15621
- } // Seek time will be recorded (in listeners.js) so we can prevent hiding controls for a few seconds after seek
15622
-
15623
-
15624
- this.lastSeekTime = 0; // Setup preview thumbnails if enabled
15625
-
15626
- if (this.config.previewThumbnails.enabled) {
15627
- this.previewThumbnails = new PreviewThumbnails(this);
15628
- }
15629
- } // ---------------------------------------
15630
- // API
15631
- // ---------------------------------------
15632
-
15633
- /**
15634
- * Types and provider helpers
15635
- */
15636
-
15637
-
15638
- _createClass(Plyr, [{
15639
- key: "play",
15640
-
15641
- /**
15642
- * Play the media, or play the advertisement (if they are not blocked)
15643
- */
15644
- value: function play() {
15645
- var _this2 = this;
15646
-
15647
- if (!is$1.function(this.media.play)) {
15648
- return null;
15649
- } // Intecept play with ads
15650
-
15651
-
15652
- if (this.ads && this.ads.enabled) {
15653
- this.ads.managerPromise.then(function () {
15654
- return _this2.ads.play();
15655
- }).catch(function () {
15656
- return _this2.media.play();
15657
- });
15658
- } // Return the promise (for HTML5)
15659
-
15660
-
15661
- return this.media.play();
15662
- }
15663
- /**
15664
- * Pause the media
15665
- */
15666
-
15667
- }, {
15668
- key: "pause",
15669
- value: function pause() {
15670
- if (!this.playing || !is$1.function(this.media.pause)) {
15671
- return;
15672
- }
15673
-
15674
- this.media.pause();
15675
- }
15676
- /**
15677
- * Get playing state
15678
- */
15679
-
15680
- }, {
15681
- key: "togglePlay",
15682
-
15683
- /**
15684
- * Toggle playback based on current status
15685
- * @param {Boolean} input
15686
- */
15687
- value: function togglePlay(input) {
15688
- // Toggle based on current state if nothing passed
15689
- var toggle = is$1.boolean(input) ? input : !this.playing;
15690
-
15691
- if (toggle) {
15692
- this.play();
15693
- } else {
15694
- this.pause();
15695
- }
15696
- }
15697
- /**
15698
- * Stop playback
15699
- */
15700
-
15701
- }, {
15702
- key: "stop",
15703
- value: function stop() {
15704
- if (this.isHTML5) {
15705
- this.pause();
15706
- this.restart();
15707
- } else if (is$1.function(this.media.stop)) {
15708
- this.media.stop();
15709
- }
15710
- }
15711
- /**
15712
- * Restart playback
15713
- */
15714
-
15715
- }, {
15716
- key: "restart",
15717
- value: function restart() {
15718
- this.currentTime = 0;
15719
- }
15720
- /**
15721
- * Rewind
15722
- * @param {Number} seekTime - how far to rewind in seconds. Defaults to the config.seekTime
15723
- */
15724
-
15725
- }, {
15726
- key: "rewind",
15727
- value: function rewind(seekTime) {
15728
- this.currentTime = this.currentTime - (is$1.number(seekTime) ? seekTime : this.config.seekTime);
15729
- }
15730
- /**
15731
- * Fast forward
15732
- * @param {Number} seekTime - how far to fast forward in seconds. Defaults to the config.seekTime
15733
- */
15734
-
15735
- }, {
15736
- key: "forward",
15737
- value: function forward(seekTime) {
15738
- this.currentTime = this.currentTime + (is$1.number(seekTime) ? seekTime : this.config.seekTime);
15739
- }
15740
- /**
15741
- * Seek to a time
15742
- * @param {Number} input - where to seek to in seconds. Defaults to 0 (the start)
15743
- */
15744
-
15745
- }, {
15746
- key: "increaseVolume",
15747
-
15748
- /**
15749
- * Increase volume
15750
- * @param {Boolean} step - How much to decrease by (between 0 and 1)
15751
- */
15752
- value: function increaseVolume(step) {
15753
- var volume = this.media.muted ? 0 : this.volume;
15754
- this.volume = volume + (is$1.number(step) ? step : 0);
15755
- }
15756
- /**
15757
- * Decrease volume
15758
- * @param {Boolean} step - How much to decrease by (between 0 and 1)
15759
- */
15760
-
15761
- }, {
15762
- key: "decreaseVolume",
15763
- value: function decreaseVolume(step) {
15764
- this.increaseVolume(-step);
15765
- }
15766
- /**
15767
- * Set muted state
15768
- * @param {Boolean} mute
15769
- */
15770
-
15771
- }, {
15772
- key: "toggleCaptions",
15773
-
15774
- /**
15775
- * Toggle captions
15776
- * @param {Boolean} input - Whether to enable captions
15777
- */
15778
- value: function toggleCaptions(input) {
15779
- captions.toggle.call(this, input, false);
15780
- }
15781
- /**
15782
- * Set the caption track by index
15783
- * @param {Number} - Caption index
15784
- */
15785
-
15786
- }, {
15787
- key: "airplay",
15788
-
15789
- /**
15790
- * Trigger the airplay dialog
15791
- * TODO: update player with state, support, enabled
15792
- */
15793
- value: function airplay() {
15794
- // Show dialog if supported
15795
- if (support.airplay) {
15796
- this.media.webkitShowPlaybackTargetPicker();
15797
- }
15798
- }
15799
- /**
15800
- * Toggle the player controls
15801
- * @param {Boolean} [toggle] - Whether to show the controls
15802
- */
15803
-
15804
- }, {
15805
- key: "toggleControls",
15806
- value: function toggleControls(toggle) {
15807
- // Don't toggle if missing UI support or if it's audio
15808
- if (this.supported.ui && !this.isAudio) {
15809
- // Get state before change
15810
- var isHidden = hasClass(this.elements.container, this.config.classNames.hideControls); // Negate the argument if not undefined since adding the class to hides the controls
15811
-
15812
- var force = typeof toggle === 'undefined' ? undefined : !toggle; // Apply and get updated state
15813
-
15814
- var hiding = toggleClass(this.elements.container, this.config.classNames.hideControls, force); // Close menu
15815
-
15816
- if (hiding && this.config.controls.includes('settings') && !is$1.empty(this.config.settings)) {
15817
- controls.toggleMenu.call(this, false);
15818
- } // Trigger event on change
15819
-
15820
-
15821
- if (hiding !== isHidden) {
15822
- var eventName = hiding ? 'controlshidden' : 'controlsshown';
15823
- triggerEvent.call(this, this.media, eventName);
15824
- }
15825
-
15826
- return !hiding;
15827
- }
15828
-
15829
- return false;
15830
- }
15831
- /**
15832
- * Add event listeners
15833
- * @param {String} event - Event type
15834
- * @param {Function} callback - Callback for when event occurs
15835
- */
15836
-
15837
- }, {
15838
- key: "on",
15839
- value: function on$1(event, callback) {
15840
- on.call(this, this.elements.container, event, callback);
15841
- }
15842
- /**
15843
- * Add event listeners once
15844
- * @param {String} event - Event type
15845
- * @param {Function} callback - Callback for when event occurs
15846
- */
15847
-
15848
- }, {
15849
- key: "once",
15850
- value: function once$1(event, callback) {
15851
- once.call(this, this.elements.container, event, callback);
15852
- }
15853
- /**
15854
- * Remove event listeners
15855
- * @param {String} event - Event type
15856
- * @param {Function} callback - Callback for when event occurs
15857
- */
15858
-
15859
- }, {
15860
- key: "off",
15861
- value: function off$1(event, callback) {
15862
- off(this.elements.container, event, callback);
15863
- }
15864
- /**
15865
- * Destroy an instance
15866
- * Event listeners are removed when elements are removed
15867
- * http://stackoverflow.com/questions/12528049/if-a-dom-element-is-removed-are-its-listeners-also-removed-from-memory
15868
- * @param {Function} callback - Callback for when destroy is complete
15869
- * @param {Boolean} soft - Whether it's a soft destroy (for source changes etc)
15870
- */
15871
-
15872
- }, {
15873
- key: "destroy",
15874
- value: function destroy(callback) {
15875
- var _this3 = this;
15876
-
15877
- var soft = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
15878
-
15879
- if (!this.ready) {
15880
- return;
15881
- }
15882
-
15883
- var done = function done() {
15884
- // Reset overflow (incase destroyed while in fullscreen)
15885
- document.body.style.overflow = ''; // GC for embed
15886
-
15887
- _this3.embed = null; // If it's a soft destroy, make minimal changes
15888
-
15889
- if (soft) {
15890
- if (Object.keys(_this3.elements).length) {
15891
- // Remove elements
15892
- removeElement(_this3.elements.buttons.play);
15893
- removeElement(_this3.elements.captions);
15894
- removeElement(_this3.elements.controls);
15895
- removeElement(_this3.elements.wrapper); // Clear for GC
15896
-
15897
- _this3.elements.buttons.play = null;
15898
- _this3.elements.captions = null;
15899
- _this3.elements.controls = null;
15900
- _this3.elements.wrapper = null;
15901
- } // Callback
15902
-
15903
-
15904
- if (is$1.function(callback)) {
15905
- callback();
15906
- }
15907
- } else {
15908
- // Unbind listeners
15909
- unbindListeners.call(_this3); // Replace the container with the original element provided
15910
-
15911
- replaceElement(_this3.elements.original, _this3.elements.container); // Event
15912
-
15913
- triggerEvent.call(_this3, _this3.elements.original, 'destroyed', true); // Callback
15914
-
15915
- if (is$1.function(callback)) {
15916
- callback.call(_this3.elements.original);
15917
- } // Reset state
15918
-
15919
-
15920
- _this3.ready = false; // Clear for garbage collection
15921
-
15922
- setTimeout(function () {
15923
- _this3.elements = null;
15924
- _this3.media = null;
15925
- }, 200);
15926
- }
15927
- }; // Stop playback
15928
-
15929
-
15930
- this.stop(); // Clear timeouts
15931
-
15932
- clearTimeout(this.timers.loading);
15933
- clearTimeout(this.timers.controls);
15934
- clearTimeout(this.timers.resized); // Provider specific stuff
15935
-
15936
- if (this.isHTML5) {
15937
- // Restore native video controls
15938
- ui.toggleNativeControls.call(this, true); // Clean up
15939
-
15940
- done();
15941
- } else if (this.isYouTube) {
15942
- // Clear timers
15943
- clearInterval(this.timers.buffering);
15944
- clearInterval(this.timers.playing); // Destroy YouTube API
15945
-
15946
- if (this.embed !== null && is$1.function(this.embed.destroy)) {
15947
- this.embed.destroy();
15948
- } // Clean up
15949
-
15950
-
15951
- done();
15952
- } else if (this.isVimeo) {
15953
- // Destroy Vimeo API
15954
- // then clean up (wait, to prevent postmessage errors)
15955
- if (this.embed !== null) {
15956
- this.embed.unload().then(done);
15957
- } // Vimeo does not always return
15958
-
15959
-
15960
- setTimeout(done, 200);
15961
- }
15962
- }
15963
- /**
15964
- * Check for support for a mime type (HTML5 only)
15965
- * @param {String} type - Mime type
15966
- */
15967
-
15968
- }, {
15969
- key: "supports",
15970
- value: function supports(type) {
15971
- return support.mime.call(this, type);
15972
- }
15973
- /**
15974
- * Check for support
15975
- * @param {String} type - Player type (audio/video)
15976
- * @param {String} provider - Provider (html5/youtube/vimeo)
15977
- * @param {Boolean} inline - Where player has `playsinline` sttribute
15978
- */
15979
-
15980
- }, {
15981
- key: "isHTML5",
15982
- get: function get() {
15983
- return this.provider === providers.html5;
15984
- }
15985
- }, {
15986
- key: "isEmbed",
15987
- get: function get() {
15988
- return this.isYouTube || this.isVimeo;
15989
- }
15990
- }, {
15991
- key: "isYouTube",
15992
- get: function get() {
15993
- return this.provider === providers.youtube;
15994
- }
15995
- }, {
15996
- key: "isVimeo",
15997
- get: function get() {
15998
- return this.provider === providers.vimeo;
15999
- }
16000
- }, {
16001
- key: "isVideo",
16002
- get: function get() {
16003
- return this.type === types.video;
16004
- }
16005
- }, {
16006
- key: "isAudio",
16007
- get: function get() {
16008
- return this.type === types.audio;
16009
- }
16010
- }, {
16011
- key: "playing",
16012
- get: function get() {
16013
- return Boolean(this.ready && !this.paused && !this.ended);
16014
- }
16015
- /**
16016
- * Get paused state
16017
- */
16018
-
16019
- }, {
16020
- key: "paused",
16021
- get: function get() {
16022
- return Boolean(this.media.paused);
16023
- }
16024
- /**
16025
- * Get stopped state
16026
- */
16027
-
16028
- }, {
16029
- key: "stopped",
16030
- get: function get() {
16031
- return Boolean(this.paused && this.currentTime === 0);
16032
- }
16033
- /**
16034
- * Get ended state
16035
- */
16036
-
16037
- }, {
16038
- key: "ended",
16039
- get: function get() {
16040
- return Boolean(this.media.ended);
16041
- }
16042
- }, {
16043
- key: "currentTime",
16044
- set: function set(input) {
16045
- // Bail if media duration isn't available yet
16046
- if (!this.duration) {
16047
- return;
16048
- } // Validate input
16049
-
16050
-
16051
- var inputIsValid = is$1.number(input) && input > 0; // Set
16052
-
16053
- this.media.currentTime = inputIsValid ? Math.min(input, this.duration) : 0; // Logging
16054
-
16055
- this.debug.log("Seeking to ".concat(this.currentTime, " seconds"));
16056
- }
16057
- /**
16058
- * Get current time
16059
- */
16060
- ,
16061
- get: function get() {
16062
- return Number(this.media.currentTime);
16063
- }
16064
- /**
16065
- * Get buffered
16066
- */
16067
-
16068
- }, {
16069
- key: "buffered",
16070
- get: function get() {
16071
- var buffered = this.media.buffered; // YouTube / Vimeo return a float between 0-1
16072
-
16073
- if (is$1.number(buffered)) {
16074
- return buffered;
16075
- } // HTML5
16076
- // TODO: Handle buffered chunks of the media
16077
- // (i.e. seek to another section buffers only that section)
16078
-
16079
-
16080
- if (buffered && buffered.length && this.duration > 0) {
16081
- return buffered.end(0) / this.duration;
16082
- }
16083
-
16084
- return 0;
16085
- }
16086
- /**
16087
- * Get seeking status
16088
- */
16089
-
16090
- }, {
16091
- key: "seeking",
16092
- get: function get() {
16093
- return Boolean(this.media.seeking);
16094
- }
16095
- /**
16096
- * Get the duration of the current media
16097
- */
16098
-
16099
- }, {
16100
- key: "duration",
16101
- get: function get() {
16102
- // Faux duration set via config
16103
- var fauxDuration = parseFloat(this.config.duration); // Media duration can be NaN or Infinity before the media has loaded
16104
-
16105
- var realDuration = (this.media || {}).duration;
16106
- var duration = !is$1.number(realDuration) || realDuration === Infinity ? 0 : realDuration; // If config duration is funky, use regular duration
16107
-
16108
- return fauxDuration || duration;
16109
- }
16110
- /**
16111
- * Set the player volume
16112
- * @param {Number} value - must be between 0 and 1. Defaults to the value from local storage and config.volume if not set in storage
16113
- */
16114
-
16115
- }, {
16116
- key: "volume",
16117
- set: function set(value) {
16118
- var volume = value;
16119
- var max = 1;
16120
- var min = 0;
16121
-
16122
- if (is$1.string(volume)) {
16123
- volume = Number(volume);
16124
- } // Load volume from storage if no value specified
16125
-
16126
-
16127
- if (!is$1.number(volume)) {
16128
- volume = this.storage.get('volume');
16129
- } // Use config if all else fails
16130
-
16131
-
16132
- if (!is$1.number(volume)) {
16133
- volume = this.config.volume;
16134
- } // Maximum is volumeMax
16135
-
16136
-
16137
- if (volume > max) {
16138
- volume = max;
16139
- } // Minimum is volumeMin
16140
-
16141
-
16142
- if (volume < min) {
16143
- volume = min;
16144
- } // Update config
16145
-
16146
-
16147
- this.config.volume = volume; // Set the player volume
16148
-
16149
- this.media.volume = volume; // If muted, and we're increasing volume manually, reset muted state
16150
-
16151
- if (!is$1.empty(value) && this.muted && volume > 0) {
16152
- this.muted = false;
16153
- }
16154
- }
16155
- /**
16156
- * Get the current player volume
16157
- */
16158
- ,
16159
- get: function get() {
16160
- return Number(this.media.volume);
16161
- }
16162
- }, {
16163
- key: "muted",
16164
- set: function set(mute) {
16165
- var toggle = mute; // Load muted state from storage
16166
-
16167
- if (!is$1.boolean(toggle)) {
16168
- toggle = this.storage.get('muted');
16169
- } // Use config if all else fails
16170
-
16171
-
16172
- if (!is$1.boolean(toggle)) {
16173
- toggle = this.config.muted;
16174
- } // Update config
16175
-
16176
-
16177
- this.config.muted = toggle; // Set mute on the player
16178
-
16179
- this.media.muted = toggle;
16180
- }
16181
- /**
16182
- * Get current muted state
16183
- */
16184
- ,
16185
- get: function get() {
16186
- return Boolean(this.media.muted);
16187
- }
16188
- /**
16189
- * Check if the media has audio
16190
- */
16191
-
16192
- }, {
16193
- key: "hasAudio",
16194
- get: function get() {
16195
- // Assume yes for all non HTML5 (as we can't tell...)
16196
- if (!this.isHTML5) {
16197
- return true;
16198
- }
16199
-
16200
- if (this.isAudio) {
16201
- return true;
16202
- } // Get audio tracks
16203
-
16204
-
16205
- return Boolean(this.media.mozHasAudio) || Boolean(this.media.webkitAudioDecodedByteCount) || Boolean(this.media.audioTracks && this.media.audioTracks.length);
16206
- }
16207
- /**
16208
- * Set playback speed
16209
- * @param {Number} speed - the speed of playback (0.5-2.0)
16210
- */
16211
-
16212
- }, {
16213
- key: "speed",
16214
- set: function set(input) {
16215
- var _this4 = this;
16216
-
16217
- var speed = null;
16218
-
16219
- if (is$1.number(input)) {
16220
- speed = input;
16221
- }
16222
-
16223
- if (!is$1.number(speed)) {
16224
- speed = this.storage.get('speed');
16225
- }
16226
-
16227
- if (!is$1.number(speed)) {
16228
- speed = this.config.speed.selected;
16229
- } // Clamp to min/max
16230
-
16231
-
16232
- var min = this.minimumSpeed,
16233
- max = this.maximumSpeed;
16234
- speed = clamp(speed, min, max); // Update config
16235
-
16236
- this.config.speed.selected = speed; // Set media speed
16237
-
16238
- setTimeout(function () {
16239
- _this4.media.playbackRate = speed;
16240
- }, 0);
16241
- }
16242
- /**
16243
- * Get current playback speed
16244
- */
16245
- ,
16246
- get: function get() {
16247
- return Number(this.media.playbackRate);
16248
- }
16249
- /**
16250
- * Get the minimum allowed speed
16251
- */
16252
-
16253
- }, {
16254
- key: "minimumSpeed",
16255
- get: function get() {
16256
- if (this.isYouTube) {
16257
- // https://developers.google.com/youtube/iframe_api_reference#setPlaybackRate
16258
- return Math.min.apply(Math, _toConsumableArray(this.options.speed));
16259
- }
16260
-
16261
- if (this.isVimeo) {
16262
- // https://github.com/vimeo/player.js/#setplaybackrateplaybackrate-number-promisenumber-rangeerrorerror
16263
- return 0.5;
16264
- } // https://stackoverflow.com/a/32320020/1191319
16265
-
16266
-
16267
- return 0.0625;
16268
- }
16269
- /**
16270
- * Get the maximum allowed speed
16271
- */
16272
-
16273
- }, {
16274
- key: "maximumSpeed",
16275
- get: function get() {
16276
- if (this.isYouTube) {
16277
- // https://developers.google.com/youtube/iframe_api_reference#setPlaybackRate
16278
- return Math.max.apply(Math, _toConsumableArray(this.options.speed));
16279
- }
16280
-
16281
- if (this.isVimeo) {
16282
- // https://github.com/vimeo/player.js/#setplaybackrateplaybackrate-number-promisenumber-rangeerrorerror
16283
- return 2;
16284
- } // https://stackoverflow.com/a/32320020/1191319
16285
-
16286
-
16287
- return 16;
16288
- }
16289
- /**
16290
- * Set playback quality
16291
- * Currently HTML5 & YouTube only
16292
- * @param {Number} input - Quality level
16293
- */
16294
-
16295
- }, {
16296
- key: "quality",
16297
- set: function set(input) {
16298
- var config = this.config.quality;
16299
- var options = this.options.quality;
16300
-
16301
- if (!options.length) {
16302
- return;
16303
- }
16304
-
16305
- var quality = [!is$1.empty(input) && Number(input), this.storage.get('quality'), config.selected, config.default].find(is$1.number);
16306
- var updateStorage = true;
16307
-
16308
- if (!options.includes(quality)) {
16309
- var value = closest(options, quality);
16310
- this.debug.warn("Unsupported quality option: ".concat(quality, ", using ").concat(value, " instead"));
16311
- quality = value; // Don't update storage if quality is not supported
16312
-
16313
- updateStorage = false;
16314
- } // Update config
16315
-
16316
-
16317
- config.selected = quality; // Set quality
16318
-
16319
- this.media.quality = quality; // Save to storage
16320
-
16321
- if (updateStorage) {
16322
- this.storage.set({
16323
- quality: quality
16324
- });
16325
- }
16326
- }
16327
- /**
16328
- * Get current quality level
16329
- */
16330
- ,
16331
- get: function get() {
16332
- return this.media.quality;
16333
- }
16334
- /**
16335
- * Toggle loop
16336
- * TODO: Finish fancy new logic. Set the indicator on load as user may pass loop as config
16337
- * @param {Boolean} input - Whether to loop or not
16338
- */
16339
-
16340
- }, {
16341
- key: "loop",
16342
- set: function set(input) {
16343
- var toggle = is$1.boolean(input) ? input : this.config.loop.active;
16344
- this.config.loop.active = toggle;
16345
- this.media.loop = toggle; // Set default to be a true toggle
16346
-
16347
- /* const type = ['start', 'end', 'all', 'none', 'toggle'].includes(input) ? input : 'toggle';
16348
- switch (type) {
16349
- case 'start':
16350
- if (this.config.loop.end && this.config.loop.end <= this.currentTime) {
16351
- this.config.loop.end = null;
16352
- }
16353
- this.config.loop.start = this.currentTime;
16354
- // this.config.loop.indicator.start = this.elements.display.played.value;
16355
- break;
16356
- case 'end':
16357
- if (this.config.loop.start >= this.currentTime) {
16358
- return this;
16359
- }
16360
- this.config.loop.end = this.currentTime;
16361
- // this.config.loop.indicator.end = this.elements.display.played.value;
16362
- break;
16363
- case 'all':
16364
- this.config.loop.start = 0;
16365
- this.config.loop.end = this.duration - 2;
16366
- this.config.loop.indicator.start = 0;
16367
- this.config.loop.indicator.end = 100;
16368
- break;
16369
- case 'toggle':
16370
- if (this.config.loop.active) {
16371
- this.config.loop.start = 0;
16372
- this.config.loop.end = null;
16373
- } else {
16374
- this.config.loop.start = 0;
16375
- this.config.loop.end = this.duration - 2;
16376
- }
16377
- break;
16378
- default:
16379
- this.config.loop.start = 0;
16380
- this.config.loop.end = null;
16381
- break;
16382
- } */
16383
- }
16384
- /**
16385
- * Get current loop state
16386
- */
16387
- ,
16388
- get: function get() {
16389
- return Boolean(this.media.loop);
16390
- }
16391
- /**
16392
- * Set new media source
16393
- * @param {Object} input - The new source object (see docs)
16394
- */
16395
-
16396
- }, {
16397
- key: "source",
16398
- set: function set(input) {
16399
- source.change.call(this, input);
16400
- }
16401
- /**
16402
- * Get current source
16403
- */
16404
- ,
16405
- get: function get() {
16406
- return this.media.currentSrc;
16407
- }
16408
- /**
16409
- * Get a download URL (either source or custom)
16410
- */
16411
-
16412
- }, {
16413
- key: "download",
16414
- get: function get() {
16415
- var download = this.config.urls.download;
16416
- return is$1.url(download) ? download : this.source;
16417
- }
16418
- /**
16419
- * Set the download URL
16420
- */
16421
- ,
16422
- set: function set(input) {
16423
- if (!is$1.url(input)) {
16424
- return;
16425
- }
16426
-
16427
- this.config.urls.download = input;
16428
- controls.setDownloadUrl.call(this);
16429
- }
16430
- /**
16431
- * Set the poster image for a video
16432
- * @param {String} input - the URL for the new poster image
16433
- */
16434
-
16435
- }, {
16436
- key: "poster",
16437
- set: function set(input) {
16438
- if (!this.isVideo) {
16439
- this.debug.warn('Poster can only be set for video');
16440
- return;
16441
- }
16442
-
16443
- ui.setPoster.call(this, input, false).catch(function () {});
16444
- }
16445
- /**
16446
- * Get the current poster image
16447
- */
16448
- ,
16449
- get: function get() {
16450
- if (!this.isVideo) {
16451
- return null;
16452
- }
16453
-
16454
- return this.media.getAttribute('poster');
16455
- }
16456
- /**
16457
- * Get the current aspect ratio in use
16458
- */
16459
-
16460
- }, {
16461
- key: "ratio",
16462
- get: function get() {
16463
- if (!this.isVideo) {
16464
- return null;
16465
- }
16466
-
16467
- var ratio = reduceAspectRatio(getAspectRatio.call(this));
16468
- return is$1.array(ratio) ? ratio.join(':') : ratio;
16469
- }
16470
- /**
16471
- * Set video aspect ratio
16472
- */
16473
- ,
16474
- set: function set(input) {
16475
- if (!this.isVideo) {
16476
- this.debug.warn('Aspect ratio can only be set for video');
16477
- return;
16478
- }
16479
-
16480
- if (!is$1.string(input) || !validateRatio(input)) {
16481
- this.debug.error("Invalid aspect ratio specified (".concat(input, ")"));
16482
- return;
16483
- }
16484
-
16485
- this.config.ratio = input;
16486
- setAspectRatio.call(this);
16487
- }
16488
- /**
16489
- * Set the autoplay state
16490
- * @param {Boolean} input - Whether to autoplay or not
16491
- */
16492
-
16493
- }, {
16494
- key: "autoplay",
16495
- set: function set(input) {
16496
- var toggle = is$1.boolean(input) ? input : this.config.autoplay;
16497
- this.config.autoplay = toggle;
16498
- }
16499
- /**
16500
- * Get the current autoplay state
16501
- */
16502
- ,
16503
- get: function get() {
16504
- return Boolean(this.config.autoplay);
16505
- }
16506
- }, {
16507
- key: "currentTrack",
16508
- set: function set(input) {
16509
- captions.set.call(this, input, false);
16510
- }
16511
- /**
16512
- * Get the current caption track index (-1 if disabled)
16513
- */
16514
- ,
16515
- get: function get() {
16516
- var _this$captions = this.captions,
16517
- toggled = _this$captions.toggled,
16518
- currentTrack = _this$captions.currentTrack;
16519
- return toggled ? currentTrack : -1;
16520
- }
16521
- /**
16522
- * Set the wanted language for captions
16523
- * Since tracks can be added later it won't update the actual caption track until there is a matching track
16524
- * @param {String} - Two character ISO language code (e.g. EN, FR, PT, etc)
16525
- */
16526
-
16527
- }, {
16528
- key: "language",
16529
- set: function set(input) {
16530
- captions.setLanguage.call(this, input, false);
16531
- }
16532
- /**
16533
- * Get the current track's language
16534
- */
16535
- ,
16536
- get: function get() {
16537
- return (captions.getCurrentTrack.call(this) || {}).language;
16538
- }
16539
- /**
16540
- * Toggle picture-in-picture playback on WebKit/MacOS
16541
- * TODO: update player with state, support, enabled
16542
- * TODO: detect outside changes
16543
- */
16544
-
16545
- }, {
16546
- key: "pip",
16547
- set: function set(input) {
16548
- // Bail if no support
16549
- if (!support.pip) {
16550
- return;
16551
- } // Toggle based on current state if not passed
16552
-
16553
-
16554
- var toggle = is$1.boolean(input) ? input : !this.pip; // Toggle based on current state
16555
- // Safari
16556
-
16557
- if (is$1.function(this.media.webkitSetPresentationMode)) {
16558
- this.media.webkitSetPresentationMode(toggle ? pip.active : pip.inactive);
16559
- } // Chrome
16560
-
16561
-
16562
- if (is$1.function(this.media.requestPictureInPicture)) {
16563
- if (!this.pip && toggle) {
16564
- this.media.requestPictureInPicture();
16565
- } else if (this.pip && !toggle) {
16566
- document.exitPictureInPicture();
16567
- }
16568
- }
16569
- }
16570
- /**
16571
- * Get the current picture-in-picture state
16572
- */
16573
- ,
16574
- get: function get() {
16575
- if (!support.pip) {
16576
- return null;
16577
- } // Safari
16578
-
16579
-
16580
- if (!is$1.empty(this.media.webkitPresentationMode)) {
16581
- return this.media.webkitPresentationMode === pip.active;
16582
- } // Chrome
16583
-
16584
-
16585
- return this.media === document.pictureInPictureElement;
16586
- }
16587
- }], [{
16588
- key: "supported",
16589
- value: function supported(type, provider, inline) {
16590
- return support.check(type, provider, inline);
16591
- }
16592
- /**
16593
- * Load an SVG sprite into the page
16594
- * @param {String} url - URL for the SVG sprite
16595
- * @param {String} [id] - Unique ID
16596
- */
16597
-
16598
- }, {
16599
- key: "loadSprite",
16600
- value: function loadSprite$1(url, id) {
16601
- return loadSprite(url, id);
16602
- }
16603
- /**
16604
- * Setup multiple instances
16605
- * @param {*} selector
16606
- * @param {Object} options
16607
- */
16608
-
16609
- }, {
16610
- key: "setup",
16611
- value: function setup(selector) {
16612
- var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
16613
- var targets = null;
16614
-
16615
- if (is$1.string(selector)) {
16616
- targets = Array.from(document.querySelectorAll(selector));
16617
- } else if (is$1.nodeList(selector)) {
16618
- targets = Array.from(selector);
16619
- } else if (is$1.array(selector)) {
16620
- targets = selector.filter(is$1.element);
16621
- }
16622
-
16623
- if (is$1.empty(targets)) {
16624
- return null;
16625
- }
16626
-
16627
- return targets.map(function (t) {
16628
- return new Plyr(t, options);
16629
- });
16630
- }
16631
- }]);
16632
-
16633
- return Plyr;
16634
- }();
16635
-
16636
- Plyr.defaults = cloneDeep(defaults$1);
16637
-
16638
- return Plyr;
16639
-
16640
- }));
16641
-
16642
- (function (root, factory) {
16643
- if (typeof define === 'function' && define.amd) {
16644
- // AMD. Register as an anonymous module unless amdModuleId is set
16645
- define(["jquery"], function (a0) {
16646
- return (factory(a0));
16647
- });
16648
- } else if (typeof exports === 'object') {
16649
- // Node. Does not work with strict CommonJS, but
16650
- // only CommonJS-like environments that support module.exports,
16651
- // like Node.
16652
- module.exports = factory(require("jquery"));
16653
- } else {
16654
- factory(jQuery);
16655
- }
16656
- }(this, function ($) {
16657
-
16658
- // This file will be UMDified by a build task.
16659
-
16660
- var defaults = {
16661
- animation: 'fade',
16662
- animationDuration: 350,
16663
- content: null,
16664
- contentAsHTML: false,
16665
- contentCloning: false,
16666
- debug: true,
16667
- delay: 300,
16668
- delayTouch: [300, 500],
16669
- functionInit: null,
16670
- functionBefore: null,
16671
- functionReady: null,
16672
- functionAfter: null,
16673
- functionFormat: null,
16674
- IEmin: 6,
16675
- interactive: false,
16676
- multiple: false,
16677
- // will default to document.body, or must be an element positioned at (0, 0)
16678
- // in the document, typically like the very top views of an app.
16679
- parent: null,
16680
- plugins: ['sideTip'],
16681
- repositionOnScroll: false,
16682
- restoration: 'none',
16683
- selfDestruction: true,
16684
- theme: [],
16685
- timer: 0,
16686
- trackerInterval: 500,
16687
- trackOrigin: false,
16688
- trackTooltip: false,
16689
- trigger: 'hover',
16690
- triggerClose: {
16691
- click: false,
16692
- mouseleave: false,
16693
- originClick: false,
16694
- scroll: false,
16695
- tap: false,
16696
- touchleave: false
16697
- },
16698
- triggerOpen: {
16699
- click: false,
16700
- mouseenter: false,
16701
- tap: false,
16702
- touchstart: false
16703
- },
16704
- updateAnimation: 'rotate',
16705
- zIndex: 9999999
16706
- },
16707
- // we'll avoid using the 'window' global as a good practice but npm's
16708
- // jquery@<2.1.0 package actually requires a 'window' global, so not sure
16709
- // it's useful at all
16710
- win = (typeof window != 'undefined') ? window : null,
16711
- // env will be proxied by the core for plugins to have access its properties
16712
- env = {
16713
- // detect if this device can trigger touch events. Better have a false
16714
- // positive (unused listeners, that's ok) than a false negative.
16715
- // https://github.com/Modernizr/Modernizr/blob/master/feature-detects/touchevents.js
16716
- // http://stackoverflow.com/questions/4817029/whats-the-best-way-to-detect-a-touch-screen-device-using-javascript
16717
- hasTouchCapability: !!(
16718
- win
16719
- && ( 'ontouchstart' in win
16720
- || (win.DocumentTouch && win.document instanceof win.DocumentTouch)
16721
- || win.navigator.maxTouchPoints
16722
- )
16723
- ),
16724
- hasTransitions: transitionSupport(),
16725
- IE: false,
16726
- // don't set manually, it will be updated by a build task after the manifest
16727
- semVer: '4.2.6',
16728
- window: win
16729
- },
16730
- core = function() {
16731
-
16732
- // core variables
16733
-
16734
- // the core emitters
16735
- this.__$emitterPrivate = $({});
16736
- this.__$emitterPublic = $({});
16737
- this.__instancesLatestArr = [];
16738
- // collects plugin constructors
16739
- this.__plugins = {};
16740
- // proxy env variables for plugins who might use them
16741
- this._env = env;
16742
- };
16743
 
16744
  // core methods
16745
  core.prototype = {
@@ -20902,8 +11770,9140 @@ $.tooltipster._plugin({
20902
  }
20903
  });
20904
 
20905
- /* a build task will add "return $;" here */
20906
- return $;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
20907
 
20908
  }));
20909
 
@@ -21525,6 +21525,12 @@ var FancyText = function($scope, $) {
21525
  $('.eael-fancy-text-strings', $scope).css('display', 'inline-block');
21526
  }, 500);
21527
  });
 
 
 
 
 
 
21528
  };
21529
  jQuery(window).on("elementor/frontend/init", function() {
21530
  elementorFrontend.hooks.addAction(
@@ -21771,6 +21777,28 @@ jQuery(window).on("elementor/frontend/init", function() {
21771
  );
21772
  });
21773
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
21774
  var PricingTooltip = function($scope, $) {
21775
  if ($.fn.tooltipster) {
21776
  var $tooltip = $scope.find(".tooltip"),
@@ -21818,28 +21846,6 @@ jQuery(window).on("elementor/frontend/init", function() {
21818
  );
21819
  });
21820
 
21821
- var PostGrid = function($scope, $) {
21822
- var $gallery = $(".eael-post-appender", $scope).isotope({
21823
- itemSelector: ".eael-grid-post",
21824
- masonry: {
21825
- columnWidth: ".eael-post-grid-column",
21826
- percentPosition: true
21827
- }
21828
- });
21829
-
21830
- // layout gal, while images are loading
21831
- $gallery.imagesLoaded().progress(function() {
21832
- $gallery.isotope("layout");
21833
- });
21834
- };
21835
-
21836
- jQuery(window).on("elementor/frontend/init", function() {
21837
- elementorFrontend.hooks.addAction(
21838
- "frontend/element_ready/eael-post-grid.default",
21839
- PostGrid
21840
- );
21841
- });
21842
-
21843
  var ProgressBar = function($scope, $) {
21844
  $(".eael-progressbar", $scope).eaelProgressBar();
21845
  };
5599
  }));
5600
 
5601
 
5602
+ (function($) {
5603
+ $.fn.eaelProgressBar = function() {
5604
+ var $this = $(this)
5605
+ var $layout = $this.data('layout')
5606
+ var $num = $this.data('count')
5607
+ var $duration = $this.data('duration')
5608
+
5609
+ $this.one('inview', function() {
5610
+ if ($layout == 'line') {
5611
+ $('.eael-progressbar-line-fill', $this).css({
5612
+ 'width': $num + '%',
5613
+ })
5614
+ } else if ($layout == 'half_circle') {
5615
+ $('.eael-progressbar-circle-half', $this).css({
5616
+ 'transform': 'rotate(' + ($num * 1.8) + 'deg)',
5617
+ })
5618
+ }
5619
+
5620
+ $('.eael-progressbar-count', $this).prop({
5621
+ 'counter': 0
5622
+ }).animate({
5623
+ counter: $num
5624
+ }, {
5625
+ duration: $duration,
5626
+ easing: 'linear',
5627
+ step: function(counter) {
5628
+ if ($layout == 'circle') {
5629
+ var rotate = (counter * 3.6)
5630
+ $('.eael-progressbar-circle-half-left', $this).css({
5631
+ 'transform': "rotate(" + rotate + "deg)",
5632
+ })
5633
+ if (rotate > 180) {
5634
+ $('.eael-progressbar-circle-pie', $this).css({
5635
+ 'clip-path': 'inset(0)'
5636
+ })
5637
+ $('.eael-progressbar-circle-half-right', $this).css({
5638
+ 'visibility': 'visible'
5639
+ })
5640
+ }
5641
+ }
5642
+
5643
+ $(this).text(Math.ceil(counter))
5644
+ }
5645
+ })
5646
+ })
5647
+ }
5648
+ }(jQuery));
5649
  /*! Magnific Popup - v1.1.0 - 2016-02-20
5650
  * http://dimsemenov.com/plugins/magnific-popup/
5651
  * Copyright (c) 2016 Dmitry Semenov; */
7507
  /*>>retina*/
7508
  _checkInstance();
7509
  }));
7510
+ (function (root, factory) {
7511
+ if (typeof define === 'function' && define.amd) {
7512
+ // AMD. Register as an anonymous module unless amdModuleId is set
7513
+ define(["jquery"], function (a0) {
7514
+ return (factory(a0));
7515
+ });
7516
+ } else if (typeof exports === 'object') {
7517
+ // Node. Does not work with strict CommonJS, but
7518
+ // only CommonJS-like environments that support module.exports,
7519
+ // like Node.
7520
+ module.exports = factory(require("jquery"));
7521
+ } else {
7522
+ factory(jQuery);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7523
  }
7524
+ }(this, function ($) {
7525
 
7526
+ // This file will be UMDified by a build task.
 
 
7527
 
7528
+ var defaults = {
7529
+ animation: 'fade',
7530
+ animationDuration: 350,
7531
+ content: null,
7532
+ contentAsHTML: false,
7533
+ contentCloning: false,
7534
+ debug: true,
7535
+ delay: 300,
7536
+ delayTouch: [300, 500],
7537
+ functionInit: null,
7538
+ functionBefore: null,
7539
+ functionReady: null,
7540
+ functionAfter: null,
7541
+ functionFormat: null,
7542
+ IEmin: 6,
7543
+ interactive: false,
7544
+ multiple: false,
7545
+ // will default to document.body, or must be an element positioned at (0, 0)
7546
+ // in the document, typically like the very top views of an app.
7547
+ parent: null,
7548
+ plugins: ['sideTip'],
7549
+ repositionOnScroll: false,
7550
+ restoration: 'none',
7551
+ selfDestruction: true,
7552
+ theme: [],
7553
+ timer: 0,
7554
+ trackerInterval: 500,
7555
+ trackOrigin: false,
7556
+ trackTooltip: false,
7557
+ trigger: 'hover',
7558
+ triggerClose: {
7559
+ click: false,
7560
+ mouseleave: false,
7561
+ originClick: false,
7562
+ scroll: false,
7563
+ tap: false,
7564
+ touchleave: false
7565
+ },
7566
+ triggerOpen: {
7567
+ click: false,
7568
+ mouseenter: false,
7569
+ tap: false,
7570
+ touchstart: false
7571
+ },
7572
+ updateAnimation: 'rotate',
7573
+ zIndex: 9999999
7574
+ },
7575
+ // we'll avoid using the 'window' global as a good practice but npm's
7576
+ // jquery@<2.1.0 package actually requires a 'window' global, so not sure
7577
+ // it's useful at all
7578
+ win = (typeof window != 'undefined') ? window : null,
7579
+ // env will be proxied by the core for plugins to have access its properties
7580
+ env = {
7581
+ // detect if this device can trigger touch events. Better have a false
7582
+ // positive (unused listeners, that's ok) than a false negative.
7583
+ // https://github.com/Modernizr/Modernizr/blob/master/feature-detects/touchevents.js
7584
+ // http://stackoverflow.com/questions/4817029/whats-the-best-way-to-detect-a-touch-screen-device-using-javascript
7585
+ hasTouchCapability: !!(
7586
+ win
7587
+ && ( 'ontouchstart' in win
7588
+ || (win.DocumentTouch && win.document instanceof win.DocumentTouch)
7589
+ || win.navigator.maxTouchPoints
7590
+ )
7591
+ ),
7592
+ hasTransitions: transitionSupport(),
7593
+ IE: false,
7594
+ // don't set manually, it will be updated by a build task after the manifest
7595
+ semVer: '4.2.6',
7596
+ window: win
7597
+ },
7598
+ core = function() {
7599
+
7600
+ // core variables
7601
+
7602
+ // the core emitters
7603
+ this.__$emitterPrivate = $({});
7604
+ this.__$emitterPublic = $({});
7605
+ this.__instancesLatestArr = [];
7606
+ // collects plugin constructors
7607
+ this.__plugins = {};
7608
+ // proxy env variables for plugins who might use them
7609
+ this._env = env;
7610
+ };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7611
 
7612
  // core methods
7613
  core.prototype = {
11770
  }
11771
  });
11772
 
11773
+ /* a build task will add "return $;" here */
11774
+ return $;
11775
+
11776
+ }));
11777
+
11778
+ typeof navigator === "object" && (function (global, factory) {
11779
+ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
11780
+ typeof define === 'function' && define.amd ? define('Plyr', factory) :
11781
+ (global = global || self, global.Plyr = factory());
11782
+ }(this, function () { 'use strict';
11783
+
11784
+ function _classCallCheck(instance, Constructor) {
11785
+ if (!(instance instanceof Constructor)) {
11786
+ throw new TypeError("Cannot call a class as a function");
11787
+ }
11788
+ }
11789
+
11790
+ function _defineProperties(target, props) {
11791
+ for (var i = 0; i < props.length; i++) {
11792
+ var descriptor = props[i];
11793
+ descriptor.enumerable = descriptor.enumerable || false;
11794
+ descriptor.configurable = true;
11795
+ if ("value" in descriptor) descriptor.writable = true;
11796
+ Object.defineProperty(target, descriptor.key, descriptor);
11797
+ }
11798
+ }
11799
+
11800
+ function _createClass(Constructor, protoProps, staticProps) {
11801
+ if (protoProps) _defineProperties(Constructor.prototype, protoProps);
11802
+ if (staticProps) _defineProperties(Constructor, staticProps);
11803
+ return Constructor;
11804
+ }
11805
+
11806
+ function _defineProperty(obj, key, value) {
11807
+ if (key in obj) {
11808
+ Object.defineProperty(obj, key, {
11809
+ value: value,
11810
+ enumerable: true,
11811
+ configurable: true,
11812
+ writable: true
11813
+ });
11814
+ } else {
11815
+ obj[key] = value;
11816
+ }
11817
+
11818
+ return obj;
11819
+ }
11820
+
11821
+ function _slicedToArray(arr, i) {
11822
+ return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest();
11823
+ }
11824
+
11825
+ function _toConsumableArray(arr) {
11826
+ return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread();
11827
+ }
11828
+
11829
+ function _arrayWithoutHoles(arr) {
11830
+ if (Array.isArray(arr)) {
11831
+ for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];
11832
+
11833
+ return arr2;
11834
+ }
11835
+ }
11836
+
11837
+ function _arrayWithHoles(arr) {
11838
+ if (Array.isArray(arr)) return arr;
11839
+ }
11840
+
11841
+ function _iterableToArray(iter) {
11842
+ if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter);
11843
+ }
11844
+
11845
+ function _iterableToArrayLimit(arr, i) {
11846
+ var _arr = [];
11847
+ var _n = true;
11848
+ var _d = false;
11849
+ var _e = undefined;
11850
+
11851
+ try {
11852
+ for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {
11853
+ _arr.push(_s.value);
11854
+
11855
+ if (i && _arr.length === i) break;
11856
+ }
11857
+ } catch (err) {
11858
+ _d = true;
11859
+ _e = err;
11860
+ } finally {
11861
+ try {
11862
+ if (!_n && _i["return"] != null) _i["return"]();
11863
+ } finally {
11864
+ if (_d) throw _e;
11865
+ }
11866
+ }
11867
+
11868
+ return _arr;
11869
+ }
11870
+
11871
+ function _nonIterableSpread() {
11872
+ throw new TypeError("Invalid attempt to spread non-iterable instance");
11873
+ }
11874
+
11875
+ function _nonIterableRest() {
11876
+ throw new TypeError("Invalid attempt to destructure non-iterable instance");
11877
+ }
11878
+
11879
+ var defaults = {
11880
+ addCSS: true,
11881
+ // Add CSS to the element to improve usability (required here or in your CSS!)
11882
+ thumbWidth: 15,
11883
+ // The width of the thumb handle
11884
+ watch: true // Watch for new elements that match a string target
11885
+
11886
+ };
11887
+
11888
+ // Element matches a selector
11889
+ function matches(element, selector) {
11890
+
11891
+ function match() {
11892
+ return Array.from(document.querySelectorAll(selector)).includes(this);
11893
+ }
11894
+
11895
+ var matches = match;
11896
+ return matches.call(element, selector);
11897
+ }
11898
+
11899
+ // Trigger event
11900
+ function trigger(element, type) {
11901
+ if (!element || !type) {
11902
+ return;
11903
+ } // Create and dispatch the event
11904
+
11905
+
11906
+ var event = new Event(type); // Dispatch the event
11907
+
11908
+ element.dispatchEvent(event);
11909
+ }
11910
+
11911
+ // ==========================================================================
11912
+ // Type checking utils
11913
+ // ==========================================================================
11914
+ var getConstructor = function getConstructor(input) {
11915
+ return input !== null && typeof input !== 'undefined' ? input.constructor : null;
11916
+ };
11917
+
11918
+ var instanceOf = function instanceOf(input, constructor) {
11919
+ return Boolean(input && constructor && input instanceof constructor);
11920
+ };
11921
+
11922
+ var isNullOrUndefined = function isNullOrUndefined(input) {
11923
+ return input === null || typeof input === 'undefined';
11924
+ };
11925
+
11926
+ var isObject = function isObject(input) {
11927
+ return getConstructor(input) === Object;
11928
+ };
11929
+
11930
+ var isNumber = function isNumber(input) {
11931
+ return getConstructor(input) === Number && !Number.isNaN(input);
11932
+ };
11933
+
11934
+ var isString = function isString(input) {
11935
+ return getConstructor(input) === String;
11936
+ };
11937
+
11938
+ var isBoolean = function isBoolean(input) {
11939
+ return getConstructor(input) === Boolean;
11940
+ };
11941
+
11942
+ var isFunction = function isFunction(input) {
11943
+ return getConstructor(input) === Function;
11944
+ };
11945
+
11946
+ var isArray = function isArray(input) {
11947
+ return Array.isArray(input);
11948
+ };
11949
+
11950
+ var isNodeList = function isNodeList(input) {
11951
+ return instanceOf(input, NodeList);
11952
+ };
11953
+
11954
+ var isElement = function isElement(input) {
11955
+ return instanceOf(input, Element);
11956
+ };
11957
+
11958
+ var isEvent = function isEvent(input) {
11959
+ return instanceOf(input, Event);
11960
+ };
11961
+
11962
+ var isEmpty = function isEmpty(input) {
11963
+ return isNullOrUndefined(input) || (isString(input) || isArray(input) || isNodeList(input)) && !input.length || isObject(input) && !Object.keys(input).length;
11964
+ };
11965
+
11966
+ var is = {
11967
+ nullOrUndefined: isNullOrUndefined,
11968
+ object: isObject,
11969
+ number: isNumber,
11970
+ string: isString,
11971
+ boolean: isBoolean,
11972
+ function: isFunction,
11973
+ array: isArray,
11974
+ nodeList: isNodeList,
11975
+ element: isElement,
11976
+ event: isEvent,
11977
+ empty: isEmpty
11978
+ };
11979
+
11980
+ // Get the number of decimal places
11981
+ function getDecimalPlaces(value) {
11982
+ var match = "".concat(value).match(/(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/);
11983
+
11984
+ if (!match) {
11985
+ return 0;
11986
+ }
11987
+
11988
+ return Math.max(0, // Number of digits right of decimal point.
11989
+ (match[1] ? match[1].length : 0) - ( // Adjust for scientific notation.
11990
+ match[2] ? +match[2] : 0));
11991
+ } // Round to the nearest step
11992
+
11993
+ function round(number, step) {
11994
+ if (step < 1) {
11995
+ var places = getDecimalPlaces(step);
11996
+ return parseFloat(number.toFixed(places));
11997
+ }
11998
+
11999
+ return Math.round(number / step) * step;
12000
+ }
12001
+
12002
+ var RangeTouch =
12003
+ /*#__PURE__*/
12004
+ function () {
12005
+ /**
12006
+ * Setup a new instance
12007
+ * @param {String|Element} target
12008
+ * @param {Object} options
12009
+ */
12010
+ function RangeTouch(target, options) {
12011
+ _classCallCheck(this, RangeTouch);
12012
+
12013
+ if (is.element(target)) {
12014
+ // An Element is passed, use it directly
12015
+ this.element = target;
12016
+ } else if (is.string(target)) {
12017
+ // A CSS Selector is passed, fetch it from the DOM
12018
+ this.element = document.querySelector(target);
12019
+ }
12020
+
12021
+ if (!is.element(this.element) || !is.empty(this.element.rangeTouch)) {
12022
+ return;
12023
+ }
12024
+
12025
+ this.config = Object.assign({}, defaults, options);
12026
+ this.init();
12027
+ }
12028
+
12029
+ _createClass(RangeTouch, [{
12030
+ key: "init",
12031
+ value: function init() {
12032
+ // Bail if not a touch enabled device
12033
+ if (!RangeTouch.enabled) {
12034
+ return;
12035
+ } // Add useful CSS
12036
+
12037
+
12038
+ if (this.config.addCSS) {
12039
+ // TODO: Restore original values on destroy
12040
+ this.element.style.userSelect = 'none';
12041
+ this.element.style.webKitUserSelect = 'none';
12042
+ this.element.style.touchAction = 'manipulation';
12043
+ }
12044
+
12045
+ this.listeners(true);
12046
+ this.element.rangeTouch = this;
12047
+ }
12048
+ }, {
12049
+ key: "destroy",
12050
+ value: function destroy() {
12051
+ // Bail if not a touch enabled device
12052
+ if (!RangeTouch.enabled) {
12053
+ return;
12054
+ }
12055
+
12056
+ this.listeners(false);
12057
+ this.element.rangeTouch = null;
12058
+ }
12059
+ }, {
12060
+ key: "listeners",
12061
+ value: function listeners(toggle) {
12062
+ var _this = this;
12063
+
12064
+ var method = toggle ? 'addEventListener' : 'removeEventListener'; // Listen for events
12065
+
12066
+ ['touchstart', 'touchmove', 'touchend'].forEach(function (type) {
12067
+ _this.element[method](type, function (event) {
12068
+ return _this.set(event);
12069
+ }, false);
12070
+ });
12071
+ }
12072
+ /**
12073
+ * Get the value based on touch position
12074
+ * @param {Event} event
12075
+ */
12076
+
12077
+ }, {
12078
+ key: "get",
12079
+ value: function get(event) {
12080
+ if (!RangeTouch.enabled || !is.event(event)) {
12081
+ return null;
12082
+ }
12083
+
12084
+ var input = event.target;
12085
+ var touch = event.changedTouches[0];
12086
+ var min = parseFloat(input.getAttribute('min')) || 0;
12087
+ var max = parseFloat(input.getAttribute('max')) || 100;
12088
+ var step = parseFloat(input.getAttribute('step')) || 1;
12089
+ var delta = max - min; // Calculate percentage
12090
+
12091
+ var percent;
12092
+ var clientRect = input.getBoundingClientRect();
12093
+ var thumbWidth = 100 / clientRect.width * (this.config.thumbWidth / 2) / 100; // Determine left percentage
12094
+
12095
+ percent = 100 / clientRect.width * (touch.clientX - clientRect.left); // Don't allow outside bounds
12096
+
12097
+ if (percent < 0) {
12098
+ percent = 0;
12099
+ } else if (percent > 100) {
12100
+ percent = 100;
12101
+ } // Factor in the thumb offset
12102
+
12103
+
12104
+ if (percent < 50) {
12105
+ percent -= (100 - percent * 2) * thumbWidth;
12106
+ } else if (percent > 50) {
12107
+ percent += (percent - 50) * 2 * thumbWidth;
12108
+ } // Find the closest step to the mouse position
12109
+
12110
+
12111
+ return min + round(delta * (percent / 100), step);
12112
+ }
12113
+ /**
12114
+ * Update range value based on position
12115
+ * @param {Event} event
12116
+ */
12117
+
12118
+ }, {
12119
+ key: "set",
12120
+ value: function set(event) {
12121
+ if (!RangeTouch.enabled || !is.event(event) || event.target.disabled) {
12122
+ return;
12123
+ } // Prevent text highlight on iOS
12124
+
12125
+
12126
+ event.preventDefault(); // Set value
12127
+
12128
+ event.target.value = this.get(event); // Trigger event
12129
+
12130
+ trigger(event.target, event.type === 'touchend' ? 'change' : 'input');
12131
+ }
12132
+ }], [{
12133
+ key: "setup",
12134
+
12135
+ /**
12136
+ * Setup multiple instances
12137
+ * @param {String|Element|NodeList|Array} target
12138
+ * @param {Object} options
12139
+ */
12140
+ value: function setup(target) {
12141
+ var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
12142
+ var targets = null;
12143
+
12144
+ if (is.empty(target) || is.string(target)) {
12145
+ targets = Array.from(document.querySelectorAll(is.string(target) ? target : 'input[type="range"]'));
12146
+ } else if (is.element(target)) {
12147
+ targets = [target];
12148
+ } else if (is.nodeList(target)) {
12149
+ targets = Array.from(target);
12150
+ } else if (is.array(target)) {
12151
+ targets = target.filter(is.element);
12152
+ }
12153
+
12154
+ if (is.empty(targets)) {
12155
+ return null;
12156
+ }
12157
+
12158
+ var config = Object.assign({}, defaults, options);
12159
+
12160
+ if (is.string(target) && config.watch) {
12161
+ // Create an observer instance
12162
+ var observer = new MutationObserver(function (mutations) {
12163
+ Array.from(mutations).forEach(function (mutation) {
12164
+ Array.from(mutation.addedNodes).forEach(function (node) {
12165
+ if (!is.element(node) || !matches(node, target)) {
12166
+ return;
12167
+ } // eslint-disable-next-line no-unused-vars
12168
+
12169
+
12170
+ var range = new RangeTouch(node, config);
12171
+ });
12172
+ });
12173
+ }); // Pass in the target node, as well as the observer options
12174
+
12175
+ observer.observe(document.body, {
12176
+ childList: true,
12177
+ subtree: true
12178
+ });
12179
+ }
12180
+
12181
+ return targets.map(function (t) {
12182
+ return new RangeTouch(t, options);
12183
+ });
12184
+ }
12185
+ }, {
12186
+ key: "enabled",
12187
+ get: function get() {
12188
+ return 'ontouchstart' in document.documentElement;
12189
+ }
12190
+ }]);
12191
+
12192
+ return RangeTouch;
12193
+ }();
12194
+
12195
+ // ==========================================================================
12196
+ // Type checking utils
12197
+ // ==========================================================================
12198
+ var getConstructor$1 = function getConstructor(input) {
12199
+ return input !== null && typeof input !== 'undefined' ? input.constructor : null;
12200
+ };
12201
+
12202
+ var instanceOf$1 = function instanceOf(input, constructor) {
12203
+ return Boolean(input && constructor && input instanceof constructor);
12204
+ };
12205
+
12206
+ var isNullOrUndefined$1 = function isNullOrUndefined(input) {
12207
+ return input === null || typeof input === 'undefined';
12208
+ };
12209
+
12210
+ var isObject$1 = function isObject(input) {
12211
+ return getConstructor$1(input) === Object;
12212
+ };
12213
+
12214
+ var isNumber$1 = function isNumber(input) {
12215
+ return getConstructor$1(input) === Number && !Number.isNaN(input);
12216
+ };
12217
+
12218
+ var isString$1 = function isString(input) {
12219
+ return getConstructor$1(input) === String;
12220
+ };
12221
+
12222
+ var isBoolean$1 = function isBoolean(input) {
12223
+ return getConstructor$1(input) === Boolean;
12224
+ };
12225
+
12226
+ var isFunction$1 = function isFunction(input) {
12227
+ return getConstructor$1(input) === Function;
12228
+ };
12229
+
12230
+ var isArray$1 = function isArray(input) {
12231
+ return Array.isArray(input);
12232
+ };
12233
+
12234
+ var isWeakMap = function isWeakMap(input) {
12235
+ return instanceOf$1(input, WeakMap);
12236
+ };
12237
+
12238
+ var isNodeList$1 = function isNodeList(input) {
12239
+ return instanceOf$1(input, NodeList);
12240
+ };
12241
+
12242
+ var isElement$1 = function isElement(input) {
12243
+ return instanceOf$1(input, Element);
12244
+ };
12245
+
12246
+ var isTextNode = function isTextNode(input) {
12247
+ return getConstructor$1(input) === Text;
12248
+ };
12249
+
12250
+ var isEvent$1 = function isEvent(input) {
12251
+ return instanceOf$1(input, Event);
12252
+ };
12253
+
12254
+ var isKeyboardEvent = function isKeyboardEvent(input) {
12255
+ return instanceOf$1(input, KeyboardEvent);
12256
+ };
12257
+
12258
+ var isCue = function isCue(input) {
12259
+ return instanceOf$1(input, window.TextTrackCue) || instanceOf$1(input, window.VTTCue);
12260
+ };
12261
+
12262
+ var isTrack = function isTrack(input) {
12263
+ return instanceOf$1(input, TextTrack) || !isNullOrUndefined$1(input) && isString$1(input.kind);
12264
+ };
12265
+
12266
+ var isPromise = function isPromise(input) {
12267
+ return instanceOf$1(input, Promise);
12268
+ };
12269
+
12270
+ var isEmpty$1 = function isEmpty(input) {
12271
+ return isNullOrUndefined$1(input) || (isString$1(input) || isArray$1(input) || isNodeList$1(input)) && !input.length || isObject$1(input) && !Object.keys(input).length;
12272
+ };
12273
+
12274
+ var isUrl = function isUrl(input) {
12275
+ // Accept a URL object
12276
+ if (instanceOf$1(input, window.URL)) {
12277
+ return true;
12278
+ } // Must be string from here
12279
+
12280
+
12281
+ if (!isString$1(input)) {
12282
+ return false;
12283
+ } // Add the protocol if required
12284
+
12285
+
12286
+ var string = input;
12287
+
12288
+ if (!input.startsWith('http://') || !input.startsWith('https://')) {
12289
+ string = "http://".concat(input);
12290
+ }
12291
+
12292
+ try {
12293
+ return !isEmpty$1(new URL(string).hostname);
12294
+ } catch (e) {
12295
+ return false;
12296
+ }
12297
+ };
12298
+
12299
+ var is$1 = {
12300
+ nullOrUndefined: isNullOrUndefined$1,
12301
+ object: isObject$1,
12302
+ number: isNumber$1,
12303
+ string: isString$1,
12304
+ boolean: isBoolean$1,
12305
+ function: isFunction$1,
12306
+ array: isArray$1,
12307
+ weakMap: isWeakMap,
12308
+ nodeList: isNodeList$1,
12309
+ element: isElement$1,
12310
+ textNode: isTextNode,
12311
+ event: isEvent$1,
12312
+ keyboardEvent: isKeyboardEvent,
12313
+ cue: isCue,
12314
+ track: isTrack,
12315
+ promise: isPromise,
12316
+ url: isUrl,
12317
+ empty: isEmpty$1
12318
+ };
12319
+
12320
+ // ==========================================================================
12321
+ var transitionEndEvent = function () {
12322
+ var element = document.createElement('span');
12323
+ var events = {
12324
+ WebkitTransition: 'webkitTransitionEnd',
12325
+ MozTransition: 'transitionend',
12326
+ OTransition: 'oTransitionEnd otransitionend',
12327
+ transition: 'transitionend'
12328
+ };
12329
+ var type = Object.keys(events).find(function (event) {
12330
+ return element.style[event] !== undefined;
12331
+ });
12332
+ return is$1.string(type) ? events[type] : false;
12333
+ }(); // Force repaint of element
12334
+
12335
+ function repaint(element, delay) {
12336
+ setTimeout(function () {
12337
+ try {
12338
+ // eslint-disable-next-line no-param-reassign
12339
+ element.hidden = true; // eslint-disable-next-line no-unused-expressions
12340
+
12341
+ element.offsetHeight; // eslint-disable-next-line no-param-reassign
12342
+
12343
+ element.hidden = false;
12344
+ } catch (e) {// Do nothing
12345
+ }
12346
+ }, delay);
12347
+ }
12348
+
12349
+ // ==========================================================================
12350
+ // Browser sniffing
12351
+ // Unfortunately, due to mixed support, UA sniffing is required
12352
+ // ==========================================================================
12353
+ var browser = {
12354
+ isIE:
12355
+ /* @cc_on!@ */
12356
+ !!document.documentMode,
12357
+ isEdge: window.navigator.userAgent.includes('Edge'),
12358
+ isWebkit: 'WebkitAppearance' in document.documentElement.style && !/Edge/.test(navigator.userAgent),
12359
+ isIPhone: /(iPhone|iPod)/gi.test(navigator.platform),
12360
+ isIos: /(iPad|iPhone|iPod)/gi.test(navigator.platform)
12361
+ };
12362
+
12363
+ // ==========================================================================
12364
+ // https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md
12365
+ // https://www.youtube.com/watch?v=NPM6172J22g
12366
+
12367
+ var supportsPassiveListeners = function () {
12368
+ // Test via a getter in the options object to see if the passive property is accessed
12369
+ var supported = false;
12370
+
12371
+ try {
12372
+ var options = Object.defineProperty({}, 'passive', {
12373
+ get: function get() {
12374
+ supported = true;
12375
+ return null;
12376
+ }
12377
+ });
12378
+ window.addEventListener('test', null, options);
12379
+ window.removeEventListener('test', null, options);
12380
+ } catch (e) {// Do nothing
12381
+ }
12382
+
12383
+ return supported;
12384
+ }(); // Toggle event listener
12385
+
12386
+
12387
+ function toggleListener(element, event, callback) {
12388
+ var _this = this;
12389
+
12390
+ var toggle = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
12391
+ var passive = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;
12392
+ var capture = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : false;
12393
+
12394
+ // Bail if no element, event, or callback
12395
+ if (!element || !('addEventListener' in element) || is$1.empty(event) || !is$1.function(callback)) {
12396
+ return;
12397
+ } // Allow multiple events
12398
+
12399
+
12400
+ var events = event.split(' '); // Build options
12401
+ // Default to just the capture boolean for browsers with no passive listener support
12402
+
12403
+ var options = capture; // If passive events listeners are supported
12404
+
12405
+ if (supportsPassiveListeners) {
12406
+ options = {
12407
+ // Whether the listener can be passive (i.e. default never prevented)
12408
+ passive: passive,
12409
+ // Whether the listener is a capturing listener or not
12410
+ capture: capture
12411
+ };
12412
+ } // If a single node is passed, bind the event listener
12413
+
12414
+
12415
+ events.forEach(function (type) {
12416
+ if (_this && _this.eventListeners && toggle) {
12417
+ // Cache event listener
12418
+ _this.eventListeners.push({
12419
+ element: element,
12420
+ type: type,
12421
+ callback: callback,
12422
+ options: options
12423
+ });
12424
+ }
12425
+
12426
+ element[toggle ? 'addEventListener' : 'removeEventListener'](type, callback, options);
12427
+ });
12428
+ } // Bind event handler
12429
+
12430
+ function on(element) {
12431
+ var events = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
12432
+ var callback = arguments.length > 2 ? arguments[2] : undefined;
12433
+ var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;
12434
+ var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
12435
+ toggleListener.call(this, element, events, callback, true, passive, capture);
12436
+ } // Unbind event handler
12437
+
12438
+ function off(element) {
12439
+ var events = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
12440
+ var callback = arguments.length > 2 ? arguments[2] : undefined;
12441
+ var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;
12442
+ var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
12443
+ toggleListener.call(this, element, events, callback, false, passive, capture);
12444
+ } // Bind once-only event handler
12445
+
12446
+ function once(element) {
12447
+ var _this2 = this;
12448
+
12449
+ var events = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
12450
+ var callback = arguments.length > 2 ? arguments[2] : undefined;
12451
+ var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;
12452
+ var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
12453
+
12454
+ var onceCallback = function onceCallback() {
12455
+ off(element, events, onceCallback, passive, capture);
12456
+
12457
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
12458
+ args[_key] = arguments[_key];
12459
+ }
12460
+
12461
+ callback.apply(_this2, args);
12462
+ };
12463
+
12464
+ toggleListener.call(this, element, events, onceCallback, true, passive, capture);
12465
+ } // Trigger event
12466
+
12467
+ function triggerEvent(element) {
12468
+ var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
12469
+ var bubbles = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
12470
+ var detail = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
12471
+
12472
+ // Bail if no element
12473
+ if (!is$1.element(element) || is$1.empty(type)) {
12474
+ return;
12475
+ } // Create and dispatch the event
12476
+
12477
+
12478
+ var event = new CustomEvent(type, {
12479
+ bubbles: bubbles,
12480
+ detail: Object.assign({}, detail, {
12481
+ plyr: this
12482
+ })
12483
+ }); // Dispatch the event
12484
+
12485
+ element.dispatchEvent(event);
12486
+ } // Unbind all cached event listeners
12487
+
12488
+ function unbindListeners() {
12489
+ if (this && this.eventListeners) {
12490
+ this.eventListeners.forEach(function (item) {
12491
+ var element = item.element,
12492
+ type = item.type,
12493
+ callback = item.callback,
12494
+ options = item.options;
12495
+ element.removeEventListener(type, callback, options);
12496
+ });
12497
+ this.eventListeners = [];
12498
+ }
12499
+ } // Run method when / if player is ready
12500
+
12501
+ function ready() {
12502
+ var _this3 = this;
12503
+
12504
+ return new Promise(function (resolve) {
12505
+ return _this3.ready ? setTimeout(resolve, 0) : on.call(_this3, _this3.elements.container, 'ready', resolve);
12506
+ }).then(function () {});
12507
+ }
12508
+
12509
+ function cloneDeep(object) {
12510
+ return JSON.parse(JSON.stringify(object));
12511
+ } // Get a nested value in an object
12512
+
12513
+ function getDeep(object, path) {
12514
+ return path.split('.').reduce(function (obj, key) {
12515
+ return obj && obj[key];
12516
+ }, object);
12517
+ } // Deep extend destination object with N more objects
12518
+
12519
+ function extend() {
12520
+ var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
12521
+
12522
+ for (var _len = arguments.length, sources = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
12523
+ sources[_key - 1] = arguments[_key];
12524
+ }
12525
+
12526
+ if (!sources.length) {
12527
+ return target;
12528
+ }
12529
+
12530
+ var source = sources.shift();
12531
+
12532
+ if (!is$1.object(source)) {
12533
+ return target;
12534
+ }
12535
+
12536
+ Object.keys(source).forEach(function (key) {
12537
+ if (is$1.object(source[key])) {
12538
+ if (!Object.keys(target).includes(key)) {
12539
+ Object.assign(target, _defineProperty({}, key, {}));
12540
+ }
12541
+
12542
+ extend(target[key], source[key]);
12543
+ } else {
12544
+ Object.assign(target, _defineProperty({}, key, source[key]));
12545
+ }
12546
+ });
12547
+ return extend.apply(void 0, [target].concat(sources));
12548
+ }
12549
+
12550
+ function wrap(elements, wrapper) {
12551
+ // Convert `elements` to an array, if necessary.
12552
+ var targets = elements.length ? elements : [elements]; // Loops backwards to prevent having to clone the wrapper on the
12553
+ // first element (see `child` below).
12554
+
12555
+ Array.from(targets).reverse().forEach(function (element, index) {
12556
+ var child = index > 0 ? wrapper.cloneNode(true) : wrapper; // Cache the current parent and sibling.
12557
+
12558
+ var parent = element.parentNode;
12559
+ var sibling = element.nextSibling; // Wrap the element (is automatically removed from its current
12560
+ // parent).
12561
+
12562
+ child.appendChild(element); // If the element had a sibling, insert the wrapper before
12563
+ // the sibling to maintain the HTML structure; otherwise, just
12564
+ // append it to the parent.
12565
+
12566
+ if (sibling) {
12567
+ parent.insertBefore(child, sibling);
12568
+ } else {
12569
+ parent.appendChild(child);
12570
+ }
12571
+ });
12572
+ } // Set attributes
12573
+
12574
+ function setAttributes(element, attributes) {
12575
+ if (!is$1.element(element) || is$1.empty(attributes)) {
12576
+ return;
12577
+ } // Assume null and undefined attributes should be left out,
12578
+ // Setting them would otherwise convert them to "null" and "undefined"
12579
+
12580
+
12581
+ Object.entries(attributes).filter(function (_ref) {
12582
+ var _ref2 = _slicedToArray(_ref, 2),
12583
+ value = _ref2[1];
12584
+
12585
+ return !is$1.nullOrUndefined(value);
12586
+ }).forEach(function (_ref3) {
12587
+ var _ref4 = _slicedToArray(_ref3, 2),
12588
+ key = _ref4[0],
12589
+ value = _ref4[1];
12590
+
12591
+ return element.setAttribute(key, value);
12592
+ });
12593
+ } // Create a DocumentFragment
12594
+
12595
+ function createElement(type, attributes, text) {
12596
+ // Create a new <element>
12597
+ var element = document.createElement(type); // Set all passed attributes
12598
+
12599
+ if (is$1.object(attributes)) {
12600
+ setAttributes(element, attributes);
12601
+ } // Add text node
12602
+
12603
+
12604
+ if (is$1.string(text)) {
12605
+ element.innerText = text;
12606
+ } // Return built element
12607
+
12608
+
12609
+ return element;
12610
+ } // Inaert an element after another
12611
+
12612
+ function insertAfter(element, target) {
12613
+ if (!is$1.element(element) || !is$1.element(target)) {
12614
+ return;
12615
+ }
12616
+
12617
+ target.parentNode.insertBefore(element, target.nextSibling);
12618
+ } // Insert a DocumentFragment
12619
+
12620
+ function insertElement(type, parent, attributes, text) {
12621
+ if (!is$1.element(parent)) {
12622
+ return;
12623
+ }
12624
+
12625
+ parent.appendChild(createElement(type, attributes, text));
12626
+ } // Remove element(s)
12627
+
12628
+ function removeElement(element) {
12629
+ if (is$1.nodeList(element) || is$1.array(element)) {
12630
+ Array.from(element).forEach(removeElement);
12631
+ return;
12632
+ }
12633
+
12634
+ if (!is$1.element(element) || !is$1.element(element.parentNode)) {
12635
+ return;
12636
+ }
12637
+
12638
+ element.parentNode.removeChild(element);
12639
+ } // Remove all child elements
12640
+
12641
+ function emptyElement(element) {
12642
+ if (!is$1.element(element)) {
12643
+ return;
12644
+ }
12645
+
12646
+ var length = element.childNodes.length;
12647
+
12648
+ while (length > 0) {
12649
+ element.removeChild(element.lastChild);
12650
+ length -= 1;
12651
+ }
12652
+ } // Replace element
12653
+
12654
+ function replaceElement(newChild, oldChild) {
12655
+ if (!is$1.element(oldChild) || !is$1.element(oldChild.parentNode) || !is$1.element(newChild)) {
12656
+ return null;
12657
+ }
12658
+
12659
+ oldChild.parentNode.replaceChild(newChild, oldChild);
12660
+ return newChild;
12661
+ } // Get an attribute object from a string selector
12662
+
12663
+ function getAttributesFromSelector(sel, existingAttributes) {
12664
+ // For example:
12665
+ // '.test' to { class: 'test' }
12666
+ // '#test' to { id: 'test' }
12667
+ // '[data-test="test"]' to { 'data-test': 'test' }
12668
+ if (!is$1.string(sel) || is$1.empty(sel)) {
12669
+ return {};
12670
+ }
12671
+
12672
+ var attributes = {};
12673
+ var existing = extend({}, existingAttributes);
12674
+ sel.split(',').forEach(function (s) {
12675
+ // Remove whitespace
12676
+ var selector = s.trim();
12677
+ var className = selector.replace('.', '');
12678
+ var stripped = selector.replace(/[[\]]/g, ''); // Get the parts and value
12679
+
12680
+ var parts = stripped.split('=');
12681
+
12682
+ var _parts = _slicedToArray(parts, 1),
12683
+ key = _parts[0];
12684
+
12685
+ var value = parts.length > 1 ? parts[1].replace(/["']/g, '') : ''; // Get the first character
12686
+
12687
+ var start = selector.charAt(0);
12688
+
12689
+ switch (start) {
12690
+ case '.':
12691
+ // Add to existing classname
12692
+ if (is$1.string(existing.class)) {
12693
+ attributes.class = "".concat(existing.class, " ").concat(className);
12694
+ } else {
12695
+ attributes.class = className;
12696
+ }
12697
+
12698
+ break;
12699
+
12700
+ case '#':
12701
+ // ID selector
12702
+ attributes.id = selector.replace('#', '');
12703
+ break;
12704
+
12705
+ case '[':
12706
+ // Attribute selector
12707
+ attributes[key] = value;
12708
+ break;
12709
+
12710
+ default:
12711
+ break;
12712
+ }
12713
+ });
12714
+ return extend(existing, attributes);
12715
+ } // Toggle hidden
12716
+
12717
+ function toggleHidden(element, hidden) {
12718
+ if (!is$1.element(element)) {
12719
+ return;
12720
+ }
12721
+
12722
+ var hide = hidden;
12723
+
12724
+ if (!is$1.boolean(hide)) {
12725
+ hide = !element.hidden;
12726
+ } // eslint-disable-next-line no-param-reassign
12727
+
12728
+
12729
+ element.hidden = hide;
12730
+ } // Mirror Element.classList.toggle, with IE compatibility for "force" argument
12731
+
12732
+ function toggleClass(element, className, force) {
12733
+ if (is$1.nodeList(element)) {
12734
+ return Array.from(element).map(function (e) {
12735
+ return toggleClass(e, className, force);
12736
+ });
12737
+ }
12738
+
12739
+ if (is$1.element(element)) {
12740
+ var method = 'toggle';
12741
+
12742
+ if (typeof force !== 'undefined') {
12743
+ method = force ? 'add' : 'remove';
12744
+ }
12745
+
12746
+ element.classList[method](className);
12747
+ return element.classList.contains(className);
12748
+ }
12749
+
12750
+ return false;
12751
+ } // Has class name
12752
+
12753
+ function hasClass(element, className) {
12754
+ return is$1.element(element) && element.classList.contains(className);
12755
+ } // Element matches selector
12756
+
12757
+ function matches$1(element, selector) {
12758
+
12759
+ function match() {
12760
+ return Array.from(document.querySelectorAll(selector)).includes(this);
12761
+ }
12762
+
12763
+ var method = match;
12764
+ return method.call(element, selector);
12765
+ } // Find all elements
12766
+
12767
+ function getElements(selector) {
12768
+ return this.elements.container.querySelectorAll(selector);
12769
+ } // Find a single element
12770
+
12771
+ function getElement(selector) {
12772
+ return this.elements.container.querySelector(selector);
12773
+ } // Trap focus inside container
12774
+
12775
+ function trapFocus() {
12776
+ var element = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
12777
+ var toggle = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
12778
+
12779
+ if (!is$1.element(element)) {
12780
+ return;
12781
+ }
12782
+
12783
+ var focusable = getElements.call(this, 'button:not(:disabled), input:not(:disabled), [tabindex]');
12784
+ var first = focusable[0];
12785
+ var last = focusable[focusable.length - 1];
12786
+
12787
+ var trap = function trap(event) {
12788
+ // Bail if not tab key or not fullscreen
12789
+ if (event.key !== 'Tab' || event.keyCode !== 9) {
12790
+ return;
12791
+ } // Get the current focused element
12792
+
12793
+
12794
+ var focused = document.activeElement;
12795
+
12796
+ if (focused === last && !event.shiftKey) {
12797
+ // Move focus to first element that can be tabbed if Shift isn't used
12798
+ first.focus();
12799
+ event.preventDefault();
12800
+ } else if (focused === first && event.shiftKey) {
12801
+ // Move focus to last element that can be tabbed if Shift is used
12802
+ last.focus();
12803
+ event.preventDefault();
12804
+ }
12805
+ };
12806
+
12807
+ toggleListener.call(this, this.elements.container, 'keydown', trap, toggle, false);
12808
+ } // Set focus and tab focus class
12809
+
12810
+ function setFocus() {
12811
+ var element = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
12812
+ var tabFocus = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
12813
+
12814
+ if (!is$1.element(element)) {
12815
+ return;
12816
+ } // Set regular focus
12817
+
12818
+
12819
+ element.focus({
12820
+ preventScroll: true
12821
+ }); // If we want to mimic keyboard focus via tab
12822
+
12823
+ if (tabFocus) {
12824
+ toggleClass(element, this.config.classNames.tabFocus);
12825
+ }
12826
+ }
12827
+
12828
+ var defaultCodecs = {
12829
+ 'audio/ogg': 'vorbis',
12830
+ 'audio/wav': '1',
12831
+ 'video/webm': 'vp8, vorbis',
12832
+ 'video/mp4': 'avc1.42E01E, mp4a.40.2',
12833
+ 'video/ogg': 'theora'
12834
+ }; // Check for feature support
12835
+
12836
+ var support = {
12837
+ // Basic support
12838
+ audio: 'canPlayType' in document.createElement('audio'),
12839
+ video: 'canPlayType' in document.createElement('video'),
12840
+ // Check for support
12841
+ // Basic functionality vs full UI
12842
+ check: function check(type, provider, playsinline) {
12843
+ var canPlayInline = browser.isIPhone && playsinline && support.playsinline;
12844
+ var api = support[type] || provider !== 'html5';
12845
+ var ui = api && support.rangeInput && (type !== 'video' || !browser.isIPhone || canPlayInline);
12846
+ return {
12847
+ api: api,
12848
+ ui: ui
12849
+ };
12850
+ },
12851
+ // Picture-in-picture support
12852
+ // Safari & Chrome only currently
12853
+ pip: function () {
12854
+ if (browser.isIPhone) {
12855
+ return false;
12856
+ } // Safari
12857
+ // https://developer.apple.com/documentation/webkitjs/adding_picture_in_picture_to_your_safari_media_controls
12858
+
12859
+
12860
+ if (is$1.function(createElement('video').webkitSetPresentationMode)) {
12861
+ return true;
12862
+ } // Chrome
12863
+ // https://developers.google.com/web/updates/2018/10/watch-video-using-picture-in-picture
12864
+
12865
+
12866
+ if (document.pictureInPictureEnabled && !createElement('video').disablePictureInPicture) {
12867
+ return true;
12868
+ }
12869
+
12870
+ return false;
12871
+ }(),
12872
+ // Airplay support
12873
+ // Safari only currently
12874
+ airplay: is$1.function(window.WebKitPlaybackTargetAvailabilityEvent),
12875
+ // Inline playback support
12876
+ // https://webkit.org/blog/6784/new-video-policies-for-ios/
12877
+ playsinline: 'playsInline' in document.createElement('video'),
12878
+ // Check for mime type support against a player instance
12879
+ // Credits: http://diveintohtml5.info/everything.html
12880
+ // Related: http://www.leanbackplayer.com/test/h5mt.html
12881
+ mime: function mime(input) {
12882
+ if (is$1.empty(input)) {
12883
+ return false;
12884
+ }
12885
+
12886
+ var _input$split = input.split('/'),
12887
+ _input$split2 = _slicedToArray(_input$split, 1),
12888
+ mediaType = _input$split2[0];
12889
+
12890
+ var type = input; // Verify we're using HTML5 and there's no media type mismatch
12891
+
12892
+ if (!this.isHTML5 || mediaType !== this.type) {
12893
+ return false;
12894
+ } // Add codec if required
12895
+
12896
+
12897
+ if (Object.keys(defaultCodecs).includes(type)) {
12898
+ type += "; codecs=\"".concat(defaultCodecs[input], "\"");
12899
+ }
12900
+
12901
+ try {
12902
+ return Boolean(type && this.media.canPlayType(type).replace(/no/, ''));
12903
+ } catch (e) {
12904
+ return false;
12905
+ }
12906
+ },
12907
+ // Check for textTracks support
12908
+ textTracks: 'textTracks' in document.createElement('video'),
12909
+ // <input type="range"> Sliders
12910
+ rangeInput: function () {
12911
+ var range = document.createElement('input');
12912
+ range.type = 'range';
12913
+ return range.type === 'range';
12914
+ }(),
12915
+ // Touch
12916
+ // NOTE: Remember a device can be mouse + touch enabled so we check on first touch event
12917
+ touch: 'ontouchstart' in document.documentElement,
12918
+ // Detect transitions support
12919
+ transitions: transitionEndEvent !== false,
12920
+ // Reduced motion iOS & MacOS setting
12921
+ // https://webkit.org/blog/7551/responsive-design-for-motion/
12922
+ reducedMotion: 'matchMedia' in window && window.matchMedia('(prefers-reduced-motion)').matches
12923
+ };
12924
+
12925
+ function validateRatio(input) {
12926
+ if (!is$1.array(input) && (!is$1.string(input) || !input.includes(':'))) {
12927
+ return false;
12928
+ }
12929
+
12930
+ var ratio = is$1.array(input) ? input : input.split(':');
12931
+ return ratio.map(Number).every(is$1.number);
12932
+ }
12933
+ function reduceAspectRatio(ratio) {
12934
+ if (!is$1.array(ratio) || !ratio.every(is$1.number)) {
12935
+ return null;
12936
+ }
12937
+
12938
+ var _ratio = _slicedToArray(ratio, 2),
12939
+ width = _ratio[0],
12940
+ height = _ratio[1];
12941
+
12942
+ var getDivider = function getDivider(w, h) {
12943
+ return h === 0 ? w : getDivider(h, w % h);
12944
+ };
12945
+
12946
+ var divider = getDivider(width, height);
12947
+ return [width / divider, height / divider];
12948
+ }
12949
+ function getAspectRatio(input) {
12950
+ var parse = function parse(ratio) {
12951
+ return validateRatio(ratio) ? ratio.split(':').map(Number) : null;
12952
+ }; // Try provided ratio
12953
+
12954
+
12955
+ var ratio = parse(input); // Get from config
12956
+
12957
+ if (ratio === null) {
12958
+ ratio = parse(this.config.ratio);
12959
+ } // Get from embed
12960
+
12961
+
12962
+ if (ratio === null && !is$1.empty(this.embed) && is$1.array(this.embed.ratio)) {
12963
+ ratio = this.embed.ratio;
12964
+ } // Get from HTML5 video
12965
+
12966
+
12967
+ if (ratio === null && this.isHTML5) {
12968
+ var _this$media = this.media,
12969
+ videoWidth = _this$media.videoWidth,
12970
+ videoHeight = _this$media.videoHeight;
12971
+ ratio = reduceAspectRatio([videoWidth, videoHeight]);
12972
+ }
12973
+
12974
+ return ratio;
12975
+ } // Set aspect ratio for responsive container
12976
+
12977
+ function setAspectRatio(input) {
12978
+ if (!this.isVideo) {
12979
+ return {};
12980
+ }
12981
+
12982
+ var ratio = getAspectRatio.call(this, input);
12983
+
12984
+ var _ref = is$1.array(ratio) ? ratio : [0, 0],
12985
+ _ref2 = _slicedToArray(_ref, 2),
12986
+ w = _ref2[0],
12987
+ h = _ref2[1];
12988
+
12989
+ var padding = 100 / w * h;
12990
+ this.elements.wrapper.style.paddingBottom = "".concat(padding, "%"); // For Vimeo we have an extra <div> to hide the standard controls and UI
12991
+
12992
+ if (this.isVimeo && this.supported.ui) {
12993
+ var height = 240;
12994
+ var offset = (height - padding) / (height / 50);
12995
+ this.media.style.transform = "translateY(-".concat(offset, "%)");
12996
+ } else if (this.isHTML5) {
12997
+ this.elements.wrapper.classList.toggle(this.config.classNames.videoFixedRatio, ratio !== null);
12998
+ }
12999
+
13000
+ return {
13001
+ padding: padding,
13002
+ ratio: ratio
13003
+ };
13004
+ }
13005
+
13006
+ // ==========================================================================
13007
+ var html5 = {
13008
+ getSources: function getSources() {
13009
+ var _this = this;
13010
+
13011
+ if (!this.isHTML5) {
13012
+ return [];
13013
+ }
13014
+
13015
+ var sources = Array.from(this.media.querySelectorAll('source')); // Filter out unsupported sources (if type is specified)
13016
+
13017
+ return sources.filter(function (source) {
13018
+ var type = source.getAttribute('type');
13019
+
13020
+ if (is$1.empty(type)) {
13021
+ return true;
13022
+ }
13023
+
13024
+ return support.mime.call(_this, type);
13025
+ });
13026
+ },
13027
+ // Get quality levels
13028
+ getQualityOptions: function getQualityOptions() {
13029
+ // Get sizes from <source> elements
13030
+ return html5.getSources.call(this).map(function (source) {
13031
+ return Number(source.getAttribute('size'));
13032
+ }).filter(Boolean);
13033
+ },
13034
+ extend: function extend() {
13035
+ if (!this.isHTML5) {
13036
+ return;
13037
+ }
13038
+
13039
+ var player = this; // Set aspect ratio if fixed
13040
+
13041
+ if (!is$1.empty(this.config.ratio)) {
13042
+ setAspectRatio.call(player);
13043
+ } // Quality
13044
+
13045
+
13046
+ Object.defineProperty(player.media, 'quality', {
13047
+ get: function get() {
13048
+ // Get sources
13049
+ var sources = html5.getSources.call(player);
13050
+ var source = sources.find(function (s) {
13051
+ return s.getAttribute('src') === player.source;
13052
+ }); // Return size, if match is found
13053
+
13054
+ return source && Number(source.getAttribute('size'));
13055
+ },
13056
+ set: function set(input) {
13057
+ // Get sources
13058
+ var sources = html5.getSources.call(player); // Get first match for requested size
13059
+
13060
+ var source = sources.find(function (s) {
13061
+ return Number(s.getAttribute('size')) === input;
13062
+ }); // No matching source found
13063
+
13064
+ if (!source) {
13065
+ return;
13066
+ } // Get current state
13067
+
13068
+
13069
+ var _player$media = player.media,
13070
+ currentTime = _player$media.currentTime,
13071
+ paused = _player$media.paused,
13072
+ preload = _player$media.preload,
13073
+ readyState = _player$media.readyState; // Set new source
13074
+
13075
+ player.media.src = source.getAttribute('src'); // Prevent loading if preload="none" and the current source isn't loaded (#1044)
13076
+
13077
+ if (preload !== 'none' || readyState) {
13078
+ // Restore time
13079
+ player.once('loadedmetadata', function () {
13080
+ player.currentTime = currentTime; // Resume playing
13081
+
13082
+ if (!paused) {
13083
+ player.play();
13084
+ }
13085
+ }); // Load new source
13086
+
13087
+ player.media.load();
13088
+ } // Trigger change event
13089
+
13090
+
13091
+ triggerEvent.call(player, player.media, 'qualitychange', false, {
13092
+ quality: input
13093
+ });
13094
+ }
13095
+ });
13096
+ },
13097
+ // Cancel current network requests
13098
+ // See https://github.com/sampotts/plyr/issues/174
13099
+ cancelRequests: function cancelRequests() {
13100
+ if (!this.isHTML5) {
13101
+ return;
13102
+ } // Remove child sources
13103
+
13104
+
13105
+ removeElement(html5.getSources.call(this)); // Set blank video src attribute
13106
+ // This is to prevent a MEDIA_ERR_SRC_NOT_SUPPORTED error
13107
+ // Info: http://stackoverflow.com/questions/32231579/how-to-properly-dispose-of-an-html5-video-and-close-socket-or-connection
13108
+
13109
+ this.media.setAttribute('src', this.config.blankVideo); // Load the new empty source
13110
+ // This will cancel existing requests
13111
+ // See https://github.com/sampotts/plyr/issues/174
13112
+
13113
+ this.media.load(); // Debugging
13114
+
13115
+ this.debug.log('Cancelled network requests');
13116
+ }
13117
+ };
13118
+
13119
+ // ==========================================================================
13120
+
13121
+ function dedupe(array) {
13122
+ if (!is$1.array(array)) {
13123
+ return array;
13124
+ }
13125
+
13126
+ return array.filter(function (item, index) {
13127
+ return array.indexOf(item) === index;
13128
+ });
13129
+ } // Get the closest value in an array
13130
+
13131
+ function closest(array, value) {
13132
+ if (!is$1.array(array) || !array.length) {
13133
+ return null;
13134
+ }
13135
+
13136
+ return array.reduce(function (prev, curr) {
13137
+ return Math.abs(curr - value) < Math.abs(prev - value) ? curr : prev;
13138
+ });
13139
+ }
13140
+
13141
+ // ==========================================================================
13142
+
13143
+ function generateId(prefix) {
13144
+ return "".concat(prefix, "-").concat(Math.floor(Math.random() * 10000));
13145
+ } // Format string
13146
+
13147
+ function format(input) {
13148
+ for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
13149
+ args[_key - 1] = arguments[_key];
13150
+ }
13151
+
13152
+ if (is$1.empty(input)) {
13153
+ return input;
13154
+ }
13155
+
13156
+ return input.toString().replace(/{(\d+)}/g, function (match, i) {
13157
+ return args[i].toString();
13158
+ });
13159
+ } // Get percentage
13160
+
13161
+ function getPercentage(current, max) {
13162
+ if (current === 0 || max === 0 || Number.isNaN(current) || Number.isNaN(max)) {
13163
+ return 0;
13164
+ }
13165
+
13166
+ return (current / max * 100).toFixed(2);
13167
+ } // Replace all occurances of a string in a string
13168
+
13169
+ function replaceAll() {
13170
+ var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
13171
+ var find = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
13172
+ var replace = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';
13173
+ return input.replace(new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\]/\\])/g, '\\$1'), 'g'), replace.toString());
13174
+ } // Convert to title case
13175
+
13176
+ function toTitleCase() {
13177
+ var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
13178
+ return input.toString().replace(/\w\S*/g, function (text) {
13179
+ return text.charAt(0).toUpperCase() + text.substr(1).toLowerCase();
13180
+ });
13181
+ } // Convert string to pascalCase
13182
+
13183
+ function toPascalCase() {
13184
+ var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
13185
+ var string = input.toString(); // Convert kebab case
13186
+
13187
+ string = replaceAll(string, '-', ' '); // Convert snake case
13188
+
13189
+ string = replaceAll(string, '_', ' '); // Convert to title case
13190
+
13191
+ string = toTitleCase(string); // Convert to pascal case
13192
+
13193
+ return replaceAll(string, ' ', '');
13194
+ } // Convert string to pascalCase
13195
+
13196
+ function toCamelCase() {
13197
+ var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
13198
+ var string = input.toString(); // Convert to pascal case
13199
+
13200
+ string = toPascalCase(string); // Convert first character to lowercase
13201
+
13202
+ return string.charAt(0).toLowerCase() + string.slice(1);
13203
+ } // Remove HTML from a string
13204
+
13205
+ function stripHTML(source) {
13206
+ var fragment = document.createDocumentFragment();
13207
+ var element = document.createElement('div');
13208
+ fragment.appendChild(element);
13209
+ element.innerHTML = source;
13210
+ return fragment.firstChild.innerText;
13211
+ } // Like outerHTML, but also works for DocumentFragment
13212
+
13213
+ function getHTML(element) {
13214
+ var wrapper = document.createElement('div');
13215
+ wrapper.appendChild(element);
13216
+ return wrapper.innerHTML;
13217
+ }
13218
+
13219
+ var resources = {
13220
+ pip: 'PIP',
13221
+ airplay: 'AirPlay',
13222
+ html5: 'HTML5',
13223
+ vimeo: 'Vimeo',
13224
+ youtube: 'YouTube'
13225
+ };
13226
+ var i18n = {
13227
+ get: function get() {
13228
+ var key = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
13229
+ var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
13230
+
13231
+ if (is$1.empty(key) || is$1.empty(config)) {
13232
+ return '';
13233
+ }
13234
+
13235
+ var string = getDeep(config.i18n, key);
13236
+
13237
+ if (is$1.empty(string)) {
13238
+ if (Object.keys(resources).includes(key)) {
13239
+ return resources[key];
13240
+ }
13241
+
13242
+ return '';
13243
+ }
13244
+
13245
+ var replace = {
13246
+ '{seektime}': config.seekTime,
13247
+ '{title}': config.title
13248
+ };
13249
+ Object.entries(replace).forEach(function (_ref) {
13250
+ var _ref2 = _slicedToArray(_ref, 2),
13251
+ k = _ref2[0],
13252
+ v = _ref2[1];
13253
+
13254
+ string = replaceAll(string, k, v);
13255
+ });
13256
+ return string;
13257
+ }
13258
+ };
13259
+
13260
+ var Storage =
13261
+ /*#__PURE__*/
13262
+ function () {
13263
+ function Storage(player) {
13264
+ _classCallCheck(this, Storage);
13265
+
13266
+ this.enabled = player.config.storage.enabled;
13267
+ this.key = player.config.storage.key;
13268
+ } // Check for actual support (see if we can use it)
13269
+
13270
+
13271
+ _createClass(Storage, [{
13272
+ key: "get",
13273
+ value: function get(key) {
13274
+ if (!Storage.supported || !this.enabled) {
13275
+ return null;
13276
+ }
13277
+
13278
+ var store = window.localStorage.getItem(this.key);
13279
+
13280
+ if (is$1.empty(store)) {
13281
+ return null;
13282
+ }
13283
+
13284
+ var json = JSON.parse(store);
13285
+ return is$1.string(key) && key.length ? json[key] : json;
13286
+ }
13287
+ }, {
13288
+ key: "set",
13289
+ value: function set(object) {
13290
+ // Bail if we don't have localStorage support or it's disabled
13291
+ if (!Storage.supported || !this.enabled) {
13292
+ return;
13293
+ } // Can only store objectst
13294
+
13295
+
13296
+ if (!is$1.object(object)) {
13297
+ return;
13298
+ } // Get current storage
13299
+
13300
+
13301
+ var storage = this.get(); // Default to empty object
13302
+
13303
+ if (is$1.empty(storage)) {
13304
+ storage = {};
13305
+ } // Update the working copy of the values
13306
+
13307
+
13308
+ extend(storage, object); // Update storage
13309
+
13310
+ window.localStorage.setItem(this.key, JSON.stringify(storage));
13311
+ }
13312
+ }], [{
13313
+ key: "supported",
13314
+ get: function get() {
13315
+ try {
13316
+ if (!('localStorage' in window)) {
13317
+ return false;
13318
+ }
13319
+
13320
+ var test = '___test'; // Try to use it (it might be disabled, e.g. user is in private mode)
13321
+ // see: https://github.com/sampotts/plyr/issues/131
13322
+
13323
+ window.localStorage.setItem(test, test);
13324
+ window.localStorage.removeItem(test);
13325
+ return true;
13326
+ } catch (e) {
13327
+ return false;
13328
+ }
13329
+ }
13330
+ }]);
13331
+
13332
+ return Storage;
13333
+ }();
13334
+
13335
+ // ==========================================================================
13336
+ // Fetch wrapper
13337
+ // Using XHR to avoid issues with older browsers
13338
+ // ==========================================================================
13339
+ function fetch(url) {
13340
+ var responseType = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'text';
13341
+ return new Promise(function (resolve, reject) {
13342
+ try {
13343
+ var request = new XMLHttpRequest(); // Check for CORS support
13344
+
13345
+ if (!('withCredentials' in request)) {
13346
+ return;
13347
+ }
13348
+
13349
+ request.addEventListener('load', function () {
13350
+ if (responseType === 'text') {
13351
+ try {
13352
+ resolve(JSON.parse(request.responseText));
13353
+ } catch (e) {
13354
+ resolve(request.responseText);
13355
+ }
13356
+ } else {
13357
+ resolve(request.response);
13358
+ }
13359
+ });
13360
+ request.addEventListener('error', function () {
13361
+ throw new Error(request.status);
13362
+ });
13363
+ request.open('GET', url, true); // Set the required response type
13364
+
13365
+ request.responseType = responseType;
13366
+ request.send();
13367
+ } catch (e) {
13368
+ reject(e);
13369
+ }
13370
+ });
13371
+ }
13372
+
13373
+ // ==========================================================================
13374
+
13375
+ function loadSprite(url, id) {
13376
+ if (!is$1.string(url)) {
13377
+ return;
13378
+ }
13379
+
13380
+ var prefix = 'cache';
13381
+ var hasId = is$1.string(id);
13382
+ var isCached = false;
13383
+
13384
+ var exists = function exists() {
13385
+ return document.getElementById(id) !== null;
13386
+ };
13387
+
13388
+ var update = function update(container, data) {
13389
+ // eslint-disable-next-line no-param-reassign
13390
+ container.innerHTML = data; // Check again incase of race condition
13391
+
13392
+ if (hasId && exists()) {
13393
+ return;
13394
+ } // Inject the SVG to the body
13395
+
13396
+
13397
+ document.body.insertAdjacentElement('afterbegin', container);
13398
+ }; // Only load once if ID set
13399
+
13400
+
13401
+ if (!hasId || !exists()) {
13402
+ var useStorage = Storage.supported; // Create container
13403
+
13404
+ var container = document.createElement('div');
13405
+ container.setAttribute('hidden', '');
13406
+
13407
+ if (hasId) {
13408
+ container.setAttribute('id', id);
13409
+ } // Check in cache
13410
+
13411
+
13412
+ if (useStorage) {
13413
+ var cached = window.localStorage.getItem("".concat(prefix, "-").concat(id));
13414
+ isCached = cached !== null;
13415
+
13416
+ if (isCached) {
13417
+ var data = JSON.parse(cached);
13418
+ update(container, data.content);
13419
+ }
13420
+ } // Get the sprite
13421
+
13422
+
13423
+ fetch(url).then(function (result) {
13424
+ if (is$1.empty(result)) {
13425
+ return;
13426
+ }
13427
+
13428
+ if (useStorage) {
13429
+ window.localStorage.setItem("".concat(prefix, "-").concat(id), JSON.stringify({
13430
+ content: result
13431
+ }));
13432
+ }
13433
+
13434
+ update(container, result);
13435
+ }).catch(function () {});
13436
+ }
13437
+ }
13438
+
13439
+ // ==========================================================================
13440
+
13441
+ var getHours = function getHours(value) {
13442
+ return Math.trunc(value / 60 / 60 % 60, 10);
13443
+ };
13444
+ var getMinutes = function getMinutes(value) {
13445
+ return Math.trunc(value / 60 % 60, 10);
13446
+ };
13447
+ var getSeconds = function getSeconds(value) {
13448
+ return Math.trunc(value % 60, 10);
13449
+ }; // Format time to UI friendly string
13450
+
13451
+ function formatTime() {
13452
+ var time = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
13453
+ var displayHours = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
13454
+ var inverted = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
13455
+
13456
+ // Bail if the value isn't a number
13457
+ if (!is$1.number(time)) {
13458
+ return formatTime(null, displayHours, inverted);
13459
+ } // Format time component to add leading zero
13460
+
13461
+
13462
+ var format = function format(value) {
13463
+ return "0".concat(value).slice(-2);
13464
+ }; // Breakdown to hours, mins, secs
13465
+
13466
+
13467
+ var hours = getHours(time);
13468
+ var mins = getMinutes(time);
13469
+ var secs = getSeconds(time); // Do we need to display hours?
13470
+
13471
+ if (displayHours || hours > 0) {
13472
+ hours = "".concat(hours, ":");
13473
+ } else {
13474
+ hours = '';
13475
+ } // Render
13476
+
13477
+
13478
+ return "".concat(inverted && time > 0 ? '-' : '').concat(hours).concat(format(mins), ":").concat(format(secs));
13479
+ }
13480
+
13481
+ var controls = {
13482
+ // Get icon URL
13483
+ getIconUrl: function getIconUrl() {
13484
+ var url = new URL(this.config.iconUrl, window.location);
13485
+ var cors = url.host !== window.location.host || browser.isIE && !window.svg4everybody;
13486
+ return {
13487
+ url: this.config.iconUrl,
13488
+ cors: cors
13489
+ };
13490
+ },
13491
+ // Find the UI controls
13492
+ findElements: function findElements() {
13493
+ try {
13494
+ this.elements.controls = getElement.call(this, this.config.selectors.controls.wrapper); // Buttons
13495
+
13496
+ this.elements.buttons = {
13497
+ play: getElements.call(this, this.config.selectors.buttons.play),
13498
+ pause: getElement.call(this, this.config.selectors.buttons.pause),
13499
+ restart: getElement.call(this, this.config.selectors.buttons.restart),
13500
+ rewind: getElement.call(this, this.config.selectors.buttons.rewind),
13501
+ fastForward: getElement.call(this, this.config.selectors.buttons.fastForward),
13502
+ mute: getElement.call(this, this.config.selectors.buttons.mute),
13503
+ pip: getElement.call(this, this.config.selectors.buttons.pip),
13504
+ airplay: getElement.call(this, this.config.selectors.buttons.airplay),
13505
+ settings: getElement.call(this, this.config.selectors.buttons.settings),
13506
+ captions: getElement.call(this, this.config.selectors.buttons.captions),
13507
+ fullscreen: getElement.call(this, this.config.selectors.buttons.fullscreen)
13508
+ }; // Progress
13509
+
13510
+ this.elements.progress = getElement.call(this, this.config.selectors.progress); // Inputs
13511
+
13512
+ this.elements.inputs = {
13513
+ seek: getElement.call(this, this.config.selectors.inputs.seek),
13514
+ volume: getElement.call(this, this.config.selectors.inputs.volume)
13515
+ }; // Display
13516
+
13517
+ this.elements.display = {
13518
+ buffer: getElement.call(this, this.config.selectors.display.buffer),
13519
+ currentTime: getElement.call(this, this.config.selectors.display.currentTime),
13520
+ duration: getElement.call(this, this.config.selectors.display.duration)
13521
+ }; // Seek tooltip
13522
+
13523
+ if (is$1.element(this.elements.progress)) {
13524
+ this.elements.display.seekTooltip = this.elements.progress.querySelector(".".concat(this.config.classNames.tooltip));
13525
+ }
13526
+
13527
+ return true;
13528
+ } catch (error) {
13529
+ // Log it
13530
+ this.debug.warn('It looks like there is a problem with your custom controls HTML', error); // Restore native video controls
13531
+
13532
+ this.toggleNativeControls(true);
13533
+ return false;
13534
+ }
13535
+ },
13536
+ // Create <svg> icon
13537
+ createIcon: function createIcon(type, attributes) {
13538
+ var namespace = 'http://www.w3.org/2000/svg';
13539
+ var iconUrl = controls.getIconUrl.call(this);
13540
+ var iconPath = "".concat(!iconUrl.cors ? iconUrl.url : '', "#").concat(this.config.iconPrefix); // Create <svg>
13541
+
13542
+ var icon = document.createElementNS(namespace, 'svg');
13543
+ setAttributes(icon, extend(attributes, {
13544
+ role: 'presentation',
13545
+ focusable: 'false'
13546
+ })); // Create the <use> to reference sprite
13547
+
13548
+ var use = document.createElementNS(namespace, 'use');
13549
+ var path = "".concat(iconPath, "-").concat(type); // Set `href` attributes
13550
+ // https://github.com/sampotts/plyr/issues/460
13551
+ // https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/xlink:href
13552
+
13553
+ if ('href' in use) {
13554
+ use.setAttributeNS('http://www.w3.org/1999/xlink', 'href', path);
13555
+ } // Always set the older attribute even though it's "deprecated" (it'll be around for ages)
13556
+
13557
+
13558
+ use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path); // Add <use> to <svg>
13559
+
13560
+ icon.appendChild(use);
13561
+ return icon;
13562
+ },
13563
+ // Create hidden text label
13564
+ createLabel: function createLabel(key) {
13565
+ var attr = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
13566
+ var text = i18n.get(key, this.config);
13567
+ var attributes = Object.assign({}, attr, {
13568
+ class: [attr.class, this.config.classNames.hidden].filter(Boolean).join(' ')
13569
+ });
13570
+ return createElement('span', attributes, text);
13571
+ },
13572
+ // Create a badge
13573
+ createBadge: function createBadge(text) {
13574
+ if (is$1.empty(text)) {
13575
+ return null;
13576
+ }
13577
+
13578
+ var badge = createElement('span', {
13579
+ class: this.config.classNames.menu.value
13580
+ });
13581
+ badge.appendChild(createElement('span', {
13582
+ class: this.config.classNames.menu.badge
13583
+ }, text));
13584
+ return badge;
13585
+ },
13586
+ // Create a <button>
13587
+ createButton: function createButton(buttonType, attr) {
13588
+ var _this = this;
13589
+
13590
+ var attributes = extend({}, attr);
13591
+ var type = toCamelCase(buttonType);
13592
+ var props = {
13593
+ element: 'button',
13594
+ toggle: false,
13595
+ label: null,
13596
+ icon: null,
13597
+ labelPressed: null,
13598
+ iconPressed: null
13599
+ };
13600
+ ['element', 'icon', 'label'].forEach(function (key) {
13601
+ if (Object.keys(attributes).includes(key)) {
13602
+ props[key] = attributes[key];
13603
+ delete attributes[key];
13604
+ }
13605
+ }); // Default to 'button' type to prevent form submission
13606
+
13607
+ if (props.element === 'button' && !Object.keys(attributes).includes('type')) {
13608
+ attributes.type = 'button';
13609
+ } // Set class name
13610
+
13611
+
13612
+ if (Object.keys(attributes).includes('class')) {
13613
+ if (!attributes.class.split(' ').some(function (c) {
13614
+ return c === _this.config.classNames.control;
13615
+ })) {
13616
+ extend(attributes, {
13617
+ class: "".concat(attributes.class, " ").concat(this.config.classNames.control)
13618
+ });
13619
+ }
13620
+ } else {
13621
+ attributes.class = this.config.classNames.control;
13622
+ } // Large play button
13623
+
13624
+
13625
+ switch (buttonType) {
13626
+ case 'play':
13627
+ props.toggle = true;
13628
+ props.label = 'play';
13629
+ props.labelPressed = 'pause';
13630
+ props.icon = 'play';
13631
+ props.iconPressed = 'pause';
13632
+ break;
13633
+
13634
+ case 'mute':
13635
+ props.toggle = true;
13636
+ props.label = 'mute';
13637
+ props.labelPressed = 'unmute';
13638
+ props.icon = 'volume';
13639
+ props.iconPressed = 'muted';
13640
+ break;
13641
+
13642
+ case 'captions':
13643
+ props.toggle = true;
13644
+ props.label = 'enableCaptions';
13645
+ props.labelPressed = 'disableCaptions';
13646
+ props.icon = 'captions-off';
13647
+ props.iconPressed = 'captions-on';
13648
+ break;
13649
+
13650
+ case 'fullscreen':
13651
+ props.toggle = true;
13652
+ props.label = 'enterFullscreen';
13653
+ props.labelPressed = 'exitFullscreen';
13654
+ props.icon = 'enter-fullscreen';
13655
+ props.iconPressed = 'exit-fullscreen';
13656
+ break;
13657
+
13658
+ case 'play-large':
13659
+ attributes.class += " ".concat(this.config.classNames.control, "--overlaid");
13660
+ type = 'play';
13661
+ props.label = 'play';
13662
+ props.icon = 'play';
13663
+ break;
13664
+
13665
+ default:
13666
+ if (is$1.empty(props.label)) {
13667
+ props.label = type;
13668
+ }
13669
+
13670
+ if (is$1.empty(props.icon)) {
13671
+ props.icon = buttonType;
13672
+ }
13673
+
13674
+ }
13675
+
13676
+ var button = createElement(props.element); // Setup toggle icon and labels
13677
+
13678
+ if (props.toggle) {
13679
+ // Icon
13680
+ button.appendChild(controls.createIcon.call(this, props.iconPressed, {
13681
+ class: 'icon--pressed'
13682
+ }));
13683
+ button.appendChild(controls.createIcon.call(this, props.icon, {
13684
+ class: 'icon--not-pressed'
13685
+ })); // Label/Tooltip
13686
+
13687
+ button.appendChild(controls.createLabel.call(this, props.labelPressed, {
13688
+ class: 'label--pressed'
13689
+ }));
13690
+ button.appendChild(controls.createLabel.call(this, props.label, {
13691
+ class: 'label--not-pressed'
13692
+ }));
13693
+ } else {
13694
+ button.appendChild(controls.createIcon.call(this, props.icon));
13695
+ button.appendChild(controls.createLabel.call(this, props.label));
13696
+ } // Merge and set attributes
13697
+
13698
+
13699
+ extend(attributes, getAttributesFromSelector(this.config.selectors.buttons[type], attributes));
13700
+ setAttributes(button, attributes); // We have multiple play buttons
13701
+
13702
+ if (type === 'play') {
13703
+ if (!is$1.array(this.elements.buttons[type])) {
13704
+ this.elements.buttons[type] = [];
13705
+ }
13706
+
13707
+ this.elements.buttons[type].push(button);
13708
+ } else {
13709
+ this.elements.buttons[type] = button;
13710
+ }
13711
+
13712
+ return button;
13713
+ },
13714
+ // Create an <input type='range'>
13715
+ createRange: function createRange(type, attributes) {
13716
+ // Seek input
13717
+ var input = createElement('input', extend(getAttributesFromSelector(this.config.selectors.inputs[type]), {
13718
+ type: 'range',
13719
+ min: 0,
13720
+ max: 100,
13721
+ step: 0.01,
13722
+ value: 0,
13723
+ autocomplete: 'off',
13724
+ // A11y fixes for https://github.com/sampotts/plyr/issues/905
13725
+ role: 'slider',
13726
+ 'aria-label': i18n.get(type, this.config),
13727
+ 'aria-valuemin': 0,
13728
+ 'aria-valuemax': 100,
13729
+ 'aria-valuenow': 0
13730
+ }, attributes));
13731
+ this.elements.inputs[type] = input; // Set the fill for webkit now
13732
+
13733
+ controls.updateRangeFill.call(this, input); // Improve support on touch devices
13734
+
13735
+ RangeTouch.setup(input);
13736
+ return input;
13737
+ },
13738
+ // Create a <progress>
13739
+ createProgress: function createProgress(type, attributes) {
13740
+ var progress = createElement('progress', extend(getAttributesFromSelector(this.config.selectors.display[type]), {
13741
+ min: 0,
13742
+ max: 100,
13743
+ value: 0,
13744
+ role: 'progressbar',
13745
+ 'aria-hidden': true
13746
+ }, attributes)); // Create the label inside
13747
+
13748
+ if (type !== 'volume') {
13749
+ progress.appendChild(createElement('span', null, '0'));
13750
+ var suffixKey = {
13751
+ played: 'played',
13752
+ buffer: 'buffered'
13753
+ }[type];
13754
+ var suffix = suffixKey ? i18n.get(suffixKey, this.config) : '';
13755
+ progress.innerText = "% ".concat(suffix.toLowerCase());
13756
+ }
13757
+
13758
+ this.elements.display[type] = progress;
13759
+ return progress;
13760
+ },
13761
+ // Create time display
13762
+ createTime: function createTime(type, attrs) {
13763
+ var attributes = getAttributesFromSelector(this.config.selectors.display[type], attrs);
13764
+ var container = createElement('div', extend(attributes, {
13765
+ class: "".concat(attributes.class ? attributes.class : '', " ").concat(this.config.classNames.display.time, " ").trim(),
13766
+ 'aria-label': i18n.get(type, this.config)
13767
+ }), '00:00'); // Reference for updates
13768
+
13769
+ this.elements.display[type] = container;
13770
+ return container;
13771
+ },
13772
+ // Bind keyboard shortcuts for a menu item
13773
+ // We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus
13774
+ // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143
13775
+ bindMenuItemShortcuts: function bindMenuItemShortcuts(menuItem, type) {
13776
+ var _this2 = this;
13777
+
13778
+ // Navigate through menus via arrow keys and space
13779
+ on(menuItem, 'keydown keyup', function (event) {
13780
+ // We only care about space and ⬆️ ⬇️️ ➡️
13781
+ if (![32, 38, 39, 40].includes(event.which)) {
13782
+ return;
13783
+ } // Prevent play / seek
13784
+
13785
+
13786
+ event.preventDefault();
13787
+ event.stopPropagation(); // We're just here to prevent the keydown bubbling
13788
+
13789
+ if (event.type === 'keydown') {
13790
+ return;
13791
+ }
13792
+
13793
+ var isRadioButton = matches$1(menuItem, '[role="menuitemradio"]'); // Show the respective menu
13794
+
13795
+ if (!isRadioButton && [32, 39].includes(event.which)) {
13796
+ controls.showMenuPanel.call(_this2, type, true);
13797
+ } else {
13798
+ var target;
13799
+
13800
+ if (event.which !== 32) {
13801
+ if (event.which === 40 || isRadioButton && event.which === 39) {
13802
+ target = menuItem.nextElementSibling;
13803
+
13804
+ if (!is$1.element(target)) {
13805
+ target = menuItem.parentNode.firstElementChild;
13806
+ }
13807
+ } else {
13808
+ target = menuItem.previousElementSibling;
13809
+
13810
+ if (!is$1.element(target)) {
13811
+ target = menuItem.parentNode.lastElementChild;
13812
+ }
13813
+ }
13814
+
13815
+ setFocus.call(_this2, target, true);
13816
+ }
13817
+ }
13818
+ }, false); // Enter will fire a `click` event but we still need to manage focus
13819
+ // So we bind to keyup which fires after and set focus here
13820
+
13821
+ on(menuItem, 'keyup', function (event) {
13822
+ if (event.which !== 13) {
13823
+ return;
13824
+ }
13825
+
13826
+ controls.focusFirstMenuItem.call(_this2, null, true);
13827
+ });
13828
+ },
13829
+ // Create a settings menu item
13830
+ createMenuItem: function createMenuItem(_ref) {
13831
+ var _this3 = this;
13832
+
13833
+ var value = _ref.value,
13834
+ list = _ref.list,
13835
+ type = _ref.type,
13836
+ title = _ref.title,
13837
+ _ref$badge = _ref.badge,
13838
+ badge = _ref$badge === void 0 ? null : _ref$badge,
13839
+ _ref$checked = _ref.checked,
13840
+ checked = _ref$checked === void 0 ? false : _ref$checked;
13841
+ var attributes = getAttributesFromSelector(this.config.selectors.inputs[type]);
13842
+ var menuItem = createElement('button', extend(attributes, {
13843
+ type: 'button',
13844
+ role: 'menuitemradio',
13845
+ class: "".concat(this.config.classNames.control, " ").concat(attributes.class ? attributes.class : '').trim(),
13846
+ 'aria-checked': checked,
13847
+ value: value
13848
+ }));
13849
+ var flex = createElement('span'); // We have to set as HTML incase of special characters
13850
+
13851
+ flex.innerHTML = title;
13852
+
13853
+ if (is$1.element(badge)) {
13854
+ flex.appendChild(badge);
13855
+ }
13856
+
13857
+ menuItem.appendChild(flex); // Replicate radio button behaviour
13858
+
13859
+ Object.defineProperty(menuItem, 'checked', {
13860
+ enumerable: true,
13861
+ get: function get() {
13862
+ return menuItem.getAttribute('aria-checked') === 'true';
13863
+ },
13864
+ set: function set(check) {
13865
+ // Ensure exclusivity
13866
+ if (check) {
13867
+ Array.from(menuItem.parentNode.children).filter(function (node) {
13868
+ return matches$1(node, '[role="menuitemradio"]');
13869
+ }).forEach(function (node) {
13870
+ return node.setAttribute('aria-checked', 'false');
13871
+ });
13872
+ }
13873
+
13874
+ menuItem.setAttribute('aria-checked', check ? 'true' : 'false');
13875
+ }
13876
+ });
13877
+ this.listeners.bind(menuItem, 'click keyup', function (event) {
13878
+ if (is$1.keyboardEvent(event) && event.which !== 32) {
13879
+ return;
13880
+ }
13881
+
13882
+ event.preventDefault();
13883
+ event.stopPropagation();
13884
+ menuItem.checked = true;
13885
+
13886
+ switch (type) {
13887
+ case 'language':
13888
+ _this3.currentTrack = Number(value);
13889
+ break;
13890
+
13891
+ case 'quality':
13892
+ _this3.quality = value;
13893
+ break;
13894
+
13895
+ case 'speed':
13896
+ _this3.speed = parseFloat(value);
13897
+ break;
13898
+
13899
+ default:
13900
+ break;
13901
+ }
13902
+
13903
+ controls.showMenuPanel.call(_this3, 'home', is$1.keyboardEvent(event));
13904
+ }, type, false);
13905
+ controls.bindMenuItemShortcuts.call(this, menuItem, type);
13906
+ list.appendChild(menuItem);
13907
+ },
13908
+ // Format a time for display
13909
+ formatTime: function formatTime$1() {
13910
+ var time = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
13911
+ var inverted = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
13912
+
13913
+ // Bail if the value isn't a number
13914
+ if (!is$1.number(time)) {
13915
+ return time;
13916
+ } // Always display hours if duration is over an hour
13917
+
13918
+
13919
+ var forceHours = getHours(this.duration) > 0;
13920
+ return formatTime(time, forceHours, inverted);
13921
+ },
13922
+ // Update the displayed time
13923
+ updateTimeDisplay: function updateTimeDisplay() {
13924
+ var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
13925
+ var time = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
13926
+ var inverted = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
13927
+
13928
+ // Bail if there's no element to display or the value isn't a number
13929
+ if (!is$1.element(target) || !is$1.number(time)) {
13930
+ return;
13931
+ } // eslint-disable-next-line no-param-reassign
13932
+
13933
+
13934
+ target.innerText = controls.formatTime(time, inverted);
13935
+ },
13936
+ // Update volume UI and storage
13937
+ updateVolume: function updateVolume() {
13938
+ if (!this.supported.ui) {
13939
+ return;
13940
+ } // Update range
13941
+
13942
+
13943
+ if (is$1.element(this.elements.inputs.volume)) {
13944
+ controls.setRange.call(this, this.elements.inputs.volume, this.muted ? 0 : this.volume);
13945
+ } // Update mute state
13946
+
13947
+
13948
+ if (is$1.element(this.elements.buttons.mute)) {
13949
+ this.elements.buttons.mute.pressed = this.muted || this.volume === 0;
13950
+ }
13951
+ },
13952
+ // Update seek value and lower fill
13953
+ setRange: function setRange(target) {
13954
+ var value = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
13955
+
13956
+ if (!is$1.element(target)) {
13957
+ return;
13958
+ } // eslint-disable-next-line
13959
+
13960
+
13961
+ target.value = value; // Webkit range fill
13962
+
13963
+ controls.updateRangeFill.call(this, target);
13964
+ },
13965
+ // Update <progress> elements
13966
+ updateProgress: function updateProgress(event) {
13967
+ var _this4 = this;
13968
+
13969
+ if (!this.supported.ui || !is$1.event(event)) {
13970
+ return;
13971
+ }
13972
+
13973
+ var value = 0;
13974
+
13975
+ var setProgress = function setProgress(target, input) {
13976
+ var val = is$1.number(input) ? input : 0;
13977
+ var progress = is$1.element(target) ? target : _this4.elements.display.buffer; // Update value and label
13978
+
13979
+ if (is$1.element(progress)) {
13980
+ progress.value = val; // Update text label inside
13981
+
13982
+ var label = progress.getElementsByTagName('span')[0];
13983
+
13984
+ if (is$1.element(label)) {
13985
+ label.childNodes[0].nodeValue = val;
13986
+ }
13987
+ }
13988
+ };
13989
+
13990
+ if (event) {
13991
+ switch (event.type) {
13992
+ // Video playing
13993
+ case 'timeupdate':
13994
+ case 'seeking':
13995
+ case 'seeked':
13996
+ value = getPercentage(this.currentTime, this.duration); // Set seek range value only if it's a 'natural' time event
13997
+
13998
+ if (event.type === 'timeupdate') {
13999
+ controls.setRange.call(this, this.elements.inputs.seek, value);
14000
+ }
14001
+
14002
+ break;
14003
+ // Check buffer status
14004
+
14005
+ case 'playing':
14006
+ case 'progress':
14007
+ setProgress(this.elements.display.buffer, this.buffered * 100);
14008
+ break;
14009
+
14010
+ default:
14011
+ break;
14012
+ }
14013
+ }
14014
+ },
14015
+ // Webkit polyfill for lower fill range
14016
+ updateRangeFill: function updateRangeFill(target) {
14017
+ // Get range from event if event passed
14018
+ var range = is$1.event(target) ? target.target : target; // Needs to be a valid <input type='range'>
14019
+
14020
+ if (!is$1.element(range) || range.getAttribute('type') !== 'range') {
14021
+ return;
14022
+ } // Set aria values for https://github.com/sampotts/plyr/issues/905
14023
+
14024
+
14025
+ if (matches$1(range, this.config.selectors.inputs.seek)) {
14026
+ range.setAttribute('aria-valuenow', this.currentTime);
14027
+ var currentTime = controls.formatTime(this.currentTime);
14028
+ var duration = controls.formatTime(this.duration);
14029
+ var format = i18n.get('seekLabel', this.config);
14030
+ range.setAttribute('aria-valuetext', format.replace('{currentTime}', currentTime).replace('{duration}', duration));
14031
+ } else if (matches$1(range, this.config.selectors.inputs.volume)) {
14032
+ var percent = range.value * 100;
14033
+ range.setAttribute('aria-valuenow', percent);
14034
+ range.setAttribute('aria-valuetext', "".concat(percent.toFixed(1), "%"));
14035
+ } else {
14036
+ range.setAttribute('aria-valuenow', range.value);
14037
+ } // WebKit only
14038
+
14039
+
14040
+ if (!browser.isWebkit) {
14041
+ return;
14042
+ } // Set CSS custom property
14043
+
14044
+
14045
+ range.style.setProperty('--value', "".concat(range.value / range.max * 100, "%"));
14046
+ },
14047
+ // Update hover tooltip for seeking
14048
+ updateSeekTooltip: function updateSeekTooltip(event) {
14049
+ var _this5 = this;
14050
+
14051
+ // Bail if setting not true
14052
+ if (!this.config.tooltips.seek || !is$1.element(this.elements.inputs.seek) || !is$1.element(this.elements.display.seekTooltip) || this.duration === 0) {
14053
+ return;
14054
+ }
14055
+
14056
+ var visible = "".concat(this.config.classNames.tooltip, "--visible");
14057
+
14058
+ var toggle = function toggle(show) {
14059
+ return toggleClass(_this5.elements.display.seekTooltip, visible, show);
14060
+ }; // Hide on touch
14061
+
14062
+
14063
+ if (this.touch) {
14064
+ toggle(false);
14065
+ return;
14066
+ } // Determine percentage, if already visible
14067
+
14068
+
14069
+ var percent = 0;
14070
+ var clientRect = this.elements.progress.getBoundingClientRect();
14071
+
14072
+ if (is$1.event(event)) {
14073
+ percent = 100 / clientRect.width * (event.pageX - clientRect.left);
14074
+ } else if (hasClass(this.elements.display.seekTooltip, visible)) {
14075
+ percent = parseFloat(this.elements.display.seekTooltip.style.left, 10);
14076
+ } else {
14077
+ return;
14078
+ } // Set bounds
14079
+
14080
+
14081
+ if (percent < 0) {
14082
+ percent = 0;
14083
+ } else if (percent > 100) {
14084
+ percent = 100;
14085
+ } // Display the time a click would seek to
14086
+
14087
+
14088
+ controls.updateTimeDisplay.call(this, this.elements.display.seekTooltip, this.duration / 100 * percent); // Set position
14089
+
14090
+ this.elements.display.seekTooltip.style.left = "".concat(percent, "%"); // Show/hide the tooltip
14091
+ // If the event is a moues in/out and percentage is inside bounds
14092
+
14093
+ if (is$1.event(event) && ['mouseenter', 'mouseleave'].includes(event.type)) {
14094
+ toggle(event.type === 'mouseenter');
14095
+ }
14096
+ },
14097
+ // Handle time change event
14098
+ timeUpdate: function timeUpdate(event) {
14099
+ // Only invert if only one time element is displayed and used for both duration and currentTime
14100
+ var invert = !is$1.element(this.elements.display.duration) && this.config.invertTime; // Duration
14101
+
14102
+ controls.updateTimeDisplay.call(this, this.elements.display.currentTime, invert ? this.duration - this.currentTime : this.currentTime, invert); // Ignore updates while seeking
14103
+
14104
+ if (event && event.type === 'timeupdate' && this.media.seeking) {
14105
+ return;
14106
+ } // Playing progress
14107
+
14108
+
14109
+ controls.updateProgress.call(this, event);
14110
+ },
14111
+ // Show the duration on metadataloaded or durationchange events
14112
+ durationUpdate: function durationUpdate() {
14113
+ // Bail if no UI or durationchange event triggered after playing/seek when invertTime is false
14114
+ if (!this.supported.ui || !this.config.invertTime && this.currentTime) {
14115
+ return;
14116
+ } // If duration is the 2**32 (shaka), Infinity (HLS), DASH-IF (Number.MAX_SAFE_INTEGER || Number.MAX_VALUE) indicating live we hide the currentTime and progressbar.
14117
+ // https://github.com/video-dev/hls.js/blob/5820d29d3c4c8a46e8b75f1e3afa3e68c1a9a2db/src/controller/buffer-controller.js#L415
14118
+ // https://github.com/google/shaka-player/blob/4d889054631f4e1cf0fbd80ddd2b71887c02e232/lib/media/streaming_engine.js#L1062
14119
+ // https://github.com/Dash-Industry-Forum/dash.js/blob/69859f51b969645b234666800d4cb596d89c602d/src/dash/models/DashManifestModel.js#L338
14120
+
14121
+
14122
+ if (this.duration >= Math.pow(2, 32)) {
14123
+ toggleHidden(this.elements.display.currentTime, true);
14124
+ toggleHidden(this.elements.progress, true);
14125
+ return;
14126
+ } // Update ARIA values
14127
+
14128
+
14129
+ if (is$1.element(this.elements.inputs.seek)) {
14130
+ this.elements.inputs.seek.setAttribute('aria-valuemax', this.duration);
14131
+ } // If there's a spot to display duration
14132
+
14133
+
14134
+ var hasDuration = is$1.element(this.elements.display.duration); // If there's only one time display, display duration there
14135
+
14136
+ if (!hasDuration && this.config.displayDuration && this.paused) {
14137
+ controls.updateTimeDisplay.call(this, this.elements.display.currentTime, this.duration);
14138
+ } // If there's a duration element, update content
14139
+
14140
+
14141
+ if (hasDuration) {
14142
+ controls.updateTimeDisplay.call(this, this.elements.display.duration, this.duration);
14143
+ } // Update the tooltip (if visible)
14144
+
14145
+
14146
+ controls.updateSeekTooltip.call(this);
14147
+ },
14148
+ // Hide/show a tab
14149
+ toggleMenuButton: function toggleMenuButton(setting, toggle) {
14150
+ toggleHidden(this.elements.settings.buttons[setting], !toggle);
14151
+ },
14152
+ // Update the selected setting
14153
+ updateSetting: function updateSetting(setting, container, input) {
14154
+ var pane = this.elements.settings.panels[setting];
14155
+ var value = null;
14156
+ var list = container;
14157
+
14158
+ if (setting === 'captions') {
14159
+ value = this.currentTrack;
14160
+ } else {
14161
+ value = !is$1.empty(input) ? input : this[setting]; // Get default
14162
+
14163
+ if (is$1.empty(value)) {
14164
+ value = this.config[setting].default;
14165
+ } // Unsupported value
14166
+
14167
+
14168
+ if (!is$1.empty(this.options[setting]) && !this.options[setting].includes(value)) {
14169
+ this.debug.warn("Unsupported value of '".concat(value, "' for ").concat(setting));
14170
+ return;
14171
+ } // Disabled value
14172
+
14173
+
14174
+ if (!this.config[setting].options.includes(value)) {
14175
+ this.debug.warn("Disabled value of '".concat(value, "' for ").concat(setting));
14176
+ return;
14177
+ }
14178
+ } // Get the list if we need to
14179
+
14180
+
14181
+ if (!is$1.element(list)) {
14182
+ list = pane && pane.querySelector('[role="menu"]');
14183
+ } // If there's no list it means it's not been rendered...
14184
+
14185
+
14186
+ if (!is$1.element(list)) {
14187
+ return;
14188
+ } // Update the label
14189
+
14190
+
14191
+ var label = this.elements.settings.buttons[setting].querySelector(".".concat(this.config.classNames.menu.value));
14192
+ label.innerHTML = controls.getLabel.call(this, setting, value); // Find the radio option and check it
14193
+
14194
+ var target = list && list.querySelector("[value=\"".concat(value, "\"]"));
14195
+
14196
+ if (is$1.element(target)) {
14197
+ target.checked = true;
14198
+ }
14199
+ },
14200
+ // Translate a value into a nice label
14201
+ getLabel: function getLabel(setting, value) {
14202
+ switch (setting) {
14203
+ case 'speed':
14204
+ return value === 1 ? i18n.get('normal', this.config) : "".concat(value, "&times;");
14205
+
14206
+ case 'quality':
14207
+ if (is$1.number(value)) {
14208
+ var label = i18n.get("qualityLabel.".concat(value), this.config);
14209
+
14210
+ if (!label.length) {
14211
+ return "".concat(value, "p");
14212
+ }
14213
+
14214
+ return label;
14215
+ }
14216
+
14217
+ return toTitleCase(value);
14218
+
14219
+ case 'captions':
14220
+ return captions.getLabel.call(this);
14221
+
14222
+ default:
14223
+ return null;
14224
+ }
14225
+ },
14226
+ // Set the quality menu
14227
+ setQualityMenu: function setQualityMenu(options) {
14228
+ var _this6 = this;
14229
+
14230
+ // Menu required
14231
+ if (!is$1.element(this.elements.settings.panels.quality)) {
14232
+ return;
14233
+ }
14234
+
14235
+ var type = 'quality';
14236
+ var list = this.elements.settings.panels.quality.querySelector('[role="menu"]'); // Set options if passed and filter based on uniqueness and config
14237
+
14238
+ if (is$1.array(options)) {
14239
+ this.options.quality = dedupe(options).filter(function (quality) {
14240
+ return _this6.config.quality.options.includes(quality);
14241
+ });
14242
+ } // Toggle the pane and tab
14243
+
14244
+
14245
+ var toggle = !is$1.empty(this.options.quality) && this.options.quality.length > 1;
14246
+ controls.toggleMenuButton.call(this, type, toggle); // Empty the menu
14247
+
14248
+ emptyElement(list); // Check if we need to toggle the parent
14249
+
14250
+ controls.checkMenu.call(this); // If we're hiding, nothing more to do
14251
+
14252
+ if (!toggle) {
14253
+ return;
14254
+ } // Get the badge HTML for HD, 4K etc
14255
+
14256
+
14257
+ var getBadge = function getBadge(quality) {
14258
+ var label = i18n.get("qualityBadge.".concat(quality), _this6.config);
14259
+
14260
+ if (!label.length) {
14261
+ return null;
14262
+ }
14263
+
14264
+ return controls.createBadge.call(_this6, label);
14265
+ }; // Sort options by the config and then render options
14266
+
14267
+
14268
+ this.options.quality.sort(function (a, b) {
14269
+ var sorting = _this6.config.quality.options;
14270
+ return sorting.indexOf(a) > sorting.indexOf(b) ? 1 : -1;
14271
+ }).forEach(function (quality) {
14272
+ controls.createMenuItem.call(_this6, {
14273
+ value: quality,
14274
+ list: list,
14275
+ type: type,
14276
+ title: controls.getLabel.call(_this6, 'quality', quality),
14277
+ badge: getBadge(quality)
14278
+ });
14279
+ });
14280
+ controls.updateSetting.call(this, type, list);
14281
+ },
14282
+ // Set the looping options
14283
+
14284
+ /* setLoopMenu() {
14285
+ // Menu required
14286
+ if (!is.element(this.elements.settings.panels.loop)) {
14287
+ return;
14288
+ }
14289
+ const options = ['start', 'end', 'all', 'reset'];
14290
+ const list = this.elements.settings.panels.loop.querySelector('[role="menu"]');
14291
+ // Show the pane and tab
14292
+ toggleHidden(this.elements.settings.buttons.loop, false);
14293
+ toggleHidden(this.elements.settings.panels.loop, false);
14294
+ // Toggle the pane and tab
14295
+ const toggle = !is.empty(this.loop.options);
14296
+ controls.toggleMenuButton.call(this, 'loop', toggle);
14297
+ // Empty the menu
14298
+ emptyElement(list);
14299
+ options.forEach(option => {
14300
+ const item = createElement('li');
14301
+ const button = createElement(
14302
+ 'button',
14303
+ extend(getAttributesFromSelector(this.config.selectors.buttons.loop), {
14304
+ type: 'button',
14305
+ class: this.config.classNames.control,
14306
+ 'data-plyr-loop-action': option,
14307
+ }),
14308
+ i18n.get(option, this.config)
14309
+ );
14310
+ if (['start', 'end'].includes(option)) {
14311
+ const badge = controls.createBadge.call(this, '00:00');
14312
+ button.appendChild(badge);
14313
+ }
14314
+ item.appendChild(button);
14315
+ list.appendChild(item);
14316
+ });
14317
+ }, */
14318
+ // Get current selected caption language
14319
+ // TODO: rework this to user the getter in the API?
14320
+ // Set a list of available captions languages
14321
+ setCaptionsMenu: function setCaptionsMenu() {
14322
+ var _this7 = this;
14323
+
14324
+ // Menu required
14325
+ if (!is$1.element(this.elements.settings.panels.captions)) {
14326
+ return;
14327
+ } // TODO: Captions or language? Currently it's mixed
14328
+
14329
+
14330
+ var type = 'captions';
14331
+ var list = this.elements.settings.panels.captions.querySelector('[role="menu"]');
14332
+ var tracks = captions.getTracks.call(this);
14333
+ var toggle = Boolean(tracks.length); // Toggle the pane and tab
14334
+
14335
+ controls.toggleMenuButton.call(this, type, toggle); // Empty the menu
14336
+
14337
+ emptyElement(list); // Check if we need to toggle the parent
14338
+
14339
+ controls.checkMenu.call(this); // If there's no captions, bail
14340
+
14341
+ if (!toggle) {
14342
+ return;
14343
+ } // Generate options data
14344
+
14345
+
14346
+ var options = tracks.map(function (track, value) {
14347
+ return {
14348
+ value: value,
14349
+ checked: _this7.captions.toggled && _this7.currentTrack === value,
14350
+ title: captions.getLabel.call(_this7, track),
14351
+ badge: track.language && controls.createBadge.call(_this7, track.language.toUpperCase()),
14352
+ list: list,
14353
+ type: 'language'
14354
+ };
14355
+ }); // Add the "Disabled" option to turn off captions
14356
+
14357
+ options.unshift({
14358
+ value: -1,
14359
+ checked: !this.captions.toggled,
14360
+ title: i18n.get('disabled', this.config),
14361
+ list: list,
14362
+ type: 'language'
14363
+ }); // Generate options
14364
+
14365
+ options.forEach(controls.createMenuItem.bind(this));
14366
+ controls.updateSetting.call(this, type, list);
14367
+ },
14368
+ // Set a list of available captions languages
14369
+ setSpeedMenu: function setSpeedMenu(options) {
14370
+ var _this8 = this;
14371
+
14372
+ // Menu required
14373
+ if (!is$1.element(this.elements.settings.panels.speed)) {
14374
+ return;
14375
+ }
14376
+
14377
+ var type = 'speed';
14378
+ var list = this.elements.settings.panels.speed.querySelector('[role="menu"]'); // Set the speed options
14379
+
14380
+ if (is$1.array(options)) {
14381
+ this.options.speed = options;
14382
+ } else if (this.isHTML5 || this.isVimeo) {
14383
+ this.options.speed = [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2];
14384
+ } // Set options if passed and filter based on config
14385
+
14386
+
14387
+ this.options.speed = this.options.speed.filter(function (speed) {
14388
+ return _this8.config.speed.options.includes(speed);
14389
+ }); // Toggle the pane and tab
14390
+
14391
+ var toggle = !is$1.empty(this.options.speed) && this.options.speed.length > 1;
14392
+ controls.toggleMenuButton.call(this, type, toggle); // Empty the menu
14393
+
14394
+ emptyElement(list); // Check if we need to toggle the parent
14395
+
14396
+ controls.checkMenu.call(this); // If we're hiding, nothing more to do
14397
+
14398
+ if (!toggle) {
14399
+ return;
14400
+ } // Create items
14401
+
14402
+
14403
+ this.options.speed.forEach(function (speed) {
14404
+ controls.createMenuItem.call(_this8, {
14405
+ value: speed,
14406
+ list: list,
14407
+ type: type,
14408
+ title: controls.getLabel.call(_this8, 'speed', speed)
14409
+ });
14410
+ });
14411
+ controls.updateSetting.call(this, type, list);
14412
+ },
14413
+ // Check if we need to hide/show the settings menu
14414
+ checkMenu: function checkMenu() {
14415
+ var buttons = this.elements.settings.buttons;
14416
+ var visible = !is$1.empty(buttons) && Object.values(buttons).some(function (button) {
14417
+ return !button.hidden;
14418
+ });
14419
+ toggleHidden(this.elements.settings.menu, !visible);
14420
+ },
14421
+ // Focus the first menu item in a given (or visible) menu
14422
+ focusFirstMenuItem: function focusFirstMenuItem(pane) {
14423
+ var tabFocus = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
14424
+
14425
+ if (this.elements.settings.popup.hidden) {
14426
+ return;
14427
+ }
14428
+
14429
+ var target = pane;
14430
+
14431
+ if (!is$1.element(target)) {
14432
+ target = Object.values(this.elements.settings.panels).find(function (p) {
14433
+ return !p.hidden;
14434
+ });
14435
+ }
14436
+
14437
+ var firstItem = target.querySelector('[role^="menuitem"]');
14438
+ setFocus.call(this, firstItem, tabFocus);
14439
+ },
14440
+ // Show/hide menu
14441
+ toggleMenu: function toggleMenu(input) {
14442
+ var popup = this.elements.settings.popup;
14443
+ var button = this.elements.buttons.settings; // Menu and button are required
14444
+
14445
+ if (!is$1.element(popup) || !is$1.element(button)) {
14446
+ return;
14447
+ } // True toggle by default
14448
+
14449
+
14450
+ var hidden = popup.hidden;
14451
+ var show = hidden;
14452
+
14453
+ if (is$1.boolean(input)) {
14454
+ show = input;
14455
+ } else if (is$1.keyboardEvent(input) && input.which === 27) {
14456
+ show = false;
14457
+ } else if (is$1.event(input)) {
14458
+ // If Plyr is in a shadowDOM, the event target is set to the component, instead of the
14459
+ // Element in the shadowDOM. The path, if available, is complete.
14460
+ var target = is$1.function(input.composedPath) ? input.composedPath()[0] : input.target;
14461
+ var isMenuItem = popup.contains(target); // If the click was inside the menu or if the click
14462
+ // wasn't the button or menu item and we're trying to
14463
+ // show the menu (a doc click shouldn't show the menu)
14464
+
14465
+ if (isMenuItem || !isMenuItem && input.target !== button && show) {
14466
+ return;
14467
+ }
14468
+ } // Set button attributes
14469
+
14470
+
14471
+ button.setAttribute('aria-expanded', show); // Show the actual popup
14472
+
14473
+ toggleHidden(popup, !show); // Add class hook
14474
+
14475
+ toggleClass(this.elements.container, this.config.classNames.menu.open, show); // Focus the first item if key interaction
14476
+
14477
+ if (show && is$1.keyboardEvent(input)) {
14478
+ controls.focusFirstMenuItem.call(this, null, true);
14479
+ } else if (!show && !hidden) {
14480
+ // If closing, re-focus the button
14481
+ setFocus.call(this, button, is$1.keyboardEvent(input));
14482
+ }
14483
+ },
14484
+ // Get the natural size of a menu panel
14485
+ getMenuSize: function getMenuSize(tab) {
14486
+ var clone = tab.cloneNode(true);
14487
+ clone.style.position = 'absolute';
14488
+ clone.style.opacity = 0;
14489
+ clone.removeAttribute('hidden'); // Append to parent so we get the "real" size
14490
+
14491
+ tab.parentNode.appendChild(clone); // Get the sizes before we remove
14492
+
14493
+ var width = clone.scrollWidth;
14494
+ var height = clone.scrollHeight; // Remove from the DOM
14495
+
14496
+ removeElement(clone);
14497
+ return {
14498
+ width: width,
14499
+ height: height
14500
+ };
14501
+ },
14502
+ // Show a panel in the menu
14503
+ showMenuPanel: function showMenuPanel() {
14504
+ var _this9 = this;
14505
+
14506
+ var type = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
14507
+ var tabFocus = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
14508
+ var target = this.elements.container.querySelector("#plyr-settings-".concat(this.id, "-").concat(type)); // Nothing to show, bail
14509
+
14510
+ if (!is$1.element(target)) {
14511
+ return;
14512
+ } // Hide all other panels
14513
+
14514
+
14515
+ var container = target.parentNode;
14516
+ var current = Array.from(container.children).find(function (node) {
14517
+ return !node.hidden;
14518
+ }); // If we can do fancy animations, we'll animate the height/width
14519
+
14520
+ if (support.transitions && !support.reducedMotion) {
14521
+ // Set the current width as a base
14522
+ container.style.width = "".concat(current.scrollWidth, "px");
14523
+ container.style.height = "".concat(current.scrollHeight, "px"); // Get potential sizes
14524
+
14525
+ var size = controls.getMenuSize.call(this, target); // Restore auto height/width
14526
+
14527
+ var restore = function restore(event) {
14528
+ // We're only bothered about height and width on the container
14529
+ if (event.target !== container || !['width', 'height'].includes(event.propertyName)) {
14530
+ return;
14531
+ } // Revert back to auto
14532
+
14533
+
14534
+ container.style.width = '';
14535
+ container.style.height = ''; // Only listen once
14536
+
14537
+ off.call(_this9, container, transitionEndEvent, restore);
14538
+ }; // Listen for the transition finishing and restore auto height/width
14539
+
14540
+
14541
+ on.call(this, container, transitionEndEvent, restore); // Set dimensions to target
14542
+
14543
+ container.style.width = "".concat(size.width, "px");
14544
+ container.style.height = "".concat(size.height, "px");
14545
+ } // Set attributes on current tab
14546
+
14547
+
14548
+ toggleHidden(current, true); // Set attributes on target
14549
+
14550
+ toggleHidden(target, false); // Focus the first item
14551
+
14552
+ controls.focusFirstMenuItem.call(this, target, tabFocus);
14553
+ },
14554
+ // Set the download URL
14555
+ setDownloadUrl: function setDownloadUrl() {
14556
+ var button = this.elements.buttons.download; // Bail if no button
14557
+
14558
+ if (!is$1.element(button)) {
14559
+ return;
14560
+ } // Set attribute
14561
+
14562
+
14563
+ button.setAttribute('href', this.download);
14564
+ },
14565
+ // Build the default HTML
14566
+ create: function create(data) {
14567
+ var _this10 = this;
14568
+
14569
+ var bindMenuItemShortcuts = controls.bindMenuItemShortcuts,
14570
+ createButton = controls.createButton,
14571
+ createProgress = controls.createProgress,
14572
+ createRange = controls.createRange,
14573
+ createTime = controls.createTime,
14574
+ setQualityMenu = controls.setQualityMenu,
14575
+ setSpeedMenu = controls.setSpeedMenu,
14576
+ showMenuPanel = controls.showMenuPanel;
14577
+ this.elements.controls = null; // Larger overlaid play button
14578
+
14579
+ if (this.config.controls.includes('play-large')) {
14580
+ this.elements.container.appendChild(createButton.call(this, 'play-large'));
14581
+ } // Create the container
14582
+
14583
+
14584
+ var container = createElement('div', getAttributesFromSelector(this.config.selectors.controls.wrapper));
14585
+ this.elements.controls = container; // Default item attributes
14586
+
14587
+ var defaultAttributes = {
14588
+ class: 'plyr__controls__item'
14589
+ }; // Loop through controls in order
14590
+
14591
+ dedupe(this.config.controls).forEach(function (control) {
14592
+ // Restart button
14593
+ if (control === 'restart') {
14594
+ container.appendChild(createButton.call(_this10, 'restart', defaultAttributes));
14595
+ } // Rewind button
14596
+
14597
+
14598
+ if (control === 'rewind') {
14599
+ container.appendChild(createButton.call(_this10, 'rewind', defaultAttributes));
14600
+ } // Play/Pause button
14601
+
14602
+
14603
+ if (control === 'play') {
14604
+ container.appendChild(createButton.call(_this10, 'play', defaultAttributes));
14605
+ } // Fast forward button
14606
+
14607
+
14608
+ if (control === 'fast-forward') {
14609
+ container.appendChild(createButton.call(_this10, 'fast-forward', defaultAttributes));
14610
+ } // Progress
14611
+
14612
+
14613
+ if (control === 'progress') {
14614
+ var progressContainer = createElement('div', {
14615
+ class: "".concat(defaultAttributes.class, " plyr__progress__container")
14616
+ });
14617
+ var progress = createElement('div', getAttributesFromSelector(_this10.config.selectors.progress)); // Seek range slider
14618
+
14619
+ progress.appendChild(createRange.call(_this10, 'seek', {
14620
+ id: "plyr-seek-".concat(data.id)
14621
+ })); // Buffer progress
14622
+
14623
+ progress.appendChild(createProgress.call(_this10, 'buffer')); // TODO: Add loop display indicator
14624
+ // Seek tooltip
14625
+
14626
+ if (_this10.config.tooltips.seek) {
14627
+ var tooltip = createElement('span', {
14628
+ class: _this10.config.classNames.tooltip
14629
+ }, '00:00');
14630
+ progress.appendChild(tooltip);
14631
+ _this10.elements.display.seekTooltip = tooltip;
14632
+ }
14633
+
14634
+ _this10.elements.progress = progress;
14635
+ progressContainer.appendChild(_this10.elements.progress);
14636
+ container.appendChild(progressContainer);
14637
+ } // Media current time display
14638
+
14639
+
14640
+ if (control === 'current-time') {
14641
+ container.appendChild(createTime.call(_this10, 'currentTime', defaultAttributes));
14642
+ } // Media duration display
14643
+
14644
+
14645
+ if (control === 'duration') {
14646
+ container.appendChild(createTime.call(_this10, 'duration', defaultAttributes));
14647
+ } // Volume controls
14648
+
14649
+
14650
+ if (control === 'mute' || control === 'volume') {
14651
+ var volume = _this10.elements.volume; // Create the volume container if needed
14652
+
14653
+ if (!is$1.element(volume) || !container.contains(volume)) {
14654
+ volume = createElement('div', extend({}, defaultAttributes, {
14655
+ class: "".concat(defaultAttributes.class, " plyr__volume").trim()
14656
+ }));
14657
+ _this10.elements.volume = volume;
14658
+ container.appendChild(volume);
14659
+ } // Toggle mute button
14660
+
14661
+
14662
+ if (control === 'mute') {
14663
+ volume.appendChild(createButton.call(_this10, 'mute'));
14664
+ } // Volume range control
14665
+
14666
+
14667
+ if (control === 'volume') {
14668
+ // Set the attributes
14669
+ var attributes = {
14670
+ max: 1,
14671
+ step: 0.05,
14672
+ value: _this10.config.volume
14673
+ }; // Create the volume range slider
14674
+
14675
+ volume.appendChild(createRange.call(_this10, 'volume', extend(attributes, {
14676
+ id: "plyr-volume-".concat(data.id)
14677
+ })));
14678
+ }
14679
+ } // Toggle captions button
14680
+
14681
+
14682
+ if (control === 'captions') {
14683
+ container.appendChild(createButton.call(_this10, 'captions', defaultAttributes));
14684
+ } // Settings button / menu
14685
+
14686
+
14687
+ if (control === 'settings' && !is$1.empty(_this10.config.settings)) {
14688
+ var wrapper = createElement('div', extend({}, defaultAttributes, {
14689
+ class: "".concat(defaultAttributes.class, " plyr__menu").trim(),
14690
+ hidden: ''
14691
+ }));
14692
+ wrapper.appendChild(createButton.call(_this10, 'settings', {
14693
+ 'aria-haspopup': true,
14694
+ 'aria-controls': "plyr-settings-".concat(data.id),
14695
+ 'aria-expanded': false
14696
+ }));
14697
+ var popup = createElement('div', {
14698
+ class: 'plyr__menu__container',
14699
+ id: "plyr-settings-".concat(data.id),
14700
+ hidden: ''
14701
+ });
14702
+ var inner = createElement('div');
14703
+ var home = createElement('div', {
14704
+ id: "plyr-settings-".concat(data.id, "-home")
14705
+ }); // Create the menu
14706
+
14707
+ var menu = createElement('div', {
14708
+ role: 'menu'
14709
+ });
14710
+ home.appendChild(menu);
14711
+ inner.appendChild(home);
14712
+ _this10.elements.settings.panels.home = home; // Build the menu items
14713
+
14714
+ _this10.config.settings.forEach(function (type) {
14715
+ // TODO: bundle this with the createMenuItem helper and bindings
14716
+ var menuItem = createElement('button', extend(getAttributesFromSelector(_this10.config.selectors.buttons.settings), {
14717
+ type: 'button',
14718
+ class: "".concat(_this10.config.classNames.control, " ").concat(_this10.config.classNames.control, "--forward"),
14719
+ role: 'menuitem',
14720
+ 'aria-haspopup': true,
14721
+ hidden: ''
14722
+ })); // Bind menu shortcuts for keyboard users
14723
+
14724
+ bindMenuItemShortcuts.call(_this10, menuItem, type); // Show menu on click
14725
+
14726
+ on(menuItem, 'click', function () {
14727
+ showMenuPanel.call(_this10, type, false);
14728
+ });
14729
+ var flex = createElement('span', null, i18n.get(type, _this10.config));
14730
+ var value = createElement('span', {
14731
+ class: _this10.config.classNames.menu.value
14732
+ }); // Speed contains HTML entities
14733
+
14734
+ value.innerHTML = data[type];
14735
+ flex.appendChild(value);
14736
+ menuItem.appendChild(flex);
14737
+ menu.appendChild(menuItem); // Build the panes
14738
+
14739
+ var pane = createElement('div', {
14740
+ id: "plyr-settings-".concat(data.id, "-").concat(type),
14741
+ hidden: ''
14742
+ }); // Back button
14743
+
14744
+ var backButton = createElement('button', {
14745
+ type: 'button',
14746
+ class: "".concat(_this10.config.classNames.control, " ").concat(_this10.config.classNames.control, "--back")
14747
+ }); // Visible label
14748
+
14749
+ backButton.appendChild(createElement('span', {
14750
+ 'aria-hidden': true
14751
+ }, i18n.get(type, _this10.config))); // Screen reader label
14752
+
14753
+ backButton.appendChild(createElement('span', {
14754
+ class: _this10.config.classNames.hidden
14755
+ }, i18n.get('menuBack', _this10.config))); // Go back via keyboard
14756
+
14757
+ on(pane, 'keydown', function (event) {
14758
+ // We only care about <-
14759
+ if (event.which !== 37) {
14760
+ return;
14761
+ } // Prevent seek
14762
+
14763
+
14764
+ event.preventDefault();
14765
+ event.stopPropagation(); // Show the respective menu
14766
+
14767
+ showMenuPanel.call(_this10, 'home', true);
14768
+ }, false); // Go back via button click
14769
+
14770
+ on(backButton, 'click', function () {
14771
+ showMenuPanel.call(_this10, 'home', false);
14772
+ }); // Add to pane
14773
+
14774
+ pane.appendChild(backButton); // Menu
14775
+
14776
+ pane.appendChild(createElement('div', {
14777
+ role: 'menu'
14778
+ }));
14779
+ inner.appendChild(pane);
14780
+ _this10.elements.settings.buttons[type] = menuItem;
14781
+ _this10.elements.settings.panels[type] = pane;
14782
+ });
14783
+
14784
+ popup.appendChild(inner);
14785
+ wrapper.appendChild(popup);
14786
+ container.appendChild(wrapper);
14787
+ _this10.elements.settings.popup = popup;
14788
+ _this10.elements.settings.menu = wrapper;
14789
+ } // Picture in picture button
14790
+
14791
+
14792
+ if (control === 'pip' && support.pip) {
14793
+ container.appendChild(createButton.call(_this10, 'pip', defaultAttributes));
14794
+ } // Airplay button
14795
+
14796
+
14797
+ if (control === 'airplay' && support.airplay) {
14798
+ container.appendChild(createButton.call(_this10, 'airplay', defaultAttributes));
14799
+ } // Download button
14800
+
14801
+
14802
+ if (control === 'download') {
14803
+ var _attributes = extend({}, defaultAttributes, {
14804
+ element: 'a',
14805
+ href: _this10.download,
14806
+ target: '_blank'
14807
+ });
14808
+
14809
+ var download = _this10.config.urls.download;
14810
+
14811
+ if (!is$1.url(download) && _this10.isEmbed) {
14812
+ extend(_attributes, {
14813
+ icon: "logo-".concat(_this10.provider),
14814
+ label: _this10.provider
14815
+ });
14816
+ }
14817
+
14818
+ container.appendChild(createButton.call(_this10, 'download', _attributes));
14819
+ } // Toggle fullscreen button
14820
+
14821
+
14822
+ if (control === 'fullscreen') {
14823
+ container.appendChild(createButton.call(_this10, 'fullscreen', defaultAttributes));
14824
+ }
14825
+ }); // Set available quality levels
14826
+
14827
+ if (this.isHTML5) {
14828
+ setQualityMenu.call(this, html5.getQualityOptions.call(this));
14829
+ }
14830
+
14831
+ setSpeedMenu.call(this);
14832
+ return container;
14833
+ },
14834
+ // Insert controls
14835
+ inject: function inject() {
14836
+ var _this11 = this;
14837
+
14838
+ // Sprite
14839
+ if (this.config.loadSprite) {
14840
+ var icon = controls.getIconUrl.call(this); // Only load external sprite using AJAX
14841
+
14842
+ if (icon.cors) {
14843
+ loadSprite(icon.url, 'sprite-plyr');
14844
+ }
14845
+ } // Create a unique ID
14846
+
14847
+
14848
+ this.id = Math.floor(Math.random() * 10000); // Null by default
14849
+
14850
+ var container = null;
14851
+ this.elements.controls = null; // Set template properties
14852
+
14853
+ var props = {
14854
+ id: this.id,
14855
+ seektime: this.config.seekTime,
14856
+ title: this.config.title
14857
+ };
14858
+ var update = true; // If function, run it and use output
14859
+
14860
+ if (is$1.function(this.config.controls)) {
14861
+ this.config.controls = this.config.controls.call(this, props);
14862
+ } // Convert falsy controls to empty array (primarily for empty strings)
14863
+
14864
+
14865
+ if (!this.config.controls) {
14866
+ this.config.controls = [];
14867
+ }
14868
+
14869
+ if (is$1.element(this.config.controls) || is$1.string(this.config.controls)) {
14870
+ // HTMLElement or Non-empty string passed as the option
14871
+ container = this.config.controls;
14872
+ } else {
14873
+ // Create controls
14874
+ container = controls.create.call(this, {
14875
+ id: this.id,
14876
+ seektime: this.config.seekTime,
14877
+ speed: this.speed,
14878
+ quality: this.quality,
14879
+ captions: captions.getLabel.call(this) // TODO: Looping
14880
+ // loop: 'None',
14881
+
14882
+ });
14883
+ update = false;
14884
+ } // Replace props with their value
14885
+
14886
+
14887
+ var replace = function replace(input) {
14888
+ var result = input;
14889
+ Object.entries(props).forEach(function (_ref2) {
14890
+ var _ref3 = _slicedToArray(_ref2, 2),
14891
+ key = _ref3[0],
14892
+ value = _ref3[1];
14893
+
14894
+ result = replaceAll(result, "{".concat(key, "}"), value);
14895
+ });
14896
+ return result;
14897
+ }; // Update markup
14898
+
14899
+
14900
+ if (update) {
14901
+ if (is$1.string(this.config.controls)) {
14902
+ container = replace(container);
14903
+ } else if (is$1.element(container)) {
14904
+ container.innerHTML = replace(container.innerHTML);
14905
+ }
14906
+ } // Controls container
14907
+
14908
+
14909
+ var target; // Inject to custom location
14910
+
14911
+ if (is$1.string(this.config.selectors.controls.container)) {
14912
+ target = document.querySelector(this.config.selectors.controls.container);
14913
+ } // Inject into the container by default
14914
+
14915
+
14916
+ if (!is$1.element(target)) {
14917
+ target = this.elements.container;
14918
+ } // Inject controls HTML (needs to be before captions, hence "afterbegin")
14919
+
14920
+
14921
+ var insertMethod = is$1.element(container) ? 'insertAdjacentElement' : 'insertAdjacentHTML';
14922
+ target[insertMethod]('afterbegin', container); // Find the elements if need be
14923
+
14924
+ if (!is$1.element(this.elements.controls)) {
14925
+ controls.findElements.call(this);
14926
+ } // Add pressed property to buttons
14927
+
14928
+
14929
+ if (!is$1.empty(this.elements.buttons)) {
14930
+ var addProperty = function addProperty(button) {
14931
+ var className = _this11.config.classNames.controlPressed;
14932
+ Object.defineProperty(button, 'pressed', {
14933
+ enumerable: true,
14934
+ get: function get() {
14935
+ return hasClass(button, className);
14936
+ },
14937
+ set: function set() {
14938
+ var pressed = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
14939
+ toggleClass(button, className, pressed);
14940
+ }
14941
+ });
14942
+ }; // Toggle classname when pressed property is set
14943
+
14944
+
14945
+ Object.values(this.elements.buttons).filter(Boolean).forEach(function (button) {
14946
+ if (is$1.array(button) || is$1.nodeList(button)) {
14947
+ Array.from(button).filter(Boolean).forEach(addProperty);
14948
+ } else {
14949
+ addProperty(button);
14950
+ }
14951
+ });
14952
+ } // Edge sometimes doesn't finish the paint so force a repaint
14953
+
14954
+
14955
+ if (browser.isEdge) {
14956
+ repaint(target);
14957
+ } // Setup tooltips
14958
+
14959
+
14960
+ if (this.config.tooltips.controls) {
14961
+ var _this$config = this.config,
14962
+ classNames = _this$config.classNames,
14963
+ selectors = _this$config.selectors;
14964
+ var selector = "".concat(selectors.controls.wrapper, " ").concat(selectors.labels, " .").concat(classNames.hidden);
14965
+ var labels = getElements.call(this, selector);
14966
+ Array.from(labels).forEach(function (label) {
14967
+ toggleClass(label, _this11.config.classNames.hidden, false);
14968
+ toggleClass(label, _this11.config.classNames.tooltip, true);
14969
+ });
14970
+ }
14971
+ }
14972
+ };
14973
+
14974
+ /**
14975
+ * Parse a string to a URL object
14976
+ * @param {String} input - the URL to be parsed
14977
+ * @param {Boolean} safe - failsafe parsing
14978
+ */
14979
+
14980
+ function parseUrl(input) {
14981
+ var safe = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
14982
+ var url = input;
14983
+
14984
+ if (safe) {
14985
+ var parser = document.createElement('a');
14986
+ parser.href = url;
14987
+ url = parser.href;
14988
+ }
14989
+
14990
+ try {
14991
+ return new URL(url);
14992
+ } catch (e) {
14993
+ return null;
14994
+ }
14995
+ } // Convert object to URLSearchParams
14996
+
14997
+ function buildUrlParams(input) {
14998
+ var params = new URLSearchParams();
14999
+
15000
+ if (is$1.object(input)) {
15001
+ Object.entries(input).forEach(function (_ref) {
15002
+ var _ref2 = _slicedToArray(_ref, 2),
15003
+ key = _ref2[0],
15004
+ value = _ref2[1];
15005
+
15006
+ params.set(key, value);
15007
+ });
15008
+ }
15009
+
15010
+ return params;
15011
+ }
15012
+
15013
+ var captions = {
15014
+ // Setup captions
15015
+ setup: function setup() {
15016
+ // Requires UI support
15017
+ if (!this.supported.ui) {
15018
+ return;
15019
+ } // Only Vimeo and HTML5 video supported at this point
15020
+
15021
+
15022
+ if (!this.isVideo || this.isYouTube || this.isHTML5 && !support.textTracks) {
15023
+ // Clear menu and hide
15024
+ if (is$1.array(this.config.controls) && this.config.controls.includes('settings') && this.config.settings.includes('captions')) {
15025
+ controls.setCaptionsMenu.call(this);
15026
+ }
15027
+
15028
+ return;
15029
+ } // Inject the container
15030
+
15031
+
15032
+ if (!is$1.element(this.elements.captions)) {
15033
+ this.elements.captions = createElement('div', getAttributesFromSelector(this.config.selectors.captions));
15034
+ insertAfter(this.elements.captions, this.elements.wrapper);
15035
+ } // Fix IE captions if CORS is used
15036
+ // Fetch captions and inject as blobs instead (data URIs not supported!)
15037
+
15038
+
15039
+ if (browser.isIE && window.URL) {
15040
+ var elements = this.media.querySelectorAll('track');
15041
+ Array.from(elements).forEach(function (track) {
15042
+ var src = track.getAttribute('src');
15043
+ var url = parseUrl(src);
15044
+
15045
+ if (url !== null && url.hostname !== window.location.href.hostname && ['http:', 'https:'].includes(url.protocol)) {
15046
+ fetch(src, 'blob').then(function (blob) {
15047
+ track.setAttribute('src', window.URL.createObjectURL(blob));
15048
+ }).catch(function () {
15049
+ removeElement(track);
15050
+ });
15051
+ }
15052
+ });
15053
+ } // Get and set initial data
15054
+ // The "preferred" options are not realized unless / until the wanted language has a match
15055
+ // * languages: Array of user's browser languages.
15056
+ // * language: The language preferred by user settings or config
15057
+ // * active: The state preferred by user settings or config
15058
+ // * toggled: The real captions state
15059
+
15060
+
15061
+ var browserLanguages = navigator.languages || [navigator.language || navigator.userLanguage || 'en'];
15062
+ var languages = dedupe(browserLanguages.map(function (language) {
15063
+ return language.split('-')[0];
15064
+ }));
15065
+ var language = (this.storage.get('language') || this.config.captions.language || 'auto').toLowerCase(); // Use first browser language when language is 'auto'
15066
+
15067
+ if (language === 'auto') {
15068
+ var _languages = _slicedToArray(languages, 1);
15069
+
15070
+ language = _languages[0];
15071
+ }
15072
+
15073
+ var active = this.storage.get('captions');
15074
+
15075
+ if (!is$1.boolean(active)) {
15076
+ active = this.config.captions.active;
15077
+ }
15078
+
15079
+ Object.assign(this.captions, {
15080
+ toggled: false,
15081
+ active: active,
15082
+ language: language,
15083
+ languages: languages
15084
+ }); // Watch changes to textTracks and update captions menu
15085
+
15086
+ if (this.isHTML5) {
15087
+ var trackEvents = this.config.captions.update ? 'addtrack removetrack' : 'removetrack';
15088
+ on.call(this, this.media.textTracks, trackEvents, captions.update.bind(this));
15089
+ } // Update available languages in list next tick (the event must not be triggered before the listeners)
15090
+
15091
+
15092
+ setTimeout(captions.update.bind(this), 0);
15093
+ },
15094
+ // Update available language options in settings based on tracks
15095
+ update: function update() {
15096
+ var _this = this;
15097
+
15098
+ var tracks = captions.getTracks.call(this, true); // Get the wanted language
15099
+
15100
+ var _this$captions = this.captions,
15101
+ active = _this$captions.active,
15102
+ language = _this$captions.language,
15103
+ meta = _this$captions.meta,
15104
+ currentTrackNode = _this$captions.currentTrackNode;
15105
+ var languageExists = Boolean(tracks.find(function (track) {
15106
+ return track.language === language;
15107
+ })); // Handle tracks (add event listener and "pseudo"-default)
15108
+
15109
+ if (this.isHTML5 && this.isVideo) {
15110
+ tracks.filter(function (track) {
15111
+ return !meta.get(track);
15112
+ }).forEach(function (track) {
15113
+ _this.debug.log('Track added', track); // Attempt to store if the original dom element was "default"
15114
+
15115
+
15116
+ meta.set(track, {
15117
+ default: track.mode === 'showing'
15118
+ }); // Turn off native caption rendering to avoid double captions
15119
+ // eslint-disable-next-line no-param-reassign
15120
+
15121
+ track.mode = 'hidden'; // Add event listener for cue changes
15122
+
15123
+ on.call(_this, track, 'cuechange', function () {
15124
+ return captions.updateCues.call(_this);
15125
+ });
15126
+ });
15127
+ } // Update language first time it matches, or if the previous matching track was removed
15128
+
15129
+
15130
+ if (languageExists && this.language !== language || !tracks.includes(currentTrackNode)) {
15131
+ captions.setLanguage.call(this, language);
15132
+ captions.toggle.call(this, active && languageExists);
15133
+ } // Enable or disable captions based on track length
15134
+
15135
+
15136
+ toggleClass(this.elements.container, this.config.classNames.captions.enabled, !is$1.empty(tracks)); // Update available languages in list
15137
+
15138
+ if ((this.config.controls || []).includes('settings') && this.config.settings.includes('captions')) {
15139
+ controls.setCaptionsMenu.call(this);
15140
+ }
15141
+ },
15142
+ // Toggle captions display
15143
+ // Used internally for the toggleCaptions method, with the passive option forced to false
15144
+ toggle: function toggle(input) {
15145
+ var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
15146
+
15147
+ // If there's no full support
15148
+ if (!this.supported.ui) {
15149
+ return;
15150
+ }
15151
+
15152
+ var toggled = this.captions.toggled; // Current state
15153
+
15154
+ var activeClass = this.config.classNames.captions.active; // Get the next state
15155
+ // If the method is called without parameter, toggle based on current value
15156
+
15157
+ var active = is$1.nullOrUndefined(input) ? !toggled : input; // Update state and trigger event
15158
+
15159
+ if (active !== toggled) {
15160
+ // When passive, don't override user preferences
15161
+ if (!passive) {
15162
+ this.captions.active = active;
15163
+ this.storage.set({
15164
+ captions: active
15165
+ });
15166
+ } // Force language if the call isn't passive and there is no matching language to toggle to
15167
+
15168
+
15169
+ if (!this.language && active && !passive) {
15170
+ var tracks = captions.getTracks.call(this);
15171
+ var track = captions.findTrack.call(this, [this.captions.language].concat(_toConsumableArray(this.captions.languages)), true); // Override user preferences to avoid switching languages if a matching track is added
15172
+
15173
+ this.captions.language = track.language; // Set caption, but don't store in localStorage as user preference
15174
+
15175
+ captions.set.call(this, tracks.indexOf(track));
15176
+ return;
15177
+ } // Toggle button if it's enabled
15178
+
15179
+
15180
+ if (this.elements.buttons.captions) {
15181
+ this.elements.buttons.captions.pressed = active;
15182
+ } // Add class hook
15183
+
15184
+
15185
+ toggleClass(this.elements.container, activeClass, active);
15186
+ this.captions.toggled = active; // Update settings menu
15187
+
15188
+ controls.updateSetting.call(this, 'captions'); // Trigger event (not used internally)
15189
+
15190
+ triggerEvent.call(this, this.media, active ? 'captionsenabled' : 'captionsdisabled');
15191
+ }
15192
+ },
15193
+ // Set captions by track index
15194
+ // Used internally for the currentTrack setter with the passive option forced to false
15195
+ set: function set(index) {
15196
+ var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
15197
+ var tracks = captions.getTracks.call(this); // Disable captions if setting to -1
15198
+
15199
+ if (index === -1) {
15200
+ captions.toggle.call(this, false, passive);
15201
+ return;
15202
+ }
15203
+
15204
+ if (!is$1.number(index)) {
15205
+ this.debug.warn('Invalid caption argument', index);
15206
+ return;
15207
+ }
15208
+
15209
+ if (!(index in tracks)) {
15210
+ this.debug.warn('Track not found', index);
15211
+ return;
15212
+ }
15213
+
15214
+ if (this.captions.currentTrack !== index) {
15215
+ this.captions.currentTrack = index;
15216
+ var track = tracks[index];
15217
+
15218
+ var _ref = track || {},
15219
+ language = _ref.language; // Store reference to node for invalidation on remove
15220
+
15221
+
15222
+ this.captions.currentTrackNode = track; // Update settings menu
15223
+
15224
+ controls.updateSetting.call(this, 'captions'); // When passive, don't override user preferences
15225
+
15226
+ if (!passive) {
15227
+ this.captions.language = language;
15228
+ this.storage.set({
15229
+ language: language
15230
+ });
15231
+ } // Handle Vimeo captions
15232
+
15233
+
15234
+ if (this.isVimeo) {
15235
+ this.embed.enableTextTrack(language);
15236
+ } // Trigger event
15237
+
15238
+
15239
+ triggerEvent.call(this, this.media, 'languagechange');
15240
+ } // Show captions
15241
+
15242
+
15243
+ captions.toggle.call(this, true, passive);
15244
+
15245
+ if (this.isHTML5 && this.isVideo) {
15246
+ // If we change the active track while a cue is already displayed we need to update it
15247
+ captions.updateCues.call(this);
15248
+ }
15249
+ },
15250
+ // Set captions by language
15251
+ // Used internally for the language setter with the passive option forced to false
15252
+ setLanguage: function setLanguage(input) {
15253
+ var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
15254
+
15255
+ if (!is$1.string(input)) {
15256
+ this.debug.warn('Invalid language argument', input);
15257
+ return;
15258
+ } // Normalize
15259
+
15260
+
15261
+ var language = input.toLowerCase();
15262
+ this.captions.language = language; // Set currentTrack
15263
+
15264
+ var tracks = captions.getTracks.call(this);
15265
+ var track = captions.findTrack.call(this, [language]);
15266
+ captions.set.call(this, tracks.indexOf(track), passive);
15267
+ },
15268
+ // Get current valid caption tracks
15269
+ // If update is false it will also ignore tracks without metadata
15270
+ // This is used to "freeze" the language options when captions.update is false
15271
+ getTracks: function getTracks() {
15272
+ var _this2 = this;
15273
+
15274
+ var update = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
15275
+ // Handle media or textTracks missing or null
15276
+ var tracks = Array.from((this.media || {}).textTracks || []); // For HTML5, use cache instead of current tracks when it exists (if captions.update is false)
15277
+ // Filter out removed tracks and tracks that aren't captions/subtitles (for example metadata)
15278
+
15279
+ return tracks.filter(function (track) {
15280
+ return !_this2.isHTML5 || update || _this2.captions.meta.has(track);
15281
+ }).filter(function (track) {
15282
+ return ['captions', 'subtitles'].includes(track.kind);
15283
+ });
15284
+ },
15285
+ // Match tracks based on languages and get the first
15286
+ findTrack: function findTrack(languages) {
15287
+ var _this3 = this;
15288
+
15289
+ var force = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
15290
+ var tracks = captions.getTracks.call(this);
15291
+
15292
+ var sortIsDefault = function sortIsDefault(track) {
15293
+ return Number((_this3.captions.meta.get(track) || {}).default);
15294
+ };
15295
+
15296
+ var sorted = Array.from(tracks).sort(function (a, b) {
15297
+ return sortIsDefault(b) - sortIsDefault(a);
15298
+ });
15299
+ var track;
15300
+ languages.every(function (language) {
15301
+ track = sorted.find(function (t) {
15302
+ return t.language === language;
15303
+ });
15304
+ return !track; // Break iteration if there is a match
15305
+ }); // If no match is found but is required, get first
15306
+
15307
+ return track || (force ? sorted[0] : undefined);
15308
+ },
15309
+ // Get the current track
15310
+ getCurrentTrack: function getCurrentTrack() {
15311
+ return captions.getTracks.call(this)[this.currentTrack];
15312
+ },
15313
+ // Get UI label for track
15314
+ getLabel: function getLabel(track) {
15315
+ var currentTrack = track;
15316
+
15317
+ if (!is$1.track(currentTrack) && support.textTracks && this.captions.toggled) {
15318
+ currentTrack = captions.getCurrentTrack.call(this);
15319
+ }
15320
+
15321
+ if (is$1.track(currentTrack)) {
15322
+ if (!is$1.empty(currentTrack.label)) {
15323
+ return currentTrack.label;
15324
+ }
15325
+
15326
+ if (!is$1.empty(currentTrack.language)) {
15327
+ return track.language.toUpperCase();
15328
+ }
15329
+
15330
+ return i18n.get('enabled', this.config);
15331
+ }
15332
+
15333
+ return i18n.get('disabled', this.config);
15334
+ },
15335
+ // Update captions using current track's active cues
15336
+ // Also optional array argument in case there isn't any track (ex: vimeo)
15337
+ updateCues: function updateCues(input) {
15338
+ // Requires UI
15339
+ if (!this.supported.ui) {
15340
+ return;
15341
+ }
15342
+
15343
+ if (!is$1.element(this.elements.captions)) {
15344
+ this.debug.warn('No captions element to render to');
15345
+ return;
15346
+ } // Only accept array or empty input
15347
+
15348
+
15349
+ if (!is$1.nullOrUndefined(input) && !Array.isArray(input)) {
15350
+ this.debug.warn('updateCues: Invalid input', input);
15351
+ return;
15352
+ }
15353
+
15354
+ var cues = input; // Get cues from track
15355
+
15356
+ if (!cues) {
15357
+ var track = captions.getCurrentTrack.call(this);
15358
+ cues = Array.from((track || {}).activeCues || []).map(function (cue) {
15359
+ return cue.getCueAsHTML();
15360
+ }).map(getHTML);
15361
+ } // Set new caption text
15362
+
15363
+
15364
+ var content = cues.map(function (cueText) {
15365
+ return cueText.trim();
15366
+ }).join('\n');
15367
+ var changed = content !== this.elements.captions.innerHTML;
15368
+
15369
+ if (changed) {
15370
+ // Empty the container and create a new child element
15371
+ emptyElement(this.elements.captions);
15372
+ var caption = createElement('span', getAttributesFromSelector(this.config.selectors.caption));
15373
+ caption.innerHTML = content;
15374
+ this.elements.captions.appendChild(caption); // Trigger event
15375
+
15376
+ triggerEvent.call(this, this.media, 'cuechange');
15377
+ }
15378
+ }
15379
+ };
15380
+
15381
+ // ==========================================================================
15382
+ // Plyr default config
15383
+ // ==========================================================================
15384
+ var defaults$1 = {
15385
+ // Disable
15386
+ enabled: true,
15387
+ // Custom media title
15388
+ title: '',
15389
+ // Logging to console
15390
+ debug: false,
15391
+ // Auto play (if supported)
15392
+ autoplay: false,
15393
+ // Only allow one media playing at once (vimeo only)
15394
+ autopause: true,
15395
+ // Allow inline playback on iOS (this effects YouTube/Vimeo - HTML5 requires the attribute present)
15396
+ // TODO: Remove iosNative fullscreen option in favour of this (logic needs work)
15397
+ playsinline: true,
15398
+ // Default time to skip when rewind/fast forward
15399
+ seekTime: 10,
15400
+ // Default volume
15401
+ volume: 1,
15402
+ muted: false,
15403
+ // Pass a custom duration
15404
+ duration: null,
15405
+ // Display the media duration on load in the current time position
15406
+ // If you have opted to display both duration and currentTime, this is ignored
15407
+ displayDuration: true,
15408
+ // Invert the current time to be a countdown
15409
+ invertTime: true,
15410
+ // Clicking the currentTime inverts it's value to show time left rather than elapsed
15411
+ toggleInvert: true,
15412
+ // Force an aspect ratio
15413
+ // The format must be `'w:h'` (e.g. `'16:9'`)
15414
+ ratio: null,
15415
+ // Click video container to play/pause
15416
+ clickToPlay: true,
15417
+ // Auto hide the controls
15418
+ hideControls: true,
15419
+ // Reset to start when playback ended
15420
+ resetOnEnd: false,
15421
+ // Disable the standard context menu
15422
+ disableContextMenu: true,
15423
+ // Sprite (for icons)
15424
+ loadSprite: true,
15425
+ iconPrefix: 'plyr',
15426
+ iconUrl: 'https://cdn.plyr.io/3.5.6/plyr.svg',
15427
+ // Blank video (used to prevent errors on source change)
15428
+ blankVideo: 'https://cdn.plyr.io/static/blank.mp4',
15429
+ // Quality default
15430
+ quality: {
15431
+ default: 576,
15432
+ options: [4320, 2880, 2160, 1440, 1080, 720, 576, 480, 360, 240]
15433
+ },
15434
+ // Set loops
15435
+ loop: {
15436
+ active: false // start: null,
15437
+ // end: null,
15438
+
15439
+ },
15440
+ // Speed default and options to display
15441
+ speed: {
15442
+ selected: 1,
15443
+ options: [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2]
15444
+ },
15445
+ // Keyboard shortcut settings
15446
+ keyboard: {
15447
+ focused: true,
15448
+ global: false
15449
+ },
15450
+ // Display tooltips
15451
+ tooltips: {
15452
+ controls: false,
15453
+ seek: true
15454
+ },
15455
+ // Captions settings
15456
+ captions: {
15457
+ active: false,
15458
+ language: 'auto',
15459
+ // Listen to new tracks added after Plyr is initialized.
15460
+ // This is needed for streaming captions, but may result in unselectable options
15461
+ update: false
15462
+ },
15463
+ // Fullscreen settings
15464
+ fullscreen: {
15465
+ enabled: true,
15466
+ // Allow fullscreen?
15467
+ fallback: true,
15468
+ // Fallback using full viewport/window
15469
+ iosNative: false // Use the native fullscreen in iOS (disables custom controls)
15470
+
15471
+ },
15472
+ // Local storage
15473
+ storage: {
15474
+ enabled: true,
15475
+ key: 'plyr'
15476
+ },
15477
+ // Default controls
15478
+ controls: ['play-large', // 'restart',
15479
+ // 'rewind',
15480
+ 'play', // 'fast-forward',
15481
+ 'progress', 'current-time', // 'duration',
15482
+ 'mute', 'volume', 'captions', 'settings', 'pip', 'airplay', // 'download',
15483
+ 'fullscreen'],
15484
+ settings: ['captions', 'quality', 'speed'],
15485
+ // Localisation
15486
+ i18n: {
15487
+ restart: 'Restart',
15488
+ rewind: 'Rewind {seektime}s',
15489
+ play: 'Play',
15490
+ pause: 'Pause',
15491
+ fastForward: 'Forward {seektime}s',
15492
+ seek: 'Seek',
15493
+ seekLabel: '{currentTime} of {duration}',
15494
+ played: 'Played',
15495
+ buffered: 'Buffered',
15496
+ currentTime: 'Current time',
15497
+ duration: 'Duration',
15498
+ volume: 'Volume',
15499
+ mute: 'Mute',
15500
+ unmute: 'Unmute',
15501
+ enableCaptions: 'Enable captions',
15502
+ disableCaptions: 'Disable captions',
15503
+ download: 'Download',
15504
+ enterFullscreen: 'Enter fullscreen',
15505
+ exitFullscreen: 'Exit fullscreen',
15506
+ frameTitle: 'Player for {title}',
15507
+ captions: 'Captions',
15508
+ settings: 'Settings',
15509
+ menuBack: 'Go back to previous menu',
15510
+ speed: 'Speed',
15511
+ normal: 'Normal',
15512
+ quality: 'Quality',
15513
+ loop: 'Loop',
15514
+ start: 'Start',
15515
+ end: 'End',
15516
+ all: 'All',
15517
+ reset: 'Reset',
15518
+ disabled: 'Disabled',
15519
+ enabled: 'Enabled',
15520
+ advertisement: 'Ad',
15521
+ qualityBadge: {
15522
+ 2160: '4K',
15523
+ 1440: 'HD',
15524
+ 1080: 'HD',
15525
+ 720: 'HD',
15526
+ 576: 'SD',
15527
+ 480: 'SD'
15528
+ }
15529
+ },
15530
+ // URLs
15531
+ urls: {
15532
+ download: null,
15533
+ vimeo: {
15534
+ sdk: 'https://player.vimeo.com/api/player.js',
15535
+ iframe: 'https://player.vimeo.com/video/{0}?{1}',
15536
+ api: 'https://vimeo.com/api/v2/video/{0}.json'
15537
+ },
15538
+ youtube: {
15539
+ sdk: 'https://www.youtube.com/iframe_api',
15540
+ api: 'https://noembed.com/embed?url=https://www.youtube.com/watch?v={0}'
15541
+ },
15542
+ googleIMA: {
15543
+ sdk: 'https://imasdk.googleapis.com/js/sdkloader/ima3.js'
15544
+ }
15545
+ },
15546
+ // Custom control listeners
15547
+ listeners: {
15548
+ seek: null,
15549
+ play: null,
15550
+ pause: null,
15551
+ restart: null,
15552
+ rewind: null,
15553
+ fastForward: null,
15554
+ mute: null,
15555
+ volume: null,
15556
+ captions: null,
15557
+ download: null,
15558
+ fullscreen: null,
15559
+ pip: null,
15560
+ airplay: null,
15561
+ speed: null,
15562
+ quality: null,
15563
+ loop: null,
15564
+ language: null
15565
+ },
15566
+ // Events to watch and bubble
15567
+ events: [// Events to watch on HTML5 media elements and bubble
15568
+ // https://developer.mozilla.org/en/docs/Web/Guide/Events/Media_events
15569
+ 'ended', 'progress', 'stalled', 'playing', 'waiting', 'canplay', 'canplaythrough', 'loadstart', 'loadeddata', 'loadedmetadata', 'timeupdate', 'volumechange', 'play', 'pause', 'error', 'seeking', 'seeked', 'emptied', 'ratechange', 'cuechange', // Custom events
15570
+ 'download', 'enterfullscreen', 'exitfullscreen', 'captionsenabled', 'captionsdisabled', 'languagechange', 'controlshidden', 'controlsshown', 'ready', // YouTube
15571
+ 'statechange', // Quality
15572
+ 'qualitychange', // Ads
15573
+ 'adsloaded', 'adscontentpause', 'adscontentresume', 'adstarted', 'adsmidpoint', 'adscomplete', 'adsallcomplete', 'adsimpression', 'adsclick'],
15574
+ // Selectors
15575
+ // Change these to match your template if using custom HTML
15576
+ selectors: {
15577
+ editable: 'input, textarea, select, [contenteditable]',
15578
+ container: '.plyr',
15579
+ controls: {
15580
+ container: null,
15581
+ wrapper: '.plyr__controls'
15582
+ },
15583
+ labels: '[data-plyr]',
15584
+ buttons: {
15585
+ play: '[data-plyr="play"]',
15586
+ pause: '[data-plyr="pause"]',
15587
+ restart: '[data-plyr="restart"]',
15588
+ rewind: '[data-plyr="rewind"]',
15589
+ fastForward: '[data-plyr="fast-forward"]',
15590
+ mute: '[data-plyr="mute"]',
15591
+ captions: '[data-plyr="captions"]',
15592
+ download: '[data-plyr="download"]',
15593
+ fullscreen: '[data-plyr="fullscreen"]',
15594
+ pip: '[data-plyr="pip"]',
15595
+ airplay: '[data-plyr="airplay"]',
15596
+ settings: '[data-plyr="settings"]',
15597
+ loop: '[data-plyr="loop"]'
15598
+ },
15599
+ inputs: {
15600
+ seek: '[data-plyr="seek"]',
15601
+ volume: '[data-plyr="volume"]',
15602
+ speed: '[data-plyr="speed"]',
15603
+ language: '[data-plyr="language"]',
15604
+ quality: '[data-plyr="quality"]'
15605
+ },
15606
+ display: {
15607
+ currentTime: '.plyr__time--current',
15608
+ duration: '.plyr__time--duration',
15609
+ buffer: '.plyr__progress__buffer',
15610
+ loop: '.plyr__progress__loop',
15611
+ // Used later
15612
+ volume: '.plyr__volume--display'
15613
+ },
15614
+ progress: '.plyr__progress',
15615
+ captions: '.plyr__captions',
15616
+ caption: '.plyr__caption'
15617
+ },
15618
+ // Class hooks added to the player in different states
15619
+ classNames: {
15620
+ type: 'plyr--{0}',
15621
+ provider: 'plyr--{0}',
15622
+ video: 'plyr__video-wrapper',
15623
+ embed: 'plyr__video-embed',
15624
+ videoFixedRatio: 'plyr__video-wrapper--fixed-ratio',
15625
+ embedContainer: 'plyr__video-embed__container',
15626
+ poster: 'plyr__poster',
15627
+ posterEnabled: 'plyr__poster-enabled',
15628
+ ads: 'plyr__ads',
15629
+ control: 'plyr__control',
15630
+ controlPressed: 'plyr__control--pressed',
15631
+ playing: 'plyr--playing',
15632
+ paused: 'plyr--paused',
15633
+ stopped: 'plyr--stopped',
15634
+ loading: 'plyr--loading',
15635
+ hover: 'plyr--hover',
15636
+ tooltip: 'plyr__tooltip',
15637
+ cues: 'plyr__cues',
15638
+ hidden: 'plyr__sr-only',
15639
+ hideControls: 'plyr--hide-controls',
15640
+ isIos: 'plyr--is-ios',
15641
+ isTouch: 'plyr--is-touch',
15642
+ uiSupported: 'plyr--full-ui',
15643
+ noTransition: 'plyr--no-transition',
15644
+ display: {
15645
+ time: 'plyr__time'
15646
+ },
15647
+ menu: {
15648
+ value: 'plyr__menu__value',
15649
+ badge: 'plyr__badge',
15650
+ open: 'plyr--menu-open'
15651
+ },
15652
+ captions: {
15653
+ enabled: 'plyr--captions-enabled',
15654
+ active: 'plyr--captions-active'
15655
+ },
15656
+ fullscreen: {
15657
+ enabled: 'plyr--fullscreen-enabled',
15658
+ fallback: 'plyr--fullscreen-fallback'
15659
+ },
15660
+ pip: {
15661
+ supported: 'plyr--pip-supported',
15662
+ active: 'plyr--pip-active'
15663
+ },
15664
+ airplay: {
15665
+ supported: 'plyr--airplay-supported',
15666
+ active: 'plyr--airplay-active'
15667
+ },
15668
+ tabFocus: 'plyr__tab-focus',
15669
+ previewThumbnails: {
15670
+ // Tooltip thumbs
15671
+ thumbContainer: 'plyr__preview-thumb',
15672
+ thumbContainerShown: 'plyr__preview-thumb--is-shown',
15673
+ imageContainer: 'plyr__preview-thumb__image-container',
15674
+ timeContainer: 'plyr__preview-thumb__time-container',
15675
+ // Scrubbing
15676
+ scrubbingContainer: 'plyr__preview-scrubbing',
15677
+ scrubbingContainerShown: 'plyr__preview-scrubbing--is-shown'
15678
+ }
15679
+ },
15680
+ // Embed attributes
15681
+ attributes: {
15682
+ embed: {
15683
+ provider: 'data-plyr-provider',
15684
+ id: 'data-plyr-embed-id'
15685
+ }
15686
+ },
15687
+ // Advertisements plugin
15688
+ // Register for an account here: http://vi.ai/publisher-video-monetization/?aid=plyrio
15689
+ ads: {
15690
+ enabled: false,
15691
+ publisherId: '',
15692
+ tagUrl: ''
15693
+ },
15694
+ // Preview Thumbnails plugin
15695
+ previewThumbnails: {
15696
+ enabled: false,
15697
+ src: ''
15698
+ },
15699
+ // Vimeo plugin
15700
+ vimeo: {
15701
+ byline: false,
15702
+ portrait: false,
15703
+ title: false,
15704
+ speed: true,
15705
+ transparent: false
15706
+ },
15707
+ // YouTube plugin
15708
+ youtube: {
15709
+ noCookie: false,
15710
+ // Whether to use an alternative version of YouTube without cookies
15711
+ rel: 0,
15712
+ // No related vids
15713
+ showinfo: 0,
15714
+ // Hide info
15715
+ iv_load_policy: 3,
15716
+ // Hide annotations
15717
+ modestbranding: 1 // Hide logos as much as possible (they still show one in the corner when paused)
15718
+
15719
+ }
15720
+ };
15721
+
15722
+ // ==========================================================================
15723
+ // Plyr states
15724
+ // ==========================================================================
15725
+ var pip = {
15726
+ active: 'picture-in-picture',
15727
+ inactive: 'inline'
15728
+ };
15729
+
15730
+ // ==========================================================================
15731
+ // Plyr supported types and providers
15732
+ // ==========================================================================
15733
+ var providers = {
15734
+ html5: 'html5',
15735
+ youtube: 'youtube',
15736
+ vimeo: 'vimeo'
15737
+ };
15738
+ var types = {
15739
+ audio: 'audio',
15740
+ video: 'video'
15741
+ };
15742
+ /**
15743
+ * Get provider by URL
15744
+ * @param {String} url
15745
+ */
15746
+
15747
+ function getProviderByUrl(url) {
15748
+ // YouTube
15749
+ if (/^(https?:\/\/)?(www\.)?(youtube\.com|youtube-nocookie\.com|youtu\.?be)\/.+$/.test(url)) {
15750
+ return providers.youtube;
15751
+ } // Vimeo
15752
+
15753
+
15754
+ if (/^https?:\/\/player.vimeo.com\/video\/\d{0,9}(?=\b|\/)/.test(url)) {
15755
+ return providers.vimeo;
15756
+ }
15757
+
15758
+ return null;
15759
+ }
15760
+
15761
+ // ==========================================================================
15762
+ // Console wrapper
15763
+ // ==========================================================================
15764
+ var noop = function noop() {};
15765
+
15766
+ var Console =
15767
+ /*#__PURE__*/
15768
+ function () {
15769
+ function Console() {
15770
+ var enabled = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
15771
+
15772
+ _classCallCheck(this, Console);
15773
+
15774
+ this.enabled = window.console && enabled;
15775
+
15776
+ if (this.enabled) {
15777
+ this.log('Debugging enabled');
15778
+ }
15779
+ }
15780
+
15781
+ _createClass(Console, [{
15782
+ key: "log",
15783
+ get: function get() {
15784
+ // eslint-disable-next-line no-console
15785
+ return this.enabled ? Function.prototype.bind.call(console.log, console) : noop;
15786
+ }
15787
+ }, {
15788
+ key: "warn",
15789
+ get: function get() {
15790
+ // eslint-disable-next-line no-console
15791
+ return this.enabled ? Function.prototype.bind.call(console.warn, console) : noop;
15792
+ }
15793
+ }, {
15794
+ key: "error",
15795
+ get: function get() {
15796
+ // eslint-disable-next-line no-console
15797
+ return this.enabled ? Function.prototype.bind.call(console.error, console) : noop;
15798
+ }
15799
+ }]);
15800
+
15801
+ return Console;
15802
+ }();
15803
+
15804
+ function onChange() {
15805
+ if (!this.enabled) {
15806
+ return;
15807
+ } // Update toggle button
15808
+
15809
+
15810
+ var button = this.player.elements.buttons.fullscreen;
15811
+
15812
+ if (is$1.element(button)) {
15813
+ button.pressed = this.active;
15814
+ } // Trigger an event
15815
+
15816
+
15817
+ triggerEvent.call(this.player, this.target, this.active ? 'enterfullscreen' : 'exitfullscreen', true); // Trap focus in container
15818
+
15819
+ if (!browser.isIos) {
15820
+ trapFocus.call(this.player, this.target, this.active);
15821
+ }
15822
+ }
15823
+
15824
+ function toggleFallback() {
15825
+ var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
15826
+
15827
+ // Store or restore scroll position
15828
+ if (toggle) {
15829
+ this.scrollPosition = {
15830
+ x: window.scrollX || 0,
15831
+ y: window.scrollY || 0
15832
+ };
15833
+ } else {
15834
+ window.scrollTo(this.scrollPosition.x, this.scrollPosition.y);
15835
+ } // Toggle scroll
15836
+
15837
+
15838
+ document.body.style.overflow = toggle ? 'hidden' : ''; // Toggle class hook
15839
+
15840
+ toggleClass(this.target, this.player.config.classNames.fullscreen.fallback, toggle); // Force full viewport on iPhone X+
15841
+
15842
+ if (browser.isIos) {
15843
+ var viewport = document.head.querySelector('meta[name="viewport"]');
15844
+ var property = 'viewport-fit=cover'; // Inject the viewport meta if required
15845
+
15846
+ if (!viewport) {
15847
+ viewport = document.createElement('meta');
15848
+ viewport.setAttribute('name', 'viewport');
15849
+ } // Check if the property already exists
15850
+
15851
+
15852
+ var hasProperty = is$1.string(viewport.content) && viewport.content.includes(property);
15853
+
15854
+ if (toggle) {
15855
+ this.cleanupViewport = !hasProperty;
15856
+
15857
+ if (!hasProperty) {
15858
+ viewport.content += ",".concat(property);
15859
+ }
15860
+ } else if (this.cleanupViewport) {
15861
+ viewport.content = viewport.content.split(',').filter(function (part) {
15862
+ return part.trim() !== property;
15863
+ }).join(',');
15864
+ }
15865
+ } // Toggle button and fire events
15866
+
15867
+
15868
+ onChange.call(this);
15869
+ }
15870
+
15871
+ var Fullscreen =
15872
+ /*#__PURE__*/
15873
+ function () {
15874
+ function Fullscreen(player) {
15875
+ var _this = this;
15876
+
15877
+ _classCallCheck(this, Fullscreen);
15878
+
15879
+ // Keep reference to parent
15880
+ this.player = player; // Get prefix
15881
+
15882
+ this.prefix = Fullscreen.prefix;
15883
+ this.property = Fullscreen.property; // Scroll position
15884
+
15885
+ this.scrollPosition = {
15886
+ x: 0,
15887
+ y: 0
15888
+ }; // Force the use of 'full window/browser' rather than fullscreen
15889
+
15890
+ this.forceFallback = player.config.fullscreen.fallback === 'force'; // Register event listeners
15891
+ // Handle event (incase user presses escape etc)
15892
+
15893
+ on.call(this.player, document, this.prefix === 'ms' ? 'MSFullscreenChange' : "".concat(this.prefix, "fullscreenchange"), function () {
15894
+ // TODO: Filter for target??
15895
+ onChange.call(_this);
15896
+ }); // Fullscreen toggle on double click
15897
+
15898
+ on.call(this.player, this.player.elements.container, 'dblclick', function (event) {
15899
+ // Ignore double click in controls
15900
+ if (is$1.element(_this.player.elements.controls) && _this.player.elements.controls.contains(event.target)) {
15901
+ return;
15902
+ }
15903
+
15904
+ _this.toggle();
15905
+ }); // Update the UI
15906
+
15907
+ this.update();
15908
+ } // Determine if native supported
15909
+
15910
+
15911
+ _createClass(Fullscreen, [{
15912
+ key: "update",
15913
+ // Update UI
15914
+ value: function update() {
15915
+ if (this.enabled) {
15916
+ var mode;
15917
+
15918
+ if (this.forceFallback) {
15919
+ mode = 'Fallback (forced)';
15920
+ } else if (Fullscreen.native) {
15921
+ mode = 'Native';
15922
+ } else {
15923
+ mode = 'Fallback';
15924
+ }
15925
+
15926
+ this.player.debug.log("".concat(mode, " fullscreen enabled"));
15927
+ } else {
15928
+ this.player.debug.log('Fullscreen not supported and fallback disabled');
15929
+ } // Add styling hook to show button
15930
+
15931
+
15932
+ toggleClass(this.player.elements.container, this.player.config.classNames.fullscreen.enabled, this.enabled);
15933
+ } // Make an element fullscreen
15934
+
15935
+ }, {
15936
+ key: "enter",
15937
+ value: function enter() {
15938
+ if (!this.enabled) {
15939
+ return;
15940
+ } // iOS native fullscreen doesn't need the request step
15941
+
15942
+
15943
+ if (browser.isIos && this.player.config.fullscreen.iosNative) {
15944
+ this.target.webkitEnterFullscreen();
15945
+ } else if (!Fullscreen.native || this.forceFallback) {
15946
+ toggleFallback.call(this, true);
15947
+ } else if (!this.prefix) {
15948
+ this.target.requestFullscreen();
15949
+ } else if (!is$1.empty(this.prefix)) {
15950
+ this.target["".concat(this.prefix, "Request").concat(this.property)]();
15951
+ }
15952
+ } // Bail from fullscreen
15953
+
15954
+ }, {
15955
+ key: "exit",
15956
+ value: function exit() {
15957
+ if (!this.enabled) {
15958
+ return;
15959
+ } // iOS native fullscreen
15960
+
15961
+
15962
+ if (browser.isIos && this.player.config.fullscreen.iosNative) {
15963
+ this.target.webkitExitFullscreen();
15964
+ this.player.play();
15965
+ } else if (!Fullscreen.native || this.forceFallback) {
15966
+ toggleFallback.call(this, false);
15967
+ } else if (!this.prefix) {
15968
+ (document.cancelFullScreen || document.exitFullscreen).call(document);
15969
+ } else if (!is$1.empty(this.prefix)) {
15970
+ var action = this.prefix === 'moz' ? 'Cancel' : 'Exit';
15971
+ document["".concat(this.prefix).concat(action).concat(this.property)]();
15972
+ }
15973
+ } // Toggle state
15974
+
15975
+ }, {
15976
+ key: "toggle",
15977
+ value: function toggle() {
15978
+ if (!this.active) {
15979
+ this.enter();
15980
+ } else {
15981
+ this.exit();
15982
+ }
15983
+ }
15984
+ }, {
15985
+ key: "usingNative",
15986
+ // If we're actually using native
15987
+ get: function get() {
15988
+ return Fullscreen.native && !this.forceFallback;
15989
+ } // Get the prefix for handlers
15990
+
15991
+ }, {
15992
+ key: "enabled",
15993
+ // Determine if fullscreen is enabled
15994
+ get: function get() {
15995
+ return (Fullscreen.native || this.player.config.fullscreen.fallback) && this.player.config.fullscreen.enabled && this.player.supported.ui && this.player.isVideo;
15996
+ } // Get active state
15997
+
15998
+ }, {
15999
+ key: "active",
16000
+ get: function get() {
16001
+ if (!this.enabled) {
16002
+ return false;
16003
+ } // Fallback using classname
16004
+
16005
+
16006
+ if (!Fullscreen.native || this.forceFallback) {
16007
+ return hasClass(this.target, this.player.config.classNames.fullscreen.fallback);
16008
+ }
16009
+
16010
+ var element = !this.prefix ? document.fullscreenElement : document["".concat(this.prefix).concat(this.property, "Element")];
16011
+ return element === this.target;
16012
+ } // Get target element
16013
+
16014
+ }, {
16015
+ key: "target",
16016
+ get: function get() {
16017
+ return browser.isIos && this.player.config.fullscreen.iosNative ? this.player.media : this.player.elements.container;
16018
+ }
16019
+ }], [{
16020
+ key: "native",
16021
+ get: function get() {
16022
+ return !!(document.fullscreenEnabled || document.webkitFullscreenEnabled || document.mozFullScreenEnabled || document.msFullscreenEnabled);
16023
+ }
16024
+ }, {
16025
+ key: "prefix",
16026
+ get: function get() {
16027
+ // No prefix
16028
+ if (is$1.function(document.exitFullscreen)) {
16029
+ return '';
16030
+ } // Check for fullscreen support by vendor prefix
16031
+
16032
+
16033
+ var value = '';
16034
+ var prefixes = ['webkit', 'moz', 'ms'];
16035
+ prefixes.some(function (pre) {
16036
+ if (is$1.function(document["".concat(pre, "ExitFullscreen")]) || is$1.function(document["".concat(pre, "CancelFullScreen")])) {
16037
+ value = pre;
16038
+ return true;
16039
+ }
16040
+
16041
+ return false;
16042
+ });
16043
+ return value;
16044
+ }
16045
+ }, {
16046
+ key: "property",
16047
+ get: function get() {
16048
+ return this.prefix === 'moz' ? 'FullScreen' : 'Fullscreen';
16049
+ }
16050
+ }]);
16051
+
16052
+ return Fullscreen;
16053
+ }();
16054
+
16055
+ // ==========================================================================
16056
+ // Load image avoiding xhr/fetch CORS issues
16057
+ // Server status can't be obtained this way unfortunately, so this uses "naturalWidth" to determine if the image has loaded
16058
+ // By default it checks if it is at least 1px, but you can add a second argument to change this
16059
+ // ==========================================================================
16060
+ function loadImage(src) {
16061
+ var minWidth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
16062
+ return new Promise(function (resolve, reject) {
16063
+ var image = new Image();
16064
+
16065
+ var handler = function handler() {
16066
+ delete image.onload;
16067
+ delete image.onerror;
16068
+ (image.naturalWidth >= minWidth ? resolve : reject)(image);
16069
+ };
16070
+
16071
+ Object.assign(image, {
16072
+ onload: handler,
16073
+ onerror: handler,
16074
+ src: src
16075
+ });
16076
+ });
16077
+ }
16078
+
16079
+ // ==========================================================================
16080
+ var ui = {
16081
+ addStyleHook: function addStyleHook() {
16082
+ toggleClass(this.elements.container, this.config.selectors.container.replace('.', ''), true);
16083
+ toggleClass(this.elements.container, this.config.classNames.uiSupported, this.supported.ui);
16084
+ },
16085
+ // Toggle native HTML5 media controls
16086
+ toggleNativeControls: function toggleNativeControls() {
16087
+ var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
16088
+
16089
+ if (toggle && this.isHTML5) {
16090
+ this.media.setAttribute('controls', '');
16091
+ } else {
16092
+ this.media.removeAttribute('controls');
16093
+ }
16094
+ },
16095
+ // Setup the UI
16096
+ build: function build() {
16097
+ var _this = this;
16098
+
16099
+ // Re-attach media element listeners
16100
+ // TODO: Use event bubbling?
16101
+ this.listeners.media(); // Don't setup interface if no support
16102
+
16103
+ if (!this.supported.ui) {
16104
+ this.debug.warn("Basic support only for ".concat(this.provider, " ").concat(this.type)); // Restore native controls
16105
+
16106
+ ui.toggleNativeControls.call(this, true); // Bail
16107
+
16108
+ return;
16109
+ } // Inject custom controls if not present
16110
+
16111
+
16112
+ if (!is$1.element(this.elements.controls)) {
16113
+ // Inject custom controls
16114
+ controls.inject.call(this); // Re-attach control listeners
16115
+
16116
+ this.listeners.controls();
16117
+ } // Remove native controls
16118
+
16119
+
16120
+ ui.toggleNativeControls.call(this); // Setup captions for HTML5
16121
+
16122
+ if (this.isHTML5) {
16123
+ captions.setup.call(this);
16124
+ } // Reset volume
16125
+
16126
+
16127
+ this.volume = null; // Reset mute state
16128
+
16129
+ this.muted = null; // Reset loop state
16130
+
16131
+ this.loop = null; // Reset quality setting
16132
+
16133
+ this.quality = null; // Reset speed
16134
+
16135
+ this.speed = null; // Reset volume display
16136
+
16137
+ controls.updateVolume.call(this); // Reset time display
16138
+
16139
+ controls.timeUpdate.call(this); // Update the UI
16140
+
16141
+ ui.checkPlaying.call(this); // Check for picture-in-picture support
16142
+
16143
+ toggleClass(this.elements.container, this.config.classNames.pip.supported, support.pip && this.isHTML5 && this.isVideo); // Check for airplay support
16144
+
16145
+ toggleClass(this.elements.container, this.config.classNames.airplay.supported, support.airplay && this.isHTML5); // Add iOS class
16146
+
16147
+ toggleClass(this.elements.container, this.config.classNames.isIos, browser.isIos); // Add touch class
16148
+
16149
+ toggleClass(this.elements.container, this.config.classNames.isTouch, this.touch); // Ready for API calls
16150
+
16151
+ this.ready = true; // Ready event at end of execution stack
16152
+
16153
+ setTimeout(function () {
16154
+ triggerEvent.call(_this, _this.media, 'ready');
16155
+ }, 0); // Set the title
16156
+
16157
+ ui.setTitle.call(this); // Assure the poster image is set, if the property was added before the element was created
16158
+
16159
+ if (this.poster) {
16160
+ ui.setPoster.call(this, this.poster, false).catch(function () {});
16161
+ } // Manually set the duration if user has overridden it.
16162
+ // The event listeners for it doesn't get called if preload is disabled (#701)
16163
+
16164
+
16165
+ if (this.config.duration) {
16166
+ controls.durationUpdate.call(this);
16167
+ }
16168
+ },
16169
+ // Setup aria attribute for play and iframe title
16170
+ setTitle: function setTitle() {
16171
+ // Find the current text
16172
+ var label = i18n.get('play', this.config); // If there's a media title set, use that for the label
16173
+
16174
+ if (is$1.string(this.config.title) && !is$1.empty(this.config.title)) {
16175
+ label += ", ".concat(this.config.title);
16176
+ } // If there's a play button, set label
16177
+
16178
+
16179
+ Array.from(this.elements.buttons.play || []).forEach(function (button) {
16180
+ button.setAttribute('aria-label', label);
16181
+ }); // Set iframe title
16182
+ // https://github.com/sampotts/plyr/issues/124
16183
+
16184
+ if (this.isEmbed) {
16185
+ var iframe = getElement.call(this, 'iframe');
16186
+
16187
+ if (!is$1.element(iframe)) {
16188
+ return;
16189
+ } // Default to media type
16190
+
16191
+
16192
+ var title = !is$1.empty(this.config.title) ? this.config.title : 'video';
16193
+ var format = i18n.get('frameTitle', this.config);
16194
+ iframe.setAttribute('title', format.replace('{title}', title));
16195
+ }
16196
+ },
16197
+ // Toggle poster
16198
+ togglePoster: function togglePoster(enable) {
16199
+ toggleClass(this.elements.container, this.config.classNames.posterEnabled, enable);
16200
+ },
16201
+ // Set the poster image (async)
16202
+ // Used internally for the poster setter, with the passive option forced to false
16203
+ setPoster: function setPoster(poster) {
16204
+ var _this2 = this;
16205
+
16206
+ var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
16207
+
16208
+ // Don't override if call is passive
16209
+ if (passive && this.poster) {
16210
+ return Promise.reject(new Error('Poster already set'));
16211
+ } // Set property synchronously to respect the call order
16212
+
16213
+
16214
+ this.media.setAttribute('poster', poster); // Wait until ui is ready
16215
+
16216
+ return ready.call(this) // Load image
16217
+ .then(function () {
16218
+ return loadImage(poster);
16219
+ }).catch(function (err) {
16220
+ // Hide poster on error unless it's been set by another call
16221
+ if (poster === _this2.poster) {
16222
+ ui.togglePoster.call(_this2, false);
16223
+ } // Rethrow
16224
+
16225
+
16226
+ throw err;
16227
+ }).then(function () {
16228
+ // Prevent race conditions
16229
+ if (poster !== _this2.poster) {
16230
+ throw new Error('setPoster cancelled by later call to setPoster');
16231
+ }
16232
+ }).then(function () {
16233
+ Object.assign(_this2.elements.poster.style, {
16234
+ backgroundImage: "url('".concat(poster, "')"),
16235
+ // Reset backgroundSize as well (since it can be set to "cover" for padded thumbnails for youtube)
16236
+ backgroundSize: ''
16237
+ });
16238
+ ui.togglePoster.call(_this2, true);
16239
+ return poster;
16240
+ });
16241
+ },
16242
+ // Check playing state
16243
+ checkPlaying: function checkPlaying(event) {
16244
+ var _this3 = this;
16245
+
16246
+ // Class hooks
16247
+ toggleClass(this.elements.container, this.config.classNames.playing, this.playing);
16248
+ toggleClass(this.elements.container, this.config.classNames.paused, this.paused);
16249
+ toggleClass(this.elements.container, this.config.classNames.stopped, this.stopped); // Set state
16250
+
16251
+ Array.from(this.elements.buttons.play || []).forEach(function (target) {
16252
+ Object.assign(target, {
16253
+ pressed: _this3.playing
16254
+ });
16255
+ }); // Only update controls on non timeupdate events
16256
+
16257
+ if (is$1.event(event) && event.type === 'timeupdate') {
16258
+ return;
16259
+ } // Toggle controls
16260
+
16261
+
16262
+ ui.toggleControls.call(this);
16263
+ },
16264
+ // Check if media is loading
16265
+ checkLoading: function checkLoading(event) {
16266
+ var _this4 = this;
16267
+
16268
+ this.loading = ['stalled', 'waiting'].includes(event.type); // Clear timer
16269
+
16270
+ clearTimeout(this.timers.loading); // Timer to prevent flicker when seeking
16271
+
16272
+ this.timers.loading = setTimeout(function () {
16273
+ // Update progress bar loading class state
16274
+ toggleClass(_this4.elements.container, _this4.config.classNames.loading, _this4.loading); // Update controls visibility
16275
+
16276
+ ui.toggleControls.call(_this4);
16277
+ }, this.loading ? 250 : 0);
16278
+ },
16279
+ // Toggle controls based on state and `force` argument
16280
+ toggleControls: function toggleControls(force) {
16281
+ var controlsElement = this.elements.controls;
16282
+
16283
+ if (controlsElement && this.config.hideControls) {
16284
+ // Don't hide controls if a touch-device user recently seeked. (Must be limited to touch devices, or it occasionally prevents desktop controls from hiding.)
16285
+ var recentTouchSeek = this.touch && this.lastSeekTime + 2000 > Date.now(); // Show controls if force, loading, paused, button interaction, or recent seek, otherwise hide
16286
+
16287
+ this.toggleControls(Boolean(force || this.loading || this.paused || controlsElement.pressed || controlsElement.hover || recentTouchSeek));
16288
+ }
16289
+ }
16290
+ };
16291
+
16292
+ var Listeners =
16293
+ /*#__PURE__*/
16294
+ function () {
16295
+ function Listeners(player) {
16296
+ _classCallCheck(this, Listeners);
16297
+
16298
+ this.player = player;
16299
+ this.lastKey = null;
16300
+ this.focusTimer = null;
16301
+ this.lastKeyDown = null;
16302
+ this.handleKey = this.handleKey.bind(this);
16303
+ this.toggleMenu = this.toggleMenu.bind(this);
16304
+ this.setTabFocus = this.setTabFocus.bind(this);
16305
+ this.firstTouch = this.firstTouch.bind(this);
16306
+ } // Handle key presses
16307
+
16308
+
16309
+ _createClass(Listeners, [{
16310
+ key: "handleKey",
16311
+ value: function handleKey(event) {
16312
+ var player = this.player;
16313
+ var elements = player.elements;
16314
+ var code = event.keyCode ? event.keyCode : event.which;
16315
+ var pressed = event.type === 'keydown';
16316
+ var repeat = pressed && code === this.lastKey; // Bail if a modifier key is set
16317
+
16318
+ if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) {
16319
+ return;
16320
+ } // If the event is bubbled from the media element
16321
+ // Firefox doesn't get the keycode for whatever reason
16322
+
16323
+
16324
+ if (!is$1.number(code)) {
16325
+ return;
16326
+ } // Seek by the number keys
16327
+
16328
+
16329
+ var seekByKey = function seekByKey() {
16330
+ // Divide the max duration into 10th's and times by the number value
16331
+ player.currentTime = player.duration / 10 * (code - 48);
16332
+ }; // Handle the key on keydown
16333
+ // Reset on keyup
16334
+
16335
+
16336
+ if (pressed) {
16337
+ // Check focused element
16338
+ // and if the focused element is not editable (e.g. text input)
16339
+ // and any that accept key input http://webaim.org/techniques/keyboard/
16340
+ var focused = document.activeElement;
16341
+
16342
+ if (is$1.element(focused)) {
16343
+ var editable = player.config.selectors.editable;
16344
+ var seek = elements.inputs.seek;
16345
+
16346
+ if (focused !== seek && matches$1(focused, editable)) {
16347
+ return;
16348
+ }
16349
+
16350
+ if (event.which === 32 && matches$1(focused, 'button, [role^="menuitem"]')) {
16351
+ return;
16352
+ }
16353
+ } // Which keycodes should we prevent default
16354
+
16355
+
16356
+ var preventDefault = [32, 37, 38, 39, 40, 48, 49, 50, 51, 52, 53, 54, 56, 57, 67, 70, 73, 75, 76, 77, 79]; // If the code is found prevent default (e.g. prevent scrolling for arrows)
16357
+
16358
+ if (preventDefault.includes(code)) {
16359
+ event.preventDefault();
16360
+ event.stopPropagation();
16361
+ }
16362
+
16363
+ switch (code) {
16364
+ case 48:
16365
+ case 49:
16366
+ case 50:
16367
+ case 51:
16368
+ case 52:
16369
+ case 53:
16370
+ case 54:
16371
+ case 55:
16372
+ case 56:
16373
+ case 57:
16374
+ // 0-9
16375
+ if (!repeat) {
16376
+ seekByKey();
16377
+ }
16378
+
16379
+ break;
16380
+
16381
+ case 32:
16382
+ case 75:
16383
+ // Space and K key
16384
+ if (!repeat) {
16385
+ player.togglePlay();
16386
+ }
16387
+
16388
+ break;
16389
+
16390
+ case 38:
16391
+ // Arrow up
16392
+ player.increaseVolume(0.1);
16393
+ break;
16394
+
16395
+ case 40:
16396
+ // Arrow down
16397
+ player.decreaseVolume(0.1);
16398
+ break;
16399
+
16400
+ case 77:
16401
+ // M key
16402
+ if (!repeat) {
16403
+ player.muted = !player.muted;
16404
+ }
16405
+
16406
+ break;
16407
+
16408
+ case 39:
16409
+ // Arrow forward
16410
+ player.forward();
16411
+ break;
16412
+
16413
+ case 37:
16414
+ // Arrow back
16415
+ player.rewind();
16416
+ break;
16417
+
16418
+ case 70:
16419
+ // F key
16420
+ player.fullscreen.toggle();
16421
+ break;
16422
+
16423
+ case 67:
16424
+ // C key
16425
+ if (!repeat) {
16426
+ player.toggleCaptions();
16427
+ }
16428
+
16429
+ break;
16430
+
16431
+ case 76:
16432
+ // L key
16433
+ player.loop = !player.loop;
16434
+ break;
16435
+
16436
+ /* case 73:
16437
+ this.setLoop('start');
16438
+ break;
16439
+ case 76:
16440
+ this.setLoop();
16441
+ break;
16442
+ case 79:
16443
+ this.setLoop('end');
16444
+ break; */
16445
+
16446
+ default:
16447
+ break;
16448
+ } // Escape is handle natively when in full screen
16449
+ // So we only need to worry about non native
16450
+
16451
+
16452
+ if (code === 27 && !player.fullscreen.usingNative && player.fullscreen.active) {
16453
+ player.fullscreen.toggle();
16454
+ } // Store last code for next cycle
16455
+
16456
+
16457
+ this.lastKey = code;
16458
+ } else {
16459
+ this.lastKey = null;
16460
+ }
16461
+ } // Toggle menu
16462
+
16463
+ }, {
16464
+ key: "toggleMenu",
16465
+ value: function toggleMenu(event) {
16466
+ controls.toggleMenu.call(this.player, event);
16467
+ } // Device is touch enabled
16468
+
16469
+ }, {
16470
+ key: "firstTouch",
16471
+ value: function firstTouch() {
16472
+ var player = this.player;
16473
+ var elements = player.elements;
16474
+ player.touch = true; // Add touch class
16475
+
16476
+ toggleClass(elements.container, player.config.classNames.isTouch, true);
16477
+ }
16478
+ }, {
16479
+ key: "setTabFocus",
16480
+ value: function setTabFocus(event) {
16481
+ var player = this.player;
16482
+ var elements = player.elements;
16483
+ clearTimeout(this.focusTimer); // Ignore any key other than tab
16484
+
16485
+ if (event.type === 'keydown' && event.which !== 9) {
16486
+ return;
16487
+ } // Store reference to event timeStamp
16488
+
16489
+
16490
+ if (event.type === 'keydown') {
16491
+ this.lastKeyDown = event.timeStamp;
16492
+ } // Remove current classes
16493
+
16494
+
16495
+ var removeCurrent = function removeCurrent() {
16496
+ var className = player.config.classNames.tabFocus;
16497
+ var current = getElements.call(player, ".".concat(className));
16498
+ toggleClass(current, className, false);
16499
+ }; // Determine if a key was pressed to trigger this event
16500
+
16501
+
16502
+ var wasKeyDown = event.timeStamp - this.lastKeyDown <= 20; // Ignore focus events if a key was pressed prior
16503
+
16504
+ if (event.type === 'focus' && !wasKeyDown) {
16505
+ return;
16506
+ } // Remove all current
16507
+
16508
+
16509
+ removeCurrent(); // Delay the adding of classname until the focus has changed
16510
+ // This event fires before the focusin event
16511
+
16512
+ this.focusTimer = setTimeout(function () {
16513
+ var focused = document.activeElement; // Ignore if current focus element isn't inside the player
16514
+
16515
+ if (!elements.container.contains(focused)) {
16516
+ return;
16517
+ }
16518
+
16519
+ toggleClass(document.activeElement, player.config.classNames.tabFocus, true);
16520
+ }, 10);
16521
+ } // Global window & document listeners
16522
+
16523
+ }, {
16524
+ key: "global",
16525
+ value: function global() {
16526
+ var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
16527
+ var player = this.player; // Keyboard shortcuts
16528
+
16529
+ if (player.config.keyboard.global) {
16530
+ toggleListener.call(player, window, 'keydown keyup', this.handleKey, toggle, false);
16531
+ } // Click anywhere closes menu
16532
+
16533
+
16534
+ toggleListener.call(player, document.body, 'click', this.toggleMenu, toggle); // Detect touch by events
16535
+
16536
+ once.call(player, document.body, 'touchstart', this.firstTouch); // Tab focus detection
16537
+
16538
+ toggleListener.call(player, document.body, 'keydown focus blur', this.setTabFocus, toggle, false, true);
16539
+ } // Container listeners
16540
+
16541
+ }, {
16542
+ key: "container",
16543
+ value: function container() {
16544
+ var player = this.player;
16545
+ var config = player.config,
16546
+ elements = player.elements,
16547
+ timers = player.timers; // Keyboard shortcuts
16548
+
16549
+ if (!config.keyboard.global && config.keyboard.focused) {
16550
+ on.call(player, elements.container, 'keydown keyup', this.handleKey, false);
16551
+ } // Toggle controls on mouse events and entering fullscreen
16552
+
16553
+
16554
+ on.call(player, elements.container, 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen', function (event) {
16555
+ var controlsElement = elements.controls; // Remove button states for fullscreen
16556
+
16557
+ if (controlsElement && event.type === 'enterfullscreen') {
16558
+ controlsElement.pressed = false;
16559
+ controlsElement.hover = false;
16560
+ } // Show, then hide after a timeout unless another control event occurs
16561
+
16562
+
16563
+ var show = ['touchstart', 'touchmove', 'mousemove'].includes(event.type);
16564
+ var delay = 0;
16565
+
16566
+ if (show) {
16567
+ ui.toggleControls.call(player, true); // Use longer timeout for touch devices
16568
+
16569
+ delay = player.touch ? 3000 : 2000;
16570
+ } // Clear timer
16571
+
16572
+
16573
+ clearTimeout(timers.controls); // Set new timer to prevent flicker when seeking
16574
+
16575
+ timers.controls = setTimeout(function () {
16576
+ return ui.toggleControls.call(player, false);
16577
+ }, delay);
16578
+ }); // Set a gutter for Vimeo
16579
+
16580
+ var setGutter = function setGutter(ratio, padding, toggle) {
16581
+ if (!player.isVimeo) {
16582
+ return;
16583
+ }
16584
+
16585
+ var target = player.elements.wrapper.firstChild;
16586
+
16587
+ var _ratio = _slicedToArray(ratio, 2),
16588
+ y = _ratio[1];
16589
+
16590
+ var _getAspectRatio$call = getAspectRatio.call(player),
16591
+ _getAspectRatio$call2 = _slicedToArray(_getAspectRatio$call, 2),
16592
+ videoX = _getAspectRatio$call2[0],
16593
+ videoY = _getAspectRatio$call2[1];
16594
+
16595
+ target.style.maxWidth = toggle ? "".concat(y / videoY * videoX, "px") : null;
16596
+ target.style.margin = toggle ? '0 auto' : null;
16597
+ }; // Resize on fullscreen change
16598
+
16599
+
16600
+ var setPlayerSize = function setPlayerSize(measure) {
16601
+ // If we don't need to measure the viewport
16602
+ if (!measure) {
16603
+ return setAspectRatio.call(player);
16604
+ }
16605
+
16606
+ var rect = elements.container.getBoundingClientRect();
16607
+ var width = rect.width,
16608
+ height = rect.height;
16609
+ return setAspectRatio.call(player, "".concat(width, ":").concat(height));
16610
+ };
16611
+
16612
+ var resized = function resized() {
16613
+ clearTimeout(timers.resized);
16614
+ timers.resized = setTimeout(setPlayerSize, 50);
16615
+ };
16616
+
16617
+ on.call(player, elements.container, 'enterfullscreen exitfullscreen', function (event) {
16618
+ var _player$fullscreen = player.fullscreen,
16619
+ target = _player$fullscreen.target,
16620
+ usingNative = _player$fullscreen.usingNative; // Ignore events not from target
16621
+
16622
+ if (target !== elements.container) {
16623
+ return;
16624
+ } // If it's not an embed and no ratio specified
16625
+
16626
+
16627
+ if (!player.isEmbed && is$1.empty(player.config.ratio)) {
16628
+ return;
16629
+ }
16630
+
16631
+ var isEnter = event.type === 'enterfullscreen'; // Set the player size when entering fullscreen to viewport size
16632
+
16633
+ var _setPlayerSize = setPlayerSize(isEnter),
16634
+ padding = _setPlayerSize.padding,
16635
+ ratio = _setPlayerSize.ratio; // Set Vimeo gutter
16636
+
16637
+
16638
+ setGutter(ratio, padding, isEnter); // If not using native fullscreen, we need to check for resizes of viewport
16639
+
16640
+ if (!usingNative) {
16641
+ if (isEnter) {
16642
+ on.call(player, window, 'resize', resized);
16643
+ } else {
16644
+ off.call(player, window, 'resize', resized);
16645
+ }
16646
+ }
16647
+ });
16648
+ } // Listen for media events
16649
+
16650
+ }, {
16651
+ key: "media",
16652
+ value: function media() {
16653
+ var _this = this;
16654
+
16655
+ var player = this.player;
16656
+ var elements = player.elements; // Time change on media
16657
+
16658
+ on.call(player, player.media, 'timeupdate seeking seeked', function (event) {
16659
+ return controls.timeUpdate.call(player, event);
16660
+ }); // Display duration
16661
+
16662
+ on.call(player, player.media, 'durationchange loadeddata loadedmetadata', function (event) {
16663
+ return controls.durationUpdate.call(player, event);
16664
+ }); // Check for audio tracks on load
16665
+ // We can't use `loadedmetadata` as it doesn't seem to have audio tracks at that point
16666
+
16667
+ on.call(player, player.media, 'canplay loadeddata', function () {
16668
+ toggleHidden(elements.volume, !player.hasAudio);
16669
+ toggleHidden(elements.buttons.mute, !player.hasAudio);
16670
+ }); // Handle the media finishing
16671
+
16672
+ on.call(player, player.media, 'ended', function () {
16673
+ // Show poster on end
16674
+ if (player.isHTML5 && player.isVideo && player.config.resetOnEnd) {
16675
+ // Restart
16676
+ player.restart();
16677
+ }
16678
+ }); // Check for buffer progress
16679
+
16680
+ on.call(player, player.media, 'progress playing seeking seeked', function (event) {
16681
+ return controls.updateProgress.call(player, event);
16682
+ }); // Handle volume changes
16683
+
16684
+ on.call(player, player.media, 'volumechange', function (event) {
16685
+ return controls.updateVolume.call(player, event);
16686
+ }); // Handle play/pause
16687
+
16688
+ on.call(player, player.media, 'playing play pause ended emptied timeupdate', function (event) {
16689
+ return ui.checkPlaying.call(player, event);
16690
+ }); // Loading state
16691
+
16692
+ on.call(player, player.media, 'waiting canplay seeked playing', function (event) {
16693
+ return ui.checkLoading.call(player, event);
16694
+ }); // Click video
16695
+
16696
+ if (player.supported.ui && player.config.clickToPlay && !player.isAudio) {
16697
+ // Re-fetch the wrapper
16698
+ var wrapper = getElement.call(player, ".".concat(player.config.classNames.video)); // Bail if there's no wrapper (this should never happen)
16699
+
16700
+ if (!is$1.element(wrapper)) {
16701
+ return;
16702
+ } // On click play, pause or restart
16703
+
16704
+
16705
+ on.call(player, elements.container, 'click', function (event) {
16706
+ var targets = [elements.container, wrapper]; // Ignore if click if not container or in video wrapper
16707
+
16708
+ if (!targets.includes(event.target) && !wrapper.contains(event.target)) {
16709
+ return;
16710
+ } // Touch devices will just show controls (if hidden)
16711
+
16712
+
16713
+ if (player.touch && player.config.hideControls) {
16714
+ return;
16715
+ }
16716
+
16717
+ if (player.ended) {
16718
+ _this.proxy(event, player.restart, 'restart');
16719
+
16720
+ _this.proxy(event, player.play, 'play');
16721
+ } else {
16722
+ _this.proxy(event, player.togglePlay, 'play');
16723
+ }
16724
+ });
16725
+ } // Disable right click
16726
+
16727
+
16728
+ if (player.supported.ui && player.config.disableContextMenu) {
16729
+ on.call(player, elements.wrapper, 'contextmenu', function (event) {
16730
+ event.preventDefault();
16731
+ }, false);
16732
+ } // Volume change
16733
+
16734
+
16735
+ on.call(player, player.media, 'volumechange', function () {
16736
+ // Save to storage
16737
+ player.storage.set({
16738
+ volume: player.volume,
16739
+ muted: player.muted
16740
+ });
16741
+ }); // Speed change
16742
+
16743
+ on.call(player, player.media, 'ratechange', function () {
16744
+ // Update UI
16745
+ controls.updateSetting.call(player, 'speed'); // Save to storage
16746
+
16747
+
16748
+ player.storage.set({
16749
+ speed: player.speed
16750
+ });
16751
+ }); // Quality change
16752
+
16753
+ on.call(player, player.media, 'qualitychange', function (event) {
16754
+ // Update UI
16755
+ controls.updateSetting.call(player, 'quality', null, event.detail.quality);
16756
+ }); // Update download link when ready and if quality changes
16757
+
16758
+ on.call(player, player.media, 'ready qualitychange', function () {
16759
+ controls.setDownloadUrl.call(player);
16760
+ }); // Proxy events to container
16761
+ // Bubble up key events for Edge
16762
+
16763
+ var proxyEvents = player.config.events.concat(['keyup', 'keydown']).join(' ');
16764
+ on.call(player, player.media, proxyEvents, function (event) {
16765
+ var _event$detail = event.detail,
16766
+ detail = _event$detail === void 0 ? {} : _event$detail; // Get error details from media
16767
+
16768
+ if (event.type === 'error') {
16769
+ detail = player.media.error;
16770
+ }
16771
+
16772
+ triggerEvent.call(player, elements.container, event.type, true, detail);
16773
+ });
16774
+ } // Run default and custom handlers
16775
+
16776
+ }, {
16777
+ key: "proxy",
16778
+ value: function proxy(event, defaultHandler, customHandlerKey) {
16779
+ var player = this.player;
16780
+ var customHandler = player.config.listeners[customHandlerKey];
16781
+ var hasCustomHandler = is$1.function(customHandler);
16782
+ var returned = true; // Execute custom handler
16783
+
16784
+ if (hasCustomHandler) {
16785
+ returned = customHandler.call(player, event);
16786
+ } // Only call default handler if not prevented in custom handler
16787
+
16788
+
16789
+ if (returned && is$1.function(defaultHandler)) {
16790
+ defaultHandler.call(player, event);
16791
+ }
16792
+ } // Trigger custom and default handlers
16793
+
16794
+ }, {
16795
+ key: "bind",
16796
+ value: function bind(element, type, defaultHandler, customHandlerKey) {
16797
+ var _this2 = this;
16798
+
16799
+ var passive = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;
16800
+ var player = this.player;
16801
+ var customHandler = player.config.listeners[customHandlerKey];
16802
+ var hasCustomHandler = is$1.function(customHandler);
16803
+ on.call(player, element, type, function (event) {
16804
+ return _this2.proxy(event, defaultHandler, customHandlerKey);
16805
+ }, passive && !hasCustomHandler);
16806
+ } // Listen for control events
16807
+
16808
+ }, {
16809
+ key: "controls",
16810
+ value: function controls$1() {
16811
+ var _this3 = this;
16812
+
16813
+ var player = this.player;
16814
+ var elements = player.elements; // IE doesn't support input event, so we fallback to change
16815
+
16816
+ var inputEvent = browser.isIE ? 'change' : 'input'; // Play/pause toggle
16817
+
16818
+ if (elements.buttons.play) {
16819
+ Array.from(elements.buttons.play).forEach(function (button) {
16820
+ _this3.bind(button, 'click', player.togglePlay, 'play');
16821
+ });
16822
+ } // Pause
16823
+
16824
+
16825
+ this.bind(elements.buttons.restart, 'click', player.restart, 'restart'); // Rewind
16826
+
16827
+ this.bind(elements.buttons.rewind, 'click', player.rewind, 'rewind'); // Rewind
16828
+
16829
+ this.bind(elements.buttons.fastForward, 'click', player.forward, 'fastForward'); // Mute toggle
16830
+
16831
+ this.bind(elements.buttons.mute, 'click', function () {
16832
+ player.muted = !player.muted;
16833
+ }, 'mute'); // Captions toggle
16834
+
16835
+ this.bind(elements.buttons.captions, 'click', function () {
16836
+ return player.toggleCaptions();
16837
+ }); // Download
16838
+
16839
+ this.bind(elements.buttons.download, 'click', function () {
16840
+ triggerEvent.call(player, player.media, 'download');
16841
+ }, 'download'); // Fullscreen toggle
16842
+
16843
+ this.bind(elements.buttons.fullscreen, 'click', function () {
16844
+ player.fullscreen.toggle();
16845
+ }, 'fullscreen'); // Picture-in-Picture
16846
+
16847
+ this.bind(elements.buttons.pip, 'click', function () {
16848
+ player.pip = 'toggle';
16849
+ }, 'pip'); // Airplay
16850
+
16851
+ this.bind(elements.buttons.airplay, 'click', player.airplay, 'airplay'); // Settings menu - click toggle
16852
+
16853
+ this.bind(elements.buttons.settings, 'click', function (event) {
16854
+ // Prevent the document click listener closing the menu
16855
+ event.stopPropagation();
16856
+
16857
+ controls.toggleMenu.call(player, event);
16858
+ }); // Settings menu - keyboard toggle
16859
+ // We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus
16860
+ // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143
16861
+
16862
+ this.bind(elements.buttons.settings, 'keyup', function (event) {
16863
+ var code = event.which; // We only care about space and return
16864
+
16865
+ if (![13, 32].includes(code)) {
16866
+ return;
16867
+ } // Because return triggers a click anyway, all we need to do is set focus
16868
+
16869
+
16870
+ if (code === 13) {
16871
+ controls.focusFirstMenuItem.call(player, null, true);
16872
+
16873
+ return;
16874
+ } // Prevent scroll
16875
+
16876
+
16877
+ event.preventDefault(); // Prevent playing video (Firefox)
16878
+
16879
+ event.stopPropagation(); // Toggle menu
16880
+
16881
+ controls.toggleMenu.call(player, event);
16882
+ }, null, false // Can't be passive as we're preventing default
16883
+ ); // Escape closes menu
16884
+
16885
+ this.bind(elements.settings.menu, 'keydown', function (event) {
16886
+ if (event.which === 27) {
16887
+ controls.toggleMenu.call(player, event);
16888
+ }
16889
+ }); // Set range input alternative "value", which matches the tooltip time (#954)
16890
+
16891
+ this.bind(elements.inputs.seek, 'mousedown mousemove', function (event) {
16892
+ var rect = elements.progress.getBoundingClientRect();
16893
+ var percent = 100 / rect.width * (event.pageX - rect.left);
16894
+ event.currentTarget.setAttribute('seek-value', percent);
16895
+ }); // Pause while seeking
16896
+
16897
+ this.bind(elements.inputs.seek, 'mousedown mouseup keydown keyup touchstart touchend', function (event) {
16898
+ var seek = event.currentTarget;
16899
+ var code = event.keyCode ? event.keyCode : event.which;
16900
+ var attribute = 'play-on-seeked';
16901
+
16902
+ if (is$1.keyboardEvent(event) && code !== 39 && code !== 37) {
16903
+ return;
16904
+ } // Record seek time so we can prevent hiding controls for a few seconds after seek
16905
+
16906
+
16907
+ player.lastSeekTime = Date.now(); // Was playing before?
16908
+
16909
+ var play = seek.hasAttribute(attribute); // Done seeking
16910
+
16911
+ var done = ['mouseup', 'touchend', 'keyup'].includes(event.type); // If we're done seeking and it was playing, resume playback
16912
+
16913
+ if (play && done) {
16914
+ seek.removeAttribute(attribute);
16915
+ player.play();
16916
+ } else if (!done && player.playing) {
16917
+ seek.setAttribute(attribute, '');
16918
+ player.pause();
16919
+ }
16920
+ }); // Fix range inputs on iOS
16921
+ // Super weird iOS bug where after you interact with an <input type="range">,
16922
+ // it takes over further interactions on the page. This is a hack
16923
+
16924
+ if (browser.isIos) {
16925
+ var inputs = getElements.call(player, 'input[type="range"]');
16926
+ Array.from(inputs).forEach(function (input) {
16927
+ return _this3.bind(input, inputEvent, function (event) {
16928
+ return repaint(event.target);
16929
+ });
16930
+ });
16931
+ } // Seek
16932
+
16933
+
16934
+ this.bind(elements.inputs.seek, inputEvent, function (event) {
16935
+ var seek = event.currentTarget; // If it exists, use seek-value instead of "value" for consistency with tooltip time (#954)
16936
+
16937
+ var seekTo = seek.getAttribute('seek-value');
16938
+
16939
+ if (is$1.empty(seekTo)) {
16940
+ seekTo = seek.value;
16941
+ }
16942
+
16943
+ seek.removeAttribute('seek-value');
16944
+ player.currentTime = seekTo / seek.max * player.duration;
16945
+ }, 'seek'); // Seek tooltip
16946
+
16947
+ this.bind(elements.progress, 'mouseenter mouseleave mousemove', function (event) {
16948
+ return controls.updateSeekTooltip.call(player, event);
16949
+ }); // Preview thumbnails plugin
16950
+ // TODO: Really need to work on some sort of plug-in wide event bus or pub-sub for this
16951
+
16952
+ this.bind(elements.progress, 'mousemove touchmove', function (event) {
16953
+ var previewThumbnails = player.previewThumbnails;
16954
+
16955
+ if (previewThumbnails && previewThumbnails.loaded) {
16956
+ previewThumbnails.startMove(event);
16957
+ }
16958
+ }); // Hide thumbnail preview - on mouse click, mouse leave, and video play/seek. All four are required, e.g., for buffering
16959
+
16960
+ this.bind(elements.progress, 'mouseleave click', function () {
16961
+ var previewThumbnails = player.previewThumbnails;
16962
+
16963
+ if (previewThumbnails && previewThumbnails.loaded) {
16964
+ previewThumbnails.endMove(false, true);
16965
+ }
16966
+ }); // Show scrubbing preview
16967
+
16968
+ this.bind(elements.progress, 'mousedown touchstart', function (event) {
16969
+ var previewThumbnails = player.previewThumbnails;
16970
+
16971
+ if (previewThumbnails && previewThumbnails.loaded) {
16972
+ previewThumbnails.startScrubbing(event);
16973
+ }
16974
+ });
16975
+ this.bind(elements.progress, 'mouseup touchend', function (event) {
16976
+ var previewThumbnails = player.previewThumbnails;
16977
+
16978
+ if (previewThumbnails && previewThumbnails.loaded) {
16979
+ previewThumbnails.endScrubbing(event);
16980
+ }
16981
+ }); // Polyfill for lower fill in <input type="range"> for webkit
16982
+
16983
+ if (browser.isWebkit) {
16984
+ Array.from(getElements.call(player, 'input[type="range"]')).forEach(function (element) {
16985
+ _this3.bind(element, 'input', function (event) {
16986
+ return controls.updateRangeFill.call(player, event.target);
16987
+ });
16988
+ });
16989
+ } // Current time invert
16990
+ // Only if one time element is used for both currentTime and duration
16991
+
16992
+
16993
+ if (player.config.toggleInvert && !is$1.element(elements.display.duration)) {
16994
+ this.bind(elements.display.currentTime, 'click', function () {
16995
+ // Do nothing if we're at the start
16996
+ if (player.currentTime === 0) {
16997
+ return;
16998
+ }
16999
+
17000
+ player.config.invertTime = !player.config.invertTime;
17001
+
17002
+ controls.timeUpdate.call(player);
17003
+ });
17004
+ } // Volume
17005
+
17006
+
17007
+ this.bind(elements.inputs.volume, inputEvent, function (event) {
17008
+ player.volume = event.target.value;
17009
+ }, 'volume'); // Update controls.hover state (used for ui.toggleControls to avoid hiding when interacting)
17010
+
17011
+ this.bind(elements.controls, 'mouseenter mouseleave', function (event) {
17012
+ elements.controls.hover = !player.touch && event.type === 'mouseenter';
17013
+ }); // Update controls.pressed state (used for ui.toggleControls to avoid hiding when interacting)
17014
+
17015
+ this.bind(elements.controls, 'mousedown mouseup touchstart touchend touchcancel', function (event) {
17016
+ elements.controls.pressed = ['mousedown', 'touchstart'].includes(event.type);
17017
+ }); // Show controls when they receive focus (e.g., when using keyboard tab key)
17018
+
17019
+ this.bind(elements.controls, 'focusin', function () {
17020
+ var config = player.config,
17021
+ timers = player.timers; // Skip transition to prevent focus from scrolling the parent element
17022
+
17023
+ toggleClass(elements.controls, config.classNames.noTransition, true); // Toggle
17024
+
17025
+ ui.toggleControls.call(player, true); // Restore transition
17026
+
17027
+ setTimeout(function () {
17028
+ toggleClass(elements.controls, config.classNames.noTransition, false);
17029
+ }, 0); // Delay a little more for mouse users
17030
+
17031
+ var delay = _this3.touch ? 3000 : 4000; // Clear timer
17032
+
17033
+ clearTimeout(timers.controls); // Hide again after delay
17034
+
17035
+ timers.controls = setTimeout(function () {
17036
+ return ui.toggleControls.call(player, false);
17037
+ }, delay);
17038
+ }); // Mouse wheel for volume
17039
+
17040
+ this.bind(elements.inputs.volume, 'wheel', function (event) {
17041
+ // Detect "natural" scroll - suppored on OS X Safari only
17042
+ // Other browsers on OS X will be inverted until support improves
17043
+ var inverted = event.webkitDirectionInvertedFromDevice; // Get delta from event. Invert if `inverted` is true
17044
+
17045
+ var _map = [event.deltaX, -event.deltaY].map(function (value) {
17046
+ return inverted ? -value : value;
17047
+ }),
17048
+ _map2 = _slicedToArray(_map, 2),
17049
+ x = _map2[0],
17050
+ y = _map2[1]; // Using the biggest delta, normalize to 1 or -1 (or 0 if no delta)
17051
+
17052
+
17053
+ var direction = Math.sign(Math.abs(x) > Math.abs(y) ? x : y); // Change the volume by 2%
17054
+
17055
+ player.increaseVolume(direction / 50); // Don't break page scrolling at max and min
17056
+
17057
+ var volume = player.media.volume;
17058
+
17059
+ if (direction === 1 && volume < 1 || direction === -1 && volume > 0) {
17060
+ event.preventDefault();
17061
+ }
17062
+ }, 'volume', false);
17063
+ }
17064
+ }]);
17065
+
17066
+ return Listeners;
17067
+ }();
17068
+
17069
+ var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
17070
+
17071
+ function createCommonjsModule(fn, module) {
17072
+ return module = { exports: {} }, fn(module, module.exports), module.exports;
17073
+ }
17074
+
17075
+ var loadjs_umd = createCommonjsModule(function (module, exports) {
17076
+ (function (root, factory) {
17077
+ {
17078
+ module.exports = factory();
17079
+ }
17080
+ })(commonjsGlobal, function () {
17081
+ /**
17082
+ * Global dependencies.
17083
+ * @global {Object} document - DOM
17084
+ */
17085
+ var devnull = function devnull() {},
17086
+ bundleIdCache = {},
17087
+ bundleResultCache = {},
17088
+ bundleCallbackQueue = {};
17089
+ /**
17090
+ * Subscribe to bundle load event.
17091
+ * @param {string[]} bundleIds - Bundle ids
17092
+ * @param {Function} callbackFn - The callback function
17093
+ */
17094
+
17095
+
17096
+ function subscribe(bundleIds, callbackFn) {
17097
+ // listify
17098
+ bundleIds = bundleIds.push ? bundleIds : [bundleIds];
17099
+ var depsNotFound = [],
17100
+ i = bundleIds.length,
17101
+ numWaiting = i,
17102
+ fn,
17103
+ bundleId,
17104
+ r,
17105
+ q; // define callback function
17106
+
17107
+ fn = function fn(bundleId, pathsNotFound) {
17108
+ if (pathsNotFound.length) depsNotFound.push(bundleId);
17109
+ numWaiting--;
17110
+ if (!numWaiting) callbackFn(depsNotFound);
17111
+ }; // register callback
17112
+
17113
+
17114
+ while (i--) {
17115
+ bundleId = bundleIds[i]; // execute callback if in result cache
17116
+
17117
+ r = bundleResultCache[bundleId];
17118
+
17119
+ if (r) {
17120
+ fn(bundleId, r);
17121
+ continue;
17122
+ } // add to callback queue
17123
+
17124
+
17125
+ q = bundleCallbackQueue[bundleId] = bundleCallbackQueue[bundleId] || [];
17126
+ q.push(fn);
17127
+ }
17128
+ }
17129
+ /**
17130
+ * Publish bundle load event.
17131
+ * @param {string} bundleId - Bundle id
17132
+ * @param {string[]} pathsNotFound - List of files not found
17133
+ */
17134
+
17135
+
17136
+ function publish(bundleId, pathsNotFound) {
17137
+ // exit if id isn't defined
17138
+ if (!bundleId) return;
17139
+ var q = bundleCallbackQueue[bundleId]; // cache result
17140
+
17141
+ bundleResultCache[bundleId] = pathsNotFound; // exit if queue is empty
17142
+
17143
+ if (!q) return; // empty callback queue
17144
+
17145
+ while (q.length) {
17146
+ q[0](bundleId, pathsNotFound);
17147
+ q.splice(0, 1);
17148
+ }
17149
+ }
17150
+ /**
17151
+ * Execute callbacks.
17152
+ * @param {Object or Function} args - The callback args
17153
+ * @param {string[]} depsNotFound - List of dependencies not found
17154
+ */
17155
+
17156
+
17157
+ function executeCallbacks(args, depsNotFound) {
17158
+ // accept function as argument
17159
+ if (args.call) args = {
17160
+ success: args
17161
+ }; // success and error callbacks
17162
+
17163
+ if (depsNotFound.length) (args.error || devnull)(depsNotFound);else (args.success || devnull)(args);
17164
+ }
17165
+ /**
17166
+ * Load individual file.
17167
+ * @param {string} path - The file path
17168
+ * @param {Function} callbackFn - The callback function
17169
+ */
17170
+
17171
+
17172
+ function loadFile(path, callbackFn, args, numTries) {
17173
+ var doc = document,
17174
+ async = args.async,
17175
+ maxTries = (args.numRetries || 0) + 1,
17176
+ beforeCallbackFn = args.before || devnull,
17177
+ pathStripped = path.replace(/^(css|img)!/, ''),
17178
+ isLegacyIECss,
17179
+ e;
17180
+ numTries = numTries || 0;
17181
+
17182
+ if (/(^css!|\.css$)/.test(path)) {
17183
+ // css
17184
+ e = doc.createElement('link');
17185
+ e.rel = 'stylesheet';
17186
+ e.href = pathStripped; // tag IE9+
17187
+
17188
+ isLegacyIECss = 'hideFocus' in e; // use preload in IE Edge (to detect load errors)
17189
+
17190
+ if (isLegacyIECss && e.relList) {
17191
+ isLegacyIECss = 0;
17192
+ e.rel = 'preload';
17193
+ e.as = 'style';
17194
+ }
17195
+ } else if (/(^img!|\.(png|gif|jpg|svg)$)/.test(path)) {
17196
+ // image
17197
+ e = doc.createElement('img');
17198
+ e.src = pathStripped;
17199
+ } else {
17200
+ // javascript
17201
+ e = doc.createElement('script');
17202
+ e.src = path;
17203
+ e.async = async === undefined ? true : async;
17204
+ }
17205
+
17206
+ e.onload = e.onerror = e.onbeforeload = function (ev) {
17207
+ var result = ev.type[0]; // treat empty stylesheets as failures to get around lack of onerror
17208
+ // support in IE9-11
17209
+
17210
+ if (isLegacyIECss) {
17211
+ try {
17212
+ if (!e.sheet.cssText.length) result = 'e';
17213
+ } catch (x) {
17214
+ // sheets objects created from load errors don't allow access to
17215
+ // `cssText` (unless error is Code:18 SecurityError)
17216
+ if (x.code != 18) result = 'e';
17217
+ }
17218
+ } // handle retries in case of load failure
17219
+
17220
+
17221
+ if (result == 'e') {
17222
+ // increment counter
17223
+ numTries += 1; // exit function and try again
17224
+
17225
+ if (numTries < maxTries) {
17226
+ return loadFile(path, callbackFn, args, numTries);
17227
+ }
17228
+ } else if (e.rel == 'preload' && e.as == 'style') {
17229
+ // activate preloaded stylesheets
17230
+ return e.rel = 'stylesheet'; // jshint ignore:line
17231
+ } // execute callback
17232
+
17233
+
17234
+ callbackFn(path, result, ev.defaultPrevented);
17235
+ }; // add to document (unless callback returns `false`)
17236
+
17237
+
17238
+ if (beforeCallbackFn(path, e) !== false) doc.head.appendChild(e);
17239
+ }
17240
+ /**
17241
+ * Load multiple files.
17242
+ * @param {string[]} paths - The file paths
17243
+ * @param {Function} callbackFn - The callback function
17244
+ */
17245
+
17246
+
17247
+ function loadFiles(paths, callbackFn, args) {
17248
+ // listify paths
17249
+ paths = paths.push ? paths : [paths];
17250
+ var numWaiting = paths.length,
17251
+ x = numWaiting,
17252
+ pathsNotFound = [],
17253
+ fn,
17254
+ i; // define callback function
17255
+
17256
+ fn = function fn(path, result, defaultPrevented) {
17257
+ // handle error
17258
+ if (result == 'e') pathsNotFound.push(path); // handle beforeload event. If defaultPrevented then that means the load
17259
+ // will be blocked (ex. Ghostery/ABP on Safari)
17260
+
17261
+ if (result == 'b') {
17262
+ if (defaultPrevented) pathsNotFound.push(path);else return;
17263
+ }
17264
+
17265
+ numWaiting--;
17266
+ if (!numWaiting) callbackFn(pathsNotFound);
17267
+ }; // load scripts
17268
+
17269
+
17270
+ for (i = 0; i < x; i++) {
17271
+ loadFile(paths[i], fn, args);
17272
+ }
17273
+ }
17274
+ /**
17275
+ * Initiate script load and register bundle.
17276
+ * @param {(string|string[])} paths - The file paths
17277
+ * @param {(string|Function|Object)} [arg1] - The (1) bundleId or (2) success
17278
+ * callback or (3) object literal with success/error arguments, numRetries,
17279
+ * etc.
17280
+ * @param {(Function|Object)} [arg2] - The (1) success callback or (2) object
17281
+ * literal with success/error arguments, numRetries, etc.
17282
+ */
17283
+
17284
+
17285
+ function loadjs(paths, arg1, arg2) {
17286
+ var bundleId, args; // bundleId (if string)
17287
+
17288
+ if (arg1 && arg1.trim) bundleId = arg1; // args (default is {})
17289
+
17290
+ args = (bundleId ? arg2 : arg1) || {}; // throw error if bundle is already defined
17291
+
17292
+ if (bundleId) {
17293
+ if (bundleId in bundleIdCache) {
17294
+ throw "LoadJS";
17295
+ } else {
17296
+ bundleIdCache[bundleId] = true;
17297
+ }
17298
+ }
17299
+
17300
+ function loadFn(resolve, reject) {
17301
+ loadFiles(paths, function (pathsNotFound) {
17302
+ // execute callbacks
17303
+ executeCallbacks(args, pathsNotFound); // resolve Promise
17304
+
17305
+ if (resolve) {
17306
+ executeCallbacks({
17307
+ success: resolve,
17308
+ error: reject
17309
+ }, pathsNotFound);
17310
+ } // publish bundle load event
17311
+
17312
+
17313
+ publish(bundleId, pathsNotFound);
17314
+ }, args);
17315
+ }
17316
+
17317
+ if (args.returnPromise) return new Promise(loadFn);else loadFn();
17318
+ }
17319
+ /**
17320
+ * Execute callbacks when dependencies have been satisfied.
17321
+ * @param {(string|string[])} deps - List of bundle ids
17322
+ * @param {Object} args - success/error arguments
17323
+ */
17324
+
17325
+
17326
+ loadjs.ready = function ready(deps, args) {
17327
+ // subscribe to bundle load event
17328
+ subscribe(deps, function (depsNotFound) {
17329
+ // execute callbacks
17330
+ executeCallbacks(args, depsNotFound);
17331
+ });
17332
+ return loadjs;
17333
+ };
17334
+ /**
17335
+ * Manually satisfy bundle dependencies.
17336
+ * @param {string} bundleId - The bundle id
17337
+ */
17338
+
17339
+
17340
+ loadjs.done = function done(bundleId) {
17341
+ publish(bundleId, []);
17342
+ };
17343
+ /**
17344
+ * Reset loadjs dependencies statuses
17345
+ */
17346
+
17347
+
17348
+ loadjs.reset = function reset() {
17349
+ bundleIdCache = {};
17350
+ bundleResultCache = {};
17351
+ bundleCallbackQueue = {};
17352
+ };
17353
+ /**
17354
+ * Determine if bundle has already been defined
17355
+ * @param String} bundleId - The bundle id
17356
+ */
17357
+
17358
+
17359
+ loadjs.isDefined = function isDefined(bundleId) {
17360
+ return bundleId in bundleIdCache;
17361
+ }; // export
17362
+
17363
+
17364
+ return loadjs;
17365
+ });
17366
+ });
17367
+
17368
+ // ==========================================================================
17369
+ function loadScript(url) {
17370
+ return new Promise(function (resolve, reject) {
17371
+ loadjs_umd(url, {
17372
+ success: resolve,
17373
+ error: reject
17374
+ });
17375
+ });
17376
+ }
17377
+
17378
+ function parseId(url) {
17379
+ if (is$1.empty(url)) {
17380
+ return null;
17381
+ }
17382
+
17383
+ if (is$1.number(Number(url))) {
17384
+ return url;
17385
+ }
17386
+
17387
+ var regex = /^.*(vimeo.com\/|video\/)(\d+).*/;
17388
+ return url.match(regex) ? RegExp.$2 : url;
17389
+ } // Set playback state and trigger change (only on actual change)
17390
+
17391
+
17392
+ function assurePlaybackState(play) {
17393
+ if (play && !this.embed.hasPlayed) {
17394
+ this.embed.hasPlayed = true;
17395
+ }
17396
+
17397
+ if (this.media.paused === play) {
17398
+ this.media.paused = !play;
17399
+ triggerEvent.call(this, this.media, play ? 'play' : 'pause');
17400
+ }
17401
+ }
17402
+
17403
+ var vimeo = {
17404
+ setup: function setup() {
17405
+ var _this = this;
17406
+
17407
+ // Add embed class for responsive
17408
+ toggleClass(this.elements.wrapper, this.config.classNames.embed, true); // Set intial ratio
17409
+
17410
+ setAspectRatio.call(this); // Load the SDK if not already
17411
+
17412
+ if (!is$1.object(window.Vimeo)) {
17413
+ loadScript(this.config.urls.vimeo.sdk).then(function () {
17414
+ vimeo.ready.call(_this);
17415
+ }).catch(function (error) {
17416
+ _this.debug.warn('Vimeo SDK (player.js) failed to load', error);
17417
+ });
17418
+ } else {
17419
+ vimeo.ready.call(this);
17420
+ }
17421
+ },
17422
+ // API Ready
17423
+ ready: function ready() {
17424
+ var _this2 = this;
17425
+
17426
+ var player = this;
17427
+ var config = player.config.vimeo; // Get Vimeo params for the iframe
17428
+
17429
+ var params = buildUrlParams(extend({}, {
17430
+ loop: player.config.loop.active,
17431
+ autoplay: player.autoplay,
17432
+ muted: player.muted,
17433
+ gesture: 'media',
17434
+ playsinline: !this.config.fullscreen.iosNative
17435
+ }, config)); // Get the source URL or ID
17436
+
17437
+ var source = player.media.getAttribute('src'); // Get from <div> if needed
17438
+
17439
+ if (is$1.empty(source)) {
17440
+ source = player.media.getAttribute(player.config.attributes.embed.id);
17441
+ }
17442
+
17443
+ var id = parseId(source); // Build an iframe
17444
+
17445
+ var iframe = createElement('iframe');
17446
+ var src = format(player.config.urls.vimeo.iframe, id, params);
17447
+ iframe.setAttribute('src', src);
17448
+ iframe.setAttribute('allowfullscreen', '');
17449
+ iframe.setAttribute('allowtransparency', '');
17450
+ iframe.setAttribute('allow', 'autoplay'); // Get poster, if already set
17451
+
17452
+ var poster = player.poster; // Inject the package
17453
+
17454
+ var wrapper = createElement('div', {
17455
+ poster: poster,
17456
+ class: player.config.classNames.embedContainer
17457
+ });
17458
+ wrapper.appendChild(iframe);
17459
+ player.media = replaceElement(wrapper, player.media); // Get poster image
17460
+
17461
+ fetch(format(player.config.urls.vimeo.api, id), 'json').then(function (response) {
17462
+ if (is$1.empty(response)) {
17463
+ return;
17464
+ } // Get the URL for thumbnail
17465
+
17466
+
17467
+ var url = new URL(response[0].thumbnail_large); // Get original image
17468
+
17469
+ url.pathname = "".concat(url.pathname.split('_')[0], ".jpg"); // Set and show poster
17470
+
17471
+ ui.setPoster.call(player, url.href).catch(function () {});
17472
+ }); // Setup instance
17473
+ // https://github.com/vimeo/player.js
17474
+
17475
+ player.embed = new window.Vimeo.Player(iframe, {
17476
+ autopause: player.config.autopause,
17477
+ muted: player.muted
17478
+ });
17479
+ player.media.paused = true;
17480
+ player.media.currentTime = 0; // Disable native text track rendering
17481
+
17482
+ if (player.supported.ui) {
17483
+ player.embed.disableTextTrack();
17484
+ } // Create a faux HTML5 API using the Vimeo API
17485
+
17486
+
17487
+ player.media.play = function () {
17488
+ assurePlaybackState.call(player, true);
17489
+ return player.embed.play();
17490
+ };
17491
+
17492
+ player.media.pause = function () {
17493
+ assurePlaybackState.call(player, false);
17494
+ return player.embed.pause();
17495
+ };
17496
+
17497
+ player.media.stop = function () {
17498
+ player.pause();
17499
+ player.currentTime = 0;
17500
+ }; // Seeking
17501
+
17502
+
17503
+ var currentTime = player.media.currentTime;
17504
+ Object.defineProperty(player.media, 'currentTime', {
17505
+ get: function get() {
17506
+ return currentTime;
17507
+ },
17508
+ set: function set(time) {
17509
+ // Vimeo will automatically play on seek if the video hasn't been played before
17510
+ // Get current paused state and volume etc
17511
+ var embed = player.embed,
17512
+ media = player.media,
17513
+ paused = player.paused,
17514
+ volume = player.volume;
17515
+ var restorePause = paused && !embed.hasPlayed; // Set seeking state and trigger event
17516
+
17517
+ media.seeking = true;
17518
+ triggerEvent.call(player, media, 'seeking'); // If paused, mute until seek is complete
17519
+
17520
+ Promise.resolve(restorePause && embed.setVolume(0)) // Seek
17521
+ .then(function () {
17522
+ return embed.setCurrentTime(time);
17523
+ }) // Restore paused
17524
+ .then(function () {
17525
+ return restorePause && embed.pause();
17526
+ }) // Restore volume
17527
+ .then(function () {
17528
+ return restorePause && embed.setVolume(volume);
17529
+ }).catch(function () {// Do nothing
17530
+ });
17531
+ }
17532
+ }); // Playback speed
17533
+
17534
+ var speed = player.config.speed.selected;
17535
+ Object.defineProperty(player.media, 'playbackRate', {
17536
+ get: function get() {
17537
+ return speed;
17538
+ },
17539
+ set: function set(input) {
17540
+ player.embed.setPlaybackRate(input).then(function () {
17541
+ speed = input;
17542
+ triggerEvent.call(player, player.media, 'ratechange');
17543
+ }).catch(function (error) {
17544
+ // Hide menu item (and menu if empty)
17545
+ if (error.name === 'Error') {
17546
+ controls.setSpeedMenu.call(player, []);
17547
+ }
17548
+ });
17549
+ }
17550
+ }); // Volume
17551
+
17552
+ var volume = player.config.volume;
17553
+ Object.defineProperty(player.media, 'volume', {
17554
+ get: function get() {
17555
+ return volume;
17556
+ },
17557
+ set: function set(input) {
17558
+ player.embed.setVolume(input).then(function () {
17559
+ volume = input;
17560
+ triggerEvent.call(player, player.media, 'volumechange');
17561
+ });
17562
+ }
17563
+ }); // Muted
17564
+
17565
+ var muted = player.config.muted;
17566
+ Object.defineProperty(player.media, 'muted', {
17567
+ get: function get() {
17568
+ return muted;
17569
+ },
17570
+ set: function set(input) {
17571
+ var toggle = is$1.boolean(input) ? input : false;
17572
+ player.embed.setVolume(toggle ? 0 : player.config.volume).then(function () {
17573
+ muted = toggle;
17574
+ triggerEvent.call(player, player.media, 'volumechange');
17575
+ });
17576
+ }
17577
+ }); // Loop
17578
+
17579
+ var loop = player.config.loop;
17580
+ Object.defineProperty(player.media, 'loop', {
17581
+ get: function get() {
17582
+ return loop;
17583
+ },
17584
+ set: function set(input) {
17585
+ var toggle = is$1.boolean(input) ? input : player.config.loop.active;
17586
+ player.embed.setLoop(toggle).then(function () {
17587
+ loop = toggle;
17588
+ });
17589
+ }
17590
+ }); // Source
17591
+
17592
+ var currentSrc;
17593
+ player.embed.getVideoUrl().then(function (value) {
17594
+ currentSrc = value;
17595
+ controls.setDownloadUrl.call(player);
17596
+ }).catch(function (error) {
17597
+ _this2.debug.warn(error);
17598
+ });
17599
+ Object.defineProperty(player.media, 'currentSrc', {
17600
+ get: function get() {
17601
+ return currentSrc;
17602
+ }
17603
+ }); // Ended
17604
+
17605
+ Object.defineProperty(player.media, 'ended', {
17606
+ get: function get() {
17607
+ return player.currentTime === player.duration;
17608
+ }
17609
+ }); // Set aspect ratio based on video size
17610
+
17611
+ Promise.all([player.embed.getVideoWidth(), player.embed.getVideoHeight()]).then(function (dimensions) {
17612
+ var _dimensions = _slicedToArray(dimensions, 2),
17613
+ width = _dimensions[0],
17614
+ height = _dimensions[1];
17615
+
17616
+ player.embed.ratio = [width, height];
17617
+ setAspectRatio.call(_this2);
17618
+ }); // Set autopause
17619
+
17620
+ player.embed.setAutopause(player.config.autopause).then(function (state) {
17621
+ player.config.autopause = state;
17622
+ }); // Get title
17623
+
17624
+ player.embed.getVideoTitle().then(function (title) {
17625
+ player.config.title = title;
17626
+ ui.setTitle.call(_this2);
17627
+ }); // Get current time
17628
+
17629
+ player.embed.getCurrentTime().then(function (value) {
17630
+ currentTime = value;
17631
+ triggerEvent.call(player, player.media, 'timeupdate');
17632
+ }); // Get duration
17633
+
17634
+ player.embed.getDuration().then(function (value) {
17635
+ player.media.duration = value;
17636
+ triggerEvent.call(player, player.media, 'durationchange');
17637
+ }); // Get captions
17638
+
17639
+ player.embed.getTextTracks().then(function (tracks) {
17640
+ player.media.textTracks = tracks;
17641
+ captions.setup.call(player);
17642
+ });
17643
+ player.embed.on('cuechange', function (_ref) {
17644
+ var _ref$cues = _ref.cues,
17645
+ cues = _ref$cues === void 0 ? [] : _ref$cues;
17646
+ var strippedCues = cues.map(function (cue) {
17647
+ return stripHTML(cue.text);
17648
+ });
17649
+ captions.updateCues.call(player, strippedCues);
17650
+ });
17651
+ player.embed.on('loaded', function () {
17652
+ // Assure state and events are updated on autoplay
17653
+ player.embed.getPaused().then(function (paused) {
17654
+ assurePlaybackState.call(player, !paused);
17655
+
17656
+ if (!paused) {
17657
+ triggerEvent.call(player, player.media, 'playing');
17658
+ }
17659
+ });
17660
+
17661
+ if (is$1.element(player.embed.element) && player.supported.ui) {
17662
+ var frame = player.embed.element; // Fix keyboard focus issues
17663
+ // https://github.com/sampotts/plyr/issues/317
17664
+
17665
+ frame.setAttribute('tabindex', -1);
17666
+ }
17667
+ });
17668
+ player.embed.on('play', function () {
17669
+ assurePlaybackState.call(player, true);
17670
+ triggerEvent.call(player, player.media, 'playing');
17671
+ });
17672
+ player.embed.on('pause', function () {
17673
+ assurePlaybackState.call(player, false);
17674
+ });
17675
+ player.embed.on('timeupdate', function (data) {
17676
+ player.media.seeking = false;
17677
+ currentTime = data.seconds;
17678
+ triggerEvent.call(player, player.media, 'timeupdate');
17679
+ });
17680
+ player.embed.on('progress', function (data) {
17681
+ player.media.buffered = data.percent;
17682
+ triggerEvent.call(player, player.media, 'progress'); // Check all loaded
17683
+
17684
+ if (parseInt(data.percent, 10) === 1) {
17685
+ triggerEvent.call(player, player.media, 'canplaythrough');
17686
+ } // Get duration as if we do it before load, it gives an incorrect value
17687
+ // https://github.com/sampotts/plyr/issues/891
17688
+
17689
+
17690
+ player.embed.getDuration().then(function (value) {
17691
+ if (value !== player.media.duration) {
17692
+ player.media.duration = value;
17693
+ triggerEvent.call(player, player.media, 'durationchange');
17694
+ }
17695
+ });
17696
+ });
17697
+ player.embed.on('seeked', function () {
17698
+ player.media.seeking = false;
17699
+ triggerEvent.call(player, player.media, 'seeked');
17700
+ });
17701
+ player.embed.on('ended', function () {
17702
+ player.media.paused = true;
17703
+ triggerEvent.call(player, player.media, 'ended');
17704
+ });
17705
+ player.embed.on('error', function (detail) {
17706
+ player.media.error = detail;
17707
+ triggerEvent.call(player, player.media, 'error');
17708
+ }); // Rebuild UI
17709
+
17710
+ setTimeout(function () {
17711
+ return ui.build.call(player);
17712
+ }, 0);
17713
+ }
17714
+ };
17715
+
17716
+ // ==========================================================================
17717
+
17718
+ function parseId$1(url) {
17719
+ if (is$1.empty(url)) {
17720
+ return null;
17721
+ }
17722
+
17723
+ var regex = /^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|&v=)([^#&?]*).*/;
17724
+ return url.match(regex) ? RegExp.$2 : url;
17725
+ } // Set playback state and trigger change (only on actual change)
17726
+
17727
+
17728
+ function assurePlaybackState$1(play) {
17729
+ if (play && !this.embed.hasPlayed) {
17730
+ this.embed.hasPlayed = true;
17731
+ }
17732
+
17733
+ if (this.media.paused === play) {
17734
+ this.media.paused = !play;
17735
+ triggerEvent.call(this, this.media, play ? 'play' : 'pause');
17736
+ }
17737
+ }
17738
+
17739
+ function getHost(config) {
17740
+ if (config.noCookie) {
17741
+ return 'https://www.youtube-nocookie.com';
17742
+ }
17743
+
17744
+ if (window.location.protocol === 'http:') {
17745
+ return 'http://www.youtube.com';
17746
+ } // Use YouTube's default
17747
+
17748
+
17749
+ return undefined;
17750
+ }
17751
+
17752
+ var youtube = {
17753
+ setup: function setup() {
17754
+ var _this = this;
17755
+
17756
+ // Add embed class for responsive
17757
+ toggleClass(this.elements.wrapper, this.config.classNames.embed, true); // Setup API
17758
+
17759
+ if (is$1.object(window.YT) && is$1.function(window.YT.Player)) {
17760
+ youtube.ready.call(this);
17761
+ } else {
17762
+ // Reference current global callback
17763
+ var callback = window.onYouTubeIframeAPIReady; // Set callback to process queue
17764
+
17765
+ window.onYouTubeIframeAPIReady = function () {
17766
+ // Call global callback if set
17767
+ if (is$1.function(callback)) {
17768
+ callback();
17769
+ }
17770
+
17771
+ youtube.ready.call(_this);
17772
+ }; // Load the SDK
17773
+
17774
+
17775
+ loadScript(this.config.urls.youtube.sdk).catch(function (error) {
17776
+ _this.debug.warn('YouTube API failed to load', error);
17777
+ });
17778
+ }
17779
+ },
17780
+ // Get the media title
17781
+ getTitle: function getTitle(videoId) {
17782
+ var _this2 = this;
17783
+
17784
+ var url = format(this.config.urls.youtube.api, videoId);
17785
+ fetch(url).then(function (data) {
17786
+ if (is$1.object(data)) {
17787
+ var title = data.title,
17788
+ height = data.height,
17789
+ width = data.width; // Set title
17790
+
17791
+ _this2.config.title = title;
17792
+ ui.setTitle.call(_this2); // Set aspect ratio
17793
+
17794
+ _this2.embed.ratio = [width, height];
17795
+ }
17796
+
17797
+ setAspectRatio.call(_this2);
17798
+ }).catch(function () {
17799
+ // Set aspect ratio
17800
+ setAspectRatio.call(_this2);
17801
+ });
17802
+ },
17803
+ // API ready
17804
+ ready: function ready() {
17805
+ var player = this; // Ignore already setup (race condition)
17806
+
17807
+ var currentId = player.media && player.media.getAttribute('id');
17808
+
17809
+ if (!is$1.empty(currentId) && currentId.startsWith('youtube-')) {
17810
+ return;
17811
+ } // Get the source URL or ID
17812
+
17813
+
17814
+ var source = player.media.getAttribute('src'); // Get from <div> if needed
17815
+
17816
+ if (is$1.empty(source)) {
17817
+ source = player.media.getAttribute(this.config.attributes.embed.id);
17818
+ } // Replace the <iframe> with a <div> due to YouTube API issues
17819
+
17820
+
17821
+ var videoId = parseId$1(source);
17822
+ var id = generateId(player.provider); // Get poster, if already set
17823
+
17824
+ var poster = player.poster; // Replace media element
17825
+
17826
+ var container = createElement('div', {
17827
+ id: id,
17828
+ poster: poster
17829
+ });
17830
+ player.media = replaceElement(container, player.media); // Id to poster wrapper
17831
+
17832
+ var posterSrc = function posterSrc(s) {
17833
+ return "https://i.ytimg.com/vi/".concat(videoId, "/").concat(s, "default.jpg");
17834
+ }; // Check thumbnail images in order of quality, but reject fallback thumbnails (120px wide)
17835
+
17836
+
17837
+ loadImage(posterSrc('maxres'), 121) // Higest quality and unpadded
17838
+ .catch(function () {
17839
+ return loadImage(posterSrc('sd'), 121);
17840
+ }) // 480p padded 4:3
17841
+ .catch(function () {
17842
+ return loadImage(posterSrc('hq'));
17843
+ }) // 360p padded 4:3. Always exists
17844
+ .then(function (image) {
17845
+ return ui.setPoster.call(player, image.src);
17846
+ }).then(function (src) {
17847
+ // If the image is padded, use background-size "cover" instead (like youtube does too with their posters)
17848
+ if (!src.includes('maxres')) {
17849
+ player.elements.poster.style.backgroundSize = 'cover';
17850
+ }
17851
+ }).catch(function () {});
17852
+ var config = player.config.youtube; // Setup instance
17853
+ // https://developers.google.com/youtube/iframe_api_reference
17854
+
17855
+ player.embed = new window.YT.Player(id, {
17856
+ videoId: videoId,
17857
+ host: getHost(config),
17858
+ playerVars: extend({}, {
17859
+ autoplay: player.config.autoplay ? 1 : 0,
17860
+ // Autoplay
17861
+ hl: player.config.hl,
17862
+ // iframe interface language
17863
+ controls: player.supported.ui ? 0 : 1,
17864
+ // Only show controls if not fully supported
17865
+ disablekb: 1,
17866
+ // Disable keyboard as we handle it
17867
+ playsinline: !player.config.fullscreen.iosNative ? 1 : 0,
17868
+ // Allow iOS inline playback
17869
+ // Captions are flaky on YouTube
17870
+ cc_load_policy: player.captions.active ? 1 : 0,
17871
+ cc_lang_pref: player.config.captions.language,
17872
+ // Tracking for stats
17873
+ widget_referrer: window ? window.location.href : null
17874
+ }, config),
17875
+ events: {
17876
+ onError: function onError(event) {
17877
+ // YouTube may fire onError twice, so only handle it once
17878
+ if (!player.media.error) {
17879
+ var code = event.data; // Messages copied from https://developers.google.com/youtube/iframe_api_reference#onError
17880
+
17881
+ var message = {
17882
+ 2: 'The request contains an invalid parameter value. For example, this error occurs if you specify a video ID that does not have 11 characters, or if the video ID contains invalid characters, such as exclamation points or asterisks.',
17883
+ 5: 'The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.',
17884
+ 100: 'The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private.',
17885
+ 101: 'The owner of the requested video does not allow it to be played in embedded players.',
17886
+ 150: 'The owner of the requested video does not allow it to be played in embedded players.'
17887
+ }[code] || 'An unknown error occured';
17888
+ player.media.error = {
17889
+ code: code,
17890
+ message: message
17891
+ };
17892
+ triggerEvent.call(player, player.media, 'error');
17893
+ }
17894
+ },
17895
+ onPlaybackRateChange: function onPlaybackRateChange(event) {
17896
+ // Get the instance
17897
+ var instance = event.target; // Get current speed
17898
+
17899
+ player.media.playbackRate = instance.getPlaybackRate();
17900
+ triggerEvent.call(player, player.media, 'ratechange');
17901
+ },
17902
+ onReady: function onReady(event) {
17903
+ // Bail if onReady has already been called. See issue #1108
17904
+ if (is$1.function(player.media.play)) {
17905
+ return;
17906
+ } // Get the instance
17907
+
17908
+
17909
+ var instance = event.target; // Get the title
17910
+
17911
+ youtube.getTitle.call(player, videoId); // Create a faux HTML5 API using the YouTube API
17912
+
17913
+ player.media.play = function () {
17914
+ assurePlaybackState$1.call(player, true);
17915
+ instance.playVideo();
17916
+ };
17917
+
17918
+ player.media.pause = function () {
17919
+ assurePlaybackState$1.call(player, false);
17920
+ instance.pauseVideo();
17921
+ };
17922
+
17923
+ player.media.stop = function () {
17924
+ instance.stopVideo();
17925
+ };
17926
+
17927
+ player.media.duration = instance.getDuration();
17928
+ player.media.paused = true; // Seeking
17929
+
17930
+ player.media.currentTime = 0;
17931
+ Object.defineProperty(player.media, 'currentTime', {
17932
+ get: function get() {
17933
+ return Number(instance.getCurrentTime());
17934
+ },
17935
+ set: function set(time) {
17936
+ // If paused and never played, mute audio preventively (YouTube starts playing on seek if the video hasn't been played yet).
17937
+ if (player.paused && !player.embed.hasPlayed) {
17938
+ player.embed.mute();
17939
+ } // Set seeking state and trigger event
17940
+
17941
+
17942
+ player.media.seeking = true;
17943
+ triggerEvent.call(player, player.media, 'seeking'); // Seek after events sent
17944
+
17945
+ instance.seekTo(time);
17946
+ }
17947
+ }); // Playback speed
17948
+
17949
+ Object.defineProperty(player.media, 'playbackRate', {
17950
+ get: function get() {
17951
+ return instance.getPlaybackRate();
17952
+ },
17953
+ set: function set(input) {
17954
+ instance.setPlaybackRate(input);
17955
+ }
17956
+ }); // Volume
17957
+
17958
+ var volume = player.config.volume;
17959
+ Object.defineProperty(player.media, 'volume', {
17960
+ get: function get() {
17961
+ return volume;
17962
+ },
17963
+ set: function set(input) {
17964
+ volume = input;
17965
+ instance.setVolume(volume * 100);
17966
+ triggerEvent.call(player, player.media, 'volumechange');
17967
+ }
17968
+ }); // Muted
17969
+
17970
+ var muted = player.config.muted;
17971
+ Object.defineProperty(player.media, 'muted', {
17972
+ get: function get() {
17973
+ return muted;
17974
+ },
17975
+ set: function set(input) {
17976
+ var toggle = is$1.boolean(input) ? input : muted;
17977
+ muted = toggle;
17978
+ instance[toggle ? 'mute' : 'unMute']();
17979
+ triggerEvent.call(player, player.media, 'volumechange');
17980
+ }
17981
+ }); // Source
17982
+
17983
+ Object.defineProperty(player.media, 'currentSrc', {
17984
+ get: function get() {
17985
+ return instance.getVideoUrl();
17986
+ }
17987
+ }); // Ended
17988
+
17989
+ Object.defineProperty(player.media, 'ended', {
17990
+ get: function get() {
17991
+ return player.currentTime === player.duration;
17992
+ }
17993
+ }); // Get available speeds
17994
+
17995
+ player.options.speed = instance.getAvailablePlaybackRates(); // Set the tabindex to avoid focus entering iframe
17996
+
17997
+ if (player.supported.ui) {
17998
+ player.media.setAttribute('tabindex', -1);
17999
+ }
18000
+
18001
+ triggerEvent.call(player, player.media, 'timeupdate');
18002
+ triggerEvent.call(player, player.media, 'durationchange'); // Reset timer
18003
+
18004
+ clearInterval(player.timers.buffering); // Setup buffering
18005
+
18006
+ player.timers.buffering = setInterval(function () {
18007
+ // Get loaded % from YouTube
18008
+ player.media.buffered = instance.getVideoLoadedFraction(); // Trigger progress only when we actually buffer something
18009
+
18010
+ if (player.media.lastBuffered === null || player.media.lastBuffered < player.media.buffered) {
18011
+ triggerEvent.call(player, player.media, 'progress');
18012
+ } // Set last buffer point
18013
+
18014
+
18015
+ player.media.lastBuffered = player.media.buffered; // Bail if we're at 100%
18016
+
18017
+ if (player.media.buffered === 1) {
18018
+ clearInterval(player.timers.buffering); // Trigger event
18019
+
18020
+ triggerEvent.call(player, player.media, 'canplaythrough');
18021
+ }
18022
+ }, 200); // Rebuild UI
18023
+
18024
+ setTimeout(function () {
18025
+ return ui.build.call(player);
18026
+ }, 50);
18027
+ },
18028
+ onStateChange: function onStateChange(event) {
18029
+ // Get the instance
18030
+ var instance = event.target; // Reset timer
18031
+
18032
+ clearInterval(player.timers.playing);
18033
+ var seeked = player.media.seeking && [1, 2].includes(event.data);
18034
+
18035
+ if (seeked) {
18036
+ // Unset seeking and fire seeked event
18037
+ player.media.seeking = false;
18038
+ triggerEvent.call(player, player.media, 'seeked');
18039
+ } // Handle events
18040
+ // -1 Unstarted
18041
+ // 0 Ended
18042
+ // 1 Playing
18043
+ // 2 Paused
18044
+ // 3 Buffering
18045
+ // 5 Video cued
18046
+
18047
+
18048
+ switch (event.data) {
18049
+ case -1:
18050
+ // Update scrubber
18051
+ triggerEvent.call(player, player.media, 'timeupdate'); // Get loaded % from YouTube
18052
+
18053
+ player.media.buffered = instance.getVideoLoadedFraction();
18054
+ triggerEvent.call(player, player.media, 'progress');
18055
+ break;
18056
+
18057
+ case 0:
18058
+ assurePlaybackState$1.call(player, false); // YouTube doesn't support loop for a single video, so mimick it.
18059
+
18060
+ if (player.media.loop) {
18061
+ // YouTube needs a call to `stopVideo` before playing again
18062
+ instance.stopVideo();
18063
+ instance.playVideo();
18064
+ } else {
18065
+ triggerEvent.call(player, player.media, 'ended');
18066
+ }
18067
+
18068
+ break;
18069
+
18070
+ case 1:
18071
+ // Restore paused state (YouTube starts playing on seek if the video hasn't been played yet)
18072
+ if (!player.config.autoplay && player.media.paused && !player.embed.hasPlayed) {
18073
+ player.media.pause();
18074
+ } else {
18075
+ assurePlaybackState$1.call(player, true);
18076
+ triggerEvent.call(player, player.media, 'playing'); // Poll to get playback progress
18077
+
18078
+ player.timers.playing = setInterval(function () {
18079
+ triggerEvent.call(player, player.media, 'timeupdate');
18080
+ }, 50); // Check duration again due to YouTube bug
18081
+ // https://github.com/sampotts/plyr/issues/374
18082
+ // https://code.google.com/p/gdata-issues/issues/detail?id=8690
18083
+
18084
+ if (player.media.duration !== instance.getDuration()) {
18085
+ player.media.duration = instance.getDuration();
18086
+ triggerEvent.call(player, player.media, 'durationchange');
18087
+ }
18088
+ }
18089
+
18090
+ break;
18091
+
18092
+ case 2:
18093
+ // Restore audio (YouTube starts playing on seek if the video hasn't been played yet)
18094
+ if (!player.muted) {
18095
+ player.embed.unMute();
18096
+ }
18097
+
18098
+ assurePlaybackState$1.call(player, false);
18099
+ break;
18100
+
18101
+ default:
18102
+ break;
18103
+ }
18104
+
18105
+ triggerEvent.call(player, player.elements.container, 'statechange', false, {
18106
+ code: event.data
18107
+ });
18108
+ }
18109
+ }
18110
+ });
18111
+ }
18112
+ };
18113
+
18114
+ // ==========================================================================
18115
+ var media = {
18116
+ // Setup media
18117
+ setup: function setup() {
18118
+ // If there's no media, bail
18119
+ if (!this.media) {
18120
+ this.debug.warn('No media element found!');
18121
+ return;
18122
+ } // Add type class
18123
+
18124
+
18125
+ toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', this.type), true); // Add provider class
18126
+
18127
+ toggleClass(this.elements.container, this.config.classNames.provider.replace('{0}', this.provider), true); // Add video class for embeds
18128
+ // This will require changes if audio embeds are added
18129
+
18130
+ if (this.isEmbed) {
18131
+ toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', 'video'), true);
18132
+ } // Inject the player wrapper
18133
+
18134
+
18135
+ if (this.isVideo) {
18136
+ // Create the wrapper div
18137
+ this.elements.wrapper = createElement('div', {
18138
+ class: this.config.classNames.video
18139
+ }); // Wrap the video in a container
18140
+
18141
+ wrap(this.media, this.elements.wrapper); // Faux poster container
18142
+
18143
+ this.elements.poster = createElement('div', {
18144
+ class: this.config.classNames.poster
18145
+ });
18146
+ this.elements.wrapper.appendChild(this.elements.poster);
18147
+ }
18148
+
18149
+ if (this.isHTML5) {
18150
+ html5.extend.call(this);
18151
+ } else if (this.isYouTube) {
18152
+ youtube.setup.call(this);
18153
+ } else if (this.isVimeo) {
18154
+ vimeo.setup.call(this);
18155
+ }
18156
+ }
18157
+ };
18158
+
18159
+ var destroy = function destroy(instance) {
18160
+ // Destroy our adsManager
18161
+ if (instance.manager) {
18162
+ instance.manager.destroy();
18163
+ } // Destroy our adsManager
18164
+
18165
+
18166
+ if (instance.elements.displayContainer) {
18167
+ instance.elements.displayContainer.destroy();
18168
+ }
18169
+
18170
+ instance.elements.container.remove();
18171
+ };
18172
+
18173
+ var Ads =
18174
+ /*#__PURE__*/
18175
+ function () {
18176
+ /**
18177
+ * Ads constructor.
18178
+ * @param {Object} player
18179
+ * @return {Ads}
18180
+ */
18181
+ function Ads(player) {
18182
+ var _this = this;
18183
+
18184
+ _classCallCheck(this, Ads);
18185
+
18186
+ this.player = player;
18187
+ this.config = player.config.ads;
18188
+ this.playing = false;
18189
+ this.initialized = false;
18190
+ this.elements = {
18191
+ container: null,
18192
+ displayContainer: null
18193
+ };
18194
+ this.manager = null;
18195
+ this.loader = null;
18196
+ this.cuePoints = null;
18197
+ this.events = {};
18198
+ this.safetyTimer = null;
18199
+ this.countdownTimer = null; // Setup a promise to resolve when the IMA manager is ready
18200
+
18201
+ this.managerPromise = new Promise(function (resolve, reject) {
18202
+ // The ad is loaded and ready
18203
+ _this.on('loaded', resolve); // Ads failed
18204
+
18205
+
18206
+ _this.on('error', reject);
18207
+ });
18208
+ this.load();
18209
+ }
18210
+
18211
+ _createClass(Ads, [{
18212
+ key: "load",
18213
+
18214
+ /**
18215
+ * Load the IMA SDK
18216
+ */
18217
+ value: function load() {
18218
+ var _this2 = this;
18219
+
18220
+ if (!this.enabled) {
18221
+ return;
18222
+ } // Check if the Google IMA3 SDK is loaded or load it ourselves
18223
+
18224
+
18225
+ if (!is$1.object(window.google) || !is$1.object(window.google.ima)) {
18226
+ loadScript(this.player.config.urls.googleIMA.sdk).then(function () {
18227
+ _this2.ready();
18228
+ }).catch(function () {
18229
+ // Script failed to load or is blocked
18230
+ _this2.trigger('error', new Error('Google IMA SDK failed to load'));
18231
+ });
18232
+ } else {
18233
+ this.ready();
18234
+ }
18235
+ }
18236
+ /**
18237
+ * Get the ads instance ready
18238
+ */
18239
+
18240
+ }, {
18241
+ key: "ready",
18242
+ value: function ready() {
18243
+ var _this3 = this;
18244
+
18245
+ // Double check we're enabled
18246
+ if (!this.enabled) {
18247
+ destroy(this);
18248
+ } // Start ticking our safety timer. If the whole advertisement
18249
+ // thing doesn't resolve within our set time; we bail
18250
+
18251
+
18252
+ this.startSafetyTimer(12000, 'ready()'); // Clear the safety timer
18253
+
18254
+ this.managerPromise.then(function () {
18255
+ _this3.clearSafetyTimer('onAdsManagerLoaded()');
18256
+ }); // Set listeners on the Plyr instance
18257
+
18258
+ this.listeners(); // Setup the IMA SDK
18259
+
18260
+ this.setupIMA();
18261
+ } // Build the tag URL
18262
+
18263
+ }, {
18264
+ key: "setupIMA",
18265
+
18266
+ /**
18267
+ * In order for the SDK to display ads for our video, we need to tell it where to put them,
18268
+ * so here we define our ad container. This div is set up to render on top of the video player.
18269
+ * Using the code below, we tell the SDK to render ads within that div. We also provide a
18270
+ * handle to the content video player - the SDK will poll the current time of our player to
18271
+ * properly place mid-rolls. After we create the ad display container, we initialize it. On
18272
+ * mobile devices, this initialization is done as the result of a user action.
18273
+ */
18274
+ value: function setupIMA() {
18275
+ // Create the container for our advertisements
18276
+ this.elements.container = createElement('div', {
18277
+ class: this.player.config.classNames.ads
18278
+ });
18279
+ this.player.elements.container.appendChild(this.elements.container); // So we can run VPAID2
18280
+
18281
+ google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED); // Set language
18282
+
18283
+ google.ima.settings.setLocale(this.player.config.ads.language); // Set playback for iOS10+
18284
+
18285
+ google.ima.settings.setDisableCustomPlaybackForIOS10Plus(this.player.config.playsinline); // We assume the adContainer is the video container of the plyr element that will house the ads
18286
+
18287
+ this.elements.displayContainer = new google.ima.AdDisplayContainer(this.elements.container, this.player.media); // Request video ads to be pre-loaded
18288
+
18289
+ this.requestAds();
18290
+ }
18291
+ /**
18292
+ * Request advertisements
18293
+ */
18294
+
18295
+ }, {
18296
+ key: "requestAds",
18297
+ value: function requestAds() {
18298
+ var _this4 = this;
18299
+
18300
+ var container = this.player.elements.container;
18301
+
18302
+ try {
18303
+ // Create ads loader
18304
+ this.loader = new google.ima.AdsLoader(this.elements.displayContainer); // Listen and respond to ads loaded and error events
18305
+
18306
+ this.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, function (event) {
18307
+ return _this4.onAdsManagerLoaded(event);
18308
+ }, false);
18309
+ this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) {
18310
+ return _this4.onAdError(error);
18311
+ }, false); // Request video ads
18312
+
18313
+ var request = new google.ima.AdsRequest();
18314
+ request.adTagUrl = this.tagUrl; // Specify the linear and nonlinear slot sizes. This helps the SDK
18315
+ // to select the correct creative if multiple are returned
18316
+
18317
+ request.linearAdSlotWidth = container.offsetWidth;
18318
+ request.linearAdSlotHeight = container.offsetHeight;
18319
+ request.nonLinearAdSlotWidth = container.offsetWidth;
18320
+ request.nonLinearAdSlotHeight = container.offsetHeight; // We only overlay ads as we only support video.
18321
+
18322
+ request.forceNonLinearFullSlot = false; // Mute based on current state
18323
+
18324
+ request.setAdWillPlayMuted(!this.player.muted);
18325
+ this.loader.requestAds(request);
18326
+ } catch (e) {
18327
+ this.onAdError(e);
18328
+ }
18329
+ }
18330
+ /**
18331
+ * Update the ad countdown
18332
+ * @param {Boolean} start
18333
+ */
18334
+
18335
+ }, {
18336
+ key: "pollCountdown",
18337
+ value: function pollCountdown() {
18338
+ var _this5 = this;
18339
+
18340
+ var start = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
18341
+
18342
+ if (!start) {
18343
+ clearInterval(this.countdownTimer);
18344
+ this.elements.container.removeAttribute('data-badge-text');
18345
+ return;
18346
+ }
18347
+
18348
+ var update = function update() {
18349
+ var time = formatTime(Math.max(_this5.manager.getRemainingTime(), 0));
18350
+ var label = "".concat(i18n.get('advertisement', _this5.player.config), " - ").concat(time);
18351
+
18352
+ _this5.elements.container.setAttribute('data-badge-text', label);
18353
+ };
18354
+
18355
+ this.countdownTimer = setInterval(update, 100);
18356
+ }
18357
+ /**
18358
+ * This method is called whenever the ads are ready inside the AdDisplayContainer
18359
+ * @param {Event} adsManagerLoadedEvent
18360
+ */
18361
+
18362
+ }, {
18363
+ key: "onAdsManagerLoaded",
18364
+ value: function onAdsManagerLoaded(event) {
18365
+ var _this6 = this;
18366
+
18367
+ // Load could occur after a source change (race condition)
18368
+ if (!this.enabled) {
18369
+ return;
18370
+ } // Get the ads manager
18371
+
18372
+
18373
+ var settings = new google.ima.AdsRenderingSettings(); // Tell the SDK to save and restore content video state on our behalf
18374
+
18375
+ settings.restoreCustomPlaybackStateOnAdBreakComplete = true;
18376
+ settings.enablePreloading = true; // The SDK is polling currentTime on the contentPlayback. And needs a duration
18377
+ // so it can determine when to start the mid- and post-roll
18378
+
18379
+ this.manager = event.getAdsManager(this.player, settings); // Get the cue points for any mid-rolls by filtering out the pre- and post-roll
18380
+
18381
+ this.cuePoints = this.manager.getCuePoints(); // Add listeners to the required events
18382
+ // Advertisement error events
18383
+
18384
+ this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) {
18385
+ return _this6.onAdError(error);
18386
+ }); // Advertisement regular events
18387
+
18388
+ Object.keys(google.ima.AdEvent.Type).forEach(function (type) {
18389
+ _this6.manager.addEventListener(google.ima.AdEvent.Type[type], function (e) {
18390
+ return _this6.onAdEvent(e);
18391
+ });
18392
+ }); // Resolve our adsManager
18393
+
18394
+ this.trigger('loaded');
18395
+ }
18396
+ }, {
18397
+ key: "addCuePoints",
18398
+ value: function addCuePoints() {
18399
+ var _this7 = this;
18400
+
18401
+ // Add advertisement cue's within the time line if available
18402
+ if (!is$1.empty(this.cuePoints)) {
18403
+ this.cuePoints.forEach(function (cuePoint) {
18404
+ if (cuePoint !== 0 && cuePoint !== -1 && cuePoint < _this7.player.duration) {
18405
+ var seekElement = _this7.player.elements.progress;
18406
+
18407
+ if (is$1.element(seekElement)) {
18408
+ var cuePercentage = 100 / _this7.player.duration * cuePoint;
18409
+ var cue = createElement('span', {
18410
+ class: _this7.player.config.classNames.cues
18411
+ });
18412
+ cue.style.left = "".concat(cuePercentage.toString(), "%");
18413
+ seekElement.appendChild(cue);
18414
+ }
18415
+ }
18416
+ });
18417
+ }
18418
+ }
18419
+ /**
18420
+ * This is where all the event handling takes place. Retrieve the ad from the event. Some
18421
+ * events (e.g. ALL_ADS_COMPLETED) don't have the ad object associated
18422
+ * https://developers.google.com/interactive-media-ads/docs/sdks/html5/v3/apis#ima.AdEvent.Type
18423
+ * @param {Event} event
18424
+ */
18425
+
18426
+ }, {
18427
+ key: "onAdEvent",
18428
+ value: function onAdEvent(event) {
18429
+ var _this8 = this;
18430
+
18431
+ var container = this.player.elements.container; // Retrieve the ad from the event. Some events (e.g. ALL_ADS_COMPLETED)
18432
+ // don't have ad object associated
18433
+
18434
+ var ad = event.getAd();
18435
+ var adData = event.getAdData(); // Proxy event
18436
+
18437
+ var dispatchEvent = function dispatchEvent(type) {
18438
+ triggerEvent.call(_this8.player, _this8.player.media, "ads".concat(type.replace(/_/g, '').toLowerCase()));
18439
+ }; // Bubble the event
18440
+
18441
+
18442
+ dispatchEvent(event.type);
18443
+
18444
+ switch (event.type) {
18445
+ case google.ima.AdEvent.Type.LOADED:
18446
+ // This is the first event sent for an ad - it is possible to determine whether the
18447
+ // ad is a video ad or an overlay
18448
+ this.trigger('loaded'); // Start countdown
18449
+
18450
+ this.pollCountdown(true);
18451
+
18452
+ if (!ad.isLinear()) {
18453
+ // Position AdDisplayContainer correctly for overlay
18454
+ ad.width = container.offsetWidth;
18455
+ ad.height = container.offsetHeight;
18456
+ } // console.info('Ad type: ' + event.getAd().getAdPodInfo().getPodIndex());
18457
+ // console.info('Ad time: ' + event.getAd().getAdPodInfo().getTimeOffset());
18458
+
18459
+
18460
+ break;
18461
+
18462
+ case google.ima.AdEvent.Type.STARTED:
18463
+ // Set volume to match player
18464
+ this.manager.setVolume(this.player.volume);
18465
+ break;
18466
+
18467
+ case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:
18468
+ // All ads for the current videos are done. We can now request new advertisements
18469
+ // in case the video is re-played
18470
+ // TODO: Example for what happens when a next video in a playlist would be loaded.
18471
+ // So here we load a new video when all ads are done.
18472
+ // Then we load new ads within a new adsManager. When the video
18473
+ // Is started - after - the ads are loaded, then we get ads.
18474
+ // You can also easily test cancelling and reloading by running
18475
+ // player.ads.cancel() and player.ads.play from the console I guess.
18476
+ // this.player.source = {
18477
+ // type: 'video',
18478
+ // title: 'View From A Blue Moon',
18479
+ // sources: [{
18480
+ // src:
18481
+ // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.mp4', type:
18482
+ // 'video/mp4', }], poster:
18483
+ // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.jpg', tracks:
18484
+ // [ { kind: 'captions', label: 'English', srclang: 'en', src:
18485
+ // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.en.vtt',
18486
+ // default: true, }, { kind: 'captions', label: 'French', srclang: 'fr', src:
18487
+ // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.fr.vtt', }, ],
18488
+ // };
18489
+ // TODO: So there is still this thing where a video should only be allowed to start
18490
+ // playing when the IMA SDK is ready or has failed
18491
+ this.loadAds();
18492
+ break;
18493
+
18494
+ case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED:
18495
+ // This event indicates the ad has started - the video player can adjust the UI,
18496
+ // for example display a pause button and remaining time. Fired when content should
18497
+ // be paused. This usually happens right before an ad is about to cover the content
18498
+ this.pauseContent();
18499
+ break;
18500
+
18501
+ case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:
18502
+ // This event indicates the ad has finished - the video player can perform
18503
+ // appropriate UI actions, such as removing the timer for remaining time detection.
18504
+ // Fired when content should be resumed. This usually happens when an ad finishes
18505
+ // or collapses
18506
+ this.pollCountdown();
18507
+ this.resumeContent();
18508
+ break;
18509
+
18510
+ case google.ima.AdEvent.Type.LOG:
18511
+ if (adData.adError) {
18512
+ this.player.debug.warn("Non-fatal ad error: ".concat(adData.adError.getMessage()));
18513
+ }
18514
+
18515
+ break;
18516
+
18517
+ default:
18518
+ break;
18519
+ }
18520
+ }
18521
+ /**
18522
+ * Any ad error handling comes through here
18523
+ * @param {Event} event
18524
+ */
18525
+
18526
+ }, {
18527
+ key: "onAdError",
18528
+ value: function onAdError(event) {
18529
+ this.cancel();
18530
+ this.player.debug.warn('Ads error', event);
18531
+ }
18532
+ /**
18533
+ * Setup hooks for Plyr and window events. This ensures
18534
+ * the mid- and post-roll launch at the correct time. And
18535
+ * resize the advertisement when the player resizes
18536
+ */
18537
+
18538
+ }, {
18539
+ key: "listeners",
18540
+ value: function listeners() {
18541
+ var _this9 = this;
18542
+
18543
+ var container = this.player.elements.container;
18544
+ var time;
18545
+ this.player.on('canplay', function () {
18546
+ _this9.addCuePoints();
18547
+ });
18548
+ this.player.on('ended', function () {
18549
+ _this9.loader.contentComplete();
18550
+ });
18551
+ this.player.on('timeupdate', function () {
18552
+ time = _this9.player.currentTime;
18553
+ });
18554
+ this.player.on('seeked', function () {
18555
+ var seekedTime = _this9.player.currentTime;
18556
+
18557
+ if (is$1.empty(_this9.cuePoints)) {
18558
+ return;
18559
+ }
18560
+
18561
+ _this9.cuePoints.forEach(function (cuePoint, index) {
18562
+ if (time < cuePoint && cuePoint < seekedTime) {
18563
+ _this9.manager.discardAdBreak();
18564
+
18565
+ _this9.cuePoints.splice(index, 1);
18566
+ }
18567
+ });
18568
+ }); // Listen to the resizing of the window. And resize ad accordingly
18569
+ // TODO: eventually implement ResizeObserver
18570
+
18571
+ window.addEventListener('resize', function () {
18572
+ if (_this9.manager) {
18573
+ _this9.manager.resize(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);
18574
+ }
18575
+ });
18576
+ }
18577
+ /**
18578
+ * Initialize the adsManager and start playing advertisements
18579
+ */
18580
+
18581
+ }, {
18582
+ key: "play",
18583
+ value: function play() {
18584
+ var _this10 = this;
18585
+
18586
+ var container = this.player.elements.container;
18587
+
18588
+ if (!this.managerPromise) {
18589
+ this.resumeContent();
18590
+ } // Play the requested advertisement whenever the adsManager is ready
18591
+
18592
+
18593
+ this.managerPromise.then(function () {
18594
+ // Set volume to match player
18595
+ _this10.manager.setVolume(_this10.player.volume); // Initialize the container. Must be done via a user action on mobile devices
18596
+
18597
+
18598
+ _this10.elements.displayContainer.initialize();
18599
+
18600
+ try {
18601
+ if (!_this10.initialized) {
18602
+ // Initialize the ads manager. Ad rules playlist will start at this time
18603
+ _this10.manager.init(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL); // Call play to start showing the ad. Single video and overlay ads will
18604
+ // start at this time; the call will be ignored for ad rules
18605
+
18606
+
18607
+ _this10.manager.start();
18608
+ }
18609
+
18610
+ _this10.initialized = true;
18611
+ } catch (adError) {
18612
+ // An error may be thrown if there was a problem with the
18613
+ // VAST response
18614
+ _this10.onAdError(adError);
18615
+ }
18616
+ }).catch(function () {});
18617
+ }
18618
+ /**
18619
+ * Resume our video
18620
+ */
18621
+
18622
+ }, {
18623
+ key: "resumeContent",
18624
+ value: function resumeContent() {
18625
+ // Hide the advertisement container
18626
+ this.elements.container.style.zIndex = ''; // Ad is stopped
18627
+
18628
+ this.playing = false; // Play video
18629
+
18630
+ this.player.media.play();
18631
+ }
18632
+ /**
18633
+ * Pause our video
18634
+ */
18635
+
18636
+ }, {
18637
+ key: "pauseContent",
18638
+ value: function pauseContent() {
18639
+ // Show the advertisement container
18640
+ this.elements.container.style.zIndex = 3; // Ad is playing
18641
+
18642
+ this.playing = true; // Pause our video.
18643
+
18644
+ this.player.media.pause();
18645
+ }
18646
+ /**
18647
+ * Destroy the adsManager so we can grab new ads after this. If we don't then we're not
18648
+ * allowed to call new ads based on google policies, as they interpret this as an accidental
18649
+ * video requests. https://developers.google.com/interactive-
18650
+ * media-ads/docs/sdks/android/faq#8
18651
+ */
18652
+
18653
+ }, {
18654
+ key: "cancel",
18655
+ value: function cancel() {
18656
+ // Pause our video
18657
+ if (this.initialized) {
18658
+ this.resumeContent();
18659
+ } // Tell our instance that we're done for now
18660
+
18661
+
18662
+ this.trigger('error'); // Re-create our adsManager
18663
+
18664
+ this.loadAds();
18665
+ }
18666
+ /**
18667
+ * Re-create our adsManager
18668
+ */
18669
+
18670
+ }, {
18671
+ key: "loadAds",
18672
+ value: function loadAds() {
18673
+ var _this11 = this;
18674
+
18675
+ // Tell our adsManager to go bye bye
18676
+ this.managerPromise.then(function () {
18677
+ // Destroy our adsManager
18678
+ if (_this11.manager) {
18679
+ _this11.manager.destroy();
18680
+ } // Re-set our adsManager promises
18681
+
18682
+
18683
+ _this11.managerPromise = new Promise(function (resolve) {
18684
+ _this11.on('loaded', resolve);
18685
+
18686
+ _this11.player.debug.log(_this11.manager);
18687
+ }); // Now request some new advertisements
18688
+
18689
+ _this11.requestAds();
18690
+ }).catch(function () {});
18691
+ }
18692
+ /**
18693
+ * Handles callbacks after an ad event was invoked
18694
+ * @param {String} event - Event type
18695
+ */
18696
+
18697
+ }, {
18698
+ key: "trigger",
18699
+ value: function trigger(event) {
18700
+ var _this12 = this;
18701
+
18702
+ for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
18703
+ args[_key - 1] = arguments[_key];
18704
+ }
18705
+
18706
+ var handlers = this.events[event];
18707
+
18708
+ if (is$1.array(handlers)) {
18709
+ handlers.forEach(function (handler) {
18710
+ if (is$1.function(handler)) {
18711
+ handler.apply(_this12, args);
18712
+ }
18713
+ });
18714
+ }
18715
+ }
18716
+ /**
18717
+ * Add event listeners
18718
+ * @param {String} event - Event type
18719
+ * @param {Function} callback - Callback for when event occurs
18720
+ * @return {Ads}
18721
+ */
18722
+
18723
+ }, {
18724
+ key: "on",
18725
+ value: function on(event, callback) {
18726
+ if (!is$1.array(this.events[event])) {
18727
+ this.events[event] = [];
18728
+ }
18729
+
18730
+ this.events[event].push(callback);
18731
+ return this;
18732
+ }
18733
+ /**
18734
+ * Setup a safety timer for when the ad network doesn't respond for whatever reason.
18735
+ * The advertisement has 12 seconds to get its things together. We stop this timer when the
18736
+ * advertisement is playing, or when a user action is required to start, then we clear the
18737
+ * timer on ad ready
18738
+ * @param {Number} time
18739
+ * @param {String} from
18740
+ */
18741
+
18742
+ }, {
18743
+ key: "startSafetyTimer",
18744
+ value: function startSafetyTimer(time, from) {
18745
+ var _this13 = this;
18746
+
18747
+ this.player.debug.log("Safety timer invoked from: ".concat(from));
18748
+ this.safetyTimer = setTimeout(function () {
18749
+ _this13.cancel();
18750
+
18751
+ _this13.clearSafetyTimer('startSafetyTimer()');
18752
+ }, time);
18753
+ }
18754
+ /**
18755
+ * Clear our safety timer(s)
18756
+ * @param {String} from
18757
+ */
18758
+
18759
+ }, {
18760
+ key: "clearSafetyTimer",
18761
+ value: function clearSafetyTimer(from) {
18762
+ if (!is$1.nullOrUndefined(this.safetyTimer)) {
18763
+ this.player.debug.log("Safety timer cleared from: ".concat(from));
18764
+ clearTimeout(this.safetyTimer);
18765
+ this.safetyTimer = null;
18766
+ }
18767
+ }
18768
+ }, {
18769
+ key: "enabled",
18770
+ get: function get() {
18771
+ var config = this.config;
18772
+ return this.player.isHTML5 && this.player.isVideo && config.enabled && (!is$1.empty(config.publisherId) || is$1.url(config.tagUrl));
18773
+ }
18774
+ }, {
18775
+ key: "tagUrl",
18776
+ get: function get() {
18777
+ var config = this.config;
18778
+
18779
+ if (is$1.url(config.tagUrl)) {
18780
+ return config.tagUrl;
18781
+ }
18782
+
18783
+ var params = {
18784
+ AV_PUBLISHERID: '58c25bb0073ef448b1087ad6',
18785
+ AV_CHANNELID: '5a0458dc28a06145e4519d21',
18786
+ AV_URL: window.location.hostname,
18787
+ cb: Date.now(),
18788
+ AV_WIDTH: 640,
18789
+ AV_HEIGHT: 480,
18790
+ AV_CDIM2: this.publisherId
18791
+ };
18792
+ var base = 'https://go.aniview.com/api/adserver6/vast/';
18793
+ return "".concat(base, "?").concat(buildUrlParams(params));
18794
+ }
18795
+ }]);
18796
+
18797
+ return Ads;
18798
+ }();
18799
+
18800
+ var parseVtt = function parseVtt(vttDataString) {
18801
+ var processedList = [];
18802
+ var frames = vttDataString.split(/\r\n\r\n|\n\n|\r\r/);
18803
+ frames.forEach(function (frame) {
18804
+ var result = {};
18805
+ var lines = frame.split(/\r\n|\n|\r/);
18806
+ lines.forEach(function (line) {
18807
+ if (!is$1.number(result.startTime)) {
18808
+ // The line with start and end times on it is the first line of interest
18809
+ var matchTimes = line.match(/([0-9]{2})?:?([0-9]{2}):([0-9]{2}).([0-9]{2,3})( ?--> ?)([0-9]{2})?:?([0-9]{2}):([0-9]{2}).([0-9]{2,3})/); // Note that this currently ignores caption formatting directives that are optionally on the end of this line - fine for non-captions VTT
18810
+
18811
+ if (matchTimes) {
18812
+ result.startTime = Number(matchTimes[1] || 0) * 60 * 60 + Number(matchTimes[2]) * 60 + Number(matchTimes[3]) + Number("0.".concat(matchTimes[4]));
18813
+ result.endTime = Number(matchTimes[6] || 0) * 60 * 60 + Number(matchTimes[7]) * 60 + Number(matchTimes[8]) + Number("0.".concat(matchTimes[9]));
18814
+ }
18815
+ } else if (!is$1.empty(line.trim()) && is$1.empty(result.text)) {
18816
+ // If we already have the startTime, then we're definitely up to the text line(s)
18817
+ var lineSplit = line.trim().split('#xywh=');
18818
+
18819
+ var _lineSplit = _slicedToArray(lineSplit, 1);
18820
+
18821
+ result.text = _lineSplit[0];
18822
+
18823
+ // If there's content in lineSplit[1], then we have sprites. If not, then it's just one frame per image
18824
+ if (lineSplit[1]) {
18825
+ var _lineSplit$1$split = lineSplit[1].split(',');
18826
+
18827
+ var _lineSplit$1$split2 = _slicedToArray(_lineSplit$1$split, 4);
18828
+
18829
+ result.x = _lineSplit$1$split2[0];
18830
+ result.y = _lineSplit$1$split2[1];
18831
+ result.w = _lineSplit$1$split2[2];
18832
+ result.h = _lineSplit$1$split2[3];
18833
+ }
18834
+ }
18835
+ });
18836
+
18837
+ if (result.text) {
18838
+ processedList.push(result);
18839
+ }
18840
+ });
18841
+ return processedList;
18842
+ };
18843
+ /**
18844
+ * Preview thumbnails for seek hover and scrubbing
18845
+ * Seeking: Hover over the seek bar (desktop only): shows a small preview container above the seek bar
18846
+ * Scrubbing: Click and drag the seek bar (desktop and mobile): shows the preview image over the entire video, as if the video is scrubbing at very high speed
18847
+ *
18848
+ * Notes:
18849
+ * - Thumbs are set via JS settings on Plyr init, not HTML5 'track' property. Using the track property would be a bit gross, because it doesn't support custom 'kinds'. kind=metadata might be used for something else, and we want to allow multiple thumbnails tracks. Tracks must have a unique combination of 'kind' and 'label'. We would have to do something like kind=metadata,label=thumbnails1 / kind=metadata,label=thumbnails2. Square peg, round hole
18850
+ * - VTT info: the image URL is relative to the VTT, not the current document. But if the url starts with a slash, it will naturally be relative to the current domain. https://support.jwplayer.com/articles/how-to-add-preview-thumbnails
18851
+ * - This implementation uses multiple separate img elements. Other implementations use background-image on one element. This would be nice and simple, but Firefox and Safari have flickering issues with replacing backgrounds of larger images. It seems that YouTube perhaps only avoids this because they don't have the option for high-res previews (even the fullscreen ones, when mousedown/seeking). Images appear over the top of each other, and previous ones are discarded once the new ones have been rendered
18852
+ */
18853
+
18854
+
18855
+ var PreviewThumbnails =
18856
+ /*#__PURE__*/
18857
+ function () {
18858
+ /**
18859
+ * PreviewThumbnails constructor.
18860
+ * @param {Plyr} player
18861
+ * @return {PreviewThumbnails}
18862
+ */
18863
+ function PreviewThumbnails(player) {
18864
+ _classCallCheck(this, PreviewThumbnails);
18865
+
18866
+ this.player = player;
18867
+ this.thumbnails = [];
18868
+ this.loaded = false;
18869
+ this.lastMouseMoveTime = Date.now();
18870
+ this.mouseDown = false;
18871
+ this.loadedImages = [];
18872
+ this.elements = {
18873
+ thumb: {},
18874
+ scrubbing: {}
18875
+ };
18876
+ this.load();
18877
+ }
18878
+
18879
+ _createClass(PreviewThumbnails, [{
18880
+ key: "load",
18881
+ value: function load() {
18882
+ var _this = this;
18883
+
18884
+ // Togglethe regular seek tooltip
18885
+ if (this.player.elements.display.seekTooltip) {
18886
+ this.player.elements.display.seekTooltip.hidden = this.enabled;
18887
+ }
18888
+
18889
+ if (!this.enabled) {
18890
+ return;
18891
+ }
18892
+
18893
+ this.getThumbnails().then(function () {
18894
+ if (!_this.enabled) {
18895
+ return;
18896
+ } // Render DOM elements
18897
+
18898
+
18899
+ _this.render(); // Check to see if thumb container size was specified manually in CSS
18900
+
18901
+
18902
+ _this.determineContainerAutoSizing();
18903
+
18904
+ _this.loaded = true;
18905
+ });
18906
+ } // Download VTT files and parse them
18907
+
18908
+ }, {
18909
+ key: "getThumbnails",
18910
+ value: function getThumbnails() {
18911
+ var _this2 = this;
18912
+
18913
+ return new Promise(function (resolve) {
18914
+ var src = _this2.player.config.previewThumbnails.src;
18915
+
18916
+ if (is$1.empty(src)) {
18917
+ throw new Error('Missing previewThumbnails.src config attribute');
18918
+ } // If string, convert into single-element list
18919
+
18920
+
18921
+ var urls = is$1.string(src) ? [src] : src; // Loop through each src URL. Download and process the VTT file, storing the resulting data in this.thumbnails
18922
+
18923
+ var promises = urls.map(function (u) {
18924
+ return _this2.getThumbnail(u);
18925
+ });
18926
+ Promise.all(promises).then(function () {
18927
+ // Sort smallest to biggest (e.g., [120p, 480p, 1080p])
18928
+ _this2.thumbnails.sort(function (x, y) {
18929
+ return x.height - y.height;
18930
+ });
18931
+
18932
+ _this2.player.debug.log('Preview thumbnails', _this2.thumbnails);
18933
+
18934
+ resolve();
18935
+ });
18936
+ });
18937
+ } // Process individual VTT file
18938
+
18939
+ }, {
18940
+ key: "getThumbnail",
18941
+ value: function getThumbnail(url) {
18942
+ var _this3 = this;
18943
+
18944
+ return new Promise(function (resolve) {
18945
+ fetch(url).then(function (response) {
18946
+ var thumbnail = {
18947
+ frames: parseVtt(response),
18948
+ height: null,
18949
+ urlPrefix: ''
18950
+ }; // If the URLs don't start with '/', then we need to set their relative path to be the location of the VTT file
18951
+ // If the URLs do start with '/', then they obviously don't need a prefix, so it will remain blank
18952
+ // If the thumbnail URLs start with with none of '/', 'http://' or 'https://', then we need to set their relative path to be the location of the VTT file
18953
+
18954
+ if (!thumbnail.frames[0].text.startsWith('/') && !thumbnail.frames[0].text.startsWith('http://') && !thumbnail.frames[0].text.startsWith('https://')) {
18955
+ thumbnail.urlPrefix = url.substring(0, url.lastIndexOf('/') + 1);
18956
+ } // Download the first frame, so that we can determine/set the height of this thumbnailsDef
18957
+
18958
+
18959
+ var tempImage = new Image();
18960
+
18961
+ tempImage.onload = function () {
18962
+ thumbnail.height = tempImage.naturalHeight;
18963
+ thumbnail.width = tempImage.naturalWidth;
18964
+
18965
+ _this3.thumbnails.push(thumbnail);
18966
+
18967
+ resolve();
18968
+ };
18969
+
18970
+ tempImage.src = thumbnail.urlPrefix + thumbnail.frames[0].text;
18971
+ });
18972
+ });
18973
+ }
18974
+ }, {
18975
+ key: "startMove",
18976
+ value: function startMove(event) {
18977
+ if (!this.loaded) {
18978
+ return;
18979
+ }
18980
+
18981
+ if (!is$1.event(event) || !['touchmove', 'mousemove'].includes(event.type)) {
18982
+ return;
18983
+ } // Wait until media has a duration
18984
+
18985
+
18986
+ if (!this.player.media.duration) {
18987
+ return;
18988
+ }
18989
+
18990
+ if (event.type === 'touchmove') {
18991
+ // Calculate seek hover position as approx video seconds
18992
+ this.seekTime = this.player.media.duration * (this.player.elements.inputs.seek.value / 100);
18993
+ } else {
18994
+ // Calculate seek hover position as approx video seconds
18995
+ var clientRect = this.player.elements.progress.getBoundingClientRect();
18996
+ var percentage = 100 / clientRect.width * (event.pageX - clientRect.left);
18997
+ this.seekTime = this.player.media.duration * (percentage / 100);
18998
+
18999
+ if (this.seekTime < 0) {
19000
+ // The mousemove fires for 10+px out to the left
19001
+ this.seekTime = 0;
19002
+ }
19003
+
19004
+ if (this.seekTime > this.player.media.duration - 1) {
19005
+ // Took 1 second off the duration for safety, because different players can disagree on the real duration of a video
19006
+ this.seekTime = this.player.media.duration - 1;
19007
+ }
19008
+
19009
+ this.mousePosX = event.pageX; // Set time text inside image container
19010
+
19011
+ this.elements.thumb.time.innerText = formatTime(this.seekTime);
19012
+ } // Download and show image
19013
+
19014
+
19015
+ this.showImageAtCurrentTime();
19016
+ }
19017
+ }, {
19018
+ key: "endMove",
19019
+ value: function endMove() {
19020
+ this.toggleThumbContainer(false, true);
19021
+ }
19022
+ }, {
19023
+ key: "startScrubbing",
19024
+ value: function startScrubbing(event) {
19025
+ // Only act on left mouse button (0), or touch device (event.button is false)
19026
+ if (event.button === false || event.button === 0) {
19027
+ this.mouseDown = true; // Wait until media has a duration
19028
+
19029
+ if (this.player.media.duration) {
19030
+ this.toggleScrubbingContainer(true);
19031
+ this.toggleThumbContainer(false, true); // Download and show image
19032
+
19033
+ this.showImageAtCurrentTime();
19034
+ }
19035
+ }
19036
+ }
19037
+ }, {
19038
+ key: "endScrubbing",
19039
+ value: function endScrubbing() {
19040
+ var _this4 = this;
19041
+
19042
+ this.mouseDown = false; // Hide scrubbing preview. But wait until the video has successfully seeked before hiding the scrubbing preview
19043
+
19044
+ if (Math.ceil(this.lastTime) === Math.ceil(this.player.media.currentTime)) {
19045
+ // The video was already seeked/loaded at the chosen time - hide immediately
19046
+ this.toggleScrubbingContainer(false);
19047
+ } else {
19048
+ // The video hasn't seeked yet. Wait for that
19049
+ once.call(this.player, this.player.media, 'timeupdate', function () {
19050
+ // Re-check mousedown - we might have already started scrubbing again
19051
+ if (!_this4.mouseDown) {
19052
+ _this4.toggleScrubbingContainer(false);
19053
+ }
19054
+ });
19055
+ }
19056
+ }
19057
+ /**
19058
+ * Setup hooks for Plyr and window events
19059
+ */
19060
+
19061
+ }, {
19062
+ key: "listeners",
19063
+ value: function listeners() {
19064
+ var _this5 = this;
19065
+
19066
+ // Hide thumbnail preview - on mouse click, mouse leave (in listeners.js for now), and video play/seek. All four are required, e.g., for buffering
19067
+ this.player.on('play', function () {
19068
+ _this5.toggleThumbContainer(false, true);
19069
+ });
19070
+ this.player.on('seeked', function () {
19071
+ _this5.toggleThumbContainer(false);
19072
+ });
19073
+ this.player.on('timeupdate', function () {
19074
+ _this5.lastTime = _this5.player.media.currentTime;
19075
+ });
19076
+ }
19077
+ /**
19078
+ * Create HTML elements for image containers
19079
+ */
19080
+
19081
+ }, {
19082
+ key: "render",
19083
+ value: function render() {
19084
+ // Create HTML element: plyr__preview-thumbnail-container
19085
+ this.elements.thumb.container = createElement('div', {
19086
+ class: this.player.config.classNames.previewThumbnails.thumbContainer
19087
+ }); // Wrapper for the image for styling
19088
+
19089
+ this.elements.thumb.imageContainer = createElement('div', {
19090
+ class: this.player.config.classNames.previewThumbnails.imageContainer
19091
+ });
19092
+ this.elements.thumb.container.appendChild(this.elements.thumb.imageContainer); // Create HTML element, parent+span: time text (e.g., 01:32:00)
19093
+
19094
+ var timeContainer = createElement('div', {
19095
+ class: this.player.config.classNames.previewThumbnails.timeContainer
19096
+ });
19097
+ this.elements.thumb.time = createElement('span', {}, '00:00');
19098
+ timeContainer.appendChild(this.elements.thumb.time);
19099
+ this.elements.thumb.container.appendChild(timeContainer); // Inject the whole thumb
19100
+
19101
+ if (is$1.element(this.player.elements.progress)) {
19102
+ this.player.elements.progress.appendChild(this.elements.thumb.container);
19103
+ } // Create HTML element: plyr__preview-scrubbing-container
19104
+
19105
+
19106
+ this.elements.scrubbing.container = createElement('div', {
19107
+ class: this.player.config.classNames.previewThumbnails.scrubbingContainer
19108
+ });
19109
+ this.player.elements.wrapper.appendChild(this.elements.scrubbing.container);
19110
+ }
19111
+ }, {
19112
+ key: "showImageAtCurrentTime",
19113
+ value: function showImageAtCurrentTime() {
19114
+ var _this6 = this;
19115
+
19116
+ if (this.mouseDown) {
19117
+ this.setScrubbingContainerSize();
19118
+ } else {
19119
+ this.setThumbContainerSizeAndPos();
19120
+ } // Find the desired thumbnail index
19121
+ // TODO: Handle a video longer than the thumbs where thumbNum is null
19122
+
19123
+
19124
+ var thumbNum = this.thumbnails[0].frames.findIndex(function (frame) {
19125
+ return _this6.seekTime >= frame.startTime && _this6.seekTime <= frame.endTime;
19126
+ });
19127
+ var hasThumb = thumbNum >= 0;
19128
+ var qualityIndex = 0; // Show the thumb container if we're not scrubbing
19129
+
19130
+ if (!this.mouseDown) {
19131
+ this.toggleThumbContainer(hasThumb);
19132
+ } // No matching thumb found
19133
+
19134
+
19135
+ if (!hasThumb) {
19136
+ return;
19137
+ } // Check to see if we've already downloaded higher quality versions of this image
19138
+
19139
+
19140
+ this.thumbnails.forEach(function (thumbnail, index) {
19141
+ if (_this6.loadedImages.includes(thumbnail.frames[thumbNum].text)) {
19142
+ qualityIndex = index;
19143
+ }
19144
+ }); // Only proceed if either thumbnum or thumbfilename has changed
19145
+
19146
+ if (thumbNum !== this.showingThumb) {
19147
+ this.showingThumb = thumbNum;
19148
+ this.loadImage(qualityIndex);
19149
+ }
19150
+ } // Show the image that's currently specified in this.showingThumb
19151
+
19152
+ }, {
19153
+ key: "loadImage",
19154
+ value: function loadImage() {
19155
+ var _this7 = this;
19156
+
19157
+ var qualityIndex = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
19158
+ var thumbNum = this.showingThumb;
19159
+ var thumbnail = this.thumbnails[qualityIndex];
19160
+ var urlPrefix = thumbnail.urlPrefix;
19161
+ var frame = thumbnail.frames[thumbNum];
19162
+ var thumbFilename = thumbnail.frames[thumbNum].text;
19163
+ var thumbUrl = urlPrefix + thumbFilename;
19164
+
19165
+ if (!this.currentImageElement || this.currentImageElement.dataset.filename !== thumbFilename) {
19166
+ // If we're already loading a previous image, remove its onload handler - we don't want it to load after this one
19167
+ // Only do this if not using sprites. Without sprites we really want to show as many images as possible, as a best-effort
19168
+ if (this.loadingImage && this.usingSprites) {
19169
+ this.loadingImage.onload = null;
19170
+ } // We're building and adding a new image. In other implementations of similar functionality (YouTube), background image
19171
+ // is instead used. But this causes issues with larger images in Firefox and Safari - switching between background
19172
+ // images causes a flicker. Putting a new image over the top does not
19173
+
19174
+
19175
+ var previewImage = new Image();
19176
+ previewImage.src = thumbUrl;
19177
+ previewImage.dataset.index = thumbNum;
19178
+ previewImage.dataset.filename = thumbFilename;
19179
+ this.showingThumbFilename = thumbFilename;
19180
+ this.player.debug.log("Loading image: ".concat(thumbUrl)); // For some reason, passing the named function directly causes it to execute immediately. So I've wrapped it in an anonymous function...
19181
+
19182
+ previewImage.onload = function () {
19183
+ return _this7.showImage(previewImage, frame, qualityIndex, thumbNum, thumbFilename, true);
19184
+ };
19185
+
19186
+ this.loadingImage = previewImage;
19187
+ this.removeOldImages(previewImage);
19188
+ } else {
19189
+ // Update the existing image
19190
+ this.showImage(this.currentImageElement, frame, qualityIndex, thumbNum, thumbFilename, false);
19191
+ this.currentImageElement.dataset.index = thumbNum;
19192
+ this.removeOldImages(this.currentImageElement);
19193
+ }
19194
+ }
19195
+ }, {
19196
+ key: "showImage",
19197
+ value: function showImage(previewImage, frame, qualityIndex, thumbNum, thumbFilename) {
19198
+ var newImage = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : true;
19199
+ this.player.debug.log("Showing thumb: ".concat(thumbFilename, ". num: ").concat(thumbNum, ". qual: ").concat(qualityIndex, ". newimg: ").concat(newImage));
19200
+ this.setImageSizeAndOffset(previewImage, frame);
19201
+
19202
+ if (newImage) {
19203
+ this.currentImageContainer.appendChild(previewImage);
19204
+ this.currentImageElement = previewImage;
19205
+
19206
+ if (!this.loadedImages.includes(thumbFilename)) {
19207
+ this.loadedImages.push(thumbFilename);
19208
+ }
19209
+ } // Preload images before and after the current one
19210
+ // Show higher quality of the same frame
19211
+ // Each step here has a short time delay, and only continues if still hovering/seeking the same spot. This is to protect slow connections from overloading
19212
+
19213
+
19214
+ this.preloadNearby(thumbNum, true).then(this.preloadNearby(thumbNum, false)).then(this.getHigherQuality(qualityIndex, previewImage, frame, thumbFilename));
19215
+ } // Remove all preview images that aren't the designated current image
19216
+
19217
+ }, {
19218
+ key: "removeOldImages",
19219
+ value: function removeOldImages(currentImage) {
19220
+ var _this8 = this;
19221
+
19222
+ // Get a list of all images, convert it from a DOM list to an array
19223
+ Array.from(this.currentImageContainer.children).forEach(function (image) {
19224
+ if (image.tagName.toLowerCase() !== 'img') {
19225
+ return;
19226
+ }
19227
+
19228
+ var removeDelay = _this8.usingSprites ? 500 : 1000;
19229
+
19230
+ if (image.dataset.index !== currentImage.dataset.index && !image.dataset.deleting) {
19231
+ // Wait 200ms, as the new image can take some time to show on certain browsers (even though it was downloaded before showing). This will prevent flicker, and show some generosity towards slower clients
19232
+ // First set attribute 'deleting' to prevent multi-handling of this on repeat firing of this function
19233
+ // eslint-disable-next-line no-param-reassign
19234
+ image.dataset.deleting = true; // This has to be set before the timeout - to prevent issues switching between hover and scrub
19235
+
19236
+ var currentImageContainer = _this8.currentImageContainer;
19237
+ setTimeout(function () {
19238
+ currentImageContainer.removeChild(image);
19239
+
19240
+ _this8.player.debug.log("Removing thumb: ".concat(image.dataset.filename));
19241
+ }, removeDelay);
19242
+ }
19243
+ });
19244
+ } // Preload images before and after the current one. Only if the user is still hovering/seeking the same frame
19245
+ // This will only preload the lowest quality
19246
+
19247
+ }, {
19248
+ key: "preloadNearby",
19249
+ value: function preloadNearby(thumbNum) {
19250
+ var _this9 = this;
19251
+
19252
+ var forward = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
19253
+ return new Promise(function (resolve) {
19254
+ setTimeout(function () {
19255
+ var oldThumbFilename = _this9.thumbnails[0].frames[thumbNum].text;
19256
+
19257
+ if (_this9.showingThumbFilename === oldThumbFilename) {
19258
+ // Find the nearest thumbs with different filenames. Sometimes it'll be the next index, but in the case of sprites, it might be 100+ away
19259
+ var thumbnailsClone;
19260
+
19261
+ if (forward) {
19262
+ thumbnailsClone = _this9.thumbnails[0].frames.slice(thumbNum);
19263
+ } else {
19264
+ thumbnailsClone = _this9.thumbnails[0].frames.slice(0, thumbNum).reverse();
19265
+ }
19266
+
19267
+ var foundOne = false;
19268
+ thumbnailsClone.forEach(function (frame) {
19269
+ var newThumbFilename = frame.text;
19270
+
19271
+ if (newThumbFilename !== oldThumbFilename) {
19272
+ // Found one with a different filename. Make sure it hasn't already been loaded on this page visit
19273
+ if (!_this9.loadedImages.includes(newThumbFilename)) {
19274
+ foundOne = true;
19275
+
19276
+ _this9.player.debug.log("Preloading thumb filename: ".concat(newThumbFilename));
19277
+
19278
+ var urlPrefix = _this9.thumbnails[0].urlPrefix;
19279
+ var thumbURL = urlPrefix + newThumbFilename;
19280
+ var previewImage = new Image();
19281
+ previewImage.src = thumbURL;
19282
+
19283
+ previewImage.onload = function () {
19284
+ _this9.player.debug.log("Preloaded thumb filename: ".concat(newThumbFilename));
19285
+
19286
+ if (!_this9.loadedImages.includes(newThumbFilename)) _this9.loadedImages.push(newThumbFilename); // We don't resolve until the thumb is loaded
19287
+
19288
+ resolve();
19289
+ };
19290
+ }
19291
+ }
19292
+ }); // If there are none to preload then we want to resolve immediately
19293
+
19294
+ if (!foundOne) {
19295
+ resolve();
19296
+ }
19297
+ }
19298
+ }, 300);
19299
+ });
19300
+ } // If user has been hovering current image for half a second, look for a higher quality one
19301
+
19302
+ }, {
19303
+ key: "getHigherQuality",
19304
+ value: function getHigherQuality(currentQualityIndex, previewImage, frame, thumbFilename) {
19305
+ var _this10 = this;
19306
+
19307
+ if (currentQualityIndex < this.thumbnails.length - 1) {
19308
+ // Only use the higher quality version if it's going to look any better - if the current thumb is of a lower pixel density than the thumbnail container
19309
+ var previewImageHeight = previewImage.naturalHeight;
19310
+
19311
+ if (this.usingSprites) {
19312
+ previewImageHeight = frame.h;
19313
+ }
19314
+
19315
+ if (previewImageHeight < this.thumbContainerHeight) {
19316
+ // Recurse back to the loadImage function - show a higher quality one, but only if the viewer is on this frame for a while
19317
+ setTimeout(function () {
19318
+ // Make sure the mouse hasn't already moved on and started hovering at another image
19319
+ if (_this10.showingThumbFilename === thumbFilename) {
19320
+ _this10.player.debug.log("Showing higher quality thumb for: ".concat(thumbFilename));
19321
+
19322
+ _this10.loadImage(currentQualityIndex + 1);
19323
+ }
19324
+ }, 300);
19325
+ }
19326
+ }
19327
+ }
19328
+ }, {
19329
+ key: "toggleThumbContainer",
19330
+ value: function toggleThumbContainer() {
19331
+ var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
19332
+ var clearShowing = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
19333
+ var className = this.player.config.classNames.previewThumbnails.thumbContainerShown;
19334
+ this.elements.thumb.container.classList.toggle(className, toggle);
19335
+
19336
+ if (!toggle && clearShowing) {
19337
+ this.showingThumb = null;
19338
+ this.showingThumbFilename = null;
19339
+ }
19340
+ }
19341
+ }, {
19342
+ key: "toggleScrubbingContainer",
19343
+ value: function toggleScrubbingContainer() {
19344
+ var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
19345
+ var className = this.player.config.classNames.previewThumbnails.scrubbingContainerShown;
19346
+ this.elements.scrubbing.container.classList.toggle(className, toggle);
19347
+
19348
+ if (!toggle) {
19349
+ this.showingThumb = null;
19350
+ this.showingThumbFilename = null;
19351
+ }
19352
+ }
19353
+ }, {
19354
+ key: "determineContainerAutoSizing",
19355
+ value: function determineContainerAutoSizing() {
19356
+ if (this.elements.thumb.imageContainer.clientHeight > 20) {
19357
+ // This will prevent auto sizing in this.setThumbContainerSizeAndPos()
19358
+ this.sizeSpecifiedInCSS = true;
19359
+ }
19360
+ } // Set the size to be about a quarter of the size of video. Unless option dynamicSize === false, in which case it needs to be set in CSS
19361
+
19362
+ }, {
19363
+ key: "setThumbContainerSizeAndPos",
19364
+ value: function setThumbContainerSizeAndPos() {
19365
+ if (!this.sizeSpecifiedInCSS) {
19366
+ var thumbWidth = Math.floor(this.thumbContainerHeight * this.thumbAspectRatio);
19367
+ this.elements.thumb.imageContainer.style.height = "".concat(this.thumbContainerHeight, "px");
19368
+ this.elements.thumb.imageContainer.style.width = "".concat(thumbWidth, "px");
19369
+ }
19370
+
19371
+ this.setThumbContainerPos();
19372
+ }
19373
+ }, {
19374
+ key: "setThumbContainerPos",
19375
+ value: function setThumbContainerPos() {
19376
+ var seekbarRect = this.player.elements.progress.getBoundingClientRect();
19377
+ var plyrRect = this.player.elements.container.getBoundingClientRect();
19378
+ var container = this.elements.thumb.container; // Find the lowest and highest desired left-position, so we don't slide out the side of the video container
19379
+
19380
+ var minVal = plyrRect.left - seekbarRect.left + 10;
19381
+ var maxVal = plyrRect.right - seekbarRect.left - container.clientWidth - 10; // Set preview container position to: mousepos, minus seekbar.left, minus half of previewContainer.clientWidth
19382
+
19383
+ var previewPos = this.mousePosX - seekbarRect.left - container.clientWidth / 2;
19384
+
19385
+ if (previewPos < minVal) {
19386
+ previewPos = minVal;
19387
+ }
19388
+
19389
+ if (previewPos > maxVal) {
19390
+ previewPos = maxVal;
19391
+ }
19392
+
19393
+ container.style.left = "".concat(previewPos, "px");
19394
+ } // Can't use 100% width, in case the video is a different aspect ratio to the video container
19395
+
19396
+ }, {
19397
+ key: "setScrubbingContainerSize",
19398
+ value: function setScrubbingContainerSize() {
19399
+ this.elements.scrubbing.container.style.width = "".concat(this.player.media.clientWidth, "px"); // Can't use media.clientHeight - html5 video goes big and does black bars above and below
19400
+
19401
+ this.elements.scrubbing.container.style.height = "".concat(this.player.media.clientWidth / this.thumbAspectRatio, "px");
19402
+ } // Sprites need to be offset to the correct location
19403
+
19404
+ }, {
19405
+ key: "setImageSizeAndOffset",
19406
+ value: function setImageSizeAndOffset(previewImage, frame) {
19407
+ if (!this.usingSprites) {
19408
+ return;
19409
+ } // Find difference between height and preview container height
19410
+
19411
+
19412
+ var multiplier = this.thumbContainerHeight / frame.h; // eslint-disable-next-line no-param-reassign
19413
+
19414
+ previewImage.style.height = "".concat(Math.floor(previewImage.naturalHeight * multiplier), "px"); // eslint-disable-next-line no-param-reassign
19415
+
19416
+ previewImage.style.width = "".concat(Math.floor(previewImage.naturalWidth * multiplier), "px"); // eslint-disable-next-line no-param-reassign
19417
+
19418
+ previewImage.style.left = "-".concat(frame.x * multiplier, "px"); // eslint-disable-next-line no-param-reassign
19419
+
19420
+ previewImage.style.top = "-".concat(frame.y * multiplier, "px");
19421
+ }
19422
+ }, {
19423
+ key: "enabled",
19424
+ get: function get() {
19425
+ return this.player.isHTML5 && this.player.isVideo && this.player.config.previewThumbnails.enabled;
19426
+ }
19427
+ }, {
19428
+ key: "currentImageContainer",
19429
+ get: function get() {
19430
+ if (this.mouseDown) {
19431
+ return this.elements.scrubbing.container;
19432
+ }
19433
+
19434
+ return this.elements.thumb.imageContainer;
19435
+ }
19436
+ }, {
19437
+ key: "usingSprites",
19438
+ get: function get() {
19439
+ return Object.keys(this.thumbnails[0].frames[0]).includes('w');
19440
+ }
19441
+ }, {
19442
+ key: "thumbAspectRatio",
19443
+ get: function get() {
19444
+ if (this.usingSprites) {
19445
+ return this.thumbnails[0].frames[0].w / this.thumbnails[0].frames[0].h;
19446
+ }
19447
+
19448
+ return this.thumbnails[0].width / this.thumbnails[0].height;
19449
+ }
19450
+ }, {
19451
+ key: "thumbContainerHeight",
19452
+ get: function get() {
19453
+ if (this.mouseDown) {
19454
+ // Can't use media.clientHeight - HTML5 video goes big and does black bars above and below
19455
+ return Math.floor(this.player.media.clientWidth / this.thumbAspectRatio);
19456
+ }
19457
+
19458
+ return Math.floor(this.player.media.clientWidth / this.thumbAspectRatio / 4);
19459
+ }
19460
+ }, {
19461
+ key: "currentImageElement",
19462
+ get: function get() {
19463
+ if (this.mouseDown) {
19464
+ return this.currentScrubbingImageElement;
19465
+ }
19466
+
19467
+ return this.currentThumbnailImageElement;
19468
+ },
19469
+ set: function set(element) {
19470
+ if (this.mouseDown) {
19471
+ this.currentScrubbingImageElement = element;
19472
+ } else {
19473
+ this.currentThumbnailImageElement = element;
19474
+ }
19475
+ }
19476
+ }]);
19477
+
19478
+ return PreviewThumbnails;
19479
+ }();
19480
+
19481
+ var source = {
19482
+ // Add elements to HTML5 media (source, tracks, etc)
19483
+ insertElements: function insertElements(type, attributes) {
19484
+ var _this = this;
19485
+
19486
+ if (is$1.string(attributes)) {
19487
+ insertElement(type, this.media, {
19488
+ src: attributes
19489
+ });
19490
+ } else if (is$1.array(attributes)) {
19491
+ attributes.forEach(function (attribute) {
19492
+ insertElement(type, _this.media, attribute);
19493
+ });
19494
+ }
19495
+ },
19496
+ // Update source
19497
+ // Sources are not checked for support so be careful
19498
+ change: function change(input) {
19499
+ var _this2 = this;
19500
+
19501
+ if (!getDeep(input, 'sources.length')) {
19502
+ this.debug.warn('Invalid source format');
19503
+ return;
19504
+ } // Cancel current network requests
19505
+
19506
+
19507
+ html5.cancelRequests.call(this); // Destroy instance and re-setup
19508
+
19509
+ this.destroy.call(this, function () {
19510
+ // Reset quality options
19511
+ _this2.options.quality = []; // Remove elements
19512
+
19513
+ removeElement(_this2.media);
19514
+ _this2.media = null; // Reset class name
19515
+
19516
+ if (is$1.element(_this2.elements.container)) {
19517
+ _this2.elements.container.removeAttribute('class');
19518
+ } // Set the type and provider
19519
+
19520
+
19521
+ var sources = input.sources,
19522
+ type = input.type;
19523
+
19524
+ var _sources = _slicedToArray(sources, 1),
19525
+ _sources$ = _sources[0],
19526
+ _sources$$provider = _sources$.provider,
19527
+ provider = _sources$$provider === void 0 ? providers.html5 : _sources$$provider,
19528
+ src = _sources$.src;
19529
+
19530
+ var tagName = provider === 'html5' ? type : 'div';
19531
+ var attributes = provider === 'html5' ? {} : {
19532
+ src: src
19533
+ };
19534
+ Object.assign(_this2, {
19535
+ provider: provider,
19536
+ type: type,
19537
+ // Check for support
19538
+ supported: support.check(type, provider, _this2.config.playsinline),
19539
+ // Create new element
19540
+ media: createElement(tagName, attributes)
19541
+ }); // Inject the new element
19542
+
19543
+ _this2.elements.container.appendChild(_this2.media); // Autoplay the new source?
19544
+
19545
+
19546
+ if (is$1.boolean(input.autoplay)) {
19547
+ _this2.config.autoplay = input.autoplay;
19548
+ } // Set attributes for audio and video
19549
+
19550
+
19551
+ if (_this2.isHTML5) {
19552
+ if (_this2.config.crossorigin) {
19553
+ _this2.media.setAttribute('crossorigin', '');
19554
+ }
19555
+
19556
+ if (_this2.config.autoplay) {
19557
+ _this2.media.setAttribute('autoplay', '');
19558
+ }
19559
+
19560
+ if (!is$1.empty(input.poster)) {
19561
+ _this2.poster = input.poster;
19562
+ }
19563
+
19564
+ if (_this2.config.loop.active) {
19565
+ _this2.media.setAttribute('loop', '');
19566
+ }
19567
+
19568
+ if (_this2.config.muted) {
19569
+ _this2.media.setAttribute('muted', '');
19570
+ }
19571
+
19572
+ if (_this2.config.playsinline) {
19573
+ _this2.media.setAttribute('playsinline', '');
19574
+ }
19575
+ } // Restore class hook
19576
+
19577
+
19578
+ ui.addStyleHook.call(_this2); // Set new sources for html5
19579
+
19580
+ if (_this2.isHTML5) {
19581
+ source.insertElements.call(_this2, 'source', sources);
19582
+ } // Set video title
19583
+
19584
+
19585
+ _this2.config.title = input.title; // Set up from scratch
19586
+
19587
+ media.setup.call(_this2); // HTML5 stuff
19588
+
19589
+ if (_this2.isHTML5) {
19590
+ // Setup captions
19591
+ if (Object.keys(input).includes('tracks')) {
19592
+ source.insertElements.call(_this2, 'track', input.tracks);
19593
+ }
19594
+ } // If HTML5 or embed but not fully supported, setupInterface and call ready now
19595
+
19596
+
19597
+ if (_this2.isHTML5 || _this2.isEmbed && !_this2.supported.ui) {
19598
+ // Setup interface
19599
+ ui.build.call(_this2);
19600
+ } // Load HTML5 sources
19601
+
19602
+
19603
+ if (_this2.isHTML5) {
19604
+ _this2.media.load();
19605
+ } // Reload thumbnails
19606
+
19607
+
19608
+ if (_this2.previewThumbnails) {
19609
+ _this2.previewThumbnails.load();
19610
+ } // Update the fullscreen support
19611
+
19612
+
19613
+ _this2.fullscreen.update();
19614
+ }, true);
19615
+ }
19616
+ };
19617
+
19618
+ /**
19619
+ * Returns a number whose value is limited to the given range.
19620
+ *
19621
+ * Example: limit the output of this computation to between 0 and 255
19622
+ * (x * 255).clamp(0, 255)
19623
+ *
19624
+ * @param {Number} input
19625
+ * @param {Number} min The lower boundary of the output range
19626
+ * @param {Number} max The upper boundary of the output range
19627
+ * @returns A number in the range [min, max]
19628
+ * @type Number
19629
+ */
19630
+ function clamp() {
19631
+ var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
19632
+ var min = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
19633
+ var max = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 255;
19634
+ return Math.min(Math.max(input, min), max);
19635
+ }
19636
+
19637
+ // TODO: Use a WeakMap for private globals
19638
+ // const globals = new WeakMap();
19639
+ // Plyr instance
19640
+
19641
+ var Plyr =
19642
+ /*#__PURE__*/
19643
+ function () {
19644
+ function Plyr(target, options) {
19645
+ var _this = this;
19646
+
19647
+ _classCallCheck(this, Plyr);
19648
+
19649
+ this.timers = {}; // State
19650
+
19651
+ this.ready = false;
19652
+ this.loading = false;
19653
+ this.failed = false; // Touch device
19654
+
19655
+ this.touch = support.touch; // Set the media element
19656
+
19657
+ this.media = target; // String selector passed
19658
+
19659
+ if (is$1.string(this.media)) {
19660
+ this.media = document.querySelectorAll(this.media);
19661
+ } // jQuery, NodeList or Array passed, use first element
19662
+
19663
+
19664
+ if (window.jQuery && this.media instanceof jQuery || is$1.nodeList(this.media) || is$1.array(this.media)) {
19665
+ // eslint-disable-next-line
19666
+ this.media = this.media[0];
19667
+ } // Set config
19668
+
19669
+
19670
+ this.config = extend({}, defaults$1, Plyr.defaults, options || {}, function () {
19671
+ try {
19672
+ return JSON.parse(_this.media.getAttribute('data-plyr-config'));
19673
+ } catch (e) {
19674
+ return {};
19675
+ }
19676
+ }()); // Elements cache
19677
+
19678
+ this.elements = {
19679
+ container: null,
19680
+ captions: null,
19681
+ buttons: {},
19682
+ display: {},
19683
+ progress: {},
19684
+ inputs: {},
19685
+ settings: {
19686
+ popup: null,
19687
+ menu: null,
19688
+ panels: {},
19689
+ buttons: {}
19690
+ }
19691
+ }; // Captions
19692
+
19693
+ this.captions = {
19694
+ active: null,
19695
+ currentTrack: -1,
19696
+ meta: new WeakMap()
19697
+ }; // Fullscreen
19698
+
19699
+ this.fullscreen = {
19700
+ active: false
19701
+ }; // Options
19702
+
19703
+ this.options = {
19704
+ speed: [],
19705
+ quality: []
19706
+ }; // Debugging
19707
+ // TODO: move to globals
19708
+
19709
+ this.debug = new Console(this.config.debug); // Log config options and support
19710
+
19711
+ this.debug.log('Config', this.config);
19712
+ this.debug.log('Support', support); // We need an element to setup
19713
+
19714
+ if (is$1.nullOrUndefined(this.media) || !is$1.element(this.media)) {
19715
+ this.debug.error('Setup failed: no suitable element passed');
19716
+ return;
19717
+ } // Bail if the element is initialized
19718
+
19719
+
19720
+ if (this.media.plyr) {
19721
+ this.debug.warn('Target already setup');
19722
+ return;
19723
+ } // Bail if not enabled
19724
+
19725
+
19726
+ if (!this.config.enabled) {
19727
+ this.debug.error('Setup failed: disabled by config');
19728
+ return;
19729
+ } // Bail if disabled or no basic support
19730
+ // You may want to disable certain UAs etc
19731
+
19732
+
19733
+ if (!support.check().api) {
19734
+ this.debug.error('Setup failed: no support');
19735
+ return;
19736
+ } // Cache original element state for .destroy()
19737
+
19738
+
19739
+ var clone = this.media.cloneNode(true);
19740
+ clone.autoplay = false;
19741
+ this.elements.original = clone; // Set media type based on tag or data attribute
19742
+ // Supported: video, audio, vimeo, youtube
19743
+
19744
+ var type = this.media.tagName.toLowerCase(); // Embed properties
19745
+
19746
+ var iframe = null;
19747
+ var url = null; // Different setup based on type
19748
+
19749
+ switch (type) {
19750
+ case 'div':
19751
+ // Find the frame
19752
+ iframe = this.media.querySelector('iframe'); // <iframe> type
19753
+
19754
+ if (is$1.element(iframe)) {
19755
+ // Detect provider
19756
+ url = parseUrl(iframe.getAttribute('src'));
19757
+ this.provider = getProviderByUrl(url.toString()); // Rework elements
19758
+
19759
+ this.elements.container = this.media;
19760
+ this.media = iframe; // Reset classname
19761
+
19762
+ this.elements.container.className = ''; // Get attributes from URL and set config
19763
+
19764
+ if (url.search.length) {
19765
+ var truthy = ['1', 'true'];
19766
+
19767
+ if (truthy.includes(url.searchParams.get('autoplay'))) {
19768
+ this.config.autoplay = true;
19769
+ }
19770
+
19771
+ if (truthy.includes(url.searchParams.get('loop'))) {
19772
+ this.config.loop.active = true;
19773
+ } // TODO: replace fullscreen.iosNative with this playsinline config option
19774
+ // YouTube requires the playsinline in the URL
19775
+
19776
+
19777
+ if (this.isYouTube) {
19778
+ this.config.playsinline = truthy.includes(url.searchParams.get('playsinline'));
19779
+ this.config.youtube.hl = url.searchParams.get('hl'); // TODO: Should this be setting language?
19780
+ } else {
19781
+ this.config.playsinline = true;
19782
+ }
19783
+ }
19784
+ } else {
19785
+ // <div> with attributes
19786
+ this.provider = this.media.getAttribute(this.config.attributes.embed.provider); // Remove attribute
19787
+
19788
+ this.media.removeAttribute(this.config.attributes.embed.provider);
19789
+ } // Unsupported or missing provider
19790
+
19791
+
19792
+ if (is$1.empty(this.provider) || !Object.keys(providers).includes(this.provider)) {
19793
+ this.debug.error('Setup failed: Invalid provider');
19794
+ return;
19795
+ } // Audio will come later for external providers
19796
+
19797
+
19798
+ this.type = types.video;
19799
+ break;
19800
+
19801
+ case 'video':
19802
+ case 'audio':
19803
+ this.type = type;
19804
+ this.provider = providers.html5; // Get config from attributes
19805
+
19806
+ if (this.media.hasAttribute('crossorigin')) {
19807
+ this.config.crossorigin = true;
19808
+ }
19809
+
19810
+ if (this.media.hasAttribute('autoplay')) {
19811
+ this.config.autoplay = true;
19812
+ }
19813
+
19814
+ if (this.media.hasAttribute('playsinline') || this.media.hasAttribute('webkit-playsinline')) {
19815
+ this.config.playsinline = true;
19816
+ }
19817
+
19818
+ if (this.media.hasAttribute('muted')) {
19819
+ this.config.muted = true;
19820
+ }
19821
+
19822
+ if (this.media.hasAttribute('loop')) {
19823
+ this.config.loop.active = true;
19824
+ }
19825
+
19826
+ break;
19827
+
19828
+ default:
19829
+ this.debug.error('Setup failed: unsupported type');
19830
+ return;
19831
+ } // Check for support again but with type
19832
+
19833
+
19834
+ this.supported = support.check(this.type, this.provider, this.config.playsinline); // If no support for even API, bail
19835
+
19836
+ if (!this.supported.api) {
19837
+ this.debug.error('Setup failed: no support');
19838
+ return;
19839
+ }
19840
+
19841
+ this.eventListeners = []; // Create listeners
19842
+
19843
+ this.listeners = new Listeners(this); // Setup local storage for user settings
19844
+
19845
+ this.storage = new Storage(this); // Store reference
19846
+
19847
+ this.media.plyr = this; // Wrap media
19848
+
19849
+ if (!is$1.element(this.elements.container)) {
19850
+ this.elements.container = createElement('div', {
19851
+ tabindex: 0
19852
+ });
19853
+ wrap(this.media, this.elements.container);
19854
+ } // Add style hook
19855
+
19856
+
19857
+ ui.addStyleHook.call(this); // Setup media
19858
+
19859
+ media.setup.call(this); // Listen for events if debugging
19860
+
19861
+ if (this.config.debug) {
19862
+ on.call(this, this.elements.container, this.config.events.join(' '), function (event) {
19863
+ _this.debug.log("event: ".concat(event.type));
19864
+ });
19865
+ } // Setup interface
19866
+ // If embed but not fully supported, build interface now to avoid flash of controls
19867
+
19868
+
19869
+ if (this.isHTML5 || this.isEmbed && !this.supported.ui) {
19870
+ ui.build.call(this);
19871
+ } // Container listeners
19872
+
19873
+
19874
+ this.listeners.container(); // Global listeners
19875
+
19876
+ this.listeners.global(); // Setup fullscreen
19877
+
19878
+ this.fullscreen = new Fullscreen(this); // Setup ads if provided
19879
+
19880
+ if (this.config.ads.enabled) {
19881
+ this.ads = new Ads(this);
19882
+ } // Autoplay if required
19883
+
19884
+
19885
+ if (this.isHTML5 && this.config.autoplay) {
19886
+ setTimeout(function () {
19887
+ return _this.play();
19888
+ }, 10);
19889
+ } // Seek time will be recorded (in listeners.js) so we can prevent hiding controls for a few seconds after seek
19890
+
19891
+
19892
+ this.lastSeekTime = 0; // Setup preview thumbnails if enabled
19893
+
19894
+ if (this.config.previewThumbnails.enabled) {
19895
+ this.previewThumbnails = new PreviewThumbnails(this);
19896
+ }
19897
+ } // ---------------------------------------
19898
+ // API
19899
+ // ---------------------------------------
19900
+
19901
+ /**
19902
+ * Types and provider helpers
19903
+ */
19904
+
19905
+
19906
+ _createClass(Plyr, [{
19907
+ key: "play",
19908
+
19909
+ /**
19910
+ * Play the media, or play the advertisement (if they are not blocked)
19911
+ */
19912
+ value: function play() {
19913
+ var _this2 = this;
19914
+
19915
+ if (!is$1.function(this.media.play)) {
19916
+ return null;
19917
+ } // Intecept play with ads
19918
+
19919
+
19920
+ if (this.ads && this.ads.enabled) {
19921
+ this.ads.managerPromise.then(function () {
19922
+ return _this2.ads.play();
19923
+ }).catch(function () {
19924
+ return _this2.media.play();
19925
+ });
19926
+ } // Return the promise (for HTML5)
19927
+
19928
+
19929
+ return this.media.play();
19930
+ }
19931
+ /**
19932
+ * Pause the media
19933
+ */
19934
+
19935
+ }, {
19936
+ key: "pause",
19937
+ value: function pause() {
19938
+ if (!this.playing || !is$1.function(this.media.pause)) {
19939
+ return;
19940
+ }
19941
+
19942
+ this.media.pause();
19943
+ }
19944
+ /**
19945
+ * Get playing state
19946
+ */
19947
+
19948
+ }, {
19949
+ key: "togglePlay",
19950
+
19951
+ /**
19952
+ * Toggle playback based on current status
19953
+ * @param {Boolean} input
19954
+ */
19955
+ value: function togglePlay(input) {
19956
+ // Toggle based on current state if nothing passed
19957
+ var toggle = is$1.boolean(input) ? input : !this.playing;
19958
+
19959
+ if (toggle) {
19960
+ this.play();
19961
+ } else {
19962
+ this.pause();
19963
+ }
19964
+ }
19965
+ /**
19966
+ * Stop playback
19967
+ */
19968
+
19969
+ }, {
19970
+ key: "stop",
19971
+ value: function stop() {
19972
+ if (this.isHTML5) {
19973
+ this.pause();
19974
+ this.restart();
19975
+ } else if (is$1.function(this.media.stop)) {
19976
+ this.media.stop();
19977
+ }
19978
+ }
19979
+ /**
19980
+ * Restart playback
19981
+ */
19982
+
19983
+ }, {
19984
+ key: "restart",
19985
+ value: function restart() {
19986
+ this.currentTime = 0;
19987
+ }
19988
+ /**
19989
+ * Rewind
19990
+ * @param {Number} seekTime - how far to rewind in seconds. Defaults to the config.seekTime
19991
+ */
19992
+
19993
+ }, {
19994
+ key: "rewind",
19995
+ value: function rewind(seekTime) {
19996
+ this.currentTime = this.currentTime - (is$1.number(seekTime) ? seekTime : this.config.seekTime);
19997
+ }
19998
+ /**
19999
+ * Fast forward
20000
+ * @param {Number} seekTime - how far to fast forward in seconds. Defaults to the config.seekTime
20001
+ */
20002
+
20003
+ }, {
20004
+ key: "forward",
20005
+ value: function forward(seekTime) {
20006
+ this.currentTime = this.currentTime + (is$1.number(seekTime) ? seekTime : this.config.seekTime);
20007
+ }
20008
+ /**
20009
+ * Seek to a time
20010
+ * @param {Number} input - where to seek to in seconds. Defaults to 0 (the start)
20011
+ */
20012
+
20013
+ }, {
20014
+ key: "increaseVolume",
20015
+
20016
+ /**
20017
+ * Increase volume
20018
+ * @param {Boolean} step - How much to decrease by (between 0 and 1)
20019
+ */
20020
+ value: function increaseVolume(step) {
20021
+ var volume = this.media.muted ? 0 : this.volume;
20022
+ this.volume = volume + (is$1.number(step) ? step : 0);
20023
+ }
20024
+ /**
20025
+ * Decrease volume
20026
+ * @param {Boolean} step - How much to decrease by (between 0 and 1)
20027
+ */
20028
+
20029
+ }, {
20030
+ key: "decreaseVolume",
20031
+ value: function decreaseVolume(step) {
20032
+ this.increaseVolume(-step);
20033
+ }
20034
+ /**
20035
+ * Set muted state
20036
+ * @param {Boolean} mute
20037
+ */
20038
+
20039
+ }, {
20040
+ key: "toggleCaptions",
20041
+
20042
+ /**
20043
+ * Toggle captions
20044
+ * @param {Boolean} input - Whether to enable captions
20045
+ */
20046
+ value: function toggleCaptions(input) {
20047
+ captions.toggle.call(this, input, false);
20048
+ }
20049
+ /**
20050
+ * Set the caption track by index
20051
+ * @param {Number} - Caption index
20052
+ */
20053
+
20054
+ }, {
20055
+ key: "airplay",
20056
+
20057
+ /**
20058
+ * Trigger the airplay dialog
20059
+ * TODO: update player with state, support, enabled
20060
+ */
20061
+ value: function airplay() {
20062
+ // Show dialog if supported
20063
+ if (support.airplay) {
20064
+ this.media.webkitShowPlaybackTargetPicker();
20065
+ }
20066
+ }
20067
+ /**
20068
+ * Toggle the player controls
20069
+ * @param {Boolean} [toggle] - Whether to show the controls
20070
+ */
20071
+
20072
+ }, {
20073
+ key: "toggleControls",
20074
+ value: function toggleControls(toggle) {
20075
+ // Don't toggle if missing UI support or if it's audio
20076
+ if (this.supported.ui && !this.isAudio) {
20077
+ // Get state before change
20078
+ var isHidden = hasClass(this.elements.container, this.config.classNames.hideControls); // Negate the argument if not undefined since adding the class to hides the controls
20079
+
20080
+ var force = typeof toggle === 'undefined' ? undefined : !toggle; // Apply and get updated state
20081
+
20082
+ var hiding = toggleClass(this.elements.container, this.config.classNames.hideControls, force); // Close menu
20083
+
20084
+ if (hiding && this.config.controls.includes('settings') && !is$1.empty(this.config.settings)) {
20085
+ controls.toggleMenu.call(this, false);
20086
+ } // Trigger event on change
20087
+
20088
+
20089
+ if (hiding !== isHidden) {
20090
+ var eventName = hiding ? 'controlshidden' : 'controlsshown';
20091
+ triggerEvent.call(this, this.media, eventName);
20092
+ }
20093
+
20094
+ return !hiding;
20095
+ }
20096
+
20097
+ return false;
20098
+ }
20099
+ /**
20100
+ * Add event listeners
20101
+ * @param {String} event - Event type
20102
+ * @param {Function} callback - Callback for when event occurs
20103
+ */
20104
+
20105
+ }, {
20106
+ key: "on",
20107
+ value: function on$1(event, callback) {
20108
+ on.call(this, this.elements.container, event, callback);
20109
+ }
20110
+ /**
20111
+ * Add event listeners once
20112
+ * @param {String} event - Event type
20113
+ * @param {Function} callback - Callback for when event occurs
20114
+ */
20115
+
20116
+ }, {
20117
+ key: "once",
20118
+ value: function once$1(event, callback) {
20119
+ once.call(this, this.elements.container, event, callback);
20120
+ }
20121
+ /**
20122
+ * Remove event listeners
20123
+ * @param {String} event - Event type
20124
+ * @param {Function} callback - Callback for when event occurs
20125
+ */
20126
+
20127
+ }, {
20128
+ key: "off",
20129
+ value: function off$1(event, callback) {
20130
+ off(this.elements.container, event, callback);
20131
+ }
20132
+ /**
20133
+ * Destroy an instance
20134
+ * Event listeners are removed when elements are removed
20135
+ * http://stackoverflow.com/questions/12528049/if-a-dom-element-is-removed-are-its-listeners-also-removed-from-memory
20136
+ * @param {Function} callback - Callback for when destroy is complete
20137
+ * @param {Boolean} soft - Whether it's a soft destroy (for source changes etc)
20138
+ */
20139
+
20140
+ }, {
20141
+ key: "destroy",
20142
+ value: function destroy(callback) {
20143
+ var _this3 = this;
20144
+
20145
+ var soft = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
20146
+
20147
+ if (!this.ready) {
20148
+ return;
20149
+ }
20150
+
20151
+ var done = function done() {
20152
+ // Reset overflow (incase destroyed while in fullscreen)
20153
+ document.body.style.overflow = ''; // GC for embed
20154
+
20155
+ _this3.embed = null; // If it's a soft destroy, make minimal changes
20156
+
20157
+ if (soft) {
20158
+ if (Object.keys(_this3.elements).length) {
20159
+ // Remove elements
20160
+ removeElement(_this3.elements.buttons.play);
20161
+ removeElement(_this3.elements.captions);
20162
+ removeElement(_this3.elements.controls);
20163
+ removeElement(_this3.elements.wrapper); // Clear for GC
20164
+
20165
+ _this3.elements.buttons.play = null;
20166
+ _this3.elements.captions = null;
20167
+ _this3.elements.controls = null;
20168
+ _this3.elements.wrapper = null;
20169
+ } // Callback
20170
+
20171
+
20172
+ if (is$1.function(callback)) {
20173
+ callback();
20174
+ }
20175
+ } else {
20176
+ // Unbind listeners
20177
+ unbindListeners.call(_this3); // Replace the container with the original element provided
20178
+
20179
+ replaceElement(_this3.elements.original, _this3.elements.container); // Event
20180
+
20181
+ triggerEvent.call(_this3, _this3.elements.original, 'destroyed', true); // Callback
20182
+
20183
+ if (is$1.function(callback)) {
20184
+ callback.call(_this3.elements.original);
20185
+ } // Reset state
20186
+
20187
+
20188
+ _this3.ready = false; // Clear for garbage collection
20189
+
20190
+ setTimeout(function () {
20191
+ _this3.elements = null;
20192
+ _this3.media = null;
20193
+ }, 200);
20194
+ }
20195
+ }; // Stop playback
20196
+
20197
+
20198
+ this.stop(); // Clear timeouts
20199
+
20200
+ clearTimeout(this.timers.loading);
20201
+ clearTimeout(this.timers.controls);
20202
+ clearTimeout(this.timers.resized); // Provider specific stuff
20203
+
20204
+ if (this.isHTML5) {
20205
+ // Restore native video controls
20206
+ ui.toggleNativeControls.call(this, true); // Clean up
20207
+
20208
+ done();
20209
+ } else if (this.isYouTube) {
20210
+ // Clear timers
20211
+ clearInterval(this.timers.buffering);
20212
+ clearInterval(this.timers.playing); // Destroy YouTube API
20213
+
20214
+ if (this.embed !== null && is$1.function(this.embed.destroy)) {
20215
+ this.embed.destroy();
20216
+ } // Clean up
20217
+
20218
+
20219
+ done();
20220
+ } else if (this.isVimeo) {
20221
+ // Destroy Vimeo API
20222
+ // then clean up (wait, to prevent postmessage errors)
20223
+ if (this.embed !== null) {
20224
+ this.embed.unload().then(done);
20225
+ } // Vimeo does not always return
20226
+
20227
+
20228
+ setTimeout(done, 200);
20229
+ }
20230
+ }
20231
+ /**
20232
+ * Check for support for a mime type (HTML5 only)
20233
+ * @param {String} type - Mime type
20234
+ */
20235
+
20236
+ }, {
20237
+ key: "supports",
20238
+ value: function supports(type) {
20239
+ return support.mime.call(this, type);
20240
+ }
20241
+ /**
20242
+ * Check for support
20243
+ * @param {String} type - Player type (audio/video)
20244
+ * @param {String} provider - Provider (html5/youtube/vimeo)
20245
+ * @param {Boolean} inline - Where player has `playsinline` sttribute
20246
+ */
20247
+
20248
+ }, {
20249
+ key: "isHTML5",
20250
+ get: function get() {
20251
+ return this.provider === providers.html5;
20252
+ }
20253
+ }, {
20254
+ key: "isEmbed",
20255
+ get: function get() {
20256
+ return this.isYouTube || this.isVimeo;
20257
+ }
20258
+ }, {
20259
+ key: "isYouTube",
20260
+ get: function get() {
20261
+ return this.provider === providers.youtube;
20262
+ }
20263
+ }, {
20264
+ key: "isVimeo",
20265
+ get: function get() {
20266
+ return this.provider === providers.vimeo;
20267
+ }
20268
+ }, {
20269
+ key: "isVideo",
20270
+ get: function get() {
20271
+ return this.type === types.video;
20272
+ }
20273
+ }, {
20274
+ key: "isAudio",
20275
+ get: function get() {
20276
+ return this.type === types.audio;
20277
+ }
20278
+ }, {
20279
+ key: "playing",
20280
+ get: function get() {
20281
+ return Boolean(this.ready && !this.paused && !this.ended);
20282
+ }
20283
+ /**
20284
+ * Get paused state
20285
+ */
20286
+
20287
+ }, {
20288
+ key: "paused",
20289
+ get: function get() {
20290
+ return Boolean(this.media.paused);
20291
+ }
20292
+ /**
20293
+ * Get stopped state
20294
+ */
20295
+
20296
+ }, {
20297
+ key: "stopped",
20298
+ get: function get() {
20299
+ return Boolean(this.paused && this.currentTime === 0);
20300
+ }
20301
+ /**
20302
+ * Get ended state
20303
+ */
20304
+
20305
+ }, {
20306
+ key: "ended",
20307
+ get: function get() {
20308
+ return Boolean(this.media.ended);
20309
+ }
20310
+ }, {
20311
+ key: "currentTime",
20312
+ set: function set(input) {
20313
+ // Bail if media duration isn't available yet
20314
+ if (!this.duration) {
20315
+ return;
20316
+ } // Validate input
20317
+
20318
+
20319
+ var inputIsValid = is$1.number(input) && input > 0; // Set
20320
+
20321
+ this.media.currentTime = inputIsValid ? Math.min(input, this.duration) : 0; // Logging
20322
+
20323
+ this.debug.log("Seeking to ".concat(this.currentTime, " seconds"));
20324
+ }
20325
+ /**
20326
+ * Get current time
20327
+ */
20328
+ ,
20329
+ get: function get() {
20330
+ return Number(this.media.currentTime);
20331
+ }
20332
+ /**
20333
+ * Get buffered
20334
+ */
20335
+
20336
+ }, {
20337
+ key: "buffered",
20338
+ get: function get() {
20339
+ var buffered = this.media.buffered; // YouTube / Vimeo return a float between 0-1
20340
+
20341
+ if (is$1.number(buffered)) {
20342
+ return buffered;
20343
+ } // HTML5
20344
+ // TODO: Handle buffered chunks of the media
20345
+ // (i.e. seek to another section buffers only that section)
20346
+
20347
+
20348
+ if (buffered && buffered.length && this.duration > 0) {
20349
+ return buffered.end(0) / this.duration;
20350
+ }
20351
+
20352
+ return 0;
20353
+ }
20354
+ /**
20355
+ * Get seeking status
20356
+ */
20357
+
20358
+ }, {
20359
+ key: "seeking",
20360
+ get: function get() {
20361
+ return Boolean(this.media.seeking);
20362
+ }
20363
+ /**
20364
+ * Get the duration of the current media
20365
+ */
20366
+
20367
+ }, {
20368
+ key: "duration",
20369
+ get: function get() {
20370
+ // Faux duration set via config
20371
+ var fauxDuration = parseFloat(this.config.duration); // Media duration can be NaN or Infinity before the media has loaded
20372
+
20373
+ var realDuration = (this.media || {}).duration;
20374
+ var duration = !is$1.number(realDuration) || realDuration === Infinity ? 0 : realDuration; // If config duration is funky, use regular duration
20375
+
20376
+ return fauxDuration || duration;
20377
+ }
20378
+ /**
20379
+ * Set the player volume
20380
+ * @param {Number} value - must be between 0 and 1. Defaults to the value from local storage and config.volume if not set in storage
20381
+ */
20382
+
20383
+ }, {
20384
+ key: "volume",
20385
+ set: function set(value) {
20386
+ var volume = value;
20387
+ var max = 1;
20388
+ var min = 0;
20389
+
20390
+ if (is$1.string(volume)) {
20391
+ volume = Number(volume);
20392
+ } // Load volume from storage if no value specified
20393
+
20394
+
20395
+ if (!is$1.number(volume)) {
20396
+ volume = this.storage.get('volume');
20397
+ } // Use config if all else fails
20398
+
20399
+
20400
+ if (!is$1.number(volume)) {
20401
+ volume = this.config.volume;
20402
+ } // Maximum is volumeMax
20403
+
20404
+
20405
+ if (volume > max) {
20406
+ volume = max;
20407
+ } // Minimum is volumeMin
20408
+
20409
+
20410
+ if (volume < min) {
20411
+ volume = min;
20412
+ } // Update config
20413
+
20414
+
20415
+ this.config.volume = volume; // Set the player volume
20416
+
20417
+ this.media.volume = volume; // If muted, and we're increasing volume manually, reset muted state
20418
+
20419
+ if (!is$1.empty(value) && this.muted && volume > 0) {
20420
+ this.muted = false;
20421
+ }
20422
+ }
20423
+ /**
20424
+ * Get the current player volume
20425
+ */
20426
+ ,
20427
+ get: function get() {
20428
+ return Number(this.media.volume);
20429
+ }
20430
+ }, {
20431
+ key: "muted",
20432
+ set: function set(mute) {
20433
+ var toggle = mute; // Load muted state from storage
20434
+
20435
+ if (!is$1.boolean(toggle)) {
20436
+ toggle = this.storage.get('muted');
20437
+ } // Use config if all else fails
20438
+
20439
+
20440
+ if (!is$1.boolean(toggle)) {
20441
+ toggle = this.config.muted;
20442
+ } // Update config
20443
+
20444
+
20445
+ this.config.muted = toggle; // Set mute on the player
20446
+
20447
+ this.media.muted = toggle;
20448
+ }
20449
+ /**
20450
+ * Get current muted state
20451
+ */
20452
+ ,
20453
+ get: function get() {
20454
+ return Boolean(this.media.muted);
20455
+ }
20456
+ /**
20457
+ * Check if the media has audio
20458
+ */
20459
+
20460
+ }, {
20461
+ key: "hasAudio",
20462
+ get: function get() {
20463
+ // Assume yes for all non HTML5 (as we can't tell...)
20464
+ if (!this.isHTML5) {
20465
+ return true;
20466
+ }
20467
+
20468
+ if (this.isAudio) {
20469
+ return true;
20470
+ } // Get audio tracks
20471
+
20472
+
20473
+ return Boolean(this.media.mozHasAudio) || Boolean(this.media.webkitAudioDecodedByteCount) || Boolean(this.media.audioTracks && this.media.audioTracks.length);
20474
+ }
20475
+ /**
20476
+ * Set playback speed
20477
+ * @param {Number} speed - the speed of playback (0.5-2.0)
20478
+ */
20479
+
20480
+ }, {
20481
+ key: "speed",
20482
+ set: function set(input) {
20483
+ var _this4 = this;
20484
+
20485
+ var speed = null;
20486
+
20487
+ if (is$1.number(input)) {
20488
+ speed = input;
20489
+ }
20490
+
20491
+ if (!is$1.number(speed)) {
20492
+ speed = this.storage.get('speed');
20493
+ }
20494
+
20495
+ if (!is$1.number(speed)) {
20496
+ speed = this.config.speed.selected;
20497
+ } // Clamp to min/max
20498
+
20499
+
20500
+ var min = this.minimumSpeed,
20501
+ max = this.maximumSpeed;
20502
+ speed = clamp(speed, min, max); // Update config
20503
+
20504
+ this.config.speed.selected = speed; // Set media speed
20505
+
20506
+ setTimeout(function () {
20507
+ _this4.media.playbackRate = speed;
20508
+ }, 0);
20509
+ }
20510
+ /**
20511
+ * Get current playback speed
20512
+ */
20513
+ ,
20514
+ get: function get() {
20515
+ return Number(this.media.playbackRate);
20516
+ }
20517
+ /**
20518
+ * Get the minimum allowed speed
20519
+ */
20520
+
20521
+ }, {
20522
+ key: "minimumSpeed",
20523
+ get: function get() {
20524
+ if (this.isYouTube) {
20525
+ // https://developers.google.com/youtube/iframe_api_reference#setPlaybackRate
20526
+ return Math.min.apply(Math, _toConsumableArray(this.options.speed));
20527
+ }
20528
+
20529
+ if (this.isVimeo) {
20530
+ // https://github.com/vimeo/player.js/#setplaybackrateplaybackrate-number-promisenumber-rangeerrorerror
20531
+ return 0.5;
20532
+ } // https://stackoverflow.com/a/32320020/1191319
20533
+
20534
+
20535
+ return 0.0625;
20536
+ }
20537
+ /**
20538
+ * Get the maximum allowed speed
20539
+ */
20540
+
20541
+ }, {
20542
+ key: "maximumSpeed",
20543
+ get: function get() {
20544
+ if (this.isYouTube) {
20545
+ // https://developers.google.com/youtube/iframe_api_reference#setPlaybackRate
20546
+ return Math.max.apply(Math, _toConsumableArray(this.options.speed));
20547
+ }
20548
+
20549
+ if (this.isVimeo) {
20550
+ // https://github.com/vimeo/player.js/#setplaybackrateplaybackrate-number-promisenumber-rangeerrorerror
20551
+ return 2;
20552
+ } // https://stackoverflow.com/a/32320020/1191319
20553
+
20554
+
20555
+ return 16;
20556
+ }
20557
+ /**
20558
+ * Set playback quality
20559
+ * Currently HTML5 & YouTube only
20560
+ * @param {Number} input - Quality level
20561
+ */
20562
+
20563
+ }, {
20564
+ key: "quality",
20565
+ set: function set(input) {
20566
+ var config = this.config.quality;
20567
+ var options = this.options.quality;
20568
+
20569
+ if (!options.length) {
20570
+ return;
20571
+ }
20572
+
20573
+ var quality = [!is$1.empty(input) && Number(input), this.storage.get('quality'), config.selected, config.default].find(is$1.number);
20574
+ var updateStorage = true;
20575
+
20576
+ if (!options.includes(quality)) {
20577
+ var value = closest(options, quality);
20578
+ this.debug.warn("Unsupported quality option: ".concat(quality, ", using ").concat(value, " instead"));
20579
+ quality = value; // Don't update storage if quality is not supported
20580
+
20581
+ updateStorage = false;
20582
+ } // Update config
20583
+
20584
+
20585
+ config.selected = quality; // Set quality
20586
+
20587
+ this.media.quality = quality; // Save to storage
20588
+
20589
+ if (updateStorage) {
20590
+ this.storage.set({
20591
+ quality: quality
20592
+ });
20593
+ }
20594
+ }
20595
+ /**
20596
+ * Get current quality level
20597
+ */
20598
+ ,
20599
+ get: function get() {
20600
+ return this.media.quality;
20601
+ }
20602
+ /**
20603
+ * Toggle loop
20604
+ * TODO: Finish fancy new logic. Set the indicator on load as user may pass loop as config
20605
+ * @param {Boolean} input - Whether to loop or not
20606
+ */
20607
+
20608
+ }, {
20609
+ key: "loop",
20610
+ set: function set(input) {
20611
+ var toggle = is$1.boolean(input) ? input : this.config.loop.active;
20612
+ this.config.loop.active = toggle;
20613
+ this.media.loop = toggle; // Set default to be a true toggle
20614
+
20615
+ /* const type = ['start', 'end', 'all', 'none', 'toggle'].includes(input) ? input : 'toggle';
20616
+ switch (type) {
20617
+ case 'start':
20618
+ if (this.config.loop.end && this.config.loop.end <= this.currentTime) {
20619
+ this.config.loop.end = null;
20620
+ }
20621
+ this.config.loop.start = this.currentTime;
20622
+ // this.config.loop.indicator.start = this.elements.display.played.value;
20623
+ break;
20624
+ case 'end':
20625
+ if (this.config.loop.start >= this.currentTime) {
20626
+ return this;
20627
+ }
20628
+ this.config.loop.end = this.currentTime;
20629
+ // this.config.loop.indicator.end = this.elements.display.played.value;
20630
+ break;
20631
+ case 'all':
20632
+ this.config.loop.start = 0;
20633
+ this.config.loop.end = this.duration - 2;
20634
+ this.config.loop.indicator.start = 0;
20635
+ this.config.loop.indicator.end = 100;
20636
+ break;
20637
+ case 'toggle':
20638
+ if (this.config.loop.active) {
20639
+ this.config.loop.start = 0;
20640
+ this.config.loop.end = null;
20641
+ } else {
20642
+ this.config.loop.start = 0;
20643
+ this.config.loop.end = this.duration - 2;
20644
+ }
20645
+ break;
20646
+ default:
20647
+ this.config.loop.start = 0;
20648
+ this.config.loop.end = null;
20649
+ break;
20650
+ } */
20651
+ }
20652
+ /**
20653
+ * Get current loop state
20654
+ */
20655
+ ,
20656
+ get: function get() {
20657
+ return Boolean(this.media.loop);
20658
+ }
20659
+ /**
20660
+ * Set new media source
20661
+ * @param {Object} input - The new source object (see docs)
20662
+ */
20663
+
20664
+ }, {
20665
+ key: "source",
20666
+ set: function set(input) {
20667
+ source.change.call(this, input);
20668
+ }
20669
+ /**
20670
+ * Get current source
20671
+ */
20672
+ ,
20673
+ get: function get() {
20674
+ return this.media.currentSrc;
20675
+ }
20676
+ /**
20677
+ * Get a download URL (either source or custom)
20678
+ */
20679
+
20680
+ }, {
20681
+ key: "download",
20682
+ get: function get() {
20683
+ var download = this.config.urls.download;
20684
+ return is$1.url(download) ? download : this.source;
20685
+ }
20686
+ /**
20687
+ * Set the download URL
20688
+ */
20689
+ ,
20690
+ set: function set(input) {
20691
+ if (!is$1.url(input)) {
20692
+ return;
20693
+ }
20694
+
20695
+ this.config.urls.download = input;
20696
+ controls.setDownloadUrl.call(this);
20697
+ }
20698
+ /**
20699
+ * Set the poster image for a video
20700
+ * @param {String} input - the URL for the new poster image
20701
+ */
20702
+
20703
+ }, {
20704
+ key: "poster",
20705
+ set: function set(input) {
20706
+ if (!this.isVideo) {
20707
+ this.debug.warn('Poster can only be set for video');
20708
+ return;
20709
+ }
20710
+
20711
+ ui.setPoster.call(this, input, false).catch(function () {});
20712
+ }
20713
+ /**
20714
+ * Get the current poster image
20715
+ */
20716
+ ,
20717
+ get: function get() {
20718
+ if (!this.isVideo) {
20719
+ return null;
20720
+ }
20721
+
20722
+ return this.media.getAttribute('poster');
20723
+ }
20724
+ /**
20725
+ * Get the current aspect ratio in use
20726
+ */
20727
+
20728
+ }, {
20729
+ key: "ratio",
20730
+ get: function get() {
20731
+ if (!this.isVideo) {
20732
+ return null;
20733
+ }
20734
+
20735
+ var ratio = reduceAspectRatio(getAspectRatio.call(this));
20736
+ return is$1.array(ratio) ? ratio.join(':') : ratio;
20737
+ }
20738
+ /**
20739
+ * Set video aspect ratio
20740
+ */
20741
+ ,
20742
+ set: function set(input) {
20743
+ if (!this.isVideo) {
20744
+ this.debug.warn('Aspect ratio can only be set for video');
20745
+ return;
20746
+ }
20747
+
20748
+ if (!is$1.string(input) || !validateRatio(input)) {
20749
+ this.debug.error("Invalid aspect ratio specified (".concat(input, ")"));
20750
+ return;
20751
+ }
20752
+
20753
+ this.config.ratio = input;
20754
+ setAspectRatio.call(this);
20755
+ }
20756
+ /**
20757
+ * Set the autoplay state
20758
+ * @param {Boolean} input - Whether to autoplay or not
20759
+ */
20760
+
20761
+ }, {
20762
+ key: "autoplay",
20763
+ set: function set(input) {
20764
+ var toggle = is$1.boolean(input) ? input : this.config.autoplay;
20765
+ this.config.autoplay = toggle;
20766
+ }
20767
+ /**
20768
+ * Get the current autoplay state
20769
+ */
20770
+ ,
20771
+ get: function get() {
20772
+ return Boolean(this.config.autoplay);
20773
+ }
20774
+ }, {
20775
+ key: "currentTrack",
20776
+ set: function set(input) {
20777
+ captions.set.call(this, input, false);
20778
+ }
20779
+ /**
20780
+ * Get the current caption track index (-1 if disabled)
20781
+ */
20782
+ ,
20783
+ get: function get() {
20784
+ var _this$captions = this.captions,
20785
+ toggled = _this$captions.toggled,
20786
+ currentTrack = _this$captions.currentTrack;
20787
+ return toggled ? currentTrack : -1;
20788
+ }
20789
+ /**
20790
+ * Set the wanted language for captions
20791
+ * Since tracks can be added later it won't update the actual caption track until there is a matching track
20792
+ * @param {String} - Two character ISO language code (e.g. EN, FR, PT, etc)
20793
+ */
20794
+
20795
+ }, {
20796
+ key: "language",
20797
+ set: function set(input) {
20798
+ captions.setLanguage.call(this, input, false);
20799
+ }
20800
+ /**
20801
+ * Get the current track's language
20802
+ */
20803
+ ,
20804
+ get: function get() {
20805
+ return (captions.getCurrentTrack.call(this) || {}).language;
20806
+ }
20807
+ /**
20808
+ * Toggle picture-in-picture playback on WebKit/MacOS
20809
+ * TODO: update player with state, support, enabled
20810
+ * TODO: detect outside changes
20811
+ */
20812
+
20813
+ }, {
20814
+ key: "pip",
20815
+ set: function set(input) {
20816
+ // Bail if no support
20817
+ if (!support.pip) {
20818
+ return;
20819
+ } // Toggle based on current state if not passed
20820
+
20821
+
20822
+ var toggle = is$1.boolean(input) ? input : !this.pip; // Toggle based on current state
20823
+ // Safari
20824
+
20825
+ if (is$1.function(this.media.webkitSetPresentationMode)) {
20826
+ this.media.webkitSetPresentationMode(toggle ? pip.active : pip.inactive);
20827
+ } // Chrome
20828
+
20829
+
20830
+ if (is$1.function(this.media.requestPictureInPicture)) {
20831
+ if (!this.pip && toggle) {
20832
+ this.media.requestPictureInPicture();
20833
+ } else if (this.pip && !toggle) {
20834
+ document.exitPictureInPicture();
20835
+ }
20836
+ }
20837
+ }
20838
+ /**
20839
+ * Get the current picture-in-picture state
20840
+ */
20841
+ ,
20842
+ get: function get() {
20843
+ if (!support.pip) {
20844
+ return null;
20845
+ } // Safari
20846
+
20847
+
20848
+ if (!is$1.empty(this.media.webkitPresentationMode)) {
20849
+ return this.media.webkitPresentationMode === pip.active;
20850
+ } // Chrome
20851
+
20852
+
20853
+ return this.media === document.pictureInPictureElement;
20854
+ }
20855
+ }], [{
20856
+ key: "supported",
20857
+ value: function supported(type, provider, inline) {
20858
+ return support.check(type, provider, inline);
20859
+ }
20860
+ /**
20861
+ * Load an SVG sprite into the page
20862
+ * @param {String} url - URL for the SVG sprite
20863
+ * @param {String} [id] - Unique ID
20864
+ */
20865
+
20866
+ }, {
20867
+ key: "loadSprite",
20868
+ value: function loadSprite$1(url, id) {
20869
+ return loadSprite(url, id);
20870
+ }
20871
+ /**
20872
+ * Setup multiple instances
20873
+ * @param {*} selector
20874
+ * @param {Object} options
20875
+ */
20876
+
20877
+ }, {
20878
+ key: "setup",
20879
+ value: function setup(selector) {
20880
+ var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
20881
+ var targets = null;
20882
+
20883
+ if (is$1.string(selector)) {
20884
+ targets = Array.from(document.querySelectorAll(selector));
20885
+ } else if (is$1.nodeList(selector)) {
20886
+ targets = Array.from(selector);
20887
+ } else if (is$1.array(selector)) {
20888
+ targets = selector.filter(is$1.element);
20889
+ }
20890
+
20891
+ if (is$1.empty(targets)) {
20892
+ return null;
20893
+ }
20894
+
20895
+ return targets.map(function (t) {
20896
+ return new Plyr(t, options);
20897
+ });
20898
+ }
20899
+ }]);
20900
+
20901
+ return Plyr;
20902
+ }();
20903
+
20904
+ Plyr.defaults = cloneDeep(defaults$1);
20905
+
20906
+ return Plyr;
20907
 
20908
  }));
20909
 
21525
  $('.eael-fancy-text-strings', $scope).css('display', 'inline-block');
21526
  }, 500);
21527
  });
21528
+
21529
+ if(isEditMode) {
21530
+ setTimeout(function() {
21531
+ $('.eael-fancy-text-strings', $scope).css('display', 'inline-block');
21532
+ }, 800);
21533
+ }
21534
  };
21535
  jQuery(window).on("elementor/frontend/init", function() {
21536
  elementorFrontend.hooks.addAction(
21777
  );
21778
  });
21779
 
21780
+ var PostGrid = function($scope, $) {
21781
+ var $gallery = $(".eael-post-appender", $scope).isotope({
21782
+ itemSelector: ".eael-grid-post",
21783
+ masonry: {
21784
+ columnWidth: ".eael-post-grid-column",
21785
+ percentPosition: true
21786
+ }
21787
+ });
21788
+
21789
+ // layout gal, while images are loading
21790
+ $gallery.imagesLoaded().progress(function() {
21791
+ $gallery.isotope("layout");
21792
+ });
21793
+ };
21794
+
21795
+ jQuery(window).on("elementor/frontend/init", function() {
21796
+ elementorFrontend.hooks.addAction(
21797
+ "frontend/element_ready/eael-post-grid.default",
21798
+ PostGrid
21799
+ );
21800
+ });
21801
+
21802
  var PricingTooltip = function($scope, $) {
21803
  if ($.fn.tooltipster) {
21804
  var $tooltip = $scope.find(".tooltip"),
21846
  );
21847
  });
21848
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
21849
  var ProgressBar = function($scope, $) {
21850
  $(".eael-progressbar", $scope).eaelProgressBar();
21851
  };
assets/front-end/js/eael.min.js CHANGED
@@ -1,10 +1,10 @@
1
- !function(t){"function"==typeof define&&define.amd?define(["jquery"],t):t(jQuery)}(function(i){"use strict";var n=function(t,s){this.$element=i(t),this.defaults=i.extend({},n.defaults,this.$element.data(),i.isPlainObject(s)?s:{}),this.init()};n.prototype={constructor:n,init:function(){var t=this.$element.html(),s=new Date(this.defaults.date||t);s.getTime()&&(this.content=t,this.date=s,this.find(),this.defaults.autoStart&&this.start())},find:function(){var t=this.$element;this.$days=t.find("[data-days]"),this.$hours=t.find("[data-hours]"),this.$minutes=t.find("[data-minutes]"),this.$seconds=t.find("[data-seconds]"),0<this.$days.length+this.$hours.length+this.$minutes.length+this.$seconds.length&&(this.found=!0)},reset:function(){this.found?(this.output("days"),this.output("hours"),this.output("minutes"),this.output("seconds")):this.output()},ready:function(){var t,s=this.date,e={};return!!s&&((t=s.getTime()-(new Date).getTime())<=0?(this.end(),!1):(e.days=t,e.hours=e.days%864e5,e.minutes=e.hours%36e5,e.seconds=e.minutes%6e4,e.milliseconds=e.seconds%1e3,this.days=Math.floor(e.days/864e5),this.hours=Math.floor(e.hours/36e5),this.minutes=Math.floor(e.minutes/6e4),this.seconds=Math.floor(e.seconds/1e3),this.deciseconds=Math.floor(e.milliseconds/100),!0))},start:function(){!this.active&&this.ready()&&(this.active=!0,this.reset(),this.autoUpdate=this.defaults.fast?setInterval(i.proxy(this.fastUpdate,this),100):setInterval(i.proxy(this.update,this),1e3))},stop:function(){this.active&&(this.active=!1,clearInterval(this.autoUpdate))},end:function(){this.date&&(this.stop(),this.days=0,this.hours=0,this.minutes=0,this.seconds=0,this.deciseconds=0,this.reset(),this.defaults.end())},destroy:function(){this.date&&(this.stop(),this.$days=null,this.$hours=null,this.$minutes=null,this.$seconds=null,this.$element.empty().html(this.content),this.$element.removeData("countdown"))},fastUpdate:function(){0<=--this.deciseconds?this.output("deciseconds"):(this.deciseconds=9,this.update())},update:function(){0<=--this.seconds?this.output("seconds"):(this.seconds=59,0<=--this.minutes?this.output("minutes"):(this.minutes=59,0<=--this.hours?this.output("hours"):(this.hours=23,0<=--this.days?this.output("days"):this.end())))},output:function(t){if(this.found)switch(t){case"deciseconds":this.$seconds.text(this.getSecondsText());break;case"seconds":this.$seconds.text(this.seconds);break;case"minutes":this.$minutes.text(this.minutes);break;case"hours":this.$hours.text(this.hours);break;case"days":this.$days.text(this.days)}else this.$element.empty().html(this.template())},template:function(){return this.defaults.text.replace("%s",this.days).replace("%s",this.hours).replace("%s",this.minutes).replace("%s",this.getSecondsText())},getSecondsText:function(){return this.active&&this.defaults.fast?this.seconds+"."+this.deciseconds:this.seconds}},n.defaults={autoStart:!0,date:null,fast:!1,end:i.noop,text:"%s days, %s hours, %s minutes, %s seconds"},n.setDefaults=function(t){i.extend(n.defaults,t)},i.fn.countdown=function(e){return this.each(function(){var t=i(this),s=t.data("countdown");s||t.data("countdown",s=new n(this,e)),"string"==typeof e&&i.isFunction(s[e])&&s[e]()})},i.fn.countdown.constructor=n,i.fn.countdown.setDefaults=n.setDefaults,i(function(){i("[countdown]").countdown()})});
2
- !function(e,t){"function"==typeof define&&define.amd?define("ev-emitter/ev-emitter",t):"object"==typeof module&&module.exports?module.exports=t():e.EvEmitter=t()}("undefined"!=typeof window?window:this,function(){function e(){}var t=e.prototype;return t.on=function(e,t){if(e&&t){var i=this._events=this._events||{},n=i[e]=i[e]||[];return-1==n.indexOf(t)&&n.push(t),this}},t.once=function(e,t){if(e&&t){this.on(e,t);var i=this._onceEvents=this._onceEvents||{};return(i[e]=i[e]||{})[t]=!0,this}},t.off=function(e,t){var i=this._events&&this._events[e];if(i&&i.length){var n=i.indexOf(t);return-1!=n&&i.splice(n,1),this}},t.emitEvent=function(e,t){var i=this._events&&this._events[e];if(i&&i.length){i=i.slice(0),t=t||[];for(var n=this._onceEvents&&this._onceEvents[e],o=0;o<i.length;o++){var s=i[o];n&&n[s]&&(this.off(e,s),delete n[s]),s.apply(this,t)}return this}},t.allOff=function(){delete this._events,delete this._onceEvents},e}),function(t,i){"use strict";"function"==typeof define&&define.amd?define(["ev-emitter/ev-emitter"],function(e){return i(t,e)}):"object"==typeof module&&module.exports?module.exports=i(t,require("ev-emitter")):t.imagesLoaded=i(t,t.EvEmitter)}("undefined"!=typeof window?window:this,function(t,e){var o=t.jQuery,s=t.console;function r(e,t){for(var i in t)e[i]=t[i];return e}var h=Array.prototype.slice;function a(e,t,i){if(!(this instanceof a))return new a(e,t,i);var n=e;"string"==typeof e&&(n=document.querySelectorAll(e)),n?(this.elements=function(e){return Array.isArray(e)?e:"object"==typeof e&&"number"==typeof e.length?h.call(e):[e]}(n),this.options=r({},this.options),"function"==typeof t?i=t:r(this.options,t),i&&this.on("always",i),this.getImages(),o&&(this.jqDeferred=new o.Deferred),setTimeout(this.check.bind(this))):s.error("Bad element for imagesLoaded "+(n||e))}(a.prototype=Object.create(e.prototype)).options={},a.prototype.getImages=function(){this.images=[],this.elements.forEach(this.addElementImages,this)},a.prototype.addElementImages=function(e){"IMG"==e.nodeName&&this.addImage(e),!0===this.options.background&&this.addElementBackgroundImages(e);var t=e.nodeType;if(t&&d[t]){for(var i=e.querySelectorAll("img"),n=0;n<i.length;n++){var o=i[n];this.addImage(o)}if("string"==typeof this.options.background){var s=e.querySelectorAll(this.options.background);for(n=0;n<s.length;n++){var r=s[n];this.addElementBackgroundImages(r)}}}};var d={1:!0,9:!0,11:!0};function i(e){this.img=e}function n(e,t){this.url=e,this.element=t,this.img=new Image}return a.prototype.addElementBackgroundImages=function(e){var t=getComputedStyle(e);if(t)for(var i=/url\((['"])?(.*?)\1\)/gi,n=i.exec(t.backgroundImage);null!==n;){var o=n&&n[2];o&&this.addBackground(o,e),n=i.exec(t.backgroundImage)}},a.prototype.addImage=function(e){var t=new i(e);this.images.push(t)},a.prototype.addBackground=function(e,t){var i=new n(e,t);this.images.push(i)},a.prototype.check=function(){var n=this;function t(e,t,i){setTimeout(function(){n.progress(e,t,i)})}this.progressedCount=0,this.hasAnyBroken=!1,this.images.length?this.images.forEach(function(e){e.once("progress",t),e.check()}):this.complete()},a.prototype.progress=function(e,t,i){this.progressedCount++,this.hasAnyBroken=this.hasAnyBroken||!e.isLoaded,this.emitEvent("progress",[this,e,t]),this.jqDeferred&&this.jqDeferred.notify&&this.jqDeferred.notify(this,e),this.progressedCount==this.images.length&&this.complete(),this.options.debug&&s&&s.log("progress: "+i,e,t)},a.prototype.complete=function(){var e=this.hasAnyBroken?"fail":"done";if(this.isComplete=!0,this.emitEvent(e,[this]),this.emitEvent("always",[this]),this.jqDeferred){var t=this.hasAnyBroken?"reject":"resolve";this.jqDeferred[t](this)}},(i.prototype=Object.create(e.prototype)).check=function(){this.getIsImageComplete()?this.confirm(0!==this.img.naturalWidth,"naturalWidth"):(this.proxyImage=new Image,this.proxyImage.addEventListener("load",this),this.proxyImage.addEventListener("error",this),this.img.addEventListener("load",this),this.img.addEventListener("error",this),this.proxyImage.src=this.img.src)},i.prototype.getIsImageComplete=function(){return this.img.complete&&this.img.naturalWidth},i.prototype.confirm=function(e,t){this.isLoaded=e,this.emitEvent("progress",[this,this.img,t])},i.prototype.handleEvent=function(e){var t="on"+e.type;this[t]&&this[t](e)},i.prototype.onload=function(){this.confirm(!0,"onload"),this.unbindEvents()},i.prototype.onerror=function(){this.confirm(!1,"onerror"),this.unbindEvents()},i.prototype.unbindEvents=function(){this.proxyImage.removeEventListener("load",this),this.proxyImage.removeEventListener("error",this),this.img.removeEventListener("load",this),this.img.removeEventListener("error",this)},(n.prototype=Object.create(i.prototype)).check=function(){this.img.addEventListener("load",this),this.img.addEventListener("error",this),this.img.src=this.url,this.getIsImageComplete()&&(this.confirm(0!==this.img.naturalWidth,"naturalWidth"),this.unbindEvents())},n.prototype.unbindEvents=function(){this.img.removeEventListener("load",this),this.img.removeEventListener("error",this)},n.prototype.confirm=function(e,t){this.isLoaded=e,this.emitEvent("progress",[this,this.element,t])},a.makeJQueryPlugin=function(e){(e=e||t.jQuery)&&((o=e).fn.imagesLoaded=function(e,t){return new a(this,e,t).jqDeferred.promise(o(this))})},a.makeJQueryPlugin(),a});
3
- !function(e,i){"function"==typeof define&&define.amd?define("jquery-bridget/jquery-bridget",["jquery"],function(t){return i(e,t)}):"object"==typeof module&&module.exports?module.exports=i(e,require("jquery")):e.jQueryBridget=i(e,e.jQuery)}(window,function(t,e){"use strict";var i=Array.prototype.slice,o=t.console,d=void 0===o?function(){}:function(t){o.error(t)};function n(h,n,l){(l=l||e||t.jQuery)&&(n.prototype.option||(n.prototype.option=function(t){l.isPlainObject(t)&&(this.options=l.extend(!0,this.options,t))}),l.fn[h]=function(t){return"string"==typeof t?function(t,s,r){var a,u="$()."+h+'("'+s+'")';return t.each(function(t,e){var i=l.data(e,h);if(i){var o=i[s];if(o&&"_"!=s.charAt(0)){var n=o.apply(i,r);a=void 0===a?n:a}else d(u+" is not a valid method")}else d(h+" not initialized. Cannot call methods, i.e. "+u)}),void 0!==a?a:t}(this,t,i.call(arguments,1)):(function(t,o){t.each(function(t,e){var i=l.data(e,h);i?(i.option(o),i._init()):(i=new n(e,o),l.data(e,h,i))})}(this,t),this)},s(l))}function s(t){!t||t&&t.bridget||(t.bridget=n)}return s(e||t.jQuery),n}),function(t,e){"function"==typeof define&&define.amd?define("ev-emitter/ev-emitter",e):"object"==typeof module&&module.exports?module.exports=e():t.EvEmitter=e()}("undefined"!=typeof window?window:this,function(){function t(){}var e=t.prototype;return e.on=function(t,e){if(t&&e){var i=this._events=this._events||{},o=i[t]=i[t]||[];return-1==o.indexOf(e)&&o.push(e),this}},e.once=function(t,e){if(t&&e){this.on(t,e);var i=this._onceEvents=this._onceEvents||{};return(i[t]=i[t]||{})[e]=!0,this}},e.off=function(t,e){var i=this._events&&this._events[t];if(i&&i.length){var o=i.indexOf(e);return-1!=o&&i.splice(o,1),this}},e.emitEvent=function(t,e){var i=this._events&&this._events[t];if(i&&i.length){i=i.slice(0),e=e||[];for(var o=this._onceEvents&&this._onceEvents[t],n=0;n<i.length;n++){var s=i[n];o&&o[s]&&(this.off(t,s),delete o[s]),s.apply(this,e)}return this}},e.allOff=function(){delete this._events,delete this._onceEvents},t}),function(t,e){"function"==typeof define&&define.amd?define("get-size/get-size",e):"object"==typeof module&&module.exports?module.exports=e():t.getSize=e()}(window,function(){"use strict";function g(t){var e=parseFloat(t);return-1==t.indexOf("%")&&!isNaN(e)&&e}var i="undefined"==typeof console?function(){}:function(t){console.error(t)},v=["paddingLeft","paddingRight","paddingTop","paddingBottom","marginLeft","marginRight","marginTop","marginBottom","borderLeftWidth","borderRightWidth","borderTopWidth","borderBottomWidth"],_=v.length;function z(t){var e=getComputedStyle(t);return e||i("Style returned "+e+". Are you running this code in a hidden iframe on Firefox? See https://bit.ly/getsizebug1"),e}var I,x=!1;function S(t){if(function(){if(!x){x=!0;var t=document.createElement("div");t.style.width="200px",t.style.padding="1px 2px 3px 4px",t.style.borderStyle="solid",t.style.borderWidth="1px 2px 3px 4px",t.style.boxSizing="border-box";var e=document.body||document.documentElement;e.appendChild(t);var i=z(t);I=200==Math.round(g(i.width)),S.isBoxSizeOuter=I,e.removeChild(t)}}(),"string"==typeof t&&(t=document.querySelector(t)),t&&"object"==typeof t&&t.nodeType){var e=z(t);if("none"==e.display)return function(){for(var t={width:0,height:0,innerWidth:0,innerHeight:0,outerWidth:0,outerHeight:0},e=0;e<_;e++){t[v[e]]=0}return t}();var i={};i.width=t.offsetWidth,i.height=t.offsetHeight;for(var o=i.isBorderBox="border-box"==e.boxSizing,n=0;n<_;n++){var s=v[n],r=e[s],a=parseFloat(r);i[s]=isNaN(a)?0:a}var u=i.paddingLeft+i.paddingRight,h=i.paddingTop+i.paddingBottom,l=i.marginLeft+i.marginRight,d=i.marginTop+i.marginBottom,f=i.borderLeftWidth+i.borderRightWidth,c=i.borderTopWidth+i.borderBottomWidth,m=o&&I,p=g(e.width);!1!==p&&(i.width=p+(m?0:u+f));var y=g(e.height);return!1!==y&&(i.height=y+(m?0:h+c)),i.innerWidth=i.width-(u+f),i.innerHeight=i.height-(h+c),i.outerWidth=i.width+l,i.outerHeight=i.height+d,i}}return S}),function(t,e){"use strict";"function"==typeof define&&define.amd?define("desandro-matches-selector/matches-selector",e):"object"==typeof module&&module.exports?module.exports=e():t.matchesSelector=e()}(window,function(){"use strict";var i=function(){var t=window.Element.prototype;if(t.matches)return"matches";if(t.matchesSelector)return"matchesSelector";for(var e=["webkit","moz","ms","o"],i=0;i<e.length;i++){var o=e[i]+"MatchesSelector";if(t[o])return o}}();return function(t,e){return t[i](e)}}),function(e,i){"function"==typeof define&&define.amd?define("fizzy-ui-utils/utils",["desandro-matches-selector/matches-selector"],function(t){return i(e,t)}):"object"==typeof module&&module.exports?module.exports=i(e,require("desandro-matches-selector")):e.fizzyUIUtils=i(e,e.matchesSelector)}(window,function(h,s){var l={extend:function(t,e){for(var i in e)t[i]=e[i];return t},modulo:function(t,e){return(t%e+e)%e}},e=Array.prototype.slice;l.makeArray=function(t){return Array.isArray(t)?t:null==t?[]:"object"==typeof t&&"number"==typeof t.length?e.call(t):[t]},l.removeFrom=function(t,e){var i=t.indexOf(e);-1!=i&&t.splice(i,1)},l.getParent=function(t,e){for(;t.parentNode&&t!=document.body;)if(t=t.parentNode,s(t,e))return t},l.getQueryElement=function(t){return"string"==typeof t?document.querySelector(t):t},l.handleEvent=function(t){var e="on"+t.type;this[e]&&this[e](t)},l.filterFindElements=function(t,o){t=l.makeArray(t);var n=[];return t.forEach(function(t){if(t instanceof HTMLElement)if(o){s(t,o)&&n.push(t);for(var e=t.querySelectorAll(o),i=0;i<e.length;i++)n.push(e[i])}else n.push(t)}),n},l.debounceMethod=function(t,e,o){o=o||100;var n=t.prototype[e],s=e+"Timeout";t.prototype[e]=function(){var t=this[s];clearTimeout(t);var e=arguments,i=this;this[s]=setTimeout(function(){n.apply(i,e),delete i[s]},o)}},l.docReady=function(t){var e=document.readyState;"complete"==e||"interactive"==e?setTimeout(t):document.addEventListener("DOMContentLoaded",t)},l.toDashed=function(t){return t.replace(/(.)([A-Z])/g,function(t,e,i){return e+"-"+i}).toLowerCase()};var d=h.console;return l.htmlInit=function(a,u){l.docReady(function(){var t=l.toDashed(u),n="data-"+t,e=document.querySelectorAll("["+n+"]"),i=document.querySelectorAll(".js-"+t),o=l.makeArray(e).concat(l.makeArray(i)),s=n+"-options",r=h.jQuery;o.forEach(function(e){var t,i=e.getAttribute(n)||e.getAttribute(s);try{t=i&&JSON.parse(i)}catch(t){return void(d&&d.error("Error parsing "+n+" on "+e.className+": "+t))}var o=new a(e,t);r&&r.data(e,u,o)})})},l}),function(t,e){"function"==typeof define&&define.amd?define("outlayer/item",["ev-emitter/ev-emitter","get-size/get-size"],e):"object"==typeof module&&module.exports?module.exports=e(require("ev-emitter"),require("get-size")):(t.Outlayer={},t.Outlayer.Item=e(t.EvEmitter,t.getSize))}(window,function(t,e){"use strict";var i=document.documentElement.style,o="string"==typeof i.transition?"transition":"WebkitTransition",n="string"==typeof i.transform?"transform":"WebkitTransform",s={WebkitTransition:"webkitTransitionEnd",transition:"transitionend"}[o],r={transform:n,transition:o,transitionDuration:o+"Duration",transitionProperty:o+"Property",transitionDelay:o+"Delay"};function a(t,e){t&&(this.element=t,this.layout=e,this.position={x:0,y:0},this._create())}var u=a.prototype=Object.create(t.prototype);u.constructor=a,u._create=function(){this._transn={ingProperties:{},clean:{},onEnd:{}},this.css({position:"absolute"})},u.handleEvent=function(t){var e="on"+t.type;this[e]&&this[e](t)},u.getSize=function(){this.size=e(this.element)},u.css=function(t){var e=this.element.style;for(var i in t){e[r[i]||i]=t[i]}},u.getPosition=function(){var t=getComputedStyle(this.element),e=this.layout._getOption("originLeft"),i=this.layout._getOption("originTop"),o=t[e?"left":"right"],n=t[i?"top":"bottom"],s=parseFloat(o),r=parseFloat(n),a=this.layout.size;-1!=o.indexOf("%")&&(s=s/100*a.width),-1!=n.indexOf("%")&&(r=r/100*a.height),s=isNaN(s)?0:s,r=isNaN(r)?0:r,s-=e?a.paddingLeft:a.paddingRight,r-=i?a.paddingTop:a.paddingBottom,this.position.x=s,this.position.y=r},u.layoutPosition=function(){var t=this.layout.size,e={},i=this.layout._getOption("originLeft"),o=this.layout._getOption("originTop"),n=i?"paddingLeft":"paddingRight",s=i?"left":"right",r=i?"right":"left",a=this.position.x+t[n];e[s]=this.getXValue(a),e[r]="";var u=o?"paddingTop":"paddingBottom",h=o?"top":"bottom",l=o?"bottom":"top",d=this.position.y+t[u];e[h]=this.getYValue(d),e[l]="",this.css(e),this.emitEvent("layout",[this])},u.getXValue=function(t){var e=this.layout._getOption("horizontal");return this.layout.options.percentPosition&&!e?t/this.layout.size.width*100+"%":t+"px"},u.getYValue=function(t){var e=this.layout._getOption("horizontal");return this.layout.options.percentPosition&&e?t/this.layout.size.height*100+"%":t+"px"},u._transitionTo=function(t,e){this.getPosition();var i=this.position.x,o=this.position.y,n=t==this.position.x&&e==this.position.y;if(this.setPosition(t,e),!n||this.isTransitioning){var s=t-i,r=e-o,a={};a.transform=this.getTranslate(s,r),this.transition({to:a,onTransitionEnd:{transform:this.layoutPosition},isCleaning:!0})}else this.layoutPosition()},u.getTranslate=function(t,e){return"translate3d("+(t=this.layout._getOption("originLeft")?t:-t)+"px, "+(e=this.layout._getOption("originTop")?e:-e)+"px, 0)"},u.goTo=function(t,e){this.setPosition(t,e),this.layoutPosition()},u.moveTo=u._transitionTo,u.setPosition=function(t,e){this.position.x=parseFloat(t),this.position.y=parseFloat(e)},u._nonTransition=function(t){for(var e in this.css(t.to),t.isCleaning&&this._removeStyles(t.to),t.onTransitionEnd)t.onTransitionEnd[e].call(this)},u.transition=function(t){if(parseFloat(this.layout.options.transitionDuration)){var e=this._transn;for(var i in t.onTransitionEnd)e.onEnd[i]=t.onTransitionEnd[i];for(i in t.to)e.ingProperties[i]=!0,t.isCleaning&&(e.clean[i]=!0);if(t.from){this.css(t.from);this.element.offsetHeight;null}this.enableTransition(t.to),this.css(t.to),this.isTransitioning=!0}else this._nonTransition(t)};var h="opacity,"+n.replace(/([A-Z])/g,function(t){return"-"+t.toLowerCase()});u.enableTransition=function(){if(!this.isTransitioning){var t=this.layout.options.transitionDuration;t="number"==typeof t?t+"ms":t,this.css({transitionProperty:h,transitionDuration:t,transitionDelay:this.staggerDelay||0}),this.element.addEventListener(s,this,!1)}},u.onwebkitTransitionEnd=function(t){this.ontransitionend(t)},u.onotransitionend=function(t){this.ontransitionend(t)};var l={"-webkit-transform":"transform"};u.ontransitionend=function(t){if(t.target===this.element){var e=this._transn,i=l[t.propertyName]||t.propertyName;if(delete e.ingProperties[i],function(t){for(var e in t)return!1;return!null}(e.ingProperties)&&this.disableTransition(),i in e.clean&&(this.element.style[t.propertyName]="",delete e.clean[i]),i in e.onEnd)e.onEnd[i].call(this),delete e.onEnd[i];this.emitEvent("transitionEnd",[this])}},u.disableTransition=function(){this.removeTransitionStyles(),this.element.removeEventListener(s,this,!1),this.isTransitioning=!1},u._removeStyles=function(t){var e={};for(var i in t)e[i]="";this.css(e)};var d={transitionProperty:"",transitionDuration:"",transitionDelay:""};return u.removeTransitionStyles=function(){this.css(d)},u.stagger=function(t){t=isNaN(t)?0:t,this.staggerDelay=t+"ms"},u.removeElem=function(){this.element.parentNode.removeChild(this.element),this.css({display:""}),this.emitEvent("remove",[this])},u.remove=function(){o&&parseFloat(this.layout.options.transitionDuration)?(this.once("transitionEnd",function(){this.removeElem()}),this.hide()):this.removeElem()},u.reveal=function(){delete this.isHidden,this.css({display:""});var t=this.layout.options,e={};e[this.getHideRevealTransitionEndProperty("visibleStyle")]=this.onRevealTransitionEnd,this.transition({from:t.hiddenStyle,to:t.visibleStyle,isCleaning:!0,onTransitionEnd:e})},u.onRevealTransitionEnd=function(){this.isHidden||this.emitEvent("reveal")},u.getHideRevealTransitionEndProperty=function(t){var e=this.layout.options[t];if(e.opacity)return"opacity";for(var i in e)return i},u.hide=function(){this.isHidden=!0,this.css({display:""});var t=this.layout.options,e={};e[this.getHideRevealTransitionEndProperty("hiddenStyle")]=this.onHideTransitionEnd,this.transition({from:t.visibleStyle,to:t.hiddenStyle,isCleaning:!0,onTransitionEnd:e})},u.onHideTransitionEnd=function(){this.isHidden&&(this.css({display:"none"}),this.emitEvent("hide"))},u.destroy=function(){this.css({position:"",left:"",right:"",top:"",bottom:"",transition:"",transform:""})},a}),function(n,s){"use strict";"function"==typeof define&&define.amd?define("outlayer/outlayer",["ev-emitter/ev-emitter","get-size/get-size","fizzy-ui-utils/utils","./item"],function(t,e,i,o){return s(n,t,e,i,o)}):"object"==typeof module&&module.exports?module.exports=s(n,require("ev-emitter"),require("get-size"),require("fizzy-ui-utils"),require("./item")):n.Outlayer=s(n,n.EvEmitter,n.getSize,n.fizzyUIUtils,n.Outlayer.Item)}(window,function(t,e,n,s,o){"use strict";function i(){}var r=t.console,a=t.jQuery,u=0,h={};function l(t,e){var i=s.getQueryElement(t);if(i){this.element=i,a&&(this.$element=a(this.element)),this.options=s.extend({},this.constructor.defaults),this.option(e);var o=++u;this.element.outlayerGUID=o,(h[o]=this)._create(),this._getOption("initLayout")&&this.layout()}else r&&r.error("Bad element for "+this.constructor.namespace+": "+(i||t))}l.namespace="outlayer",l.Item=o,l.defaults={containerStyle:{position:"relative"},initLayout:!0,originLeft:!0,originTop:!0,resize:!0,resizeContainer:!0,transitionDuration:"0.4s",hiddenStyle:{opacity:0,transform:"scale(0.001)"},visibleStyle:{opacity:1,transform:"scale(1)"}};var d=l.prototype;function f(t){function e(){t.apply(this,arguments)}return(e.prototype=Object.create(t.prototype)).constructor=e}s.extend(d,e.prototype),d.option=function(t){s.extend(this.options,t)},d._getOption=function(t){var e=this.constructor.compatOptions[t];return e&&void 0!==this.options[e]?this.options[e]:this.options[t]},l.compatOptions={initLayout:"isInitLayout",horizontal:"isHorizontal",layoutInstant:"isLayoutInstant",originLeft:"isOriginLeft",originTop:"isOriginTop",resize:"isResizeBound",resizeContainer:"isResizingContainer"},d._create=function(){this.reloadItems(),this.stamps=[],this.stamp(this.options.stamp),s.extend(this.element.style,this.options.containerStyle),this._getOption("resize")&&this.bindResize()},d.reloadItems=function(){this.items=this._itemize(this.element.children)},d._itemize=function(t){for(var e=this._filterFindItemElements(t),i=this.constructor.Item,o=[],n=0;n<e.length;n++){var s=new i(e[n],this);o.push(s)}return o},d._filterFindItemElements=function(t){return s.filterFindElements(t,this.options.itemSelector)},d.getItemElements=function(){return this.items.map(function(t){return t.element})},d.layout=function(){this._resetLayout(),this._manageStamps();var t=this._getOption("layoutInstant"),e=void 0!==t?t:!this._isLayoutInited;this.layoutItems(this.items,e),this._isLayoutInited=!0},d._init=d.layout,d._resetLayout=function(){this.getSize()},d.getSize=function(){this.size=n(this.element)},d._getMeasurement=function(t,e){var i,o=this.options[t];o?("string"==typeof o?i=this.element.querySelector(o):o instanceof HTMLElement&&(i=o),this[t]=i?n(i)[e]:o):this[t]=0},d.layoutItems=function(t,e){t=this._getItemsForLayout(t),this._layoutItems(t,e),this._postLayout()},d._getItemsForLayout=function(t){return t.filter(function(t){return!t.isIgnored})},d._layoutItems=function(t,i){if(this._emitCompleteOnItems("layout",t),t&&t.length){var o=[];t.forEach(function(t){var e=this._getItemLayoutPosition(t);e.item=t,e.isInstant=i||t.isLayoutInstant,o.push(e)},this),this._processLayoutQueue(o)}},d._getItemLayoutPosition=function(){return{x:0,y:0}},d._processLayoutQueue=function(t){this.updateStagger(),t.forEach(function(t,e){this._positionItem(t.item,t.x,t.y,t.isInstant,e)},this)},d.updateStagger=function(){var t=this.options.stagger;if(null!=t)return this.stagger=function(t){if("number"==typeof t)return t;var e=t.match(/(^\d*\.?\d*)(\w*)/),i=e&&e[1],o=e&&e[2];if(!i.length)return 0;i=parseFloat(i);var n=c[o]||1;return i*n}(t),this.stagger;this.stagger=0},d._positionItem=function(t,e,i,o,n){o?t.goTo(e,i):(t.stagger(n*this.stagger),t.moveTo(e,i))},d._postLayout=function(){this.resizeContainer()},d.resizeContainer=function(){if(this._getOption("resizeContainer")){var t=this._getContainerSize();t&&(this._setContainerMeasure(t.width,!0),this._setContainerMeasure(t.height,!1))}},d._getContainerSize=i,d._setContainerMeasure=function(t,e){if(void 0!==t){var i=this.size;i.isBorderBox&&(t+=e?i.paddingLeft+i.paddingRight+i.borderLeftWidth+i.borderRightWidth:i.paddingBottom+i.paddingTop+i.borderTopWidth+i.borderBottomWidth),t=Math.max(t,0),this.element.style[e?"width":"height"]=t+"px"}},d._emitCompleteOnItems=function(e,t){var i=this;function o(){i.dispatchEvent(e+"Complete",null,[t])}var n=t.length;if(t&&n){var s=0;t.forEach(function(t){t.once(e,r)})}else o();function r(){++s==n&&o()}},d.dispatchEvent=function(t,e,i){var o=e?[e].concat(i):i;if(this.emitEvent(t,o),a)if(this.$element=this.$element||a(this.element),e){var n=a.Event(e);n.type=t,this.$element.trigger(n,i)}else this.$element.trigger(t,i)},d.ignore=function(t){var e=this.getItem(t);e&&(e.isIgnored=!0)},d.unignore=function(t){var e=this.getItem(t);e&&delete e.isIgnored},d.stamp=function(t){(t=this._find(t))&&(this.stamps=this.stamps.concat(t),t.forEach(this.ignore,this))},d.unstamp=function(t){(t=this._find(t))&&t.forEach(function(t){s.removeFrom(this.stamps,t),this.unignore(t)},this)},d._find=function(t){if(t)return"string"==typeof t&&(t=this.element.querySelectorAll(t)),t=s.makeArray(t)},d._manageStamps=function(){this.stamps&&this.stamps.length&&(this._getBoundingRect(),this.stamps.forEach(this._manageStamp,this))},d._getBoundingRect=function(){var t=this.element.getBoundingClientRect(),e=this.size;this._boundingRect={left:t.left+e.paddingLeft+e.borderLeftWidth,top:t.top+e.paddingTop+e.borderTopWidth,right:t.right-(e.paddingRight+e.borderRightWidth),bottom:t.bottom-(e.paddingBottom+e.borderBottomWidth)}},d._manageStamp=i,d._getElementOffset=function(t){var e=t.getBoundingClientRect(),i=this._boundingRect,o=n(t);return{left:e.left-i.left-o.marginLeft,top:e.top-i.top-o.marginTop,right:i.right-e.right-o.marginRight,bottom:i.bottom-e.bottom-o.marginBottom}},d.handleEvent=s.handleEvent,d.bindResize=function(){t.addEventListener("resize",this),this.isResizeBound=!0},d.unbindResize=function(){t.removeEventListener("resize",this),this.isResizeBound=!1},d.onresize=function(){this.resize()},s.debounceMethod(l,"onresize",100),d.resize=function(){this.isResizeBound&&this.needsResizeLayout()&&this.layout()},d.needsResizeLayout=function(){var t=n(this.element);return this.size&&t&&t.innerWidth!==this.size.innerWidth},d.addItems=function(t){var e=this._itemize(t);return e.length&&(this.items=this.items.concat(e)),e},d.appended=function(t){var e=this.addItems(t);e.length&&(this.layoutItems(e,!0),this.reveal(e))},d.prepended=function(t){var e=this._itemize(t);if(e.length){var i=this.items.slice(0);this.items=e.concat(i),this._resetLayout(),this._manageStamps(),this.layoutItems(e,!0),this.reveal(e),this.layoutItems(i)}},d.reveal=function(t){if(this._emitCompleteOnItems("reveal",t),t&&t.length){var i=this.updateStagger();t.forEach(function(t,e){t.stagger(e*i),t.reveal()})}},d.hide=function(t){if(this._emitCompleteOnItems("hide",t),t&&t.length){var i=this.updateStagger();t.forEach(function(t,e){t.stagger(e*i),t.hide()})}},d.revealItemElements=function(t){var e=this.getItems(t);this.reveal(e)},d.hideItemElements=function(t){var e=this.getItems(t);this.hide(e)},d.getItem=function(t){for(var e=0;e<this.items.length;e++){var i=this.items[e];if(i.element==t)return i}},d.getItems=function(t){t=s.makeArray(t);var i=[];return t.forEach(function(t){var e=this.getItem(t);e&&i.push(e)},this),i},d.remove=function(t){var e=this.getItems(t);this._emitCompleteOnItems("remove",e),e&&e.length&&e.forEach(function(t){t.remove(),s.removeFrom(this.items,t)},this)},d.destroy=function(){var t=this.element.style;t.height="",t.position="",t.width="",this.items.forEach(function(t){t.destroy()}),this.unbindResize();var e=this.element.outlayerGUID;delete h[e],delete this.element.outlayerGUID,a&&a.removeData(this.element,this.constructor.namespace)},l.data=function(t){var e=(t=s.getQueryElement(t))&&t.outlayerGUID;return e&&h[e]},l.create=function(t,e){var i=f(l);return i.defaults=s.extend({},l.defaults),s.extend(i.defaults,e),i.compatOptions=s.extend({},l.compatOptions),i.namespace=t,i.data=l.data,i.Item=f(o),s.htmlInit(i,t),a&&a.bridget&&a.bridget(t,i),i};var c={ms:1,s:1e3};return l.Item=o,l}),function(t,e){"function"==typeof define&&define.amd?define("isotope-layout/js/item",["outlayer/outlayer"],e):"object"==typeof module&&module.exports?module.exports=e(require("outlayer")):(t.Isotope=t.Isotope||{},t.Isotope.Item=e(t.Outlayer))}(window,function(t){"use strict";function e(){t.Item.apply(this,arguments)}var i=e.prototype=Object.create(t.Item.prototype),o=i._create;i._create=function(){this.id=this.layout.itemGUID++,o.call(this),this.sortData={}},i.updateSortData=function(){if(!this.isIgnored){this.sortData.id=this.id,this.sortData["original-order"]=this.id,this.sortData.random=Math.random();var t=this.layout.options.getSortData,e=this.layout._sorters;for(var i in t){var o=e[i];this.sortData[i]=o(this.element,this)}}};var n=i.destroy;return i.destroy=function(){n.apply(this,arguments),this.css({display:""})},e}),function(t,e){"function"==typeof define&&define.amd?define("isotope-layout/js/layout-mode",["get-size/get-size","outlayer/outlayer"],e):"object"==typeof module&&module.exports?module.exports=e(require("get-size"),require("outlayer")):(t.Isotope=t.Isotope||{},t.Isotope.LayoutMode=e(t.getSize,t.Outlayer))}(window,function(e,i){"use strict";function o(t){(this.isotope=t)&&(this.options=t.options[this.namespace],this.element=t.element,this.items=t.filteredItems,this.size=t.size)}var n=o.prototype;return["_resetLayout","_getItemLayoutPosition","_manageStamp","_getContainerSize","_getElementOffset","needsResizeLayout","_getOption"].forEach(function(t){n[t]=function(){return i.prototype[t].apply(this.isotope,arguments)}}),n.needsVerticalResizeLayout=function(){var t=e(this.isotope.element);return this.isotope.size&&t&&t.innerHeight!=this.isotope.size.innerHeight},n._getMeasurement=function(){this.isotope._getMeasurement.apply(this,arguments)},n.getColumnWidth=function(){this.getSegmentSize("column","Width")},n.getRowHeight=function(){this.getSegmentSize("row","Height")},n.getSegmentSize=function(t,e){var i=t+e,o="outer"+e;if(this._getMeasurement(i,o),!this[i]){var n=this.getFirstItemSize();this[i]=n&&n[o]||this.isotope.size["inner"+e]}},n.getFirstItemSize=function(){var t=this.isotope.filteredItems[0];return t&&t.element&&e(t.element)},n.layout=function(){this.isotope.layout.apply(this.isotope,arguments)},n.getSize=function(){this.isotope.getSize(),this.size=this.isotope.size},o.modes={},o.create=function(t,e){function i(){o.apply(this,arguments)}return(i.prototype=Object.create(n)).constructor=i,e&&(i.options=e),o.modes[i.prototype.namespace=t]=i},o}),function(t,e){"function"==typeof define&&define.amd?define("masonry-layout/masonry",["outlayer/outlayer","get-size/get-size"],e):"object"==typeof module&&module.exports?module.exports=e(require("outlayer"),require("get-size")):t.Masonry=e(t.Outlayer,t.getSize)}(window,function(t,h){var e=t.create("masonry");e.compatOptions.fitWidth="isFitWidth";var i=e.prototype;return i._resetLayout=function(){this.getSize(),this._getMeasurement("columnWidth","outerWidth"),this._getMeasurement("gutter","outerWidth"),this.measureColumns(),this.colYs=[];for(var t=0;t<this.cols;t++)this.colYs.push(0);this.maxY=0,this.horizontalColIndex=0},i.measureColumns=function(){if(this.getContainerWidth(),!this.columnWidth){var t=this.items[0],e=t&&t.element;this.columnWidth=e&&h(e).outerWidth||this.containerWidth}var i=this.columnWidth+=this.gutter,o=this.containerWidth+this.gutter,n=o/i,s=i-o%i;n=Math[s&&s<1?"round":"floor"](n),this.cols=Math.max(n,1)},i.getContainerWidth=function(){var t=this._getOption("fitWidth")?this.element.parentNode:this.element,e=h(t);this.containerWidth=e&&e.innerWidth},i._getItemLayoutPosition=function(t){t.getSize();var e=t.size.outerWidth%this.columnWidth,i=Math[e&&e<1?"round":"ceil"](t.size.outerWidth/this.columnWidth);i=Math.min(i,this.cols);for(var o=this[this.options.horizontalOrder?"_getHorizontalColPosition":"_getTopColPosition"](i,t),n={x:this.columnWidth*o.col,y:o.y},s=o.y+t.size.outerHeight,r=i+o.col,a=o.col;a<r;a++)this.colYs[a]=s;return n},i._getTopColPosition=function(t){var e=this._getTopColGroup(t),i=Math.min.apply(Math,e);return{col:e.indexOf(i),y:i}},i._getTopColGroup=function(t){if(t<2)return this.colYs;for(var e=[],i=this.cols+1-t,o=0;o<i;o++)e[o]=this._getColGroupY(o,t);return e},i._getColGroupY=function(t,e){if(e<2)return this.colYs[t];var i=this.colYs.slice(t,t+e);return Math.max.apply(Math,i)},i._getHorizontalColPosition=function(t,e){var i=this.horizontalColIndex%this.cols;i=1<t&&i+t>this.cols?0:i;var o=e.size.outerWidth&&e.size.outerHeight;return this.horizontalColIndex=o?i+t:this.horizontalColIndex,{col:i,y:this._getColGroupY(i,t)}},i._manageStamp=function(t){var e=h(t),i=this._getElementOffset(t),o=this._getOption("originLeft")?i.left:i.right,n=o+e.outerWidth,s=Math.floor(o/this.columnWidth);s=Math.max(0,s);var r=Math.floor(n/this.columnWidth);r-=n%this.columnWidth?0:1,r=Math.min(this.cols-1,r);for(var a=(this._getOption("originTop")?i.top:i.bottom)+e.outerHeight,u=s;u<=r;u++)this.colYs[u]=Math.max(a,this.colYs[u])},i._getContainerSize=function(){this.maxY=Math.max.apply(Math,this.colYs);var t={height:this.maxY};return this._getOption("fitWidth")&&(t.width=this._getContainerFitWidth()),t},i._getContainerFitWidth=function(){for(var t=0,e=this.cols;--e&&0===this.colYs[e];)t++;return(this.cols-t)*this.columnWidth-this.gutter},i.needsResizeLayout=function(){var t=this.containerWidth;return this.getContainerWidth(),t!=this.containerWidth},e}),function(t,e){"function"==typeof define&&define.amd?define("isotope-layout/js/layout-modes/masonry",["../layout-mode","masonry-layout/masonry"],e):"object"==typeof module&&module.exports?module.exports=e(require("../layout-mode"),require("masonry-layout")):e(t.Isotope.LayoutMode,t.Masonry)}(window,function(t,e){"use strict";var i=t.create("masonry"),o=i.prototype,n={_getElementOffset:!0,layout:!0,_getMeasurement:!0};for(var s in e.prototype)n[s]||(o[s]=e.prototype[s]);var r=o.measureColumns;o.measureColumns=function(){this.items=this.isotope.filteredItems,r.call(this)};var a=o._getOption;return o._getOption=function(t){return"fitWidth"==t?void 0!==this.options.isFitWidth?this.options.isFitWidth:this.options.fitWidth:a.apply(this.isotope,arguments)},i}),function(t,e){"function"==typeof define&&define.amd?define("isotope-layout/js/layout-modes/fit-rows",["../layout-mode"],e):"object"==typeof exports?module.exports=e(require("../layout-mode")):e(t.Isotope.LayoutMode)}(window,function(t){"use strict";var e=t.create("fitRows"),i=e.prototype;return i._resetLayout=function(){this.x=0,this.y=0,this.maxY=0,this._getMeasurement("gutter","outerWidth")},i._getItemLayoutPosition=function(t){t.getSize();var e=t.size.outerWidth+this.gutter,i=this.isotope.size.innerWidth+this.gutter;0!==this.x&&e+this.x>i&&(this.x=0,this.y=this.maxY);var o={x:this.x,y:this.y};return this.maxY=Math.max(this.maxY,this.y+t.size.outerHeight),this.x+=e,o},i._getContainerSize=function(){return{height:this.maxY}},e}),function(t,e){"function"==typeof define&&define.amd?define("isotope-layout/js/layout-modes/vertical",["../layout-mode"],e):"object"==typeof module&&module.exports?module.exports=e(require("../layout-mode")):e(t.Isotope.LayoutMode)}(window,function(t){"use strict";var e=t.create("vertical",{horizontalAlignment:0}),i=e.prototype;return i._resetLayout=function(){this.y=0},i._getItemLayoutPosition=function(t){t.getSize();var e=(this.isotope.size.innerWidth-t.size.outerWidth)*this.options.horizontalAlignment,i=this.y;return this.y+=t.size.outerHeight,{x:e,y:i}},i._getContainerSize=function(){return{height:this.y}},e}),function(r,a){"function"==typeof define&&define.amd?define(["outlayer/outlayer","get-size/get-size","desandro-matches-selector/matches-selector","fizzy-ui-utils/utils","isotope-layout/js/item","isotope-layout/js/layout-mode","isotope-layout/js/layout-modes/masonry","isotope-layout/js/layout-modes/fit-rows","isotope-layout/js/layout-modes/vertical"],function(t,e,i,o,n,s){return a(r,t,e,i,o,n,s)}):"object"==typeof module&&module.exports?module.exports=a(r,require("outlayer"),require("get-size"),require("desandro-matches-selector"),require("fizzy-ui-utils"),require("isotope-layout/js/item"),require("isotope-layout/js/layout-mode"),require("isotope-layout/js/layout-modes/masonry"),require("isotope-layout/js/layout-modes/fit-rows"),require("isotope-layout/js/layout-modes/vertical")):r.Isotope=a(r,r.Outlayer,r.getSize,r.matchesSelector,r.fizzyUIUtils,r.Isotope.Item,r.Isotope.LayoutMode)}(window,function(t,i,e,o,s,n,r){var a=t.jQuery,u=String.prototype.trim?function(t){return t.trim()}:function(t){return t.replace(/^\s+|\s+$/g,"")},h=i.create("isotope",{layoutMode:"masonry",isJQueryFiltering:!0,sortAscending:!0});h.Item=n,h.LayoutMode=r;var l=h.prototype;l._create=function(){for(var t in this.itemGUID=0,this._sorters={},this._getSorters(),i.prototype._create.call(this),this.modes={},this.filteredItems=this.items,this.sortHistory=["original-order"],r.modes)this._initLayoutMode(t)},l.reloadItems=function(){this.itemGUID=0,i.prototype.reloadItems.call(this)},l._itemize=function(){for(var t=i.prototype._itemize.apply(this,arguments),e=0;e<t.length;e++){t[e].id=this.itemGUID++}return this._updateItemsSortData(t),t},l._initLayoutMode=function(t){var e=r.modes[t],i=this.options[t]||{};this.options[t]=e.options?s.extend(e.options,i):i,this.modes[t]=new e(this)},l.layout=function(){this._isLayoutInited||!this._getOption("initLayout")?this._layout():this.arrange()},l._layout=function(){var t=this._getIsInstant();this._resetLayout(),this._manageStamps(),this.layoutItems(this.filteredItems,t),this._isLayoutInited=!0},l.arrange=function(t){this.option(t),this._getIsInstant();var e=this._filter(this.items);this.filteredItems=e.matches,this._bindArrangeComplete(),this._isInstant?this._noTransition(this._hideReveal,[e]):this._hideReveal(e),this._sort(),this._layout()},l._init=l.arrange,l._hideReveal=function(t){this.reveal(t.needReveal),this.hide(t.needHide)},l._getIsInstant=function(){var t=this._getOption("layoutInstant"),e=void 0!==t?t:!this._isLayoutInited;return this._isInstant=e},l._bindArrangeComplete=function(){var t,e,i,o=this;function n(){t&&e&&i&&o.dispatchEvent("arrangeComplete",null,[o.filteredItems])}this.once("layoutComplete",function(){t=!0,n()}),this.once("hideComplete",function(){e=!0,n()}),this.once("revealComplete",function(){i=!0,n()})},l._filter=function(t){var e=this.options.filter;e=e||"*";for(var i=[],o=[],n=[],s=this._getFilterTest(e),r=0;r<t.length;r++){var a=t[r];if(!a.isIgnored){var u=s(a);u&&i.push(a),u&&a.isHidden?o.push(a):u||a.isHidden||n.push(a)}}return{matches:i,needReveal:o,needHide:n}},l._getFilterTest=function(e){return a&&this.options.isJQueryFiltering?function(t){return a(t.element).is(e)}:"function"==typeof e?function(t){return e(t.element)}:function(t){return o(t.element,e)}},l.updateSortData=function(t){var e;e=t?(t=s.makeArray(t),this.getItems(t)):this.items,this._getSorters(),this._updateItemsSortData(e)},l._getSorters=function(){var t=this.options.getSortData;for(var e in t){var i=t[e];this._sorters[e]=d(i)}},l._updateItemsSortData=function(t){for(var e=t&&t.length,i=0;e&&i<e;i++){t[i].updateSortData()}};var d=function(t){if("string"!=typeof t)return t;var e=u(t).split(" "),i=e[0],o=i.match(/^\[(.+)\]$/),n=function(e,i){return e?function(t){return t.getAttribute(e)}:function(t){var e=t.querySelector(i);return e&&e.textContent}}(o&&o[1],i),s=h.sortDataParsers[e[1]];return t=s?function(t){return t&&s(n(t))}:function(t){return t&&n(t)}};h.sortDataParsers={parseInt:function(t){return parseInt(t,10)},parseFloat:function(t){return parseFloat(t)}},l._sort=function(){if(this.options.sortBy){var t=s.makeArray(this.options.sortBy);this._getIsSameSortBy(t)||(this.sortHistory=t.concat(this.sortHistory));var e=function(r,a){return function(t,e){for(var i=0;i<r.length;i++){var o=r[i],n=t.sortData[o],s=e.sortData[o];if(s<n||n<s)return(s<n?1:-1)*((void 0!==a[o]?a[o]:a)?1:-1)}return 0}}(this.sortHistory,this.options.sortAscending);this.filteredItems.sort(e)}},l._getIsSameSortBy=function(t){for(var e=0;e<t.length;e++)if(t[e]!=this.sortHistory[e])return!1;return!0},l._mode=function(){var t=this.options.layoutMode,e=this.modes[t];if(!e)throw new Error("No layout mode: "+t);return e.options=this.options[t],e},l._resetLayout=function(){i.prototype._resetLayout.call(this),this._mode()._resetLayout()},l._getItemLayoutPosition=function(t){return this._mode()._getItemLayoutPosition(t)},l._manageStamp=function(t){this._mode()._manageStamp(t)},l._getContainerSize=function(){return this._mode()._getContainerSize()},l.needsResizeLayout=function(){return this._mode().needsResizeLayout()},l.appended=function(t){var e=this.addItems(t);if(e.length){var i=this._filterRevealAdded(e);this.filteredItems=this.filteredItems.concat(i)}},l.prepended=function(t){var e=this._itemize(t);if(e.length){this._resetLayout(),this._manageStamps();var i=this._filterRevealAdded(e);this.layoutItems(this.filteredItems),this.filteredItems=i.concat(this.filteredItems),this.items=e.concat(this.items)}},l._filterRevealAdded=function(t){var e=this._filter(t);return this.hide(e.needHide),this.reveal(e.matches),this.layoutItems(e.matches,!0),e.matches},l.insert=function(t){var e=this.addItems(t);if(e.length){var i,o,n=e.length;for(i=0;i<n;i++)o=e[i],this.element.appendChild(o.element);var s=this._filter(e).matches;for(i=0;i<n;i++)e[i].isLayoutInstant=!0;for(this.arrange(),i=0;i<n;i++)delete e[i].isLayoutInstant;this.reveal(s)}};var f=l.remove;return l.remove=function(t){t=s.makeArray(t);var e=this.getItems(t);f.call(this,t);for(var i=e&&e.length,o=0;i&&o<i;o++){var n=e[o];s.removeFrom(this.filteredItems,n)}},l.shuffle=function(){for(var t=0;t<this.items.length;t++){this.items[t].sortData.random=Math.random()}this.options.sortBy="random",this._sort(),this._layout()},l._noTransition=function(t,e){var i=this.options.transitionDuration;this.options.transitionDuration=0;var o=t.apply(this,e);return this.options.transitionDuration=i,o},l.getFilteredItemElements=function(){return this.filteredItems.map(function(t){return t.element})},h});
4
- !function(e){"function"==typeof define&&define.amd?define(["jquery"],e):"object"==typeof exports?module.exports=e(require("jquery")):e(jQuery)}(function(f){var a,d,i,c=[],h=document,u=window,s=h.documentElement;function t(){if(c.length){var e=0,t=f.map(c,function(e){var t=e.data.selector,n=e.$element;return t?n.find(t):n});for(a=a||function(){var e,t,n={height:u.innerHeight,width:u.innerWidth};return n.height||!(e=h.compatMode)&&f.support.boxModel||(n={height:(t="CSS1Compat"===e?s:h.body).clientHeight,width:t.clientWidth}),n}(),d=d||{top:u.pageYOffset||s.scrollTop||h.body.scrollTop,left:u.pageXOffset||s.scrollLeft||h.body.scrollLeft};e<c.length;e++)if(f.contains(s,t[e][0])){var n=f(t[e]),i=n[0].offsetHeight,o=n[0].offsetWidth,l=n.offset(),r=n.data("inview");if(!d||!a)return;l.top+i>d.top&&l.top<d.top+a.height&&l.left+o>d.left&&l.left<d.left+a.width?r||n.data("inview",!0).trigger("inview",[!0]):r&&n.data("inview",!1).trigger("inview",[!1])}}}f.event.special.inview={add:function(e){c.push({data:e,$element:f(this),element:this}),!i&&c.length&&(i=setInterval(t,250))},remove:function(e){for(var t=0;t<c.length;t++){var n=c[t];if(n.element===this&&n.data.guid===e.guid){c.splice(t,1);break}}c.length||(clearInterval(i),i=null)}},f(u).on("scroll resize scrollstop",function(){a=d=null}),!s.addEventListener&&s.attachEvent&&s.attachEvent("onfocusin",function(){d=null})});
5
  !function(t,e,n){"use strict";function o(t,s){var e=this;this.el=t,this.options={},Object.keys(i).forEach(function(t){e.options[t]=i[t]}),Object.keys(s).forEach(function(t){e.options[t]=s[t]}),this.isInput="input"===this.el.tagName.toLowerCase(),this.attr=this.options.attr,this.showCursor=!this.isInput&&this.options.showCursor,this.elContent=this.attr?this.el.getAttribute(this.attr):this.el.textContent,this.contentType=this.options.contentType,this.typeSpeed=this.options.typeSpeed,this.startDelay=this.options.startDelay,this.backSpeed=this.options.backSpeed,this.backDelay=this.options.backDelay,n&&this.options.stringsElement instanceof n?this.stringsElement=this.options.stringsElement[0]:this.stringsElement=this.options.stringsElement,this.strings=this.options.strings,this.strPos=0,this.arrayPos=0,this.stopNum=0,this.loop=this.options.loop,this.loopCount=this.options.loopCount,this.curLoop=0,this.stop=!1,this.cursorChar=this.options.cursorChar,this.shuffle=this.options.shuffle,this.sequence=[],this.build()}o.prototype={constructor:o,init:function(){var s=this;s.timeout=setTimeout(function(){for(var t=0;t<s.strings.length;++t)s.sequence[t]=t;s.shuffle&&(s.sequence=s.shuffleArray(s.sequence)),s.typewrite(s.strings[s.sequence[s.arrayPos]],s.strPos)},s.startDelay)},build:function(){var s=this;!0===this.showCursor&&(this.cursor=e.createElement("span"),this.cursor.className="typed-cursor",this.cursor.innerHTML=this.cursorChar,this.el.parentNode&&this.el.parentNode.insertBefore(this.cursor,this.el.nextSibling)),this.stringsElement&&(this.strings=[],this.stringsElement.style.display="none",Array.prototype.slice.apply(this.stringsElement.children).forEach(function(t){s.strings.push(t.innerHTML)}));this.init()},typewrite:function(o,r){if(!0!==this.stop){var t=Math.round(70*Math.random())+this.typeSpeed,a=this;a.timeout=setTimeout(function(){var t=0,s=o.substr(r);if("^"===s.charAt(0)){var e=1;/^\^\d+/.test(s)&&(e+=(s=/\d+/.exec(s)[0]).length,t=parseInt(s)),o=o.substring(0,r)+o.substring(r+e)}if("html"===a.contentType){var i=o.substr(r).charAt(0);if("<"===i||"&"===i){var n;for(n="<"===i?">":";";o.substr(r+1).charAt(0)!==n&&(o.substr(r).charAt(0),!(++r+1>o.length)););r++,n}}a.timeout=setTimeout(function(){if(r===o.length){if(a.options.onStringTyped(a.arrayPos),a.arrayPos===a.strings.length-1&&(a.options.callback(),a.curLoop++,!1===a.loop||a.curLoop===a.loopCount))return;a.timeout=setTimeout(function(){a.backspace(o,r)},a.backDelay)}else{0===r&&a.options.preStringTyped(a.arrayPos);var t=o.substr(0,r+1);a.attr?a.el.setAttribute(a.attr,t):a.isInput?a.el.value=t:"html"===a.contentType?a.el.innerHTML=t:a.el.textContent=t,r++,a.typewrite(o,r)}},t)},t)}},backspace:function(s,e){if(!0!==this.stop){var t=Math.round(70*Math.random())+this.backSpeed,i=this;i.timeout=setTimeout(function(){if("html"===i.contentType&&">"===s.substr(e).charAt(0)){for(;"<"!==s.substr(e-1).charAt(0)&&(s.substr(e).charAt(0),!(--e<0)););e--,"<"}var t=s.substr(0,e);i.attr?i.el.setAttribute(i.attr,t):i.isInput?i.el.value=t:"html"===i.contentType?i.el.innerHTML=t:i.el.textContent=t,e>i.stopNum?(e--,i.backspace(s,e)):e<=i.stopNum&&(i.arrayPos++,i.arrayPos===i.strings.length?(i.arrayPos=0,i.shuffle&&(i.sequence=i.shuffleArray(i.sequence)),i.init()):i.typewrite(i.strings[i.sequence[i.arrayPos]],e))},t)}},shuffleArray:function(t){var s,e,i=t.length;if(i)for(;--i;)s=t[e=Math.floor(Math.random()*(i+1))],t[e]=t[i],t[i]=s;return t},reset:function(){clearInterval(this.timeout),this.el.getAttribute("id"),this.el.textContent="",void 0!==this.cursor&&void 0!==this.cursor.parentNode&&this.cursor.parentNode.removeChild(this.cursor),this.strPos=0,this.arrayPos=0,this.curLoop=0,this.options.resetCallback()}},o.new=function(t,i){Array.prototype.slice.apply(e.querySelectorAll(t)).forEach(function(t){var s=t._typed,e="object"==typeof i&&i;s&&s.reset(),t._typed=s=new o(t,e),"string"==typeof i&&s[i]()})},n&&(n.fn.typed=function(i){return this.each(function(){var t=n(this),s=t.data("typed"),e="object"==typeof i&&i;s&&s.reset(),t.data("typed",s=new o(this,e)),"string"==typeof i&&s[i]()})}),t.Typed=o;var i={strings:["These are the default values...","You know what you should do?","Use your own!","Have a great day!"],stringsElement:null,typeSpeed:0,startDelay:0,backSpeed:0,shuffle:!1,backDelay:500,loop:!1,loopCount:!1,showCursor:!0,cursorChar:"|",attr:null,contentType:"html",callback:function(){},preStringTyped:function(){},onStringTyped:function(){},resetCallback:function(){}}}(window,document,window.jQuery),function(i){"use strict";function s(t,s){this.element=i(t),this.settings=i.extend({},n,s),this._defaults=n,this._init()}var e="Morphext",n={animation:"bounceIn",separator:",",speed:2e3,complete:i.noop};s.prototype={_init:function(){var e=this;this.phrases=[],this.element.addClass("morphext"),i.each(this.element.text().split(t
 
 
 
 
1
  !function(t,e,n){"use strict";function o(t,s){var e=this;this.el=t,this.options={},Object.keys(i).forEach(function(t){e.options[t]=i[t]}),Object.keys(s).forEach(function(t){e.options[t]=s[t]}),this.isInput="input"===this.el.tagName.toLowerCase(),this.attr=this.options.attr,this.showCursor=!this.isInput&&this.options.showCursor,this.elContent=this.attr?this.el.getAttribute(this.attr):this.el.textContent,this.contentType=this.options.contentType,this.typeSpeed=this.options.typeSpeed,this.startDelay=this.options.startDelay,this.backSpeed=this.options.backSpeed,this.backDelay=this.options.backDelay,n&&this.options.stringsElement instanceof n?this.stringsElement=this.options.stringsElement[0]:this.stringsElement=this.options.stringsElement,this.strings=this.options.strings,this.strPos=0,this.arrayPos=0,this.stopNum=0,this.loop=this.options.loop,this.loopCount=this.options.loopCount,this.curLoop=0,this.stop=!1,this.cursorChar=this.options.cursorChar,this.shuffle=this.options.shuffle,this.sequence=[],this.build()}o.prototype={constructor:o,init:function(){var s=this;s.timeout=setTimeout(function(){for(var t=0;t<s.strings.length;++t)s.sequence[t]=t;s.shuffle&&(s.sequence=s.shuffleArray(s.sequence)),s.typewrite(s.strings[s.sequence[s.arrayPos]],s.strPos)},s.startDelay)},build:function(){var s=this;!0===this.showCursor&&(this.cursor=e.createElement("span"),this.cursor.className="typed-cursor",this.cursor.innerHTML=this.cursorChar,this.el.parentNode&&this.el.parentNode.insertBefore(this.cursor,this.el.nextSibling)),this.stringsElement&&(this.strings=[],this.stringsElement.style.display="none",Array.prototype.slice.apply(this.stringsElement.children).forEach(function(t){s.strings.push(t.innerHTML)}));this.init()},typewrite:function(o,r){if(!0!==this.stop){var t=Math.round(70*Math.random())+this.typeSpeed,a=this;a.timeout=setTimeout(function(){var t=0,s=o.substr(r);if("^"===s.charAt(0)){var e=1;/^\^\d+/.test(s)&&(e+=(s=/\d+/.exec(s)[0]).length,t=parseInt(s)),o=o.substring(0,r)+o.substring(r+e)}if("html"===a.contentType){var i=o.substr(r).charAt(0);if("<"===i||"&"===i){var n;for(n="<"===i?">":";";o.substr(r+1).charAt(0)!==n&&(o.substr(r).charAt(0),!(++r+1>o.length)););r++,n}}a.timeout=setTimeout(function(){if(r===o.length){if(a.options.onStringTyped(a.arrayPos),a.arrayPos===a.strings.length-1&&(a.options.callback(),a.curLoop++,!1===a.loop||a.curLoop===a.loopCount))return;a.timeout=setTimeout(function(){a.backspace(o,r)},a.backDelay)}else{0===r&&a.options.preStringTyped(a.arrayPos);var t=o.substr(0,r+1);a.attr?a.el.setAttribute(a.attr,t):a.isInput?a.el.value=t:"html"===a.contentType?a.el.innerHTML=t:a.el.textContent=t,r++,a.typewrite(o,r)}},t)},t)}},backspace:function(s,e){if(!0!==this.stop){var t=Math.round(70*Math.random())+this.backSpeed,i=this;i.timeout=setTimeout(function(){if("html"===i.contentType&&">"===s.substr(e).charAt(0)){for(;"<"!==s.substr(e-1).charAt(0)&&(s.substr(e).charAt(0),!(--e<0)););e--,"<"}var t=s.substr(0,e);i.attr?i.el.setAttribute(i.attr,t):i.isInput?i.el.value=t:"html"===i.contentType?i.el.innerHTML=t:i.el.textContent=t,e>i.stopNum?(e--,i.backspace(s,e)):e<=i.stopNum&&(i.arrayPos++,i.arrayPos===i.strings.length?(i.arrayPos=0,i.shuffle&&(i.sequence=i.shuffleArray(i.sequence)),i.init()):i.typewrite(i.strings[i.sequence[i.arrayPos]],e))},t)}},shuffleArray:function(t){var s,e,i=t.length;if(i)for(;--i;)s=t[e=Math.floor(Math.random()*(i+1))],t[e]=t[i],t[i]=s;return t},reset:function(){clearInterval(this.timeout),this.el.getAttribute("id"),this.el.textContent="",void 0!==this.cursor&&void 0!==this.cursor.parentNode&&this.cursor.parentNode.removeChild(this.cursor),this.strPos=0,this.arrayPos=0,this.curLoop=0,this.options.resetCallback()}},o.new=function(t,i){Array.prototype.slice.apply(e.querySelectorAll(t)).forEach(function(t){var s=t._typed,e="object"==typeof i&&i;s&&s.reset(),t._typed=s=new o(t,e),"string"==typeof i&&s[i]()})},n&&(n.fn.typed=function(i){return this.each(function(){var t=n(this),s=t.data("typed"),e="object"==typeof i&&i;s&&s.reset(),t.data("typed",s=new o(this,e)),"string"==typeof i&&s[i]()})}),t.Typed=o;var i={strings:["These are the default values...","You know what you should do?","Use your own!","Have a great day!"],stringsElement:null,typeSpeed:0,startDelay:0,backSpeed:0,shuffle:!1,backDelay:500,loop:!1,loopCount:!1,showCursor:!0,cursorChar:"|",attr:null,contentType:"html",callback:function(){},preStringTyped:function(){},onStringTyped:function(){},resetCallback:function(){}}}(window,document,window.jQuery),function(i){"use strict";function s(t,s){this.element=i(t),this.settings=i.extend({},n,s),this._defaults=n,this._init()}var e="Morphext",n={animation:"bounceIn",separator:",",speed:2e3,complete:i.noop};s.prototype={_init:function(){var e=this;this.phrases=[],this.element.addClass("morphext"),i.each(this.element.text().split(t