AronWolverine commited on
Commit
fb7733d
·
1 Parent(s): 6e57488

Added images and model using Git LFS

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. .gitattributes +4 -0
  2. app.py +67 -0
  3. dockerfile +21 -0
  4. requirements.txt +6 -0
  5. static/css/bootstrap.min.css +0 -0
  6. static/css/style.css +592 -0
  7. static/js/main.js +171 -0
  8. static/lib/animate/animate.css +1579 -0
  9. static/lib/animate/animate.min.css +11 -0
  10. static/lib/counterup/counterup.min.js +11 -0
  11. static/lib/easing/easing.js +168 -0
  12. static/lib/easing/easing.min.js +1 -0
  13. static/lib/owlcarousel/LICENSE +23 -0
  14. static/lib/owlcarousel/assets/ajax-loader.gif +0 -0
  15. static/lib/owlcarousel/assets/owl.carousel.css +170 -0
  16. static/lib/owlcarousel/assets/owl.carousel.min.css +6 -0
  17. static/lib/owlcarousel/assets/owl.theme.default.css +50 -0
  18. static/lib/owlcarousel/assets/owl.theme.default.min.css +6 -0
  19. static/lib/owlcarousel/assets/owl.theme.green.css +50 -0
  20. static/lib/owlcarousel/assets/owl.theme.green.min.css +6 -0
  21. static/lib/owlcarousel/assets/owl.video.play.png +0 -0
  22. static/lib/owlcarousel/owl.carousel.js +3275 -0
  23. static/lib/owlcarousel/owl.carousel.min.js +7 -0
  24. static/lib/waypoints/links.php +5 -0
  25. static/lib/waypoints/waypoints.min.js +7 -0
  26. static/lib/wow/wow.js +542 -0
  27. static/lib/wow/wow.min.js +3 -0
  28. static/scss/bootstrap.scss +28 -0
  29. static/scss/bootstrap/scss/_accordion.scss +118 -0
  30. static/scss/bootstrap/scss/_alert.scss +57 -0
  31. static/scss/bootstrap/scss/_badge.scss +29 -0
  32. static/scss/bootstrap/scss/_breadcrumb.scss +28 -0
  33. static/scss/bootstrap/scss/_button-group.scss +139 -0
  34. static/scss/bootstrap/scss/_buttons.scss +111 -0
  35. static/scss/bootstrap/scss/_card.scss +215 -0
  36. static/scss/bootstrap/scss/_carousel.scss +229 -0
  37. static/scss/bootstrap/scss/_close.scss +40 -0
  38. static/scss/bootstrap/scss/_containers.scss +41 -0
  39. static/scss/bootstrap/scss/_dropdown.scss +240 -0
  40. static/scss/bootstrap/scss/_forms.scss +9 -0
  41. static/scss/bootstrap/scss/_functions.scss +205 -0
  42. static/scss/bootstrap/scss/_grid.scss +22 -0
  43. static/scss/bootstrap/scss/_helpers.scss +7 -0
  44. static/scss/bootstrap/scss/_images.scss +42 -0
  45. static/scss/bootstrap/scss/_list-group.scss +174 -0
  46. static/scss/bootstrap/scss/_mixins.scss +42 -0
  47. static/scss/bootstrap/scss/_modal.scss +228 -0
  48. static/scss/bootstrap/scss/_nav.scss +139 -0
  49. static/scss/bootstrap/scss/_navbar.scss +306 -0
  50. static/scss/bootstrap/scss/_offcanvas.scss +77 -0
.gitattributes CHANGED
@@ -33,3 +33,7 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
 
 
 
 
 
33
  *.zip filter=lfs diff=lfs merge=lfs -text
34
  *.zst filter=lfs diff=lfs merge=lfs -text
35
  *tfevents* filter=lfs diff=lfs merge=lfs -text
36
+ *.jpeg filter=lfs diff=lfs merge=lfs -text
37
+ *.jpg filter=lfs diff=lfs merge=lfs -text
38
+ *.png filter=lfs diff=lfs merge=lfs -text
39
+ *.keras filter=lfs diff=lfs merge=lfs -text
app.py ADDED
@@ -0,0 +1,67 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import numpy as np
2
+ import os
3
+ from tensorflow.keras.models import load_model # type: ignore
4
+ from tensorflow.keras.preprocessing import image # type: ignore
5
+ from tensorflow.keras.layers import Flatten # type: ignore
6
+ from tensorflow.keras.applications.densenet import preprocess_input# type: ignore
7
+ import tensorflow as tf
8
+
9
+ from flask import Flask , request, render_template
10
+ #from werkzeug.utils import secure_filename
11
+ #from gevent.pywsgi import WSGIServer
12
+
13
+ app = Flask(__name__)
14
+ basepath = os.path.dirname(__file__)
15
+ modelpath = os.path.join(basepath,'uploads',"best1den.keras")
16
+ model = load_model(modelpath,compile=False, safe_mode=False)
17
+ @app.route('/')
18
+ def index():
19
+ return render_template('index.html')
20
+
21
+ @app.route('/about')
22
+ def about():
23
+ return render_template('about.html')
24
+
25
+ @app.route('/service')
26
+ def service():
27
+ return render_template('service.html')
28
+
29
+ @app.route('/predict',methods = ['GET','POST'])
30
+ def upload():
31
+ if request.method == 'POST':
32
+ f = request.files['image']
33
+
34
+ #print("current path")
35
+ basepath = os.path.dirname(__file__)
36
+ print("current path", basepath)
37
+ filepath = os.path.join(basepath,'uploads',f.filename)
38
+ print("upload folder is ", filepath)
39
+ f.save(filepath)
40
+
41
+ img=image.load_img(filepath,target_size=(224,224))
42
+ img=image.img_to_array(img)
43
+ img=img.reshape((1,img.shape[0],img.shape[1],img.shape[2]))
44
+ img=preprocess_input(img)
45
+ pred=model.predict(img)
46
+ pred=pred.flatten()
47
+ pred=list(pred)
48
+ n=max(pred)
49
+ val_dict={0: 'Aircraft Carrier',
50
+ 1: 'Bulkers',
51
+ 2: 'Car Carrier',
52
+ 3: 'Container Ship',
53
+ 4: 'Cruise',
54
+ 5: 'DDG',
55
+ 6: 'Recreational',
56
+ 7: 'Sailboat',
57
+ 8: 'Submarine',
58
+ 9: 'Tug'}
59
+ result=val_dict[pred.index(n)]
60
+ print(result)
61
+ text = "the Ship Category is " + result
62
+ return text
63
+
64
+ if __name__ == '__main__':
65
+ app.run(debug = True)
66
+
67
+
dockerfile ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Use official Python runtime as base image
2
+ FROM python:3.9
3
+
4
+ # Set the working directory in the container
5
+ WORKDIR /app
6
+
7
+ # Copy application files to the container
8
+ COPY . .
9
+
10
+ # Install required Python packages
11
+ RUN pip install --no-cache-dir -r requirements.txt
12
+
13
+ # Expose the Flask app's port (default: 5000)
14
+ EXPOSE 5000
15
+
16
+ # Set environment variables for Flask
17
+ ENV FLASK_APP=app.py
18
+ ENV FLASK_RUN_HOST=0.0.0.0
19
+
20
+ # Command to run the Flask application
21
+ CMD ["flask", "run", "--host=0.0.0.0", "--port=5000"]
requirements.txt ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ numpy
2
+ flask
3
+ tensorflow
4
+ keras
5
+ keras-models
6
+ Keras-Preprocessing
static/css/bootstrap.min.css ADDED
The diff for this file is too large to render. See raw diff
 
static/css/style.css ADDED
@@ -0,0 +1,592 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /********** Template CSS **********/
2
+ :root {
3
+ --primary: #00b0ff;
4
+ --secondary: #51CFED;
5
+ --light: #e5f7ff;
6
+ --dark: #060315;
7
+ }
8
+
9
+ .fw-medium {
10
+ font-weight: 600 !important;
11
+ }
12
+
13
+ .back-to-top {
14
+ position: fixed;
15
+ display: none;
16
+ right: 45px;
17
+ bottom: 45px;
18
+ z-index: 99;
19
+ }
20
+
21
+
22
+ /*** Spinner ***/
23
+ #spinner {
24
+ opacity: 0;
25
+ visibility: hidden;
26
+ transition: opacity .5s ease-out, visibility 0s linear .5s;
27
+ z-index: 99999;
28
+ }
29
+
30
+ #spinner.show {
31
+ transition: opacity .5s ease-out, visibility 0s linear 0s;
32
+ visibility: visible;
33
+ opacity: 1;
34
+ }
35
+
36
+
37
+ /*** Button ***/
38
+ .btn {
39
+ font-weight: 600;
40
+ transition: .5s;
41
+ }
42
+
43
+ .btn.btn-primary,
44
+ .btn.btn-secondary {
45
+ color: #FFFFFF;
46
+ }
47
+
48
+ .btn-square {
49
+ width: 38px;
50
+ height: 38px;
51
+ }
52
+
53
+ .btn-sm-square {
54
+ width: 32px;
55
+ height: 32px;
56
+ }
57
+
58
+ .btn-lg-square {
59
+ width: 48px;
60
+ height: 48px;
61
+ }
62
+
63
+ .btn-square,
64
+ .btn-sm-square,
65
+ .btn-lg-square {
66
+ padding: 0;
67
+ display: flex;
68
+ align-items: center;
69
+ justify-content: center;
70
+ font-weight: normal;
71
+ }
72
+ /***slider***/
73
+ ::-webkit-scrollbar{
74
+ height: 8px;
75
+ }
76
+ ::-webkit-scrollbar-track{
77
+ background: var(--primary);
78
+ border-radius: 25px;
79
+ }
80
+ ::-webkit-scrollbar-thumb{
81
+ background-color: var(--light);
82
+ border-radius: 25px;
83
+ }
84
+ ::-webkit-scrollbar-thumb-hover{
85
+ background: #fcd7ce;
86
+ }
87
+ .container1{
88
+ height: 420px;
89
+ display: flex;
90
+ gap: 30px;
91
+ max-width: 300px;
92
+ width: 100%;
93
+ background: var(--primary);
94
+ border-radius: 12px;
95
+ padding: 30px;
96
+ scroll-snap-type: x mandatory;
97
+ overflow-x: scroll;
98
+ overflow-y: hidden;
99
+ scroll-padding: 30px;
100
+ box-shadow: 0 15px 25px rgba(0, 0, 0, 0.1);
101
+ align-items: center;
102
+ }
103
+ .container1 .card{
104
+ display: flex;
105
+ flex: 0 0 100%;
106
+ flex-direction: column;
107
+ align-items: center;
108
+ padding: 30px;
109
+ border-radius: 12px;
110
+ background: #fff;
111
+ scroll-snap-align: start;
112
+ box-shadow: 0 15px 25px rgba(0, 0, 0, 0.1);
113
+ }
114
+ .card .image{
115
+ height: 130px;
116
+ width: 150px;
117
+ }
118
+ .image img{
119
+ height: 150px;
120
+ width: 100%;
121
+ object-fit: cover;
122
+ }
123
+ .card h2{
124
+ margin-top: 25px;
125
+ color: #333;
126
+ font-size: 22px;
127
+ font-weight: 500;
128
+ text-align: center;
129
+ }
130
+ .card{
131
+ height: 358px;
132
+ margin-top: 4px;
133
+ font-size: 12px;
134
+ font-weight: 400;
135
+ color: #333;
136
+ text-align: center;
137
+ }
138
+ /*** Navbar ***/
139
+ .navbar .dropdown-toggle::after {
140
+ border: none;
141
+ content: "\f107";
142
+ font-family: "Font Awesome 5 Free";
143
+ font-weight: 900;
144
+ vertical-align: middle;
145
+ margin-left: 8px;
146
+ }
147
+
148
+ .navbar-light .navbar-nav .nav-link {
149
+ position: relative;
150
+ margin-right: 30px;
151
+ padding: 25px 0;
152
+ color: #FFFFFF;
153
+ font-size: 15px;
154
+ text-transform: uppercase;
155
+ outline: none;
156
+ }
157
+
158
+ .navbar-light .navbar-nav .nav-link:hover,
159
+ .navbar-light .navbar-nav .nav-link.active {
160
+ color: var(--primary);
161
+ }
162
+
163
+ @media (max-width: 991.98px) {
164
+ .navbar-light .navbar-nav .nav-link {
165
+ margin-right: 0;
166
+ padding: 10px 0;
167
+ }
168
+
169
+ .navbar-light .navbar-nav {
170
+ border-top: 1px solid #EEEEEE;
171
+ }
172
+ }
173
+
174
+ .navbar-light .navbar-brand,
175
+ .navbar-light a.btn {
176
+ height: 75px;
177
+ }
178
+
179
+ .navbar-light .navbar-nav .nav-link {
180
+ color: var(--dark);
181
+ font-weight: 500;
182
+ }
183
+
184
+ .navbar-light.sticky-top {
185
+ top: -100px;
186
+ transition: .5s;
187
+ }
188
+
189
+ @media (min-width: 992px) {
190
+ .navbar-light .navbar-nav .nav-link::before {
191
+ position: absolute;
192
+ content: "";
193
+ width: 0;
194
+ height: 5px;
195
+ top: -6px;
196
+ left: 50%;
197
+ background: #FFFFFF;
198
+ transition: .5s;
199
+ }
200
+
201
+ .navbar-light .navbar-nav .nav-link:hover::before,
202
+ .navbar-light .navbar-nav .nav-link.active::before {
203
+ width: 100%;
204
+ left: 0;
205
+ }
206
+
207
+ .navbar-light .navbar-nav .nav-link.nav-contact::before {
208
+ display: none;
209
+ }
210
+
211
+ .navbar .nav-item .dropdown-menu {
212
+ display: block;
213
+ border: none;
214
+ margin-top: 0;
215
+ top: 150%;
216
+ opacity: 0;
217
+ visibility: hidden;
218
+ transition: .5s;
219
+ }
220
+
221
+ .navbar .nav-item:hover .dropdown-menu {
222
+ top: 100%;
223
+ visibility: visible;
224
+ transition: .5s;
225
+ opacity: 1;
226
+ }
227
+ }
228
+
229
+
230
+ /*** Header ***/
231
+ @media (max-width: 768px) {
232
+ .header-carousel .owl-carousel-item {
233
+ position: relative;
234
+ min-height: 500px;
235
+ }
236
+
237
+ .header-carousel .owl-carousel-item img {
238
+ position: absolute;
239
+ width: 100%;
240
+ height: 100%;
241
+ object-fit: cover;
242
+ }
243
+
244
+ .header-carousel .owl-carousel-item h5,
245
+ .header-carousel .owl-carousel-item p {
246
+ font-size: 14px !important;
247
+ font-weight: 400 !important;
248
+ }
249
+
250
+ .header-carousel .owl-carousel-item h1 {
251
+ font-size: 30px;
252
+ font-weight: 600;
253
+ }
254
+ }
255
+
256
+ .header-carousel .owl-nav {
257
+ position: absolute;
258
+ top: 50%;
259
+ right: 8%;
260
+ transform: translateY(-50%);
261
+ display: flex;
262
+ flex-direction: column;
263
+ }
264
+
265
+ .header-carousel .owl-nav .owl-prev,
266
+ .header-carousel .owl-nav .owl-next {
267
+ margin: 7px 0;
268
+ width: 45px;
269
+ height: 45px;
270
+ display: flex;
271
+ align-items: center;
272
+ justify-content: center;
273
+ color: #FFFFFF;
274
+ background: transparent;
275
+ border: 1px solid #FFFFFF;
276
+ border-radius: 45px;
277
+ font-size: 22px;
278
+ transition: .5s;
279
+ }
280
+
281
+ .header-carousel .owl-nav .owl-prev:hover,
282
+ .header-carousel .owl-nav .owl-next:hover {
283
+ background: var(--primary);
284
+ border-color: var(--primary);
285
+ }
286
+
287
+ .page-header {
288
+ background: linear-gradient(rgba(6, 3, 21, .5), rgba(6, 3, 21, .5)), url(../img/wallpaperflare.com_wallpaper.jpg) center center no-repeat;
289
+ background-size: cover;
290
+ }
291
+
292
+ .breadcrumb-item + .breadcrumb-item::before {
293
+ color: var(--light);
294
+ }
295
+
296
+
297
+ /*** About ***/
298
+ @media (min-width: 992px) {
299
+ .container.about {
300
+ max-width: 100% !important;
301
+ }
302
+
303
+ .about-text {
304
+ padding-right: calc(((100% - 960px) / 2) + .75rem);
305
+ }
306
+ }
307
+
308
+ @media (min-width: 1200px) {
309
+ .about-text {
310
+ padding-right: calc(((100% - 1140px) / 2) + .75rem);
311
+ }
312
+ }
313
+
314
+ @media (min-width: 1400px) {
315
+ .about-text {
316
+ padding-right: calc(((100% - 1320px) / 2) + .75rem);
317
+ }
318
+ }
319
+
320
+
321
+ /*** Feature ***/
322
+ @media (min-width: 992px) {
323
+ .container.feature {
324
+ max-width: 100% !important;
325
+ }
326
+
327
+ .feature-text {
328
+ padding-left: calc(((100% - 960px) / 2) + .75rem);
329
+ }
330
+ }
331
+
332
+ @media (min-width: 1200px) {
333
+ .feature-text {
334
+ padding-left: calc(((100% - 1140px) / 2) + .75rem);
335
+ }
336
+ }
337
+
338
+ @media (min-width: 1400px) {
339
+ .feature-text {
340
+ padding-left: calc(((100% - 1320px) / 2) + .75rem);
341
+ }
342
+ }
343
+
344
+
345
+ /*** Service, Price & Team ***/
346
+ .service-item,
347
+ .price-item,
348
+ .team-item {
349
+ height: 500px;
350
+ box-shadow: 0 0 45px rgba(0, 0, 0, 0.192);
351
+ }
352
+
353
+ .service-item img,
354
+ .team-item img {
355
+ transition: .5s;
356
+ }
357
+
358
+ .service-item:hover img,
359
+ .team-item:hover img {
360
+ transform: scale(1.1);
361
+ }
362
+
363
+ .service-item a.btn-slide,
364
+ .price-item a.btn-slide,
365
+ .team-item div.btn-slide {
366
+ position: relative;
367
+ display: inline-block;
368
+ overflow: hidden;
369
+ font-size: 0;
370
+ }
371
+
372
+ .service-item a.btn-slide i,
373
+ .service-item a.btn-slide span,
374
+ .price-item a.btn-slide i,
375
+ .price-item a.btn-slide span,
376
+ .team-item div.btn-slide i,
377
+ .team-item div.btn-slide span {
378
+ position: relative;
379
+ height: 40px;
380
+ padding: 0 15px;
381
+ display: inline-flex;
382
+ align-items: center;
383
+ font-size: 16px;
384
+ color: #FFFFFF;
385
+ background: var(--primary);
386
+ border-radius: 0 35px 35px 0;
387
+ transition: .5s;
388
+ z-index: 2;
389
+ }
390
+
391
+ .team-item div.btn-slide span a i {
392
+ padding: 0 10px;
393
+ }
394
+
395
+ .team-item div.btn-slide span a:hover i {
396
+ background: var(--secondary);
397
+ }
398
+
399
+ .service-item a.btn-slide span,
400
+ .price-item a.btn-slide span,
401
+ .team-item div.btn-slide span {
402
+ padding-left: 0;
403
+ left: -100%;
404
+ z-index: 1;
405
+ }
406
+
407
+ .service-item:hover a.btn-slide i,
408
+ .price-item:hover a.btn-slide i,
409
+ .team-item:hover div.btn-slide i {
410
+ border-radius: 0;
411
+ }
412
+
413
+ .service-item:hover a.btn-slide span,
414
+ .price-item:hover a.btn-slide span,
415
+ .team-item:hover div.btn-slide span {
416
+ left: 0;
417
+ }
418
+
419
+ .service-item a.btn-slide:hover i,
420
+ .service-item a.btn-slide:hover span,
421
+ .price-item a.btn-slide:hover i,
422
+ .price-item a.btn-slide:hover span {
423
+ background: var(--secondary);
424
+ }
425
+
426
+
427
+ /*** Testimonial ***/
428
+ .testimonial-carousel .owl-item .testimonial-item {
429
+ position: relative;
430
+ transition: .5s;
431
+ }
432
+
433
+ .testimonial-carousel .owl-item.center .testimonial-item {
434
+ box-shadow: 0 0 45px rgba(0, 0, 0, .08);
435
+ animation: pulse 1s ease-out .5s;
436
+ }
437
+
438
+ .testimonial-carousel .owl-dots {
439
+ display: flex;
440
+ align-items: center;
441
+ justify-content: center;
442
+ }
443
+
444
+ .testimonial-carousel .owl-dot {
445
+ position: relative;
446
+ display: inline-block;
447
+ margin: 0 5px;
448
+ width: 15px;
449
+ height: 15px;
450
+ background: var(--primary);
451
+ border: 5px solid var(--light);
452
+ border-radius: 15px;
453
+ transition: .5s;
454
+ }
455
+
456
+ .testimonial-carousel .owl-dot.active {
457
+ background: var(--light);
458
+ border-color: var(--primary);
459
+ }
460
+
461
+
462
+ /*** Contact ***/
463
+ @media (min-width: 992px) {
464
+ .container.contact-page {
465
+ max-width: 100% !important;
466
+ }
467
+
468
+ .contact-page .contact-form {
469
+ padding-left: calc(((100% - 960px) / 2) + .75rem);
470
+ }
471
+ }
472
+
473
+ @media (min-width: 1200px) {
474
+ .contact-page .contact-form {
475
+ padding-left: calc(((100% - 1140px) / 2) + .75rem);
476
+ }
477
+ }
478
+
479
+ @media (min-width: 1400px) {
480
+ .contact-page .contact-form {
481
+ padding-left: calc(((100% - 1320px) / 2) + .75rem);
482
+ }
483
+ }
484
+
485
+
486
+ /*** Footer ***/
487
+ .footer {
488
+ background: linear-gradient(rgba(6, 3, 21, .5), rgba(6, 3, 21, .5)), url(../img/map.png) center center no-repeat;
489
+ background-size: cover;
490
+ }
491
+
492
+ .footer .btn.btn-social {
493
+ margin-right: 5px;
494
+ width: 35px;
495
+ height: 35px;
496
+ display: flex;
497
+ align-items: center;
498
+ justify-content: center;
499
+ color: var(--light);
500
+ border: 1px solid #FFFFFF;
501
+ border-radius: 35px;
502
+ transition: .3s;
503
+ }
504
+
505
+ .footer .btn.btn-social:hover {
506
+ color: var(--primary);
507
+ }
508
+
509
+ .footer .btn.btn-link {
510
+ display: block;
511
+ margin-bottom: 5px;
512
+ padding: 0;
513
+ text-align: left;
514
+ color: #FFFFFF;
515
+ font-size: 15px;
516
+ font-weight: normal;
517
+ text-transform: capitalize;
518
+ transition: .3s;
519
+ }
520
+
521
+ .footer .btn.btn-link::before {
522
+ position: relative;
523
+ content: "\f105";
524
+ font-family: "Font Awesome 5 Free";
525
+ font-weight: 900;
526
+ margin-right: 10px;
527
+ }
528
+
529
+ .footer .btn.btn-link:hover {
530
+ letter-spacing: 1px;
531
+ box-shadow: none;
532
+ }
533
+
534
+ .footer .copyright {
535
+ padding: 25px 0;
536
+ font-size: 15px;
537
+ border-top: 1px solid rgba(256, 256, 256, .1);
538
+ }
539
+
540
+ .footer .copyright a {
541
+ color: var(--light);
542
+ }
543
+ .img-preview {
544
+ width: 256px;
545
+ height: 256px;
546
+ position: relative;
547
+ border: 5px solid #F8F8F8;
548
+ box-shadow: 0px 2px 4px 0px rgba(0, 0, 0, 0.1);
549
+ margin-top: 1em;
550
+ margin-bottom: 1em;
551
+ }
552
+
553
+ .img-preview>div {
554
+ width: 100%;
555
+ height: 100%;
556
+ background-size: 256px 256px;
557
+ background-repeat: no-repeat;
558
+ background-position: center;
559
+ }
560
+
561
+ input[type="file"] {
562
+ display: none;
563
+ }
564
+
565
+ .upload-label{
566
+ display: inline-block;
567
+ padding: 12px 30px;
568
+ background: var(--primary);
569
+ color: var(--light);
570
+ font-size: 1em;
571
+ transition: all .4s;
572
+ cursor: pointer;
573
+ }
574
+
575
+ .upload-label:hover{
576
+ background: #34495E;
577
+ color: var(--primary);
578
+ }
579
+
580
+ .loader {
581
+ border: 8px solid #f3f3f3;
582
+ border-top: 8px solid --primary;
583
+ border-radius: 50%;
584
+ width: 50px;
585
+ height: 50px;
586
+ animation: spin 1s linear infinite;
587
+ }
588
+
589
+ @keyframes spin {
590
+ 0% { transform: rotate(0deg); }
591
+ 100% { transform: rotate(360deg); }
592
+ }
static/js/main.js ADDED
@@ -0,0 +1,171 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ (function ($) {
2
+ "use strict";
3
+
4
+ // Spinner
5
+ var spinner = function () {
6
+ setTimeout(function () {
7
+ if ($('#spinner').length > 0) {
8
+ $('#spinner').removeClass('show');
9
+ }
10
+ }, 1);
11
+ };
12
+ spinner();
13
+
14
+
15
+ // Initiate the wowjs
16
+ new WOW().init();
17
+
18
+
19
+ // Sticky Navbar
20
+ $(window).scroll(function () {
21
+ if ($(this).scrollTop() > 300) {
22
+ $('.sticky-top').css('top', '0px');
23
+ } else {
24
+ $('.sticky-top').css('top', '-100px');
25
+ }
26
+ });
27
+
28
+
29
+ // Dropdown on mouse hover
30
+ const $dropdown = $(".dropdown");
31
+ const $dropdownToggle = $(".dropdown-toggle");
32
+ const $dropdownMenu = $(".dropdown-menu");
33
+ const showClass = "show";
34
+
35
+ $(window).on("load resize", function() {
36
+ if (this.matchMedia("(min-width: 992px)").matches) {
37
+ $dropdown.hover(
38
+ function() {
39
+ const $this = $(this);
40
+ $this.addClass(showClass);
41
+ $this.find($dropdownToggle).attr("aria-expanded", "true");
42
+ $this.find($dropdownMenu).addClass(showClass);
43
+ },
44
+ function() {
45
+ const $this = $(this);
46
+ $this.removeClass(showClass);
47
+ $this.find($dropdownToggle).attr("aria-expanded", "false");
48
+ $this.find($dropdownMenu).removeClass(showClass);
49
+ }
50
+ );
51
+ } else {
52
+ $dropdown.off("mouseenter mouseleave");
53
+ }
54
+ });
55
+
56
+
57
+ // Back to top button
58
+ $(window).scroll(function () {
59
+ if ($(this).scrollTop() > 300) {
60
+ $('.back-to-top').fadeIn('slow');
61
+ } else {
62
+ $('.back-to-top').fadeOut('slow');
63
+ }
64
+ });
65
+ $('.back-to-top').click(function () {
66
+ $('html, body').animate({scrollTop: 0}, 1500, 'easeInOutExpo');
67
+ return false;
68
+ });
69
+
70
+
71
+ // Facts counter
72
+ $('[data-toggle="counter-up"]').counterUp({
73
+ delay: 10,
74
+ time: 2000
75
+ });
76
+
77
+
78
+ // Header carousel
79
+ $(".header-carousel").owlCarousel({
80
+ autoplay: false,
81
+ smartSpeed: 1500,
82
+ items: 1,
83
+ dots: false,
84
+ loop: true,
85
+ nav : true,
86
+ navText : [
87
+ '<i class="bi bi-chevron-left"></i>',
88
+ '<i class="bi bi-chevron-right"></i>'
89
+ ]
90
+ });
91
+
92
+
93
+ // Testimonials carousel
94
+ $(".testimonial-carousel").owlCarousel({
95
+ autoplay: false,
96
+ smartSpeed: 1000,
97
+ center: true,
98
+ dots: true,
99
+ loop: true,
100
+ responsive: {
101
+ 0:{
102
+ items:1
103
+ },
104
+ 768:{
105
+ items:2
106
+ },
107
+ 992:{
108
+ items:3
109
+ }
110
+ }
111
+ });
112
+ $(document).ready(function () {
113
+ // Init
114
+ $('.image-section').hide();
115
+ $('.loader').hide();
116
+ $('#result').hide();
117
+
118
+ // Upload Preview
119
+ function readURL(input) {
120
+ if (input.files && input.files[0]) {
121
+ var reader = new FileReader();
122
+ reader.onload = function (e) {
123
+ $('#imagePreview').css('background-image', 'url(' + e.target.result + ')');
124
+ $('#imagePreview').hide();
125
+ $('#imagePreview').fadeIn(650);
126
+ }
127
+ reader.readAsDataURL(input.files[0]);
128
+ }
129
+ }
130
+ $("#imageUpload").change(function () {
131
+ $('.image-section').show();
132
+ $('#btn-predict').show();
133
+ $('#result').text('');
134
+ $('#result').hide();
135
+ readURL(this);
136
+ });
137
+
138
+ // Predict
139
+ $('#btn-predict').click(function () {
140
+ var form_data = new FormData($('#upload-file')[0]);
141
+
142
+ // Show loading animation
143
+ $(this).hide();
144
+ $('.loader').show();
145
+
146
+ // Make prediction by calling api /predict
147
+ $.ajax({
148
+ type: 'POST',
149
+ url: '/predict',
150
+ data: form_data,
151
+ contentType: false,
152
+ cache: false,
153
+ processData: false,
154
+ async: true,
155
+ timeout: 10000,
156
+ success: function (data) {
157
+ // Get and display the result
158
+ $('.loader').hide();
159
+ $('#result').fadeIn(600);
160
+ $('#result').text(' Result: ' + data);
161
+ console.log('Success!');
162
+ },
163
+ });
164
+ });
165
+
166
+ });
167
+
168
+
169
+
170
+ })(jQuery);
171
+
static/lib/animate/animate.css ADDED
@@ -0,0 +1,1579 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @charset "UTF-8";
2
+
3
+ /*!
4
+ * animate.css -http://daneden.me/animate
5
+ * Version - 3.5.2
6
+ * Licensed under the MIT license - http://opensource.org/licenses/MIT
7
+ *
8
+ * Copyright (c) 2017 Daniel Eden
9
+ */
10
+
11
+ .animated {
12
+ animation-duration: 1s;
13
+ animation-fill-mode: both;
14
+ }
15
+
16
+ .animated.infinite {
17
+ animation-iteration-count: infinite;
18
+ }
19
+
20
+ .animated.hinge {
21
+ animation-duration: 2s;
22
+ }
23
+
24
+ .animated.flipOutX,
25
+ .animated.flipOutY,
26
+ .animated.bounceIn,
27
+ .animated.bounceOut {
28
+ animation-duration: .75s;
29
+ }
30
+
31
+ @keyframes bounce {
32
+ from, 20%, 53%, 80%, to {
33
+ animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
34
+ transform: translate3d(0,0,0);
35
+ }
36
+
37
+ 40%, 43% {
38
+ animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);
39
+ transform: translate3d(0, -30px, 0);
40
+ }
41
+
42
+ 70% {
43
+ animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060);
44
+ transform: translate3d(0, -15px, 0);
45
+ }
46
+
47
+ 90% {
48
+ transform: translate3d(0,-4px,0);
49
+ }
50
+ }
51
+
52
+ .bounce {
53
+ animation-name: bounce;
54
+ transform-origin: center bottom;
55
+ }
56
+
57
+ @keyframes flash {
58
+ from, 50%, to {
59
+ opacity: 1;
60
+ }
61
+
62
+ 25%, 75% {
63
+ opacity: 0;
64
+ }
65
+ }
66
+
67
+ .flash {
68
+ animation-name: flash;
69
+ }
70
+
71
+ /* originally authored by Nick Pettit - https://github.com/nickpettit/glide */
72
+
73
+ @keyframes pulse {
74
+ from {
75
+ transform: scale3d(1, 1, 1);
76
+ }
77
+
78
+ 50% {
79
+ transform: scale3d(1.05, 1.05, 1.05);
80
+ }
81
+
82
+ to {
83
+ transform: scale3d(1, 1, 1);
84
+ }
85
+ }
86
+
87
+ .pulse {
88
+ animation-name: pulse;
89
+ }
90
+
91
+ @keyframes rubberBand {
92
+ from {
93
+ transform: scale3d(1, 1, 1);
94
+ }
95
+
96
+ 30% {
97
+ transform: scale3d(1.25, 0.75, 1);
98
+ }
99
+
100
+ 40% {
101
+ transform: scale3d(0.75, 1.25, 1);
102
+ }
103
+
104
+ 50% {
105
+ transform: scale3d(1.15, 0.85, 1);
106
+ }
107
+
108
+ 65% {
109
+ transform: scale3d(.95, 1.05, 1);
110
+ }
111
+
112
+ 75% {
113
+ transform: scale3d(1.05, .95, 1);
114
+ }
115
+
116
+ to {
117
+ transform: scale3d(1, 1, 1);
118
+ }
119
+ }
120
+
121
+ .rubberBand {
122
+ animation-name: rubberBand;
123
+ }
124
+
125
+ @keyframes shake {
126
+ from, to {
127
+ transform: translate3d(0, 0, 0);
128
+ }
129
+
130
+ 10%, 30%, 50%, 70%, 90% {
131
+ transform: translate3d(-10px, 0, 0);
132
+ }
133
+
134
+ 20%, 40%, 60%, 80% {
135
+ transform: translate3d(10px, 0, 0);
136
+ }
137
+ }
138
+
139
+ .shake {
140
+ animation-name: shake;
141
+ }
142
+
143
+ @keyframes headShake {
144
+ 0% {
145
+ transform: translateX(0);
146
+ }
147
+
148
+ 6.5% {
149
+ transform: translateX(-6px) rotateY(-9deg);
150
+ }
151
+
152
+ 18.5% {
153
+ transform: translateX(5px) rotateY(7deg);
154
+ }
155
+
156
+ 31.5% {
157
+ transform: translateX(-3px) rotateY(-5deg);
158
+ }
159
+
160
+ 43.5% {
161
+ transform: translateX(2px) rotateY(3deg);
162
+ }
163
+
164
+ 50% {
165
+ transform: translateX(0);
166
+ }
167
+ }
168
+
169
+ .headShake {
170
+ animation-timing-function: ease-in-out;
171
+ animation-name: headShake;
172
+ }
173
+
174
+ @keyframes swing {
175
+ 20% {
176
+ transform: rotate3d(0, 0, 1, 15deg);
177
+ }
178
+
179
+ 40% {
180
+ transform: rotate3d(0, 0, 1, -10deg);
181
+ }
182
+
183
+ 60% {
184
+ transform: rotate3d(0, 0, 1, 5deg);
185
+ }
186
+
187
+ 80% {
188
+ transform: rotate3d(0, 0, 1, -5deg);
189
+ }
190
+
191
+ to {
192
+ transform: rotate3d(0, 0, 1, 0deg);
193
+ }
194
+ }
195
+
196
+ .swing {
197
+ transform-origin: top center;
198
+ animation-name: swing;
199
+ }
200
+
201
+ @keyframes tada {
202
+ from {
203
+ transform: scale3d(1, 1, 1);
204
+ }
205
+
206
+ 10%, 20% {
207
+ transform: scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg);
208
+ }
209
+
210
+ 30%, 50%, 70%, 90% {
211
+ transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg);
212
+ }
213
+
214
+ 40%, 60%, 80% {
215
+ transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg);
216
+ }
217
+
218
+ to {
219
+ transform: scale3d(1, 1, 1);
220
+ }
221
+ }
222
+
223
+ .tada {
224
+ animation-name: tada;
225
+ }
226
+
227
+ /* originally authored by Nick Pettit - https://github.com/nickpettit/glide */
228
+
229
+ @keyframes wobble {
230
+ from {
231
+ transform: none;
232
+ }
233
+
234
+ 15% {
235
+ transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg);
236
+ }
237
+
238
+ 30% {
239
+ transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg);
240
+ }
241
+
242
+ 45% {
243
+ transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg);
244
+ }
245
+
246
+ 60% {
247
+ transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg);
248
+ }
249
+
250
+ 75% {
251
+ transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg);
252
+ }
253
+
254
+ to {
255
+ transform: none;
256
+ }
257
+ }
258
+
259
+ .wobble {
260
+ animation-name: wobble;
261
+ }
262
+
263
+ @keyframes jello {
264
+ from, 11.1%, to {
265
+ transform: none;
266
+ }
267
+
268
+ 22.2% {
269
+ transform: skewX(-12.5deg) skewY(-12.5deg);
270
+ }
271
+
272
+ 33.3% {
273
+ transform: skewX(6.25deg) skewY(6.25deg);
274
+ }
275
+
276
+ 44.4% {
277
+ transform: skewX(-3.125deg) skewY(-3.125deg);
278
+ }
279
+
280
+ 55.5% {
281
+ transform: skewX(1.5625deg) skewY(1.5625deg);
282
+ }
283
+
284
+ 66.6% {
285
+ transform: skewX(-0.78125deg) skewY(-0.78125deg);
286
+ }
287
+
288
+ 77.7% {
289
+ transform: skewX(0.390625deg) skewY(0.390625deg);
290
+ }
291
+
292
+ 88.8% {
293
+ transform: skewX(-0.1953125deg) skewY(-0.1953125deg);
294
+ }
295
+ }
296
+
297
+ .jello {
298
+ animation-name: jello;
299
+ transform-origin: center;
300
+ }
301
+
302
+ @keyframes bounceIn {
303
+ from, 20%, 40%, 60%, 80%, to {
304
+ animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
305
+ }
306
+
307
+ 0% {
308
+ opacity: 0;
309
+ transform: scale3d(.3, .3, .3);
310
+ }
311
+
312
+ 20% {
313
+ transform: scale3d(1.1, 1.1, 1.1);
314
+ }
315
+
316
+ 40% {
317
+ transform: scale3d(.9, .9, .9);
318
+ }
319
+
320
+ 60% {
321
+ opacity: 1;
322
+ transform: scale3d(1.03, 1.03, 1.03);
323
+ }
324
+
325
+ 80% {
326
+ transform: scale3d(.97, .97, .97);
327
+ }
328
+
329
+ to {
330
+ opacity: 1;
331
+ transform: scale3d(1, 1, 1);
332
+ }
333
+ }
334
+
335
+ .bounceIn {
336
+ animation-name: bounceIn;
337
+ }
338
+
339
+ @keyframes bounceInDown {
340
+ from, 60%, 75%, 90%, to {
341
+ animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
342
+ }
343
+
344
+ 0% {
345
+ opacity: 0;
346
+ transform: translate3d(0, -3000px, 0);
347
+ }
348
+
349
+ 60% {
350
+ opacity: 1;
351
+ transform: translate3d(0, 25px, 0);
352
+ }
353
+
354
+ 75% {
355
+ transform: translate3d(0, -10px, 0);
356
+ }
357
+
358
+ 90% {
359
+ transform: translate3d(0, 5px, 0);
360
+ }
361
+
362
+ to {
363
+ transform: none;
364
+ }
365
+ }
366
+
367
+ .bounceInDown {
368
+ animation-name: bounceInDown;
369
+ }
370
+
371
+ @keyframes bounceInLeft {
372
+ from, 60%, 75%, 90%, to {
373
+ animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
374
+ }
375
+
376
+ 0% {
377
+ opacity: 0;
378
+ transform: translate3d(-3000px, 0, 0);
379
+ }
380
+
381
+ 60% {
382
+ opacity: 1;
383
+ transform: translate3d(25px, 0, 0);
384
+ }
385
+
386
+ 75% {
387
+ transform: translate3d(-10px, 0, 0);
388
+ }
389
+
390
+ 90% {
391
+ transform: translate3d(5px, 0, 0);
392
+ }
393
+
394
+ to {
395
+ transform: none;
396
+ }
397
+ }
398
+
399
+ .bounceInLeft {
400
+ animation-name: bounceInLeft;
401
+ }
402
+
403
+ @keyframes bounceInRight {
404
+ from, 60%, 75%, 90%, to {
405
+ animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
406
+ }
407
+
408
+ from {
409
+ opacity: 0;
410
+ transform: translate3d(3000px, 0, 0);
411
+ }
412
+
413
+ 60% {
414
+ opacity: 1;
415
+ transform: translate3d(-25px, 0, 0);
416
+ }
417
+
418
+ 75% {
419
+ transform: translate3d(10px, 0, 0);
420
+ }
421
+
422
+ 90% {
423
+ transform: translate3d(-5px, 0, 0);
424
+ }
425
+
426
+ to {
427
+ transform: none;
428
+ }
429
+ }
430
+
431
+ .bounceInRight {
432
+ animation-name: bounceInRight;
433
+ }
434
+
435
+ @keyframes bounceInUp {
436
+ from, 60%, 75%, 90%, to {
437
+ animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
438
+ }
439
+
440
+ from {
441
+ opacity: 0;
442
+ transform: translate3d(0, 3000px, 0);
443
+ }
444
+
445
+ 60% {
446
+ opacity: 1;
447
+ transform: translate3d(0, -20px, 0);
448
+ }
449
+
450
+ 75% {
451
+ transform: translate3d(0, 10px, 0);
452
+ }
453
+
454
+ 90% {
455
+ transform: translate3d(0, -5px, 0);
456
+ }
457
+
458
+ to {
459
+ transform: translate3d(0, 0, 0);
460
+ }
461
+ }
462
+
463
+ .bounceInUp {
464
+ animation-name: bounceInUp;
465
+ }
466
+
467
+ @keyframes bounceOut {
468
+ 20% {
469
+ transform: scale3d(.9, .9, .9);
470
+ }
471
+
472
+ 50%, 55% {
473
+ opacity: 1;
474
+ transform: scale3d(1.1, 1.1, 1.1);
475
+ }
476
+
477
+ to {
478
+ opacity: 0;
479
+ transform: scale3d(.3, .3, .3);
480
+ }
481
+ }
482
+
483
+ .bounceOut {
484
+ animation-name: bounceOut;
485
+ }
486
+
487
+ @keyframes bounceOutDown {
488
+ 20% {
489
+ transform: translate3d(0, 10px, 0);
490
+ }
491
+
492
+ 40%, 45% {
493
+ opacity: 1;
494
+ transform: translate3d(0, -20px, 0);
495
+ }
496
+
497
+ to {
498
+ opacity: 0;
499
+ transform: translate3d(0, 2000px, 0);
500
+ }
501
+ }
502
+
503
+ .bounceOutDown {
504
+ animation-name: bounceOutDown;
505
+ }
506
+
507
+ @keyframes bounceOutLeft {
508
+ 20% {
509
+ opacity: 1;
510
+ transform: translate3d(20px, 0, 0);
511
+ }
512
+
513
+ to {
514
+ opacity: 0;
515
+ transform: translate3d(-2000px, 0, 0);
516
+ }
517
+ }
518
+
519
+ .bounceOutLeft {
520
+ animation-name: bounceOutLeft;
521
+ }
522
+
523
+ @keyframes bounceOutRight {
524
+ 20% {
525
+ opacity: 1;
526
+ transform: translate3d(-20px, 0, 0);
527
+ }
528
+
529
+ to {
530
+ opacity: 0;
531
+ transform: translate3d(2000px, 0, 0);
532
+ }
533
+ }
534
+
535
+ .bounceOutRight {
536
+ animation-name: bounceOutRight;
537
+ }
538
+
539
+ @keyframes bounceOutUp {
540
+ 20% {
541
+ transform: translate3d(0, -10px, 0);
542
+ }
543
+
544
+ 40%, 45% {
545
+ opacity: 1;
546
+ transform: translate3d(0, 20px, 0);
547
+ }
548
+
549
+ to {
550
+ opacity: 0;
551
+ transform: translate3d(0, -2000px, 0);
552
+ }
553
+ }
554
+
555
+ .bounceOutUp {
556
+ animation-name: bounceOutUp;
557
+ }
558
+
559
+ @keyframes fadeIn {
560
+ from {
561
+ opacity: 0;
562
+ }
563
+
564
+ to {
565
+ opacity: 1;
566
+ }
567
+ }
568
+
569
+ .fadeIn {
570
+ animation-name: fadeIn;
571
+ }
572
+
573
+ @keyframes fadeInDown {
574
+ from {
575
+ opacity: 0;
576
+ transform: translate3d(0, -100%, 0);
577
+ }
578
+
579
+ to {
580
+ opacity: 1;
581
+ transform: none;
582
+ }
583
+ }
584
+
585
+ .fadeInDown {
586
+ animation-name: fadeInDown;
587
+ }
588
+
589
+ @keyframes fadeInDownBig {
590
+ from {
591
+ opacity: 0;
592
+ transform: translate3d(0, -2000px, 0);
593
+ }
594
+
595
+ to {
596
+ opacity: 1;
597
+ transform: none;
598
+ }
599
+ }
600
+
601
+ .fadeInDownBig {
602
+ animation-name: fadeInDownBig;
603
+ }
604
+
605
+ @keyframes fadeInLeft {
606
+ from {
607
+ opacity: 0;
608
+ transform: translate3d(-100%, 0, 0);
609
+ }
610
+
611
+ to {
612
+ opacity: 1;
613
+ transform: none;
614
+ }
615
+ }
616
+
617
+ .fadeInLeft {
618
+ animation-name: fadeInLeft;
619
+ }
620
+
621
+ @keyframes fadeInLeftBig {
622
+ from {
623
+ opacity: 0;
624
+ transform: translate3d(-2000px, 0, 0);
625
+ }
626
+
627
+ to {
628
+ opacity: 1;
629
+ transform: none;
630
+ }
631
+ }
632
+
633
+ .fadeInLeftBig {
634
+ animation-name: fadeInLeftBig;
635
+ }
636
+
637
+ @keyframes fadeInRight {
638
+ from {
639
+ opacity: 0;
640
+ transform: translate3d(100%, 0, 0);
641
+ }
642
+
643
+ to {
644
+ opacity: 1;
645
+ transform: none;
646
+ }
647
+ }
648
+
649
+ .fadeInRight {
650
+ animation-name: fadeInRight;
651
+ }
652
+
653
+ @keyframes fadeInRightBig {
654
+ from {
655
+ opacity: 0;
656
+ transform: translate3d(2000px, 0, 0);
657
+ }
658
+
659
+ to {
660
+ opacity: 1;
661
+ transform: none;
662
+ }
663
+ }
664
+
665
+ .fadeInRightBig {
666
+ animation-name: fadeInRightBig;
667
+ }
668
+
669
+ @keyframes fadeInUp {
670
+ from {
671
+ opacity: 0;
672
+ transform: translate3d(0, 100%, 0);
673
+ }
674
+
675
+ to {
676
+ opacity: 1;
677
+ transform: none;
678
+ }
679
+ }
680
+
681
+ .fadeInUp {
682
+ animation-name: fadeInUp;
683
+ }
684
+
685
+ @keyframes fadeInUpBig {
686
+ from {
687
+ opacity: 0;
688
+ transform: translate3d(0, 2000px, 0);
689
+ }
690
+
691
+ to {
692
+ opacity: 1;
693
+ transform: none;
694
+ }
695
+ }
696
+
697
+ .fadeInUpBig {
698
+ animation-name: fadeInUpBig;
699
+ }
700
+
701
+ @keyframes fadeOut {
702
+ from {
703
+ opacity: 1;
704
+ }
705
+
706
+ to {
707
+ opacity: 0;
708
+ }
709
+ }
710
+
711
+ .fadeOut {
712
+ animation-name: fadeOut;
713
+ }
714
+
715
+ @keyframes fadeOutDown {
716
+ from {
717
+ opacity: 1;
718
+ }
719
+
720
+ to {
721
+ opacity: 0;
722
+ transform: translate3d(0, 100%, 0);
723
+ }
724
+ }
725
+
726
+ .fadeOutDown {
727
+ animation-name: fadeOutDown;
728
+ }
729
+
730
+ @keyframes fadeOutDownBig {
731
+ from {
732
+ opacity: 1;
733
+ }
734
+
735
+ to {
736
+ opacity: 0;
737
+ transform: translate3d(0, 2000px, 0);
738
+ }
739
+ }
740
+
741
+ .fadeOutDownBig {
742
+ animation-name: fadeOutDownBig;
743
+ }
744
+
745
+ @keyframes fadeOutLeft {
746
+ from {
747
+ opacity: 1;
748
+ }
749
+
750
+ to {
751
+ opacity: 0;
752
+ transform: translate3d(-100%, 0, 0);
753
+ }
754
+ }
755
+
756
+ .fadeOutLeft {
757
+ animation-name: fadeOutLeft;
758
+ }
759
+
760
+ @keyframes fadeOutLeftBig {
761
+ from {
762
+ opacity: 1;
763
+ }
764
+
765
+ to {
766
+ opacity: 0;
767
+ transform: translate3d(-2000px, 0, 0);
768
+ }
769
+ }
770
+
771
+ .fadeOutLeftBig {
772
+ animation-name: fadeOutLeftBig;
773
+ }
774
+
775
+ @keyframes fadeOutRight {
776
+ from {
777
+ opacity: 1;
778
+ }
779
+
780
+ to {
781
+ opacity: 0;
782
+ transform: translate3d(100%, 0, 0);
783
+ }
784
+ }
785
+
786
+ .fadeOutRight {
787
+ animation-name: fadeOutRight;
788
+ }
789
+
790
+ @keyframes fadeOutRightBig {
791
+ from {
792
+ opacity: 1;
793
+ }
794
+
795
+ to {
796
+ opacity: 0;
797
+ transform: translate3d(2000px, 0, 0);
798
+ }
799
+ }
800
+
801
+ .fadeOutRightBig {
802
+ animation-name: fadeOutRightBig;
803
+ }
804
+
805
+ @keyframes fadeOutUp {
806
+ from {
807
+ opacity: 1;
808
+ }
809
+
810
+ to {
811
+ opacity: 0;
812
+ transform: translate3d(0, -100%, 0);
813
+ }
814
+ }
815
+
816
+ .fadeOutUp {
817
+ animation-name: fadeOutUp;
818
+ }
819
+
820
+ @keyframes fadeOutUpBig {
821
+ from {
822
+ opacity: 1;
823
+ }
824
+
825
+ to {
826
+ opacity: 0;
827
+ transform: translate3d(0, -2000px, 0);
828
+ }
829
+ }
830
+
831
+ .fadeOutUpBig {
832
+ animation-name: fadeOutUpBig;
833
+ }
834
+
835
+ @keyframes flip {
836
+ from {
837
+ transform: perspective(400px) rotate3d(0, 1, 0, -360deg);
838
+ animation-timing-function: ease-out;
839
+ }
840
+
841
+ 40% {
842
+ transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg);
843
+ animation-timing-function: ease-out;
844
+ }
845
+
846
+ 50% {
847
+ transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg);
848
+ animation-timing-function: ease-in;
849
+ }
850
+
851
+ 80% {
852
+ transform: perspective(400px) scale3d(.95, .95, .95);
853
+ animation-timing-function: ease-in;
854
+ }
855
+
856
+ to {
857
+ transform: perspective(400px);
858
+ animation-timing-function: ease-in;
859
+ }
860
+ }
861
+
862
+ .animated.flip {
863
+ -webkit-backface-visibility: visible;
864
+ backface-visibility: visible;
865
+ animation-name: flip;
866
+ }
867
+
868
+ @keyframes flipInX {
869
+ from {
870
+ transform: perspective(400px) rotate3d(1, 0, 0, 90deg);
871
+ animation-timing-function: ease-in;
872
+ opacity: 0;
873
+ }
874
+
875
+ 40% {
876
+ transform: perspective(400px) rotate3d(1, 0, 0, -20deg);
877
+ animation-timing-function: ease-in;
878
+ }
879
+
880
+ 60% {
881
+ transform: perspective(400px) rotate3d(1, 0, 0, 10deg);
882
+ opacity: 1;
883
+ }
884
+
885
+ 80% {
886
+ transform: perspective(400px) rotate3d(1, 0, 0, -5deg);
887
+ }
888
+
889
+ to {
890
+ transform: perspective(400px);
891
+ }
892
+ }
893
+
894
+ .flipInX {
895
+ -webkit-backface-visibility: visible !important;
896
+ backface-visibility: visible !important;
897
+ animation-name: flipInX;
898
+ }
899
+
900
+ @keyframes flipInY {
901
+ from {
902
+ transform: perspective(400px) rotate3d(0, 1, 0, 90deg);
903
+ animation-timing-function: ease-in;
904
+ opacity: 0;
905
+ }
906
+
907
+ 40% {
908
+ transform: perspective(400px) rotate3d(0, 1, 0, -20deg);
909
+ animation-timing-function: ease-in;
910
+ }
911
+
912
+ 60% {
913
+ transform: perspective(400px) rotate3d(0, 1, 0, 10deg);
914
+ opacity: 1;
915
+ }
916
+
917
+ 80% {
918
+ transform: perspective(400px) rotate3d(0, 1, 0, -5deg);
919
+ }
920
+
921
+ to {
922
+ transform: perspective(400px);
923
+ }
924
+ }
925
+
926
+ .flipInY {
927
+ -webkit-backface-visibility: visible !important;
928
+ backface-visibility: visible !important;
929
+ animation-name: flipInY;
930
+ }
931
+
932
+ @keyframes flipOutX {
933
+ from {
934
+ transform: perspective(400px);
935
+ }
936
+
937
+ 30% {
938
+ transform: perspective(400px) rotate3d(1, 0, 0, -20deg);
939
+ opacity: 1;
940
+ }
941
+
942
+ to {
943
+ transform: perspective(400px) rotate3d(1, 0, 0, 90deg);
944
+ opacity: 0;
945
+ }
946
+ }
947
+
948
+ .flipOutX {
949
+ animation-name: flipOutX;
950
+ -webkit-backface-visibility: visible !important;
951
+ backface-visibility: visible !important;
952
+ }
953
+
954
+ @keyframes flipOutY {
955
+ from {
956
+ transform: perspective(400px);
957
+ }
958
+
959
+ 30% {
960
+ transform: perspective(400px) rotate3d(0, 1, 0, -15deg);
961
+ opacity: 1;
962
+ }
963
+
964
+ to {
965
+ transform: perspective(400px) rotate3d(0, 1, 0, 90deg);
966
+ opacity: 0;
967
+ }
968
+ }
969
+
970
+ .flipOutY {
971
+ -webkit-backface-visibility: visible !important;
972
+ backface-visibility: visible !important;
973
+ animation-name: flipOutY;
974
+ }
975
+
976
+ @keyframes lightSpeedIn {
977
+ from {
978
+ transform: translate3d(100%, 0, 0) skewX(-30deg);
979
+ opacity: 0;
980
+ }
981
+
982
+ 60% {
983
+ transform: skewX(20deg);
984
+ opacity: 1;
985
+ }
986
+
987
+ 80% {
988
+ transform: skewX(-5deg);
989
+ opacity: 1;
990
+ }
991
+
992
+ to {
993
+ transform: none;
994
+ opacity: 1;
995
+ }
996
+ }
997
+
998
+ .lightSpeedIn {
999
+ animation-name: lightSpeedIn;
1000
+ animation-timing-function: ease-out;
1001
+ }
1002
+
1003
+ @keyframes lightSpeedOut {
1004
+ from {
1005
+ opacity: 1;
1006
+ }
1007
+
1008
+ to {
1009
+ transform: translate3d(100%, 0, 0) skewX(30deg);
1010
+ opacity: 0;
1011
+ }
1012
+ }
1013
+
1014
+ .lightSpeedOut {
1015
+ animation-name: lightSpeedOut;
1016
+ animation-timing-function: ease-in;
1017
+ }
1018
+
1019
+ @keyframes rotateIn {
1020
+ from {
1021
+ transform-origin: center;
1022
+ transform: rotate3d(0, 0, 1, -200deg);
1023
+ opacity: 0;
1024
+ }
1025
+
1026
+ to {
1027
+ transform-origin: center;
1028
+ transform: none;
1029
+ opacity: 1;
1030
+ }
1031
+ }
1032
+
1033
+ .rotateIn {
1034
+ animation-name: rotateIn;
1035
+ }
1036
+
1037
+ @keyframes rotateInDownLeft {
1038
+ from {
1039
+ transform-origin: left bottom;
1040
+ transform: rotate3d(0, 0, 1, -45deg);
1041
+ opacity: 0;
1042
+ }
1043
+
1044
+ to {
1045
+ transform-origin: left bottom;
1046
+ transform: none;
1047
+ opacity: 1;
1048
+ }
1049
+ }
1050
+
1051
+ .rotateInDownLeft {
1052
+ animation-name: rotateInDownLeft;
1053
+ }
1054
+
1055
+ @keyframes rotateInDownRight {
1056
+ from {
1057
+ transform-origin: right bottom;
1058
+ transform: rotate3d(0, 0, 1, 45deg);
1059
+ opacity: 0;
1060
+ }
1061
+
1062
+ to {
1063
+ transform-origin: right bottom;
1064
+ transform: none;
1065
+ opacity: 1;
1066
+ }
1067
+ }
1068
+
1069
+ .rotateInDownRight {
1070
+ animation-name: rotateInDownRight;
1071
+ }
1072
+
1073
+ @keyframes rotateInUpLeft {
1074
+ from {
1075
+ transform-origin: left bottom;
1076
+ transform: rotate3d(0, 0, 1, 45deg);
1077
+ opacity: 0;
1078
+ }
1079
+
1080
+ to {
1081
+ transform-origin: left bottom;
1082
+ transform: none;
1083
+ opacity: 1;
1084
+ }
1085
+ }
1086
+
1087
+ .rotateInUpLeft {
1088
+ animation-name: rotateInUpLeft;
1089
+ }
1090
+
1091
+ @keyframes rotateInUpRight {
1092
+ from {
1093
+ transform-origin: right bottom;
1094
+ transform: rotate3d(0, 0, 1, -90deg);
1095
+ opacity: 0;
1096
+ }
1097
+
1098
+ to {
1099
+ transform-origin: right bottom;
1100
+ transform: none;
1101
+ opacity: 1;
1102
+ }
1103
+ }
1104
+
1105
+ .rotateInUpRight {
1106
+ animation-name: rotateInUpRight;
1107
+ }
1108
+
1109
+ @keyframes rotateOut {
1110
+ from {
1111
+ transform-origin: center;
1112
+ opacity: 1;
1113
+ }
1114
+
1115
+ to {
1116
+ transform-origin: center;
1117
+ transform: rotate3d(0, 0, 1, 200deg);
1118
+ opacity: 0;
1119
+ }
1120
+ }
1121
+
1122
+ .rotateOut {
1123
+ animation-name: rotateOut;
1124
+ }
1125
+
1126
+ @keyframes rotateOutDownLeft {
1127
+ from {
1128
+ transform-origin: left bottom;
1129
+ opacity: 1;
1130
+ }
1131
+
1132
+ to {
1133
+ transform-origin: left bottom;
1134
+ transform: rotate3d(0, 0, 1, 45deg);
1135
+ opacity: 0;
1136
+ }
1137
+ }
1138
+
1139
+ .rotateOutDownLeft {
1140
+ animation-name: rotateOutDownLeft;
1141
+ }
1142
+
1143
+ @keyframes rotateOutDownRight {
1144
+ from {
1145
+ transform-origin: right bottom;
1146
+ opacity: 1;
1147
+ }
1148
+
1149
+ to {
1150
+ transform-origin: right bottom;
1151
+ transform: rotate3d(0, 0, 1, -45deg);
1152
+ opacity: 0;
1153
+ }
1154
+ }
1155
+
1156
+ .rotateOutDownRight {
1157
+ animation-name: rotateOutDownRight;
1158
+ }
1159
+
1160
+ @keyframes rotateOutUpLeft {
1161
+ from {
1162
+ transform-origin: left bottom;
1163
+ opacity: 1;
1164
+ }
1165
+
1166
+ to {
1167
+ transform-origin: left bottom;
1168
+ transform: rotate3d(0, 0, 1, -45deg);
1169
+ opacity: 0;
1170
+ }
1171
+ }
1172
+
1173
+ .rotateOutUpLeft {
1174
+ animation-name: rotateOutUpLeft;
1175
+ }
1176
+
1177
+ @keyframes rotateOutUpRight {
1178
+ from {
1179
+ transform-origin: right bottom;
1180
+ opacity: 1;
1181
+ }
1182
+
1183
+ to {
1184
+ transform-origin: right bottom;
1185
+ transform: rotate3d(0, 0, 1, 90deg);
1186
+ opacity: 0;
1187
+ }
1188
+ }
1189
+
1190
+ .rotateOutUpRight {
1191
+ animation-name: rotateOutUpRight;
1192
+ }
1193
+
1194
+ @keyframes hinge {
1195
+ 0% {
1196
+ transform-origin: top left;
1197
+ animation-timing-function: ease-in-out;
1198
+ }
1199
+
1200
+ 20%, 60% {
1201
+ transform: rotate3d(0, 0, 1, 80deg);
1202
+ transform-origin: top left;
1203
+ animation-timing-function: ease-in-out;
1204
+ }
1205
+
1206
+ 40%, 80% {
1207
+ transform: rotate3d(0, 0, 1, 60deg);
1208
+ transform-origin: top left;
1209
+ animation-timing-function: ease-in-out;
1210
+ opacity: 1;
1211
+ }
1212
+
1213
+ to {
1214
+ transform: translate3d(0, 700px, 0);
1215
+ opacity: 0;
1216
+ }
1217
+ }
1218
+
1219
+ .hinge {
1220
+ animation-name: hinge;
1221
+ }
1222
+
1223
+ @keyframes jackInTheBox {
1224
+ from {
1225
+ opacity: 0;
1226
+ transform: scale(0.1) rotate(30deg);
1227
+ transform-origin: center bottom;
1228
+ }
1229
+
1230
+ 50% {
1231
+ transform: rotate(-10deg);
1232
+ }
1233
+
1234
+ 70% {
1235
+ transform: rotate(3deg);
1236
+ }
1237
+
1238
+ to {
1239
+ opacity: 1;
1240
+ transform: scale(1);
1241
+ }
1242
+ }
1243
+
1244
+ .jackInTheBox {
1245
+ animation-name: jackInTheBox;
1246
+ }
1247
+
1248
+ /* originally authored by Nick Pettit - https://github.com/nickpettit/glide */
1249
+
1250
+ @keyframes rollIn {
1251
+ from {
1252
+ opacity: 0;
1253
+ transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg);
1254
+ }
1255
+
1256
+ to {
1257
+ opacity: 1;
1258
+ transform: none;
1259
+ }
1260
+ }
1261
+
1262
+ .rollIn {
1263
+ animation-name: rollIn;
1264
+ }
1265
+
1266
+ /* originally authored by Nick Pettit - https://github.com/nickpettit/glide */
1267
+
1268
+ @keyframes rollOut {
1269
+ from {
1270
+ opacity: 1;
1271
+ }
1272
+
1273
+ to {
1274
+ opacity: 0;
1275
+ transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg);
1276
+ }
1277
+ }
1278
+
1279
+ .rollOut {
1280
+ animation-name: rollOut;
1281
+ }
1282
+
1283
+ @keyframes zoomIn {
1284
+ from {
1285
+ opacity: 0;
1286
+ transform: scale3d(.3, .3, .3);
1287
+ }
1288
+
1289
+ 50% {
1290
+ opacity: 1;
1291
+ }
1292
+ }
1293
+
1294
+ .zoomIn {
1295
+ animation-name: zoomIn;
1296
+ }
1297
+
1298
+ @keyframes zoomInDown {
1299
+ from {
1300
+ opacity: 0;
1301
+ transform: scale3d(.1, .1, .1) translate3d(0, -1000px, 0);
1302
+ animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
1303
+ }
1304
+
1305
+ 60% {
1306
+ opacity: 1;
1307
+ transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);
1308
+ animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
1309
+ }
1310
+ }
1311
+
1312
+ .zoomInDown {
1313
+ animation-name: zoomInDown;
1314
+ }
1315
+
1316
+ @keyframes zoomInLeft {
1317
+ from {
1318
+ opacity: 0;
1319
+ transform: scale3d(.1, .1, .1) translate3d(-1000px, 0, 0);
1320
+ animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
1321
+ }
1322
+
1323
+ 60% {
1324
+ opacity: 1;
1325
+ transform: scale3d(.475, .475, .475) translate3d(10px, 0, 0);
1326
+ animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
1327
+ }
1328
+ }
1329
+
1330
+ .zoomInLeft {
1331
+ animation-name: zoomInLeft;
1332
+ }
1333
+
1334
+ @keyframes zoomInRight {
1335
+ from {
1336
+ opacity: 0;
1337
+ transform: scale3d(.1, .1, .1) translate3d(1000px, 0, 0);
1338
+ animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
1339
+ }
1340
+
1341
+ 60% {
1342
+ opacity: 1;
1343
+ transform: scale3d(.475, .475, .475) translate3d(-10px, 0, 0);
1344
+ animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
1345
+ }
1346
+ }
1347
+
1348
+ .zoomInRight {
1349
+ animation-name: zoomInRight;
1350
+ }
1351
+
1352
+ @keyframes zoomInUp {
1353
+ from {
1354
+ opacity: 0;
1355
+ transform: scale3d(.1, .1, .1) translate3d(0, 1000px, 0);
1356
+ animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
1357
+ }
1358
+
1359
+ 60% {
1360
+ opacity: 1;
1361
+ transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);
1362
+ animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
1363
+ }
1364
+ }
1365
+
1366
+ .zoomInUp {
1367
+ animation-name: zoomInUp;
1368
+ }
1369
+
1370
+ @keyframes zoomOut {
1371
+ from {
1372
+ opacity: 1;
1373
+ }
1374
+
1375
+ 50% {
1376
+ opacity: 0;
1377
+ transform: scale3d(.3, .3, .3);
1378
+ }
1379
+
1380
+ to {
1381
+ opacity: 0;
1382
+ }
1383
+ }
1384
+
1385
+ .zoomOut {
1386
+ animation-name: zoomOut;
1387
+ }
1388
+
1389
+ @keyframes zoomOutDown {
1390
+ 40% {
1391
+ opacity: 1;
1392
+ transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);
1393
+ animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
1394
+ }
1395
+
1396
+ to {
1397
+ opacity: 0;
1398
+ transform: scale3d(.1, .1, .1) translate3d(0, 2000px, 0);
1399
+ transform-origin: center bottom;
1400
+ animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
1401
+ }
1402
+ }
1403
+
1404
+ .zoomOutDown {
1405
+ animation-name: zoomOutDown;
1406
+ }
1407
+
1408
+ @keyframes zoomOutLeft {
1409
+ 40% {
1410
+ opacity: 1;
1411
+ transform: scale3d(.475, .475, .475) translate3d(42px, 0, 0);
1412
+ }
1413
+
1414
+ to {
1415
+ opacity: 0;
1416
+ transform: scale(.1) translate3d(-2000px, 0, 0);
1417
+ transform-origin: left center;
1418
+ }
1419
+ }
1420
+
1421
+ .zoomOutLeft {
1422
+ animation-name: zoomOutLeft;
1423
+ }
1424
+
1425
+ @keyframes zoomOutRight {
1426
+ 40% {
1427
+ opacity: 1;
1428
+ transform: scale3d(.475, .475, .475) translate3d(-42px, 0, 0);
1429
+ }
1430
+
1431
+ to {
1432
+ opacity: 0;
1433
+ transform: scale(.1) translate3d(2000px, 0, 0);
1434
+ transform-origin: right center;
1435
+ }
1436
+ }
1437
+
1438
+ .zoomOutRight {
1439
+ animation-name: zoomOutRight;
1440
+ }
1441
+
1442
+ @keyframes zoomOutUp {
1443
+ 40% {
1444
+ opacity: 1;
1445
+ transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);
1446
+ animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190);
1447
+ }
1448
+
1449
+ to {
1450
+ opacity: 0;
1451
+ transform: scale3d(.1, .1, .1) translate3d(0, -2000px, 0);
1452
+ transform-origin: center bottom;
1453
+ animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1);
1454
+ }
1455
+ }
1456
+
1457
+ .zoomOutUp {
1458
+ animation-name: zoomOutUp;
1459
+ }
1460
+
1461
+ @keyframes slideInDown {
1462
+ from {
1463
+ transform: translate3d(0, -100%, 0);
1464
+ visibility: visible;
1465
+ }
1466
+
1467
+ to {
1468
+ transform: translate3d(0, 0, 0);
1469
+ }
1470
+ }
1471
+
1472
+ .slideInDown {
1473
+ animation-name: slideInDown;
1474
+ }
1475
+
1476
+ @keyframes slideInLeft {
1477
+ from {
1478
+ transform: translate3d(-100%, 0, 0);
1479
+ visibility: visible;
1480
+ }
1481
+
1482
+ to {
1483
+ transform: translate3d(0, 0, 0);
1484
+ }
1485
+ }
1486
+
1487
+ .slideInLeft {
1488
+ animation-name: slideInLeft;
1489
+ }
1490
+
1491
+ @keyframes slideInRight {
1492
+ from {
1493
+ transform: translate3d(100%, 0, 0);
1494
+ visibility: visible;
1495
+ }
1496
+
1497
+ to {
1498
+ transform: translate3d(0, 0, 0);
1499
+ }
1500
+ }
1501
+
1502
+ .slideInRight {
1503
+ animation-name: slideInRight;
1504
+ }
1505
+
1506
+ @keyframes slideInUp {
1507
+ from {
1508
+ transform: translate3d(0, 100%, 0);
1509
+ visibility: visible;
1510
+ }
1511
+
1512
+ to {
1513
+ transform: translate3d(0, 0, 0);
1514
+ }
1515
+ }
1516
+
1517
+ .slideInUp {
1518
+ animation-name: slideInUp;
1519
+ }
1520
+
1521
+ @keyframes slideOutDown {
1522
+ from {
1523
+ transform: translate3d(0, 0, 0);
1524
+ }
1525
+
1526
+ to {
1527
+ visibility: hidden;
1528
+ transform: translate3d(0, 100%, 0);
1529
+ }
1530
+ }
1531
+
1532
+ .slideOutDown {
1533
+ animation-name: slideOutDown;
1534
+ }
1535
+
1536
+ @keyframes slideOutLeft {
1537
+ from {
1538
+ transform: translate3d(0, 0, 0);
1539
+ }
1540
+
1541
+ to {
1542
+ visibility: hidden;
1543
+ transform: translate3d(-100%, 0, 0);
1544
+ }
1545
+ }
1546
+
1547
+ .slideOutLeft {
1548
+ animation-name: slideOutLeft;
1549
+ }
1550
+
1551
+ @keyframes slideOutRight {
1552
+ from {
1553
+ transform: translate3d(0, 0, 0);
1554
+ }
1555
+
1556
+ to {
1557
+ visibility: hidden;
1558
+ transform: translate3d(100%, 0, 0);
1559
+ }
1560
+ }
1561
+
1562
+ .slideOutRight {
1563
+ animation-name: slideOutRight;
1564
+ }
1565
+
1566
+ @keyframes slideOutUp {
1567
+ from {
1568
+ transform: translate3d(0, 0, 0);
1569
+ }
1570
+
1571
+ to {
1572
+ visibility: hidden;
1573
+ transform: translate3d(0, -100%, 0);
1574
+ }
1575
+ }
1576
+
1577
+ .slideOutUp {
1578
+ animation-name: slideOutUp;
1579
+ }
static/lib/animate/animate.min.css ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ @charset "UTF-8";
2
+
3
+ /*!
4
+ * animate.css -http://daneden.me/animate
5
+ * Version - 3.5.2
6
+ * Licensed under the MIT license - http://opensource.org/licenses/MIT
7
+ *
8
+ * Copyright (c) 2017 Daniel Eden
9
+ */
10
+
11
+ .animated{animation-duration:1s;animation-fill-mode:both}.animated.infinite{animation-iteration-count:infinite}.animated.hinge{animation-duration:2s}.animated.bounceIn,.animated.bounceOut,.animated.flipOutX,.animated.flipOutY{animation-duration:.75s}@keyframes bounce{0%,20%,53%,80%,to{animation-timing-function:cubic-bezier(.215,.61,.355,1);transform:translateZ(0)}40%,43%{animation-timing-function:cubic-bezier(.755,.05,.855,.06);transform:translate3d(0,-30px,0)}70%{animation-timing-function:cubic-bezier(.755,.05,.855,.06);transform:translate3d(0,-15px,0)}90%{transform:translate3d(0,-4px,0)}}.bounce{animation-name:bounce;transform-origin:center bottom}@keyframes flash{0%,50%,to{opacity:1}25%,75%{opacity:0}}.flash{animation-name:flash}@keyframes pulse{0%{transform:scaleX(1)}50%{transform:scale3d(1.05,1.05,1.05)}to{transform:scaleX(1)}}.pulse{animation-name:pulse}@keyframes rubberBand{0%{transform:scaleX(1)}30%{transform:scale3d(1.25,.75,1)}40%{transform:scale3d(.75,1.25,1)}50%{transform:scale3d(1.15,.85,1)}65%{transform:scale3d(.95,1.05,1)}75%{transform:scale3d(1.05,.95,1)}to{transform:scaleX(1)}}.rubberBand{animation-name:rubberBand}@keyframes shake{0%,to{transform:translateZ(0)}10%,30%,50%,70%,90%{transform:translate3d(-10px,0,0)}20%,40%,60%,80%{transform:translate3d(10px,0,0)}}.shake{animation-name:shake}@keyframes headShake{0%{transform:translateX(0)}6.5%{transform:translateX(-6px) rotateY(-9deg)}18.5%{transform:translateX(5px) rotateY(7deg)}31.5%{transform:translateX(-3px) rotateY(-5deg)}43.5%{transform:translateX(2px) rotateY(3deg)}50%{transform:translateX(0)}}.headShake{animation-timing-function:ease-in-out;animation-name:headShake}@keyframes swing{20%{transform:rotate(15deg)}40%{transform:rotate(-10deg)}60%{transform:rotate(5deg)}80%{transform:rotate(-5deg)}to{transform:rotate(0deg)}}.swing{transform-origin:top center;animation-name:swing}@keyframes tada{0%{transform:scaleX(1)}10%,20%{transform:scale3d(.9,.9,.9) rotate(-3deg)}30%,50%,70%,90%{transform:scale3d(1.1,1.1,1.1) rotate(3deg)}40%,60%,80%{transform:scale3d(1.1,1.1,1.1) rotate(-3deg)}to{transform:scaleX(1)}}.tada{animation-name:tada}@keyframes wobble{0%{transform:none}15%{transform:translate3d(-25%,0,0) rotate(-5deg)}30%{transform:translate3d(20%,0,0) rotate(3deg)}45%{transform:translate3d(-15%,0,0) rotate(-3deg)}60%{transform:translate3d(10%,0,0) rotate(2deg)}75%{transform:translate3d(-5%,0,0) rotate(-1deg)}to{transform:none}}.wobble{animation-name:wobble}@keyframes jello{0%,11.1%,to{transform:none}22.2%{transform:skewX(-12.5deg) skewY(-12.5deg)}33.3%{transform:skewX(6.25deg) skewY(6.25deg)}44.4%{transform:skewX(-3.125deg) skewY(-3.125deg)}55.5%{transform:skewX(1.5625deg) skewY(1.5625deg)}66.6%{transform:skewX(-.78125deg) skewY(-.78125deg)}77.7%{transform:skewX(.390625deg) skewY(.390625deg)}88.8%{transform:skewX(-.1953125deg) skewY(-.1953125deg)}}.jello{animation-name:jello;transform-origin:center}@keyframes bounceIn{0%,20%,40%,60%,80%,to{animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;transform:scale3d(.3,.3,.3)}20%{transform:scale3d(1.1,1.1,1.1)}40%{transform:scale3d(.9,.9,.9)}60%{opacity:1;transform:scale3d(1.03,1.03,1.03)}80%{transform:scale3d(.97,.97,.97)}to{opacity:1;transform:scaleX(1)}}.bounceIn{animation-name:bounceIn}@keyframes bounceInDown{0%,60%,75%,90%,to{animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;transform:translate3d(0,-3000px,0)}60%{opacity:1;transform:translate3d(0,25px,0)}75%{transform:translate3d(0,-10px,0)}90%{transform:translate3d(0,5px,0)}to{transform:none}}.bounceInDown{animation-name:bounceInDown}@keyframes bounceInLeft{0%,60%,75%,90%,to{animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;transform:translate3d(-3000px,0,0)}60%{opacity:1;transform:translate3d(25px,0,0)}75%{transform:translate3d(-10px,0,0)}90%{transform:translate3d(5px,0,0)}to{transform:none}}.bounceInLeft{animation-name:bounceInLeft}@keyframes bounceInRight{0%,60%,75%,90%,to{animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;transform:translate3d(3000px,0,0)}60%{opacity:1;transform:translate3d(-25px,0,0)}75%{transform:translate3d(10px,0,0)}90%{transform:translate3d(-5px,0,0)}to{transform:none}}.bounceInRight{animation-name:bounceInRight}@keyframes bounceInUp{0%,60%,75%,90%,to{animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;transform:translate3d(0,3000px,0)}60%{opacity:1;transform:translate3d(0,-20px,0)}75%{transform:translate3d(0,10px,0)}90%{transform:translate3d(0,-5px,0)}to{transform:translateZ(0)}}.bounceInUp{animation-name:bounceInUp}@keyframes bounceOut{20%{transform:scale3d(.9,.9,.9)}50%,55%{opacity:1;transform:scale3d(1.1,1.1,1.1)}to{opacity:0;transform:scale3d(.3,.3,.3)}}.bounceOut{animation-name:bounceOut}@keyframes bounceOutDown{20%{transform:translate3d(0,10px,0)}40%,45%{opacity:1;transform:translate3d(0,-20px,0)}to{opacity:0;transform:translate3d(0,2000px,0)}}.bounceOutDown{animation-name:bounceOutDown}@keyframes bounceOutLeft{20%{opacity:1;transform:translate3d(20px,0,0)}to{opacity:0;transform:translate3d(-2000px,0,0)}}.bounceOutLeft{animation-name:bounceOutLeft}@keyframes bounceOutRight{20%{opacity:1;transform:translate3d(-20px,0,0)}to{opacity:0;transform:translate3d(2000px,0,0)}}.bounceOutRight{animation-name:bounceOutRight}@keyframes bounceOutUp{20%{transform:translate3d(0,-10px,0)}40%,45%{opacity:1;transform:translate3d(0,20px,0)}to{opacity:0;transform:translate3d(0,-2000px,0)}}.bounceOutUp{animation-name:bounceOutUp}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}.fadeIn{animation-name:fadeIn}@keyframes fadeInDown{0%{opacity:0;transform:translate3d(0,-100%,0)}to{opacity:1;transform:none}}.fadeInDown{animation-name:fadeInDown}@keyframes fadeInDownBig{0%{opacity:0;transform:translate3d(0,-2000px,0)}to{opacity:1;transform:none}}.fadeInDownBig{animation-name:fadeInDownBig}@keyframes fadeInLeft{0%{opacity:0;transform:translate3d(-100%,0,0)}to{opacity:1;transform:none}}.fadeInLeft{animation-name:fadeInLeft}@keyframes fadeInLeftBig{0%{opacity:0;transform:translate3d(-2000px,0,0)}to{opacity:1;transform:none}}.fadeInLeftBig{animation-name:fadeInLeftBig}@keyframes fadeInRight{0%{opacity:0;transform:translate3d(100%,0,0)}to{opacity:1;transform:none}}.fadeInRight{animation-name:fadeInRight}@keyframes fadeInRightBig{0%{opacity:0;transform:translate3d(2000px,0,0)}to{opacity:1;transform:none}}.fadeInRightBig{animation-name:fadeInRightBig}@keyframes fadeInUp{0%{opacity:0;transform:translate3d(0,100%,0)}to{opacity:1;transform:none}}.fadeInUp{animation-name:fadeInUp}@keyframes fadeInUpBig{0%{opacity:0;transform:translate3d(0,2000px,0)}to{opacity:1;transform:none}}.fadeInUpBig{animation-name:fadeInUpBig}@keyframes fadeOut{0%{opacity:1}to{opacity:0}}.fadeOut{animation-name:fadeOut}@keyframes fadeOutDown{0%{opacity:1}to{opacity:0;transform:translate3d(0,100%,0)}}.fadeOutDown{animation-name:fadeOutDown}@keyframes fadeOutDownBig{0%{opacity:1}to{opacity:0;transform:translate3d(0,2000px,0)}}.fadeOutDownBig{animation-name:fadeOutDownBig}@keyframes fadeOutLeft{0%{opacity:1}to{opacity:0;transform:translate3d(-100%,0,0)}}.fadeOutLeft{animation-name:fadeOutLeft}@keyframes fadeOutLeftBig{0%{opacity:1}to{opacity:0;transform:translate3d(-2000px,0,0)}}.fadeOutLeftBig{animation-name:fadeOutLeftBig}@keyframes fadeOutRight{0%{opacity:1}to{opacity:0;transform:translate3d(100%,0,0)}}.fadeOutRight{animation-name:fadeOutRight}@keyframes fadeOutRightBig{0%{opacity:1}to{opacity:0;transform:translate3d(2000px,0,0)}}.fadeOutRightBig{animation-name:fadeOutRightBig}@keyframes fadeOutUp{0%{opacity:1}to{opacity:0;transform:translate3d(0,-100%,0)}}.fadeOutUp{animation-name:fadeOutUp}@keyframes fadeOutUpBig{0%{opacity:1}to{opacity:0;transform:translate3d(0,-2000px,0)}}.fadeOutUpBig{animation-name:fadeOutUpBig}@keyframes flip{0%{transform:perspective(400px) rotateY(-1turn);animation-timing-function:ease-out}40%{transform:perspective(400px) translateZ(150px) rotateY(-190deg);animation-timing-function:ease-out}50%{transform:perspective(400px) translateZ(150px) rotateY(-170deg);animation-timing-function:ease-in}80%{transform:perspective(400px) scale3d(.95,.95,.95);animation-timing-function:ease-in}to{transform:perspective(400px);animation-timing-function:ease-in}}.animated.flip{-webkit-backface-visibility:visible;backface-visibility:visible;animation-name:flip}@keyframes flipInX{0%{transform:perspective(400px) rotateX(90deg);animation-timing-function:ease-in;opacity:0}40%{transform:perspective(400px) rotateX(-20deg);animation-timing-function:ease-in}60%{transform:perspective(400px) rotateX(10deg);opacity:1}80%{transform:perspective(400px) rotateX(-5deg)}to{transform:perspective(400px)}}.flipInX{-webkit-backface-visibility:visible!important;backface-visibility:visible!important;animation-name:flipInX}@keyframes flipInY{0%{transform:perspective(400px) rotateY(90deg);animation-timing-function:ease-in;opacity:0}40%{transform:perspective(400px) rotateY(-20deg);animation-timing-function:ease-in}60%{transform:perspective(400px) rotateY(10deg);opacity:1}80%{transform:perspective(400px) rotateY(-5deg)}to{transform:perspective(400px)}}.flipInY{-webkit-backface-visibility:visible!important;backface-visibility:visible!important;animation-name:flipInY}@keyframes flipOutX{0%{transform:perspective(400px)}30%{transform:perspective(400px) rotateX(-20deg);opacity:1}to{transform:perspective(400px) rotateX(90deg);opacity:0}}.flipOutX{animation-name:flipOutX;-webkit-backface-visibility:visible!important;backface-visibility:visible!important}@keyframes flipOutY{0%{transform:perspective(400px)}30%{transform:perspective(400px) rotateY(-15deg);opacity:1}to{transform:perspective(400px) rotateY(90deg);opacity:0}}.flipOutY{-webkit-backface-visibility:visible!important;backface-visibility:visible!important;animation-name:flipOutY}@keyframes lightSpeedIn{0%{transform:translate3d(100%,0,0) skewX(-30deg);opacity:0}60%{transform:skewX(20deg);opacity:1}80%{transform:skewX(-5deg);opacity:1}to{transform:none;opacity:1}}.lightSpeedIn{animation-name:lightSpeedIn;animation-timing-function:ease-out}@keyframes lightSpeedOut{0%{opacity:1}to{transform:translate3d(100%,0,0) skewX(30deg);opacity:0}}.lightSpeedOut{animation-name:lightSpeedOut;animation-timing-function:ease-in}@keyframes rotateIn{0%{transform-origin:center;transform:rotate(-200deg);opacity:0}to{transform-origin:center;transform:none;opacity:1}}.rotateIn{animation-name:rotateIn}@keyframes rotateInDownLeft{0%{transform-origin:left bottom;transform:rotate(-45deg);opacity:0}to{transform-origin:left bottom;transform:none;opacity:1}}.rotateInDownLeft{animation-name:rotateInDownLeft}@keyframes rotateInDownRight{0%{transform-origin:right bottom;transform:rotate(45deg);opacity:0}to{transform-origin:right bottom;transform:none;opacity:1}}.rotateInDownRight{animation-name:rotateInDownRight}@keyframes rotateInUpLeft{0%{transform-origin:left bottom;transform:rotate(45deg);opacity:0}to{transform-origin:left bottom;transform:none;opacity:1}}.rotateInUpLeft{animation-name:rotateInUpLeft}@keyframes rotateInUpRight{0%{transform-origin:right bottom;transform:rotate(-90deg);opacity:0}to{transform-origin:right bottom;transform:none;opacity:1}}.rotateInUpRight{animation-name:rotateInUpRight}@keyframes rotateOut{0%{transform-origin:center;opacity:1}to{transform-origin:center;transform:rotate(200deg);opacity:0}}.rotateOut{animation-name:rotateOut}@keyframes rotateOutDownLeft{0%{transform-origin:left bottom;opacity:1}to{transform-origin:left bottom;transform:rotate(45deg);opacity:0}}.rotateOutDownLeft{animation-name:rotateOutDownLeft}@keyframes rotateOutDownRight{0%{transform-origin:right bottom;opacity:1}to{transform-origin:right bottom;transform:rotate(-45deg);opacity:0}}.rotateOutDownRight{animation-name:rotateOutDownRight}@keyframes rotateOutUpLeft{0%{transform-origin:left bottom;opacity:1}to{transform-origin:left bottom;transform:rotate(-45deg);opacity:0}}.rotateOutUpLeft{animation-name:rotateOutUpLeft}@keyframes rotateOutUpRight{0%{transform-origin:right bottom;opacity:1}to{transform-origin:right bottom;transform:rotate(90deg);opacity:0}}.rotateOutUpRight{animation-name:rotateOutUpRight}@keyframes hinge{0%{transform-origin:top left;animation-timing-function:ease-in-out}20%,60%{transform:rotate(80deg);transform-origin:top left;animation-timing-function:ease-in-out}40%,80%{transform:rotate(60deg);transform-origin:top left;animation-timing-function:ease-in-out;opacity:1}to{transform:translate3d(0,700px,0);opacity:0}}.hinge{animation-name:hinge}@keyframes jackInTheBox{0%{opacity:0;transform:scale(.1) rotate(30deg);transform-origin:center bottom}50%{transform:rotate(-10deg)}70%{transform:rotate(3deg)}to{opacity:1;transform:scale(1)}}.jackInTheBox{animation-name:jackInTheBox}@keyframes rollIn{0%{opacity:0;transform:translate3d(-100%,0,0) rotate(-120deg)}to{opacity:1;transform:none}}.rollIn{animation-name:rollIn}@keyframes rollOut{0%{opacity:1}to{opacity:0;transform:translate3d(100%,0,0) rotate(120deg)}}.rollOut{animation-name:rollOut}@keyframes zoomIn{0%{opacity:0;transform:scale3d(.3,.3,.3)}50%{opacity:1}}.zoomIn{animation-name:zoomIn}@keyframes zoomInDown{0%{opacity:0;transform:scale3d(.1,.1,.1) translate3d(0,-1000px,0);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}60%{opacity:1;transform:scale3d(.475,.475,.475) translate3d(0,60px,0);animation-timing-function:cubic-bezier(.175,.885,.32,1)}}.zoomInDown{animation-name:zoomInDown}@keyframes zoomInLeft{0%{opacity:0;transform:scale3d(.1,.1,.1) translate3d(-1000px,0,0);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}60%{opacity:1;transform:scale3d(.475,.475,.475) translate3d(10px,0,0);animation-timing-function:cubic-bezier(.175,.885,.32,1)}}.zoomInLeft{animation-name:zoomInLeft}@keyframes zoomInRight{0%{opacity:0;transform:scale3d(.1,.1,.1) translate3d(1000px,0,0);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}60%{opacity:1;transform:scale3d(.475,.475,.475) translate3d(-10px,0,0);animation-timing-function:cubic-bezier(.175,.885,.32,1)}}.zoomInRight{animation-name:zoomInRight}@keyframes zoomInUp{0%{opacity:0;transform:scale3d(.1,.1,.1) translate3d(0,1000px,0);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}60%{opacity:1;transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);animation-timing-function:cubic-bezier(.175,.885,.32,1)}}.zoomInUp{animation-name:zoomInUp}@keyframes zoomOut{0%{opacity:1}50%{opacity:0;transform:scale3d(.3,.3,.3)}to{opacity:0}}.zoomOut{animation-name:zoomOut}@keyframes zoomOutDown{40%{opacity:1;transform:scale3d(.475,.475,.475) translate3d(0,-60px,0);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}to{opacity:0;transform:scale3d(.1,.1,.1) translate3d(0,2000px,0);transform-origin:center bottom;animation-timing-function:cubic-bezier(.175,.885,.32,1)}}.zoomOutDown{animation-name:zoomOutDown}@keyframes zoomOutLeft{40%{opacity:1;transform:scale3d(.475,.475,.475) translate3d(42px,0,0)}to{opacity:0;transform:scale(.1) translate3d(-2000px,0,0);transform-origin:left center}}.zoomOutLeft{animation-name:zoomOutLeft}@keyframes zoomOutRight{40%{opacity:1;transform:scale3d(.475,.475,.475) translate3d(-42px,0,0)}to{opacity:0;transform:scale(.1) translate3d(2000px,0,0);transform-origin:right center}}.zoomOutRight{animation-name:zoomOutRight}@keyframes zoomOutUp{40%{opacity:1;transform:scale3d(.475,.475,.475) translate3d(0,60px,0);animation-timing-function:cubic-bezier(.55,.055,.675,.19)}to{opacity:0;transform:scale3d(.1,.1,.1) translate3d(0,-2000px,0);transform-origin:center bottom;animation-timing-function:cubic-bezier(.175,.885,.32,1)}}.zoomOutUp{animation-name:zoomOutUp}@keyframes slideInDown{0%{transform:translate3d(0,-100%,0);visibility:visible}to{transform:translateZ(0)}}.slideInDown{animation-name:slideInDown}@keyframes slideInLeft{0%{transform:translate3d(-100%,0,0);visibility:visible}to{transform:translateZ(0)}}.slideInLeft{animation-name:slideInLeft}@keyframes slideInRight{0%{transform:translate3d(100%,0,0);visibility:visible}to{transform:translateZ(0)}}.slideInRight{animation-name:slideInRight}@keyframes slideInUp{0%{transform:translate3d(0,100%,0);visibility:visible}to{transform:translateZ(0)}}.slideInUp{animation-name:slideInUp}@keyframes slideOutDown{0%{transform:translateZ(0)}to{visibility:hidden;transform:translate3d(0,100%,0)}}.slideOutDown{animation-name:slideOutDown}@keyframes slideOutLeft{0%{transform:translateZ(0)}to{visibility:hidden;transform:translate3d(-100%,0,0)}}.slideOutLeft{animation-name:slideOutLeft}@keyframes slideOutRight{0%{transform:translateZ(0)}to{visibility:hidden;transform:translate3d(100%,0,0)}}.slideOutRight{animation-name:slideOutRight}@keyframes slideOutUp{0%{transform:translateZ(0)}to{visibility:hidden;transform:translate3d(0,-100%,0)}}.slideOutUp{animation-name:slideOutUp}
static/lib/counterup/counterup.min.js ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*!
2
+ * jquery.counterup.js 2.1.0
3
+ *
4
+ * Copyright 2013, Benjamin Intal http://gambit.ph @bfintal
5
+ * Released under the GPL v2 License
6
+ *
7
+ * Amended by Jeremy Paris, Ciro Mattia Gonano and others
8
+ *
9
+ * Date: Feb 24, 2017
10
+ */
11
+ (function($){"use strict";$.fn.counterUp=function(options){var settings=$.extend({time:400,delay:10,offset:100,beginAt:0,formatter:false,context:"window",callback:function(){}},options),s;return this.each(function(){var $this=$(this),counter={time:$(this).data("counterup-time")||settings.time,delay:$(this).data("counterup-delay")||settings.delay,offset:$(this).data("counterup-offset")||settings.offset,beginAt:$(this).data("counterup-beginat")||settings.beginAt,context:$(this).data("counterup-context")||settings.context};var counterUpper=function(){var nums=[];var divisions=counter.time/counter.delay;var num=$(this).attr("data-num")?$(this).attr("data-num"):$this.text();var isComma=/[0-9]+,[0-9]+/.test(num);num=num.replace(/,/g,"");var decimalPlaces=(num.split(".")[1]||[]).length;if(counter.beginAt>num)counter.beginAt=num;var isTime=/[0-9]+:[0-9]+:[0-9]+/.test(num);if(isTime){var times=num.split(":"),m=1;s=0;while(times.length>0){s+=m*parseInt(times.pop(),10);m*=60}}for(var i=divisions;i>=counter.beginAt/num*divisions;i--){var newNum=parseFloat(num/divisions*i).toFixed(decimalPlaces);if(isTime){newNum=parseInt(s/divisions*i);var hours=parseInt(newNum/3600)%24;var minutes=parseInt(newNum/60)%60;var seconds=parseInt(newNum%60,10);newNum=(hours<10?"0"+hours:hours)+":"+(minutes<10?"0"+minutes:minutes)+":"+(seconds<10?"0"+seconds:seconds)}if(isComma){while(/(\d+)(\d{3})/.test(newNum.toString())){newNum=newNum.toString().replace(/(\d+)(\d{3})/,"$1"+","+"$2")}}if(settings.formatter){newNum=settings.formatter.call(this,newNum)}nums.unshift(newNum)}$this.data("counterup-nums",nums);$this.text(counter.beginAt);var f=function(){if(!$this.data("counterup-nums")){settings.callback.call(this);return}$this.html($this.data("counterup-nums").shift());if($this.data("counterup-nums").length){setTimeout($this.data("counterup-func"),counter.delay)}else{$this.data("counterup-nums",null);$this.data("counterup-func",null);settings.callback.call(this)}};$this.data("counterup-func",f);setTimeout($this.data("counterup-func"),counter.delay)};$this.waypoint(function(direction){counterUpper();this.destroy()},{offset:counter.offset+"%",context:counter.context})})}})(jQuery);
static/lib/easing/easing.js ADDED
@@ -0,0 +1,168 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*
2
+ * jQuery Easing v1.4.1 - http://gsgd.co.uk/sandbox/jquery/easing/
3
+ * Open source under the BSD License.
4
+ * Copyright © 2008 George McGinley Smith
5
+ * All rights reserved.
6
+ * https://raw.github.com/gdsmith/jquery-easing/master/LICENSE
7
+ */
8
+
9
+ (function (factory) {
10
+ if (typeof define === "function" && define.amd) {
11
+ define(['jquery'], function ($) {
12
+ return factory($);
13
+ });
14
+ } else if (typeof module === "object" && typeof module.exports === "object") {
15
+ exports = factory(require('jquery'));
16
+ } else {
17
+ factory(jQuery);
18
+ }
19
+ })(function($){
20
+
21
+ // Preserve the original jQuery "swing" easing as "jswing"
22
+ if (typeof $.easing !== 'undefined') {
23
+ $.easing['jswing'] = $.easing['swing'];
24
+ }
25
+
26
+ var pow = Math.pow,
27
+ sqrt = Math.sqrt,
28
+ sin = Math.sin,
29
+ cos = Math.cos,
30
+ PI = Math.PI,
31
+ c1 = 1.70158,
32
+ c2 = c1 * 1.525,
33
+ c3 = c1 + 1,
34
+ c4 = ( 2 * PI ) / 3,
35
+ c5 = ( 2 * PI ) / 4.5;
36
+
37
+ // x is the fraction of animation progress, in the range 0..1
38
+ function bounceOut(x) {
39
+ var n1 = 7.5625,
40
+ d1 = 2.75;
41
+ if ( x < 1/d1 ) {
42
+ return n1*x*x;
43
+ } else if ( x < 2/d1 ) {
44
+ return n1*(x-=(1.5/d1))*x + .75;
45
+ } else if ( x < 2.5/d1 ) {
46
+ return n1*(x-=(2.25/d1))*x + .9375;
47
+ } else {
48
+ return n1*(x-=(2.625/d1))*x + .984375;
49
+ }
50
+ }
51
+
52
+ $.extend( $.easing,
53
+ {
54
+ def: 'easeOutQuad',
55
+ swing: function (x) {
56
+ return $.easing[$.easing.def](x);
57
+ },
58
+ easeInQuad: function (x) {
59
+ return x * x;
60
+ },
61
+ easeOutQuad: function (x) {
62
+ return 1 - ( 1 - x ) * ( 1 - x );
63
+ },
64
+ easeInOutQuad: function (x) {
65
+ return x < 0.5 ?
66
+ 2 * x * x :
67
+ 1 - pow( -2 * x + 2, 2 ) / 2;
68
+ },
69
+ easeInCubic: function (x) {
70
+ return x * x * x;
71
+ },
72
+ easeOutCubic: function (x) {
73
+ return 1 - pow( 1 - x, 3 );
74
+ },
75
+ easeInOutCubic: function (x) {
76
+ return x < 0.5 ?
77
+ 4 * x * x * x :
78
+ 1 - pow( -2 * x + 2, 3 ) / 2;
79
+ },
80
+ easeInQuart: function (x) {
81
+ return x * x * x * x;
82
+ },
83
+ easeOutQuart: function (x) {
84
+ return 1 - pow( 1 - x, 4 );
85
+ },
86
+ easeInOutQuart: function (x) {
87
+ return x < 0.5 ?
88
+ 8 * x * x * x * x :
89
+ 1 - pow( -2 * x + 2, 4 ) / 2;
90
+ },
91
+ easeInQuint: function (x) {
92
+ return x * x * x * x * x;
93
+ },
94
+ easeOutQuint: function (x) {
95
+ return 1 - pow( 1 - x, 5 );
96
+ },
97
+ easeInOutQuint: function (x) {
98
+ return x < 0.5 ?
99
+ 16 * x * x * x * x * x :
100
+ 1 - pow( -2 * x + 2, 5 ) / 2;
101
+ },
102
+ easeInSine: function (x) {
103
+ return 1 - cos( x * PI/2 );
104
+ },
105
+ easeOutSine: function (x) {
106
+ return sin( x * PI/2 );
107
+ },
108
+ easeInOutSine: function (x) {
109
+ return -( cos( PI * x ) - 1 ) / 2;
110
+ },
111
+ easeInExpo: function (x) {
112
+ return x === 0 ? 0 : pow( 2, 10 * x - 10 );
113
+ },
114
+ easeOutExpo: function (x) {
115
+ return x === 1 ? 1 : 1 - pow( 2, -10 * x );
116
+ },
117
+ easeInOutExpo: function (x) {
118
+ return x === 0 ? 0 : x === 1 ? 1 : x < 0.5 ?
119
+ pow( 2, 20 * x - 10 ) / 2 :
120
+ ( 2 - pow( 2, -20 * x + 10 ) ) / 2;
121
+ },
122
+ easeInCirc: function (x) {
123
+ return 1 - sqrt( 1 - pow( x, 2 ) );
124
+ },
125
+ easeOutCirc: function (x) {
126
+ return sqrt( 1 - pow( x - 1, 2 ) );
127
+ },
128
+ easeInOutCirc: function (x) {
129
+ return x < 0.5 ?
130
+ ( 1 - sqrt( 1 - pow( 2 * x, 2 ) ) ) / 2 :
131
+ ( sqrt( 1 - pow( -2 * x + 2, 2 ) ) + 1 ) / 2;
132
+ },
133
+ easeInElastic: function (x) {
134
+ return x === 0 ? 0 : x === 1 ? 1 :
135
+ -pow( 2, 10 * x - 10 ) * sin( ( x * 10 - 10.75 ) * c4 );
136
+ },
137
+ easeOutElastic: function (x) {
138
+ return x === 0 ? 0 : x === 1 ? 1 :
139
+ pow( 2, -10 * x ) * sin( ( x * 10 - 0.75 ) * c4 ) + 1;
140
+ },
141
+ easeInOutElastic: function (x) {
142
+ return x === 0 ? 0 : x === 1 ? 1 : x < 0.5 ?
143
+ -( pow( 2, 20 * x - 10 ) * sin( ( 20 * x - 11.125 ) * c5 )) / 2 :
144
+ pow( 2, -20 * x + 10 ) * sin( ( 20 * x - 11.125 ) * c5 ) / 2 + 1;
145
+ },
146
+ easeInBack: function (x) {
147
+ return c3 * x * x * x - c1 * x * x;
148
+ },
149
+ easeOutBack: function (x) {
150
+ return 1 + c3 * pow( x - 1, 3 ) + c1 * pow( x - 1, 2 );
151
+ },
152
+ easeInOutBack: function (x) {
153
+ return x < 0.5 ?
154
+ ( pow( 2 * x, 2 ) * ( ( c2 + 1 ) * 2 * x - c2 ) ) / 2 :
155
+ ( pow( 2 * x - 2, 2 ) *( ( c2 + 1 ) * ( x * 2 - 2 ) + c2 ) + 2 ) / 2;
156
+ },
157
+ easeInBounce: function (x) {
158
+ return 1 - bounceOut( 1 - x );
159
+ },
160
+ easeOutBounce: bounceOut,
161
+ easeInOutBounce: function (x) {
162
+ return x < 0.5 ?
163
+ ( 1 - bounceOut( 1 - 2 * x ) ) / 2 :
164
+ ( 1 + bounceOut( 2 * x - 1 ) ) / 2;
165
+ }
166
+ });
167
+
168
+ });
static/lib/easing/easing.min.js ADDED
@@ -0,0 +1 @@
 
 
1
+ !function(n){"function"==typeof define&&define.amd?define(["jquery"],function(e){return n(e)}):"object"==typeof module&&"object"==typeof module.exports?exports=n(require("jquery")):n(jQuery)}(function(n){function e(n){var e=7.5625,t=2.75;return n<1/t?e*n*n:n<2/t?e*(n-=1.5/t)*n+.75:n<2.5/t?e*(n-=2.25/t)*n+.9375:e*(n-=2.625/t)*n+.984375}void 0!==n.easing&&(n.easing.jswing=n.easing.swing);var t=Math.pow,u=Math.sqrt,r=Math.sin,i=Math.cos,a=Math.PI,c=1.70158,o=1.525*c,s=2*a/3,f=2*a/4.5;n.extend(n.easing,{def:"easeOutQuad",swing:function(e){return n.easing[n.easing.def](e)},easeInQuad:function(n){return n*n},easeOutQuad:function(n){return 1-(1-n)*(1-n)},easeInOutQuad:function(n){return n<.5?2*n*n:1-t(-2*n+2,2)/2},easeInCubic:function(n){return n*n*n},easeOutCubic:function(n){return 1-t(1-n,3)},easeInOutCubic:function(n){return n<.5?4*n*n*n:1-t(-2*n+2,3)/2},easeInQuart:function(n){return n*n*n*n},easeOutQuart:function(n){return 1-t(1-n,4)},easeInOutQuart:function(n){return n<.5?8*n*n*n*n:1-t(-2*n+2,4)/2},easeInQuint:function(n){return n*n*n*n*n},easeOutQuint:function(n){return 1-t(1-n,5)},easeInOutQuint:function(n){return n<.5?16*n*n*n*n*n:1-t(-2*n+2,5)/2},easeInSine:function(n){return 1-i(n*a/2)},easeOutSine:function(n){return r(n*a/2)},easeInOutSine:function(n){return-(i(a*n)-1)/2},easeInExpo:function(n){return 0===n?0:t(2,10*n-10)},easeOutExpo:function(n){return 1===n?1:1-t(2,-10*n)},easeInOutExpo:function(n){return 0===n?0:1===n?1:n<.5?t(2,20*n-10)/2:(2-t(2,-20*n+10))/2},easeInCirc:function(n){return 1-u(1-t(n,2))},easeOutCirc:function(n){return u(1-t(n-1,2))},easeInOutCirc:function(n){return n<.5?(1-u(1-t(2*n,2)))/2:(u(1-t(-2*n+2,2))+1)/2},easeInElastic:function(n){return 0===n?0:1===n?1:-t(2,10*n-10)*r((10*n-10.75)*s)},easeOutElastic:function(n){return 0===n?0:1===n?1:t(2,-10*n)*r((10*n-.75)*s)+1},easeInOutElastic:function(n){return 0===n?0:1===n?1:n<.5?-(t(2,20*n-10)*r((20*n-11.125)*f))/2:t(2,-20*n+10)*r((20*n-11.125)*f)/2+1},easeInBack:function(n){return(c+1)*n*n*n-c*n*n},easeOutBack:function(n){return 1+(c+1)*t(n-1,3)+c*t(n-1,2)},easeInOutBack:function(n){return n<.5?t(2*n,2)*(7.189819*n-o)/2:(t(2*n-2,2)*((o+1)*(2*n-2)+o)+2)/2},easeInBounce:function(n){return 1-e(1-n)},easeOutBounce:e,easeInOutBounce:function(n){return n<.5?(1-e(1-2*n))/2:(1+e(2*n-1))/2}})});
static/lib/owlcarousel/LICENSE ADDED
@@ -0,0 +1,23 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Copyright (c) 2014 Owl
2
+ Modified work Copyright 2016 David Deutsch
3
+
4
+ Permission is hereby granted, free of charge, to any person
5
+ obtaining a copy of this software and associated documentation
6
+ files (the "Software"), to deal in the Software without
7
+ restriction, including without limitation the rights to use,
8
+ copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the
10
+ Software is furnished to do so, subject to the following
11
+ conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
18
+ OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
20
+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
21
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
22
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
23
+ OTHER DEALINGS IN THE SOFTWARE.
static/lib/owlcarousel/assets/ajax-loader.gif ADDED
static/lib/owlcarousel/assets/owl.carousel.css ADDED
@@ -0,0 +1,170 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Owl Carousel v2.2.1
3
+ * Copyright 2013-2017 David Deutsch
4
+ * Licensed under ()
5
+ */
6
+ /*
7
+ * Owl Carousel - Core
8
+ */
9
+ .owl-carousel {
10
+ display: none;
11
+ width: 100%;
12
+ -webkit-tap-highlight-color: transparent;
13
+ /* position relative and z-index fix webkit rendering fonts issue */
14
+ position: relative;
15
+ z-index: 1; }
16
+ .owl-carousel .owl-stage {
17
+ position: relative;
18
+ -ms-touch-action: pan-Y;
19
+ -moz-backface-visibility: hidden;
20
+ /* fix firefox animation glitch */ }
21
+ .owl-carousel .owl-stage:after {
22
+ content: ".";
23
+ display: block;
24
+ clear: both;
25
+ visibility: hidden;
26
+ line-height: 0;
27
+ height: 0; }
28
+ .owl-carousel .owl-stage-outer {
29
+ position: relative;
30
+ overflow: hidden;
31
+ /* fix for flashing background */
32
+ -webkit-transform: translate3d(0px, 0px, 0px); }
33
+ .owl-carousel .owl-wrapper,
34
+ .owl-carousel .owl-item {
35
+ -webkit-backface-visibility: hidden;
36
+ -moz-backface-visibility: hidden;
37
+ -ms-backface-visibility: hidden;
38
+ -webkit-transform: translate3d(0, 0, 0);
39
+ -moz-transform: translate3d(0, 0, 0);
40
+ -ms-transform: translate3d(0, 0, 0); }
41
+ .owl-carousel .owl-item {
42
+ position: relative;
43
+ min-height: 1px;
44
+ float: left;
45
+ -webkit-backface-visibility: hidden;
46
+ -webkit-tap-highlight-color: transparent;
47
+ -webkit-touch-callout: none; }
48
+ .owl-carousel .owl-item img {
49
+ display: block;
50
+ width: 100%; }
51
+ .owl-carousel .owl-nav.disabled,
52
+ .owl-carousel .owl-dots.disabled {
53
+ display: none; }
54
+ .owl-carousel .owl-nav .owl-prev,
55
+ .owl-carousel .owl-nav .owl-next,
56
+ .owl-carousel .owl-dot {
57
+ cursor: pointer;
58
+ cursor: hand;
59
+ -webkit-user-select: none;
60
+ -khtml-user-select: none;
61
+ -moz-user-select: none;
62
+ -ms-user-select: none;
63
+ user-select: none; }
64
+ .owl-carousel.owl-loaded {
65
+ display: block; }
66
+ .owl-carousel.owl-loading {
67
+ opacity: 0;
68
+ display: block; }
69
+ .owl-carousel.owl-hidden {
70
+ opacity: 0; }
71
+ .owl-carousel.owl-refresh .owl-item {
72
+ visibility: hidden; }
73
+ .owl-carousel.owl-drag .owl-item {
74
+ -webkit-user-select: none;
75
+ -moz-user-select: none;
76
+ -ms-user-select: none;
77
+ user-select: none; }
78
+ .owl-carousel.owl-grab {
79
+ cursor: move;
80
+ cursor: grab; }
81
+ .owl-carousel.owl-rtl {
82
+ direction: rtl; }
83
+ .owl-carousel.owl-rtl .owl-item {
84
+ float: right; }
85
+
86
+ /* No Js */
87
+ .no-js .owl-carousel {
88
+ display: block; }
89
+
90
+ /*
91
+ * Owl Carousel - Animate Plugin
92
+ */
93
+ .owl-carousel .animated {
94
+ animation-duration: 1000ms;
95
+ animation-fill-mode: both; }
96
+
97
+ .owl-carousel .owl-animated-in {
98
+ z-index: 0; }
99
+
100
+ .owl-carousel .owl-animated-out {
101
+ z-index: 1; }
102
+
103
+ .owl-carousel .fadeOut {
104
+ animation-name: fadeOut; }
105
+
106
+ @keyframes fadeOut {
107
+ 0% {
108
+ opacity: 1; }
109
+ 100% {
110
+ opacity: 0; } }
111
+
112
+ /*
113
+ * Owl Carousel - Auto Height Plugin
114
+ */
115
+ .owl-height {
116
+ transition: height 500ms ease-in-out; }
117
+
118
+ /*
119
+ * Owl Carousel - Lazy Load Plugin
120
+ */
121
+ .owl-carousel .owl-item .owl-lazy {
122
+ opacity: 0;
123
+ transition: opacity 400ms ease; }
124
+
125
+ .owl-carousel .owl-item img.owl-lazy {
126
+ transform-style: preserve-3d; }
127
+
128
+ /*
129
+ * Owl Carousel - Video Plugin
130
+ */
131
+ .owl-carousel .owl-video-wrapper {
132
+ position: relative;
133
+ height: 100%;
134
+ background: #000; }
135
+
136
+ .owl-carousel .owl-video-play-icon {
137
+ position: absolute;
138
+ height: 80px;
139
+ width: 80px;
140
+ left: 50%;
141
+ top: 50%;
142
+ margin-left: -40px;
143
+ margin-top: -40px;
144
+ background: url("owl.video.play.png") no-repeat;
145
+ cursor: pointer;
146
+ z-index: 1;
147
+ -webkit-backface-visibility: hidden;
148
+ transition: transform 100ms ease; }
149
+
150
+ .owl-carousel .owl-video-play-icon:hover {
151
+ -ms-transform: scale(1.3, 1.3);
152
+ transform: scale(1.3, 1.3); }
153
+
154
+ .owl-carousel .owl-video-playing .owl-video-tn,
155
+ .owl-carousel .owl-video-playing .owl-video-play-icon {
156
+ display: none; }
157
+
158
+ .owl-carousel .owl-video-tn {
159
+ opacity: 0;
160
+ height: 100%;
161
+ background-position: center center;
162
+ background-repeat: no-repeat;
163
+ background-size: contain;
164
+ transition: opacity 400ms ease; }
165
+
166
+ .owl-carousel .owl-video-frame {
167
+ position: relative;
168
+ z-index: 1;
169
+ height: 100%;
170
+ width: 100%; }
static/lib/owlcarousel/assets/owl.carousel.min.css ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ /**
2
+ * Owl Carousel v2.2.1
3
+ * Copyright 2013-2017 David Deutsch
4
+ * Licensed under ()
5
+ */
6
+ .owl-carousel,.owl-carousel .owl-item{-webkit-tap-highlight-color:transparent;position:relative}.owl-carousel{display:none;width:100%;z-index:1}.owl-carousel .owl-stage{position:relative;-ms-touch-action:pan-Y;-moz-backface-visibility:hidden}.owl-carousel .owl-stage:after{content:".";display:block;clear:both;visibility:hidden;line-height:0;height:0}.owl-carousel .owl-stage-outer{position:relative;overflow:hidden;-webkit-transform:translate3d(0,0,0)}.owl-carousel .owl-item,.owl-carousel .owl-wrapper{-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0)}.owl-carousel .owl-item{min-height:1px;float:left;-webkit-backface-visibility:hidden;-webkit-touch-callout:none}.owl-carousel .owl-item img{display:block;width:100%}.owl-carousel .owl-dots.disabled,.owl-carousel .owl-nav.disabled{display:none}.no-js .owl-carousel,.owl-carousel.owl-loaded{display:block}.owl-carousel .owl-dot,.owl-carousel .owl-nav .owl-next,.owl-carousel .owl-nav .owl-prev{cursor:pointer;cursor:hand;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.owl-carousel.owl-loading{opacity:0;display:block}.owl-carousel.owl-hidden{opacity:0}.owl-carousel.owl-refresh .owl-item{visibility:hidden}.owl-carousel.owl-drag .owl-item{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.owl-carousel.owl-grab{cursor:move;cursor:grab}.owl-carousel.owl-rtl{direction:rtl}.owl-carousel.owl-rtl .owl-item{float:right}.owl-carousel .animated{animation-duration:1s;animation-fill-mode:both}.owl-carousel .owl-animated-in{z-index:0}.owl-carousel .owl-animated-out{z-index:1}.owl-carousel .fadeOut{animation-name:fadeOut}@keyframes fadeOut{0%{opacity:1}100%{opacity:0}}.owl-height{transition:height .5s ease-in-out}.owl-carousel .owl-item .owl-lazy{opacity:0;transition:opacity .4s ease}.owl-carousel .owl-item img.owl-lazy{transform-style:preserve-3d}.owl-carousel .owl-video-wrapper{position:relative;height:100%;background:#000}.owl-carousel .owl-video-play-icon{position:absolute;height:80px;width:80px;left:50%;top:50%;margin-left:-40px;margin-top:-40px;background:url(owl.video.play.png) no-repeat;cursor:pointer;z-index:1;-webkit-backface-visibility:hidden;transition:transform .1s ease}.owl-carousel .owl-video-play-icon:hover{-ms-transform:scale(1.3,1.3);transform:scale(1.3,1.3)}.owl-carousel .owl-video-playing .owl-video-play-icon,.owl-carousel .owl-video-playing .owl-video-tn{display:none}.owl-carousel .owl-video-tn{opacity:0;height:100%;background-position:center center;background-repeat:no-repeat;background-size:contain;transition:opacity .4s ease}.owl-carousel .owl-video-frame{position:relative;z-index:1;height:100%;width:100%}
static/lib/owlcarousel/assets/owl.theme.default.css ADDED
@@ -0,0 +1,50 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Owl Carousel v2.2.1
3
+ * Copyright 2013-2017 David Deutsch
4
+ * Licensed under ()
5
+ */
6
+ /*
7
+ * Default theme - Owl Carousel CSS File
8
+ */
9
+ .owl-theme .owl-nav {
10
+ margin-top: 10px;
11
+ text-align: center;
12
+ -webkit-tap-highlight-color: transparent; }
13
+ .owl-theme .owl-nav [class*='owl-'] {
14
+ color: #FFF;
15
+ font-size: 14px;
16
+ margin: 5px;
17
+ padding: 4px 7px;
18
+ background: #D6D6D6;
19
+ display: inline-block;
20
+ cursor: pointer;
21
+ border-radius: 3px; }
22
+ .owl-theme .owl-nav [class*='owl-']:hover {
23
+ background: #869791;
24
+ color: #FFF;
25
+ text-decoration: none; }
26
+ .owl-theme .owl-nav .disabled {
27
+ opacity: 0.5;
28
+ cursor: default; }
29
+
30
+ .owl-theme .owl-nav.disabled + .owl-dots {
31
+ margin-top: 10px; }
32
+
33
+ .owl-theme .owl-dots {
34
+ text-align: center;
35
+ -webkit-tap-highlight-color: transparent; }
36
+ .owl-theme .owl-dots .owl-dot {
37
+ display: inline-block;
38
+ zoom: 1;
39
+ *display: inline; }
40
+ .owl-theme .owl-dots .owl-dot span {
41
+ width: 10px;
42
+ height: 10px;
43
+ margin: 5px 7px;
44
+ background: #D6D6D6;
45
+ display: block;
46
+ -webkit-backface-visibility: visible;
47
+ transition: opacity 200ms ease;
48
+ border-radius: 30px; }
49
+ .owl-theme .owl-dots .owl-dot.active span, .owl-theme .owl-dots .owl-dot:hover span {
50
+ background: #869791; }
static/lib/owlcarousel/assets/owl.theme.default.min.css ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ /**
2
+ * Owl Carousel v2.2.1
3
+ * Copyright 2013-2017 David Deutsch
4
+ * Licensed under ()
5
+ */
6
+ .owl-theme .owl-dots,.owl-theme .owl-nav{text-align:center;-webkit-tap-highlight-color:transparent}.owl-theme .owl-nav{margin-top:10px}.owl-theme .owl-nav [class*=owl-]{color:#FFF;font-size:14px;margin:5px;padding:4px 7px;background:#D6D6D6;display:inline-block;cursor:pointer;border-radius:3px}.owl-theme .owl-nav [class*=owl-]:hover{background:#869791;color:#FFF;text-decoration:none}.owl-theme .owl-nav .disabled{opacity:.5;cursor:default}.owl-theme .owl-nav.disabled+.owl-dots{margin-top:10px}.owl-theme .owl-dots .owl-dot{display:inline-block;zoom:1}.owl-theme .owl-dots .owl-dot span{width:10px;height:10px;margin:5px 7px;background:#D6D6D6;display:block;-webkit-backface-visibility:visible;transition:opacity .2s ease;border-radius:30px}.owl-theme .owl-dots .owl-dot.active span,.owl-theme .owl-dots .owl-dot:hover span{background:#869791}
static/lib/owlcarousel/assets/owl.theme.green.css ADDED
@@ -0,0 +1,50 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Owl Carousel v2.2.1
3
+ * Copyright 2013-2017 David Deutsch
4
+ * Licensed under ()
5
+ */
6
+ /*
7
+ * Green theme - Owl Carousel CSS File
8
+ */
9
+ .owl-theme .owl-nav {
10
+ margin-top: 10px;
11
+ text-align: center;
12
+ -webkit-tap-highlight-color: transparent; }
13
+ .owl-theme .owl-nav [class*='owl-'] {
14
+ color: #FFF;
15
+ font-size: 14px;
16
+ margin: 5px;
17
+ padding: 4px 7px;
18
+ background: #D6D6D6;
19
+ display: inline-block;
20
+ cursor: pointer;
21
+ border-radius: 3px; }
22
+ .owl-theme .owl-nav [class*='owl-']:hover {
23
+ background: #4DC7A0;
24
+ color: #FFF;
25
+ text-decoration: none; }
26
+ .owl-theme .owl-nav .disabled {
27
+ opacity: 0.5;
28
+ cursor: default; }
29
+
30
+ .owl-theme .owl-nav.disabled + .owl-dots {
31
+ margin-top: 10px; }
32
+
33
+ .owl-theme .owl-dots {
34
+ text-align: center;
35
+ -webkit-tap-highlight-color: transparent; }
36
+ .owl-theme .owl-dots .owl-dot {
37
+ display: inline-block;
38
+ zoom: 1;
39
+ *display: inline; }
40
+ .owl-theme .owl-dots .owl-dot span {
41
+ width: 10px;
42
+ height: 10px;
43
+ margin: 5px 7px;
44
+ background: #D6D6D6;
45
+ display: block;
46
+ -webkit-backface-visibility: visible;
47
+ transition: opacity 200ms ease;
48
+ border-radius: 30px; }
49
+ .owl-theme .owl-dots .owl-dot.active span, .owl-theme .owl-dots .owl-dot:hover span {
50
+ background: #4DC7A0; }
static/lib/owlcarousel/assets/owl.theme.green.min.css ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ /**
2
+ * Owl Carousel v2.2.1
3
+ * Copyright 2013-2017 David Deutsch
4
+ * Licensed under ()
5
+ */
6
+ .owl-theme .owl-dots,.owl-theme .owl-nav{text-align:center;-webkit-tap-highlight-color:transparent}.owl-theme .owl-nav{margin-top:10px}.owl-theme .owl-nav [class*=owl-]{color:#FFF;font-size:14px;margin:5px;padding:4px 7px;background:#D6D6D6;display:inline-block;cursor:pointer;border-radius:3px}.owl-theme .owl-nav [class*=owl-]:hover{background:#4DC7A0;color:#FFF;text-decoration:none}.owl-theme .owl-nav .disabled{opacity:.5;cursor:default}.owl-theme .owl-nav.disabled+.owl-dots{margin-top:10px}.owl-theme .owl-dots .owl-dot{display:inline-block;zoom:1}.owl-theme .owl-dots .owl-dot span{width:10px;height:10px;margin:5px 7px;background:#D6D6D6;display:block;-webkit-backface-visibility:visible;transition:opacity .2s ease;border-radius:30px}.owl-theme .owl-dots .owl-dot.active span,.owl-theme .owl-dots .owl-dot:hover span{background:#4DC7A0}
static/lib/owlcarousel/assets/owl.video.play.png ADDED
static/lib/owlcarousel/owl.carousel.js ADDED
@@ -0,0 +1,3275 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Owl Carousel v2.2.1
3
+ * Copyright 2013-2017 David Deutsch
4
+ * Licensed under ()
5
+ */
6
+ /**
7
+ * Owl carousel
8
+ * @version 2.1.6
9
+ * @author Bartosz Wojciechowski
10
+ * @author David Deutsch
11
+ * @license The MIT License (MIT)
12
+ * @todo Lazy Load Icon
13
+ * @todo prevent animationend bubling
14
+ * @todo itemsScaleUp
15
+ * @todo Test Zepto
16
+ * @todo stagePadding calculate wrong active classes
17
+ */
18
+ ;(function($, window, document, undefined) {
19
+
20
+ /**
21
+ * Creates a carousel.
22
+ * @class The Owl Carousel.
23
+ * @public
24
+ * @param {HTMLElement|jQuery} element - The element to create the carousel for.
25
+ * @param {Object} [options] - The options
26
+ */
27
+ function Owl(element, options) {
28
+
29
+ /**
30
+ * Current settings for the carousel.
31
+ * @public
32
+ */
33
+ this.settings = null;
34
+
35
+ /**
36
+ * Current options set by the caller including defaults.
37
+ * @public
38
+ */
39
+ this.options = $.extend({}, Owl.Defaults, options);
40
+
41
+ /**
42
+ * Plugin element.
43
+ * @public
44
+ */
45
+ this.$element = $(element);
46
+
47
+ /**
48
+ * Proxied event handlers.
49
+ * @protected
50
+ */
51
+ this._handlers = {};
52
+
53
+ /**
54
+ * References to the running plugins of this carousel.
55
+ * @protected
56
+ */
57
+ this._plugins = {};
58
+
59
+ /**
60
+ * Currently suppressed events to prevent them from beeing retriggered.
61
+ * @protected
62
+ */
63
+ this._supress = {};
64
+
65
+ /**
66
+ * Absolute current position.
67
+ * @protected
68
+ */
69
+ this._current = null;
70
+
71
+ /**
72
+ * Animation speed in milliseconds.
73
+ * @protected
74
+ */
75
+ this._speed = null;
76
+
77
+ /**
78
+ * Coordinates of all items in pixel.
79
+ * @todo The name of this member is missleading.
80
+ * @protected
81
+ */
82
+ this._coordinates = [];
83
+
84
+ /**
85
+ * Current breakpoint.
86
+ * @todo Real media queries would be nice.
87
+ * @protected
88
+ */
89
+ this._breakpoint = null;
90
+
91
+ /**
92
+ * Current width of the plugin element.
93
+ */
94
+ this._width = null;
95
+
96
+ /**
97
+ * All real items.
98
+ * @protected
99
+ */
100
+ this._items = [];
101
+
102
+ /**
103
+ * All cloned items.
104
+ * @protected
105
+ */
106
+ this._clones = [];
107
+
108
+ /**
109
+ * Merge values of all items.
110
+ * @todo Maybe this could be part of a plugin.
111
+ * @protected
112
+ */
113
+ this._mergers = [];
114
+
115
+ /**
116
+ * Widths of all items.
117
+ */
118
+ this._widths = [];
119
+
120
+ /**
121
+ * Invalidated parts within the update process.
122
+ * @protected
123
+ */
124
+ this._invalidated = {};
125
+
126
+ /**
127
+ * Ordered list of workers for the update process.
128
+ * @protected
129
+ */
130
+ this._pipe = [];
131
+
132
+ /**
133
+ * Current state information for the drag operation.
134
+ * @todo #261
135
+ * @protected
136
+ */
137
+ this._drag = {
138
+ time: null,
139
+ target: null,
140
+ pointer: null,
141
+ stage: {
142
+ start: null,
143
+ current: null
144
+ },
145
+ direction: null
146
+ };
147
+
148
+ /**
149
+ * Current state information and their tags.
150
+ * @type {Object}
151
+ * @protected
152
+ */
153
+ this._states = {
154
+ current: {},
155
+ tags: {
156
+ 'initializing': [ 'busy' ],
157
+ 'animating': [ 'busy' ],
158
+ 'dragging': [ 'interacting' ]
159
+ }
160
+ };
161
+
162
+ $.each([ 'onResize', 'onThrottledResize' ], $.proxy(function(i, handler) {
163
+ this._handlers[handler] = $.proxy(this[handler], this);
164
+ }, this));
165
+
166
+ $.each(Owl.Plugins, $.proxy(function(key, plugin) {
167
+ this._plugins[key.charAt(0).toLowerCase() + key.slice(1)]
168
+ = new plugin(this);
169
+ }, this));
170
+
171
+ $.each(Owl.Workers, $.proxy(function(priority, worker) {
172
+ this._pipe.push({
173
+ 'filter': worker.filter,
174
+ 'run': $.proxy(worker.run, this)
175
+ });
176
+ }, this));
177
+
178
+ this.setup();
179
+ this.initialize();
180
+ }
181
+
182
+ /**
183
+ * Default options for the carousel.
184
+ * @public
185
+ */
186
+ Owl.Defaults = {
187
+ items: 3,
188
+ loop: false,
189
+ center: false,
190
+ rewind: false,
191
+
192
+ mouseDrag: true,
193
+ touchDrag: true,
194
+ pullDrag: true,
195
+ freeDrag: false,
196
+
197
+ margin: 0,
198
+ stagePadding: 0,
199
+
200
+ merge: false,
201
+ mergeFit: true,
202
+ autoWidth: false,
203
+
204
+ startPosition: 0,
205
+ rtl: false,
206
+
207
+ smartSpeed: 250,
208
+ fluidSpeed: false,
209
+ dragEndSpeed: false,
210
+
211
+ responsive: {},
212
+ responsiveRefreshRate: 200,
213
+ responsiveBaseElement: window,
214
+
215
+ fallbackEasing: 'swing',
216
+
217
+ info: false,
218
+
219
+ nestedItemSelector: false,
220
+ itemElement: 'div',
221
+ stageElement: 'div',
222
+
223
+ refreshClass: 'owl-refresh',
224
+ loadedClass: 'owl-loaded',
225
+ loadingClass: 'owl-loading',
226
+ rtlClass: 'owl-rtl',
227
+ responsiveClass: 'owl-responsive',
228
+ dragClass: 'owl-drag',
229
+ itemClass: 'owl-item',
230
+ stageClass: 'owl-stage',
231
+ stageOuterClass: 'owl-stage-outer',
232
+ grabClass: 'owl-grab'
233
+ };
234
+
235
+ /**
236
+ * Enumeration for width.
237
+ * @public
238
+ * @readonly
239
+ * @enum {String}
240
+ */
241
+ Owl.Width = {
242
+ Default: 'default',
243
+ Inner: 'inner',
244
+ Outer: 'outer'
245
+ };
246
+
247
+ /**
248
+ * Enumeration for types.
249
+ * @public
250
+ * @readonly
251
+ * @enum {String}
252
+ */
253
+ Owl.Type = {
254
+ Event: 'event',
255
+ State: 'state'
256
+ };
257
+
258
+ /**
259
+ * Contains all registered plugins.
260
+ * @public
261
+ */
262
+ Owl.Plugins = {};
263
+
264
+ /**
265
+ * List of workers involved in the update process.
266
+ */
267
+ Owl.Workers = [ {
268
+ filter: [ 'width', 'settings' ],
269
+ run: function() {
270
+ this._width = this.$element.width();
271
+ }
272
+ }, {
273
+ filter: [ 'width', 'items', 'settings' ],
274
+ run: function(cache) {
275
+ cache.current = this._items && this._items[this.relative(this._current)];
276
+ }
277
+ }, {
278
+ filter: [ 'items', 'settings' ],
279
+ run: function() {
280
+ this.$stage.children('.cloned').remove();
281
+ }
282
+ }, {
283
+ filter: [ 'width', 'items', 'settings' ],
284
+ run: function(cache) {
285
+ var margin = this.settings.margin || '',
286
+ grid = !this.settings.autoWidth,
287
+ rtl = this.settings.rtl,
288
+ css = {
289
+ 'width': 'auto',
290
+ 'margin-left': rtl ? margin : '',
291
+ 'margin-right': rtl ? '' : margin
292
+ };
293
+
294
+ !grid && this.$stage.children().css(css);
295
+
296
+ cache.css = css;
297
+ }
298
+ }, {
299
+ filter: [ 'width', 'items', 'settings' ],
300
+ run: function(cache) {
301
+ var width = (this.width() / this.settings.items).toFixed(3) - this.settings.margin,
302
+ merge = null,
303
+ iterator = this._items.length,
304
+ grid = !this.settings.autoWidth,
305
+ widths = [];
306
+
307
+ cache.items = {
308
+ merge: false,
309
+ width: width
310
+ };
311
+
312
+ while (iterator--) {
313
+ merge = this._mergers[iterator];
314
+ merge = this.settings.mergeFit && Math.min(merge, this.settings.items) || merge;
315
+
316
+ cache.items.merge = merge > 1 || cache.items.merge;
317
+
318
+ widths[iterator] = !grid ? this._items[iterator].width() : width * merge;
319
+ }
320
+
321
+ this._widths = widths;
322
+ }
323
+ }, {
324
+ filter: [ 'items', 'settings' ],
325
+ run: function() {
326
+ var clones = [],
327
+ items = this._items,
328
+ settings = this.settings,
329
+ // TODO: Should be computed from number of min width items in stage
330
+ view = Math.max(settings.items * 2, 4),
331
+ size = Math.ceil(items.length / 2) * 2,
332
+ repeat = settings.loop && items.length ? settings.rewind ? view : Math.max(view, size) : 0,
333
+ append = '',
334
+ prepend = '';
335
+
336
+ repeat /= 2;
337
+
338
+ while (repeat--) {
339
+ // Switch to only using appended clones
340
+ clones.push(this.normalize(clones.length / 2, true));
341
+ append = append + items[clones[clones.length - 1]][0].outerHTML;
342
+ clones.push(this.normalize(items.length - 1 - (clones.length - 1) / 2, true));
343
+ prepend = items[clones[clones.length - 1]][0].outerHTML + prepend;
344
+ }
345
+
346
+ this._clones = clones;
347
+
348
+ $(append).addClass('cloned').appendTo(this.$stage);
349
+ $(prepend).addClass('cloned').prependTo(this.$stage);
350
+ }
351
+ }, {
352
+ filter: [ 'width', 'items', 'settings' ],
353
+ run: function() {
354
+ var rtl = this.settings.rtl ? 1 : -1,
355
+ size = this._clones.length + this._items.length,
356
+ iterator = -1,
357
+ previous = 0,
358
+ current = 0,
359
+ coordinates = [];
360
+
361
+ while (++iterator < size) {
362
+ previous = coordinates[iterator - 1] || 0;
363
+ current = this._widths[this.relative(iterator)] + this.settings.margin;
364
+ coordinates.push(previous + current * rtl);
365
+ }
366
+
367
+ this._coordinates = coordinates;
368
+ }
369
+ }, {
370
+ filter: [ 'width', 'items', 'settings' ],
371
+ run: function() {
372
+ var padding = this.settings.stagePadding,
373
+ coordinates = this._coordinates,
374
+ css = {
375
+ 'width': Math.ceil(Math.abs(coordinates[coordinates.length - 1])) + padding * 2,
376
+ 'padding-left': padding || '',
377
+ 'padding-right': padding || ''
378
+ };
379
+
380
+ this.$stage.css(css);
381
+ }
382
+ }, {
383
+ filter: [ 'width', 'items', 'settings' ],
384
+ run: function(cache) {
385
+ var iterator = this._coordinates.length,
386
+ grid = !this.settings.autoWidth,
387
+ items = this.$stage.children();
388
+
389
+ if (grid && cache.items.merge) {
390
+ while (iterator--) {
391
+ cache.css.width = this._widths[this.relative(iterator)];
392
+ items.eq(iterator).css(cache.css);
393
+ }
394
+ } else if (grid) {
395
+ cache.css.width = cache.items.width;
396
+ items.css(cache.css);
397
+ }
398
+ }
399
+ }, {
400
+ filter: [ 'items' ],
401
+ run: function() {
402
+ this._coordinates.length < 1 && this.$stage.removeAttr('style');
403
+ }
404
+ }, {
405
+ filter: [ 'width', 'items', 'settings' ],
406
+ run: function(cache) {
407
+ cache.current = cache.current ? this.$stage.children().index(cache.current) : 0;
408
+ cache.current = Math.max(this.minimum(), Math.min(this.maximum(), cache.current));
409
+ this.reset(cache.current);
410
+ }
411
+ }, {
412
+ filter: [ 'position' ],
413
+ run: function() {
414
+ this.animate(this.coordinates(this._current));
415
+ }
416
+ }, {
417
+ filter: [ 'width', 'position', 'items', 'settings' ],
418
+ run: function() {
419
+ var rtl = this.settings.rtl ? 1 : -1,
420
+ padding = this.settings.stagePadding * 2,
421
+ begin = this.coordinates(this.current()) + padding,
422
+ end = begin + this.width() * rtl,
423
+ inner, outer, matches = [], i, n;
424
+
425
+ for (i = 0, n = this._coordinates.length; i < n; i++) {
426
+ inner = this._coordinates[i - 1] || 0;
427
+ outer = Math.abs(this._coordinates[i]) + padding * rtl;
428
+
429
+ if ((this.op(inner, '<=', begin) && (this.op(inner, '>', end)))
430
+ || (this.op(outer, '<', begin) && this.op(outer, '>', end))) {
431
+ matches.push(i);
432
+ }
433
+ }
434
+
435
+ this.$stage.children('.active').removeClass('active');
436
+ this.$stage.children(':eq(' + matches.join('), :eq(') + ')').addClass('active');
437
+
438
+ if (this.settings.center) {
439
+ this.$stage.children('.center').removeClass('center');
440
+ this.$stage.children().eq(this.current()).addClass('center');
441
+ }
442
+ }
443
+ } ];
444
+
445
+ /**
446
+ * Initializes the carousel.
447
+ * @protected
448
+ */
449
+ Owl.prototype.initialize = function() {
450
+ this.enter('initializing');
451
+ this.trigger('initialize');
452
+
453
+ this.$element.toggleClass(this.settings.rtlClass, this.settings.rtl);
454
+
455
+ if (this.settings.autoWidth && !this.is('pre-loading')) {
456
+ var imgs, nestedSelector, width;
457
+ imgs = this.$element.find('img');
458
+ nestedSelector = this.settings.nestedItemSelector ? '.' + this.settings.nestedItemSelector : undefined;
459
+ width = this.$element.children(nestedSelector).width();
460
+
461
+ if (imgs.length && width <= 0) {
462
+ this.preloadAutoWidthImages(imgs);
463
+ }
464
+ }
465
+
466
+ this.$element.addClass(this.options.loadingClass);
467
+
468
+ // create stage
469
+ this.$stage = $('<' + this.settings.stageElement + ' class="' + this.settings.stageClass + '"/>')
470
+ .wrap('<div class="' + this.settings.stageOuterClass + '"/>');
471
+
472
+ // append stage
473
+ this.$element.append(this.$stage.parent());
474
+
475
+ // append content
476
+ this.replace(this.$element.children().not(this.$stage.parent()));
477
+
478
+ // check visibility
479
+ if (this.$element.is(':visible')) {
480
+ // update view
481
+ this.refresh();
482
+ } else {
483
+ // invalidate width
484
+ this.invalidate('width');
485
+ }
486
+
487
+ this.$element
488
+ .removeClass(this.options.loadingClass)
489
+ .addClass(this.options.loadedClass);
490
+
491
+ // register event handlers
492
+ this.registerEventHandlers();
493
+
494
+ this.leave('initializing');
495
+ this.trigger('initialized');
496
+ };
497
+
498
+ /**
499
+ * Setups the current settings.
500
+ * @todo Remove responsive classes. Why should adaptive designs be brought into IE8?
501
+ * @todo Support for media queries by using `matchMedia` would be nice.
502
+ * @public
503
+ */
504
+ Owl.prototype.setup = function() {
505
+ var viewport = this.viewport(),
506
+ overwrites = this.options.responsive,
507
+ match = -1,
508
+ settings = null;
509
+
510
+ if (!overwrites) {
511
+ settings = $.extend({}, this.options);
512
+ } else {
513
+ $.each(overwrites, function(breakpoint) {
514
+ if (breakpoint <= viewport && breakpoint > match) {
515
+ match = Number(breakpoint);
516
+ }
517
+ });
518
+
519
+ settings = $.extend({}, this.options, overwrites[match]);
520
+ if (typeof settings.stagePadding === 'function') {
521
+ settings.stagePadding = settings.stagePadding();
522
+ }
523
+ delete settings.responsive;
524
+
525
+ // responsive class
526
+ if (settings.responsiveClass) {
527
+ this.$element.attr('class',
528
+ this.$element.attr('class').replace(new RegExp('(' + this.options.responsiveClass + '-)\\S+\\s', 'g'), '$1' + match)
529
+ );
530
+ }
531
+ }
532
+
533
+ this.trigger('change', { property: { name: 'settings', value: settings } });
534
+ this._breakpoint = match;
535
+ this.settings = settings;
536
+ this.invalidate('settings');
537
+ this.trigger('changed', { property: { name: 'settings', value: this.settings } });
538
+ };
539
+
540
+ /**
541
+ * Updates option logic if necessery.
542
+ * @protected
543
+ */
544
+ Owl.prototype.optionsLogic = function() {
545
+ if (this.settings.autoWidth) {
546
+ this.settings.stagePadding = false;
547
+ this.settings.merge = false;
548
+ }
549
+ };
550
+
551
+ /**
552
+ * Prepares an item before add.
553
+ * @todo Rename event parameter `content` to `item`.
554
+ * @protected
555
+ * @returns {jQuery|HTMLElement} - The item container.
556
+ */
557
+ Owl.prototype.prepare = function(item) {
558
+ var event = this.trigger('prepare', { content: item });
559
+
560
+ if (!event.data) {
561
+ event.data = $('<' + this.settings.itemElement + '/>')
562
+ .addClass(this.options.itemClass).append(item)
563
+ }
564
+
565
+ this.trigger('prepared', { content: event.data });
566
+
567
+ return event.data;
568
+ };
569
+
570
+ /**
571
+ * Updates the view.
572
+ * @public
573
+ */
574
+ Owl.prototype.update = function() {
575
+ var i = 0,
576
+ n = this._pipe.length,
577
+ filter = $.proxy(function(p) { return this[p] }, this._invalidated),
578
+ cache = {};
579
+
580
+ while (i < n) {
581
+ if (this._invalidated.all || $.grep(this._pipe[i].filter, filter).length > 0) {
582
+ this._pipe[i].run(cache);
583
+ }
584
+ i++;
585
+ }
586
+
587
+ this._invalidated = {};
588
+
589
+ !this.is('valid') && this.enter('valid');
590
+ };
591
+
592
+ /**
593
+ * Gets the width of the view.
594
+ * @public
595
+ * @param {Owl.Width} [dimension=Owl.Width.Default] - The dimension to return.
596
+ * @returns {Number} - The width of the view in pixel.
597
+ */
598
+ Owl.prototype.width = function(dimension) {
599
+ dimension = dimension || Owl.Width.Default;
600
+ switch (dimension) {
601
+ case Owl.Width.Inner:
602
+ case Owl.Width.Outer:
603
+ return this._width;
604
+ default:
605
+ return this._width - this.settings.stagePadding * 2 + this.settings.margin;
606
+ }
607
+ };
608
+
609
+ /**
610
+ * Refreshes the carousel primarily for adaptive purposes.
611
+ * @public
612
+ */
613
+ Owl.prototype.refresh = function() {
614
+ this.enter('refreshing');
615
+ this.trigger('refresh');
616
+
617
+ this.setup();
618
+
619
+ this.optionsLogic();
620
+
621
+ this.$element.addClass(this.options.refreshClass);
622
+
623
+ this.update();
624
+
625
+ this.$element.removeClass(this.options.refreshClass);
626
+
627
+ this.leave('refreshing');
628
+ this.trigger('refreshed');
629
+ };
630
+
631
+ /**
632
+ * Checks window `resize` event.
633
+ * @protected
634
+ */
635
+ Owl.prototype.onThrottledResize = function() {
636
+ window.clearTimeout(this.resizeTimer);
637
+ this.resizeTimer = window.setTimeout(this._handlers.onResize, this.settings.responsiveRefreshRate);
638
+ };
639
+
640
+ /**
641
+ * Checks window `resize` event.
642
+ * @protected
643
+ */
644
+ Owl.prototype.onResize = function() {
645
+ if (!this._items.length) {
646
+ return false;
647
+ }
648
+
649
+ if (this._width === this.$element.width()) {
650
+ return false;
651
+ }
652
+
653
+ if (!this.$element.is(':visible')) {
654
+ return false;
655
+ }
656
+
657
+ this.enter('resizing');
658
+
659
+ if (this.trigger('resize').isDefaultPrevented()) {
660
+ this.leave('resizing');
661
+ return false;
662
+ }
663
+
664
+ this.invalidate('width');
665
+
666
+ this.refresh();
667
+
668
+ this.leave('resizing');
669
+ this.trigger('resized');
670
+ };
671
+
672
+ /**
673
+ * Registers event handlers.
674
+ * @todo Check `msPointerEnabled`
675
+ * @todo #261
676
+ * @protected
677
+ */
678
+ Owl.prototype.registerEventHandlers = function() {
679
+ if ($.support.transition) {
680
+ this.$stage.on($.support.transition.end + '.owl.core', $.proxy(this.onTransitionEnd, this));
681
+ }
682
+
683
+ if (this.settings.responsive !== false) {
684
+ this.on(window, 'resize', this._handlers.onThrottledResize);
685
+ }
686
+
687
+ if (this.settings.mouseDrag) {
688
+ this.$element.addClass(this.options.dragClass);
689
+ this.$stage.on('mousedown.owl.core', $.proxy(this.onDragStart, this));
690
+ this.$stage.on('dragstart.owl.core selectstart.owl.core', function() { return false });
691
+ }
692
+
693
+ if (this.settings.touchDrag){
694
+ this.$stage.on('touchstart.owl.core', $.proxy(this.onDragStart, this));
695
+ this.$stage.on('touchcancel.owl.core', $.proxy(this.onDragEnd, this));
696
+ }
697
+ };
698
+
699
+ /**
700
+ * Handles `touchstart` and `mousedown` events.
701
+ * @todo Horizontal swipe threshold as option
702
+ * @todo #261
703
+ * @protected
704
+ * @param {Event} event - The event arguments.
705
+ */
706
+ Owl.prototype.onDragStart = function(event) {
707
+ var stage = null;
708
+
709
+ if (event.which === 3) {
710
+ return;
711
+ }
712
+
713
+ if ($.support.transform) {
714
+ stage = this.$stage.css('transform').replace(/.*\(|\)| /g, '').split(',');
715
+ stage = {
716
+ x: stage[stage.length === 16 ? 12 : 4],
717
+ y: stage[stage.length === 16 ? 13 : 5]
718
+ };
719
+ } else {
720
+ stage = this.$stage.position();
721
+ stage = {
722
+ x: this.settings.rtl ?
723
+ stage.left + this.$stage.width() - this.width() + this.settings.margin :
724
+ stage.left,
725
+ y: stage.top
726
+ };
727
+ }
728
+
729
+ if (this.is('animating')) {
730
+ $.support.transform ? this.animate(stage.x) : this.$stage.stop()
731
+ this.invalidate('position');
732
+ }
733
+
734
+ this.$element.toggleClass(this.options.grabClass, event.type === 'mousedown');
735
+
736
+ this.speed(0);
737
+
738
+ this._drag.time = new Date().getTime();
739
+ this._drag.target = $(event.target);
740
+ this._drag.stage.start = stage;
741
+ this._drag.stage.current = stage;
742
+ this._drag.pointer = this.pointer(event);
743
+
744
+ $(document).on('mouseup.owl.core touchend.owl.core', $.proxy(this.onDragEnd, this));
745
+
746
+ $(document).one('mousemove.owl.core touchmove.owl.core', $.proxy(function(event) {
747
+ var delta = this.difference(this._drag.pointer, this.pointer(event));
748
+
749
+ $(document).on('mousemove.owl.core touchmove.owl.core', $.proxy(this.onDragMove, this));
750
+
751
+ if (Math.abs(delta.x) < Math.abs(delta.y) && this.is('valid')) {
752
+ return;
753
+ }
754
+
755
+ event.preventDefault();
756
+
757
+ this.enter('dragging');
758
+ this.trigger('drag');
759
+ }, this));
760
+ };
761
+
762
+ /**
763
+ * Handles the `touchmove` and `mousemove` events.
764
+ * @todo #261
765
+ * @protected
766
+ * @param {Event} event - The event arguments.
767
+ */
768
+ Owl.prototype.onDragMove = function(event) {
769
+ var minimum = null,
770
+ maximum = null,
771
+ pull = null,
772
+ delta = this.difference(this._drag.pointer, this.pointer(event)),
773
+ stage = this.difference(this._drag.stage.start, delta);
774
+
775
+ if (!this.is('dragging')) {
776
+ return;
777
+ }
778
+
779
+ event.preventDefault();
780
+
781
+ if (this.settings.loop) {
782
+ minimum = this.coordinates(this.minimum());
783
+ maximum = this.coordinates(this.maximum() + 1) - minimum;
784
+ stage.x = (((stage.x - minimum) % maximum + maximum) % maximum) + minimum;
785
+ } else {
786
+ minimum = this.settings.rtl ? this.coordinates(this.maximum()) : this.coordinates(this.minimum());
787
+ maximum = this.settings.rtl ? this.coordinates(this.minimum()) : this.coordinates(this.maximum());
788
+ pull = this.settings.pullDrag ? -1 * delta.x / 5 : 0;
789
+ stage.x = Math.max(Math.min(stage.x, minimum + pull), maximum + pull);
790
+ }
791
+
792
+ this._drag.stage.current = stage;
793
+
794
+ this.animate(stage.x);
795
+ };
796
+
797
+ /**
798
+ * Handles the `touchend` and `mouseup` events.
799
+ * @todo #261
800
+ * @todo Threshold for click event
801
+ * @protected
802
+ * @param {Event} event - The event arguments.
803
+ */
804
+ Owl.prototype.onDragEnd = function(event) {
805
+ var delta = this.difference(this._drag.pointer, this.pointer(event)),
806
+ stage = this._drag.stage.current,
807
+ direction = delta.x > 0 ^ this.settings.rtl ? 'left' : 'right';
808
+
809
+ $(document).off('.owl.core');
810
+
811
+ this.$element.removeClass(this.options.grabClass);
812
+
813
+ if (delta.x !== 0 && this.is('dragging') || !this.is('valid')) {
814
+ this.speed(this.settings.dragEndSpeed || this.settings.smartSpeed);
815
+ this.current(this.closest(stage.x, delta.x !== 0 ? direction : this._drag.direction));
816
+ this.invalidate('position');
817
+ this.update();
818
+
819
+ this._drag.direction = direction;
820
+
821
+ if (Math.abs(delta.x) > 3 || new Date().getTime() - this._drag.time > 300) {
822
+ this._drag.target.one('click.owl.core', function() { return false; });
823
+ }
824
+ }
825
+
826
+ if (!this.is('dragging')) {
827
+ return;
828
+ }
829
+
830
+ this.leave('dragging');
831
+ this.trigger('dragged');
832
+ };
833
+
834
+ /**
835
+ * Gets absolute position of the closest item for a coordinate.
836
+ * @todo Setting `freeDrag` makes `closest` not reusable. See #165.
837
+ * @protected
838
+ * @param {Number} coordinate - The coordinate in pixel.
839
+ * @param {String} direction - The direction to check for the closest item. Ether `left` or `right`.
840
+ * @return {Number} - The absolute position of the closest item.
841
+ */
842
+ Owl.prototype.closest = function(coordinate, direction) {
843
+ var position = -1,
844
+ pull = 30,
845
+ width = this.width(),
846
+ coordinates = this.coordinates();
847
+
848
+ if (!this.settings.freeDrag) {
849
+ // check closest item
850
+ $.each(coordinates, $.proxy(function(index, value) {
851
+ // on a left pull, check on current index
852
+ if (direction === 'left' && coordinate > value - pull && coordinate < value + pull) {
853
+ position = index;
854
+ // on a right pull, check on previous index
855
+ // to do so, subtract width from value and set position = index + 1
856
+ } else if (direction === 'right' && coordinate > value - width - pull && coordinate < value - width + pull) {
857
+ position = index + 1;
858
+ } else if (this.op(coordinate, '<', value)
859
+ && this.op(coordinate, '>', coordinates[index + 1] || value - width)) {
860
+ position = direction === 'left' ? index + 1 : index;
861
+ }
862
+ return position === -1;
863
+ }, this));
864
+ }
865
+
866
+ if (!this.settings.loop) {
867
+ // non loop boundries
868
+ if (this.op(coordinate, '>', coordinates[this.minimum()])) {
869
+ position = coordinate = this.minimum();
870
+ } else if (this.op(coordinate, '<', coordinates[this.maximum()])) {
871
+ position = coordinate = this.maximum();
872
+ }
873
+ }
874
+
875
+ return position;
876
+ };
877
+
878
+ /**
879
+ * Animates the stage.
880
+ * @todo #270
881
+ * @public
882
+ * @param {Number} coordinate - The coordinate in pixels.
883
+ */
884
+ Owl.prototype.animate = function(coordinate) {
885
+ var animate = this.speed() > 0;
886
+
887
+ this.is('animating') && this.onTransitionEnd();
888
+
889
+ if (animate) {
890
+ this.enter('animating');
891
+ this.trigger('translate');
892
+ }
893
+
894
+ if ($.support.transform3d && $.support.transition) {
895
+ this.$stage.css({
896
+ transform: 'translate3d(' + coordinate + 'px,0px,0px)',
897
+ transition: (this.speed() / 1000) + 's'
898
+ });
899
+ } else if (animate) {
900
+ this.$stage.animate({
901
+ left: coordinate + 'px'
902
+ }, this.speed(), this.settings.fallbackEasing, $.proxy(this.onTransitionEnd, this));
903
+ } else {
904
+ this.$stage.css({
905
+ left: coordinate + 'px'
906
+ });
907
+ }
908
+ };
909
+
910
+ /**
911
+ * Checks whether the carousel is in a specific state or not.
912
+ * @param {String} state - The state to check.
913
+ * @returns {Boolean} - The flag which indicates if the carousel is busy.
914
+ */
915
+ Owl.prototype.is = function(state) {
916
+ return this._states.current[state] && this._states.current[state] > 0;
917
+ };
918
+
919
+ /**
920
+ * Sets the absolute position of the current item.
921
+ * @public
922
+ * @param {Number} [position] - The new absolute position or nothing to leave it unchanged.
923
+ * @returns {Number} - The absolute position of the current item.
924
+ */
925
+ Owl.prototype.current = function(position) {
926
+ if (position === undefined) {
927
+ return this._current;
928
+ }
929
+
930
+ if (this._items.length === 0) {
931
+ return undefined;
932
+ }
933
+
934
+ position = this.normalize(position);
935
+
936
+ if (this._current !== position) {
937
+ var event = this.trigger('change', { property: { name: 'position', value: position } });
938
+
939
+ if (event.data !== undefined) {
940
+ position = this.normalize(event.data);
941
+ }
942
+
943
+ this._current = position;
944
+
945
+ this.invalidate('position');
946
+
947
+ this.trigger('changed', { property: { name: 'position', value: this._current } });
948
+ }
949
+
950
+ return this._current;
951
+ };
952
+
953
+ /**
954
+ * Invalidates the given part of the update routine.
955
+ * @param {String} [part] - The part to invalidate.
956
+ * @returns {Array.<String>} - The invalidated parts.
957
+ */
958
+ Owl.prototype.invalidate = function(part) {
959
+ if ($.type(part) === 'string') {
960
+ this._invalidated[part] = true;
961
+ this.is('valid') && this.leave('valid');
962
+ }
963
+ return $.map(this._invalidated, function(v, i) { return i });
964
+ };
965
+
966
+ /**
967
+ * Resets the absolute position of the current item.
968
+ * @public
969
+ * @param {Number} position - The absolute position of the new item.
970
+ */
971
+ Owl.prototype.reset = function(position) {
972
+ position = this.normalize(position);
973
+
974
+ if (position === undefined) {
975
+ return;
976
+ }
977
+
978
+ this._speed = 0;
979
+ this._current = position;
980
+
981
+ this.suppress([ 'translate', 'translated' ]);
982
+
983
+ this.animate(this.coordinates(position));
984
+
985
+ this.release([ 'translate', 'translated' ]);
986
+ };
987
+
988
+ /**
989
+ * Normalizes an absolute or a relative position of an item.
990
+ * @public
991
+ * @param {Number} position - The absolute or relative position to normalize.
992
+ * @param {Boolean} [relative=false] - Whether the given position is relative or not.
993
+ * @returns {Number} - The normalized position.
994
+ */
995
+ Owl.prototype.normalize = function(position, relative) {
996
+ var n = this._items.length,
997
+ m = relative ? 0 : this._clones.length;
998
+
999
+ if (!this.isNumeric(position) || n < 1) {
1000
+ position = undefined;
1001
+ } else if (position < 0 || position >= n + m) {
1002
+ position = ((position - m / 2) % n + n) % n + m / 2;
1003
+ }
1004
+
1005
+ return position;
1006
+ };
1007
+
1008
+ /**
1009
+ * Converts an absolute position of an item into a relative one.
1010
+ * @public
1011
+ * @param {Number} position - The absolute position to convert.
1012
+ * @returns {Number} - The converted position.
1013
+ */
1014
+ Owl.prototype.relative = function(position) {
1015
+ position -= this._clones.length / 2;
1016
+ return this.normalize(position, true);
1017
+ };
1018
+
1019
+ /**
1020
+ * Gets the maximum position for the current item.
1021
+ * @public
1022
+ * @param {Boolean} [relative=false] - Whether to return an absolute position or a relative position.
1023
+ * @returns {Number}
1024
+ */
1025
+ Owl.prototype.maximum = function(relative) {
1026
+ var settings = this.settings,
1027
+ maximum = this._coordinates.length,
1028
+ iterator,
1029
+ reciprocalItemsWidth,
1030
+ elementWidth;
1031
+
1032
+ if (settings.loop) {
1033
+ maximum = this._clones.length / 2 + this._items.length - 1;
1034
+ } else if (settings.autoWidth || settings.merge) {
1035
+ iterator = this._items.length;
1036
+ reciprocalItemsWidth = this._items[--iterator].width();
1037
+ elementWidth = this.$element.width();
1038
+ while (iterator--) {
1039
+ reciprocalItemsWidth += this._items[iterator].width() + this.settings.margin;
1040
+ if (reciprocalItemsWidth > elementWidth) {
1041
+ break;
1042
+ }
1043
+ }
1044
+ maximum = iterator + 1;
1045
+ } else if (settings.center) {
1046
+ maximum = this._items.length - 1;
1047
+ } else {
1048
+ maximum = this._items.length - settings.items;
1049
+ }
1050
+
1051
+ if (relative) {
1052
+ maximum -= this._clones.length / 2;
1053
+ }
1054
+
1055
+ return Math.max(maximum, 0);
1056
+ };
1057
+
1058
+ /**
1059
+ * Gets the minimum position for the current item.
1060
+ * @public
1061
+ * @param {Boolean} [relative=false] - Whether to return an absolute position or a relative position.
1062
+ * @returns {Number}
1063
+ */
1064
+ Owl.prototype.minimum = function(relative) {
1065
+ return relative ? 0 : this._clones.length / 2;
1066
+ };
1067
+
1068
+ /**
1069
+ * Gets an item at the specified relative position.
1070
+ * @public
1071
+ * @param {Number} [position] - The relative position of the item.
1072
+ * @return {jQuery|Array.<jQuery>} - The item at the given position or all items if no position was given.
1073
+ */
1074
+ Owl.prototype.items = function(position) {
1075
+ if (position === undefined) {
1076
+ return this._items.slice();
1077
+ }
1078
+
1079
+ position = this.normalize(position, true);
1080
+ return this._items[position];
1081
+ };
1082
+
1083
+ /**
1084
+ * Gets an item at the specified relative position.
1085
+ * @public
1086
+ * @param {Number} [position] - The relative position of the item.
1087
+ * @return {jQuery|Array.<jQuery>} - The item at the given position or all items if no position was given.
1088
+ */
1089
+ Owl.prototype.mergers = function(position) {
1090
+ if (position === undefined) {
1091
+ return this._mergers.slice();
1092
+ }
1093
+
1094
+ position = this.normalize(position, true);
1095
+ return this._mergers[position];
1096
+ };
1097
+
1098
+ /**
1099
+ * Gets the absolute positions of clones for an item.
1100
+ * @public
1101
+ * @param {Number} [position] - The relative position of the item.
1102
+ * @returns {Array.<Number>} - The absolute positions of clones for the item or all if no position was given.
1103
+ */
1104
+ Owl.prototype.clones = function(position) {
1105
+ var odd = this._clones.length / 2,
1106
+ even = odd + this._items.length,
1107
+ map = function(index) { return index % 2 === 0 ? even + index / 2 : odd - (index + 1) / 2 };
1108
+
1109
+ if (position === undefined) {
1110
+ return $.map(this._clones, function(v, i) { return map(i) });
1111
+ }
1112
+
1113
+ return $.map(this._clones, function(v, i) { return v === position ? map(i) : null });
1114
+ };
1115
+
1116
+ /**
1117
+ * Sets the current animation speed.
1118
+ * @public
1119
+ * @param {Number} [speed] - The animation speed in milliseconds or nothing to leave it unchanged.
1120
+ * @returns {Number} - The current animation speed in milliseconds.
1121
+ */
1122
+ Owl.prototype.speed = function(speed) {
1123
+ if (speed !== undefined) {
1124
+ this._speed = speed;
1125
+ }
1126
+
1127
+ return this._speed;
1128
+ };
1129
+
1130
+ /**
1131
+ * Gets the coordinate of an item.
1132
+ * @todo The name of this method is missleanding.
1133
+ * @public
1134
+ * @param {Number} position - The absolute position of the item within `minimum()` and `maximum()`.
1135
+ * @returns {Number|Array.<Number>} - The coordinate of the item in pixel or all coordinates.
1136
+ */
1137
+ Owl.prototype.coordinates = function(position) {
1138
+ var multiplier = 1,
1139
+ newPosition = position - 1,
1140
+ coordinate;
1141
+
1142
+ if (position === undefined) {
1143
+ return $.map(this._coordinates, $.proxy(function(coordinate, index) {
1144
+ return this.coordinates(index);
1145
+ }, this));
1146
+ }
1147
+
1148
+ if (this.settings.center) {
1149
+ if (this.settings.rtl) {
1150
+ multiplier = -1;
1151
+ newPosition = position + 1;
1152
+ }
1153
+
1154
+ coordinate = this._coordinates[position];
1155
+ coordinate += (this.width() - coordinate + (this._coordinates[newPosition] || 0)) / 2 * multiplier;
1156
+ } else {
1157
+ coordinate = this._coordinates[newPosition] || 0;
1158
+ }
1159
+
1160
+ coordinate = Math.ceil(coordinate);
1161
+
1162
+ return coordinate;
1163
+ };
1164
+
1165
+ /**
1166
+ * Calculates the speed for a translation.
1167
+ * @protected
1168
+ * @param {Number} from - The absolute position of the start item.
1169
+ * @param {Number} to - The absolute position of the target item.
1170
+ * @param {Number} [factor=undefined] - The time factor in milliseconds.
1171
+ * @returns {Number} - The time in milliseconds for the translation.
1172
+ */
1173
+ Owl.prototype.duration = function(from, to, factor) {
1174
+ if (factor === 0) {
1175
+ return 0;
1176
+ }
1177
+
1178
+ return Math.min(Math.max(Math.abs(to - from), 1), 6) * Math.abs((factor || this.settings.smartSpeed));
1179
+ };
1180
+
1181
+ /**
1182
+ * Slides to the specified item.
1183
+ * @public
1184
+ * @param {Number} position - The position of the item.
1185
+ * @param {Number} [speed] - The time in milliseconds for the transition.
1186
+ */
1187
+ Owl.prototype.to = function(position, speed) {
1188
+ var current = this.current(),
1189
+ revert = null,
1190
+ distance = position - this.relative(current),
1191
+ direction = (distance > 0) - (distance < 0),
1192
+ items = this._items.length,
1193
+ minimum = this.minimum(),
1194
+ maximum = this.maximum();
1195
+
1196
+ if (this.settings.loop) {
1197
+ if (!this.settings.rewind && Math.abs(distance) > items / 2) {
1198
+ distance += direction * -1 * items;
1199
+ }
1200
+
1201
+ position = current + distance;
1202
+ revert = ((position - minimum) % items + items) % items + minimum;
1203
+
1204
+ if (revert !== position && revert - distance <= maximum && revert - distance > 0) {
1205
+ current = revert - distance;
1206
+ position = revert;
1207
+ this.reset(current);
1208
+ }
1209
+ } else if (this.settings.rewind) {
1210
+ maximum += 1;
1211
+ position = (position % maximum + maximum) % maximum;
1212
+ } else {
1213
+ position = Math.max(minimum, Math.min(maximum, position));
1214
+ }
1215
+
1216
+ this.speed(this.duration(current, position, speed));
1217
+ this.current(position);
1218
+
1219
+ if (this.$element.is(':visible')) {
1220
+ this.update();
1221
+ }
1222
+ };
1223
+
1224
+ /**
1225
+ * Slides to the next item.
1226
+ * @public
1227
+ * @param {Number} [speed] - The time in milliseconds for the transition.
1228
+ */
1229
+ Owl.prototype.next = function(speed) {
1230
+ speed = speed || false;
1231
+ this.to(this.relative(this.current()) + 1, speed);
1232
+ };
1233
+
1234
+ /**
1235
+ * Slides to the previous item.
1236
+ * @public
1237
+ * @param {Number} [speed] - The time in milliseconds for the transition.
1238
+ */
1239
+ Owl.prototype.prev = function(speed) {
1240
+ speed = speed || false;
1241
+ this.to(this.relative(this.current()) - 1, speed);
1242
+ };
1243
+
1244
+ /**
1245
+ * Handles the end of an animation.
1246
+ * @protected
1247
+ * @param {Event} event - The event arguments.
1248
+ */
1249
+ Owl.prototype.onTransitionEnd = function(event) {
1250
+
1251
+ // if css2 animation then event object is undefined
1252
+ if (event !== undefined) {
1253
+ event.stopPropagation();
1254
+
1255
+ // Catch only owl-stage transitionEnd event
1256
+ if ((event.target || event.srcElement || event.originalTarget) !== this.$stage.get(0)) {
1257
+ return false;
1258
+ }
1259
+ }
1260
+
1261
+ this.leave('animating');
1262
+ this.trigger('translated');
1263
+ };
1264
+
1265
+ /**
1266
+ * Gets viewport width.
1267
+ * @protected
1268
+ * @return {Number} - The width in pixel.
1269
+ */
1270
+ Owl.prototype.viewport = function() {
1271
+ var width;
1272
+ if (this.options.responsiveBaseElement !== window) {
1273
+ width = $(this.options.responsiveBaseElement).width();
1274
+ } else if (window.innerWidth) {
1275
+ width = window.innerWidth;
1276
+ } else if (document.documentElement && document.documentElement.clientWidth) {
1277
+ width = document.documentElement.clientWidth;
1278
+ } else {
1279
+ console.warn('Can not detect viewport width.');
1280
+ }
1281
+ return width;
1282
+ };
1283
+
1284
+ /**
1285
+ * Replaces the current content.
1286
+ * @public
1287
+ * @param {HTMLElement|jQuery|String} content - The new content.
1288
+ */
1289
+ Owl.prototype.replace = function(content) {
1290
+ this.$stage.empty();
1291
+ this._items = [];
1292
+
1293
+ if (content) {
1294
+ content = (content instanceof jQuery) ? content : $(content);
1295
+ }
1296
+
1297
+ if (this.settings.nestedItemSelector) {
1298
+ content = content.find('.' + this.settings.nestedItemSelector);
1299
+ }
1300
+
1301
+ content.filter(function() {
1302
+ return this.nodeType === 1;
1303
+ }).each($.proxy(function(index, item) {
1304
+ item = this.prepare(item);
1305
+ this.$stage.append(item);
1306
+ this._items.push(item);
1307
+ this._mergers.push(item.find('[data-merge]').addBack('[data-merge]').attr('data-merge') * 1 || 1);
1308
+ }, this));
1309
+
1310
+ this.reset(this.isNumeric(this.settings.startPosition) ? this.settings.startPosition : 0);
1311
+
1312
+ this.invalidate('items');
1313
+ };
1314
+
1315
+ /**
1316
+ * Adds an item.
1317
+ * @todo Use `item` instead of `content` for the event arguments.
1318
+ * @public
1319
+ * @param {HTMLElement|jQuery|String} content - The item content to add.
1320
+ * @param {Number} [position] - The relative position at which to insert the item otherwise the item will be added to the end.
1321
+ */
1322
+ Owl.prototype.add = function(content, position) {
1323
+ var current = this.relative(this._current);
1324
+
1325
+ position = position === undefined ? this._items.length : this.normalize(position, true);
1326
+ content = content instanceof jQuery ? content : $(content);
1327
+
1328
+ this.trigger('add', { content: content, position: position });
1329
+
1330
+ content = this.prepare(content);
1331
+
1332
+ if (this._items.length === 0 || position === this._items.length) {
1333
+ this._items.length === 0 && this.$stage.append(content);
1334
+ this._items.length !== 0 && this._items[position - 1].after(content);
1335
+ this._items.push(content);
1336
+ this._mergers.push(content.find('[data-merge]').addBack('[data-merge]').attr('data-merge') * 1 || 1);
1337
+ } else {
1338
+ this._items[position].before(content);
1339
+ this._items.splice(position, 0, content);
1340
+ this._mergers.splice(position, 0, content.find('[data-merge]').addBack('[data-merge]').attr('data-merge') * 1 || 1);
1341
+ }
1342
+
1343
+ this._items[current] && this.reset(this._items[current].index());
1344
+
1345
+ this.invalidate('items');
1346
+
1347
+ this.trigger('added', { content: content, position: position });
1348
+ };
1349
+
1350
+ /**
1351
+ * Removes an item by its position.
1352
+ * @todo Use `item` instead of `content` for the event arguments.
1353
+ * @public
1354
+ * @param {Number} position - The relative position of the item to remove.
1355
+ */
1356
+ Owl.prototype.remove = function(position) {
1357
+ position = this.normalize(position, true);
1358
+
1359
+ if (position === undefined) {
1360
+ return;
1361
+ }
1362
+
1363
+ this.trigger('remove', { content: this._items[position], position: position });
1364
+
1365
+ this._items[position].remove();
1366
+ this._items.splice(position, 1);
1367
+ this._mergers.splice(position, 1);
1368
+
1369
+ this.invalidate('items');
1370
+
1371
+ this.trigger('removed', { content: null, position: position });
1372
+ };
1373
+
1374
+ /**
1375
+ * Preloads images with auto width.
1376
+ * @todo Replace by a more generic approach
1377
+ * @protected
1378
+ */
1379
+ Owl.prototype.preloadAutoWidthImages = function(images) {
1380
+ images.each($.proxy(function(i, element) {
1381
+ this.enter('pre-loading');
1382
+ element = $(element);
1383
+ $(new Image()).one('load', $.proxy(function(e) {
1384
+ element.attr('src', e.target.src);
1385
+ element.css('opacity', 1);
1386
+ this.leave('pre-loading');
1387
+ !this.is('pre-loading') && !this.is('initializing') && this.refresh();
1388
+ }, this)).attr('src', element.attr('src') || element.attr('data-src') || element.attr('data-src-retina'));
1389
+ }, this));
1390
+ };
1391
+
1392
+ /**
1393
+ * Destroys the carousel.
1394
+ * @public
1395
+ */
1396
+ Owl.prototype.destroy = function() {
1397
+
1398
+ this.$element.off('.owl.core');
1399
+ this.$stage.off('.owl.core');
1400
+ $(document).off('.owl.core');
1401
+
1402
+ if (this.settings.responsive !== false) {
1403
+ window.clearTimeout(this.resizeTimer);
1404
+ this.off(window, 'resize', this._handlers.onThrottledResize);
1405
+ }
1406
+
1407
+ for (var i in this._plugins) {
1408
+ this._plugins[i].destroy();
1409
+ }
1410
+
1411
+ this.$stage.children('.cloned').remove();
1412
+
1413
+ this.$stage.unwrap();
1414
+ this.$stage.children().contents().unwrap();
1415
+ this.$stage.children().unwrap();
1416
+
1417
+ this.$element
1418
+ .removeClass(this.options.refreshClass)
1419
+ .removeClass(this.options.loadingClass)
1420
+ .removeClass(this.options.loadedClass)
1421
+ .removeClass(this.options.rtlClass)
1422
+ .removeClass(this.options.dragClass)
1423
+ .removeClass(this.options.grabClass)
1424
+ .attr('class', this.$element.attr('class').replace(new RegExp(this.options.responsiveClass + '-\\S+\\s', 'g'), ''))
1425
+ .removeData('owl.carousel');
1426
+ };
1427
+
1428
+ /**
1429
+ * Operators to calculate right-to-left and left-to-right.
1430
+ * @protected
1431
+ * @param {Number} [a] - The left side operand.
1432
+ * @param {String} [o] - The operator.
1433
+ * @param {Number} [b] - The right side operand.
1434
+ */
1435
+ Owl.prototype.op = function(a, o, b) {
1436
+ var rtl = this.settings.rtl;
1437
+ switch (o) {
1438
+ case '<':
1439
+ return rtl ? a > b : a < b;
1440
+ case '>':
1441
+ return rtl ? a < b : a > b;
1442
+ case '>=':
1443
+ return rtl ? a <= b : a >= b;
1444
+ case '<=':
1445
+ return rtl ? a >= b : a <= b;
1446
+ default:
1447
+ break;
1448
+ }
1449
+ };
1450
+
1451
+ /**
1452
+ * Attaches to an internal event.
1453
+ * @protected
1454
+ * @param {HTMLElement} element - The event source.
1455
+ * @param {String} event - The event name.
1456
+ * @param {Function} listener - The event handler to attach.
1457
+ * @param {Boolean} capture - Wether the event should be handled at the capturing phase or not.
1458
+ */
1459
+ Owl.prototype.on = function(element, event, listener, capture) {
1460
+ if (element.addEventListener) {
1461
+ element.addEventListener(event, listener, capture);
1462
+ } else if (element.attachEvent) {
1463
+ element.attachEvent('on' + event, listener);
1464
+ }
1465
+ };
1466
+
1467
+ /**
1468
+ * Detaches from an internal event.
1469
+ * @protected
1470
+ * @param {HTMLElement} element - The event source.
1471
+ * @param {String} event - The event name.
1472
+ * @param {Function} listener - The attached event handler to detach.
1473
+ * @param {Boolean} capture - Wether the attached event handler was registered as a capturing listener or not.
1474
+ */
1475
+ Owl.prototype.off = function(element, event, listener, capture) {
1476
+ if (element.removeEventListener) {
1477
+ element.removeEventListener(event, listener, capture);
1478
+ } else if (element.detachEvent) {
1479
+ element.detachEvent('on' + event, listener);
1480
+ }
1481
+ };
1482
+
1483
+ /**
1484
+ * Triggers a public event.
1485
+ * @todo Remove `status`, `relatedTarget` should be used instead.
1486
+ * @protected
1487
+ * @param {String} name - The event name.
1488
+ * @param {*} [data=null] - The event data.
1489
+ * @param {String} [namespace=carousel] - The event namespace.
1490
+ * @param {String} [state] - The state which is associated with the event.
1491
+ * @param {Boolean} [enter=false] - Indicates if the call enters the specified state or not.
1492
+ * @returns {Event} - The event arguments.
1493
+ */
1494
+ Owl.prototype.trigger = function(name, data, namespace, state, enter) {
1495
+ var status = {
1496
+ item: { count: this._items.length, index: this.current() }
1497
+ }, handler = $.camelCase(
1498
+ $.grep([ 'on', name, namespace ], function(v) { return v })
1499
+ .join('-').toLowerCase()
1500
+ ), event = $.Event(
1501
+ [ name, 'owl', namespace || 'carousel' ].join('.').toLowerCase(),
1502
+ $.extend({ relatedTarget: this }, status, data)
1503
+ );
1504
+
1505
+ if (!this._supress[name]) {
1506
+ $.each(this._plugins, function(name, plugin) {
1507
+ if (plugin.onTrigger) {
1508
+ plugin.onTrigger(event);
1509
+ }
1510
+ });
1511
+
1512
+ this.register({ type: Owl.Type.Event, name: name });
1513
+ this.$element.trigger(event);
1514
+
1515
+ if (this.settings && typeof this.settings[handler] === 'function') {
1516
+ this.settings[handler].call(this, event);
1517
+ }
1518
+ }
1519
+
1520
+ return event;
1521
+ };
1522
+
1523
+ /**
1524
+ * Enters a state.
1525
+ * @param name - The state name.
1526
+ */
1527
+ Owl.prototype.enter = function(name) {
1528
+ $.each([ name ].concat(this._states.tags[name] || []), $.proxy(function(i, name) {
1529
+ if (this._states.current[name] === undefined) {
1530
+ this._states.current[name] = 0;
1531
+ }
1532
+
1533
+ this._states.current[name]++;
1534
+ }, this));
1535
+ };
1536
+
1537
+ /**
1538
+ * Leaves a state.
1539
+ * @param name - The state name.
1540
+ */
1541
+ Owl.prototype.leave = function(name) {
1542
+ $.each([ name ].concat(this._states.tags[name] || []), $.proxy(function(i, name) {
1543
+ this._states.current[name]--;
1544
+ }, this));
1545
+ };
1546
+
1547
+ /**
1548
+ * Registers an event or state.
1549
+ * @public
1550
+ * @param {Object} object - The event or state to register.
1551
+ */
1552
+ Owl.prototype.register = function(object) {
1553
+ if (object.type === Owl.Type.Event) {
1554
+ if (!$.event.special[object.name]) {
1555
+ $.event.special[object.name] = {};
1556
+ }
1557
+
1558
+ if (!$.event.special[object.name].owl) {
1559
+ var _default = $.event.special[object.name]._default;
1560
+ $.event.special[object.name]._default = function(e) {
1561
+ if (_default && _default.apply && (!e.namespace || e.namespace.indexOf('owl') === -1)) {
1562
+ return _default.apply(this, arguments);
1563
+ }
1564
+ return e.namespace && e.namespace.indexOf('owl') > -1;
1565
+ };
1566
+ $.event.special[object.name].owl = true;
1567
+ }
1568
+ } else if (object.type === Owl.Type.State) {
1569
+ if (!this._states.tags[object.name]) {
1570
+ this._states.tags[object.name] = object.tags;
1571
+ } else {
1572
+ this._states.tags[object.name] = this._states.tags[object.name].concat(object.tags);
1573
+ }
1574
+
1575
+ this._states.tags[object.name] = $.grep(this._states.tags[object.name], $.proxy(function(tag, i) {
1576
+ return $.inArray(tag, this._states.tags[object.name]) === i;
1577
+ }, this));
1578
+ }
1579
+ };
1580
+
1581
+ /**
1582
+ * Suppresses events.
1583
+ * @protected
1584
+ * @param {Array.<String>} events - The events to suppress.
1585
+ */
1586
+ Owl.prototype.suppress = function(events) {
1587
+ $.each(events, $.proxy(function(index, event) {
1588
+ this._supress[event] = true;
1589
+ }, this));
1590
+ };
1591
+
1592
+ /**
1593
+ * Releases suppressed events.
1594
+ * @protected
1595
+ * @param {Array.<String>} events - The events to release.
1596
+ */
1597
+ Owl.prototype.release = function(events) {
1598
+ $.each(events, $.proxy(function(index, event) {
1599
+ delete this._supress[event];
1600
+ }, this));
1601
+ };
1602
+
1603
+ /**
1604
+ * Gets unified pointer coordinates from event.
1605
+ * @todo #261
1606
+ * @protected
1607
+ * @param {Event} - The `mousedown` or `touchstart` event.
1608
+ * @returns {Object} - Contains `x` and `y` coordinates of current pointer position.
1609
+ */
1610
+ Owl.prototype.pointer = function(event) {
1611
+ var result = { x: null, y: null };
1612
+
1613
+ event = event.originalEvent || event || window.event;
1614
+
1615
+ event = event.touches && event.touches.length ?
1616
+ event.touches[0] : event.changedTouches && event.changedTouches.length ?
1617
+ event.changedTouches[0] : event;
1618
+
1619
+ if (event.pageX) {
1620
+ result.x = event.pageX;
1621
+ result.y = event.pageY;
1622
+ } else {
1623
+ result.x = event.clientX;
1624
+ result.y = event.clientY;
1625
+ }
1626
+
1627
+ return result;
1628
+ };
1629
+
1630
+ /**
1631
+ * Determines if the input is a Number or something that can be coerced to a Number
1632
+ * @protected
1633
+ * @param {Number|String|Object|Array|Boolean|RegExp|Function|Symbol} - The input to be tested
1634
+ * @returns {Boolean} - An indication if the input is a Number or can be coerced to a Number
1635
+ */
1636
+ Owl.prototype.isNumeric = function(number) {
1637
+ return !isNaN(parseFloat(number));
1638
+ };
1639
+
1640
+ /**
1641
+ * Gets the difference of two vectors.
1642
+ * @todo #261
1643
+ * @protected
1644
+ * @param {Object} - The first vector.
1645
+ * @param {Object} - The second vector.
1646
+ * @returns {Object} - The difference.
1647
+ */
1648
+ Owl.prototype.difference = function(first, second) {
1649
+ return {
1650
+ x: first.x - second.x,
1651
+ y: first.y - second.y
1652
+ };
1653
+ };
1654
+
1655
+ /**
1656
+ * The jQuery Plugin for the Owl Carousel
1657
+ * @todo Navigation plugin `next` and `prev`
1658
+ * @public
1659
+ */
1660
+ $.fn.owlCarousel = function(option) {
1661
+ var args = Array.prototype.slice.call(arguments, 1);
1662
+
1663
+ return this.each(function() {
1664
+ var $this = $(this),
1665
+ data = $this.data('owl.carousel');
1666
+
1667
+ if (!data) {
1668
+ data = new Owl(this, typeof option == 'object' && option);
1669
+ $this.data('owl.carousel', data);
1670
+
1671
+ $.each([
1672
+ 'next', 'prev', 'to', 'destroy', 'refresh', 'replace', 'add', 'remove'
1673
+ ], function(i, event) {
1674
+ data.register({ type: Owl.Type.Event, name: event });
1675
+ data.$element.on(event + '.owl.carousel.core', $.proxy(function(e) {
1676
+ if (e.namespace && e.relatedTarget !== this) {
1677
+ this.suppress([ event ]);
1678
+ data[event].apply(this, [].slice.call(arguments, 1));
1679
+ this.release([ event ]);
1680
+ }
1681
+ }, data));
1682
+ });
1683
+ }
1684
+
1685
+ if (typeof option == 'string' && option.charAt(0) !== '_') {
1686
+ data[option].apply(data, args);
1687
+ }
1688
+ });
1689
+ };
1690
+
1691
+ /**
1692
+ * The constructor for the jQuery Plugin
1693
+ * @public
1694
+ */
1695
+ $.fn.owlCarousel.Constructor = Owl;
1696
+
1697
+ })(window.Zepto || window.jQuery, window, document);
1698
+
1699
+ /**
1700
+ * AutoRefresh Plugin
1701
+ * @version 2.1.0
1702
+ * @author Artus Kolanowski
1703
+ * @author David Deutsch
1704
+ * @license The MIT License (MIT)
1705
+ */
1706
+ ;(function($, window, document, undefined) {
1707
+
1708
+ /**
1709
+ * Creates the auto refresh plugin.
1710
+ * @class The Auto Refresh Plugin
1711
+ * @param {Owl} carousel - The Owl Carousel
1712
+ */
1713
+ var AutoRefresh = function(carousel) {
1714
+ /**
1715
+ * Reference to the core.
1716
+ * @protected
1717
+ * @type {Owl}
1718
+ */
1719
+ this._core = carousel;
1720
+
1721
+ /**
1722
+ * Refresh interval.
1723
+ * @protected
1724
+ * @type {number}
1725
+ */
1726
+ this._interval = null;
1727
+
1728
+ /**
1729
+ * Whether the element is currently visible or not.
1730
+ * @protected
1731
+ * @type {Boolean}
1732
+ */
1733
+ this._visible = null;
1734
+
1735
+ /**
1736
+ * All event handlers.
1737
+ * @protected
1738
+ * @type {Object}
1739
+ */
1740
+ this._handlers = {
1741
+ 'initialized.owl.carousel': $.proxy(function(e) {
1742
+ if (e.namespace && this._core.settings.autoRefresh) {
1743
+ this.watch();
1744
+ }
1745
+ }, this)
1746
+ };
1747
+
1748
+ // set default options
1749
+ this._core.options = $.extend({}, AutoRefresh.Defaults, this._core.options);
1750
+
1751
+ // register event handlers
1752
+ this._core.$element.on(this._handlers);
1753
+ };
1754
+
1755
+ /**
1756
+ * Default options.
1757
+ * @public
1758
+ */
1759
+ AutoRefresh.Defaults = {
1760
+ autoRefresh: true,
1761
+ autoRefreshInterval: 500
1762
+ };
1763
+
1764
+ /**
1765
+ * Watches the element.
1766
+ */
1767
+ AutoRefresh.prototype.watch = function() {
1768
+ if (this._interval) {
1769
+ return;
1770
+ }
1771
+
1772
+ this._visible = this._core.$element.is(':visible');
1773
+ this._interval = window.setInterval($.proxy(this.refresh, this), this._core.settings.autoRefreshInterval);
1774
+ };
1775
+
1776
+ /**
1777
+ * Refreshes the element.
1778
+ */
1779
+ AutoRefresh.prototype.refresh = function() {
1780
+ if (this._core.$element.is(':visible') === this._visible) {
1781
+ return;
1782
+ }
1783
+
1784
+ this._visible = !this._visible;
1785
+
1786
+ this._core.$element.toggleClass('owl-hidden', !this._visible);
1787
+
1788
+ this._visible && (this._core.invalidate('width') && this._core.refresh());
1789
+ };
1790
+
1791
+ /**
1792
+ * Destroys the plugin.
1793
+ */
1794
+ AutoRefresh.prototype.destroy = function() {
1795
+ var handler, property;
1796
+
1797
+ window.clearInterval(this._interval);
1798
+
1799
+ for (handler in this._handlers) {
1800
+ this._core.$element.off(handler, this._handlers[handler]);
1801
+ }
1802
+ for (property in Object.getOwnPropertyNames(this)) {
1803
+ typeof this[property] != 'function' && (this[property] = null);
1804
+ }
1805
+ };
1806
+
1807
+ $.fn.owlCarousel.Constructor.Plugins.AutoRefresh = AutoRefresh;
1808
+
1809
+ })(window.Zepto || window.jQuery, window, document);
1810
+
1811
+ /**
1812
+ * Lazy Plugin
1813
+ * @version 2.1.0
1814
+ * @author Bartosz Wojciechowski
1815
+ * @author David Deutsch
1816
+ * @license The MIT License (MIT)
1817
+ */
1818
+ ;(function($, window, document, undefined) {
1819
+
1820
+ /**
1821
+ * Creates the lazy plugin.
1822
+ * @class The Lazy Plugin
1823
+ * @param {Owl} carousel - The Owl Carousel
1824
+ */
1825
+ var Lazy = function(carousel) {
1826
+
1827
+ /**
1828
+ * Reference to the core.
1829
+ * @protected
1830
+ * @type {Owl}
1831
+ */
1832
+ this._core = carousel;
1833
+
1834
+ /**
1835
+ * Already loaded items.
1836
+ * @protected
1837
+ * @type {Array.<jQuery>}
1838
+ */
1839
+ this._loaded = [];
1840
+
1841
+ /**
1842
+ * Event handlers.
1843
+ * @protected
1844
+ * @type {Object}
1845
+ */
1846
+ this._handlers = {
1847
+ 'initialized.owl.carousel change.owl.carousel resized.owl.carousel': $.proxy(function(e) {
1848
+ if (!e.namespace) {
1849
+ return;
1850
+ }
1851
+
1852
+ if (!this._core.settings || !this._core.settings.lazyLoad) {
1853
+ return;
1854
+ }
1855
+
1856
+ if ((e.property && e.property.name == 'position') || e.type == 'initialized') {
1857
+ var settings = this._core.settings,
1858
+ n = (settings.center && Math.ceil(settings.items / 2) || settings.items),
1859
+ i = ((settings.center && n * -1) || 0),
1860
+ position = (e.property && e.property.value !== undefined ? e.property.value : this._core.current()) + i,
1861
+ clones = this._core.clones().length,
1862
+ load = $.proxy(function(i, v) { this.load(v) }, this);
1863
+
1864
+ while (i++ < n) {
1865
+ this.load(clones / 2 + this._core.relative(position));
1866
+ clones && $.each(this._core.clones(this._core.relative(position)), load);
1867
+ position++;
1868
+ }
1869
+ }
1870
+ }, this)
1871
+ };
1872
+
1873
+ // set the default options
1874
+ this._core.options = $.extend({}, Lazy.Defaults, this._core.options);
1875
+
1876
+ // register event handler
1877
+ this._core.$element.on(this._handlers);
1878
+ };
1879
+
1880
+ /**
1881
+ * Default options.
1882
+ * @public
1883
+ */
1884
+ Lazy.Defaults = {
1885
+ lazyLoad: false
1886
+ };
1887
+
1888
+ /**
1889
+ * Loads all resources of an item at the specified position.
1890
+ * @param {Number} position - The absolute position of the item.
1891
+ * @protected
1892
+ */
1893
+ Lazy.prototype.load = function(position) {
1894
+ var $item = this._core.$stage.children().eq(position),
1895
+ $elements = $item && $item.find('.owl-lazy');
1896
+
1897
+ if (!$elements || $.inArray($item.get(0), this._loaded) > -1) {
1898
+ return;
1899
+ }
1900
+
1901
+ $elements.each($.proxy(function(index, element) {
1902
+ var $element = $(element), image,
1903
+ url = (window.devicePixelRatio > 1 && $element.attr('data-src-retina')) || $element.attr('data-src');
1904
+
1905
+ this._core.trigger('load', { element: $element, url: url }, 'lazy');
1906
+
1907
+ if ($element.is('img')) {
1908
+ $element.one('load.owl.lazy', $.proxy(function() {
1909
+ $element.css('opacity', 1);
1910
+ this._core.trigger('loaded', { element: $element, url: url }, 'lazy');
1911
+ }, this)).attr('src', url);
1912
+ } else {
1913
+ image = new Image();
1914
+ image.onload = $.proxy(function() {
1915
+ $element.css({
1916
+ 'background-image': 'url("' + url + '")',
1917
+ 'opacity': '1'
1918
+ });
1919
+ this._core.trigger('loaded', { element: $element, url: url }, 'lazy');
1920
+ }, this);
1921
+ image.src = url;
1922
+ }
1923
+ }, this));
1924
+
1925
+ this._loaded.push($item.get(0));
1926
+ };
1927
+
1928
+ /**
1929
+ * Destroys the plugin.
1930
+ * @public
1931
+ */
1932
+ Lazy.prototype.destroy = function() {
1933
+ var handler, property;
1934
+
1935
+ for (handler in this.handlers) {
1936
+ this._core.$element.off(handler, this.handlers[handler]);
1937
+ }
1938
+ for (property in Object.getOwnPropertyNames(this)) {
1939
+ typeof this[property] != 'function' && (this[property] = null);
1940
+ }
1941
+ };
1942
+
1943
+ $.fn.owlCarousel.Constructor.Plugins.Lazy = Lazy;
1944
+
1945
+ })(window.Zepto || window.jQuery, window, document);
1946
+
1947
+ /**
1948
+ * AutoHeight Plugin
1949
+ * @version 2.1.0
1950
+ * @author Bartosz Wojciechowski
1951
+ * @author David Deutsch
1952
+ * @license The MIT License (MIT)
1953
+ */
1954
+ ;(function($, window, document, undefined) {
1955
+
1956
+ /**
1957
+ * Creates the auto height plugin.
1958
+ * @class The Auto Height Plugin
1959
+ * @param {Owl} carousel - The Owl Carousel
1960
+ */
1961
+ var AutoHeight = function(carousel) {
1962
+ /**
1963
+ * Reference to the core.
1964
+ * @protected
1965
+ * @type {Owl}
1966
+ */
1967
+ this._core = carousel;
1968
+
1969
+ /**
1970
+ * All event handlers.
1971
+ * @protected
1972
+ * @type {Object}
1973
+ */
1974
+ this._handlers = {
1975
+ 'initialized.owl.carousel refreshed.owl.carousel': $.proxy(function(e) {
1976
+ if (e.namespace && this._core.settings.autoHeight) {
1977
+ this.update();
1978
+ }
1979
+ }, this),
1980
+ 'changed.owl.carousel': $.proxy(function(e) {
1981
+ if (e.namespace && this._core.settings.autoHeight && e.property.name == 'position'){
1982
+ this.update();
1983
+ }
1984
+ }, this),
1985
+ 'loaded.owl.lazy': $.proxy(function(e) {
1986
+ if (e.namespace && this._core.settings.autoHeight
1987
+ && e.element.closest('.' + this._core.settings.itemClass).index() === this._core.current()) {
1988
+ this.update();
1989
+ }
1990
+ }, this)
1991
+ };
1992
+
1993
+ // set default options
1994
+ this._core.options = $.extend({}, AutoHeight.Defaults, this._core.options);
1995
+
1996
+ // register event handlers
1997
+ this._core.$element.on(this._handlers);
1998
+ };
1999
+
2000
+ /**
2001
+ * Default options.
2002
+ * @public
2003
+ */
2004
+ AutoHeight.Defaults = {
2005
+ autoHeight: false,
2006
+ autoHeightClass: 'owl-height'
2007
+ };
2008
+
2009
+ /**
2010
+ * Updates the view.
2011
+ */
2012
+ AutoHeight.prototype.update = function() {
2013
+ var start = this._core._current,
2014
+ end = start + this._core.settings.items,
2015
+ visible = this._core.$stage.children().toArray().slice(start, end),
2016
+ heights = [],
2017
+ maxheight = 0;
2018
+
2019
+ $.each(visible, function(index, item) {
2020
+ heights.push($(item).height());
2021
+ });
2022
+
2023
+ maxheight = Math.max.apply(null, heights);
2024
+
2025
+ this._core.$stage.parent()
2026
+ .height(maxheight)
2027
+ .addClass(this._core.settings.autoHeightClass);
2028
+ };
2029
+
2030
+ AutoHeight.prototype.destroy = function() {
2031
+ var handler, property;
2032
+
2033
+ for (handler in this._handlers) {
2034
+ this._core.$element.off(handler, this._handlers[handler]);
2035
+ }
2036
+ for (property in Object.getOwnPropertyNames(this)) {
2037
+ typeof this[property] != 'function' && (this[property] = null);
2038
+ }
2039
+ };
2040
+
2041
+ $.fn.owlCarousel.Constructor.Plugins.AutoHeight = AutoHeight;
2042
+
2043
+ })(window.Zepto || window.jQuery, window, document);
2044
+
2045
+ /**
2046
+ * Video Plugin
2047
+ * @version 2.1.0
2048
+ * @author Bartosz Wojciechowski
2049
+ * @author David Deutsch
2050
+ * @license The MIT License (MIT)
2051
+ */
2052
+ ;(function($, window, document, undefined) {
2053
+
2054
+ /**
2055
+ * Creates the video plugin.
2056
+ * @class The Video Plugin
2057
+ * @param {Owl} carousel - The Owl Carousel
2058
+ */
2059
+ var Video = function(carousel) {
2060
+ /**
2061
+ * Reference to the core.
2062
+ * @protected
2063
+ * @type {Owl}
2064
+ */
2065
+ this._core = carousel;
2066
+
2067
+ /**
2068
+ * Cache all video URLs.
2069
+ * @protected
2070
+ * @type {Object}
2071
+ */
2072
+ this._videos = {};
2073
+
2074
+ /**
2075
+ * Current playing item.
2076
+ * @protected
2077
+ * @type {jQuery}
2078
+ */
2079
+ this._playing = null;
2080
+
2081
+ /**
2082
+ * All event handlers.
2083
+ * @todo The cloned content removale is too late
2084
+ * @protected
2085
+ * @type {Object}
2086
+ */
2087
+ this._handlers = {
2088
+ 'initialized.owl.carousel': $.proxy(function(e) {
2089
+ if (e.namespace) {
2090
+ this._core.register({ type: 'state', name: 'playing', tags: [ 'interacting' ] });
2091
+ }
2092
+ }, this),
2093
+ 'resize.owl.carousel': $.proxy(function(e) {
2094
+ if (e.namespace && this._core.settings.video && this.isInFullScreen()) {
2095
+ e.preventDefault();
2096
+ }
2097
+ }, this),
2098
+ 'refreshed.owl.carousel': $.proxy(function(e) {
2099
+ if (e.namespace && this._core.is('resizing')) {
2100
+ this._core.$stage.find('.cloned .owl-video-frame').remove();
2101
+ }
2102
+ }, this),
2103
+ 'changed.owl.carousel': $.proxy(function(e) {
2104
+ if (e.namespace && e.property.name === 'position' && this._playing) {
2105
+ this.stop();
2106
+ }
2107
+ }, this),
2108
+ 'prepared.owl.carousel': $.proxy(function(e) {
2109
+ if (!e.namespace) {
2110
+ return;
2111
+ }
2112
+
2113
+ var $element = $(e.content).find('.owl-video');
2114
+
2115
+ if ($element.length) {
2116
+ $element.css('display', 'none');
2117
+ this.fetch($element, $(e.content));
2118
+ }
2119
+ }, this)
2120
+ };
2121
+
2122
+ // set default options
2123
+ this._core.options = $.extend({}, Video.Defaults, this._core.options);
2124
+
2125
+ // register event handlers
2126
+ this._core.$element.on(this._handlers);
2127
+
2128
+ this._core.$element.on('click.owl.video', '.owl-video-play-icon', $.proxy(function(e) {
2129
+ this.play(e);
2130
+ }, this));
2131
+ };
2132
+
2133
+ /**
2134
+ * Default options.
2135
+ * @public
2136
+ */
2137
+ Video.Defaults = {
2138
+ video: false,
2139
+ videoHeight: false,
2140
+ videoWidth: false
2141
+ };
2142
+
2143
+ /**
2144
+ * Gets the video ID and the type (YouTube/Vimeo/vzaar only).
2145
+ * @protected
2146
+ * @param {jQuery} target - The target containing the video data.
2147
+ * @param {jQuery} item - The item containing the video.
2148
+ */
2149
+ Video.prototype.fetch = function(target, item) {
2150
+ var type = (function() {
2151
+ if (target.attr('data-vimeo-id')) {
2152
+ return 'vimeo';
2153
+ } else if (target.attr('data-vzaar-id')) {
2154
+ return 'vzaar'
2155
+ } else {
2156
+ return 'youtube';
2157
+ }
2158
+ })(),
2159
+ id = target.attr('data-vimeo-id') || target.attr('data-youtube-id') || target.attr('data-vzaar-id'),
2160
+ width = target.attr('data-width') || this._core.settings.videoWidth,
2161
+ height = target.attr('data-height') || this._core.settings.videoHeight,
2162
+ url = target.attr('href');
2163
+
2164
+ if (url) {
2165
+
2166
+ /*
2167
+ Parses the id's out of the following urls (and probably more):
2168
+ https://www.youtube.com/watch?v=:id
2169
+ https://youtu.be/:id
2170
+ https://vimeo.com/:id
2171
+ https://vimeo.com/channels/:channel/:id
2172
+ https://vimeo.com/groups/:group/videos/:id
2173
+ https://app.vzaar.com/videos/:id
2174
+
2175
+ Visual example: https://regexper.com/#(http%3A%7Chttps%3A%7C)%5C%2F%5C%2F(player.%7Cwww.%7Capp.)%3F(vimeo%5C.com%7Cyoutu(be%5C.com%7C%5C.be%7Cbe%5C.googleapis%5C.com)%7Cvzaar%5C.com)%5C%2F(video%5C%2F%7Cvideos%5C%2F%7Cembed%5C%2F%7Cchannels%5C%2F.%2B%5C%2F%7Cgroups%5C%2F.%2B%5C%2F%7Cwatch%5C%3Fv%3D%7Cv%5C%2F)%3F(%5BA-Za-z0-9._%25-%5D*)(%5C%26%5CS%2B)%3F
2176
+ */
2177
+
2178
+ id = url.match(/(http:|https:|)\/\/(player.|www.|app.)?(vimeo\.com|youtu(be\.com|\.be|be\.googleapis\.com)|vzaar\.com)\/(video\/|videos\/|embed\/|channels\/.+\/|groups\/.+\/|watch\?v=|v\/)?([A-Za-z0-9._%-]*)(\&\S+)?/);
2179
+
2180
+ if (id[3].indexOf('youtu') > -1) {
2181
+ type = 'youtube';
2182
+ } else if (id[3].indexOf('vimeo') > -1) {
2183
+ type = 'vimeo';
2184
+ } else if (id[3].indexOf('vzaar') > -1) {
2185
+ type = 'vzaar';
2186
+ } else {
2187
+ throw new Error('Video URL not supported.');
2188
+ }
2189
+ id = id[6];
2190
+ } else {
2191
+ throw new Error('Missing video URL.');
2192
+ }
2193
+
2194
+ this._videos[url] = {
2195
+ type: type,
2196
+ id: id,
2197
+ width: width,
2198
+ height: height
2199
+ };
2200
+
2201
+ item.attr('data-video', url);
2202
+
2203
+ this.thumbnail(target, this._videos[url]);
2204
+ };
2205
+
2206
+ /**
2207
+ * Creates video thumbnail.
2208
+ * @protected
2209
+ * @param {jQuery} target - The target containing the video data.
2210
+ * @param {Object} info - The video info object.
2211
+ * @see `fetch`
2212
+ */
2213
+ Video.prototype.thumbnail = function(target, video) {
2214
+ var tnLink,
2215
+ icon,
2216
+ path,
2217
+ dimensions = video.width && video.height ? 'style="width:' + video.width + 'px;height:' + video.height + 'px;"' : '',
2218
+ customTn = target.find('img'),
2219
+ srcType = 'src',
2220
+ lazyClass = '',
2221
+ settings = this._core.settings,
2222
+ create = function(path) {
2223
+ icon = '<div class="owl-video-play-icon"></div>';
2224
+
2225
+ if (settings.lazyLoad) {
2226
+ tnLink = '<div class="owl-video-tn ' + lazyClass + '" ' + srcType + '="' + path + '"></div>';
2227
+ } else {
2228
+ tnLink = '<div class="owl-video-tn" style="opacity:1;background-image:url(' + path + ')"></div>';
2229
+ }
2230
+ target.after(tnLink);
2231
+ target.after(icon);
2232
+ };
2233
+
2234
+ // wrap video content into owl-video-wrapper div
2235
+ target.wrap('<div class="owl-video-wrapper"' + dimensions + '></div>');
2236
+
2237
+ if (this._core.settings.lazyLoad) {
2238
+ srcType = 'data-src';
2239
+ lazyClass = 'owl-lazy';
2240
+ }
2241
+
2242
+ // custom thumbnail
2243
+ if (customTn.length) {
2244
+ create(customTn.attr(srcType));
2245
+ customTn.remove();
2246
+ return false;
2247
+ }
2248
+
2249
+ if (video.type === 'youtube') {
2250
+ path = "//img.youtube.com/vi/" + video.id + "/hqdefault.jpg";
2251
+ create(path);
2252
+ } else if (video.type === 'vimeo') {
2253
+ $.ajax({
2254
+ type: 'GET',
2255
+ url: '//vimeo.com/api/v2/video/' + video.id + '.json',
2256
+ jsonp: 'callback',
2257
+ dataType: 'jsonp',
2258
+ success: function(data) {
2259
+ path = data[0].thumbnail_large;
2260
+ create(path);
2261
+ }
2262
+ });
2263
+ } else if (video.type === 'vzaar') {
2264
+ $.ajax({
2265
+ type: 'GET',
2266
+ url: '//vzaar.com/api/videos/' + video.id + '.json',
2267
+ jsonp: 'callback',
2268
+ dataType: 'jsonp',
2269
+ success: function(data) {
2270
+ path = data.framegrab_url;
2271
+ create(path);
2272
+ }
2273
+ });
2274
+ }
2275
+ };
2276
+
2277
+ /**
2278
+ * Stops the current video.
2279
+ * @public
2280
+ */
2281
+ Video.prototype.stop = function() {
2282
+ this._core.trigger('stop', null, 'video');
2283
+ this._playing.find('.owl-video-frame').remove();
2284
+ this._playing.removeClass('owl-video-playing');
2285
+ this._playing = null;
2286
+ this._core.leave('playing');
2287
+ this._core.trigger('stopped', null, 'video');
2288
+ };
2289
+
2290
+ /**
2291
+ * Starts the current video.
2292
+ * @public
2293
+ * @param {Event} event - The event arguments.
2294
+ */
2295
+ Video.prototype.play = function(event) {
2296
+ var target = $(event.target),
2297
+ item = target.closest('.' + this._core.settings.itemClass),
2298
+ video = this._videos[item.attr('data-video')],
2299
+ width = video.width || '100%',
2300
+ height = video.height || this._core.$stage.height(),
2301
+ html;
2302
+
2303
+ if (this._playing) {
2304
+ return;
2305
+ }
2306
+
2307
+ this._core.enter('playing');
2308
+ this._core.trigger('play', null, 'video');
2309
+
2310
+ item = this._core.items(this._core.relative(item.index()));
2311
+
2312
+ this._core.reset(item.index());
2313
+
2314
+ if (video.type === 'youtube') {
2315
+ html = '<iframe width="' + width + '" height="' + height + '" src="//www.youtube.com/embed/' +
2316
+ video.id + '?autoplay=1&rel=0&v=' + video.id + '" frameborder="0" allowfullscreen></iframe>';
2317
+ } else if (video.type === 'vimeo') {
2318
+ html = '<iframe src="//player.vimeo.com/video/' + video.id +
2319
+ '?autoplay=1" width="' + width + '" height="' + height +
2320
+ '" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>';
2321
+ } else if (video.type === 'vzaar') {
2322
+ html = '<iframe frameborder="0"' + 'height="' + height + '"' + 'width="' + width +
2323
+ '" allowfullscreen mozallowfullscreen webkitAllowFullScreen ' +
2324
+ 'src="//view.vzaar.com/' + video.id + '/player?autoplay=true"></iframe>';
2325
+ }
2326
+
2327
+ $('<div class="owl-video-frame">' + html + '</div>').insertAfter(item.find('.owl-video'));
2328
+
2329
+ this._playing = item.addClass('owl-video-playing');
2330
+ };
2331
+
2332
+ /**
2333
+ * Checks whether an video is currently in full screen mode or not.
2334
+ * @todo Bad style because looks like a readonly method but changes members.
2335
+ * @protected
2336
+ * @returns {Boolean}
2337
+ */
2338
+ Video.prototype.isInFullScreen = function() {
2339
+ var element = document.fullscreenElement || document.mozFullScreenElement ||
2340
+ document.webkitFullscreenElement;
2341
+
2342
+ return element && $(element).parent().hasClass('owl-video-frame');
2343
+ };
2344
+
2345
+ /**
2346
+ * Destroys the plugin.
2347
+ */
2348
+ Video.prototype.destroy = function() {
2349
+ var handler, property;
2350
+
2351
+ this._core.$element.off('click.owl.video');
2352
+
2353
+ for (handler in this._handlers) {
2354
+ this._core.$element.off(handler, this._handlers[handler]);
2355
+ }
2356
+ for (property in Object.getOwnPropertyNames(this)) {
2357
+ typeof this[property] != 'function' && (this[property] = null);
2358
+ }
2359
+ };
2360
+
2361
+ $.fn.owlCarousel.Constructor.Plugins.Video = Video;
2362
+
2363
+ })(window.Zepto || window.jQuery, window, document);
2364
+
2365
+ /**
2366
+ * Animate Plugin
2367
+ * @version 2.1.0
2368
+ * @author Bartosz Wojciechowski
2369
+ * @author David Deutsch
2370
+ * @license The MIT License (MIT)
2371
+ */
2372
+ ;(function($, window, document, undefined) {
2373
+
2374
+ /**
2375
+ * Creates the animate plugin.
2376
+ * @class The Navigation Plugin
2377
+ * @param {Owl} scope - The Owl Carousel
2378
+ */
2379
+ var Animate = function(scope) {
2380
+ this.core = scope;
2381
+ this.core.options = $.extend({}, Animate.Defaults, this.core.options);
2382
+ this.swapping = true;
2383
+ this.previous = undefined;
2384
+ this.next = undefined;
2385
+
2386
+ this.handlers = {
2387
+ 'change.owl.carousel': $.proxy(function(e) {
2388
+ if (e.namespace && e.property.name == 'position') {
2389
+ this.previous = this.core.current();
2390
+ this.next = e.property.value;
2391
+ }
2392
+ }, this),
2393
+ 'drag.owl.carousel dragged.owl.carousel translated.owl.carousel': $.proxy(function(e) {
2394
+ if (e.namespace) {
2395
+ this.swapping = e.type == 'translated';
2396
+ }
2397
+ }, this),
2398
+ 'translate.owl.carousel': $.proxy(function(e) {
2399
+ if (e.namespace && this.swapping && (this.core.options.animateOut || this.core.options.animateIn)) {
2400
+ this.swap();
2401
+ }
2402
+ }, this)
2403
+ };
2404
+
2405
+ this.core.$element.on(this.handlers);
2406
+ };
2407
+
2408
+ /**
2409
+ * Default options.
2410
+ * @public
2411
+ */
2412
+ Animate.Defaults = {
2413
+ animateOut: false,
2414
+ animateIn: false
2415
+ };
2416
+
2417
+ /**
2418
+ * Toggles the animation classes whenever an translations starts.
2419
+ * @protected
2420
+ * @returns {Boolean|undefined}
2421
+ */
2422
+ Animate.prototype.swap = function() {
2423
+
2424
+ if (this.core.settings.items !== 1) {
2425
+ return;
2426
+ }
2427
+
2428
+ if (!$.support.animation || !$.support.transition) {
2429
+ return;
2430
+ }
2431
+
2432
+ this.core.speed(0);
2433
+
2434
+ var left,
2435
+ clear = $.proxy(this.clear, this),
2436
+ previous = this.core.$stage.children().eq(this.previous),
2437
+ next = this.core.$stage.children().eq(this.next),
2438
+ incoming = this.core.settings.animateIn,
2439
+ outgoing = this.core.settings.animateOut;
2440
+
2441
+ if (this.core.current() === this.previous) {
2442
+ return;
2443
+ }
2444
+
2445
+ if (outgoing) {
2446
+ left = this.core.coordinates(this.previous) - this.core.coordinates(this.next);
2447
+ previous.one($.support.animation.end, clear)
2448
+ .css( { 'left': left + 'px' } )
2449
+ .addClass('animated owl-animated-out')
2450
+ .addClass(outgoing);
2451
+ }
2452
+
2453
+ if (incoming) {
2454
+ next.one($.support.animation.end, clear)
2455
+ .addClass('animated owl-animated-in')
2456
+ .addClass(incoming);
2457
+ }
2458
+ };
2459
+
2460
+ Animate.prototype.clear = function(e) {
2461
+ $(e.target).css( { 'left': '' } )
2462
+ .removeClass('animated owl-animated-out owl-animated-in')
2463
+ .removeClass(this.core.settings.animateIn)
2464
+ .removeClass(this.core.settings.animateOut);
2465
+ this.core.onTransitionEnd();
2466
+ };
2467
+
2468
+ /**
2469
+ * Destroys the plugin.
2470
+ * @public
2471
+ */
2472
+ Animate.prototype.destroy = function() {
2473
+ var handler, property;
2474
+
2475
+ for (handler in this.handlers) {
2476
+ this.core.$element.off(handler, this.handlers[handler]);
2477
+ }
2478
+ for (property in Object.getOwnPropertyNames(this)) {
2479
+ typeof this[property] != 'function' && (this[property] = null);
2480
+ }
2481
+ };
2482
+
2483
+ $.fn.owlCarousel.Constructor.Plugins.Animate = Animate;
2484
+
2485
+ })(window.Zepto || window.jQuery, window, document);
2486
+
2487
+ /**
2488
+ * Autoplay Plugin
2489
+ * @version 2.1.0
2490
+ * @author Bartosz Wojciechowski
2491
+ * @author Artus Kolanowski
2492
+ * @author David Deutsch
2493
+ * @license The MIT License (MIT)
2494
+ */
2495
+ ;(function($, window, document, undefined) {
2496
+
2497
+ /**
2498
+ * Creates the autoplay plugin.
2499
+ * @class The Autoplay Plugin
2500
+ * @param {Owl} scope - The Owl Carousel
2501
+ */
2502
+ var Autoplay = function(carousel) {
2503
+ /**
2504
+ * Reference to the core.
2505
+ * @protected
2506
+ * @type {Owl}
2507
+ */
2508
+ this._core = carousel;
2509
+
2510
+ /**
2511
+ * The autoplay timeout.
2512
+ * @type {Timeout}
2513
+ */
2514
+ this._timeout = null;
2515
+
2516
+ /**
2517
+ * Indicates whenever the autoplay is paused.
2518
+ * @type {Boolean}
2519
+ */
2520
+ this._paused = false;
2521
+
2522
+ /**
2523
+ * All event handlers.
2524
+ * @protected
2525
+ * @type {Object}
2526
+ */
2527
+ this._handlers = {
2528
+ 'changed.owl.carousel': $.proxy(function(e) {
2529
+ if (e.namespace && e.property.name === 'settings') {
2530
+ if (this._core.settings.autoplay) {
2531
+ this.play();
2532
+ } else {
2533
+ this.stop();
2534
+ }
2535
+ } else if (e.namespace && e.property.name === 'position') {
2536
+ //console.log('play?', e);
2537
+ if (this._core.settings.autoplay) {
2538
+ this._setAutoPlayInterval();
2539
+ }
2540
+ }
2541
+ }, this),
2542
+ 'initialized.owl.carousel': $.proxy(function(e) {
2543
+ if (e.namespace && this._core.settings.autoplay) {
2544
+ this.play();
2545
+ }
2546
+ }, this),
2547
+ 'play.owl.autoplay': $.proxy(function(e, t, s) {
2548
+ if (e.namespace) {
2549
+ this.play(t, s);
2550
+ }
2551
+ }, this),
2552
+ 'stop.owl.autoplay': $.proxy(function(e) {
2553
+ if (e.namespace) {
2554
+ this.stop();
2555
+ }
2556
+ }, this),
2557
+ 'mouseover.owl.autoplay': $.proxy(function() {
2558
+ if (this._core.settings.autoplayHoverPause && this._core.is('rotating')) {
2559
+ this.pause();
2560
+ }
2561
+ }, this),
2562
+ 'mouseleave.owl.autoplay': $.proxy(function() {
2563
+ if (this._core.settings.autoplayHoverPause && this._core.is('rotating')) {
2564
+ this.play();
2565
+ }
2566
+ }, this),
2567
+ 'touchstart.owl.core': $.proxy(function() {
2568
+ if (this._core.settings.autoplayHoverPause && this._core.is('rotating')) {
2569
+ this.pause();
2570
+ }
2571
+ }, this),
2572
+ 'touchend.owl.core': $.proxy(function() {
2573
+ if (this._core.settings.autoplayHoverPause) {
2574
+ this.play();
2575
+ }
2576
+ }, this)
2577
+ };
2578
+
2579
+ // register event handlers
2580
+ this._core.$element.on(this._handlers);
2581
+
2582
+ // set default options
2583
+ this._core.options = $.extend({}, Autoplay.Defaults, this._core.options);
2584
+ };
2585
+
2586
+ /**
2587
+ * Default options.
2588
+ * @public
2589
+ */
2590
+ Autoplay.Defaults = {
2591
+ autoplay: false,
2592
+ autoplayTimeout: 5000,
2593
+ autoplayHoverPause: false,
2594
+ autoplaySpeed: false
2595
+ };
2596
+
2597
+ /**
2598
+ * Starts the autoplay.
2599
+ * @public
2600
+ * @param {Number} [timeout] - The interval before the next animation starts.
2601
+ * @param {Number} [speed] - The animation speed for the animations.
2602
+ */
2603
+ Autoplay.prototype.play = function(timeout, speed) {
2604
+ this._paused = false;
2605
+
2606
+ if (this._core.is('rotating')) {
2607
+ return;
2608
+ }
2609
+
2610
+ this._core.enter('rotating');
2611
+
2612
+ this._setAutoPlayInterval();
2613
+ };
2614
+
2615
+ /**
2616
+ * Gets a new timeout
2617
+ * @private
2618
+ * @param {Number} [timeout] - The interval before the next animation starts.
2619
+ * @param {Number} [speed] - The animation speed for the animations.
2620
+ * @return {Timeout}
2621
+ */
2622
+ Autoplay.prototype._getNextTimeout = function(timeout, speed) {
2623
+ if ( this._timeout ) {
2624
+ window.clearTimeout(this._timeout);
2625
+ }
2626
+ return window.setTimeout($.proxy(function() {
2627
+ if (this._paused || this._core.is('busy') || this._core.is('interacting') || document.hidden) {
2628
+ return;
2629
+ }
2630
+ this._core.next(speed || this._core.settings.autoplaySpeed);
2631
+ }, this), timeout || this._core.settings.autoplayTimeout);
2632
+ };
2633
+
2634
+ /**
2635
+ * Sets autoplay in motion.
2636
+ * @private
2637
+ */
2638
+ Autoplay.prototype._setAutoPlayInterval = function() {
2639
+ this._timeout = this._getNextTimeout();
2640
+ };
2641
+
2642
+ /**
2643
+ * Stops the autoplay.
2644
+ * @public
2645
+ */
2646
+ Autoplay.prototype.stop = function() {
2647
+ if (!this._core.is('rotating')) {
2648
+ return;
2649
+ }
2650
+
2651
+ window.clearTimeout(this._timeout);
2652
+ this._core.leave('rotating');
2653
+ };
2654
+
2655
+ /**
2656
+ * Stops the autoplay.
2657
+ * @public
2658
+ */
2659
+ Autoplay.prototype.pause = function() {
2660
+ if (!this._core.is('rotating')) {
2661
+ return;
2662
+ }
2663
+
2664
+ this._paused = true;
2665
+ };
2666
+
2667
+ /**
2668
+ * Destroys the plugin.
2669
+ */
2670
+ Autoplay.prototype.destroy = function() {
2671
+ var handler, property;
2672
+
2673
+ this.stop();
2674
+
2675
+ for (handler in this._handlers) {
2676
+ this._core.$element.off(handler, this._handlers[handler]);
2677
+ }
2678
+ for (property in Object.getOwnPropertyNames(this)) {
2679
+ typeof this[property] != 'function' && (this[property] = null);
2680
+ }
2681
+ };
2682
+
2683
+ $.fn.owlCarousel.Constructor.Plugins.autoplay = Autoplay;
2684
+
2685
+ })(window.Zepto || window.jQuery, window, document);
2686
+
2687
+ /**
2688
+ * Navigation Plugin
2689
+ * @version 2.1.0
2690
+ * @author Artus Kolanowski
2691
+ * @author David Deutsch
2692
+ * @license The MIT License (MIT)
2693
+ */
2694
+ ;(function($, window, document, undefined) {
2695
+ 'use strict';
2696
+
2697
+ /**
2698
+ * Creates the navigation plugin.
2699
+ * @class The Navigation Plugin
2700
+ * @param {Owl} carousel - The Owl Carousel.
2701
+ */
2702
+ var Navigation = function(carousel) {
2703
+ /**
2704
+ * Reference to the core.
2705
+ * @protected
2706
+ * @type {Owl}
2707
+ */
2708
+ this._core = carousel;
2709
+
2710
+ /**
2711
+ * Indicates whether the plugin is initialized or not.
2712
+ * @protected
2713
+ * @type {Boolean}
2714
+ */
2715
+ this._initialized = false;
2716
+
2717
+ /**
2718
+ * The current paging indexes.
2719
+ * @protected
2720
+ * @type {Array}
2721
+ */
2722
+ this._pages = [];
2723
+
2724
+ /**
2725
+ * All DOM elements of the user interface.
2726
+ * @protected
2727
+ * @type {Object}
2728
+ */
2729
+ this._controls = {};
2730
+
2731
+ /**
2732
+ * Markup for an indicator.
2733
+ * @protected
2734
+ * @type {Array.<String>}
2735
+ */
2736
+ this._templates = [];
2737
+
2738
+ /**
2739
+ * The carousel element.
2740
+ * @type {jQuery}
2741
+ */
2742
+ this.$element = this._core.$element;
2743
+
2744
+ /**
2745
+ * Overridden methods of the carousel.
2746
+ * @protected
2747
+ * @type {Object}
2748
+ */
2749
+ this._overrides = {
2750
+ next: this._core.next,
2751
+ prev: this._core.prev,
2752
+ to: this._core.to
2753
+ };
2754
+
2755
+ /**
2756
+ * All event handlers.
2757
+ * @protected
2758
+ * @type {Object}
2759
+ */
2760
+ this._handlers = {
2761
+ 'prepared.owl.carousel': $.proxy(function(e) {
2762
+ if (e.namespace && this._core.settings.dotsData) {
2763
+ this._templates.push('<div class="' + this._core.settings.dotClass + '">' +
2764
+ $(e.content).find('[data-dot]').addBack('[data-dot]').attr('data-dot') + '</div>');
2765
+ }
2766
+ }, this),
2767
+ 'added.owl.carousel': $.proxy(function(e) {
2768
+ if (e.namespace && this._core.settings.dotsData) {
2769
+ this._templates.splice(e.position, 0, this._templates.pop());
2770
+ }
2771
+ }, this),
2772
+ 'remove.owl.carousel': $.proxy(function(e) {
2773
+ if (e.namespace && this._core.settings.dotsData) {
2774
+ this._templates.splice(e.position, 1);
2775
+ }
2776
+ }, this),
2777
+ 'changed.owl.carousel': $.proxy(function(e) {
2778
+ if (e.namespace && e.property.name == 'position') {
2779
+ this.draw();
2780
+ }
2781
+ }, this),
2782
+ 'initialized.owl.carousel': $.proxy(function(e) {
2783
+ if (e.namespace && !this._initialized) {
2784
+ this._core.trigger('initialize', null, 'navigation');
2785
+ this.initialize();
2786
+ this.update();
2787
+ this.draw();
2788
+ this._initialized = true;
2789
+ this._core.trigger('initialized', null, 'navigation');
2790
+ }
2791
+ }, this),
2792
+ 'refreshed.owl.carousel': $.proxy(function(e) {
2793
+ if (e.namespace && this._initialized) {
2794
+ this._core.trigger('refresh', null, 'navigation');
2795
+ this.update();
2796
+ this.draw();
2797
+ this._core.trigger('refreshed', null, 'navigation');
2798
+ }
2799
+ }, this)
2800
+ };
2801
+
2802
+ // set default options
2803
+ this._core.options = $.extend({}, Navigation.Defaults, this._core.options);
2804
+
2805
+ // register event handlers
2806
+ this.$element.on(this._handlers);
2807
+ };
2808
+
2809
+ /**
2810
+ * Default options.
2811
+ * @public
2812
+ * @todo Rename `slideBy` to `navBy`
2813
+ */
2814
+ Navigation.Defaults = {
2815
+ nav: false,
2816
+ navText: [ 'prev', 'next' ],
2817
+ navSpeed: false,
2818
+ navElement: 'div',
2819
+ navContainer: false,
2820
+ navContainerClass: 'owl-nav',
2821
+ navClass: [ 'owl-prev', 'owl-next' ],
2822
+ slideBy: 1,
2823
+ dotClass: 'owl-dot',
2824
+ dotsClass: 'owl-dots',
2825
+ dots: true,
2826
+ dotsEach: false,
2827
+ dotsData: false,
2828
+ dotsSpeed: false,
2829
+ dotsContainer: false
2830
+ };
2831
+
2832
+ /**
2833
+ * Initializes the layout of the plugin and extends the carousel.
2834
+ * @protected
2835
+ */
2836
+ Navigation.prototype.initialize = function() {
2837
+ var override,
2838
+ settings = this._core.settings;
2839
+
2840
+ // create DOM structure for relative navigation
2841
+ this._controls.$relative = (settings.navContainer ? $(settings.navContainer)
2842
+ : $('<div>').addClass(settings.navContainerClass).appendTo(this.$element)).addClass('disabled');
2843
+
2844
+ this._controls.$previous = $('<' + settings.navElement + '>')
2845
+ .addClass(settings.navClass[0])
2846
+ .html(settings.navText[0])
2847
+ .prependTo(this._controls.$relative)
2848
+ .on('click', $.proxy(function(e) {
2849
+ this.prev(settings.navSpeed);
2850
+ }, this));
2851
+ this._controls.$next = $('<' + settings.navElement + '>')
2852
+ .addClass(settings.navClass[1])
2853
+ .html(settings.navText[1])
2854
+ .appendTo(this._controls.$relative)
2855
+ .on('click', $.proxy(function(e) {
2856
+ this.next(settings.navSpeed);
2857
+ }, this));
2858
+
2859
+ // create DOM structure for absolute navigation
2860
+ if (!settings.dotsData) {
2861
+ this._templates = [ $('<div>')
2862
+ .addClass(settings.dotClass)
2863
+ .append($('<span>'))
2864
+ .prop('outerHTML') ];
2865
+ }
2866
+
2867
+ this._controls.$absolute = (settings.dotsContainer ? $(settings.dotsContainer)
2868
+ : $('<div>').addClass(settings.dotsClass).appendTo(this.$element)).addClass('disabled');
2869
+
2870
+ this._controls.$absolute.on('click', 'div', $.proxy(function(e) {
2871
+ var index = $(e.target).parent().is(this._controls.$absolute)
2872
+ ? $(e.target).index() : $(e.target).parent().index();
2873
+
2874
+ e.preventDefault();
2875
+
2876
+ this.to(index, settings.dotsSpeed);
2877
+ }, this));
2878
+
2879
+ // override public methods of the carousel
2880
+ for (override in this._overrides) {
2881
+ this._core[override] = $.proxy(this[override], this);
2882
+ }
2883
+ };
2884
+
2885
+ /**
2886
+ * Destroys the plugin.
2887
+ * @protected
2888
+ */
2889
+ Navigation.prototype.destroy = function() {
2890
+ var handler, control, property, override;
2891
+
2892
+ for (handler in this._handlers) {
2893
+ this.$element.off(handler, this._handlers[handler]);
2894
+ }
2895
+ for (control in this._controls) {
2896
+ this._controls[control].remove();
2897
+ }
2898
+ for (override in this.overides) {
2899
+ this._core[override] = this._overrides[override];
2900
+ }
2901
+ for (property in Object.getOwnPropertyNames(this)) {
2902
+ typeof this[property] != 'function' && (this[property] = null);
2903
+ }
2904
+ };
2905
+
2906
+ /**
2907
+ * Updates the internal state.
2908
+ * @protected
2909
+ */
2910
+ Navigation.prototype.update = function() {
2911
+ var i, j, k,
2912
+ lower = this._core.clones().length / 2,
2913
+ upper = lower + this._core.items().length,
2914
+ maximum = this._core.maximum(true),
2915
+ settings = this._core.settings,
2916
+ size = settings.center || settings.autoWidth || settings.dotsData
2917
+ ? 1 : settings.dotsEach || settings.items;
2918
+
2919
+ if (settings.slideBy !== 'page') {
2920
+ settings.slideBy = Math.min(settings.slideBy, settings.items);
2921
+ }
2922
+
2923
+ if (settings.dots || settings.slideBy == 'page') {
2924
+ this._pages = [];
2925
+
2926
+ for (i = lower, j = 0, k = 0; i < upper; i++) {
2927
+ if (j >= size || j === 0) {
2928
+ this._pages.push({
2929
+ start: Math.min(maximum, i - lower),
2930
+ end: i - lower + size - 1
2931
+ });
2932
+ if (Math.min(maximum, i - lower) === maximum) {
2933
+ break;
2934
+ }
2935
+ j = 0, ++k;
2936
+ }
2937
+ j += this._core.mergers(this._core.relative(i));
2938
+ }
2939
+ }
2940
+ };
2941
+
2942
+ /**
2943
+ * Draws the user interface.
2944
+ * @todo The option `dotsData` wont work.
2945
+ * @protected
2946
+ */
2947
+ Navigation.prototype.draw = function() {
2948
+ var difference,
2949
+ settings = this._core.settings,
2950
+ disabled = this._core.items().length <= settings.items,
2951
+ index = this._core.relative(this._core.current()),
2952
+ loop = settings.loop || settings.rewind;
2953
+
2954
+ this._controls.$relative.toggleClass('disabled', !settings.nav || disabled);
2955
+
2956
+ if (settings.nav) {
2957
+ this._controls.$previous.toggleClass('disabled', !loop && index <= this._core.minimum(true));
2958
+ this._controls.$next.toggleClass('disabled', !loop && index >= this._core.maximum(true));
2959
+ }
2960
+
2961
+ this._controls.$absolute.toggleClass('disabled', !settings.dots || disabled);
2962
+
2963
+ if (settings.dots) {
2964
+ difference = this._pages.length - this._controls.$absolute.children().length;
2965
+
2966
+ if (settings.dotsData && difference !== 0) {
2967
+ this._controls.$absolute.html(this._templates.join(''));
2968
+ } else if (difference > 0) {
2969
+ this._controls.$absolute.append(new Array(difference + 1).join(this._templates[0]));
2970
+ } else if (difference < 0) {
2971
+ this._controls.$absolute.children().slice(difference).remove();
2972
+ }
2973
+
2974
+ this._controls.$absolute.find('.active').removeClass('active');
2975
+ this._controls.$absolute.children().eq($.inArray(this.current(), this._pages)).addClass('active');
2976
+ }
2977
+ };
2978
+
2979
+ /**
2980
+ * Extends event data.
2981
+ * @protected
2982
+ * @param {Event} event - The event object which gets thrown.
2983
+ */
2984
+ Navigation.prototype.onTrigger = function(event) {
2985
+ var settings = this._core.settings;
2986
+
2987
+ event.page = {
2988
+ index: $.inArray(this.current(), this._pages),
2989
+ count: this._pages.length,
2990
+ size: settings && (settings.center || settings.autoWidth || settings.dotsData
2991
+ ? 1 : settings.dotsEach || settings.items)
2992
+ };
2993
+ };
2994
+
2995
+ /**
2996
+ * Gets the current page position of the carousel.
2997
+ * @protected
2998
+ * @returns {Number}
2999
+ */
3000
+ Navigation.prototype.current = function() {
3001
+ var current = this._core.relative(this._core.current());
3002
+ return $.grep(this._pages, $.proxy(function(page, index) {
3003
+ return page.start <= current && page.end >= current;
3004
+ }, this)).pop();
3005
+ };
3006
+
3007
+ /**
3008
+ * Gets the current succesor/predecessor position.
3009
+ * @protected
3010
+ * @returns {Number}
3011
+ */
3012
+ Navigation.prototype.getPosition = function(successor) {
3013
+ var position, length,
3014
+ settings = this._core.settings;
3015
+
3016
+ if (settings.slideBy == 'page') {
3017
+ position = $.inArray(this.current(), this._pages);
3018
+ length = this._pages.length;
3019
+ successor ? ++position : --position;
3020
+ position = this._pages[((position % length) + length) % length].start;
3021
+ } else {
3022
+ position = this._core.relative(this._core.current());
3023
+ length = this._core.items().length;
3024
+ successor ? position += settings.slideBy : position -= settings.slideBy;
3025
+ }
3026
+
3027
+ return position;
3028
+ };
3029
+
3030
+ /**
3031
+ * Slides to the next item or page.
3032
+ * @public
3033
+ * @param {Number} [speed=false] - The time in milliseconds for the transition.
3034
+ */
3035
+ Navigation.prototype.next = function(speed) {
3036
+ $.proxy(this._overrides.to, this._core)(this.getPosition(true), speed);
3037
+ };
3038
+
3039
+ /**
3040
+ * Slides to the previous item or page.
3041
+ * @public
3042
+ * @param {Number} [speed=false] - The time in milliseconds for the transition.
3043
+ */
3044
+ Navigation.prototype.prev = function(speed) {
3045
+ $.proxy(this._overrides.to, this._core)(this.getPosition(false), speed);
3046
+ };
3047
+
3048
+ /**
3049
+ * Slides to the specified item or page.
3050
+ * @public
3051
+ * @param {Number} position - The position of the item or page.
3052
+ * @param {Number} [speed] - The time in milliseconds for the transition.
3053
+ * @param {Boolean} [standard=false] - Whether to use the standard behaviour or not.
3054
+ */
3055
+ Navigation.prototype.to = function(position, speed, standard) {
3056
+ var length;
3057
+
3058
+ if (!standard && this._pages.length) {
3059
+ length = this._pages.length;
3060
+ $.proxy(this._overrides.to, this._core)(this._pages[((position % length) + length) % length].start, speed);
3061
+ } else {
3062
+ $.proxy(this._overrides.to, this._core)(position, speed);
3063
+ }
3064
+ };
3065
+
3066
+ $.fn.owlCarousel.Constructor.Plugins.Navigation = Navigation;
3067
+
3068
+ })(window.Zepto || window.jQuery, window, document);
3069
+
3070
+ /**
3071
+ * Hash Plugin
3072
+ * @version 2.1.0
3073
+ * @author Artus Kolanowski
3074
+ * @author David Deutsch
3075
+ * @license The MIT License (MIT)
3076
+ */
3077
+ ;(function($, window, document, undefined) {
3078
+ 'use strict';
3079
+
3080
+ /**
3081
+ * Creates the hash plugin.
3082
+ * @class The Hash Plugin
3083
+ * @param {Owl} carousel - The Owl Carousel
3084
+ */
3085
+ var Hash = function(carousel) {
3086
+ /**
3087
+ * Reference to the core.
3088
+ * @protected
3089
+ * @type {Owl}
3090
+ */
3091
+ this._core = carousel;
3092
+
3093
+ /**
3094
+ * Hash index for the items.
3095
+ * @protected
3096
+ * @type {Object}
3097
+ */
3098
+ this._hashes = {};
3099
+
3100
+ /**
3101
+ * The carousel element.
3102
+ * @type {jQuery}
3103
+ */
3104
+ this.$element = this._core.$element;
3105
+
3106
+ /**
3107
+ * All event handlers.
3108
+ * @protected
3109
+ * @type {Object}
3110
+ */
3111
+ this._handlers = {
3112
+ 'initialized.owl.carousel': $.proxy(function(e) {
3113
+ if (e.namespace && this._core.settings.startPosition === 'URLHash') {
3114
+ $(window).trigger('hashchange.owl.navigation');
3115
+ }
3116
+ }, this),
3117
+ 'prepared.owl.carousel': $.proxy(function(e) {
3118
+ if (e.namespace) {
3119
+ var hash = $(e.content).find('[data-hash]').addBack('[data-hash]').attr('data-hash');
3120
+
3121
+ if (!hash) {
3122
+ return;
3123
+ }
3124
+
3125
+ this._hashes[hash] = e.content;
3126
+ }
3127
+ }, this),
3128
+ 'changed.owl.carousel': $.proxy(function(e) {
3129
+ if (e.namespace && e.property.name === 'position') {
3130
+ var current = this._core.items(this._core.relative(this._core.current())),
3131
+ hash = $.map(this._hashes, function(item, hash) {
3132
+ return item === current ? hash : null;
3133
+ }).join();
3134
+
3135
+ if (!hash || window.location.hash.slice(1) === hash) {
3136
+ return;
3137
+ }
3138
+
3139
+ window.location.hash = hash;
3140
+ }
3141
+ }, this)
3142
+ };
3143
+
3144
+ // set default options
3145
+ this._core.options = $.extend({}, Hash.Defaults, this._core.options);
3146
+
3147
+ // register the event handlers
3148
+ this.$element.on(this._handlers);
3149
+
3150
+ // register event listener for hash navigation
3151
+ $(window).on('hashchange.owl.navigation', $.proxy(function(e) {
3152
+ var hash = window.location.hash.substring(1),
3153
+ items = this._core.$stage.children(),
3154
+ position = this._hashes[hash] && items.index(this._hashes[hash]);
3155
+
3156
+ if (position === undefined || position === this._core.current()) {
3157
+ return;
3158
+ }
3159
+
3160
+ this._core.to(this._core.relative(position), false, true);
3161
+ }, this));
3162
+ };
3163
+
3164
+ /**
3165
+ * Default options.
3166
+ * @public
3167
+ */
3168
+ Hash.Defaults = {
3169
+ URLhashListener: false
3170
+ };
3171
+
3172
+ /**
3173
+ * Destroys the plugin.
3174
+ * @public
3175
+ */
3176
+ Hash.prototype.destroy = function() {
3177
+ var handler, property;
3178
+
3179
+ $(window).off('hashchange.owl.navigation');
3180
+
3181
+ for (handler in this._handlers) {
3182
+ this._core.$element.off(handler, this._handlers[handler]);
3183
+ }
3184
+ for (property in Object.getOwnPropertyNames(this)) {
3185
+ typeof this[property] != 'function' && (this[property] = null);
3186
+ }
3187
+ };
3188
+
3189
+ $.fn.owlCarousel.Constructor.Plugins.Hash = Hash;
3190
+
3191
+ })(window.Zepto || window.jQuery, window, document);
3192
+
3193
+ /**
3194
+ * Support Plugin
3195
+ *
3196
+ * @version 2.1.0
3197
+ * @author Vivid Planet Software GmbH
3198
+ * @author Artus Kolanowski
3199
+ * @author David Deutsch
3200
+ * @license The MIT License (MIT)
3201
+ */
3202
+ ;(function($, window, document, undefined) {
3203
+
3204
+ var style = $('<support>').get(0).style,
3205
+ prefixes = 'Webkit Moz O ms'.split(' '),
3206
+ events = {
3207
+ transition: {
3208
+ end: {
3209
+ WebkitTransition: 'webkitTransitionEnd',
3210
+ MozTransition: 'transitionend',
3211
+ OTransition: 'oTransitionEnd',
3212
+ transition: 'transitionend'
3213
+ }
3214
+ },
3215
+ animation: {
3216
+ end: {
3217
+ WebkitAnimation: 'webkitAnimationEnd',
3218
+ MozAnimation: 'animationend',
3219
+ OAnimation: 'oAnimationEnd',
3220
+ animation: 'animationend'
3221
+ }
3222
+ }
3223
+ },
3224
+ tests = {
3225
+ csstransforms: function() {
3226
+ return !!test('transform');
3227
+ },
3228
+ csstransforms3d: function() {
3229
+ return !!test('perspective');
3230
+ },
3231
+ csstransitions: function() {
3232
+ return !!test('transition');
3233
+ },
3234
+ cssanimations: function() {
3235
+ return !!test('animation');
3236
+ }
3237
+ };
3238
+
3239
+ function test(property, prefixed) {
3240
+ var result = false,
3241
+ upper = property.charAt(0).toUpperCase() + property.slice(1);
3242
+
3243
+ $.each((property + ' ' + prefixes.join(upper + ' ') + upper).split(' '), function(i, property) {
3244
+ if (style[property] !== undefined) {
3245
+ result = prefixed ? property : true;
3246
+ return false;
3247
+ }
3248
+ });
3249
+
3250
+ return result;
3251
+ }
3252
+
3253
+ function prefixed(property) {
3254
+ return test(property, true);
3255
+ }
3256
+
3257
+ if (tests.csstransitions()) {
3258
+ /* jshint -W053 */
3259
+ $.support.transition = new String(prefixed('transition'))
3260
+ $.support.transition.end = events.transition.end[ $.support.transition ];
3261
+ }
3262
+
3263
+ if (tests.cssanimations()) {
3264
+ /* jshint -W053 */
3265
+ $.support.animation = new String(prefixed('animation'))
3266
+ $.support.animation.end = events.animation.end[ $.support.animation ];
3267
+ }
3268
+
3269
+ if (tests.csstransforms()) {
3270
+ /* jshint -W053 */
3271
+ $.support.transform = new String(prefixed('transform'));
3272
+ $.support.transform3d = tests.csstransforms3d();
3273
+ }
3274
+
3275
+ })(window.Zepto || window.jQuery, window, document);
static/lib/owlcarousel/owl.carousel.min.js ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ /**
2
+ * Owl Carousel v2.2.1
3
+ * Copyright 2013-2017 David Deutsch
4
+ * Licensed under ()
5
+ */
6
+ !function(a,b,c,d){function e(b,c){this.settings=null,this.options=a.extend({},e.Defaults,c),this.$element=a(b),this._handlers={},this._plugins={},this._supress={},this._current=null,this._speed=null,this._coordinates=[],this._breakpoint=null,this._width=null,this._items=[],this._clones=[],this._mergers=[],this._widths=[],this._invalidated={},this._pipe=[],this._drag={time:null,target:null,pointer:null,stage:{start:null,current:null},direction:null},this._states={current:{},tags:{initializing:["busy"],animating:["busy"],dragging:["interacting"]}},a.each(["onResize","onThrottledResize"],a.proxy(function(b,c){this._handlers[c]=a.proxy(this[c],this)},this)),a.each(e.Plugins,a.proxy(function(a,b){this._plugins[a.charAt(0).toLowerCase()+a.slice(1)]=new b(this)},this)),a.each(e.Workers,a.proxy(function(b,c){this._pipe.push({filter:c.filter,run:a.proxy(c.run,this)})},this)),this.setup(),this.initialize()}e.Defaults={items:3,loop:!1,center:!1,rewind:!1,mouseDrag:!0,touchDrag:!0,pullDrag:!0,freeDrag:!1,margin:0,stagePadding:0,merge:!1,mergeFit:!0,autoWidth:!1,startPosition:0,rtl:!1,smartSpeed:250,fluidSpeed:!1,dragEndSpeed:!1,responsive:{},responsiveRefreshRate:200,responsiveBaseElement:b,fallbackEasing:"swing",info:!1,nestedItemSelector:!1,itemElement:"div",stageElement:"div",refreshClass:"owl-refresh",loadedClass:"owl-loaded",loadingClass:"owl-loading",rtlClass:"owl-rtl",responsiveClass:"owl-responsive",dragClass:"owl-drag",itemClass:"owl-item",stageClass:"owl-stage",stageOuterClass:"owl-stage-outer",grabClass:"owl-grab"},e.Width={Default:"default",Inner:"inner",Outer:"outer"},e.Type={Event:"event",State:"state"},e.Plugins={},e.Workers=[{filter:["width","settings"],run:function(){this._width=this.$element.width()}},{filter:["width","items","settings"],run:function(a){a.current=this._items&&this._items[this.relative(this._current)]}},{filter:["items","settings"],run:function(){this.$stage.children(".cloned").remove()}},{filter:["width","items","settings"],run:function(a){var b=this.settings.margin||"",c=!this.settings.autoWidth,d=this.settings.rtl,e={width:"auto","margin-left":d?b:"","margin-right":d?"":b};!c&&this.$stage.children().css(e),a.css=e}},{filter:["width","items","settings"],run:function(a){var b=(this.width()/this.settings.items).toFixed(3)-this.settings.margin,c=null,d=this._items.length,e=!this.settings.autoWidth,f=[];for(a.items={merge:!1,width:b};d--;)c=this._mergers[d],c=this.settings.mergeFit&&Math.min(c,this.settings.items)||c,a.items.merge=c>1||a.items.merge,f[d]=e?b*c:this._items[d].width();this._widths=f}},{filter:["items","settings"],run:function(){var b=[],c=this._items,d=this.settings,e=Math.max(2*d.items,4),f=2*Math.ceil(c.length/2),g=d.loop&&c.length?d.rewind?e:Math.max(e,f):0,h="",i="";for(g/=2;g--;)b.push(this.normalize(b.length/2,!0)),h+=c[b[b.length-1]][0].outerHTML,b.push(this.normalize(c.length-1-(b.length-1)/2,!0)),i=c[b[b.length-1]][0].outerHTML+i;this._clones=b,a(h).addClass("cloned").appendTo(this.$stage),a(i).addClass("cloned").prependTo(this.$stage)}},{filter:["width","items","settings"],run:function(){for(var a=this.settings.rtl?1:-1,b=this._clones.length+this._items.length,c=-1,d=0,e=0,f=[];++c<b;)d=f[c-1]||0,e=this._widths[this.relative(c)]+this.settings.margin,f.push(d+e*a);this._coordinates=f}},{filter:["width","items","settings"],run:function(){var a=this.settings.stagePadding,b=this._coordinates,c={width:Math.ceil(Math.abs(b[b.length-1]))+2*a,"padding-left":a||"","padding-right":a||""};this.$stage.css(c)}},{filter:["width","items","settings"],run:function(a){var b=this._coordinates.length,c=!this.settings.autoWidth,d=this.$stage.children();if(c&&a.items.merge)for(;b--;)a.css.width=this._widths[this.relative(b)],d.eq(b).css(a.css);else c&&(a.css.width=a.items.width,d.css(a.css))}},{filter:["items"],run:function(){this._coordinates.length<1&&this.$stage.removeAttr("style")}},{filter:["width","items","settings"],run:function(a){a.current=a.current?this.$stage.children().index(a.current):0,a.current=Math.max(this.minimum(),Math.min(this.maximum(),a.current)),this.reset(a.current)}},{filter:["position"],run:function(){this.animate(this.coordinates(this._current))}},{filter:["width","position","items","settings"],run:function(){var a,b,c,d,e=this.settings.rtl?1:-1,f=2*this.settings.stagePadding,g=this.coordinates(this.current())+f,h=g+this.width()*e,i=[];for(c=0,d=this._coordinates.length;c<d;c++)a=this._coordinates[c-1]||0,b=Math.abs(this._coordinates[c])+f*e,(this.op(a,"<=",g)&&this.op(a,">",h)||this.op(b,"<",g)&&this.op(b,">",h))&&i.push(c);this.$stage.children(".active").removeClass("active"),this.$stage.children(":eq("+i.join("), :eq(")+")").addClass("active"),this.settings.center&&(this.$stage.children(".center").removeClass("center"),this.$stage.children().eq(this.current()).addClass("center"))}}],e.prototype.initialize=function(){if(this.enter("initializing"),this.trigger("initialize"),this.$element.toggleClass(this.settings.rtlClass,this.settings.rtl),this.settings.autoWidth&&!this.is("pre-loading")){var b,c,e;b=this.$element.find("img"),c=this.settings.nestedItemSelector?"."+this.settings.nestedItemSelector:d,e=this.$element.children(c).width(),b.length&&e<=0&&this.preloadAutoWidthImages(b)}this.$element.addClass(this.options.loadingClass),this.$stage=a("<"+this.settings.stageElement+' class="'+this.settings.stageClass+'"/>').wrap('<div class="'+this.settings.stageOuterClass+'"/>'),this.$element.append(this.$stage.parent()),this.replace(this.$element.children().not(this.$stage.parent())),this.$element.is(":visible")?this.refresh():this.invalidate("width"),this.$element.removeClass(this.options.loadingClass).addClass(this.options.loadedClass),this.registerEventHandlers(),this.leave("initializing"),this.trigger("initialized")},e.prototype.setup=function(){var b=this.viewport(),c=this.options.responsive,d=-1,e=null;c?(a.each(c,function(a){a<=b&&a>d&&(d=Number(a))}),e=a.extend({},this.options,c[d]),"function"==typeof e.stagePadding&&(e.stagePadding=e.stagePadding()),delete e.responsive,e.responsiveClass&&this.$element.attr("class",this.$element.attr("class").replace(new RegExp("("+this.options.responsiveClass+"-)\\S+\\s","g"),"$1"+d))):e=a.extend({},this.options),this.trigger("change",{property:{name:"settings",value:e}}),this._breakpoint=d,this.settings=e,this.invalidate("settings"),this.trigger("changed",{property:{name:"settings",value:this.settings}})},e.prototype.optionsLogic=function(){this.settings.autoWidth&&(this.settings.stagePadding=!1,this.settings.merge=!1)},e.prototype.prepare=function(b){var c=this.trigger("prepare",{content:b});return c.data||(c.data=a("<"+this.settings.itemElement+"/>").addClass(this.options.itemClass).append(b)),this.trigger("prepared",{content:c.data}),c.data},e.prototype.update=function(){for(var b=0,c=this._pipe.length,d=a.proxy(function(a){return this[a]},this._invalidated),e={};b<c;)(this._invalidated.all||a.grep(this._pipe[b].filter,d).length>0)&&this._pipe[b].run(e),b++;this._invalidated={},!this.is("valid")&&this.enter("valid")},e.prototype.width=function(a){switch(a=a||e.Width.Default){case e.Width.Inner:case e.Width.Outer:return this._width;default:return this._width-2*this.settings.stagePadding+this.settings.margin}},e.prototype.refresh=function(){this.enter("refreshing"),this.trigger("refresh"),this.setup(),this.optionsLogic(),this.$element.addClass(this.options.refreshClass),this.update(),this.$element.removeClass(this.options.refreshClass),this.leave("refreshing"),this.trigger("refreshed")},e.prototype.onThrottledResize=function(){b.clearTimeout(this.resizeTimer),this.resizeTimer=b.setTimeout(this._handlers.onResize,this.settings.responsiveRefreshRate)},e.prototype.onResize=function(){return!!this._items.length&&(this._width!==this.$element.width()&&(!!this.$element.is(":visible")&&(this.enter("resizing"),this.trigger("resize").isDefaultPrevented()?(this.leave("resizing"),!1):(this.invalidate("width"),this.refresh(),this.leave("resizing"),void this.trigger("resized")))))},e.prototype.registerEventHandlers=function(){a.support.transition&&this.$stage.on(a.support.transition.end+".owl.core",a.proxy(this.onTransitionEnd,this)),this.settings.responsive!==!1&&this.on(b,"resize",this._handlers.onThrottledResize),this.settings.mouseDrag&&(this.$element.addClass(this.options.dragClass),this.$stage.on("mousedown.owl.core",a.proxy(this.onDragStart,this)),this.$stage.on("dragstart.owl.core selectstart.owl.core",function(){return!1})),this.settings.touchDrag&&(this.$stage.on("touchstart.owl.core",a.proxy(this.onDragStart,this)),this.$stage.on("touchcancel.owl.core",a.proxy(this.onDragEnd,this)))},e.prototype.onDragStart=function(b){var d=null;3!==b.which&&(a.support.transform?(d=this.$stage.css("transform").replace(/.*\(|\)| /g,"").split(","),d={x:d[16===d.length?12:4],y:d[16===d.length?13:5]}):(d=this.$stage.position(),d={x:this.settings.rtl?d.left+this.$stage.width()-this.width()+this.settings.margin:d.left,y:d.top}),this.is("animating")&&(a.support.transform?this.animate(d.x):this.$stage.stop(),this.invalidate("position")),this.$element.toggleClass(this.options.grabClass,"mousedown"===b.type),this.speed(0),this._drag.time=(new Date).getTime(),this._drag.target=a(b.target),this._drag.stage.start=d,this._drag.stage.current=d,this._drag.pointer=this.pointer(b),a(c).on("mouseup.owl.core touchend.owl.core",a.proxy(this.onDragEnd,this)),a(c).one("mousemove.owl.core touchmove.owl.core",a.proxy(function(b){var d=this.difference(this._drag.pointer,this.pointer(b));a(c).on("mousemove.owl.core touchmove.owl.core",a.proxy(this.onDragMove,this)),Math.abs(d.x)<Math.abs(d.y)&&this.is("valid")||(b.preventDefault(),this.enter("dragging"),this.trigger("drag"))},this)))},e.prototype.onDragMove=function(a){var b=null,c=null,d=null,e=this.difference(this._drag.pointer,this.pointer(a)),f=this.difference(this._drag.stage.start,e);this.is("dragging")&&(a.preventDefault(),this.settings.loop?(b=this.coordinates(this.minimum()),c=this.coordinates(this.maximum()+1)-b,f.x=((f.x-b)%c+c)%c+b):(b=this.settings.rtl?this.coordinates(this.maximum()):this.coordinates(this.minimum()),c=this.settings.rtl?this.coordinates(this.minimum()):this.coordinates(this.maximum()),d=this.settings.pullDrag?-1*e.x/5:0,f.x=Math.max(Math.min(f.x,b+d),c+d)),this._drag.stage.current=f,this.animate(f.x))},e.prototype.onDragEnd=function(b){var d=this.difference(this._drag.pointer,this.pointer(b)),e=this._drag.stage.current,f=d.x>0^this.settings.rtl?"left":"right";a(c).off(".owl.core"),this.$element.removeClass(this.options.grabClass),(0!==d.x&&this.is("dragging")||!this.is("valid"))&&(this.speed(this.settings.dragEndSpeed||this.settings.smartSpeed),this.current(this.closest(e.x,0!==d.x?f:this._drag.direction)),this.invalidate("position"),this.update(),this._drag.direction=f,(Math.abs(d.x)>3||(new Date).getTime()-this._drag.time>300)&&this._drag.target.one("click.owl.core",function(){return!1})),this.is("dragging")&&(this.leave("dragging"),this.trigger("dragged"))},e.prototype.closest=function(b,c){var d=-1,e=30,f=this.width(),g=this.coordinates();return this.settings.freeDrag||a.each(g,a.proxy(function(a,h){return"left"===c&&b>h-e&&b<h+e?d=a:"right"===c&&b>h-f-e&&b<h-f+e?d=a+1:this.op(b,"<",h)&&this.op(b,">",g[a+1]||h-f)&&(d="left"===c?a+1:a),d===-1},this)),this.settings.loop||(this.op(b,">",g[this.minimum()])?d=b=this.minimum():this.op(b,"<",g[this.maximum()])&&(d=b=this.maximum())),d},e.prototype.animate=function(b){var c=this.speed()>0;this.is("animating")&&this.onTransitionEnd(),c&&(this.enter("animating"),this.trigger("translate")),a.support.transform3d&&a.support.transition?this.$stage.css({transform:"translate3d("+b+"px,0px,0px)",transition:this.speed()/1e3+"s"}):c?this.$stage.animate({left:b+"px"},this.speed(),this.settings.fallbackEasing,a.proxy(this.onTransitionEnd,this)):this.$stage.css({left:b+"px"})},e.prototype.is=function(a){return this._states.current[a]&&this._states.current[a]>0},e.prototype.current=function(a){if(a===d)return this._current;if(0===this._items.length)return d;if(a=this.normalize(a),this._current!==a){var b=this.trigger("change",{property:{name:"position",value:a}});b.data!==d&&(a=this.normalize(b.data)),this._current=a,this.invalidate("position"),this.trigger("changed",{property:{name:"position",value:this._current}})}return this._current},e.prototype.invalidate=function(b){return"string"===a.type(b)&&(this._invalidated[b]=!0,this.is("valid")&&this.leave("valid")),a.map(this._invalidated,function(a,b){return b})},e.prototype.reset=function(a){a=this.normalize(a),a!==d&&(this._speed=0,this._current=a,this.suppress(["translate","translated"]),this.animate(this.coordinates(a)),this.release(["translate","translated"]))},e.prototype.normalize=function(a,b){var c=this._items.length,e=b?0:this._clones.length;return!this.isNumeric(a)||c<1?a=d:(a<0||a>=c+e)&&(a=((a-e/2)%c+c)%c+e/2),a},e.prototype.relative=function(a){return a-=this._clones.length/2,this.normalize(a,!0)},e.prototype.maximum=function(a){var b,c,d,e=this.settings,f=this._coordinates.length;if(e.loop)f=this._clones.length/2+this._items.length-1;else if(e.autoWidth||e.merge){for(b=this._items.length,c=this._items[--b].width(),d=this.$element.width();b--&&(c+=this._items[b].width()+this.settings.margin,!(c>d)););f=b+1}else f=e.center?this._items.length-1:this._items.length-e.items;return a&&(f-=this._clones.length/2),Math.max(f,0)},e.prototype.minimum=function(a){return a?0:this._clones.length/2},e.prototype.items=function(a){return a===d?this._items.slice():(a=this.normalize(a,!0),this._items[a])},e.prototype.mergers=function(a){return a===d?this._mergers.slice():(a=this.normalize(a,!0),this._mergers[a])},e.prototype.clones=function(b){var c=this._clones.length/2,e=c+this._items.length,f=function(a){return a%2===0?e+a/2:c-(a+1)/2};return b===d?a.map(this._clones,function(a,b){return f(b)}):a.map(this._clones,function(a,c){return a===b?f(c):null})},e.prototype.speed=function(a){return a!==d&&(this._speed=a),this._speed},e.prototype.coordinates=function(b){var c,e=1,f=b-1;return b===d?a.map(this._coordinates,a.proxy(function(a,b){return this.coordinates(b)},this)):(this.settings.center?(this.settings.rtl&&(e=-1,f=b+1),c=this._coordinates[b],c+=(this.width()-c+(this._coordinates[f]||0))/2*e):c=this._coordinates[f]||0,c=Math.ceil(c))},e.prototype.duration=function(a,b,c){return 0===c?0:Math.min(Math.max(Math.abs(b-a),1),6)*Math.abs(c||this.settings.smartSpeed)},e.prototype.to=function(a,b){var c=this.current(),d=null,e=a-this.relative(c),f=(e>0)-(e<0),g=this._items.length,h=this.minimum(),i=this.maximum();this.settings.loop?(!this.settings.rewind&&Math.abs(e)>g/2&&(e+=f*-1*g),a=c+e,d=((a-h)%g+g)%g+h,d!==a&&d-e<=i&&d-e>0&&(c=d-e,a=d,this.reset(c))):this.settings.rewind?(i+=1,a=(a%i+i)%i):a=Math.max(h,Math.min(i,a)),this.speed(this.duration(c,a,b)),this.current(a),this.$element.is(":visible")&&this.update()},e.prototype.next=function(a){a=a||!1,this.to(this.relative(this.current())+1,a)},e.prototype.prev=function(a){a=a||!1,this.to(this.relative(this.current())-1,a)},e.prototype.onTransitionEnd=function(a){if(a!==d&&(a.stopPropagation(),(a.target||a.srcElement||a.originalTarget)!==this.$stage.get(0)))return!1;this.leave("animating"),this.trigger("translated")},e.prototype.viewport=function(){var d;return this.options.responsiveBaseElement!==b?d=a(this.options.responsiveBaseElement).width():b.innerWidth?d=b.innerWidth:c.documentElement&&c.documentElement.clientWidth?d=c.documentElement.clientWidth:console.warn("Can not detect viewport width."),d},e.prototype.replace=function(b){this.$stage.empty(),this._items=[],b&&(b=b instanceof jQuery?b:a(b)),this.settings.nestedItemSelector&&(b=b.find("."+this.settings.nestedItemSelector)),b.filter(function(){return 1===this.nodeType}).each(a.proxy(function(a,b){b=this.prepare(b),this.$stage.append(b),this._items.push(b),this._mergers.push(1*b.find("[data-merge]").addBack("[data-merge]").attr("data-merge")||1)},this)),this.reset(this.isNumeric(this.settings.startPosition)?this.settings.startPosition:0),this.invalidate("items")},e.prototype.add=function(b,c){var e=this.relative(this._current);c=c===d?this._items.length:this.normalize(c,!0),b=b instanceof jQuery?b:a(b),this.trigger("add",{content:b,position:c}),b=this.prepare(b),0===this._items.length||c===this._items.length?(0===this._items.length&&this.$stage.append(b),0!==this._items.length&&this._items[c-1].after(b),this._items.push(b),this._mergers.push(1*b.find("[data-merge]").addBack("[data-merge]").attr("data-merge")||1)):(this._items[c].before(b),this._items.splice(c,0,b),this._mergers.splice(c,0,1*b.find("[data-merge]").addBack("[data-merge]").attr("data-merge")||1)),this._items[e]&&this.reset(this._items[e].index()),this.invalidate("items"),this.trigger("added",{content:b,position:c})},e.prototype.remove=function(a){a=this.normalize(a,!0),a!==d&&(this.trigger("remove",{content:this._items[a],position:a}),this._items[a].remove(),this._items.splice(a,1),this._mergers.splice(a,1),this.invalidate("items"),this.trigger("removed",{content:null,position:a}))},e.prototype.preloadAutoWidthImages=function(b){b.each(a.proxy(function(b,c){this.enter("pre-loading"),c=a(c),a(new Image).one("load",a.proxy(function(a){c.attr("src",a.target.src),c.css("opacity",1),this.leave("pre-loading"),!this.is("pre-loading")&&!this.is("initializing")&&this.refresh()},this)).attr("src",c.attr("src")||c.attr("data-src")||c.attr("data-src-retina"))},this))},e.prototype.destroy=function(){this.$element.off(".owl.core"),this.$stage.off(".owl.core"),a(c).off(".owl.core"),this.settings.responsive!==!1&&(b.clearTimeout(this.resizeTimer),this.off(b,"resize",this._handlers.onThrottledResize));for(var d in this._plugins)this._plugins[d].destroy();this.$stage.children(".cloned").remove(),this.$stage.unwrap(),this.$stage.children().contents().unwrap(),this.$stage.children().unwrap(),this.$element.removeClass(this.options.refreshClass).removeClass(this.options.loadingClass).removeClass(this.options.loadedClass).removeClass(this.options.rtlClass).removeClass(this.options.dragClass).removeClass(this.options.grabClass).attr("class",this.$element.attr("class").replace(new RegExp(this.options.responsiveClass+"-\\S+\\s","g"),"")).removeData("owl.carousel")},e.prototype.op=function(a,b,c){var d=this.settings.rtl;switch(b){case"<":return d?a>c:a<c;case">":return d?a<c:a>c;case">=":return d?a<=c:a>=c;case"<=":return d?a>=c:a<=c}},e.prototype.on=function(a,b,c,d){a.addEventListener?a.addEventListener(b,c,d):a.attachEvent&&a.attachEvent("on"+b,c)},e.prototype.off=function(a,b,c,d){a.removeEventListener?a.removeEventListener(b,c,d):a.detachEvent&&a.detachEvent("on"+b,c)},e.prototype.trigger=function(b,c,d,f,g){var h={item:{count:this._items.length,index:this.current()}},i=a.camelCase(a.grep(["on",b,d],function(a){return a}).join("-").toLowerCase()),j=a.Event([b,"owl",d||"carousel"].join(".").toLowerCase(),a.extend({relatedTarget:this},h,c));return this._supress[b]||(a.each(this._plugins,function(a,b){b.onTrigger&&b.onTrigger(j)}),this.register({type:e.Type.Event,name:b}),this.$element.trigger(j),this.settings&&"function"==typeof this.settings[i]&&this.settings[i].call(this,j)),j},e.prototype.enter=function(b){a.each([b].concat(this._states.tags[b]||[]),a.proxy(function(a,b){this._states.current[b]===d&&(this._states.current[b]=0),this._states.current[b]++},this))},e.prototype.leave=function(b){a.each([b].concat(this._states.tags[b]||[]),a.proxy(function(a,b){this._states.current[b]--},this))},e.prototype.register=function(b){if(b.type===e.Type.Event){if(a.event.special[b.name]||(a.event.special[b.name]={}),!a.event.special[b.name].owl){var c=a.event.special[b.name]._default;a.event.special[b.name]._default=function(a){return!c||!c.apply||a.namespace&&a.namespace.indexOf("owl")!==-1?a.namespace&&a.namespace.indexOf("owl")>-1:c.apply(this,arguments)},a.event.special[b.name].owl=!0}}else b.type===e.Type.State&&(this._states.tags[b.name]?this._states.tags[b.name]=this._states.tags[b.name].concat(b.tags):this._states.tags[b.name]=b.tags,this._states.tags[b.name]=a.grep(this._states.tags[b.name],a.proxy(function(c,d){return a.inArray(c,this._states.tags[b.name])===d},this)))},e.prototype.suppress=function(b){a.each(b,a.proxy(function(a,b){this._supress[b]=!0},this))},e.prototype.release=function(b){a.each(b,a.proxy(function(a,b){delete this._supress[b]},this))},e.prototype.pointer=function(a){var c={x:null,y:null};return a=a.originalEvent||a||b.event,a=a.touches&&a.touches.length?a.touches[0]:a.changedTouches&&a.changedTouches.length?a.changedTouches[0]:a,a.pageX?(c.x=a.pageX,c.y=a.pageY):(c.x=a.clientX,c.y=a.clientY),c},e.prototype.isNumeric=function(a){return!isNaN(parseFloat(a))},e.prototype.difference=function(a,b){return{x:a.x-b.x,y:a.y-b.y}},a.fn.owlCarousel=function(b){var c=Array.prototype.slice.call(arguments,1);return this.each(function(){var d=a(this),f=d.data("owl.carousel");f||(f=new e(this,"object"==typeof b&&b),d.data("owl.carousel",f),a.each(["next","prev","to","destroy","refresh","replace","add","remove"],function(b,c){f.register({type:e.Type.Event,name:c}),f.$element.on(c+".owl.carousel.core",a.proxy(function(a){a.namespace&&a.relatedTarget!==this&&(this.suppress([c]),f[c].apply(this,[].slice.call(arguments,1)),this.release([c]))},f))})),"string"==typeof b&&"_"!==b.charAt(0)&&f[b].apply(f,c)})},a.fn.owlCarousel.Constructor=e}(window.Zepto||window.jQuery,window,document),function(a,b,c,d){var e=function(b){this._core=b,this._interval=null,this._visible=null,this._handlers={"initialized.owl.carousel":a.proxy(function(a){a.namespace&&this._core.settings.autoRefresh&&this.watch()},this)},this._core.options=a.extend({},e.Defaults,this._core.options),this._core.$element.on(this._handlers)};e.Defaults={autoRefresh:!0,autoRefreshInterval:500},e.prototype.watch=function(){this._interval||(this._visible=this._core.$element.is(":visible"),this._interval=b.setInterval(a.proxy(this.refresh,this),this._core.settings.autoRefreshInterval))},e.prototype.refresh=function(){this._core.$element.is(":visible")!==this._visible&&(this._visible=!this._visible,this._core.$element.toggleClass("owl-hidden",!this._visible),this._visible&&this._core.invalidate("width")&&this._core.refresh())},e.prototype.destroy=function(){var a,c;b.clearInterval(this._interval);for(a in this._handlers)this._core.$element.off(a,this._handlers[a]);for(c in Object.getOwnPropertyNames(this))"function"!=typeof this[c]&&(this[c]=null)},a.fn.owlCarousel.Constructor.Plugins.AutoRefresh=e}(window.Zepto||window.jQuery,window,document),function(a,b,c,d){var e=function(b){this._core=b,this._loaded=[],this._handlers={"initialized.owl.carousel change.owl.carousel resized.owl.carousel":a.proxy(function(b){if(b.namespace&&this._core.settings&&this._core.settings.lazyLoad&&(b.property&&"position"==b.property.name||"initialized"==b.type))for(var c=this._core.settings,e=c.center&&Math.ceil(c.items/2)||c.items,f=c.center&&e*-1||0,g=(b.property&&b.property.value!==d?b.property.value:this._core.current())+f,h=this._core.clones().length,i=a.proxy(function(a,b){this.load(b)},this);f++<e;)this.load(h/2+this._core.relative(g)),h&&a.each(this._core.clones(this._core.relative(g)),i),g++},this)},this._core.options=a.extend({},e.Defaults,this._core.options),this._core.$element.on(this._handlers)};e.Defaults={lazyLoad:!1},e.prototype.load=function(c){var d=this._core.$stage.children().eq(c),e=d&&d.find(".owl-lazy");!e||a.inArray(d.get(0),this._loaded)>-1||(e.each(a.proxy(function(c,d){var e,f=a(d),g=b.devicePixelRatio>1&&f.attr("data-src-retina")||f.attr("data-src");this._core.trigger("load",{element:f,url:g},"lazy"),f.is("img")?f.one("load.owl.lazy",a.proxy(function(){f.css("opacity",1),this._core.trigger("loaded",{element:f,url:g},"lazy")},this)).attr("src",g):(e=new Image,e.onload=a.proxy(function(){f.css({"background-image":'url("'+g+'")',opacity:"1"}),this._core.trigger("loaded",{element:f,url:g},"lazy")},this),e.src=g)},this)),this._loaded.push(d.get(0)))},e.prototype.destroy=function(){var a,b;for(a in this.handlers)this._core.$element.off(a,this.handlers[a]);for(b in Object.getOwnPropertyNames(this))"function"!=typeof this[b]&&(this[b]=null)},a.fn.owlCarousel.Constructor.Plugins.Lazy=e}(window.Zepto||window.jQuery,window,document),function(a,b,c,d){var e=function(b){this._core=b,this._handlers={"initialized.owl.carousel refreshed.owl.carousel":a.proxy(function(a){a.namespace&&this._core.settings.autoHeight&&this.update()},this),"changed.owl.carousel":a.proxy(function(a){a.namespace&&this._core.settings.autoHeight&&"position"==a.property.name&&this.update()},this),"loaded.owl.lazy":a.proxy(function(a){a.namespace&&this._core.settings.autoHeight&&a.element.closest("."+this._core.settings.itemClass).index()===this._core.current()&&this.update()},this)},this._core.options=a.extend({},e.Defaults,this._core.options),this._core.$element.on(this._handlers)};e.Defaults={autoHeight:!1,autoHeightClass:"owl-height"},e.prototype.update=function(){var b=this._core._current,c=b+this._core.settings.items,d=this._core.$stage.children().toArray().slice(b,c),e=[],f=0;a.each(d,function(b,c){e.push(a(c).height())}),f=Math.max.apply(null,e),this._core.$stage.parent().height(f).addClass(this._core.settings.autoHeightClass)},e.prototype.destroy=function(){var a,b;for(a in this._handlers)this._core.$element.off(a,this._handlers[a]);for(b in Object.getOwnPropertyNames(this))"function"!=typeof this[b]&&(this[b]=null)},a.fn.owlCarousel.Constructor.Plugins.AutoHeight=e}(window.Zepto||window.jQuery,window,document),function(a,b,c,d){var e=function(b){this._core=b,this._videos={},this._playing=null,this._handlers={"initialized.owl.carousel":a.proxy(function(a){a.namespace&&this._core.register({type:"state",name:"playing",tags:["interacting"]})},this),"resize.owl.carousel":a.proxy(function(a){a.namespace&&this._core.settings.video&&this.isInFullScreen()&&a.preventDefault()},this),"refreshed.owl.carousel":a.proxy(function(a){a.namespace&&this._core.is("resizing")&&this._core.$stage.find(".cloned .owl-video-frame").remove()},this),"changed.owl.carousel":a.proxy(function(a){a.namespace&&"position"===a.property.name&&this._playing&&this.stop()},this),"prepared.owl.carousel":a.proxy(function(b){if(b.namespace){var c=a(b.content).find(".owl-video");c.length&&(c.css("display","none"),this.fetch(c,a(b.content)))}},this)},this._core.options=a.extend({},e.Defaults,this._core.options),this._core.$element.on(this._handlers),this._core.$element.on("click.owl.video",".owl-video-play-icon",a.proxy(function(a){this.play(a)},this))};e.Defaults={video:!1,videoHeight:!1,videoWidth:!1},e.prototype.fetch=function(a,b){var c=function(){return a.attr("data-vimeo-id")?"vimeo":a.attr("data-vzaar-id")?"vzaar":"youtube"}(),d=a.attr("data-vimeo-id")||a.attr("data-youtube-id")||a.attr("data-vzaar-id"),e=a.attr("data-width")||this._core.settings.videoWidth,f=a.attr("data-height")||this._core.settings.videoHeight,g=a.attr("href");if(!g)throw new Error("Missing video URL.");if(d=g.match(/(http:|https:|)\/\/(player.|www.|app.)?(vimeo\.com|youtu(be\.com|\.be|be\.googleapis\.com)|vzaar\.com)\/(video\/|videos\/|embed\/|channels\/.+\/|groups\/.+\/|watch\?v=|v\/)?([A-Za-z0-9._%-]*)(\&\S+)?/),d[3].indexOf("youtu")>-1)c="youtube";else if(d[3].indexOf("vimeo")>-1)c="vimeo";else{if(!(d[3].indexOf("vzaar")>-1))throw new Error("Video URL not supported.");c="vzaar"}d=d[6],this._videos[g]={type:c,id:d,width:e,height:f},b.attr("data-video",g),this.thumbnail(a,this._videos[g])},e.prototype.thumbnail=function(b,c){var d,e,f,g=c.width&&c.height?'style="width:'+c.width+"px;height:"+c.height+'px;"':"",h=b.find("img"),i="src",j="",k=this._core.settings,l=function(a){e='<div class="owl-video-play-icon"></div>',d=k.lazyLoad?'<div class="owl-video-tn '+j+'" '+i+'="'+a+'"></div>':'<div class="owl-video-tn" style="opacity:1;background-image:url('+a+')"></div>',b.after(d),b.after(e)};if(b.wrap('<div class="owl-video-wrapper"'+g+"></div>"),this._core.settings.lazyLoad&&(i="data-src",j="owl-lazy"),h.length)return l(h.attr(i)),h.remove(),!1;"youtube"===c.type?(f="//img.youtube.com/vi/"+c.id+"/hqdefault.jpg",l(f)):"vimeo"===c.type?a.ajax({type:"GET",url:"//vimeo.com/api/v2/video/"+c.id+".json",jsonp:"callback",dataType:"jsonp",success:function(a){f=a[0].thumbnail_large,l(f)}}):"vzaar"===c.type&&a.ajax({type:"GET",url:"//vzaar.com/api/videos/"+c.id+".json",jsonp:"callback",dataType:"jsonp",success:function(a){f=a.framegrab_url,l(f)}})},e.prototype.stop=function(){this._core.trigger("stop",null,"video"),this._playing.find(".owl-video-frame").remove(),this._playing.removeClass("owl-video-playing"),this._playing=null,this._core.leave("playing"),this._core.trigger("stopped",null,"video")},e.prototype.play=function(b){var c,d=a(b.target),e=d.closest("."+this._core.settings.itemClass),f=this._videos[e.attr("data-video")],g=f.width||"100%",h=f.height||this._core.$stage.height();this._playing||(this._core.enter("playing"),this._core.trigger("play",null,"video"),e=this._core.items(this._core.relative(e.index())),this._core.reset(e.index()),"youtube"===f.type?c='<iframe width="'+g+'" height="'+h+'" src="//www.youtube.com/embed/'+f.id+"?autoplay=1&rel=0&v="+f.id+'" frameborder="0" allowfullscreen></iframe>':"vimeo"===f.type?c='<iframe src="//player.vimeo.com/video/'+f.id+'?autoplay=1" width="'+g+'" height="'+h+'" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>':"vzaar"===f.type&&(c='<iframe frameborder="0"height="'+h+'"width="'+g+'" allowfullscreen mozallowfullscreen webkitAllowFullScreen src="//view.vzaar.com/'+f.id+'/player?autoplay=true"></iframe>'),a('<div class="owl-video-frame">'+c+"</div>").insertAfter(e.find(".owl-video")),this._playing=e.addClass("owl-video-playing"))},e.prototype.isInFullScreen=function(){var b=c.fullscreenElement||c.mozFullScreenElement||c.webkitFullscreenElement;return b&&a(b).parent().hasClass("owl-video-frame")},e.prototype.destroy=function(){var a,b;this._core.$element.off("click.owl.video");for(a in this._handlers)this._core.$element.off(a,this._handlers[a]);for(b in Object.getOwnPropertyNames(this))"function"!=typeof this[b]&&(this[b]=null)},a.fn.owlCarousel.Constructor.Plugins.Video=e}(window.Zepto||window.jQuery,window,document),function(a,b,c,d){var e=function(b){this.core=b,this.core.options=a.extend({},e.Defaults,this.core.options),this.swapping=!0,this.previous=d,this.next=d,this.handlers={"change.owl.carousel":a.proxy(function(a){a.namespace&&"position"==a.property.name&&(this.previous=this.core.current(),this.next=a.property.value)},this),"drag.owl.carousel dragged.owl.carousel translated.owl.carousel":a.proxy(function(a){a.namespace&&(this.swapping="translated"==a.type)},this),"translate.owl.carousel":a.proxy(function(a){a.namespace&&this.swapping&&(this.core.options.animateOut||this.core.options.animateIn)&&this.swap()},this)},this.core.$element.on(this.handlers)};e.Defaults={animateOut:!1,animateIn:!1},e.prototype.swap=function(){if(1===this.core.settings.items&&a.support.animation&&a.support.transition){this.core.speed(0);var b,c=a.proxy(this.clear,this),d=this.core.$stage.children().eq(this.previous),e=this.core.$stage.children().eq(this.next),f=this.core.settings.animateIn,g=this.core.settings.animateOut;this.core.current()!==this.previous&&(g&&(b=this.core.coordinates(this.previous)-this.core.coordinates(this.next),d.one(a.support.animation.end,c).css({left:b+"px"}).addClass("animated owl-animated-out").addClass(g)),f&&e.one(a.support.animation.end,c).addClass("animated owl-animated-in").addClass(f))}},e.prototype.clear=function(b){a(b.target).css({left:""}).removeClass("animated owl-animated-out owl-animated-in").removeClass(this.core.settings.animateIn).removeClass(this.core.settings.animateOut),this.core.onTransitionEnd()},e.prototype.destroy=function(){var a,b;for(a in this.handlers)this.core.$element.off(a,this.handlers[a]);for(b in Object.getOwnPropertyNames(this))"function"!=typeof this[b]&&(this[b]=null)},
7
+ a.fn.owlCarousel.Constructor.Plugins.Animate=e}(window.Zepto||window.jQuery,window,document),function(a,b,c,d){var e=function(b){this._core=b,this._timeout=null,this._paused=!1,this._handlers={"changed.owl.carousel":a.proxy(function(a){a.namespace&&"settings"===a.property.name?this._core.settings.autoplay?this.play():this.stop():a.namespace&&"position"===a.property.name&&this._core.settings.autoplay&&this._setAutoPlayInterval()},this),"initialized.owl.carousel":a.proxy(function(a){a.namespace&&this._core.settings.autoplay&&this.play()},this),"play.owl.autoplay":a.proxy(function(a,b,c){a.namespace&&this.play(b,c)},this),"stop.owl.autoplay":a.proxy(function(a){a.namespace&&this.stop()},this),"mouseover.owl.autoplay":a.proxy(function(){this._core.settings.autoplayHoverPause&&this._core.is("rotating")&&this.pause()},this),"mouseleave.owl.autoplay":a.proxy(function(){this._core.settings.autoplayHoverPause&&this._core.is("rotating")&&this.play()},this),"touchstart.owl.core":a.proxy(function(){this._core.settings.autoplayHoverPause&&this._core.is("rotating")&&this.pause()},this),"touchend.owl.core":a.proxy(function(){this._core.settings.autoplayHoverPause&&this.play()},this)},this._core.$element.on(this._handlers),this._core.options=a.extend({},e.Defaults,this._core.options)};e.Defaults={autoplay:!1,autoplayTimeout:5e3,autoplayHoverPause:!1,autoplaySpeed:!1},e.prototype.play=function(a,b){this._paused=!1,this._core.is("rotating")||(this._core.enter("rotating"),this._setAutoPlayInterval())},e.prototype._getNextTimeout=function(d,e){return this._timeout&&b.clearTimeout(this._timeout),b.setTimeout(a.proxy(function(){this._paused||this._core.is("busy")||this._core.is("interacting")||c.hidden||this._core.next(e||this._core.settings.autoplaySpeed)},this),d||this._core.settings.autoplayTimeout)},e.prototype._setAutoPlayInterval=function(){this._timeout=this._getNextTimeout()},e.prototype.stop=function(){this._core.is("rotating")&&(b.clearTimeout(this._timeout),this._core.leave("rotating"))},e.prototype.pause=function(){this._core.is("rotating")&&(this._paused=!0)},e.prototype.destroy=function(){var a,b;this.stop();for(a in this._handlers)this._core.$element.off(a,this._handlers[a]);for(b in Object.getOwnPropertyNames(this))"function"!=typeof this[b]&&(this[b]=null)},a.fn.owlCarousel.Constructor.Plugins.autoplay=e}(window.Zepto||window.jQuery,window,document),function(a,b,c,d){"use strict";var e=function(b){this._core=b,this._initialized=!1,this._pages=[],this._controls={},this._templates=[],this.$element=this._core.$element,this._overrides={next:this._core.next,prev:this._core.prev,to:this._core.to},this._handlers={"prepared.owl.carousel":a.proxy(function(b){b.namespace&&this._core.settings.dotsData&&this._templates.push('<div class="'+this._core.settings.dotClass+'">'+a(b.content).find("[data-dot]").addBack("[data-dot]").attr("data-dot")+"</div>")},this),"added.owl.carousel":a.proxy(function(a){a.namespace&&this._core.settings.dotsData&&this._templates.splice(a.position,0,this._templates.pop())},this),"remove.owl.carousel":a.proxy(function(a){a.namespace&&this._core.settings.dotsData&&this._templates.splice(a.position,1)},this),"changed.owl.carousel":a.proxy(function(a){a.namespace&&"position"==a.property.name&&this.draw()},this),"initialized.owl.carousel":a.proxy(function(a){a.namespace&&!this._initialized&&(this._core.trigger("initialize",null,"navigation"),this.initialize(),this.update(),this.draw(),this._initialized=!0,this._core.trigger("initialized",null,"navigation"))},this),"refreshed.owl.carousel":a.proxy(function(a){a.namespace&&this._initialized&&(this._core.trigger("refresh",null,"navigation"),this.update(),this.draw(),this._core.trigger("refreshed",null,"navigation"))},this)},this._core.options=a.extend({},e.Defaults,this._core.options),this.$element.on(this._handlers)};e.Defaults={nav:!1,navText:["prev","next"],navSpeed:!1,navElement:"div",navContainer:!1,navContainerClass:"owl-nav",navClass:["owl-prev","owl-next"],slideBy:1,dotClass:"owl-dot",dotsClass:"owl-dots",dots:!0,dotsEach:!1,dotsData:!1,dotsSpeed:!1,dotsContainer:!1},e.prototype.initialize=function(){var b,c=this._core.settings;this._controls.$relative=(c.navContainer?a(c.navContainer):a("<div>").addClass(c.navContainerClass).appendTo(this.$element)).addClass("disabled"),this._controls.$previous=a("<"+c.navElement+">").addClass(c.navClass[0]).html(c.navText[0]).prependTo(this._controls.$relative).on("click",a.proxy(function(a){this.prev(c.navSpeed)},this)),this._controls.$next=a("<"+c.navElement+">").addClass(c.navClass[1]).html(c.navText[1]).appendTo(this._controls.$relative).on("click",a.proxy(function(a){this.next(c.navSpeed)},this)),c.dotsData||(this._templates=[a("<div>").addClass(c.dotClass).append(a("<span>")).prop("outerHTML")]),this._controls.$absolute=(c.dotsContainer?a(c.dotsContainer):a("<div>").addClass(c.dotsClass).appendTo(this.$element)).addClass("disabled"),this._controls.$absolute.on("click","div",a.proxy(function(b){var d=a(b.target).parent().is(this._controls.$absolute)?a(b.target).index():a(b.target).parent().index();b.preventDefault(),this.to(d,c.dotsSpeed)},this));for(b in this._overrides)this._core[b]=a.proxy(this[b],this)},e.prototype.destroy=function(){var a,b,c,d;for(a in this._handlers)this.$element.off(a,this._handlers[a]);for(b in this._controls)this._controls[b].remove();for(d in this.overides)this._core[d]=this._overrides[d];for(c in Object.getOwnPropertyNames(this))"function"!=typeof this[c]&&(this[c]=null)},e.prototype.update=function(){var a,b,c,d=this._core.clones().length/2,e=d+this._core.items().length,f=this._core.maximum(!0),g=this._core.settings,h=g.center||g.autoWidth||g.dotsData?1:g.dotsEach||g.items;if("page"!==g.slideBy&&(g.slideBy=Math.min(g.slideBy,g.items)),g.dots||"page"==g.slideBy)for(this._pages=[],a=d,b=0,c=0;a<e;a++){if(b>=h||0===b){if(this._pages.push({start:Math.min(f,a-d),end:a-d+h-1}),Math.min(f,a-d)===f)break;b=0,++c}b+=this._core.mergers(this._core.relative(a))}},e.prototype.draw=function(){var b,c=this._core.settings,d=this._core.items().length<=c.items,e=this._core.relative(this._core.current()),f=c.loop||c.rewind;this._controls.$relative.toggleClass("disabled",!c.nav||d),c.nav&&(this._controls.$previous.toggleClass("disabled",!f&&e<=this._core.minimum(!0)),this._controls.$next.toggleClass("disabled",!f&&e>=this._core.maximum(!0))),this._controls.$absolute.toggleClass("disabled",!c.dots||d),c.dots&&(b=this._pages.length-this._controls.$absolute.children().length,c.dotsData&&0!==b?this._controls.$absolute.html(this._templates.join("")):b>0?this._controls.$absolute.append(new Array(b+1).join(this._templates[0])):b<0&&this._controls.$absolute.children().slice(b).remove(),this._controls.$absolute.find(".active").removeClass("active"),this._controls.$absolute.children().eq(a.inArray(this.current(),this._pages)).addClass("active"))},e.prototype.onTrigger=function(b){var c=this._core.settings;b.page={index:a.inArray(this.current(),this._pages),count:this._pages.length,size:c&&(c.center||c.autoWidth||c.dotsData?1:c.dotsEach||c.items)}},e.prototype.current=function(){var b=this._core.relative(this._core.current());return a.grep(this._pages,a.proxy(function(a,c){return a.start<=b&&a.end>=b},this)).pop()},e.prototype.getPosition=function(b){var c,d,e=this._core.settings;return"page"==e.slideBy?(c=a.inArray(this.current(),this._pages),d=this._pages.length,b?++c:--c,c=this._pages[(c%d+d)%d].start):(c=this._core.relative(this._core.current()),d=this._core.items().length,b?c+=e.slideBy:c-=e.slideBy),c},e.prototype.next=function(b){a.proxy(this._overrides.to,this._core)(this.getPosition(!0),b)},e.prototype.prev=function(b){a.proxy(this._overrides.to,this._core)(this.getPosition(!1),b)},e.prototype.to=function(b,c,d){var e;!d&&this._pages.length?(e=this._pages.length,a.proxy(this._overrides.to,this._core)(this._pages[(b%e+e)%e].start,c)):a.proxy(this._overrides.to,this._core)(b,c)},a.fn.owlCarousel.Constructor.Plugins.Navigation=e}(window.Zepto||window.jQuery,window,document),function(a,b,c,d){"use strict";var e=function(c){this._core=c,this._hashes={},this.$element=this._core.$element,this._handlers={"initialized.owl.carousel":a.proxy(function(c){c.namespace&&"URLHash"===this._core.settings.startPosition&&a(b).trigger("hashchange.owl.navigation")},this),"prepared.owl.carousel":a.proxy(function(b){if(b.namespace){var c=a(b.content).find("[data-hash]").addBack("[data-hash]").attr("data-hash");if(!c)return;this._hashes[c]=b.content}},this),"changed.owl.carousel":a.proxy(function(c){if(c.namespace&&"position"===c.property.name){var d=this._core.items(this._core.relative(this._core.current())),e=a.map(this._hashes,function(a,b){return a===d?b:null}).join();if(!e||b.location.hash.slice(1)===e)return;b.location.hash=e}},this)},this._core.options=a.extend({},e.Defaults,this._core.options),this.$element.on(this._handlers),a(b).on("hashchange.owl.navigation",a.proxy(function(a){var c=b.location.hash.substring(1),e=this._core.$stage.children(),f=this._hashes[c]&&e.index(this._hashes[c]);f!==d&&f!==this._core.current()&&this._core.to(this._core.relative(f),!1,!0)},this))};e.Defaults={URLhashListener:!1},e.prototype.destroy=function(){var c,d;a(b).off("hashchange.owl.navigation");for(c in this._handlers)this._core.$element.off(c,this._handlers[c]);for(d in Object.getOwnPropertyNames(this))"function"!=typeof this[d]&&(this[d]=null)},a.fn.owlCarousel.Constructor.Plugins.Hash=e}(window.Zepto||window.jQuery,window,document),function(a,b,c,d){function e(b,c){var e=!1,f=b.charAt(0).toUpperCase()+b.slice(1);return a.each((b+" "+h.join(f+" ")+f).split(" "),function(a,b){if(g[b]!==d)return e=!c||b,!1}),e}function f(a){return e(a,!0)}var g=a("<support>").get(0).style,h="Webkit Moz O ms".split(" "),i={transition:{end:{WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd",transition:"transitionend"}},animation:{end:{WebkitAnimation:"webkitAnimationEnd",MozAnimation:"animationend",OAnimation:"oAnimationEnd",animation:"animationend"}}},j={csstransforms:function(){return!!e("transform")},csstransforms3d:function(){return!!e("perspective")},csstransitions:function(){return!!e("transition")},cssanimations:function(){return!!e("animation")}};j.csstransitions()&&(a.support.transition=new String(f("transition")),a.support.transition.end=i.transition.end[a.support.transition]),j.cssanimations()&&(a.support.animation=new String(f("animation")),a.support.animation.end=i.animation.end[a.support.animation]),j.csstransforms()&&(a.support.transform=new String(f("transform")),a.support.transform3d=j.csstransforms3d())}(window.Zepto||window.jQuery,window,document);
static/lib/waypoints/links.php ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ <?php
2
+ $links = array(
3
+ 'js' => 'lib/waypoints/waypoints.min.js'
4
+ );
5
+ ?>
static/lib/waypoints/waypoints.min.js ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ /*!
2
+ Waypoints - 4.0.1
3
+ Copyright © 2011-2016 Caleb Troughton
4
+ Licensed under the MIT license.
5
+ https://github.com/imakewebthings/waypoints/blob/master/licenses.txt
6
+ */
7
+ !function(){"use strict";function t(o){if(!o)throw new Error("No options passed to Waypoint constructor");if(!o.element)throw new Error("No element option passed to Waypoint constructor");if(!o.handler)throw new Error("No handler option passed to Waypoint constructor");this.key="waypoint-"+e,this.options=t.Adapter.extend({},t.defaults,o),this.element=this.options.element,this.adapter=new t.Adapter(this.element),this.callback=o.handler,this.axis=this.options.horizontal?"horizontal":"vertical",this.enabled=this.options.enabled,this.triggerPoint=null,this.group=t.Group.findOrCreate({name:this.options.group,axis:this.axis}),this.context=t.Context.findOrCreateByElement(this.options.context),t.offsetAliases[this.options.offset]&&(this.options.offset=t.offsetAliases[this.options.offset]),this.group.add(this),this.context.add(this),i[this.key]=this,e+=1}var e=0,i={};t.prototype.queueTrigger=function(t){this.group.queueTrigger(this,t)},t.prototype.trigger=function(t){this.enabled&&this.callback&&this.callback.apply(this,t)},t.prototype.destroy=function(){this.context.remove(this),this.group.remove(this),delete i[this.key]},t.prototype.disable=function(){return this.enabled=!1,this},t.prototype.enable=function(){return this.context.refresh(),this.enabled=!0,this},t.prototype.next=function(){return this.group.next(this)},t.prototype.previous=function(){return this.group.previous(this)},t.invokeAll=function(t){var e=[];for(var o in i)e.push(i[o]);for(var n=0,r=e.length;r>n;n++)e[n][t]()},t.destroyAll=function(){t.invokeAll("destroy")},t.disableAll=function(){t.invokeAll("disable")},t.enableAll=function(){t.Context.refreshAll();for(var e in i)i[e].enabled=!0;return this},t.refreshAll=function(){t.Context.refreshAll()},t.viewportHeight=function(){return window.innerHeight||document.documentElement.clientHeight},t.viewportWidth=function(){return document.documentElement.clientWidth},t.adapters=[],t.defaults={context:window,continuous:!0,enabled:!0,group:"default",horizontal:!1,offset:0},t.offsetAliases={"bottom-in-view":function(){return this.context.innerHeight()-this.adapter.outerHeight()},"right-in-view":function(){return this.context.innerWidth()-this.adapter.outerWidth()}},window.Waypoint=t}(),function(){"use strict";function t(t){window.setTimeout(t,1e3/60)}function e(t){this.element=t,this.Adapter=n.Adapter,this.adapter=new this.Adapter(t),this.key="waypoint-context-"+i,this.didScroll=!1,this.didResize=!1,this.oldScroll={x:this.adapter.scrollLeft(),y:this.adapter.scrollTop()},this.waypoints={vertical:{},horizontal:{}},t.waypointContextKey=this.key,o[t.waypointContextKey]=this,i+=1,n.windowContext||(n.windowContext=!0,n.windowContext=new e(window)),this.createThrottledScrollHandler(),this.createThrottledResizeHandler()}var i=0,o={},n=window.Waypoint,r=window.onload;e.prototype.add=function(t){var e=t.options.horizontal?"horizontal":"vertical";this.waypoints[e][t.key]=t,this.refresh()},e.prototype.checkEmpty=function(){var t=this.Adapter.isEmptyObject(this.waypoints.horizontal),e=this.Adapter.isEmptyObject(this.waypoints.vertical),i=this.element==this.element.window;t&&e&&!i&&(this.adapter.off(".waypoints"),delete o[this.key])},e.prototype.createThrottledResizeHandler=function(){function t(){e.handleResize(),e.didResize=!1}var e=this;this.adapter.on("resize.waypoints",function(){e.didResize||(e.didResize=!0,n.requestAnimationFrame(t))})},e.prototype.createThrottledScrollHandler=function(){function t(){e.handleScroll(),e.didScroll=!1}var e=this;this.adapter.on("scroll.waypoints",function(){(!e.didScroll||n.isTouch)&&(e.didScroll=!0,n.requestAnimationFrame(t))})},e.prototype.handleResize=function(){n.Context.refreshAll()},e.prototype.handleScroll=function(){var t={},e={horizontal:{newScroll:this.adapter.scrollLeft(),oldScroll:this.oldScroll.x,forward:"right",backward:"left"},vertical:{newScroll:this.adapter.scrollTop(),oldScroll:this.oldScroll.y,forward:"down",backward:"up"}};for(var i in e){var o=e[i],n=o.newScroll>o.oldScroll,r=n?o.forward:o.backward;for(var s in this.waypoints[i]){var a=this.waypoints[i][s];if(null!==a.triggerPoint){var l=o.oldScroll<a.triggerPoint,h=o.newScroll>=a.triggerPoint,p=l&&h,u=!l&&!h;(p||u)&&(a.queueTrigger(r),t[a.group.id]=a.group)}}}for(var c in t)t[c].flushTriggers();this.oldScroll={x:e.horizontal.newScroll,y:e.vertical.newScroll}},e.prototype.innerHeight=function(){return this.element==this.element.window?n.viewportHeight():this.adapter.innerHeight()},e.prototype.remove=function(t){delete this.waypoints[t.axis][t.key],this.checkEmpty()},e.prototype.innerWidth=function(){return this.element==this.element.window?n.viewportWidth():this.adapter.innerWidth()},e.prototype.destroy=function(){var t=[];for(var e in this.waypoints)for(var i in this.waypoints[e])t.push(this.waypoints[e][i]);for(var o=0,n=t.length;n>o;o++)t[o].destroy()},e.prototype.refresh=function(){var t,e=this.element==this.element.window,i=e?void 0:this.adapter.offset(),o={};this.handleScroll(),t={horizontal:{contextOffset:e?0:i.left,contextScroll:e?0:this.oldScroll.x,contextDimension:this.innerWidth(),oldScroll:this.oldScroll.x,forward:"right",backward:"left",offsetProp:"left"},vertical:{contextOffset:e?0:i.top,contextScroll:e?0:this.oldScroll.y,contextDimension:this.innerHeight(),oldScroll:this.oldScroll.y,forward:"down",backward:"up",offsetProp:"top"}};for(var r in t){var s=t[r];for(var a in this.waypoints[r]){var l,h,p,u,c,d=this.waypoints[r][a],f=d.options.offset,w=d.triggerPoint,y=0,g=null==w;d.element!==d.element.window&&(y=d.adapter.offset()[s.offsetProp]),"function"==typeof f?f=f.apply(d):"string"==typeof f&&(f=parseFloat(f),d.options.offset.indexOf("%")>-1&&(f=Math.ceil(s.contextDimension*f/100))),l=s.contextScroll-s.contextOffset,d.triggerPoint=Math.floor(y+l-f),h=w<s.oldScroll,p=d.triggerPoint>=s.oldScroll,u=h&&p,c=!h&&!p,!g&&u?(d.queueTrigger(s.backward),o[d.group.id]=d.group):!g&&c?(d.queueTrigger(s.forward),o[d.group.id]=d.group):g&&s.oldScroll>=d.triggerPoint&&(d.queueTrigger(s.forward),o[d.group.id]=d.group)}}return n.requestAnimationFrame(function(){for(var t in o)o[t].flushTriggers()}),this},e.findOrCreateByElement=function(t){return e.findByElement(t)||new e(t)},e.refreshAll=function(){for(var t in o)o[t].refresh()},e.findByElement=function(t){return o[t.waypointContextKey]},window.onload=function(){r&&r(),e.refreshAll()},n.requestAnimationFrame=function(e){var i=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||t;i.call(window,e)},n.Context=e}(),function(){"use strict";function t(t,e){return t.triggerPoint-e.triggerPoint}function e(t,e){return e.triggerPoint-t.triggerPoint}function i(t){this.name=t.name,this.axis=t.axis,this.id=this.name+"-"+this.axis,this.waypoints=[],this.clearTriggerQueues(),o[this.axis][this.name]=this}var o={vertical:{},horizontal:{}},n=window.Waypoint;i.prototype.add=function(t){this.waypoints.push(t)},i.prototype.clearTriggerQueues=function(){this.triggerQueues={up:[],down:[],left:[],right:[]}},i.prototype.flushTriggers=function(){for(var i in this.triggerQueues){var o=this.triggerQueues[i],n="up"===i||"left"===i;o.sort(n?e:t);for(var r=0,s=o.length;s>r;r+=1){var a=o[r];(a.options.continuous||r===o.length-1)&&a.trigger([i])}}this.clearTriggerQueues()},i.prototype.next=function(e){this.waypoints.sort(t);var i=n.Adapter.inArray(e,this.waypoints),o=i===this.waypoints.length-1;return o?null:this.waypoints[i+1]},i.prototype.previous=function(e){this.waypoints.sort(t);var i=n.Adapter.inArray(e,this.waypoints);return i?this.waypoints[i-1]:null},i.prototype.queueTrigger=function(t,e){this.triggerQueues[e].push(t)},i.prototype.remove=function(t){var e=n.Adapter.inArray(t,this.waypoints);e>-1&&this.waypoints.splice(e,1)},i.prototype.first=function(){return this.waypoints[0]},i.prototype.last=function(){return this.waypoints[this.waypoints.length-1]},i.findOrCreate=function(t){return o[t.axis][t.name]||new i(t)},n.Group=i}(),function(){"use strict";function t(t){this.$element=e(t)}var e=window.jQuery,i=window.Waypoint;e.each(["innerHeight","innerWidth","off","offset","on","outerHeight","outerWidth","scrollLeft","scrollTop"],function(e,i){t.prototype[i]=function(){var t=Array.prototype.slice.call(arguments);return this.$element[i].apply(this.$element,t)}}),e.each(["extend","inArray","isEmptyObject"],function(i,o){t[o]=e[o]}),i.adapters.push({name:"jquery",Adapter:t}),i.Adapter=t}(),function(){"use strict";function t(t){return function(){var i=[],o=arguments[0];return t.isFunction(arguments[0])&&(o=t.extend({},arguments[1]),o.handler=arguments[0]),this.each(function(){var n=t.extend({},o,{element:this});"string"==typeof n.context&&(n.context=t(this).closest(n.context)[0]),i.push(new e(n))}),i}}var e=window.Waypoint;window.jQuery&&(window.jQuery.fn.waypoint=t(window.jQuery)),window.Zepto&&(window.Zepto.fn.waypoint=t(window.Zepto))}();
static/lib/wow/wow.js ADDED
@@ -0,0 +1,542 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*
2
+ * WOW wow.js - v1.3.0 - 2016-10-04
3
+ * https://wowjs.uk
4
+ * Copyright (c) 2016 Thomas Grainger; Licensed MIT
5
+ */
6
+
7
+ (function (global, factory) {
8
+ if (typeof define === "function" && define.amd) {
9
+ define(['module', 'exports'], factory);
10
+ } else if (typeof exports !== "undefined") {
11
+ factory(module, exports);
12
+ } else {
13
+ var mod = {
14
+ exports: {}
15
+ };
16
+ factory(mod, mod.exports);
17
+ global.WOW = mod.exports;
18
+ }
19
+ })(this, function (module, exports) {
20
+ 'use strict';
21
+
22
+ Object.defineProperty(exports, "__esModule", {
23
+ value: true
24
+ });
25
+
26
+ var _class, _temp;
27
+
28
+ function _classCallCheck(instance, Constructor) {
29
+ if (!(instance instanceof Constructor)) {
30
+ throw new TypeError("Cannot call a class as a function");
31
+ }
32
+ }
33
+
34
+ var _createClass = function () {
35
+ function defineProperties(target, props) {
36
+ for (var i = 0; i < props.length; i++) {
37
+ var descriptor = props[i];
38
+ descriptor.enumerable = descriptor.enumerable || false;
39
+ descriptor.configurable = true;
40
+ if ("value" in descriptor) descriptor.writable = true;
41
+ Object.defineProperty(target, descriptor.key, descriptor);
42
+ }
43
+ }
44
+
45
+ return function (Constructor, protoProps, staticProps) {
46
+ if (protoProps) defineProperties(Constructor.prototype, protoProps);
47
+ if (staticProps) defineProperties(Constructor, staticProps);
48
+ return Constructor;
49
+ };
50
+ }();
51
+
52
+ function isIn(needle, haystack) {
53
+ return haystack.indexOf(needle) >= 0;
54
+ }
55
+
56
+ function extend(custom, defaults) {
57
+ for (var key in defaults) {
58
+ if (custom[key] == null) {
59
+ var value = defaults[key];
60
+ custom[key] = value;
61
+ }
62
+ }
63
+ return custom;
64
+ }
65
+
66
+ function isMobile(agent) {
67
+ return (/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(agent)
68
+ );
69
+ }
70
+
71
+ function createEvent(event) {
72
+ var bubble = arguments.length <= 1 || arguments[1] === undefined ? false : arguments[1];
73
+ var cancel = arguments.length <= 2 || arguments[2] === undefined ? false : arguments[2];
74
+ var detail = arguments.length <= 3 || arguments[3] === undefined ? null : arguments[3];
75
+
76
+ var customEvent = void 0;
77
+ if (document.createEvent != null) {
78
+ // W3C DOM
79
+ customEvent = document.createEvent('CustomEvent');
80
+ customEvent.initCustomEvent(event, bubble, cancel, detail);
81
+ } else if (document.createEventObject != null) {
82
+ // IE DOM < 9
83
+ customEvent = document.createEventObject();
84
+ customEvent.eventType = event;
85
+ } else {
86
+ customEvent.eventName = event;
87
+ }
88
+
89
+ return customEvent;
90
+ }
91
+
92
+ function emitEvent(elem, event) {
93
+ if (elem.dispatchEvent != null) {
94
+ // W3C DOM
95
+ elem.dispatchEvent(event);
96
+ } else if (event in (elem != null)) {
97
+ elem[event]();
98
+ } else if ('on' + event in (elem != null)) {
99
+ elem['on' + event]();
100
+ }
101
+ }
102
+
103
+ function addEvent(elem, event, fn) {
104
+ if (elem.addEventListener != null) {
105
+ // W3C DOM
106
+ elem.addEventListener(event, fn, false);
107
+ } else if (elem.attachEvent != null) {
108
+ // IE DOM
109
+ elem.attachEvent('on' + event, fn);
110
+ } else {
111
+ // fallback
112
+ elem[event] = fn;
113
+ }
114
+ }
115
+
116
+ function removeEvent(elem, event, fn) {
117
+ if (elem.removeEventListener != null) {
118
+ // W3C DOM
119
+ elem.removeEventListener(event, fn, false);
120
+ } else if (elem.detachEvent != null) {
121
+ // IE DOM
122
+ elem.detachEvent('on' + event, fn);
123
+ } else {
124
+ // fallback
125
+ delete elem[event];
126
+ }
127
+ }
128
+
129
+ function getInnerHeight() {
130
+ if ('innerHeight' in window) {
131
+ return window.innerHeight;
132
+ }
133
+
134
+ return document.documentElement.clientHeight;
135
+ }
136
+
137
+ // Minimalistic WeakMap shim, just in case.
138
+ var WeakMap = window.WeakMap || window.MozWeakMap || function () {
139
+ function WeakMap() {
140
+ _classCallCheck(this, WeakMap);
141
+
142
+ this.keys = [];
143
+ this.values = [];
144
+ }
145
+
146
+ _createClass(WeakMap, [{
147
+ key: 'get',
148
+ value: function get(key) {
149
+ for (var i = 0; i < this.keys.length; i++) {
150
+ var item = this.keys[i];
151
+ if (item === key) {
152
+ return this.values[i];
153
+ }
154
+ }
155
+ return undefined;
156
+ }
157
+ }, {
158
+ key: 'set',
159
+ value: function set(key, value) {
160
+ for (var i = 0; i < this.keys.length; i++) {
161
+ var item = this.keys[i];
162
+ if (item === key) {
163
+ this.values[i] = value;
164
+ return this;
165
+ }
166
+ }
167
+ this.keys.push(key);
168
+ this.values.push(value);
169
+ return this;
170
+ }
171
+ }]);
172
+
173
+ return WeakMap;
174
+ }();
175
+
176
+ // Dummy MutationObserver, to avoid raising exceptions.
177
+ var MutationObserver = window.MutationObserver || window.WebkitMutationObserver || window.MozMutationObserver || (_temp = _class = function () {
178
+ function MutationObserver() {
179
+ _classCallCheck(this, MutationObserver);
180
+
181
+ if (typeof console !== 'undefined' && console !== null) {
182
+ console.warn('MutationObserver is not supported by your browser.');
183
+ console.warn('WOW.js cannot detect dom mutations, please call .sync() after loading new content.');
184
+ }
185
+ }
186
+
187
+ _createClass(MutationObserver, [{
188
+ key: 'observe',
189
+ value: function observe() {}
190
+ }]);
191
+
192
+ return MutationObserver;
193
+ }(), _class.notSupported = true, _temp);
194
+
195
+ // getComputedStyle shim, from http://stackoverflow.com/a/21797294
196
+ var getComputedStyle = window.getComputedStyle || function getComputedStyle(el) {
197
+ var getComputedStyleRX = /(\-([a-z]){1})/g;
198
+ return {
199
+ getPropertyValue: function getPropertyValue(prop) {
200
+ if (prop === 'float') {
201
+ prop = 'styleFloat';
202
+ }
203
+ if (getComputedStyleRX.test(prop)) {
204
+ prop.replace(getComputedStyleRX, function (_, _char) {
205
+ return _char.toUpperCase();
206
+ });
207
+ }
208
+ var currentStyle = el.currentStyle;
209
+
210
+ return (currentStyle != null ? currentStyle[prop] : void 0) || null;
211
+ }
212
+ };
213
+ };
214
+
215
+ var WOW = function () {
216
+ function WOW() {
217
+ var options = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0];
218
+
219
+ _classCallCheck(this, WOW);
220
+
221
+ this.defaults = {
222
+ boxClass: 'wow',
223
+ animateClass: 'animated',
224
+ offset: 0,
225
+ mobile: true,
226
+ live: true,
227
+ callback: null,
228
+ scrollContainer: null,
229
+ resetAnimation: true
230
+ };
231
+
232
+ this.animate = function animateFactory() {
233
+ if ('requestAnimationFrame' in window) {
234
+ return function (callback) {
235
+ return window.requestAnimationFrame(callback);
236
+ };
237
+ }
238
+ return function (callback) {
239
+ return callback();
240
+ };
241
+ }();
242
+
243
+ this.vendors = ['moz', 'webkit'];
244
+
245
+ this.start = this.start.bind(this);
246
+ this.resetAnimation = this.resetAnimation.bind(this);
247
+ this.scrollHandler = this.scrollHandler.bind(this);
248
+ this.scrollCallback = this.scrollCallback.bind(this);
249
+ this.scrolled = true;
250
+ this.config = extend(options, this.defaults);
251
+ if (options.scrollContainer != null) {
252
+ this.config.scrollContainer = document.querySelector(options.scrollContainer);
253
+ }
254
+ // Map of elements to animation names:
255
+ this.animationNameCache = new WeakMap();
256
+ this.wowEvent = createEvent(this.config.boxClass);
257
+ }
258
+
259
+ _createClass(WOW, [{
260
+ key: 'init',
261
+ value: function init() {
262
+ this.element = window.document.documentElement;
263
+ if (isIn(document.readyState, ['interactive', 'complete'])) {
264
+ this.start();
265
+ } else {
266
+ addEvent(document, 'DOMContentLoaded', this.start);
267
+ }
268
+ this.finished = [];
269
+ }
270
+ }, {
271
+ key: 'start',
272
+ value: function start() {
273
+ var _this = this;
274
+
275
+ this.stopped = false;
276
+ this.boxes = [].slice.call(this.element.querySelectorAll('.' + this.config.boxClass));
277
+ this.all = this.boxes.slice(0);
278
+ if (this.boxes.length) {
279
+ if (this.disabled()) {
280
+ this.resetStyle();
281
+ } else {
282
+ for (var i = 0; i < this.boxes.length; i++) {
283
+ var box = this.boxes[i];
284
+ this.applyStyle(box, true);
285
+ }
286
+ }
287
+ }
288
+ if (!this.disabled()) {
289
+ addEvent(this.config.scrollContainer || window, 'scroll', this.scrollHandler);
290
+ addEvent(window, 'resize', this.scrollHandler);
291
+ this.interval = setInterval(this.scrollCallback, 50);
292
+ }
293
+ if (this.config.live) {
294
+ var mut = new MutationObserver(function (records) {
295
+ for (var j = 0; j < records.length; j++) {
296
+ var record = records[j];
297
+ for (var k = 0; k < record.addedNodes.length; k++) {
298
+ var node = record.addedNodes[k];
299
+ _this.doSync(node);
300
+ }
301
+ }
302
+ return undefined;
303
+ });
304
+ mut.observe(document.body, {
305
+ childList: true,
306
+ subtree: true
307
+ });
308
+ }
309
+ }
310
+ }, {
311
+ key: 'stop',
312
+ value: function stop() {
313
+ this.stopped = true;
314
+ removeEvent(this.config.scrollContainer || window, 'scroll', this.scrollHandler);
315
+ removeEvent(window, 'resize', this.scrollHandler);
316
+ if (this.interval != null) {
317
+ clearInterval(this.interval);
318
+ }
319
+ }
320
+ }, {
321
+ key: 'sync',
322
+ value: function sync() {
323
+ if (MutationObserver.notSupported) {
324
+ this.doSync(this.element);
325
+ }
326
+ }
327
+ }, {
328
+ key: 'doSync',
329
+ value: function doSync(element) {
330
+ if (typeof element === 'undefined' || element === null) {
331
+ element = this.element;
332
+ }
333
+ if (element.nodeType !== 1) {
334
+ return;
335
+ }
336
+ element = element.parentNode || element;
337
+ var iterable = element.querySelectorAll('.' + this.config.boxClass);
338
+ for (var i = 0; i < iterable.length; i++) {
339
+ var box = iterable[i];
340
+ if (!isIn(box, this.all)) {
341
+ this.boxes.push(box);
342
+ this.all.push(box);
343
+ if (this.stopped || this.disabled()) {
344
+ this.resetStyle();
345
+ } else {
346
+ this.applyStyle(box, true);
347
+ }
348
+ this.scrolled = true;
349
+ }
350
+ }
351
+ }
352
+ }, {
353
+ key: 'show',
354
+ value: function show(box) {
355
+ this.applyStyle(box);
356
+ box.className = box.className + ' ' + this.config.animateClass;
357
+ if (this.config.callback != null) {
358
+ this.config.callback(box);
359
+ }
360
+ emitEvent(box, this.wowEvent);
361
+
362
+ if (this.config.resetAnimation) {
363
+ addEvent(box, 'animationend', this.resetAnimation);
364
+ addEvent(box, 'oanimationend', this.resetAnimation);
365
+ addEvent(box, 'webkitAnimationEnd', this.resetAnimation);
366
+ addEvent(box, 'MSAnimationEnd', this.resetAnimation);
367
+ }
368
+
369
+ return box;
370
+ }
371
+ }, {
372
+ key: 'applyStyle',
373
+ value: function applyStyle(box, hidden) {
374
+ var _this2 = this;
375
+
376
+ var duration = box.getAttribute('data-wow-duration');
377
+ var delay = box.getAttribute('data-wow-delay');
378
+ var iteration = box.getAttribute('data-wow-iteration');
379
+
380
+ return this.animate(function () {
381
+ return _this2.customStyle(box, hidden, duration, delay, iteration);
382
+ });
383
+ }
384
+ }, {
385
+ key: 'resetStyle',
386
+ value: function resetStyle() {
387
+ for (var i = 0; i < this.boxes.length; i++) {
388
+ var box = this.boxes[i];
389
+ box.style.visibility = 'visible';
390
+ }
391
+ return undefined;
392
+ }
393
+ }, {
394
+ key: 'resetAnimation',
395
+ value: function resetAnimation(event) {
396
+ if (event.type.toLowerCase().indexOf('animationend') >= 0) {
397
+ var target = event.target || event.srcElement;
398
+ target.className = target.className.replace(this.config.animateClass, '').trim();
399
+ }
400
+ }
401
+ }, {
402
+ key: 'customStyle',
403
+ value: function customStyle(box, hidden, duration, delay, iteration) {
404
+ if (hidden) {
405
+ this.cacheAnimationName(box);
406
+ }
407
+ box.style.visibility = hidden ? 'hidden' : 'visible';
408
+
409
+ if (duration) {
410
+ this.vendorSet(box.style, { animationDuration: duration });
411
+ }
412
+ if (delay) {
413
+ this.vendorSet(box.style, { animationDelay: delay });
414
+ }
415
+ if (iteration) {
416
+ this.vendorSet(box.style, { animationIterationCount: iteration });
417
+ }
418
+ this.vendorSet(box.style, { animationName: hidden ? 'none' : this.cachedAnimationName(box) });
419
+
420
+ return box;
421
+ }
422
+ }, {
423
+ key: 'vendorSet',
424
+ value: function vendorSet(elem, properties) {
425
+ for (var name in properties) {
426
+ if (properties.hasOwnProperty(name)) {
427
+ var value = properties[name];
428
+ elem['' + name] = value;
429
+ for (var i = 0; i < this.vendors.length; i++) {
430
+ var vendor = this.vendors[i];
431
+ elem['' + vendor + name.charAt(0).toUpperCase() + name.substr(1)] = value;
432
+ }
433
+ }
434
+ }
435
+ }
436
+ }, {
437
+ key: 'vendorCSS',
438
+ value: function vendorCSS(elem, property) {
439
+ var style = getComputedStyle(elem);
440
+ var result = style.getPropertyCSSValue(property);
441
+ for (var i = 0; i < this.vendors.length; i++) {
442
+ var vendor = this.vendors[i];
443
+ result = result || style.getPropertyCSSValue('-' + vendor + '-' + property);
444
+ }
445
+ return result;
446
+ }
447
+ }, {
448
+ key: 'animationName',
449
+ value: function animationName(box) {
450
+ var aName = void 0;
451
+ try {
452
+ aName = this.vendorCSS(box, 'animation-name').cssText;
453
+ } catch (error) {
454
+ // Opera, fall back to plain property value
455
+ aName = getComputedStyle(box).getPropertyValue('animation-name');
456
+ }
457
+
458
+ if (aName === 'none') {
459
+ return ''; // SVG/Firefox, unable to get animation name?
460
+ }
461
+
462
+ return aName;
463
+ }
464
+ }, {
465
+ key: 'cacheAnimationName',
466
+ value: function cacheAnimationName(box) {
467
+ // https://bugzilla.mozilla.org/show_bug.cgi?id=921834
468
+ // box.dataset is not supported for SVG elements in Firefox
469
+ return this.animationNameCache.set(box, this.animationName(box));
470
+ }
471
+ }, {
472
+ key: 'cachedAnimationName',
473
+ value: function cachedAnimationName(box) {
474
+ return this.animationNameCache.get(box);
475
+ }
476
+ }, {
477
+ key: 'scrollHandler',
478
+ value: function scrollHandler() {
479
+ this.scrolled = true;
480
+ }
481
+ }, {
482
+ key: 'scrollCallback',
483
+ value: function scrollCallback() {
484
+ if (this.scrolled) {
485
+ this.scrolled = false;
486
+ var results = [];
487
+ for (var i = 0; i < this.boxes.length; i++) {
488
+ var box = this.boxes[i];
489
+ if (box) {
490
+ if (this.isVisible(box)) {
491
+ this.show(box);
492
+ continue;
493
+ }
494
+ results.push(box);
495
+ }
496
+ }
497
+ this.boxes = results;
498
+ if (!this.boxes.length && !this.config.live) {
499
+ this.stop();
500
+ }
501
+ }
502
+ }
503
+ }, {
504
+ key: 'offsetTop',
505
+ value: function offsetTop(element) {
506
+ // SVG elements don't have an offsetTop in Firefox.
507
+ // This will use their nearest parent that has an offsetTop.
508
+ // Also, using ('offsetTop' of element) causes an exception in Firefox.
509
+ while (element.offsetTop === undefined) {
510
+ element = element.parentNode;
511
+ }
512
+ var top = element.offsetTop;
513
+ while (element.offsetParent) {
514
+ element = element.offsetParent;
515
+ top += element.offsetTop;
516
+ }
517
+ return top;
518
+ }
519
+ }, {
520
+ key: 'isVisible',
521
+ value: function isVisible(box) {
522
+ var offset = box.getAttribute('data-wow-offset') || this.config.offset;
523
+ var viewTop = this.config.scrollContainer && this.config.scrollContainer.scrollTop || window.pageYOffset;
524
+ var viewBottom = viewTop + Math.min(this.element.clientHeight, getInnerHeight()) - offset;
525
+ var top = this.offsetTop(box);
526
+ var bottom = top + box.clientHeight;
527
+
528
+ return top <= viewBottom && bottom >= viewTop;
529
+ }
530
+ }, {
531
+ key: 'disabled',
532
+ value: function disabled() {
533
+ return !this.config.mobile && isMobile(navigator.userAgent);
534
+ }
535
+ }]);
536
+
537
+ return WOW;
538
+ }();
539
+
540
+ exports.default = WOW;
541
+ module.exports = exports['default'];
542
+ });
static/lib/wow/wow.min.js ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ /*! WOW wow.js - v1.3.0 - 2016-10-04
2
+ * https://wowjs.uk
3
+ * Copyright (c) 2016 Thomas Grainger; Licensed MIT */!function(a,b){if("function"==typeof define&&define.amd)define(["module","exports"],b);else if("undefined"!=typeof exports)b(module,exports);else{var c={exports:{}};b(c,c.exports),a.WOW=c.exports}}(this,function(a,b){"use strict";function c(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function d(a,b){return b.indexOf(a)>=0}function e(a,b){for(var c in b)if(null==a[c]){var d=b[c];a[c]=d}return a}function f(a){return/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(a)}function g(a){var b=arguments.length<=1||void 0===arguments[1]?!1:arguments[1],c=arguments.length<=2||void 0===arguments[2]?!1:arguments[2],d=arguments.length<=3||void 0===arguments[3]?null:arguments[3],e=void 0;return null!=document.createEvent?(e=document.createEvent("CustomEvent"),e.initCustomEvent(a,b,c,d)):null!=document.createEventObject?(e=document.createEventObject(),e.eventType=a):e.eventName=a,e}function h(a,b){null!=a.dispatchEvent?a.dispatchEvent(b):b in(null!=a)?a[b]():"on"+b in(null!=a)&&a["on"+b]()}function i(a,b,c){null!=a.addEventListener?a.addEventListener(b,c,!1):null!=a.attachEvent?a.attachEvent("on"+b,c):a[b]=c}function j(a,b,c){null!=a.removeEventListener?a.removeEventListener(b,c,!1):null!=a.detachEvent?a.detachEvent("on"+b,c):delete a[b]}function k(){return"innerHeight"in window?window.innerHeight:document.documentElement.clientHeight}Object.defineProperty(b,"__esModule",{value:!0});var l,m,n=function(){function a(a,b){for(var c=0;c<b.length;c++){var d=b[c];d.enumerable=d.enumerable||!1,d.configurable=!0,"value"in d&&(d.writable=!0),Object.defineProperty(a,d.key,d)}}return function(b,c,d){return c&&a(b.prototype,c),d&&a(b,d),b}}(),o=window.WeakMap||window.MozWeakMap||function(){function a(){c(this,a),this.keys=[],this.values=[]}return n(a,[{key:"get",value:function(a){for(var b=0;b<this.keys.length;b++){var c=this.keys[b];if(c===a)return this.values[b]}}},{key:"set",value:function(a,b){for(var c=0;c<this.keys.length;c++){var d=this.keys[c];if(d===a)return this.values[c]=b,this}return this.keys.push(a),this.values.push(b),this}}]),a}(),p=window.MutationObserver||window.WebkitMutationObserver||window.MozMutationObserver||(m=l=function(){function a(){c(this,a),"undefined"!=typeof console&&null!==console&&(console.warn("MutationObserver is not supported by your browser."),console.warn("WOW.js cannot detect dom mutations, please call .sync() after loading new content."))}return n(a,[{key:"observe",value:function(){}}]),a}(),l.notSupported=!0,m),q=window.getComputedStyle||function(a){var b=/(\-([a-z]){1})/g;return{getPropertyValue:function(c){"float"===c&&(c="styleFloat"),b.test(c)&&c.replace(b,function(a,b){return b.toUpperCase()});var d=a.currentStyle;return(null!=d?d[c]:void 0)||null}}},r=function(){function a(){var b=arguments.length<=0||void 0===arguments[0]?{}:arguments[0];c(this,a),this.defaults={boxClass:"wow",animateClass:"animated",offset:0,mobile:!0,live:!0,callback:null,scrollContainer:null,resetAnimation:!0},this.animate=function(){return"requestAnimationFrame"in window?function(a){return window.requestAnimationFrame(a)}:function(a){return a()}}(),this.vendors=["moz","webkit"],this.start=this.start.bind(this),this.resetAnimation=this.resetAnimation.bind(this),this.scrollHandler=this.scrollHandler.bind(this),this.scrollCallback=this.scrollCallback.bind(this),this.scrolled=!0,this.config=e(b,this.defaults),null!=b.scrollContainer&&(this.config.scrollContainer=document.querySelector(b.scrollContainer)),this.animationNameCache=new o,this.wowEvent=g(this.config.boxClass)}return n(a,[{key:"init",value:function(){this.element=window.document.documentElement,d(document.readyState,["interactive","complete"])?this.start():i(document,"DOMContentLoaded",this.start),this.finished=[]}},{key:"start",value:function(){var a=this;if(this.stopped=!1,this.boxes=[].slice.call(this.element.querySelectorAll("."+this.config.boxClass)),this.all=this.boxes.slice(0),this.boxes.length)if(this.disabled())this.resetStyle();else for(var b=0;b<this.boxes.length;b++){var c=this.boxes[b];this.applyStyle(c,!0)}if(this.disabled()||(i(this.config.scrollContainer||window,"scroll",this.scrollHandler),i(window,"resize",this.scrollHandler),this.interval=setInterval(this.scrollCallback,50)),this.config.live){var d=new p(function(b){for(var c=0;c<b.length;c++)for(var d=b[c],e=0;e<d.addedNodes.length;e++){var f=d.addedNodes[e];a.doSync(f)}});d.observe(document.body,{childList:!0,subtree:!0})}}},{key:"stop",value:function(){this.stopped=!0,j(this.config.scrollContainer||window,"scroll",this.scrollHandler),j(window,"resize",this.scrollHandler),null!=this.interval&&clearInterval(this.interval)}},{key:"sync",value:function(){p.notSupported&&this.doSync(this.element)}},{key:"doSync",value:function(a){if("undefined"!=typeof a&&null!==a||(a=this.element),1===a.nodeType){a=a.parentNode||a;for(var b=a.querySelectorAll("."+this.config.boxClass),c=0;c<b.length;c++){var e=b[c];d(e,this.all)||(this.boxes.push(e),this.all.push(e),this.stopped||this.disabled()?this.resetStyle():this.applyStyle(e,!0),this.scrolled=!0)}}}},{key:"show",value:function(a){return this.applyStyle(a),a.className=a.className+" "+this.config.animateClass,null!=this.config.callback&&this.config.callback(a),h(a,this.wowEvent),this.config.resetAnimation&&(i(a,"animationend",this.resetAnimation),i(a,"oanimationend",this.resetAnimation),i(a,"webkitAnimationEnd",this.resetAnimation),i(a,"MSAnimationEnd",this.resetAnimation)),a}},{key:"applyStyle",value:function(a,b){var c=this,d=a.getAttribute("data-wow-duration"),e=a.getAttribute("data-wow-delay"),f=a.getAttribute("data-wow-iteration");return this.animate(function(){return c.customStyle(a,b,d,e,f)})}},{key:"resetStyle",value:function(){for(var a=0;a<this.boxes.length;a++){var b=this.boxes[a];b.style.visibility="visible"}}},{key:"resetAnimation",value:function(a){if(a.type.toLowerCase().indexOf("animationend")>=0){var b=a.target||a.srcElement;b.className=b.className.replace(this.config.animateClass,"").trim()}}},{key:"customStyle",value:function(a,b,c,d,e){return b&&this.cacheAnimationName(a),a.style.visibility=b?"hidden":"visible",c&&this.vendorSet(a.style,{animationDuration:c}),d&&this.vendorSet(a.style,{animationDelay:d}),e&&this.vendorSet(a.style,{animationIterationCount:e}),this.vendorSet(a.style,{animationName:b?"none":this.cachedAnimationName(a)}),a}},{key:"vendorSet",value:function(a,b){for(var c in b)if(b.hasOwnProperty(c)){var d=b[c];a[""+c]=d;for(var e=0;e<this.vendors.length;e++){var f=this.vendors[e];a[""+f+c.charAt(0).toUpperCase()+c.substr(1)]=d}}}},{key:"vendorCSS",value:function(a,b){for(var c=q(a),d=c.getPropertyCSSValue(b),e=0;e<this.vendors.length;e++){var f=this.vendors[e];d=d||c.getPropertyCSSValue("-"+f+"-"+b)}return d}},{key:"animationName",value:function(a){var b=void 0;try{b=this.vendorCSS(a,"animation-name").cssText}catch(c){b=q(a).getPropertyValue("animation-name")}return"none"===b?"":b}},{key:"cacheAnimationName",value:function(a){return this.animationNameCache.set(a,this.animationName(a))}},{key:"cachedAnimationName",value:function(a){return this.animationNameCache.get(a)}},{key:"scrollHandler",value:function(){this.scrolled=!0}},{key:"scrollCallback",value:function(){if(this.scrolled){this.scrolled=!1;for(var a=[],b=0;b<this.boxes.length;b++){var c=this.boxes[b];if(c){if(this.isVisible(c)){this.show(c);continue}a.push(c)}}this.boxes=a,this.boxes.length||this.config.live||this.stop()}}},{key:"offsetTop",value:function(a){for(;void 0===a.offsetTop;)a=a.parentNode;for(var b=a.offsetTop;a.offsetParent;)a=a.offsetParent,b+=a.offsetTop;return b}},{key:"isVisible",value:function(a){var b=a.getAttribute("data-wow-offset")||this.config.offset,c=this.config.scrollContainer&&this.config.scrollContainer.scrollTop||window.pageYOffset,d=c+Math.min(this.element.clientHeight,k())-b,e=this.offsetTop(a),f=e+a.clientHeight;return d>=e&&f>=c}},{key:"disabled",value:function(){return!this.config.mobile&&f(navigator.userAgent)}}]),a}();b["default"]=r,a.exports=b["default"]});
static/scss/bootstrap.scss ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /******* Customized Bootstrap ********/
2
+
3
+ $primary: #FF3E41;
4
+ $secondary: #51CFED;
5
+ $light: #F8F2F0;
6
+ $dark: #060315;
7
+
8
+ $font-family-base: 'Inter', sans-serif;
9
+
10
+ $headings-font-family: 'Roboto', sans-serif;
11
+
12
+ $body-color: #555555;
13
+
14
+ $headings-color: $dark;
15
+
16
+ $headings-font-weight: 700;
17
+
18
+ $display-font-weight: 700;
19
+
20
+ $enable-responsive-font-sizes: true;
21
+
22
+ $border-radius: 0px;
23
+
24
+ $link-decoration: none;
25
+
26
+ $enable-negative-margins: true;
27
+
28
+ @import "bootstrap/scss/bootstrap";
static/scss/bootstrap/scss/_accordion.scss ADDED
@@ -0,0 +1,118 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ //
2
+ // Base styles
3
+ //
4
+
5
+ .accordion-button {
6
+ position: relative;
7
+ display: flex;
8
+ align-items: center;
9
+ width: 100%;
10
+ padding: $accordion-button-padding-y $accordion-button-padding-x;
11
+ @include font-size($font-size-base);
12
+ color: $accordion-button-color;
13
+ text-align: left; // Reset button style
14
+ background-color: $accordion-button-bg;
15
+ border: 0;
16
+ @include border-radius(0);
17
+ overflow-anchor: none;
18
+ @include transition($accordion-transition);
19
+
20
+ &:not(.collapsed) {
21
+ color: $accordion-button-active-color;
22
+ background-color: $accordion-button-active-bg;
23
+ box-shadow: inset 0 ($accordion-border-width * -1) 0 $accordion-border-color;
24
+
25
+ &::after {
26
+ background-image: escape-svg($accordion-button-active-icon);
27
+ transform: $accordion-icon-transform;
28
+ }
29
+ }
30
+
31
+ // Accordion icon
32
+ &::after {
33
+ flex-shrink: 0;
34
+ width: $accordion-icon-width;
35
+ height: $accordion-icon-width;
36
+ margin-left: auto;
37
+ content: "";
38
+ background-image: escape-svg($accordion-button-icon);
39
+ background-repeat: no-repeat;
40
+ background-size: $accordion-icon-width;
41
+ @include transition($accordion-icon-transition);
42
+ }
43
+
44
+ &:hover {
45
+ z-index: 2;
46
+ }
47
+
48
+ &:focus {
49
+ z-index: 3;
50
+ border-color: $accordion-button-focus-border-color;
51
+ outline: 0;
52
+ box-shadow: $accordion-button-focus-box-shadow;
53
+ }
54
+ }
55
+
56
+ .accordion-header {
57
+ margin-bottom: 0;
58
+ }
59
+
60
+ .accordion-item {
61
+ background-color: $accordion-bg;
62
+ border: $accordion-border-width solid $accordion-border-color;
63
+
64
+ &:first-of-type {
65
+ @include border-top-radius($accordion-border-radius);
66
+
67
+ .accordion-button {
68
+ @include border-top-radius($accordion-inner-border-radius);
69
+ }
70
+ }
71
+
72
+ &:not(:first-of-type) {
73
+ border-top: 0;
74
+ }
75
+
76
+ // Only set a border-radius on the last item if the accordion is collapsed
77
+ &:last-of-type {
78
+ @include border-bottom-radius($accordion-border-radius);
79
+
80
+ .accordion-button {
81
+ &.collapsed {
82
+ @include border-bottom-radius($accordion-inner-border-radius);
83
+ }
84
+ }
85
+
86
+ .accordion-collapse {
87
+ @include border-bottom-radius($accordion-border-radius);
88
+ }
89
+ }
90
+ }
91
+
92
+ .accordion-body {
93
+ padding: $accordion-body-padding-y $accordion-body-padding-x;
94
+ }
95
+
96
+
97
+ // Flush accordion items
98
+ //
99
+ // Remove borders and border-radius to keep accordion items edge-to-edge.
100
+
101
+ .accordion-flush {
102
+ .accordion-collapse {
103
+ border-width: 0;
104
+ }
105
+
106
+ .accordion-item {
107
+ border-right: 0;
108
+ border-left: 0;
109
+ @include border-radius(0);
110
+
111
+ &:first-child { border-top: 0; }
112
+ &:last-child { border-bottom: 0; }
113
+
114
+ .accordion-button {
115
+ @include border-radius(0);
116
+ }
117
+ }
118
+ }
static/scss/bootstrap/scss/_alert.scss ADDED
@@ -0,0 +1,57 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ //
2
+ // Base styles
3
+ //
4
+
5
+ .alert {
6
+ position: relative;
7
+ padding: $alert-padding-y $alert-padding-x;
8
+ margin-bottom: $alert-margin-bottom;
9
+ border: $alert-border-width solid transparent;
10
+ @include border-radius($alert-border-radius);
11
+ }
12
+
13
+ // Headings for larger alerts
14
+ .alert-heading {
15
+ // Specified to prevent conflicts of changing $headings-color
16
+ color: inherit;
17
+ }
18
+
19
+ // Provide class for links that match alerts
20
+ .alert-link {
21
+ font-weight: $alert-link-font-weight;
22
+ }
23
+
24
+
25
+ // Dismissible alerts
26
+ //
27
+ // Expand the right padding and account for the close button's positioning.
28
+
29
+ .alert-dismissible {
30
+ padding-right: $alert-dismissible-padding-r;
31
+
32
+ // Adjust close link position
33
+ .btn-close {
34
+ position: absolute;
35
+ top: 0;
36
+ right: 0;
37
+ z-index: $stretched-link-z-index + 1;
38
+ padding: $alert-padding-y * 1.25 $alert-padding-x;
39
+ }
40
+ }
41
+
42
+
43
+ // scss-docs-start alert-modifiers
44
+ // Generate contextual modifier classes for colorizing the alert.
45
+
46
+ @each $state, $value in $theme-colors {
47
+ $alert-background: shift-color($value, $alert-bg-scale);
48
+ $alert-border: shift-color($value, $alert-border-scale);
49
+ $alert-color: shift-color($value, $alert-color-scale);
50
+ @if (contrast-ratio($alert-background, $alert-color) < $min-contrast-ratio) {
51
+ $alert-color: mix($value, color-contrast($alert-background), abs($alert-color-scale));
52
+ }
53
+ .alert-#{$state} {
54
+ @include alert-variant($alert-background, $alert-border, $alert-color);
55
+ }
56
+ }
57
+ // scss-docs-end alert-modifiers
static/scss/bootstrap/scss/_badge.scss ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // Base class
2
+ //
3
+ // Requires one of the contextual, color modifier classes for `color` and
4
+ // `background-color`.
5
+
6
+ .badge {
7
+ display: inline-block;
8
+ padding: $badge-padding-y $badge-padding-x;
9
+ @include font-size($badge-font-size);
10
+ font-weight: $badge-font-weight;
11
+ line-height: 1;
12
+ color: $badge-color;
13
+ text-align: center;
14
+ white-space: nowrap;
15
+ vertical-align: baseline;
16
+ @include border-radius($badge-border-radius);
17
+ @include gradient-bg();
18
+
19
+ // Empty badges collapse automatically
20
+ &:empty {
21
+ display: none;
22
+ }
23
+ }
24
+
25
+ // Quick fix for badges in buttons
26
+ .btn .badge {
27
+ position: relative;
28
+ top: -1px;
29
+ }
static/scss/bootstrap/scss/_breadcrumb.scss ADDED
@@ -0,0 +1,28 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .breadcrumb {
2
+ display: flex;
3
+ flex-wrap: wrap;
4
+ padding: $breadcrumb-padding-y $breadcrumb-padding-x;
5
+ margin-bottom: $breadcrumb-margin-bottom;
6
+ @include font-size($breadcrumb-font-size);
7
+ list-style: none;
8
+ background-color: $breadcrumb-bg;
9
+ @include border-radius($breadcrumb-border-radius);
10
+ }
11
+
12
+ .breadcrumb-item {
13
+ // The separator between breadcrumbs (by default, a forward-slash: "/")
14
+ + .breadcrumb-item {
15
+ padding-left: $breadcrumb-item-padding-x;
16
+
17
+ &::before {
18
+ float: left; // Suppress inline spacings and underlining of the separator
19
+ padding-right: $breadcrumb-item-padding-x;
20
+ color: $breadcrumb-divider-color;
21
+ content: var(--#{$variable-prefix}breadcrumb-divider, escape-svg($breadcrumb-divider)) #{"/* rtl:"} var(--#{$variable-prefix}breadcrumb-divider, escape-svg($breadcrumb-divider-flipped)) #{"*/"};
22
+ }
23
+ }
24
+
25
+ &.active {
26
+ color: $breadcrumb-active-color;
27
+ }
28
+ }
static/scss/bootstrap/scss/_button-group.scss ADDED
@@ -0,0 +1,139 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // Make the div behave like a button
2
+ .btn-group,
3
+ .btn-group-vertical {
4
+ position: relative;
5
+ display: inline-flex;
6
+ vertical-align: middle; // match .btn alignment given font-size hack above
7
+
8
+ > .btn {
9
+ position: relative;
10
+ flex: 1 1 auto;
11
+ }
12
+
13
+ // Bring the hover, focused, and "active" buttons to the front to overlay
14
+ // the borders properly
15
+ > .btn-check:checked + .btn,
16
+ > .btn-check:focus + .btn,
17
+ > .btn:hover,
18
+ > .btn:focus,
19
+ > .btn:active,
20
+ > .btn.active {
21
+ z-index: 1;
22
+ }
23
+ }
24
+
25
+ // Optional: Group multiple button groups together for a toolbar
26
+ .btn-toolbar {
27
+ display: flex;
28
+ flex-wrap: wrap;
29
+ justify-content: flex-start;
30
+
31
+ .input-group {
32
+ width: auto;
33
+ }
34
+ }
35
+
36
+ .btn-group {
37
+ // Prevent double borders when buttons are next to each other
38
+ > .btn:not(:first-child),
39
+ > .btn-group:not(:first-child) {
40
+ margin-left: -$btn-border-width;
41
+ }
42
+
43
+ // Reset rounded corners
44
+ > .btn:not(:last-child):not(.dropdown-toggle),
45
+ > .btn-group:not(:last-child) > .btn {
46
+ @include border-end-radius(0);
47
+ }
48
+
49
+ // The left radius should be 0 if the button is:
50
+ // - the "third or more" child
51
+ // - the second child and the previous element isn't `.btn-check` (making it the first child visually)
52
+ // - part of a btn-group which isn't the first child
53
+ > .btn:nth-child(n + 3),
54
+ > :not(.btn-check) + .btn,
55
+ > .btn-group:not(:first-child) > .btn {
56
+ @include border-start-radius(0);
57
+ }
58
+ }
59
+
60
+ // Sizing
61
+ //
62
+ // Remix the default button sizing classes into new ones for easier manipulation.
63
+
64
+ .btn-group-sm > .btn { @extend .btn-sm; }
65
+ .btn-group-lg > .btn { @extend .btn-lg; }
66
+
67
+
68
+ //
69
+ // Split button dropdowns
70
+ //
71
+
72
+ .dropdown-toggle-split {
73
+ padding-right: $btn-padding-x * .75;
74
+ padding-left: $btn-padding-x * .75;
75
+
76
+ &::after,
77
+ .dropup &::after,
78
+ .dropend &::after {
79
+ margin-left: 0;
80
+ }
81
+
82
+ .dropstart &::before {
83
+ margin-right: 0;
84
+ }
85
+ }
86
+
87
+ .btn-sm + .dropdown-toggle-split {
88
+ padding-right: $btn-padding-x-sm * .75;
89
+ padding-left: $btn-padding-x-sm * .75;
90
+ }
91
+
92
+ .btn-lg + .dropdown-toggle-split {
93
+ padding-right: $btn-padding-x-lg * .75;
94
+ padding-left: $btn-padding-x-lg * .75;
95
+ }
96
+
97
+
98
+ // The clickable button for toggling the menu
99
+ // Set the same inset shadow as the :active state
100
+ .btn-group.show .dropdown-toggle {
101
+ @include box-shadow($btn-active-box-shadow);
102
+
103
+ // Show no shadow for `.btn-link` since it has no other button styles.
104
+ &.btn-link {
105
+ @include box-shadow(none);
106
+ }
107
+ }
108
+
109
+
110
+ //
111
+ // Vertical button groups
112
+ //
113
+
114
+ .btn-group-vertical {
115
+ flex-direction: column;
116
+ align-items: flex-start;
117
+ justify-content: center;
118
+
119
+ > .btn,
120
+ > .btn-group {
121
+ width: 100%;
122
+ }
123
+
124
+ > .btn:not(:first-child),
125
+ > .btn-group:not(:first-child) {
126
+ margin-top: -$btn-border-width;
127
+ }
128
+
129
+ // Reset rounded corners
130
+ > .btn:not(:last-child):not(.dropdown-toggle),
131
+ > .btn-group:not(:last-child) > .btn {
132
+ @include border-bottom-radius(0);
133
+ }
134
+
135
+ > .btn ~ .btn,
136
+ > .btn-group:not(:first-child) > .btn {
137
+ @include border-top-radius(0);
138
+ }
139
+ }
static/scss/bootstrap/scss/_buttons.scss ADDED
@@ -0,0 +1,111 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ //
2
+ // Base styles
3
+ //
4
+
5
+ .btn {
6
+ display: inline-block;
7
+ font-family: $btn-font-family;
8
+ font-weight: $btn-font-weight;
9
+ line-height: $btn-line-height;
10
+ color: $body-color;
11
+ text-align: center;
12
+ text-decoration: if($link-decoration == none, null, none);
13
+ white-space: $btn-white-space;
14
+ vertical-align: middle;
15
+ cursor: if($enable-button-pointers, pointer, null);
16
+ user-select: none;
17
+ background-color: transparent;
18
+ border: $btn-border-width solid transparent;
19
+ @include button-size($btn-padding-y, $btn-padding-x, $btn-font-size, $btn-border-radius);
20
+ @include transition($btn-transition);
21
+
22
+ &:hover {
23
+ color: $body-color;
24
+ text-decoration: if($link-hover-decoration == underline, none, null);
25
+ }
26
+
27
+ .btn-check:focus + &,
28
+ &:focus {
29
+ outline: 0;
30
+ box-shadow: $btn-focus-box-shadow;
31
+ }
32
+
33
+ .btn-check:checked + &,
34
+ .btn-check:active + &,
35
+ &:active,
36
+ &.active {
37
+ @include box-shadow($btn-active-box-shadow);
38
+
39
+ &:focus {
40
+ @include box-shadow($btn-focus-box-shadow, $btn-active-box-shadow);
41
+ }
42
+ }
43
+
44
+ &:disabled,
45
+ &.disabled,
46
+ fieldset:disabled & {
47
+ pointer-events: none;
48
+ opacity: $btn-disabled-opacity;
49
+ @include box-shadow(none);
50
+ }
51
+ }
52
+
53
+
54
+ //
55
+ // Alternate buttons
56
+ //
57
+
58
+ // scss-docs-start btn-variant-loops
59
+ @each $color, $value in $theme-colors {
60
+ .btn-#{$color} {
61
+ @include button-variant($value, $value);
62
+ }
63
+ }
64
+
65
+ @each $color, $value in $theme-colors {
66
+ .btn-outline-#{$color} {
67
+ @include button-outline-variant($value);
68
+ }
69
+ }
70
+ // scss-docs-end btn-variant-loops
71
+
72
+
73
+ //
74
+ // Link buttons
75
+ //
76
+
77
+ // Make a button look and behave like a link
78
+ .btn-link {
79
+ font-weight: $font-weight-normal;
80
+ color: $btn-link-color;
81
+ text-decoration: $link-decoration;
82
+
83
+ &:hover {
84
+ color: $btn-link-hover-color;
85
+ text-decoration: $link-hover-decoration;
86
+ }
87
+
88
+ &:focus {
89
+ text-decoration: $link-hover-decoration;
90
+ }
91
+
92
+ &:disabled,
93
+ &.disabled {
94
+ color: $btn-link-disabled-color;
95
+ }
96
+
97
+ // No need for an active state here
98
+ }
99
+
100
+
101
+ //
102
+ // Button Sizes
103
+ //
104
+
105
+ .btn-lg {
106
+ @include button-size($btn-padding-y-lg, $btn-padding-x-lg, $btn-font-size-lg, $btn-border-radius-lg);
107
+ }
108
+
109
+ .btn-sm {
110
+ @include button-size($btn-padding-y-sm, $btn-padding-x-sm, $btn-font-size-sm, $btn-border-radius-sm);
111
+ }
static/scss/bootstrap/scss/_card.scss ADDED
@@ -0,0 +1,215 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ //
2
+ // Base styles
3
+ //
4
+
5
+ .card {
6
+ position: relative;
7
+ display: flex;
8
+ flex-direction: column;
9
+ min-width: 0; // See https://github.com/twbs/bootstrap/pull/22740#issuecomment-305868106
10
+ height: $card-height;
11
+ word-wrap: break-word;
12
+ background-color: $card-bg;
13
+ background-clip: border-box;
14
+ border: $card-border-width solid $card-border-color;
15
+ @include border-radius($card-border-radius);
16
+
17
+ > hr {
18
+ margin-right: 0;
19
+ margin-left: 0;
20
+ }
21
+
22
+ > .list-group {
23
+ border-top: inherit;
24
+ border-bottom: inherit;
25
+
26
+ &:first-child {
27
+ border-top-width: 0;
28
+ @include border-top-radius($card-inner-border-radius);
29
+ }
30
+
31
+ &:last-child {
32
+ border-bottom-width: 0;
33
+ @include border-bottom-radius($card-inner-border-radius);
34
+ }
35
+ }
36
+
37
+ // Due to specificity of the above selector (`.card > .list-group`), we must
38
+ // use a child selector here to prevent double borders.
39
+ > .card-header + .list-group,
40
+ > .list-group + .card-footer {
41
+ border-top: 0;
42
+ }
43
+ }
44
+
45
+ .card-body {
46
+ // Enable `flex-grow: 1` for decks and groups so that card blocks take up
47
+ // as much space as possible, ensuring footers are aligned to the bottom.
48
+ flex: 1 1 auto;
49
+ padding: $card-spacer-y $card-spacer-x;
50
+ color: $card-color;
51
+ }
52
+
53
+ .card-title {
54
+ margin-bottom: $card-title-spacer-y;
55
+ }
56
+
57
+ .card-subtitle {
58
+ margin-top: -$card-title-spacer-y / 2;
59
+ margin-bottom: 0;
60
+ }
61
+
62
+ .card-text:last-child {
63
+ margin-bottom: 0;
64
+ }
65
+
66
+ .card-link {
67
+ &:hover {
68
+ text-decoration: none;
69
+ }
70
+
71
+ + .card-link {
72
+ margin-left: $card-spacer-x;
73
+ }
74
+ }
75
+
76
+ //
77
+ // Optional textual caps
78
+ //
79
+
80
+ .card-header {
81
+ padding: $card-cap-padding-y $card-cap-padding-x;
82
+ margin-bottom: 0; // Removes the default margin-bottom of <hN>
83
+ color: $card-cap-color;
84
+ background-color: $card-cap-bg;
85
+ border-bottom: $card-border-width solid $card-border-color;
86
+
87
+ &:first-child {
88
+ @include border-radius($card-inner-border-radius $card-inner-border-radius 0 0);
89
+ }
90
+ }
91
+
92
+ .card-footer {
93
+ padding: $card-cap-padding-y $card-cap-padding-x;
94
+ color: $card-cap-color;
95
+ background-color: $card-cap-bg;
96
+ border-top: $card-border-width solid $card-border-color;
97
+
98
+ &:last-child {
99
+ @include border-radius(0 0 $card-inner-border-radius $card-inner-border-radius);
100
+ }
101
+ }
102
+
103
+
104
+ //
105
+ // Header navs
106
+ //
107
+
108
+ .card-header-tabs {
109
+ margin-right: -$card-cap-padding-x / 2;
110
+ margin-bottom: -$card-cap-padding-y;
111
+ margin-left: -$card-cap-padding-x / 2;
112
+ border-bottom: 0;
113
+
114
+ @if $nav-tabs-link-active-bg != $card-bg {
115
+ .nav-link.active {
116
+ background-color: $card-bg;
117
+ border-bottom-color: $card-bg;
118
+ }
119
+ }
120
+ }
121
+
122
+ .card-header-pills {
123
+ margin-right: -$card-cap-padding-x / 2;
124
+ margin-left: -$card-cap-padding-x / 2;
125
+ }
126
+
127
+ // Card image
128
+ .card-img-overlay {
129
+ position: absolute;
130
+ top: 0;
131
+ right: 0;
132
+ bottom: 0;
133
+ left: 0;
134
+ padding: $card-img-overlay-padding;
135
+ @include border-radius($card-inner-border-radius);
136
+ }
137
+
138
+ .card-img,
139
+ .card-img-top,
140
+ .card-img-bottom {
141
+ width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch
142
+ }
143
+
144
+ .card-img,
145
+ .card-img-top {
146
+ @include border-top-radius($card-inner-border-radius);
147
+ }
148
+
149
+ .card-img,
150
+ .card-img-bottom {
151
+ @include border-bottom-radius($card-inner-border-radius);
152
+ }
153
+
154
+
155
+ //
156
+ // Card groups
157
+ //
158
+
159
+ .card-group {
160
+ // The child selector allows nested `.card` within `.card-group`
161
+ // to display properly.
162
+ > .card {
163
+ margin-bottom: $card-group-margin;
164
+ }
165
+
166
+ @include media-breakpoint-up(sm) {
167
+ display: flex;
168
+ flex-flow: row wrap;
169
+ // The child selector allows nested `.card` within `.card-group`
170
+ // to display properly.
171
+ > .card {
172
+ // Flexbugs #4: https://github.com/philipwalton/flexbugs#flexbug-4
173
+ flex: 1 0 0%;
174
+ margin-bottom: 0;
175
+
176
+ + .card {
177
+ margin-left: 0;
178
+ border-left: 0;
179
+ }
180
+
181
+ // Handle rounded corners
182
+ @if $enable-rounded {
183
+ &:not(:last-child) {
184
+ @include border-end-radius(0);
185
+
186
+ .card-img-top,
187
+ .card-header {
188
+ // stylelint-disable-next-line property-disallowed-list
189
+ border-top-right-radius: 0;
190
+ }
191
+ .card-img-bottom,
192
+ .card-footer {
193
+ // stylelint-disable-next-line property-disallowed-list
194
+ border-bottom-right-radius: 0;
195
+ }
196
+ }
197
+
198
+ &:not(:first-child) {
199
+ @include border-start-radius(0);
200
+
201
+ .card-img-top,
202
+ .card-header {
203
+ // stylelint-disable-next-line property-disallowed-list
204
+ border-top-left-radius: 0;
205
+ }
206
+ .card-img-bottom,
207
+ .card-footer {
208
+ // stylelint-disable-next-line property-disallowed-list
209
+ border-bottom-left-radius: 0;
210
+ }
211
+ }
212
+ }
213
+ }
214
+ }
215
+ }
static/scss/bootstrap/scss/_carousel.scss ADDED
@@ -0,0 +1,229 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // Notes on the classes:
2
+ //
3
+ // 1. .carousel.pointer-event should ideally be pan-y (to allow for users to scroll vertically)
4
+ // even when their scroll action started on a carousel, but for compatibility (with Firefox)
5
+ // we're preventing all actions instead
6
+ // 2. The .carousel-item-start and .carousel-item-end is used to indicate where
7
+ // the active slide is heading.
8
+ // 3. .active.carousel-item is the current slide.
9
+ // 4. .active.carousel-item-start and .active.carousel-item-end is the current
10
+ // slide in its in-transition state. Only one of these occurs at a time.
11
+ // 5. .carousel-item-next.carousel-item-start and .carousel-item-prev.carousel-item-end
12
+ // is the upcoming slide in transition.
13
+
14
+ .carousel {
15
+ position: relative;
16
+ }
17
+
18
+ .carousel.pointer-event {
19
+ touch-action: pan-y;
20
+ }
21
+
22
+ .carousel-inner {
23
+ position: relative;
24
+ width: 100%;
25
+ overflow: hidden;
26
+ @include clearfix();
27
+ }
28
+
29
+ .carousel-item {
30
+ position: relative;
31
+ display: none;
32
+ float: left;
33
+ width: 100%;
34
+ margin-right: -100%;
35
+ backface-visibility: hidden;
36
+ @include transition($carousel-transition);
37
+ }
38
+
39
+ .carousel-item.active,
40
+ .carousel-item-next,
41
+ .carousel-item-prev {
42
+ display: block;
43
+ }
44
+
45
+ /* rtl:begin:ignore */
46
+ .carousel-item-next:not(.carousel-item-start),
47
+ .active.carousel-item-end {
48
+ transform: translateX(100%);
49
+ }
50
+
51
+ .carousel-item-prev:not(.carousel-item-end),
52
+ .active.carousel-item-start {
53
+ transform: translateX(-100%);
54
+ }
55
+
56
+ /* rtl:end:ignore */
57
+
58
+
59
+ //
60
+ // Alternate transitions
61
+ //
62
+
63
+ .carousel-fade {
64
+ .carousel-item {
65
+ opacity: 0;
66
+ transition-property: opacity;
67
+ transform: none;
68
+ }
69
+
70
+ .carousel-item.active,
71
+ .carousel-item-next.carousel-item-start,
72
+ .carousel-item-prev.carousel-item-end {
73
+ z-index: 1;
74
+ opacity: 1;
75
+ }
76
+
77
+ .active.carousel-item-start,
78
+ .active.carousel-item-end {
79
+ z-index: 0;
80
+ opacity: 0;
81
+ @include transition(opacity 0s $carousel-transition-duration);
82
+ }
83
+ }
84
+
85
+
86
+ //
87
+ // Left/right controls for nav
88
+ //
89
+
90
+ .carousel-control-prev,
91
+ .carousel-control-next {
92
+ position: absolute;
93
+ top: 0;
94
+ bottom: 0;
95
+ z-index: 1;
96
+ // Use flex for alignment (1-3)
97
+ display: flex; // 1. allow flex styles
98
+ align-items: center; // 2. vertically center contents
99
+ justify-content: center; // 3. horizontally center contents
100
+ width: $carousel-control-width;
101
+ padding: 0;
102
+ color: $carousel-control-color;
103
+ text-align: center;
104
+ background: none;
105
+ border: 0;
106
+ opacity: $carousel-control-opacity;
107
+ @include transition($carousel-control-transition);
108
+
109
+ // Hover/focus state
110
+ &:hover,
111
+ &:focus {
112
+ color: $carousel-control-color;
113
+ text-decoration: none;
114
+ outline: 0;
115
+ opacity: $carousel-control-hover-opacity;
116
+ }
117
+ }
118
+ .carousel-control-prev {
119
+ left: 0;
120
+ background-image: if($enable-gradients, linear-gradient(90deg, rgba($black, .25), rgba($black, .001)), null);
121
+ }
122
+ .carousel-control-next {
123
+ right: 0;
124
+ background-image: if($enable-gradients, linear-gradient(270deg, rgba($black, .25), rgba($black, .001)), null);
125
+ }
126
+
127
+ // Icons for within
128
+ .carousel-control-prev-icon,
129
+ .carousel-control-next-icon {
130
+ display: inline-block;
131
+ width: $carousel-control-icon-width;
132
+ height: $carousel-control-icon-width;
133
+ background-repeat: no-repeat;
134
+ background-position: 50%;
135
+ background-size: 100% 100%;
136
+ }
137
+
138
+ /* rtl:options: {
139
+ "autoRename": true,
140
+ "stringMap":[ {
141
+ "name" : "prev-next",
142
+ "search" : "prev",
143
+ "replace" : "next"
144
+ } ]
145
+ } */
146
+ .carousel-control-prev-icon {
147
+ background-image: escape-svg($carousel-control-prev-icon-bg);
148
+ }
149
+ .carousel-control-next-icon {
150
+ background-image: escape-svg($carousel-control-next-icon-bg);
151
+ }
152
+
153
+ // Optional indicator pips/controls
154
+ //
155
+ // Add a container (such as a list) with the following class and add an item (ideally a focusable control,
156
+ // like a button) with data-bs-target for each slide your carousel holds.
157
+
158
+ .carousel-indicators {
159
+ position: absolute;
160
+ right: 0;
161
+ bottom: 0;
162
+ left: 0;
163
+ z-index: 2;
164
+ display: flex;
165
+ justify-content: center;
166
+ padding: 0;
167
+ // Use the .carousel-control's width as margin so we don't overlay those
168
+ margin-right: $carousel-control-width;
169
+ margin-bottom: 1rem;
170
+ margin-left: $carousel-control-width;
171
+ list-style: none;
172
+
173
+ [data-bs-target] {
174
+ box-sizing: content-box;
175
+ flex: 0 1 auto;
176
+ width: $carousel-indicator-width;
177
+ height: $carousel-indicator-height;
178
+ padding: 0;
179
+ margin-right: $carousel-indicator-spacer;
180
+ margin-left: $carousel-indicator-spacer;
181
+ text-indent: -999px;
182
+ cursor: pointer;
183
+ background-color: $carousel-indicator-active-bg;
184
+ background-clip: padding-box;
185
+ border: 0;
186
+ // Use transparent borders to increase the hit area by 10px on top and bottom.
187
+ border-top: $carousel-indicator-hit-area-height solid transparent;
188
+ border-bottom: $carousel-indicator-hit-area-height solid transparent;
189
+ opacity: $carousel-indicator-opacity;
190
+ @include transition($carousel-indicator-transition);
191
+ }
192
+
193
+ .active {
194
+ opacity: $carousel-indicator-active-opacity;
195
+ }
196
+ }
197
+
198
+
199
+ // Optional captions
200
+ //
201
+ //
202
+
203
+ .carousel-caption {
204
+ position: absolute;
205
+ right: (100% - $carousel-caption-width) / 2;
206
+ bottom: $carousel-caption-spacer;
207
+ left: (100% - $carousel-caption-width) / 2;
208
+ padding-top: $carousel-caption-padding-y;
209
+ padding-bottom: $carousel-caption-padding-y;
210
+ color: $carousel-caption-color;
211
+ text-align: center;
212
+ }
213
+
214
+ // Dark mode carousel
215
+
216
+ .carousel-dark {
217
+ .carousel-control-prev-icon,
218
+ .carousel-control-next-icon {
219
+ filter: $carousel-dark-control-icon-filter;
220
+ }
221
+
222
+ .carousel-indicators [data-bs-target] {
223
+ background-color: $carousel-dark-indicator-active-bg;
224
+ }
225
+
226
+ .carousel-caption {
227
+ color: $carousel-dark-caption-color;
228
+ }
229
+ }
static/scss/bootstrap/scss/_close.scss ADDED
@@ -0,0 +1,40 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // transparent background and border properties included for button version.
2
+ // iOS requires the button element instead of an anchor tag.
3
+ // If you want the anchor version, it requires `href="#"`.
4
+ // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile
5
+
6
+ .btn-close {
7
+ box-sizing: content-box;
8
+ width: $btn-close-width;
9
+ height: $btn-close-height;
10
+ padding: $btn-close-padding-y $btn-close-padding-x;
11
+ color: $btn-close-color;
12
+ background: transparent escape-svg($btn-close-bg) center / $btn-close-width auto no-repeat; // include transparent for button elements
13
+ border: 0; // for button elements
14
+ @include border-radius();
15
+ opacity: $btn-close-opacity;
16
+
17
+ // Override <a>'s hover style
18
+ &:hover {
19
+ color: $btn-close-color;
20
+ text-decoration: none;
21
+ opacity: $btn-close-hover-opacity;
22
+ }
23
+
24
+ &:focus {
25
+ outline: 0;
26
+ box-shadow: $btn-close-focus-shadow;
27
+ opacity: $btn-close-focus-opacity;
28
+ }
29
+
30
+ &:disabled,
31
+ &.disabled {
32
+ pointer-events: none;
33
+ user-select: none;
34
+ opacity: $btn-close-disabled-opacity;
35
+ }
36
+ }
37
+
38
+ .btn-close-white {
39
+ filter: $btn-close-white-filter;
40
+ }
static/scss/bootstrap/scss/_containers.scss ADDED
@@ -0,0 +1,41 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // Container widths
2
+ //
3
+ // Set the container width, and override it for fixed navbars in media queries.
4
+
5
+ @if $enable-grid-classes {
6
+ // Single container class with breakpoint max-widths
7
+ .container,
8
+ // 100% wide container at all breakpoints
9
+ .container-fluid {
10
+ @include make-container();
11
+ }
12
+
13
+ // Responsive containers that are 100% wide until a breakpoint
14
+ @each $breakpoint, $container-max-width in $container-max-widths {
15
+ .container-#{$breakpoint} {
16
+ @extend .container-fluid;
17
+ }
18
+
19
+ @include media-breakpoint-up($breakpoint, $grid-breakpoints) {
20
+ %responsive-container-#{$breakpoint} {
21
+ max-width: $container-max-width;
22
+ }
23
+
24
+ // Extend each breakpoint which is smaller or equal to the current breakpoint
25
+ $extend-breakpoint: true;
26
+
27
+ @each $name, $width in $grid-breakpoints {
28
+ @if ($extend-breakpoint) {
29
+ .container#{breakpoint-infix($name, $grid-breakpoints)} {
30
+ @extend %responsive-container-#{$breakpoint};
31
+ }
32
+
33
+ // Once the current breakpoint is reached, stop extending
34
+ @if ($breakpoint == $name) {
35
+ $extend-breakpoint: false;
36
+ }
37
+ }
38
+ }
39
+ }
40
+ }
41
+ }
static/scss/bootstrap/scss/_dropdown.scss ADDED
@@ -0,0 +1,240 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // The dropdown wrapper (`<div>`)
2
+ .dropup,
3
+ .dropend,
4
+ .dropdown,
5
+ .dropstart {
6
+ position: relative;
7
+ }
8
+
9
+ .dropdown-toggle {
10
+ white-space: nowrap;
11
+
12
+ // Generate the caret automatically
13
+ @include caret();
14
+ }
15
+
16
+ // The dropdown menu
17
+ .dropdown-menu {
18
+ position: absolute;
19
+ z-index: $zindex-dropdown;
20
+ display: none; // none by default, but block on "open" of the menu
21
+ min-width: $dropdown-min-width;
22
+ padding: $dropdown-padding-y $dropdown-padding-x;
23
+ margin: 0; // Override default margin of ul
24
+ @include font-size($dropdown-font-size);
25
+ color: $dropdown-color;
26
+ text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)
27
+ list-style: none;
28
+ background-color: $dropdown-bg;
29
+ background-clip: padding-box;
30
+ border: $dropdown-border-width solid $dropdown-border-color;
31
+ @include border-radius($dropdown-border-radius);
32
+ @include box-shadow($dropdown-box-shadow);
33
+
34
+ &[data-bs-popper] {
35
+ top: 100%;
36
+ left: 0;
37
+ margin-top: $dropdown-spacer;
38
+ }
39
+ }
40
+
41
+ // scss-docs-start responsive-breakpoints
42
+ // We deliberately hardcode the `bs-` prefix because we check
43
+ // this custom property in JS to determine Popper's positioning
44
+
45
+ @each $breakpoint in map-keys($grid-breakpoints) {
46
+ @include media-breakpoint-up($breakpoint) {
47
+ $infix: breakpoint-infix($breakpoint, $grid-breakpoints);
48
+
49
+ .dropdown-menu#{$infix}-start {
50
+ --bs-position: start;
51
+
52
+ &[data-bs-popper] {
53
+ right: auto #{"/* rtl:ignore */"};
54
+ left: 0 #{"/* rtl:ignore */"};
55
+ }
56
+ }
57
+
58
+ .dropdown-menu#{$infix}-end {
59
+ --bs-position: end;
60
+
61
+ &[data-bs-popper] {
62
+ right: 0 #{"/* rtl:ignore */"};
63
+ left: auto #{"/* rtl:ignore */"};
64
+ }
65
+ }
66
+ }
67
+ }
68
+ // scss-docs-end responsive-breakpoints
69
+
70
+ // Allow for dropdowns to go bottom up (aka, dropup-menu)
71
+ // Just add .dropup after the standard .dropdown class and you're set.
72
+ .dropup {
73
+ .dropdown-menu[data-bs-popper] {
74
+ top: auto;
75
+ bottom: 100%;
76
+ margin-top: 0;
77
+ margin-bottom: $dropdown-spacer;
78
+ }
79
+
80
+ .dropdown-toggle {
81
+ @include caret(up);
82
+ }
83
+ }
84
+
85
+ .dropend {
86
+ .dropdown-menu[data-bs-popper] {
87
+ top: 0;
88
+ right: auto;
89
+ left: 100%;
90
+ margin-top: 0;
91
+ margin-left: $dropdown-spacer;
92
+ }
93
+
94
+ .dropdown-toggle {
95
+ @include caret(end);
96
+ &::after {
97
+ vertical-align: 0;
98
+ }
99
+ }
100
+ }
101
+
102
+ .dropstart {
103
+ .dropdown-menu[data-bs-popper] {
104
+ top: 0;
105
+ right: 100%;
106
+ left: auto;
107
+ margin-top: 0;
108
+ margin-right: $dropdown-spacer;
109
+ }
110
+
111
+ .dropdown-toggle {
112
+ @include caret(start);
113
+ &::before {
114
+ vertical-align: 0;
115
+ }
116
+ }
117
+ }
118
+
119
+
120
+ // Dividers (basically an `<hr>`) within the dropdown
121
+ .dropdown-divider {
122
+ height: 0;
123
+ margin: $dropdown-divider-margin-y 0;
124
+ overflow: hidden;
125
+ border-top: 1px solid $dropdown-divider-bg;
126
+ }
127
+
128
+ // Links, buttons, and more within the dropdown menu
129
+ //
130
+ // `<button>`-specific styles are denoted with `// For <button>s`
131
+ .dropdown-item {
132
+ display: block;
133
+ width: 100%; // For `<button>`s
134
+ padding: $dropdown-item-padding-y $dropdown-item-padding-x;
135
+ clear: both;
136
+ font-weight: $font-weight-normal;
137
+ color: $dropdown-link-color;
138
+ text-align: inherit; // For `<button>`s
139
+ text-decoration: if($link-decoration == none, null, none);
140
+ white-space: nowrap; // prevent links from randomly breaking onto new lines
141
+ background-color: transparent; // For `<button>`s
142
+ border: 0; // For `<button>`s
143
+
144
+ // Prevent dropdown overflow if there's no padding
145
+ // See https://github.com/twbs/bootstrap/pull/27703
146
+ @if $dropdown-padding-y == 0 {
147
+ &:first-child {
148
+ @include border-top-radius($dropdown-inner-border-radius);
149
+ }
150
+
151
+ &:last-child {
152
+ @include border-bottom-radius($dropdown-inner-border-radius);
153
+ }
154
+ }
155
+
156
+ &:hover,
157
+ &:focus {
158
+ color: $dropdown-link-hover-color;
159
+ text-decoration: if($link-hover-decoration == underline, none, null);
160
+ @include gradient-bg($dropdown-link-hover-bg);
161
+ }
162
+
163
+ &.active,
164
+ &:active {
165
+ color: $dropdown-link-active-color;
166
+ text-decoration: none;
167
+ @include gradient-bg($dropdown-link-active-bg);
168
+ }
169
+
170
+ &.disabled,
171
+ &:disabled {
172
+ color: $dropdown-link-disabled-color;
173
+ pointer-events: none;
174
+ background-color: transparent;
175
+ // Remove CSS gradients if they're enabled
176
+ background-image: if($enable-gradients, none, null);
177
+ }
178
+ }
179
+
180
+ .dropdown-menu.show {
181
+ display: block;
182
+ }
183
+
184
+ // Dropdown section headers
185
+ .dropdown-header {
186
+ display: block;
187
+ padding: $dropdown-header-padding;
188
+ margin-bottom: 0; // for use with heading elements
189
+ @include font-size($font-size-sm);
190
+ color: $dropdown-header-color;
191
+ white-space: nowrap; // as with > li > a
192
+ }
193
+
194
+ // Dropdown text
195
+ .dropdown-item-text {
196
+ display: block;
197
+ padding: $dropdown-item-padding-y $dropdown-item-padding-x;
198
+ color: $dropdown-link-color;
199
+ }
200
+
201
+ // Dark dropdowns
202
+ .dropdown-menu-dark {
203
+ color: $dropdown-dark-color;
204
+ background-color: $dropdown-dark-bg;
205
+ border-color: $dropdown-dark-border-color;
206
+ @include box-shadow($dropdown-dark-box-shadow);
207
+
208
+ .dropdown-item {
209
+ color: $dropdown-dark-link-color;
210
+
211
+ &:hover,
212
+ &:focus {
213
+ color: $dropdown-dark-link-hover-color;
214
+ @include gradient-bg($dropdown-dark-link-hover-bg);
215
+ }
216
+
217
+ &.active,
218
+ &:active {
219
+ color: $dropdown-dark-link-active-color;
220
+ @include gradient-bg($dropdown-dark-link-active-bg);
221
+ }
222
+
223
+ &.disabled,
224
+ &:disabled {
225
+ color: $dropdown-dark-link-disabled-color;
226
+ }
227
+ }
228
+
229
+ .dropdown-divider {
230
+ border-color: $dropdown-dark-divider-bg;
231
+ }
232
+
233
+ .dropdown-item-text {
234
+ color: $dropdown-dark-link-color;
235
+ }
236
+
237
+ .dropdown-header {
238
+ color: $dropdown-dark-header-color;
239
+ }
240
+ }
static/scss/bootstrap/scss/_forms.scss ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ @import "forms/labels";
2
+ @import "forms/form-text";
3
+ @import "forms/form-control";
4
+ @import "forms/form-select";
5
+ @import "forms/form-check";
6
+ @import "forms/form-range";
7
+ @import "forms/floating-labels";
8
+ @import "forms/input-group";
9
+ @import "forms/validation";
static/scss/bootstrap/scss/_functions.scss ADDED
@@ -0,0 +1,205 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // Bootstrap functions
2
+ //
3
+ // Utility mixins and functions for evaluating source code across our variables, maps, and mixins.
4
+
5
+ // Ascending
6
+ // Used to evaluate Sass maps like our grid breakpoints.
7
+ @mixin _assert-ascending($map, $map-name) {
8
+ $prev-key: null;
9
+ $prev-num: null;
10
+ @each $key, $num in $map {
11
+ @if $prev-num == null or unit($num) == "%" or unit($prev-num) == "%" {
12
+ // Do nothing
13
+ } @else if not comparable($prev-num, $num) {
14
+ @warn "Potentially invalid value for #{$map-name}: This map must be in ascending order, but key '#{$key}' has value #{$num} whose unit makes it incomparable to #{$prev-num}, the value of the previous key '#{$prev-key}' !";
15
+ } @else if $prev-num >= $num {
16
+ @warn "Invalid value for #{$map-name}: This map must be in ascending order, but key '#{$key}' has value #{$num} which isn't greater than #{$prev-num}, the value of the previous key '#{$prev-key}' !";
17
+ }
18
+ $prev-key: $key;
19
+ $prev-num: $num;
20
+ }
21
+ }
22
+
23
+ // Starts at zero
24
+ // Used to ensure the min-width of the lowest breakpoint starts at 0.
25
+ @mixin _assert-starts-at-zero($map, $map-name: "$grid-breakpoints") {
26
+ @if length($map) > 0 {
27
+ $values: map-values($map);
28
+ $first-value: nth($values, 1);
29
+ @if $first-value != 0 {
30
+ @warn "First breakpoint in #{$map-name} must start at 0, but starts at #{$first-value}.";
31
+ }
32
+ }
33
+ }
34
+
35
+ // Internal Bootstrap function to turn maps into its negative variant.
36
+ // It prefixes the keys with `n` and makes the value negative.
37
+ @function negativify-map($map) {
38
+ $result: ();
39
+ @each $key, $value in $map {
40
+ @if $key != 0 {
41
+ $result: map-merge($result, ("n" + $key: (-$value)));
42
+ }
43
+ }
44
+ @return $result;
45
+ }
46
+
47
+ // Get multiple keys from a sass map
48
+ @function map-get-multiple($map, $values) {
49
+ $result: ();
50
+ @each $key, $value in $map {
51
+ @if (index($values, $key) != null) {
52
+ $result: map-merge($result, ($key: $value));
53
+ }
54
+ }
55
+ @return $result;
56
+ }
57
+
58
+ // Replace `$search` with `$replace` in `$string`
59
+ // Used on our SVG icon backgrounds for custom forms.
60
+ //
61
+ // @author Hugo Giraudel
62
+ // @param {String} $string - Initial string
63
+ // @param {String} $search - Substring to replace
64
+ // @param {String} $replace ('') - New value
65
+ // @return {String} - Updated string
66
+ @function str-replace($string, $search, $replace: "") {
67
+ $index: str-index($string, $search);
68
+
69
+ @if $index {
70
+ @return str-slice($string, 1, $index - 1) + $replace + str-replace(str-slice($string, $index + str-length($search)), $search, $replace);
71
+ }
72
+
73
+ @return $string;
74
+ }
75
+
76
+ // See https://codepen.io/kevinweber/pen/dXWoRw
77
+ //
78
+ // Requires the use of quotes around data URIs.
79
+
80
+ @function escape-svg($string) {
81
+ @if str-index($string, "data:image/svg+xml") {
82
+ @each $char, $encoded in $escaped-characters {
83
+ // Do not escape the url brackets
84
+ @if str-index($string, "url(") == 1 {
85
+ $string: url("#{str-replace(str-slice($string, 6, -3), $char, $encoded)}");
86
+ } @else {
87
+ $string: str-replace($string, $char, $encoded);
88
+ }
89
+ }
90
+ }
91
+
92
+ @return $string;
93
+ }
94
+
95
+ // Color contrast
96
+ // See https://github.com/twbs/bootstrap/pull/30168
97
+
98
+ // A list of pre-calculated numbers of pow(($value / 255 + .055) / 1.055, 2.4). (from 0 to 255)
99
+ // stylelint-disable-next-line scss/dollar-variable-default, scss/dollar-variable-pattern
100
+ $_luminance-list: .0008 .001 .0011 .0013 .0015 .0017 .002 .0022 .0025 .0027 .003 .0033 .0037 .004 .0044 .0048 .0052 .0056 .006 .0065 .007 .0075 .008 .0086 .0091 .0097 .0103 .011 .0116 .0123 .013 .0137 .0144 .0152 .016 .0168 .0176 .0185 .0194 .0203 .0212 .0222 .0232 .0242 .0252 .0262 .0273 .0284 .0296 .0307 .0319 .0331 .0343 .0356 .0369 .0382 .0395 .0409 .0423 .0437 .0452 .0467 .0482 .0497 .0513 .0529 .0545 .0561 .0578 .0595 .0612 .063 .0648 .0666 .0685 .0704 .0723 .0742 .0762 .0782 .0802 .0823 .0844 .0865 .0887 .0908 .0931 .0953 .0976 .0999 .1022 .1046 .107 .1095 .1119 .1144 .117 .1195 .1221 .1248 .1274 .1301 .1329 .1356 .1384 .1413 .1441 .147 .15 .1529 .1559 .159 .162 .1651 .1683 .1714 .1746 .1779 .1812 .1845 .1878 .1912 .1946 .1981 .2016 .2051 .2086 .2122 .2159 .2195 .2232 .227 .2307 .2346 .2384 .2423 .2462 .2502 .2542 .2582 .2623 .2664 .2705 .2747 .2789 .2831 .2874 .2918 .2961 .3005 .305 .3095 .314 .3185 .3231 .3278 .3325 .3372 .3419 .3467 .3515 .3564 .3613 .3663 .3712 .3763 .3813 .3864 .3916 .3968 .402 .4072 .4125 .4179 .4233 .4287 .4342 .4397 .4452 .4508 .4564 .4621 .4678 .4735 .4793 .4851 .491 .4969 .5029 .5089 .5149 .521 .5271 .5333 .5395 .5457 .552 .5583 .5647 .5711 .5776 .5841 .5906 .5972 .6038 .6105 .6172 .624 .6308 .6376 .6445 .6514 .6584 .6654 .6724 .6795 .6867 .6939 .7011 .7084 .7157 .7231 .7305 .7379 .7454 .7529 .7605 .7682 .7758 .7835 .7913 .7991 .807 .8148 .8228 .8308 .8388 .8469 .855 .8632 .8714 .8796 .8879 .8963 .9047 .9131 .9216 .9301 .9387 .9473 .956 .9647 .9734 .9823 .9911 1;
101
+
102
+ @function color-contrast($background, $color-contrast-dark: $color-contrast-dark, $color-contrast-light: $color-contrast-light, $min-contrast-ratio: $min-contrast-ratio) {
103
+ $foregrounds: $color-contrast-light, $color-contrast-dark, $white, $black;
104
+ $max-ratio: 0;
105
+ $max-ratio-color: null;
106
+
107
+ @each $color in $foregrounds {
108
+ $contrast-ratio: contrast-ratio($background, $color);
109
+ @if $contrast-ratio > $min-contrast-ratio {
110
+ @return $color;
111
+ } @else if $contrast-ratio > $max-ratio {
112
+ $max-ratio: $contrast-ratio;
113
+ $max-ratio-color: $color;
114
+ }
115
+ }
116
+
117
+ @warn "Found no color leading to #{$min-contrast-ratio}:1 contrast ratio against #{$background}...";
118
+
119
+ @return $max-ratio-color;
120
+ }
121
+
122
+ @function contrast-ratio($background, $foreground: $color-contrast-light) {
123
+ $l1: luminance($background);
124
+ $l2: luminance(opaque($background, $foreground));
125
+
126
+ @return if($l1 > $l2, ($l1 + .05) / ($l2 + .05), ($l2 + .05) / ($l1 + .05));
127
+ }
128
+
129
+ // Return WCAG2.0 relative luminance
130
+ // See https://www.w3.org/WAI/GL/wiki/Relative_luminance
131
+ // See https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests
132
+ @function luminance($color) {
133
+ $rgb: (
134
+ "r": red($color),
135
+ "g": green($color),
136
+ "b": blue($color)
137
+ );
138
+
139
+ @each $name, $value in $rgb {
140
+ $value: if($value / 255 < .03928, $value / 255 / 12.92, nth($_luminance-list, $value + 1));
141
+ $rgb: map-merge($rgb, ($name: $value));
142
+ }
143
+
144
+ @return (map-get($rgb, "r") * .2126) + (map-get($rgb, "g") * .7152) + (map-get($rgb, "b") * .0722);
145
+ }
146
+
147
+ // Return opaque color
148
+ // opaque(#fff, rgba(0, 0, 0, .5)) => #808080
149
+ @function opaque($background, $foreground) {
150
+ @return mix(rgba($foreground, 1), $background, opacity($foreground) * 100);
151
+ }
152
+
153
+ // scss-docs-start color-functions
154
+ // Tint a color: mix a color with white
155
+ @function tint-color($color, $weight) {
156
+ @return mix(white, $color, $weight);
157
+ }
158
+
159
+ // Shade a color: mix a color with black
160
+ @function shade-color($color, $weight) {
161
+ @return mix(black, $color, $weight);
162
+ }
163
+
164
+ // Shade the color if the weight is positive, else tint it
165
+ @function shift-color($color, $weight) {
166
+ @return if($weight > 0, shade-color($color, $weight), tint-color($color, -$weight));
167
+ }
168
+ // scss-docs-end color-functions
169
+
170
+ // Return valid calc
171
+ @function add($value1, $value2, $return-calc: true) {
172
+ @if $value1 == null {
173
+ @return $value2;
174
+ }
175
+
176
+ @if $value2 == null {
177
+ @return $value1;
178
+ }
179
+
180
+ @if type-of($value1) == number and type-of($value2) == number and comparable($value1, $value2) {
181
+ @return $value1 + $value2;
182
+ }
183
+
184
+ @return if($return-calc == true, calc(#{$value1} + #{$value2}), $value1 + unquote(" + ") + $value2);
185
+ }
186
+
187
+ @function subtract($value1, $value2, $return-calc: true) {
188
+ @if $value1 == null and $value2 == null {
189
+ @return null;
190
+ }
191
+
192
+ @if $value1 == null {
193
+ @return -$value2;
194
+ }
195
+
196
+ @if $value2 == null {
197
+ @return $value1;
198
+ }
199
+
200
+ @if type-of($value1) == number and type-of($value2) == number and comparable($value1, $value2) {
201
+ @return $value1 - $value2;
202
+ }
203
+
204
+ @return if($return-calc == true, calc(#{$value1} - #{$value2}), $value1 + unquote(" - ") + $value2);
205
+ }
static/scss/bootstrap/scss/_grid.scss ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // Row
2
+ //
3
+ // Rows contain your columns.
4
+
5
+ @if $enable-grid-classes {
6
+ .row {
7
+ @include make-row();
8
+
9
+ > * {
10
+ @include make-col-ready();
11
+ }
12
+ }
13
+ }
14
+
15
+
16
+ // Columns
17
+ //
18
+ // Common styles for small and large grid columns
19
+
20
+ @if $enable-grid-classes {
21
+ @include make-grid-columns();
22
+ }
static/scss/bootstrap/scss/_helpers.scss ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ @import "helpers/clearfix";
2
+ @import "helpers/colored-links";
3
+ @import "helpers/ratio";
4
+ @import "helpers/position";
5
+ @import "helpers/visually-hidden";
6
+ @import "helpers/stretched-link";
7
+ @import "helpers/text-truncation";
static/scss/bootstrap/scss/_images.scss ADDED
@@ -0,0 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // Responsive images (ensure images don't scale beyond their parents)
2
+ //
3
+ // This is purposefully opt-in via an explicit class rather than being the default for all `<img>`s.
4
+ // We previously tried the "images are responsive by default" approach in Bootstrap v2,
5
+ // and abandoned it in Bootstrap v3 because it breaks lots of third-party widgets (including Google Maps)
6
+ // which weren't expecting the images within themselves to be involuntarily resized.
7
+ // See also https://github.com/twbs/bootstrap/issues/18178
8
+ .img-fluid {
9
+ @include img-fluid();
10
+ }
11
+
12
+
13
+ // Image thumbnails
14
+ .img-thumbnail {
15
+ padding: $thumbnail-padding;
16
+ background-color: $thumbnail-bg;
17
+ border: $thumbnail-border-width solid $thumbnail-border-color;
18
+ @include border-radius($thumbnail-border-radius);
19
+ @include box-shadow($thumbnail-box-shadow);
20
+
21
+ // Keep them at most 100% wide
22
+ @include img-fluid();
23
+ }
24
+
25
+ //
26
+ // Figures
27
+ //
28
+
29
+ .figure {
30
+ // Ensures the caption's text aligns with the image.
31
+ display: inline-block;
32
+ }
33
+
34
+ .figure-img {
35
+ margin-bottom: $spacer / 2;
36
+ line-height: 1;
37
+ }
38
+
39
+ .figure-caption {
40
+ @include font-size($figure-caption-font-size);
41
+ color: $figure-caption-color;
42
+ }
static/scss/bootstrap/scss/_list-group.scss ADDED
@@ -0,0 +1,174 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // Base class
2
+ //
3
+ // Easily usable on <ul>, <ol>, or <div>.
4
+
5
+ .list-group {
6
+ display: flex;
7
+ flex-direction: column;
8
+
9
+ // No need to set list-style: none; since .list-group-item is block level
10
+ padding-left: 0; // reset padding because ul and ol
11
+ margin-bottom: 0;
12
+ @include border-radius($list-group-border-radius);
13
+ }
14
+
15
+ .list-group-numbered {
16
+ list-style-type: none;
17
+ counter-reset: section;
18
+
19
+ > li::before {
20
+ // Increments only this instance of the section counter
21
+ content: counters(section, ".") ". ";
22
+ counter-increment: section;
23
+ }
24
+ }
25
+
26
+
27
+ // Interactive list items
28
+ //
29
+ // Use anchor or button elements instead of `li`s or `div`s to create interactive
30
+ // list items. Includes an extra `.active` modifier class for selected items.
31
+
32
+ .list-group-item-action {
33
+ width: 100%; // For `<button>`s (anchors become 100% by default though)
34
+ color: $list-group-action-color;
35
+ text-align: inherit; // For `<button>`s (anchors inherit)
36
+
37
+ // Hover state
38
+ &:hover,
39
+ &:focus {
40
+ z-index: 1; // Place hover/focus items above their siblings for proper border styling
41
+ color: $list-group-action-hover-color;
42
+ text-decoration: none;
43
+ background-color: $list-group-hover-bg;
44
+ }
45
+
46
+ &:active {
47
+ color: $list-group-action-active-color;
48
+ background-color: $list-group-action-active-bg;
49
+ }
50
+ }
51
+
52
+
53
+ // Individual list items
54
+ //
55
+ // Use on `li`s or `div`s within the `.list-group` parent.
56
+
57
+ .list-group-item {
58
+ position: relative;
59
+ display: block;
60
+ padding: $list-group-item-padding-y $list-group-item-padding-x;
61
+ color: $list-group-color;
62
+ text-decoration: if($link-decoration == none, null, none);
63
+ background-color: $list-group-bg;
64
+ border: $list-group-border-width solid $list-group-border-color;
65
+
66
+ &:first-child {
67
+ @include border-top-radius(inherit);
68
+ }
69
+
70
+ &:last-child {
71
+ @include border-bottom-radius(inherit);
72
+ }
73
+
74
+ &.disabled,
75
+ &:disabled {
76
+ color: $list-group-disabled-color;
77
+ pointer-events: none;
78
+ background-color: $list-group-disabled-bg;
79
+ }
80
+
81
+ // Include both here for `<a>`s and `<button>`s
82
+ &.active {
83
+ z-index: 2; // Place active items above their siblings for proper border styling
84
+ color: $list-group-active-color;
85
+ background-color: $list-group-active-bg;
86
+ border-color: $list-group-active-border-color;
87
+ }
88
+
89
+ & + & {
90
+ border-top-width: 0;
91
+
92
+ &.active {
93
+ margin-top: -$list-group-border-width;
94
+ border-top-width: $list-group-border-width;
95
+ }
96
+ }
97
+ }
98
+
99
+
100
+ // Horizontal
101
+ //
102
+ // Change the layout of list group items from vertical (default) to horizontal.
103
+
104
+ @each $breakpoint in map-keys($grid-breakpoints) {
105
+ @include media-breakpoint-up($breakpoint) {
106
+ $infix: breakpoint-infix($breakpoint, $grid-breakpoints);
107
+
108
+ .list-group-horizontal#{$infix} {
109
+ flex-direction: row;
110
+
111
+ > .list-group-item {
112
+ &:first-child {
113
+ @include border-bottom-start-radius($list-group-border-radius);
114
+ @include border-top-end-radius(0);
115
+ }
116
+
117
+ &:last-child {
118
+ @include border-top-end-radius($list-group-border-radius);
119
+ @include border-bottom-start-radius(0);
120
+ }
121
+
122
+ &.active {
123
+ margin-top: 0;
124
+ }
125
+
126
+ + .list-group-item {
127
+ border-top-width: $list-group-border-width;
128
+ border-left-width: 0;
129
+
130
+ &.active {
131
+ margin-left: -$list-group-border-width;
132
+ border-left-width: $list-group-border-width;
133
+ }
134
+ }
135
+ }
136
+ }
137
+ }
138
+ }
139
+
140
+
141
+ // Flush list items
142
+ //
143
+ // Remove borders and border-radius to keep list group items edge-to-edge. Most
144
+ // useful within other components (e.g., cards).
145
+
146
+ .list-group-flush {
147
+ @include border-radius(0);
148
+
149
+ > .list-group-item {
150
+ border-width: 0 0 $list-group-border-width;
151
+
152
+ &:last-child {
153
+ border-bottom-width: 0;
154
+ }
155
+ }
156
+ }
157
+
158
+
159
+ // scss-docs-start list-group-modifiers
160
+ // List group contextual variants
161
+ //
162
+ // Add modifier classes to change text and background color on individual items.
163
+ // Organizationally, this must come after the `:hover` states.
164
+
165
+ @each $state, $value in $theme-colors {
166
+ $list-group-background: shift-color($value, $list-group-item-bg-scale);
167
+ $list-group-color: shift-color($value, $list-group-item-color-scale);
168
+ @if (contrast-ratio($list-group-background, $list-group-color) < $min-contrast-ratio) {
169
+ $list-group-color: mix($value, color-contrast($list-group-background), abs($list-group-item-color-scale));
170
+ }
171
+
172
+ @include list-group-item-variant($state, $list-group-background, $list-group-color);
173
+ }
174
+ // scss-docs-end list-group-modifiers
static/scss/bootstrap/scss/_mixins.scss ADDED
@@ -0,0 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // Toggles
2
+ //
3
+ // Used in conjunction with global variables to enable certain theme features.
4
+
5
+ // Vendor
6
+ @import "vendor/rfs";
7
+
8
+ // Deprecate
9
+ @import "mixins/deprecate";
10
+
11
+ // Helpers
12
+ @import "mixins/breakpoints";
13
+ @import "mixins/color-scheme";
14
+ @import "mixins/image";
15
+ @import "mixins/resize";
16
+ @import "mixins/visually-hidden";
17
+ @import "mixins/reset-text";
18
+ @import "mixins/text-truncate";
19
+
20
+ // Utilities
21
+ @import "mixins/utilities";
22
+
23
+ // Components
24
+ @import "mixins/alert";
25
+ @import "mixins/buttons";
26
+ @import "mixins/caret";
27
+ @import "mixins/pagination";
28
+ @import "mixins/lists";
29
+ @import "mixins/list-group";
30
+ @import "mixins/forms";
31
+ @import "mixins/table-variants";
32
+
33
+ // Skins
34
+ @import "mixins/border-radius";
35
+ @import "mixins/box-shadow";
36
+ @import "mixins/gradients";
37
+ @import "mixins/transition";
38
+
39
+ // Layout
40
+ @import "mixins/clearfix";
41
+ @import "mixins/container";
42
+ @import "mixins/grid";
static/scss/bootstrap/scss/_modal.scss ADDED
@@ -0,0 +1,228 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // .modal-open - body class for killing the scroll
2
+ // .modal - container to scroll within
3
+ // .modal-dialog - positioning shell for the actual modal
4
+ // .modal-content - actual modal w/ bg and corners and stuff
5
+
6
+
7
+ .modal-open {
8
+ // Kill the scroll on the body
9
+ overflow: hidden;
10
+
11
+ .modal {
12
+ overflow-x: hidden;
13
+ overflow-y: auto;
14
+ }
15
+ }
16
+
17
+ // Container that the modal scrolls within
18
+ .modal {
19
+ position: fixed;
20
+ top: 0;
21
+ left: 0;
22
+ z-index: $zindex-modal;
23
+ display: none;
24
+ width: 100%;
25
+ height: 100%;
26
+ overflow: hidden;
27
+ // Prevent Chrome on Windows from adding a focus outline. For details, see
28
+ // https://github.com/twbs/bootstrap/pull/10951.
29
+ outline: 0;
30
+ // We deliberately don't use `-webkit-overflow-scrolling: touch;` due to a
31
+ // gnarly iOS Safari bug: https://bugs.webkit.org/show_bug.cgi?id=158342
32
+ // See also https://github.com/twbs/bootstrap/issues/17695
33
+ }
34
+
35
+ // Shell div to position the modal with bottom padding
36
+ .modal-dialog {
37
+ position: relative;
38
+ width: auto;
39
+ margin: $modal-dialog-margin;
40
+ // allow clicks to pass through for custom click handling to close modal
41
+ pointer-events: none;
42
+
43
+ // When fading in the modal, animate it to slide down
44
+ .modal.fade & {
45
+ @include transition($modal-transition);
46
+ transform: $modal-fade-transform;
47
+ }
48
+ .modal.show & {
49
+ transform: $modal-show-transform;
50
+ }
51
+
52
+ // When trying to close, animate focus to scale
53
+ .modal.modal-static & {
54
+ transform: $modal-scale-transform;
55
+ }
56
+ }
57
+
58
+ .modal-dialog-scrollable {
59
+ height: subtract(100%, $modal-dialog-margin * 2);
60
+
61
+ .modal-content {
62
+ max-height: 100%;
63
+ overflow: hidden;
64
+ }
65
+
66
+ .modal-body {
67
+ overflow-y: auto;
68
+ }
69
+ }
70
+
71
+ .modal-dialog-centered {
72
+ display: flex;
73
+ align-items: center;
74
+ min-height: subtract(100%, $modal-dialog-margin * 2);
75
+ }
76
+
77
+ // Actual modal
78
+ .modal-content {
79
+ position: relative;
80
+ display: flex;
81
+ flex-direction: column;
82
+ width: 100%; // Ensure `.modal-content` extends the full width of the parent `.modal-dialog`
83
+ // counteract the pointer-events: none; in the .modal-dialog
84
+ color: $modal-content-color;
85
+ pointer-events: auto;
86
+ background-color: $modal-content-bg;
87
+ background-clip: padding-box;
88
+ border: $modal-content-border-width solid $modal-content-border-color;
89
+ @include border-radius($modal-content-border-radius);
90
+ @include box-shadow($modal-content-box-shadow-xs);
91
+ // Remove focus outline from opened modal
92
+ outline: 0;
93
+ }
94
+
95
+ // Modal background
96
+ .modal-backdrop {
97
+ position: fixed;
98
+ top: 0;
99
+ left: 0;
100
+ z-index: $zindex-modal-backdrop;
101
+ width: 100vw;
102
+ height: 100vh;
103
+ background-color: $modal-backdrop-bg;
104
+
105
+ // Fade for backdrop
106
+ &.fade { opacity: 0; }
107
+ &.show { opacity: $modal-backdrop-opacity; }
108
+ }
109
+
110
+ // Modal header
111
+ // Top section of the modal w/ title and dismiss
112
+ .modal-header {
113
+ display: flex;
114
+ flex-shrink: 0;
115
+ align-items: center;
116
+ justify-content: space-between; // Put modal header elements (title and dismiss) on opposite ends
117
+ padding: $modal-header-padding;
118
+ border-bottom: $modal-header-border-width solid $modal-header-border-color;
119
+ @include border-top-radius($modal-content-inner-border-radius);
120
+
121
+ .btn-close {
122
+ padding: ($modal-header-padding-y / 2) ($modal-header-padding-x / 2);
123
+ margin: ($modal-header-padding-y / -2) ($modal-header-padding-x / -2) ($modal-header-padding-y / -2) auto;
124
+ }
125
+ }
126
+
127
+ // Title text within header
128
+ .modal-title {
129
+ margin-bottom: 0;
130
+ line-height: $modal-title-line-height;
131
+ }
132
+
133
+ // Modal body
134
+ // Where all modal content resides (sibling of .modal-header and .modal-footer)
135
+ .modal-body {
136
+ position: relative;
137
+ // Enable `flex-grow: 1` so that the body take up as much space as possible
138
+ // when there should be a fixed height on `.modal-dialog`.
139
+ flex: 1 1 auto;
140
+ padding: $modal-inner-padding;
141
+ }
142
+
143
+ // Footer (for actions)
144
+ .modal-footer {
145
+ display: flex;
146
+ flex-wrap: wrap;
147
+ flex-shrink: 0;
148
+ align-items: center; // vertically center
149
+ justify-content: flex-end; // Right align buttons with flex property because text-align doesn't work on flex items
150
+ padding: $modal-inner-padding - $modal-footer-margin-between / 2;
151
+ border-top: $modal-footer-border-width solid $modal-footer-border-color;
152
+ @include border-bottom-radius($modal-content-inner-border-radius);
153
+
154
+ // Place margin between footer elements
155
+ // This solution is far from ideal because of the universal selector usage,
156
+ // but is needed to fix https://github.com/twbs/bootstrap/issues/24800
157
+ > * {
158
+ margin: $modal-footer-margin-between / 2;
159
+ }
160
+ }
161
+
162
+ // Scale up the modal
163
+ @include media-breakpoint-up(sm) {
164
+ // Automatically set modal's width for larger viewports
165
+ .modal-dialog {
166
+ max-width: $modal-md;
167
+ margin: $modal-dialog-margin-y-sm-up auto;
168
+ }
169
+
170
+ .modal-dialog-scrollable {
171
+ height: subtract(100%, $modal-dialog-margin-y-sm-up * 2);
172
+ }
173
+
174
+ .modal-dialog-centered {
175
+ min-height: subtract(100%, $modal-dialog-margin-y-sm-up * 2);
176
+ }
177
+
178
+ .modal-content {
179
+ @include box-shadow($modal-content-box-shadow-sm-up);
180
+ }
181
+
182
+ .modal-sm { max-width: $modal-sm; }
183
+ }
184
+
185
+ @include media-breakpoint-up(lg) {
186
+ .modal-lg,
187
+ .modal-xl {
188
+ max-width: $modal-lg;
189
+ }
190
+ }
191
+
192
+ @include media-breakpoint-up(xl) {
193
+ .modal-xl { max-width: $modal-xl; }
194
+ }
195
+
196
+ // scss-docs-start modal-fullscreen-loop
197
+ @each $breakpoint in map-keys($grid-breakpoints) {
198
+ $infix: breakpoint-infix($breakpoint, $grid-breakpoints);
199
+ $postfix: if($infix != "", $infix + "-down", "");
200
+
201
+ @include media-breakpoint-down($breakpoint) {
202
+ .modal-fullscreen#{$postfix} {
203
+ width: 100vw;
204
+ max-width: none;
205
+ height: 100%;
206
+ margin: 0;
207
+
208
+ .modal-content {
209
+ height: 100%;
210
+ border: 0;
211
+ @include border-radius(0);
212
+ }
213
+
214
+ .modal-header {
215
+ @include border-radius(0);
216
+ }
217
+
218
+ .modal-body {
219
+ overflow-y: auto;
220
+ }
221
+
222
+ .modal-footer {
223
+ @include border-radius(0);
224
+ }
225
+ }
226
+ }
227
+ }
228
+ // scss-docs-end modal-fullscreen-loop
static/scss/bootstrap/scss/_nav.scss ADDED
@@ -0,0 +1,139 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // Base class
2
+ //
3
+ // Kickstart any navigation component with a set of style resets. Works with
4
+ // `<nav>`s, `<ul>`s or `<ol>`s.
5
+
6
+ .nav {
7
+ display: flex;
8
+ flex-wrap: wrap;
9
+ padding-left: 0;
10
+ margin-bottom: 0;
11
+ list-style: none;
12
+ }
13
+
14
+ .nav-link {
15
+ display: block;
16
+ padding: $nav-link-padding-y $nav-link-padding-x;
17
+ @include font-size($nav-link-font-size);
18
+ font-weight: $nav-link-font-weight;
19
+ color: $nav-link-color;
20
+ text-decoration: if($link-decoration == none, null, none);
21
+ @include transition($nav-link-transition);
22
+
23
+ &:hover,
24
+ &:focus {
25
+ color: $nav-link-hover-color;
26
+ text-decoration: if($link-hover-decoration == underline, none, null);
27
+ }
28
+
29
+ // Disabled state lightens text
30
+ &.disabled {
31
+ color: $nav-link-disabled-color;
32
+ pointer-events: none;
33
+ cursor: default;
34
+ }
35
+ }
36
+
37
+ //
38
+ // Tabs
39
+ //
40
+
41
+ .nav-tabs {
42
+ border-bottom: $nav-tabs-border-width solid $nav-tabs-border-color;
43
+
44
+ .nav-link {
45
+ margin-bottom: -$nav-tabs-border-width;
46
+ background: none;
47
+ border: $nav-tabs-border-width solid transparent;
48
+ @include border-top-radius($nav-tabs-border-radius);
49
+
50
+ &:hover,
51
+ &:focus {
52
+ border-color: $nav-tabs-link-hover-border-color;
53
+ // Prevents active .nav-link tab overlapping focus outline of previous/next .nav-link
54
+ isolation: isolate;
55
+ }
56
+
57
+ &.disabled {
58
+ color: $nav-link-disabled-color;
59
+ background-color: transparent;
60
+ border-color: transparent;
61
+ }
62
+ }
63
+
64
+ .nav-link.active,
65
+ .nav-item.show .nav-link {
66
+ color: $nav-tabs-link-active-color;
67
+ background-color: $nav-tabs-link-active-bg;
68
+ border-color: $nav-tabs-link-active-border-color;
69
+ }
70
+
71
+ .dropdown-menu {
72
+ // Make dropdown border overlap tab border
73
+ margin-top: -$nav-tabs-border-width;
74
+ // Remove the top rounded corners here since there is a hard edge above the menu
75
+ @include border-top-radius(0);
76
+ }
77
+ }
78
+
79
+
80
+ //
81
+ // Pills
82
+ //
83
+
84
+ .nav-pills {
85
+ .nav-link {
86
+ background: none;
87
+ border: 0;
88
+ @include border-radius($nav-pills-border-radius);
89
+ }
90
+
91
+ .nav-link.active,
92
+ .show > .nav-link {
93
+ color: $nav-pills-link-active-color;
94
+ @include gradient-bg($nav-pills-link-active-bg);
95
+ }
96
+ }
97
+
98
+
99
+ //
100
+ // Justified variants
101
+ //
102
+
103
+ .nav-fill {
104
+ > .nav-link,
105
+ .nav-item {
106
+ flex: 1 1 auto;
107
+ text-align: center;
108
+ }
109
+ }
110
+
111
+ .nav-justified {
112
+ > .nav-link,
113
+ .nav-item {
114
+ flex-basis: 0;
115
+ flex-grow: 1;
116
+ text-align: center;
117
+ }
118
+ }
119
+
120
+ .nav-fill,
121
+ .nav-justified {
122
+ .nav-item .nav-link {
123
+ width: 100%; // Make sure button will grow
124
+ }
125
+ }
126
+
127
+
128
+ // Tabbable tabs
129
+ //
130
+ // Hide tabbable panes to start, show them when `.active`
131
+
132
+ .tab-content {
133
+ > .tab-pane {
134
+ display: none;
135
+ }
136
+ > .active {
137
+ display: block;
138
+ }
139
+ }
static/scss/bootstrap/scss/_navbar.scss ADDED
@@ -0,0 +1,306 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ // Contents
2
+ //
3
+ // Navbar
4
+ // Navbar brand
5
+ // Navbar nav
6
+ // Navbar text
7
+ // Responsive navbar
8
+ // Navbar position
9
+ // Navbar themes
10
+
11
+
12
+ // Navbar
13
+ //
14
+ // Provide a static navbar from which we expand to create full-width, fixed, and
15
+ // other navbar variations.
16
+
17
+ .navbar {
18
+ position: relative;
19
+ display: flex;
20
+ flex-wrap: wrap; // allow us to do the line break for collapsing content
21
+ align-items: center;
22
+ justify-content: space-between; // space out brand from logo
23
+ padding-top: $navbar-padding-y;
24
+ padding-right: $navbar-padding-x; // default: null
25
+ padding-bottom: $navbar-padding-y;
26
+ padding-left: $navbar-padding-x; // default: null
27
+ @include gradient-bg();
28
+
29
+ // Because flex properties aren't inherited, we need to redeclare these first
30
+ // few properties so that content nested within behave properly.
31
+ // The `flex-wrap` property is inherited to simplify the expanded navbars
32
+ %container-flex-properties {
33
+ display: flex;
34
+ flex-wrap: inherit;
35
+ align-items: center;
36
+ justify-content: space-between;
37
+ }
38
+
39
+ > .container,
40
+ > .container-fluid {
41
+ @extend %container-flex-properties;
42
+ }
43
+
44
+ @each $breakpoint, $container-max-width in $container-max-widths {
45
+ > .container#{breakpoint-infix($breakpoint, $container-max-widths)} {
46
+ @extend %container-flex-properties;
47
+ }
48
+ }
49
+ }
50
+
51
+
52
+ // Navbar brand
53
+ //
54
+ // Used for brand, project, or site names.
55
+
56
+ .navbar-brand {
57
+ padding-top: $navbar-brand-padding-y;
58
+ padding-bottom: $navbar-brand-padding-y;
59
+ margin-right: $navbar-brand-margin-end;
60
+ @include font-size($navbar-brand-font-size);
61
+ text-decoration: if($link-decoration == none, null, none);
62
+ white-space: nowrap;
63
+
64
+ &:hover,
65
+ &:focus {
66
+ text-decoration: if($link-hover-decoration == underline, none, null);
67
+ }
68
+ }
69
+
70
+
71
+ // Navbar nav
72
+ //
73
+ // Custom navbar navigation (doesn't require `.nav`, but does make use of `.nav-link`).
74
+
75
+ .navbar-nav {
76
+ display: flex;
77
+ flex-direction: column; // cannot use `inherit` to get the `.navbar`s value
78
+ padding-left: 0;
79
+ margin-bottom: 0;
80
+ list-style: none;
81
+
82
+ .nav-link {
83
+ padding-right: 0;
84
+ padding-left: 0;
85
+ }
86
+
87
+ .dropdown-menu {
88
+ position: static;
89
+ }
90
+ }
91
+
92
+
93
+ // Navbar text
94
+ //
95
+ //
96
+
97
+ .navbar-text {
98
+ padding-top: $nav-link-padding-y;
99
+ padding-bottom: $nav-link-padding-y;
100
+ }
101
+
102
+
103
+ // Responsive navbar
104
+ //
105
+ // Custom styles for responsive collapsing and toggling of navbar contents.
106
+ // Powered by the collapse Bootstrap JavaScript plugin.
107
+
108
+ // When collapsed, prevent the toggleable navbar contents from appearing in
109
+ // the default flexbox row orientation. Requires the use of `flex-wrap: wrap`
110
+ // on the `.navbar` parent.
111
+ .navbar-collapse {
112
+ flex-basis: 100%;
113
+ flex-grow: 1;
114
+ // For always expanded or extra full navbars, ensure content aligns itself
115
+ // properly vertically. Can be easily overridden with flex utilities.
116
+ align-items: center;
117
+ }
118
+
119
+ // Button for toggling the navbar when in its collapsed state
120
+ .navbar-toggler {
121
+ padding: $navbar-toggler-padding-y $navbar-toggler-padding-x;
122
+ @include font-size($navbar-toggler-font-size);
123
+ line-height: 1;
124
+ background-color: transparent; // remove default button style
125
+ border: $border-width solid transparent; // remove default button style
126
+ @include border-radius($navbar-toggler-border-radius);
127
+ @include transition($navbar-toggler-transition);
128
+
129
+ &:hover {
130
+ text-decoration: none;
131
+ }
132
+
133
+ &:focus {
134
+ text-decoration: none;
135
+ outline: 0;
136
+ box-shadow: 0 0 0 $navbar-toggler-focus-width;
137
+ }
138
+ }
139
+
140
+ // Keep as a separate element so folks can easily override it with another icon
141
+ // or image file as needed.
142
+ .navbar-toggler-icon {
143
+ display: inline-block;
144
+ width: 1.5em;
145
+ height: 1.5em;
146
+ vertical-align: middle;
147
+ background-repeat: no-repeat;
148
+ background-position: center;
149
+ background-size: 100%;
150
+ }
151
+
152
+ .navbar-nav-scroll {
153
+ max-height: var(--#{$variable-prefix}scroll-height, 75vh);
154
+ overflow-y: auto;
155
+ }
156
+
157
+ // scss-docs-start navbar-expand-loop
158
+ // Generate series of `.navbar-expand-*` responsive classes for configuring
159
+ // where your navbar collapses.
160
+ .navbar-expand {
161
+ @each $breakpoint in map-keys($grid-breakpoints) {
162
+ $next: breakpoint-next($breakpoint, $grid-breakpoints);
163
+ $infix: breakpoint-infix($next, $grid-breakpoints);
164
+
165
+ // stylelint-disable-next-line scss/selector-no-union-class-name
166
+ &#{$infix} {
167
+ @include media-breakpoint-up($next) {
168
+ flex-wrap: nowrap;
169
+ justify-content: flex-start;
170
+
171
+ .navbar-nav {
172
+ flex-direction: row;
173
+
174
+ .dropdown-menu {
175
+ position: absolute;
176
+ }
177
+
178
+ .nav-link {
179
+ padding-right: $navbar-nav-link-padding-x;
180
+ padding-left: $navbar-nav-link-padding-x;
181
+ }
182
+ }
183
+
184
+ .navbar-nav-scroll {
185
+ overflow: visible;
186
+ }
187
+
188
+ .navbar-collapse {
189
+ display: flex !important; // stylelint-disable-line declaration-no-important
190
+ flex-basis: auto;
191
+ }
192
+
193
+ .navbar-toggler {
194
+ display: none;
195
+ }
196
+ }
197
+ }
198
+ }
199
+ }
200
+ // scss-docs-end navbar-expand-loop
201
+
202
+
203
+ // Navbar themes
204
+ //
205
+ // Styles for switching between navbars with light or dark background.
206
+
207
+ // Dark links against a light background
208
+ .navbar-light {
209
+ .navbar-brand {
210
+ color: $navbar-light-brand-color;
211
+
212
+ &:hover,
213
+ &:focus {
214
+ color: $navbar-light-brand-hover-color;
215
+ }
216
+ }
217
+
218
+ .navbar-nav {
219
+ .nav-link {
220
+ color: $navbar-light-color;
221
+
222
+ &:hover,
223
+ &:focus {
224
+ color: $navbar-light-hover-color;
225
+ }
226
+
227
+ &.disabled {
228
+ color: $navbar-light-disabled-color;
229
+ }
230
+ }
231
+
232
+ .show > .nav-link,
233
+ .nav-link.active {
234
+ color: $navbar-light-active-color;
235
+ }
236
+ }
237
+
238
+ .navbar-toggler {
239
+ color: $navbar-light-color;
240
+ border-color: $navbar-light-toggler-border-color;
241
+ }
242
+
243
+ .navbar-toggler-icon {
244
+ background-image: escape-svg($navbar-light-toggler-icon-bg);
245
+ }
246
+
247
+ .navbar-text {
248
+ color: $navbar-light-color;
249
+
250
+ a,
251
+ a:hover,
252
+ a:focus {
253
+ color: $navbar-light-active-color;
254
+ }
255
+ }
256
+ }
257
+
258
+ // White links against a dark background
259
+ .navbar-dark {
260
+ .navbar-brand {
261
+ color: $navbar-dark-brand-color;
262
+
263
+ &:hover,
264
+ &:focus {
265
+ color: $navbar-dark-brand-hover-color;
266
+ }
267
+ }
268
+
269
+ .navbar-nav {
270
+ .nav-link {
271
+ color: $navbar-dark-color;
272
+
273
+ &:hover,
274
+ &:focus {
275
+ color: $navbar-dark-hover-color;
276
+ }
277
+
278
+ &.disabled {
279
+ color: $navbar-dark-disabled-color;
280
+ }
281
+ }
282
+
283
+ .show > .nav-link,
284
+ .nav-link.active {
285
+ color: $navbar-dark-active-color;
286
+ }
287
+ }
288
+
289
+ .navbar-toggler {
290
+ color: $navbar-dark-color;
291
+ border-color: $navbar-dark-toggler-border-color;
292
+ }
293
+
294
+ .navbar-toggler-icon {
295
+ background-image: escape-svg($navbar-dark-toggler-icon-bg);
296
+ }
297
+
298
+ .navbar-text {
299
+ color: $navbar-dark-color;
300
+ a,
301
+ a:hover,
302
+ a:focus {
303
+ color: $navbar-dark-active-color;
304
+ }
305
+ }
306
+ }
static/scss/bootstrap/scss/_offcanvas.scss ADDED
@@ -0,0 +1,77 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ .offcanvas {
2
+ position: fixed;
3
+ bottom: 0;
4
+ z-index: $zindex-offcanvas;
5
+ display: flex;
6
+ flex-direction: column;
7
+ max-width: 100%;
8
+ color: $offcanvas-color;
9
+ visibility: hidden;
10
+ background-color: $offcanvas-bg-color;
11
+ background-clip: padding-box;
12
+ outline: 0;
13
+ @include box-shadow($offcanvas-box-shadow);
14
+ @include transition(transform $offcanvas-transition-duration ease-in-out);
15
+ }
16
+
17
+ .offcanvas-header {
18
+ display: flex;
19
+ align-items: center;
20
+ justify-content: space-between;
21
+ padding: $offcanvas-padding-y $offcanvas-padding-x;
22
+
23
+ .btn-close {
24
+ padding: ($offcanvas-padding-y / 2) ($offcanvas-padding-x / 2);
25
+ margin: ($offcanvas-padding-y / -2) ($offcanvas-padding-x / -2) ($offcanvas-padding-y / -2) auto;
26
+ }
27
+ }
28
+
29
+ .offcanvas-title {
30
+ margin-bottom: 0;
31
+ line-height: $offcanvas-title-line-height;
32
+ }
33
+
34
+ .offcanvas-body {
35
+ flex-grow: 1;
36
+ padding: $offcanvas-padding-y $offcanvas-padding-x;
37
+ overflow-y: auto;
38
+ }
39
+
40
+ .offcanvas-start {
41
+ top: 0;
42
+ left: 0;
43
+ width: $offcanvas-horizontal-width;
44
+ border-right: $offcanvas-border-width solid $offcanvas-border-color;
45
+ transform: translateX(-100%);
46
+ }
47
+
48
+ .offcanvas-end {
49
+ top: 0;
50
+ right: 0;
51
+ width: $offcanvas-horizontal-width;
52
+ border-left: $offcanvas-border-width solid $offcanvas-border-color;
53
+ transform: translateX(100%);
54
+ }
55
+
56
+ .offcanvas-top {
57
+ top: 0;
58
+ right: 0;
59
+ left: 0;
60
+ height: $offcanvas-vertical-height;
61
+ max-height: 100%;
62
+ border-bottom: $offcanvas-border-width solid $offcanvas-border-color;
63
+ transform: translateY(-100%);
64
+ }
65
+
66
+ .offcanvas-bottom {
67
+ right: 0;
68
+ left: 0;
69
+ height: $offcanvas-vertical-height;
70
+ max-height: 100%;
71
+ border-top: $offcanvas-border-width solid $offcanvas-border-color;
72
+ transform: translateY(100%);
73
+ }
74
+
75
+ .offcanvas.show {
76
+ transform: none;
77
+ }